Hatena::ブログ(Diary)

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

2011-10-12

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

(前回の続き)

DVI ウェア/レンダラ毎のマップ行の書き方

いずれの場合も、TFM 名の中で SFD の名前を〈@〉で囲って入れるという点は共通である。だから、この形の文字列を「サブフォントで定義されたフォントの名前」とみなして、例えば「このパッケージではフォント mplus1ps-r-@Samp0TeXStd@ を使用する」のような言い方がよく行われる。

マップ行を「どこに」書くかという話は、「エンコーディング定義方法」には依存しない、つまり .enc ファイル使用の場合と同じである。

(以後、「TyueType フォント」で「TrueType グリフの OpenType フォント」、「OpenType/CFF フォント」で「CFF グリフの OpenType フォント」を表すものとする。)

・dvipdfmx の場合

既に説明した通りであるが、もう一度挙げておこう。

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

・pdfTeX の場合

次のような書式になる。.enc を使わないのでその記述がない。*1

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

ただし、pdfTeX の場合、特に注意すべき制限事項がいくつかある。

  • TFM 名中の SFD 識別子の部分は最後になければならない。例えば、foobar@Unicode@ は可能だが foo@Unicode@bar は不可。
  • SFD ファイルのパーザに少し難があり、「1 行は 256 文字まで」「<整数:> の直後では \(継続行指定)が使えない」という制限がある。
  • フォントファイルはサブセット埋込(<....ttf)である必要があり全体埋込(<<....ttf)では正常に出力されない。だから現状サブセット埋込に対応していない OpenType/CFF フォントでは SFD ファイルでの指定はできない

上手くいかない場合は、マップファイル指定だけ .enc ファイルで代用するという手段がある。*2すなわち、最初の回で紹介した gen-u4e.enc のような .enc ファイルを 256 個作って、それらをそのままマップ行を実際に 256 行書くということである。pdfTeX では /uni???? の名前で Unicode 符号位置でのグリフの指定ができるようになっている。だから、この gen-u4e.enc のようなファイルは .enc ファイルでありながらフォントに依存しないので、SFD ファイルと全く同等の役割を果たせるのである。*3

・ttf2pk の場合

ttf2pk については「例の資料」を参照してほしい。要するに、TrueType フォントについて ttf2pk での設定を行うと、「自前では TrueType フォントに対応しないが PK フォントは対応する」ような DVI ウェアで、そのフォントビットマップの形で取り扱えるようになる。dvipng や dviout のような出力自体がビットマップであるソフトウェアで特に有用である。(OpenType/CFF フォントには非対応。)

SFD ファイル利用時のマップ行の書式は以下の通り。.enc ファイル利用時にあった「Encoding=xxx.enc」がなくなる。

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

ちなみに、ttf2tfm は ttf2pk に付属する TFM 生成器なので、ttf2tfm が処理の最後に出力する「マップ行のようなもの」は ttf2pk のマップ行である。

dviout の場合

dvioutエンコーディングの扱いが独特である。自前の規定の設定が幾つかある代わりに .enc ファイルには対応していない。*4SFD ファイルには対応していて、以下の書式になる。

mplus1ps-r-@Samp0TeXStd@  "M+ 1p regular"  unicode

ただし、当該のフォントWindowsインストールしていることが前提となる(" " の中はフォント名)。フォント(第 2 要素)をファイル名で指定する(dviout 自身のレンダラを用いる)方法を試したら失敗した。

*1:再エンコード指定もなく、字形の合成変形にも対応しない(Type1 フォントのみの対応)ので、「Postscript 命令列」相当部(" " 囲みの文字列)には何も書くものがなくなる。ちなみに、2 盤目の要素(mplus-1p-regular)は Postscript フォント名である。

*2:といっても Samp0TeXStd.sfd でこれを行うと、「普通の .enc でのエンコーディング指定」と同じになってしまうので、この段落の説明は Unicode.sfd 等を用いた「本来の」サブフォント定義を想定してほしい。

*3:もちろんこの性質は pdfTeX に依存する。初回の説明では、gen-u4e を otftotfm で変換した mplus1p-u4e に置き換えるという話をしていて、ここの用法とは異なる。

*4:…と思う。あまり情報がないので私自身がよく解っていない。.enc ファイル自体がそもそも Type1 フォントに適応した(つまり OpenType にはあまり適していない)方法で、なおかつ、dviout は Type1 フォントを直接扱わないというのが理由だと思う。