マクロツイーター

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

XeTeX のチョットアレな話

XeTeX の \font プリミティブの右辺の値はクオートで囲うことができる。

\font\test="Times New Roman"

この「クオート囲みの文字列」については以前の記事で解説したことがある。そこでの説明に従うと、このクオートは飽くまでも「空白を含む文字列を扱うための方便」に過ぎず、何らかの“機能の違い”を示すものではない。つまり、右辺の文字列が空白を含まない場合はクオートは任意であり、以下の 2 つは全く同じ意味をもつ……はずである。

% " " 無し
\font\test=IPAexMincho
% " " 有り
\font\test="IPAexMincho"

しかしこれを実際に試してみると、何ともアレな挙動になる、という話。

フォント指定をクオートしないとアレ

以下のファイルを xetex でコンパイルしてみる。

[test.tex]
% 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 ファイルが出力される。

[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. のエラー。))になる。