XeTeX の \font
プリミティブの右辺の値はクオートで囲うことができる。
\font\test="Times New Roman"
この「クオート囲みの文字列」については以前の記事で解説したことがある。そこでの説明に従うと、このクオートは飽くまでも「空白を含む文字列を扱うための方便」に過ぎず、何らかの“機能の違い”を示すものではない。つまり、右辺の文字列が空白を含まない場合はクオートは任意であり、以下の 2 つは全く同じ意味をもつ……はずである。
% " " 無し \font\test=IPAexMincho % " " 有り \font\test="IPAexMincho"
しかしこれを実際に試してみると、何ともアレな挙動になる、という話。
フォント指定をクオートしないとアレ
以下のファイルを xetex でコンパイルしてみる。
% plain XeTeX 文書 % " " 無し, フォント名指定 \immediate\write16{without quotes, font name}% \font\test=IPAexMincho\relax \test 1 \font\test=IPAexMincho:+jp90\relax \test 2 % " " 無し, ファイル名指定 \immediate\write16{without quotes, file name}% \font\test=[ipaexm.ttf]\relax \test 3 \font\test=[ipaexm.ttf]:+jp90\relax \test 4 % " " 有り, フォント名指定 \immediate\write16{with quotes, font name}% \font\test="IPAexMincho"\relax \test 5 \font\test="IPAexMincho:+jp90"\relax \test 6 % " " 有り, ファイル名指定 \immediate\write16{with quotes, file name}% \font\test="[ipaexm.ttf]"\relax \test 7 \font\test="[ipaexm.ttf]:+jp90"\relax \test 8 \bye
すると、コンパイル中の端末表示は以下のようになる。
This is XeTeX, Version 3.14159265-2.6-0.99996 (TeX Live 2016/W32TeX) (preloaded format=xetex) restricted \write18 enabled. entering extended mode (./test.tex without quotes, font name kpathsea: Running mktextfm IPAexMincho The command name is C:\texlive\2016\bin\win32\mktextfm kpathsea: Running mktexmf IPAexMincho.mf The command name is C:\texlive\2016\bin\win32\mktexmf name = IPAexMincho, rootname = IPAexMincho, pointsize = mktexmf: empty or non-existent rootfile! Cannot find IPAexMincho.mf. kpathsea: Appending font creation commands to missfont.log. kpathsea:make_tex: Invalid fontname `IPAexMincho:+jp90', contains ':' without quotes, file name kpathsea:make_tex: Invalid fontname `[ipaexm', contains '[' with quotes, font name with quotes, file name [1] ) Output written on test.pdf (1 page). Transcript written on test.log.
その上で、次の missfont.log ファイルが出力される。
mktextfm IPAexMincho
この結果をみると、以下の 3 つの文字列が“TFM の名前”と解釈されて、mktextfm・mktexmf が試みられていることが判る。((“IPAexMincho:+jp90
”と“[ipaexm
”は TFM 名として不正な文字を含むので、mktextfm が実際に呼ばれる前に失敗している。))
IPAexMincho
IPAexMincho:+jp90
[ipaexm
3 つ目の [ipaexm
については、実際に指定した [ipaexm.ttf]
と [ipaexm.ttf]:+jp90
の‘.
’の前までが TFM 名と解釈されたものと推定される。何れにしても、クオートで囲まないものは TFM 名として解釈されたのは確かである。これに対して、クオートで囲ったものについては TFM 名ではなく OpenType フォントの名前として扱われたようである。
では、出力の PDF はどうなっているかというと、ここでは全てのフォント指定が意図通りに行われている。
つまり、クオート無しの指定は一旦は TFM の指定と扱われたが、mktextfm が失敗した後に、意図通りに OpenType フォントの指定と扱われた、ということになる。
まとめ
XeTeX の \font
プリミティブの右辺のクオート囲みは、単に“空白を含む文字列を表す手段”ではなくて、何らかの機能の違いを示している、と推定される。
補足
もう少しイロイロ試してみる。
TFM 名をクオートすると
\font\test="ec-lmr12" \test Hi
これは意図通りに動作するが、少しの間待たされる。恐らく“OpenType を探しに行っている”のだと思われる。クオート無しだと待たされない。
非実在フォントすると
\font\test=hogera-a \test Hi % " " 無し \font\test="hogera-b" \test Hi % " " 有り
mktextfm が走った後にエラー((! Font \test=(TFM名) not loadable: Metric (TFM) file or installed font not found.
のエラー。))になる。