前回の記事では、 LaTeX 文書にマジックコメントとして処理系やメインファイルを記述するやり方について書いた。今回は、マジックコメントがない場合に処理系を推定する方法について考える。
LaTeX 文書の処理系(エンジン)には色々あるが、このブログの読者が使うのは次の6種類のうちのどれかだろう(最近はデフォルトで e-TeX 拡張が使えるみたいなのでその辺の細かい区別は必要ない)
- pdfLaTeX
- XeLaTeX
- LuaLaTeX
- LaTeX + dviware (e.g. dvipdfmx)
- pLaTeX + dviware (e.g. dvipdfmx)
- upLaTeX + dviware (e.g. dvipdfmx)
(この他に、最近は pTeX-ng なる代物もあるらしいが、筆者はよく知らないのでこの記事では無視する)
日本語の場合は、文書が特定の処理系専用になることが多く、ドキュメントクラス等を調べることによって判別できる(できてしまう)ことが多い。逆に、欧文の文書を pdfLaTeX, XeLaTeX, LuaLaTeX のどれで処理すべきか判別するのは難しいと思われる(まあ、「どれでも処理できる」のであればデフォルトの処理系で処理するというので問題ないのだが)。
ドキュメントクラスから処理系を判定する
日本語の文書向けのドキュメントクラスは、特定の処理系専用に作られているか、もしくはクラスオプションで処理系を指定するようになっていることが多い。
pLaTeX 用:
- jarticle, jbook, jreport
- tarticle, tbook, treport
- jsarticle, jsbook (without ‘uplatex’ option)
upLaTeX 用:
- ujarticle, ujbook, ujreport
- utarticle, utbook, utreport
- jsarticle, jsbook (with ‘uplatex’ option)
LuaTeX 用 (LuaTeX-ja) :
- ltjarticle, ltjbook, ltjreport
- ltjsarticle, ltjsbook
- ltjtarticle, ltjtbook, ltjtreport
- bxjsarticle, bxjsbook, bxjsreport, bxjsslide
- クラスオプションとして処理系を指定: latex,platex,uplatex,lualatex,xelatex,autodetect-engine のいずれか
- DVI 出力の場合、クラスオプションとして dviware を指定: dvips,dviout,xdvi,dvipdfmx のいずれか
- autodetect-engine が使用されていた場合は、文書から処理系を判定することはできない。
もちろん、これらのドキュメントクラス自体の改訂によってこの辺りの仕様が変わる可能性があり、今後もずっとこの判定方法に頼れるとは限らない。(実際、この記事を書いている間に jsclasses に autodetect-engine が実装されてしまった)
使うパッケージによって処理系を判定する
日本語文書であっても、例えば Beamer を使う場合は、ドキュメントクラスからエンジンの推定はできない。しかし、そのような場合でも、使うパッケージによってエンジンを判定できる場合がある。
- minijs, okumacro, jsverb, okuverb, pxjahyper, etc: (u)pTeX 専用
- luatexja, luatexja-ruby, luatexja-otf, luatexja-preset: LuaTeX 専用
- xltxtra, xeCJK, zxjatype: XeTeX 専用
- xltxtra パッケージは fontspec パッケージに取って代わられたようなので、見かけることは少ないかもしれない。
- fontspec, unicode-math: XeTeX または LuaTeX
- 以前このブログで言及した filemod パッケージは pdfTeX または LuaTeX を必要とするものだった。(しかし、広く使われているとは思えないので、判定には利用できないだろう)
もっと色々あるだろうが、網羅的に列挙しても仕方がないので、このぐらいにしておく。
ドキュメントクラスと同じく、パッケージについても、仕様の変化や代替パッケージの登場によって、ここに書いた情報が古くなっていく可能性がある。
雑感
このような heuristics はやはり筋が悪い気がしてきたし、確実な動作を望むなら、前回書いたような方法でユーザーが明示的に指定するべきだろう。
それでもこの記事に書いたような方法で処理系の推定を行いたいのであれば、なるべく最新の動向を追いかけるようにしたい。