マクロツイーター

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

dvipdfmx で OpenType できない件について……

昨日まで 5 回にわたって「OpenType フォントを LaTeX の欧文フォントとして用いて dvipdfmx で PDF 文書に変換する」ための方法を解説した。その際の例として日本語フォントである「M+ 1P」(の欧文のグリフ)を用いたのだが、これは少しまずかったかも知れない。その方法で作成した PDF 文書が正常に閲覧できない環境が存在することが判明した。

  • dvipdfmx(最新の 20110311 版)において「日本語 OpenType フォントとエンコーディングファイル(.enc)の組み合わせ」にマップされた TFM を用いて生成された PDF 文書を「Windows XPVista + Adobe Reader 9」で表示させると、該当の TFM に対する文字が表示されない。

実は、私は 2 年ほど前にこの現象に遭遇していて、その時は IPAex フォントを .enc ファイル と組み合わせる実験をしていて Adobe Reader (多分 8 だったと思う)で表示されず、その原因が解らずに終わってしまっていた。現在私が使っている Windows 7 + Abobe Reader X では正常に表示されるので「実は前に試してダメだった組み合わせを使っている」ことに気付かなかったのである。この現象について少し詳細な説明をしておく。

  • これまで説明した手順は「OpenType と .enc と dvipdfmx の組み合わせ」のためのものとしては正しいと判断している。その理由は以下の項目の事実が成り立つからである。
  • 生成時の環境は無関係で、閲覧時の環境に依存する。つまり、同じ PDF ファイルを別の環境で見ると文字が表示されたりされなかったりする。
  • 先に述べたように「Windows 7 + Adobe Reader X」では正常である。他にも、「Windows XP + Ghostscript 8.57」「Windows XP + SumatraPDF」でも正常である。
  • 私の調べた限りでは、失敗するのは必ず「日本語用フォント」であり、また「日本語用フォント」は(大部分が*1)失敗していた。OpenType フォントで「日本語用」とそれ以外で構造に差があるとは信じられないのだが、ともかく現象としてはそうなっている。
  • 少なくとも「普通の欧文フォント」が対象である場合には、これまでに述べた方法は dvipdfmx (あるいはその前身の dvipdfm)において用いられる正統な方法に従っている。欧文フォントで問題が出たことは一度もないので、その場合に心配する必要はない。
  • 「日本語 OpenType と dvipdfmx の組み合わせ」であっても、エンコーディング指定法が「.enc ファイル」以外である場合−−CMap ファイル、あるいは「unicode」である(サブフォント指定も含む)−−は正常である。この組み合わせは pLaTeX の日本語文書の組版でごく普通に用いられるものである。
  • 表示に失敗する PDF 文書の中身を検証してみたが、PDF の構造には問題がなかった。つまり、元のフォントファイルに由来するバイナリのオブジェクトが中に含まれていて、描画命令列に含まれるフォント識別子は正しくそれを参照している。だからもし誤りが生成側にあったとすると、埋め込まれている(サブセット化された)バイナリのフォントファイルに問題があるということになるが、それ以上は調べきれていない。
  • 上項のような状態なので、「失敗する環境」の Adobe Reader で「文書のプロパティ ― フォント」を見ても、正しく当該のフォントが埋め込まれているという内容になっている。

というわけで、OpenType フォントが「欧文用」である場合はこれまで述べた方法で構わない。では、「日本語用」の OpenType フォントを TeX の欧文フォント(欧文 TFM)として用いたいときにこの異常を回避する手段はあるかというと、大概の場合は、「サブフォント定義ファイル(SFD ファイル)」を用いた方法で代替できる。先に述べたようにこの方法では正常に表示されることが判っている。

これまでに作業を行った「M+ 1P」でこの代替方法を試してみよう。

この中にある次のファイルを配置する。

  • sfd/Mp1PTeXStd.sfd → $LOCAL/fonts/sfd/mplus1p/
  • map/pdfm-mplus1p-u.map → $LOCAL/fonts/map/dvipdfm/mplus1p/

その上で、今まで dvipdfmx.cfg で (pdfm-)mplus1p.map を読んでいたのを新しい pdfm-mplus1p-u.map が読まれるように変更する。mplus1p ファミリを用いた DVI ファイルを dvipdfmx で変換し直すと、以前に正常に表示されなかった環境でも表示される PDF 文書ができるはずである。


興味のある人のために、この 2 つの方法で生成した PDF 文書を入れておいた。これで M+ 1P の文字が表示されるか試してみてほしい。

*1:全てであったかは、2 年前の調査で記録も記憶も残っていないので不明である。