Hatena::ブログ(Diary)

アセトアミノフェンの気ままな日常

2015-10-07

LuaTeX でなぜか使えない TTC/OTC フォントを無理やり埋め込む実験

昨日述べたとおり、現在 TeX Live 2015 や W32TeX の最新版をもってしても一部のフォントが埋め込めない状況にある。この理由はどうやら LuaTeX 本体というよりはむしろフォントを読み込むユーティリティである luaotfload にあるらしいことが指摘されている。あまり他所で説明されていないので、LuaTeX のフォントの取り扱いについて本件に関わる部分のみ簡単に説明しておきたい。具体的にはどうやらフォントのキャッシュ作成時の問題らしい。以下、いかにも元々分かっていたかのように書いているが、今回の問題を調査するために改めて LuaTeX のフォント周りの挙動を調べただけであるので、もしかしたら誤りがあるかもしれないので注意されたい。

LuaTeX のタイプセット時の“フォントキャッシュ”

LuaTeX によるタイプセットでは、fontloader とよばれるライブラリが TEXMF ツリーやシステムからフォントを見出してキャッシュのようなものを作る。具体的には、OpenType フォントや TrueType フォントを読み込んだ場合に

  • TeX Live (win32) → C:\texlive\2015\texmf-var\luatex-cache\generic\fonts\otf
  • W32TeX → C:\w32tex\share\ctxdir\luatex-cache\generic\fonts\otf

に「フォント名.lua」というファイルを作成し、ここに fullname や psname などの必要な情報を書き込むようである(ほかの OS でも同様)。さらに、これはすぐに“コンパイル”されて「フォント名.luc」というバイナリが出来上がる。これが実際の組版に利用され、最終的な PDF 出力時に重要な役割を果たしているようである。

fontloader は lua コードで書かれており、頑張ってフォントの中身を読もうとする。たとえば IPAex 明朝 (ipaexm.ttf) を fontloader が読み込んだ場合、キャッシュの ipaexm.lua の膨大な記載の中には

  ["familyname"]="IPAexMincho",
  ["fontname"]="IPAexMincho",
  ["fontstyle_id"]=0,
  ["fullname"]="IPAexMincho",

などという情報がみえる。この lua ファイルがコンパイルされて luc ファイルになるのであるが、組版時には

  • luc が既に存在 → 何もせず luc をそのまま読む
  • luc が存在せず lua だけ存在 → lua をコンパイルして luc を生成
  • luc も lua も存在しない → まず lua を作ってそれをコンパイルして luc を生成

という処理が行われるようだ。単独フォントの .otf や .ttf であれば「フォント名.lua」になるが、Collection フォントであれば「フォント名-0.lua」のようにインデックス番号が付くか単に「フォント名.lua」(これは0番と等価)になるようである*1

では、フォントキャッシュ生成に失敗した場合は?

ところが、時にフォント内部に書かれているはずのフォント名を認識できないことがある。これが先の simsun.ttc をはじめとする Windows の TrueType Collection フォントで起きた現象で、この場合はフォールバックとして以下のようになる。

  ["familyname"]="SimSun",
  ["fontname"]="bad-fontname-simsun",
  ["fontstyle_id"]=0,
  ["fullname"]="bad-fullname-simsun",

これがコンパイルされても bad-fontname-simsun という名前のフォントは存在しないため LuaTeX がエラーを吐いて終了してしまうわけである。

しかし、ここで lua → luc のコンパイル規則を思い出そう。「luc があればそのまま読む」「luc がなければ lua から生成」…そう、1回目のタイプセットでいったん Invalid TTC index number で LuaTeX が落ちた後で残っているキャッシュを弄ってしまえばよいのである。具体的には

  1. まず luc ファイルを削除
  2. 次に lua ファイルを開いて「bad ナントカ」と書かれた fontname と fullname をそれっぽく修正して上書き保存
  ["familyname"]="SimSun",
  ["fontname"]="SimSun",
  ["fontstyle_id"]=0,
  ["fullname"]="SimSun",

とすればよい。こうすれば、2回目のタイプセットでは正しく記述された lua がコンパイルされたことになり、見事 simsun.ttc のようなフォントでも PDF 出力に成功する。

Windows TrueType Collection フォントのほうは開発版 luaotfload を入手すれば問題ないわけであるが、この方法は OS X El Capitan の新しい OTC にも有効であることがわかっている(実際にやっていただいた例)。ヒントとなったのは中国のフォーラムでの質問だが、具体的な解決策まで至っていなかった。本記事がなにかの参考になれば嬉しい。

なお、ちょうどいま日本の TeX 開発コミュニティで kmaeda さんが作成した luaotfload へのパッチがテスト中であり、doraTeX さんによれば El Capitan のフォントを正常に LuaTeX で取り扱えるようになったそうだ。



追記 (2015-10-08):この kmaeda さんによるパッチが LuaTeX 開発のメーリングリストに送られた(こちら)。luaotfload 開発側の対応に期待したい。→続報

追記 (2015-10-08):ここまでの一連の速報が doraTeX さんによりまとめられた

*1:正確には、TeX 文書中で simsun.ttc のようにファイル名からフォント指定すると simsun.lua というキャッシュができ、SimSun のように PostScript Name からフォント指定すると simsun-0.lua というキャッシュができるように見える。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

Connection: close