マクロツイーター

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

LuaTeX や LaTeX や LuaLaTeX が新しくなってアレ(3)

LuaTeX と LuaLaTeX の大きな変更がほぼ同時に起こっていて非常にややこしい。*1

LuaLaTeX のプリミティブはどうだったか、どうなったか

両方の変更ともプリミティブの名前に関係しているので、ここで改めて LuaLaTeX でのプリミティブの扱いについて説明しておく。

LuaTeX はそれ以前に存在した種々のエンジンの機能(の一部)を引き継いでいる。そして、プリミティブを「どのエンジンから継承したか」により複数のカテゴリに分けて“管理”している――つまり「pdfTeX で存在するプリミティブのみを使う(定義する)」という処置が行えるのである。プリミティブを「定義しない」ことの目的は、「定義済である」ことにより旧来のエンジンとの互換性が失われるのを防止することにある。ここでいう互換性の問題とは、例えば次のような問題を指している:

LaTeX 文書で \newcommand\middle{...} のようなマクロ定義をしていたとすると、e-TeX 拡張のエンジンではその定義は(\middle が定義済のため)エラーになってしまう。

そのため、LuaTeX のプリミティブの“管理”については、使う・使わないだけでなくて、「特定の接頭辞を付けて定義する」という選択もできる。つまり、\middle だと既存のソースにある定義と衝突するかも知れないが、これを \ETEXmiddle として定義すれば衝突が(ほぼ)避けられる、ということである。

LuaTeX での実際のカテゴリは次のようになっている。

  • tex: 元祖の TeX にあるもの。*2\def\expandafter 等。
  • etex: e-TeX 拡張にあるもの。\middle\detokenize 等。
  • pdftex: pdfTeX 拡張にあるもの。\pdfcompresslevel\pdfpageattr 等。
  • omega: Omega 拡張にあるもの。\pagedir\leftghost 等。
  • aleph: Aleph 拡張にあるもの。。\boxdir\pagerightoffset 等。
  • umath: LuaTeX 独自の拡張のうち Unicode 数式に関するもの。*3 \Umathchar\Umathoverbarrule 等。
  • luatex: LuaTeX 独自の拡張のもの。((umath にあるものは luatex にも入っている。だから昔の LuaLaTeX では \luatexUmathchar\Umathchar の両方があったことになる。))attributedefluaescapestring 等。((「プリミティブの名前の管理」には Lua コードの実行を必要とする。そのため、LuaTeX 拡張のうち \directlua だけは例外的に最初から定義されている。))

2015-10-01 より前の LaTeX では以下のようにプリミティブを定義していた。

  • tex、etex、pdftex、umath カテゴリのプリミティブはそのままの名前で使う。
    • pdfLaTeX は既に広く使われているので、これらのプリミティブはそのまま使えるべきである。
    • umath のプリミティブは大体 Umath〜 という名前だから衝突する危険が少ない。
  • omega、aleph、luatex カテゴリのプリミティブは luatex の接頭辞を付けて使う。
    • つまり \luaescapestring は \luatexluaescapestring という(アレな) 名前になる。
    • こちらは衝突の危険性があると判断したわけである。

しかし、2015-10-01 での変更で、この「luatex 接頭辞」は廃止になった。どうやら、名前の衝突を防止するメリットよりも、「LuaTeX のマニュアルにあるプリミティブが何故か使えない!」という混乱によるデメリットの方が大きかったようである。従って、これからは \luatexluaescapestring でなく本来の \luaescapestring という名前を使うのが正しいことになる。

従来の luatex 付きの名前は定義されなくなるので互換性の問題が出るはずだが、そこは「luatexbase パッケージで幾つかのプリミティブについて対処((例えば \let\luatexluaescapestring\luaescapestring のようなことをやっている。))しておけば大丈夫」と判断しているらしい。

ところで、これまでの話を踏まえると、「LuaTeX でのプリミティブの変更」と「LuaLaTeX でのプリミティブの変更」は微妙に絡んでいることがわかる。

  • 以前の記事にある通り、LuaTeX v0.81 では \ifincsname\leftmarginkern 等が pdftex カテゴリから luatex カテゴリに移動している。
  • 昔の LuaLaTeX の方針だと、luatex カテゴリには接頭辞が付くので、それらのプリミティブは実質的に「名前が変わる」(\ifincsname\luatexifincsname)ことになる。
  • しかし実際には v0.81 のリリースは新しい LaTeX のリリースの数日後であり、また TeX Live などに適用されるのはもっと後になるので、これらのプリミティブは影響を受けずに済んだ。
というわけで

2015-10-01 の LaTeX の更新により、LuaLaTeX が動かなくなる可能性は多少なりとも存在するので、LuaLaTeX を常用する人は、

2015-10-01 以降に TeX 環境を更新するのはやめましょう。

……というと、某 OS の最新版を使っている人は「えっ」と驚くことであろう。そう、「新しい某 OS で TeX がアレ」「新しい LuaTeX がアレ」「新しい LaTeX がアレ」が全部同時期に起こっているのは本当に不幸なことである。でも LuaLaTeX ユーザだったら「新しい某 OS では LuaTeX でヒラギノがアレ」を知っていて OS のアップデートを思い留まっていたかも知れない。そういう人は是非ともヒラギノに感謝しよう(えっ)。既にアップデートした人は……、まあ、LuaLaTeX が無事に動くように毎日祈りを捧げようではないか……。

ところで、既に情報が出回っているように、「LuaTeX で新しいヒラギノする」ためのエンジンやライブラリの改修は既に出来上がっている。*4そうすると、その新しい LuaTeX を一刻も早く入手したいと思っている人がいるかも知れない。*5しかし、“一刻も早く入手する”と、まだ LaTeX 側で対応ができていない「新しい LuaTeX がアレ」が降りかかってくる。もしかしたら、ここはじっと堪えるのが吉かも知れない。

*1:先の LaTeX News には LuaTeX エンジンの変更についての言及はないので、恐らく時期が重なったのは偶然なんだろう。

*2:tex カテゴリのプリミティブは「あるのが当然」なので最初から定義されている。

*3:一部は XeTeX でも提供されていて、多分 XeTeX 由来のものもあったはずである。

*4:ヒラギノについては、の話。まだ一部のフォントは使えないらしい。

*5:「自分でビルドする」以外に入手する方法があるのかは自分は知らない。