マクロツイーター

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

luatexbase の話:カテゴリコードテーブル (2)

(前回の記事)

前回の記事では、LuaTeX のカテゴリコードテーブルの話とそれを LaTeX (および plain TeX)での使用を支援するためのパッケージ luatexbase の話をした。

実は、LuaTeX 機能の支援パッケージにはもう 1 つ、luatex パッケージ(作者:Heiko Oberdiek)というものがある。(以下、小文字の「luatex」はこのパッケージを指す。)両パッケージは機能的に重なる部分が多いので、両者の処理が衝突する(すなわち両方を読み込むとどちらも正常に機能しなくなる)ということが予想される。実際に調査してみたところ、「カテゴリコードテーブル関連の機能」だけは実際に衝突が起こるようである。他の機能は大丈夫であると思われる。(対象:luatexbase v0.3 [2010/10/10];luatex v0.4 [2010/03/09])

例えば、前回に示した LaTeX ソースで、luatex パッケージを一緒に読み込むように変えてみる。


\documentclass{article}
\usepackage{luatexbase} % luatexbase を読み込む
\RequireLuaModule{test}
\makeatletter
\def\@@yes{YES}
\makeatother
\usepackage{luatex} %←―(追加) luatex も読み込んでしまう!
\typeout{\directlua{ cctabletest() }}
\begin{document}
\end{document}

すると、「YES」と表示されるべきところが、「\@@yes」の表示に変わってしまう。これは次の理由による。

  • luatexbase では 1〜6 番にプリセットを用意し、新たに \newluatexcatcodetable で宣言したものは 7, 8, 9, … 番に割り当てられる。
  • luatex では 1, 3, 5, 7 番にプリセットを用意し、新たに宣言したもの(luatex での命令名は \newcatcodetable)は 9, 11, 13, … 番に割り当てられる。偶数の番号のレジスタは「カテゴリコードテーブルスタック」の機能のために予約されている。
  • luatexbase では、\CatcodeTableLaTeXAtLetter*1 は 5 番に割り当てられている(従って、luatexbase.catcodetables['latex-package'] の値は 5 である)。ところが、luatex ではこの番号には「全ての文字がカテゴリコード 12」のテーブル(両者とも名前は \CatcodeTableOther)が割り当てられる。((すなわち、luatex を luatexbase より後に読み込んだとすると、\CatcodeTableOther の値は 5 に変わるが、luatex にない \CatcodeTableLaTeXAtLetter も 5 のままであり、当然 luatexbase.catcodetables の各エントリの値も luatexbase が設定したままになっている。))したがって、testcctable()\CatcodeTableOther の状態で「\@@yes」を書き込むことになり、結果的に、この文字列がそのまま表示された。

なお、ここでは例は示さないが、(luatexbase の)\newluatexcatcodetable で宣言したテーブルと(luatex の)\newcatcodetable で宣言したテーブルは同じものを指す可能性があり、その場合、互いの間で設定の破壊が起こることにも注意が必要である。

ところで、これだけの話ならば、LaTeX で日常茶飯事の「パッケージの衝突」の問題に過ぎない訳で、「ゆえに両方を同時に使うな」で済むことなのであろうが、今の話は開発者用パッケージ(ユーザ用パッケージの裏で読み込まれる)なのでもっと深刻である。致命的なのは、LuaLaTeX でほぼ必須だといえる fontspec パッケージが luatexbase と luatex の両方を読み込んでしまうということである。*2

この衝突については、「A guide to LuaLaTeX」(この著者は luatexbase の作者の一人でもある)の中で言及されている。

Warning. This package is currently in conflict with the luatex package, since they both do almost the same thing. The respective package authors are well aware of this situation and plan to somehow merge the two packages in the near future, though the timeline is not clear.

つまりは、「解決する予定はあるが、それが何時になるかは判らないので、それまではカテゴリコードテーブルは安心して使えない」ということか…。残念……。

*1:このプリセットは luatex にはない。

*2:さらに詳しくいうと、luaotfload パッケージは luatexbase を読み込み、expl3 パッケージは luatex を読み込む。