マクロツイーター

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

LuaTeX の “pdfTeX のバージョン”がアレな件

チョット、ナントカBox 関連の記事を読んでいたんだが……

どうやら pdftex.def の \pdftexversion による判定ではじかれているようである。え? それだけ? そう、LuaTeX は pdfTeX と全く書式の plain TeX ソースを書けるので、原理的には今すぐにでも pagebox= オプションが使える状況にある。いま pagebox= オプションが使えない理由はただ一つ、pdftex.def に pdfTeX のバージョンが古いとはじかれているわけである!

チョット腑に落ちないので、LuaTeX のバージョン関連のプリミティブについて調べてみた。

実装を調べてみた
  • \pdftexversion 〔整数・読取専用〕: pdfTeX エンジンのバージョンの数値の 100 倍(v1.10 なら 110)。
  • \pdftexrevision 〔展開可能〕: pdfTeX エンジンのリビジョンを表す \the-文字列に展開される。。
  • \luatexversion 〔整数・読取専用〕: LuaTeX エンジンのバージョンの数値の 100 倍(v1.10 なら 110)。
  • \luatexrevision 〔展開可能〕: LuaTeX エンジンのリビジョンを表す \the-文字列に展開される。。

これらの値を、TeX Live 2013 と 2014、および手許の W32TeX に含まれる LuaTeX エンジンについて調べる((例えば、\message{\the\pdftexversion/\pdftexrevision} を実行して端末の出力をみる。))と以下のようになった。

TL2013TL2014W32TeX
LuaTeX バージョン0.76.00.79.10.80.0
\pdftexversion の値20020080
\pdftexrevision の展開000
\luatexversion の値767980
\luatexrevision の展開010

最近まで、LuaTeX は「pdfTeX のバージョン 2.00.0」を名乗っていたのだが、バージョン 0.80 になってそれを止めたようだ。そして、そして、「pdfTeX のバージョン」が LuaTeX のバージョンと同じになっているようだ。

仕様を調べてみた

マニュアルを見ると、pdfTeX のバージョン関連のプリミティブは“削除”されると述べられている。

The pdfTeX related primitives will be removed from versions after 0.80.
4.14.2 Convert commands

そして、さらにこの後に、もし「pdfTeX のバージョン」のプリミティブが無くなって困るのであれば、

\let\pdftexversion\luatexversion
\let\pdftexrevision\luatexrevision

とでもしておけ、と書かれている。

最新の LuaLaTeX の \pdftex〜 の値はまさにこの処置を行った結果と一致する。ということは、v0.80 になって、\pdftex〜 が実際にプリミティブとして存在しなくなったため、既存のパッケージでエラーになるのを防ぐために、LuaLaTeX 側でフォーマット作成時に前掲の処置を行った……。

一見、そのように思えるが、実は違うようである。実際には、\pdftex〜 プリミティブは消滅したのではなく、代わりに、“あたかも前掲の処置を行った”状態が“最初から”用意されているようである(詳細は後述)。

結局どうすればよいのか

何れにしても、LuaTeX の v0.80 以降では、\pdftexversion\luatexversion と同じ値をとる仕様に変更されたのは確かである。このため、例えば何らかのパッケージで「“pdfTeX のバージョン”が 1.10 より大ならば」という条件を意図して

\ifnum\pdftexversion>110

のような条件文を書いた場合、v0.80 未満の LuaTeX は “v2.00 である” と見做されて該当するが、v0.80 以上(で v1.10 以下)のものは該当しなくなってしまう。 今まで、LuaTeX の “pdfTeX のバージョン”は “2.00.0” に固定されていたわけで、それで上手くいっていたことを重視するという考えを採るのなら、少なくとも LuaLaTeX については、フォーマット作成時に

\chardef\pdftexversion=200
\def\pdftexrevision{0}

のようにして、値が変わらないようにすることも考えられるだろう。(ただこの場合、\pdftex〜 がプリミティブ判定で偽になるという問題がある。)

しかしながら、この“2.00.0”と見做すという扱いも必ずしも妥当とはいえない。LuaTeX が登場してから随分と時が経っていて、その間に pdfTeX の機能拡張も行われている。だから、最新の pdfTeX の機能が古い LuaTeX には備わっていないという場合が当然ありえるわけである。*1

従って、“正しい方法”は何かというと、もし何等かの機能の有無を pdfTeX のバージョンの値で判定したい*2のであれば、LuaTeX については別に \luatexversion の値を見るべき、ということになる。

*1:あと、pdfTeX のプリミティブで LuaTeX では「意図的に省かれている」ものも存在する。

*2:原則的にこれは避けるべきで、可能ならばプリミティブが定義済か等の方法を用いるのが望ましい。