マクロツイーター

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

LuaTeX の “pdfTeX のバージョン”がアレな件(補足)

前回の続き)
補足

v0.80 の LuaTeX でも \pdftexversion は“最初から”用意されている、と述べたが、この意味を説明しておく。LuaTeX の“初期状態”、つまり「INI モードでの起動直後」において既に定義されている、という意味ではない。なぜなら、LuaTeX は“初期状態”では「オリジナルの TeX のプリミティブ」(と \directlua)しか定義されてなくて、拡張機能のプリミティブは、Lua コードで設定を行って追加される、という仕組みになっているからである。

[init.tex]
\catcode`\{=1 \catcode`\}=2
\directlua{
tex.enableprimitives('',tex.extraprimitives('etex', 'pdftex'))
}

“初期状態”において上記のコードを実行して初めて「pdfTeX のプリミティブ群」が有効になる。そして、それらの中に \pdftexversion\pdftexrevision も含まれている、ということである。

>luatex -ini init.tex
This is LuaTeX, Version beta-0.80.0 (TeX Live 2015/W32TeX) (rev 5209)  (INITEX)
 restricted \write18 enabled.
(./init.tex)
*\show\pdftexversion
> \pdftexversion=\luatexversion.
<*> \show\pdftexversion

?

このように定義されるトーク\pdftexversion\pdftexrevision(これらを総称して \pdftex〜 と記す)には以下のような特徴がある。

  • この \pdftex〜 の意味は対応する \luatex〜 と同一である。すなわち、
    \let\pdftexversion\luatexversion
    \let\pdftexrevision\luatexrevision
    を実行した状態と等価である。
  • 従って、\pdftex〜\luatex〜\ifx で同値になる。
  • \show\meaning で意味を表示させた場合は「\luatex〜」となる。
  • pdfTeX には \ifpdfprimitive というプリミティブがある。\ifpdfprimitive\xxx は制御綴 \xxx の現在の意味が「\xxx という(同じ名前の)プリミティブ」である場合に真と判定する。つまり、\ifpdfprimitive\luatexversion は真だが、\let\suyahtexversion\luatexversion とした後の \ifpdfprimitive\suyahtexversion は偽になる。同様に考えると、\pdftexversion についても意味は「\luatexversion プリミティブ」(名前が違う)だから、\ifpdfprimitive\pdftexversion の結果は偽になりそうである。ところが実際の挙動としては、\ifpdfprimitive\pdftex〜 は真と判定される。(恐らく特別扱いしている?)
  • \ifpdfprimitive を使わずに「トークンの意味がプリミティブであるか」を判定する手法として、“string-meaning テスト”がある。このテストを適用した場合は(“特別扱い”がないため) \pdftex〜 は「プリミティブでない」と判定される。

ところで、この特別な \pdftex〜 の定義は“経過措置”であって、将来的には LuaTeX の \pdftex〜 は消滅するらしい。

従って、LuaTeX を対象とするコードを書く場合には、\pdftex〜 の意味には一切依存しないように注意する必要がある。