今年の LaTeX はチョット違う
TeX Live 2015 に含まれる LaTeX は、それ以前の版に比べると大きな*1改修が行われている。
- LaTeX カーネルのバグ修正のポリシーが変更され、これまでは「バグ修正用のパッチ」をパッケージ ifxltx2e として配布していた*2のを止めて、カーネルのコードを直接修正することとなった。(そして、「カーネルの過去互換性を厳密に保持する」ための枠組が latexrelease パッケージとして用意されている。*3)
- e-TeX 拡張、LuaTeX 等の拡張エンジン上で動作させた場合について、LaTeX カーネルの仕様をエンジンの仕様に適応させる修正を行っている。たとえば、e-TeX 拡張では各種レジスタの個数が大幅に増やされているが、LaTeX におけるレジスタ割当のルーチン*4が追加レジスタを使えるように改修された。(従来は etex というパッケージが必要だった。)
具体的な変更点については、TeX Forum の以下のスレッドで列挙されている。
レジスタがいっぱいです
さて、新しい LaTeX ではレジスタが「たくさん」使えるようになったわけであるが、具体的な各レジスタの個数というのは、エンジンごとに異なっていて結構ややこしい。私自身も混乱していたので、改めて調べてみた。
エンジン→ | 元祖TeX | pdfTeX | XeTeX | LuaTeX Aleph | ※1e-pTeX e-upTeX |
---|---|---|---|---|---|
count レジスタ個数 | 256 | 32768 | 32768 | 65536 | 65536 |
dimen レジスタ個数 | 256 | 32768 | 32768 | 65536 | 65536 |
skip レジスタ個数 | 256 | 32768 | 32768 | 65536 | 65536 |
muskip レジスタ個数 | 256 | 32768 | 32768 | 65536 | 65536 |
box レジスタ個数 | 256 | 32768 | 32768 | 65536 | 65536 |
toks レジスタ個数 | 256 | 32768 | 32768 | 65536 | 65536 |
read ハンドラ個数 | 16 | 16 | 16 | 16 | 16 |
write ハンドラ個数 | 16 | 16 | 16 | 16 | 16 |
数式ファミリ個数 | 16 | 16 | 256 | 256 | 256 |
language 個数 | 256 | 256 | 256 | 256 | 256 |
marks レジスタ個数 | ※21 | 32768 | 32768 | 65536 | 65536 |
※2: オリジナル TeX では、marks レジスタは 1 つしかなくそれを
\mark
で表すが、e-TeX 拡張のエンジンでは複数ある marks レジスタを \marks<整数>
で表す。\marks0
と \mark
は同じものを指す。もちろん新カーネルはエンジンを判別した上で、割当ルーチンではあるだけ全てのレジスタが使えるようにパラメタが自動調整される。*5素敵である。
例のごとくpTeX系がアレ
……であればいいのだが、実は e-(u)pTeX に関しては上手くいっていない。現状のカーネルの実装だと、e-(u)pTeX は(e-TeX 拡張だけをもつエンジンと見なされるので)pdfTeX と同じパラメタになる。FAM256 非適用の場合はこれで正しいが、FAM256 適用のエンジンの場合は一部のレジスタが使えていないことになる。といっても、count 等の「32768 と 65536 の差」に関しては、32768 個でも十分すぎるので、それほど大きな問題ではないと思う。対して、数式ファミリが 256 個使えることについては、実際に数式ファミリの枯渇が問題になる事例が存在するので、対応できたほうがよいと思う。(パラメタ \e@mathgroup@top
の値を 256 にすれば e-pTeX + FAM256 の場合にも問題なく LaTeX の数式ファミリ拡張が動作することは確認した。)
対応策としては 3 つが考えられる。
- 一応 FAM256 パッチは e-(u)pTeX の拡張とは別物の扱いになっているので、e-(u)pTeX の仕様では数式ファミリは 16 個なので今のままで問題ないとする。
- LaTeX のカーネルについて、「e-(u)pTeX + FAM256 である場合(これは
\omathchar
の定義を見れば判定できる((ちなみにこの判定をすると Aleph も正しいパラメタになる。\omathchar
があるのは Omega 系列のエンジンで、レジスタ個数に関しては FAM256 は Omega 系列と全く同じなので理屈は通るだろう。)))にも\e@mathgroup@top
を 256 にする」という改修を入れるように開発者に依頼する。 - pTeX 系エンジンについては、従来から和文処理などのカーネルの追加処理を含めた「pLaTeX のカーネル(plcore.ltx)」が別に存在する。この「pLaTeX カーネル」のコードに、前項に書いた FAM256 用の改修を入れる。
この 3 は 2 よりも“気楽に”改修が行える利点があるが、一つ大きな問題がある。latexrelease パッケージへの対応が難しそうだということである。(詳しい検討は未着手。)ただし、この latexrelease の問題については、今の \e
@mathgroup@top
の処理の如何に関わらず、結局どこかで考慮する必要が生じるように感じている。