マクロツイーター

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

新しい LuaLaTeX で bxjsarticle できる話

最新の TeX Live では LuaLaTeX で bxjsarticle できるらしい。

\documentclass[lualatex,ja=standard]{bxjsarticle}
\begin{document}
$a + b = c$
\end{document}

つまり、expl3 が改訂されてコレが解決したということ。

以下はこのスレッドの某 ZR 氏の返信およびアレの内容を前提とする。

何が変わったか
[expl3-code.tex](r6210)
\etex_ifdefined:D \luatexsuppressfontnotfounderror
  \tex_let:D \luatex_alignmark:D                 \luatexalignmark
  \tex_let:D \luatex_aligntab:D                  \luatexaligntab
  \tex_let:D \luatex_attribute:D                 \luatexattribute
  \tex_let:D \luatex_attributedef:D              \luatexattributedef
  ......
\tex_fi:D

要するに、「luatex 付の制御綴が定義されているか」の判定に用いるプリミティブを \catcodetable から \suppressfontnotfounderror に変えたわけである。luatexbase は“\luatexsuppressfontnotfounderror”は定義しないので、取りあえずこれで luatexbase との衝突は避けられる。

ただこの解決法だと、結局同じ問題を抱え続けているともいえる。つまり、「互換性のために」次のようなコードが実行するパッケージが存在すると、それは再び expl3 の誤動作を引き起こす。

\let\luatexsuppressfontnotfounderror\suppressfontnotfounderror

つまり、LaTeX 用のパッケージでは、このコードは「絶対に書いてはいけない」ということである。

LuaTeX プリミティブする方法

もちろん、「luatex 無し」の方が新しい仕様なので、これから新しいコードを書く場合*1は「luatex 無し」の制御綴方を用いるべきである。だから、上記のような「luatex 有り」の方に向けてコピーするようなコードを書く必要は生じないと思われる。

「luatex 無し」の名前を用いるとなると。古い(2015-10-01 より前の)環境でもそれを使えるようにする必要がある。それをする一番簡単な方法は、次のように Luatex.enableprimitives() 関数を利用することである。*2

\directlua{tex.enableprimitives("",
    % 必要なプリミティブの名前を並べる
    { "latelua", "luaescapestring", "suppressfontnotfounderror" })}

*1:既存のコードを新しい環境に対応するために改修する場合でも。

*2:あるいは、omega、aleph、luatex カテゴリのプリミティブを全部出現させてもよいのかも知れない。LaTeX News ではそちらの方法が紹介されている。