前の記事で「fontspec を読み込んだ時点で luatexbase と luatex が衝突するので、カテゴリコードテーブルの機能が事実上使えなくなる」という話をしたが、よく調べてみると、その fontspec 自身がカテゴリコードテーブルを使っていることが判明した。
[fontspec.lua;35 行目]
function fontspec.sprint (...) tex.sprint(luatexbase.catcodetables['latex-package'], ...) end
じゃあ何故これで正常に動作するのかというと、luatex より後で luatexbase の方を読み込んでいるからのように思われる。例えば、fontspec より前に「luatexbase を内部で読み込むパッケージ」を読み込むと、luatex と luatexbase の読み込む順番が変わり、結果的に、前の記事で述べた現象と全く同じことが起きてエラーになる。
[test.tex]
% 文字コードは UTF-8
\documentclass{article}
\usepackage{luaotfload} % これは luatexbase を内部で読み込む
\usepackage{fontspec}
\setmainfont[Script=CJK]{ipaexm.ttf}
\begin{document}
これは fontspec の実験です。
\end{document}
[lualatex test
の実行結果]
! LaTeX Error: Missing \begin{document}.See the LaTeX manual or LaTeX Companion for explanation.
Type Hfor immediate help.
...l.5 \setmainfont{ipaexm.ttf}
?
つまり、fontspec は制御綴を TeX に出すために fontspec.sprint()
を呼ぶが、実際には普通の文字として書き込まれるため、「プレアンブルに文章がある」というエラーが起こっている。