マクロツイーター

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

LaTeX が新しくなった話

今年の LaTeX はチョット違う

TeX Live 2015 に含まれる LaTeX は、それ以前の版に比べると大きな*1改修が行われている。

  • LaTeX カーネルのバグ修正のポリシーが変更され、これまでは「バグ修正用のパッチ」をパッケージ ifxltx2e として配布していた*2のを止めて、カーネルのコードを直接修正することとなった。(そして、「カーネルの過去互換性を厳密に保持する」ための枠組が latexrelease パッケージとして用意されている。*3
  • e-TeX 拡張、LuaTeX 等の拡張エンジン上で動作させた場合について、LaTeX カーネルの仕様をエンジンの仕様に適応させる修正を行っている。たとえば、e-TeX 拡張では各種レジスタの個数が大幅に増やされているが、LaTeX におけるレジスタ割当のルーチン*4が追加レジスタを使えるように改修された。(従来は etex というパッケージが必要だった。)

具体的な変更点については、TeX Forum の以下のスレッドで列挙されている。

レジスタがいっぱいです

さて、新しい LaTeX ではレジスタ「たくさん」使えるようになったわけであるが、具体的な各レジスタの個数というのは、エンジンごとに異なっていて結構ややこしい。私自身も混乱していたので、改めて調べてみた。

エンジン→元祖TeXpdfTeXXeTeXLuaTeX
Aleph
※1e-pTeX
e-upTeX
count レジスタ個数25632768327686553665536
dimen レジスタ個数25632768327686553665536
skip レジスタ個数25632768327686553665536
muskip レジスタ個数25632768327686553665536
box レジスタ個数25632768327686553665536
toks レジスタ個数25632768327686553665536
read ハンドラ個数1616161616
write ハンドラ個数1616161616
数式ファミリ個数1616256256256
language 個数256256256256256
marks レジスタ個数※2132768327686553665536
※1: 「FAM256」パッチが適用済の e-(u)pTeX の場合(世にあるほぼ全ての e-(u)pTeX は適用済だと思われる)。非適用なら pdfTeX と同じである。
※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 つが考えられる。

  1. 一応 FAM256 パッチは e-(u)pTeX の拡張とは別物の扱いになっているので、e-(u)pTeX の仕様では数式ファミリは 16 個なので今のままで問題ないとする。
  2. LaTeXカーネルについて、「e-(u)pTeX + FAM256 である場合(これは \omathchar の定義を見れば判定できる((ちなみにこの判定をすると Aleph も正しいパラメタになる。\omathchar があるのは Omega 系列のエンジンで、レジスタ個数に関しては FAM256 は Omega 系列と全く同じなので理屈は通るだろう。)))にも \e@mathgroup@top を 256 にする」という改修を入れるように開発者に依頼する。
  3. pTeX 系エンジンについては、従来から和文処理などのカーネルの追加処理を含めた「pLaTeXカーネル(plcore.ltx)」が別に存在する。この「pLaTeX カーネル」のコードに、前項に書いた FAM256 用の改修を入れる。

この 3 は 2 よりも“気楽に”改修が行える利点があるが、一つ大きな問題がある。latexrelease パッケージへの対応が難しそうだということである。(詳しい検討は未着手。)ただし、この latexrelease の問題については、今の \e @mathgroup@top の処理の如何に関わらず、結局どこかで考慮する必要が生じるように感じている。

*1:といっても、全体で見ればそれほど大きくない。

*2:これはカーネルに関して厳密な過去互換性を保証するためであるが、実際のところ、新しく作成される文書でも fixltx2e が適用されることはほとんど無く、不具合が残ったままになる、という非常に残念なことになっていた。

*3:ただ、カーネルだけ互換性を保ってもあまり意味がないような気がするのだが。

*4:LaTeX のパッケージの実装コードで使うものであり、普通の LaTeX 文書作成者が用いるものではない。

*5:従って、オリジナルの TeX エンジンの上で新しい LaTeX を動作させることは可能である。