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:maplineとpdf: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では文字化けになってしまう。
- 一見、CMapを無視して独自で「JIS→Unicode」で変換しているように思えるが、実際はそうではなく、
まとめ
だめだ dvisvgmのフォントマップ処理 なにもわからない😭#TeX
— 某ZR(ざんねん🙃) (@zr_tex8r) 2026年5月23日