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