マクロツイーター

はてダから移行した記事の表示が崩れてますが、そのうちに直せればいいのに(えっ)

e-pTeX のレジスタの数についての意外な話

pTeX の e-TeX 拡張版である e-pTeX が登場してもう 5 年以上の時が経った。TeX Live では 2011 年版から (u)pLaTeX のエンジンが e-(u)pTeX になっている。日本の LaTeX ユーザでも e-(u)pTeX エンジンの利用の割合もかなり増えているのではないだろうか。

というわけで、多くの人が愛用している e-(u)pTeX エンジンについてのクイズ。

e-(u)pTeX エンジンにおける、各型のレジスタの個数は幾つか。

さて、すぐに答えられるだろうか。

大正解!!

*  *  *

……でも特に差支えないと思うが、もう少し精確な知識を求める人のための補足。

TeX エンジンのレジスタの数については、例えば某 ZR 氏の発表「日本人の知らない TeX」(2010 年の某「集い」)などで触れられているように、以下のように変化している。

  • Knuth 氏のオリジナルの TeX エンジンでは 256 個
  • e-TeX 拡張をもつエンジンでは 32768 個。例えば e-TeX、pdfTeX、XeTeX。
  • Omega 拡張をもつエンジンでは 65536 個。例えば Omega や LuaTeX。

さて、e-pTeX は e-TeX 拡張をもつ pTeX であり、Omega 拡張は持っていないはずだ。実際、e-pTeX も e-upTeX も欧文の符号空間は 8 ビットのままである。*1というわけで、当然、

e-(u)pTeXレジスタの個数は 32768 個

となるはずである。早速確かめてみよう。

[eptex の対話モードで]
*\count55555=42

*\showthe\count55555
> 42.
<*> \showthe\count55555

?

アレ!? 何故か \count55555 に代入できている、ナンデ?

ちなみに、pdfTeX では \count55555 の代入は“正しく”エラーを返す。

[pdftex の対話モード]
*\count55555=42
! Bad register code (55555).
<to be read again>
                   =
<*> \count55555=
                42
?

意外な結果になったので、ちょっと調べてみた。

これによると、e-TeX 拡張とは別に「FAM256 パッチ」という拡張が存在することが判った。*2

  • 「FAM256 パッチ」とは、Omega 拡張のうち次に挙げる要素をエンジンに加えるものである:
    • 数式ファミリの個数を 16 → 256 に増やす。
    • TeX には fil、fill、filll という“無限長の階層”が存在するが、ここに fil よりも“低位の無限大”である fi を追加する。
    • レジスタの個数を 65536 個に増やす。ただし実装は Omega と同じ配列方式でなく e-TeX と同じ連想配列方式である。
  • (欧文の)文字コードは 8 ビットのままである。
  • e-pTeX のビルドでは FAM256 パッチは既定で有効になっている。

他の資料を見る限りでも、W32TeXTeX Live での e-(u)pTeX のバイナリは FAM256 を含めてビルドされているようである。(手許の WIndows 版では実際に有効になっている。)

そういうわけで、現在配布されている e-(u)pTeX のほぼ全てでレジスタの個数は 65536 個である、といって良さそうである。ただし、FAM256 が無効な e-pTeX が全く存在しないとは言い切れない。よって、厳密な結論としては:

*1:Omega の欧文の符号空間は 16 ビット(0〜0xFFFF)で、LuaTeX のそれは Unicode 全域(0〜0x10FFFF)である。

*2:正確にいうと、「数式ファミリを 256 個にする拡張」の存在は覚えていたが、それが標準で有効になっていること、レジスタ数の増加を行っていることは失念していた。