マクロツイーター

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

LuaTeX がますます新しくなってますますアレ

半年前あたりから LuaTeX が“リストラ”を進めていて、大きな仕様変更が続いている。

  • バージョン 0.81 において、プリミティブの名称に関する整理が行われた。この結果、pdfTeX との(プリミティブ名に関する)互換性が劣化した。
  • バージョン 0.85 において、プリミティブの名称に関して根本的な方針の転換が行われた。この結果、pdfTeX との(プリミティブ名に関する)互換性がほぼ失われた。またこの変更のため 2015/10/01 版(当時の最新)の LaTeX は 0.85 版以降の LuaTeX では正常に動作しない状態になっていた。(最近のリリースにおいて対応が行われた。)これについて解説することを目的とした日本語の記事は見当たらないが、例えば次の記事で様子が少し触れられている。
  • これに加えて、出力ストリームの個数が従来の 16(元祖 TeX と同じ)から 128 まで拡張された(つまり、\write127 まで可能)。この影響で、「\write18 でシェル実行を行う」という(ほぼ全てのエンジンに備わっている)文法が廃止された。 すなわち、この版の LuaTeX は pdfTeX と比較すると機能的には上位互換であるが、ソース記述としては違うことになる。つまり、同じことをするのに違うコードを書く必要がある。

0.86 版以降の変更は比較的小規模(または“多くのユーザには影響しない”)ものがほとんどであるが、その中でただ一つ、「LuaLaTeX で日本語している」人にとって大きな影響をもつ点が存在する。

PDF 出力時の \mag のサポートが
0.87 版で廃止された。

例えば、次のような単純な文書で試してみる。

% plain TeX文書, 文字コードはUTF-8
\mag=2000 % ページを2倍に拡大
\font\bigfont=cmr10 at 100pt
\parindent=0pt \bigfont
Hello\vfill Lua{\TeX}!\eject\bye

これを LuaTeX の 0.85 版と 0.89 版(現在の最新)を用いてコンパイルすると結果は以下のようになる。*1なお、0.85 版での出力は pdfTeX での出力と一致する。最新版では、\mag がアレになっていることが判る。

これも一種の「pdfTeX との互換が失われた」事例といえるが、これまで挙げたものと異なり、「機能そのものが失われている」ため、より厄介な問題といえるだろう。

そしてこれ日本語文書作成者によって特に影響が大きい問題である。何故かというと、LuaLaTeX で日本語文書を作成しているユーザはそのほとんどが ltjsナントカ クラスを使っているはずである。ところが、(よく知られているように)jsナントカ クラスはレイアウト設定のために mag 設定を利用していて、これは ltjsナントカ でもそのまま引き継がれている。今はまだ LuaTeX-ja そのものが新しい LuaTeX に対応できていないので表面化していないが、対応したとしても、肝心の ltjsナントカ クラスは LuaTeX 0.87 以降では正常に機能しないはずである。

*1:pdfTeX/LuaTeX の出力用紙サイズの既定が A4 であることを仮定する(つまり掲載の図はかなり縮小されている)。plain TeX のレイアウトはレターサイズを前提にしているので、元々“まともな”出力設定になっていないが、それは今回の問題とは無関係である。