Hatena::ブログ(Diary)

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

2011-10-05

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

前回の続き)

サブフォント定義ファイル

この状況を改善するのが、サブフォント定義ファイル(SFD ファイル;拡張子 .sfd をもつ*1)による指定である。SFD ファイルを使うと、256 個の .enc ファイルに相当する内容が次の 1 個のファイル Unicode.sfd で表される。(これと等価な Unicode.sfd が TeX システムに既にインストールされているはずである。*2

[Unicode.sfd]
00  0x0000_0x00FF
01  0x0100_0x01FF
……(253 行省略)……
ff  0xFF00_0xFFFF

SFD ファイルの各行が 1 つの TFM に対応する(SFD ファイルの書式については後で詳しく述べる。)

<識別子>  <符号位置リスト>

ここで <識別子> は TFM 名の一部になる。*3その後に書かれるのはその TFM に含める符号位置のリストである。つまり、Unicode.sfd では識別子 00 の TFM は U+0000〜00FF の文字が入っている。

そして、SFD ファイルを使った dvipdfmx のマップ行の記述は以下のようになる。

mplus1p-r-u@Unicode@ unicode mplus-1p-regular.ttf

つまり、TFM 名のところに「@SFDファイル名@」の文字列を含ませるのである。これで、この部分を「SFD に書かれた各々の識別子」に置き換えた名前の TFM について、「その識別子に対応する符号位置リスト」のグリフの集合が対応付けられる。つまり、上の 1 行のマップは実際には mpluis1p-r-u?? の 256 個の TFM に対するマップの指定になっているのである。なお、この用途の場合は、エンコーディング指定(第 2 要素)は必ず「unicode」を指定する。*4それ以降の書き方は .enc ファイル使用の場合と同じである。

SFD ファイルに基づく TFM の生成

TFM 生成ツールによっては、SFD ファイルを用いたサブフォントを直接サポートするものもある。例えば、ttf2tfm では以下のコマンドラインにより、上掲のマップ行に対応する 256 個(最大で*5)の TFM ファイルが生成される。*6

ttf2tfm mplus-1p-regular.ttf mplus1p-r-u@Unicode@

ここまで無粋な説明が続いたので、少し実験をしてみよう。以下のソースは、前回示した「かなり直接的にサブフォントを用いて欧文 TeX で漢字を出す例」をそのまま LaTeX 文書に仕立てたものである。この中の「\AtBeginDvi{\special{pdf:mapline <マップ行内容>}}」は dvipdfmx 用のマップを LaTeX 文書に直接書き込む設定である。これを単純に latex*7dvipdfmxPDF 文書に変換すると、「M+ 1P」で「高徳納」と出力されるはずである。

[test1.tex]
\documentclass[a4paper]{article}
\AtBeginDvi{\special{pdf:mapline mplus1p-r-u@Unicode@ unicode mplus-1p-regular.ttf}}
\def\printchar#1#2{{\font\tempFont=#1\relax \tempFont\char#2\relax}}
\begin{document}
\printchar{mplus1p-r-u9a}{"D8}%
\printchar{mplus1p-r-u5f}{"B3}%
\printchar{mplus1p-r-u7d}{"0D}%
\end{document}
f:id:zrbabbler:20111005094123p:image

(続く)

*1FontForgeネイティブフォントデータ記述ファイルの拡張子も .sfd だが、無論これとは無関係。

*2:「kpsewhich Unicode.sfd」を実行して探せる。

*3:だから、16 進数字である必要がないが、ファイル名に含められる文字である必要がある。

*4:dvipdfmx の場合は CMap 指定も使えるようであるが……。

*5:ttf2tfm の場合、結果的に空になってしまう TFM は生成されない。例えば mplus1p-r-ub0 に対応する範囲 U+B000〜U+B0FF は全てハングルであり「M+ 1P」にはどのグリフも存在しない。従って、この TFM は生成されない。

*6:ちなみに、ttf2tfm も処理の一番最後にマップ行らしきものを端末に出力するが、これは ttf2pk の書式のマップ行である。

*7pLaTeX である必要がないことに注意(無論 pLaTeX でも通る)。