前回の記事で、\suppressfontnotfounderror
というプリミティブが登場したので、折角だからこれの解説をすることにした。なお、タイトル名は以前の記事のものを元ネタとしている。LuaTeX の仕様が毎日変わる、とかいう話では(残念ながら?)ない。
\suppressfontnotfounderror
:[整数パラメタ・読書可] この値が正の数である場合、\font
プリミティブで指定された“フォント”が見つからなかった場合のエラーが抑止される。
要するに名前の通りなのであるが、もう少し詳しく説明しよう。
通常は、TeX エンジンは \font
プリミティブで指定された“フォント”が見つからないとエラーを出す。((なお、LuaTeX では \font
プリミティブで「名前を波括弧に入れる」ことができる。))
% plain LuaTeX 文書 %\suppressfontnotfounderror=1 \tracinglostchars=2 \font\hoge={hoge} \hoge Hoge! \bye
この文書を luatex でコンパイルすると「hoge というフォントは見つからない」というエラーを出す。
! Font \hoge=hoge not loadable: metric data not found or bad. <to be read again> \hoge l.5 \hoge Hoge! ?
ここで処理を続行(Entry を押す)すると、\hoge
に「空っぽのフォント」(“nullfont”と呼ばれる)が割り当てられる。nullfont では全ての文字が未定義なので、それが指定された状態で文字“Hoge!”を出力しても実際には何も出力されない。さらに、上掲のソースでは \tracinglostchar
を有効にしているので次のような警告メッセージが端末に出力される。
Missing character: There is no H (U+0048) in font nullfont! Missing character: There is no o (U+006F) in font nullfont! Missing character: There is no g (U+0067) in font nullfont! Missing character: There is no e (U+0065) in font nullfont! Missing character: There is no ! (U+0021) in font nullfont!
“普通の動作”を確認したので、次は \suppressfontnotfounderror
プリミティブを試してみよう。先のソースの 2 行目を有効化する。
\suppressfontnotfounderror=1
この状態で再び luatex でコンパイルすると、今度は次のようになる。
- 「
Font \hoge=hoge not loadable:
」のエラーが出ない。 - 「
Missing character
」の警告は出る。
つまり、「\suppressfontnotfounderror=1
」はエラーを出さずに黙って「続行の処理」をする、つまり \hoge
に nullfont を割り当てているのである。
\font\hoge=...
により \hoge
に割り当てられたフォントが nullfont であるかは以下の条件文で判定できる。
\ifx\hoge\nullfont % \hoge はnullfontである \fi
従って、「\suppressfontnotfounderror=1
」に設定した上でこの判定をすることで、フォントが見つからなかったときに「もっと適切な動作」(例えば、フォールバックの(ちゃんと使える)フォントで代用する、より的確なエラーメッセージを出す、など)を行うことができる。
なお、“フォント”が具体的に何を指しているかは状況により異なる。LuaTeX の場合は既定では従来の TeX と同じく TFM ファイルしか扱うことができない。だから上掲のコードでは hoge.tfm というファイル(だけ)が探されている。ところが
\input luaotfload.sty
を実行して luaotfload パッケージを読み込むとエンジンが OpenType フォントを扱える状態になるため、この後で「\font\hoge={hoge}
」を実行すると、従来の hoge.tfm に加えて「hoge というフォント名の OpenType フォント」も探すようになる。