マクロツイーター

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

dvisvgmのフォントマップ指定がよくわからない件

dvisvgmの「文書中のspecial命令によるフォントマップ指定」の機能がよくわからないので、チョット調べてみた。

公式ドキュメントの説明では

公式ドキュメントdvisvgm.man1.pdfには次のように書かれている。

pdf:mapfile and pdf:mapline allow for modifying the font map tree while processing the DVI file. They are used by CTeX, for example. dvisvgm supports both, the dvips and dvipdfm font map format.

  • dvisvgmはdvipdfmxのpdf:maplinepdf:mapfileのspecial命令をサポートする。
    • dvipdfmxと同様に、dvipsとdvipdfmの両方のマップ行形式をサポートする。

実際の動作では

  • マップ行の修飾子(+-)はサポートしていない
    • 例えば「+foo …」というマップ行を書くと「+fooというTFMに対するマップ指定」と見なされる。
  • 既に行われたマップ指定を変更する操作はサポートしていない😢😢😢
    • 「修飾子無し」のマップ行はdvipdfmxでは「古い設定を置換」になるはずだが、実際には無視されてしまう。
  • dvipdfmx形式のマップ行の-lオプションはサポートしていない
    • pdf:mapline: invalid option: -l」という警告が出る。

和文フォントに対する動作は

dvisvgmはdvipdfmxの和文用のマップ行指定(第2項にCMapを指定する)に対応しているようだ。

dvipdfmxで有効な設定パターンを用いて出力がどうなるかを試してみると以下のようになった。

※「TTF」は「2004JIS字形が既定であるTrueTypeグリフのフォント」、「CFF」は「CFFグリフのフォント」を物理フォント(第3項)に指定した場合を指す1。欄中の「2000JIS」は「2000JIS字形で正常に文字が出力された」ことを表す。
※「TTF」ではCIDでのグリフアクセスができないので、必ず既定のグリフ(つまり2004JIS字形)が使われるのが正しい動作である。

[pTeX・JIS系の和文TFM使用時]

Cmap指定 TTF CFF
H ⭕2004JIS ⚠️2004JIS
2004-H ⭕2004JIS ⭕2004JIS

[upTeX・Unicode系の和文TFM使用時]

Cmap指定 TTF CFF
UniJIS-UTF16-H ❌文字化け ⭕2000JIS
UniJIS2004-UTF16-H ❌文字化け ⭕2004JIS
unicode ⭕2004JIS ⭕2004JIS
  • HとCFF」の組み合わせで2004JISになるのが不可解である🤔
    • 一見、CMapを無視して独自で「JIS→Unicode」で変換しているように思えるが、実際はそうではなく、HのCMapファイルの内容は正しく解釈されているようだ2
    • dvipdfmxではTTFの場合(CIDアクセス不可)に「CMapでCIDに変換した後、ToUnicodeマップ(Adobe-Japan1-UCS2)でさらにUnicodeに変換する」という処理が行われるが、dvisvgmはこれをCIDアクセス可能なCFFの時にも適用しているように思える。
    • 元がUnicodeである場合はこれと正反対で、TTFとCFFのどちらの場合も「さらにUnicodeに変換」を適用していないと思われる。このため、CFFでは正しい字形が選ばれるが、TTFでは文字化けになってしまう。

まとめ


  1. 具体的に使用したのは「TTF」が「IPA明朝」(ipam.ttf)、「CFF」が「原ノ味明朝 Bold」(HaranoAjiMincho-Bold.otf)。
  2. 「CMapファイルの内容をわざと改変する」等の方法で確認した。