(前回の続き)
SFD と .enc の「エンコーディング指定」の決定的な違い
これまでの説明だと、何となく、SFD ファイルというものは、「複数の .enc ファイルでサブフォントのエンコーディングを定義していたものが、1 つのファイルで済むようになる、簡便な方法」という印象をもったかも知れない。しかし、実のところ、エンコーディング(.enc)ファイルと SFD ファイルでのエンコーディングの指定には大きな概念的な差がある。それは「.enc ファイルは『グリフ名で』文字(グリフ)を指定するのに対し、SFD ファイルは Unicode 符号位置で指定する」ということである。一般に、別のフォントの中にある「同じ文字」を考えた場合、それは同じ Unicode 符号位置をもつことがほとんどである*1が、グリフ名は異なるかも知れない。従って、マップファイルの記述を考えた場合*2、
mplus1p-r-u00 mplus1p-u00 mplus-1p-regular.ttf mplus1p-r-u00 mplus1p-u01 mplus-1p-regular.ttf ……
という .enc ファイルを用いた指定について、フォント(と TFM)を別のものに変えて同じ .enc ファイルの群を用いた
hogehoge-r-u00 mplus1p-u00 hogehoge-regular.ttf hogehoge-r-u00 mplus1p-u01 hogehoge-regular.ttf ……
というものは「正しい」記述にはならない。これに対して
mplus1p-r-u@Unicode@ unicode mplus-1p-regular.ttf
という SFD ファイルを用いた指定は、そのまま他のフォント(と TFM)に変えることができる。
hogehoge-r-u@Unicode@ unicode hogehoge-regular.ttf
すなわち、Unicode.sfd は特定のフォントに依存しないのである。*3
余談であるが、この「SFD ファイルがフォントに依存しない」という性質は、拙作の PXchfon パッケージ(使用する基本フォントを LaTeX 文書中で指定できるようにする)の欧文フォントの処理で重要な役割を果たしている。この処理では、ある特定の欧文 TFM(例えば cfjar-r-l0j.tfm)について、マップ行を文書中で指定する*4ことで実フォントを「文書中で指定された」ものに変更している。例えば、
\usepackage[alphabet]{pxchfon} \setminchofont{ipam.ttf}
という指定をすると、次のようなマップ行が有効になる。
r-cfjar-r-@PXcjk0@ unicode ipam.ttf
ここで、SFD ファイルでの指定を用いている所がポイントで、このマップ行指定は任意のフォントについて適用させることができる。さらに、ここで用いている TFM は「日本語フォントに適応させた固定幅のメトリック」をもつので、「等幅」日本語フォントが用いられる限り、正常な出力が得られるのである。
(まだ続く)