Hatena::ブログ(Diary)

マクロツイーター このページをアンテナに追加 RSSフィード Twitter

2011-10-09

dvipdfmx で OpenType する件について (SFD 編-5)

前回の続き)

SFD ファイルで「普通の」エンコーディングを定義する

これまで、サブフォント定義ファイル(SFD ファイル)の「本来の」使い方――すなわち、大規模文字集合を複数の TFM ファイルで分割して表現する――について説明してきた。ここからは、SFD ファイルを「サブフォントでない」エンコーディング適用することを考える。

といっても、何か複雑なトリックが要るわけではない。「大規模な元エンコーディングを分割して複数の TFM にする」のがサブフォントであるが、ここで「分割数を 1 つ」にする(「元エンコーディング」そのものが TFM のものと一致)ことで、普通の(8 ビットの)エンコーディングをサブフォントとみなすことができる。例えば、Samp0TeXStd.sfd という SFD ファイルの内容を

t1  (T1 に対応する Unicode 符号位置の列)

という 1 行だけにしておいて、次のマップ行を指定する。*1

mplus1ps-r-@Samp0TeXStd@  unicode  mplus-1p-regular.ttf

SFD ファイルでの指定の原理を考えると、こうすると「mplus1ps-r-t1」が T1 エンコーディングTFM となることが解るであろう。SFD を用いて通常のエンコーディングを指定する原理はこのようなものである。

さらにもう少し考えれば、先の SFD ファイルで「複数のエンコーディング」が一度に指定できるということが解る。つまり、Samp0TeXStd.sfd の内容を以下のようにする。

ot1  (OT1 に対応する Unicode 符号位置の列)
t1   (T1  に対応する Unicode 符号位置の列)
ts1  (TS1 に対応する Unicode 符号位置の列)
ly1  (LY1 に対応する Unicode 符号位置の列)

すると、前掲のマップ行 1 行だけで、mplus1ps-r-ot1、mplus1ps-r-t1、mplus1ps-r-ts1、mplus1ps-r-ly1 の 4 つの TFM のマップを指定したことになる。そして、TFM 生成は次のように ttf2tfm を一度実行すれば済んでしまう。

ttf2tfm mplus-1p-regular.ttf mplus1ps-r-@Samp0TeXStd@

もちろん、これを実行するためには、各エンコーディングの文字の Unicode 値を調べて「正しい Samp0TeXStd.sfd」ファイルを作らなければならない。しかし、前に述べたように、SFD ファイルはフォントに依存しないので、一回作ってしまえば、それを全てのフォント適用できる。

という訳で私が作った Samp0TeXStd.sfd を公開することにする。

この SFD ファイルでは OT1/T1/TS1/LY1 の他に、IL2/L7x/OT2/OT4/QX/T2A/T2B/T2C/T5 のエンコーディングの定義も入れている。また、ttf2tfm で実際に作成した TFM ファイルとマップファイルを同梱した。ファイルの配置や dvipdfmx の設定の方法は .enc ファイルを用いた時と全く同じなので繰り返さないことにする。適切に配置・設定がなされていれば、以下のようなテスト文書(TeX レベルの指定を含めた LaTeX 文書)が正常に PDF 文書に変換できるはずである。

\documentclass[a4paper]{article}
\font\testfont=mplus1ps-r-t1
\begin{document}
\testfont  No one wants to die. 
Even people who wanna go to heaven don't wanna die to get there.
\end{document}
f:id:zrbabbler:20111009062819p:image

*1:これまでの .enc ファイルによる TFM と区別するため、ファミリ名に s を付加して「mplus1ps」とした。