(前回の続き)
補足
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〜 の意味には一切依存しないように注意する必要がある。