マクロツイーター

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

きょうの LuaTeX (1) : \suppressfontnotfounderror

前回の記事で、\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 フォント」も探すようになる。