Hatena::ブログ(Diary)

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

2011-09-20

updmap はなぜ動くのか (2)

前回の続き)

設定ファイルとマップファイルの関係

updmap の動作原理を見る前に、各ソフトウェアについて、マップファイルがどのように読み込まれているかを調べる。ここでは例として dvipdfmx を用いる。

dvipdfmx が和文フォントの設定に「cid-x.map」というファイルを用いていることはよく知られている。すなわち、$TMF/fonts/map/dvipdfmx/base/cid-x.map というファイルを dvipdfmx は読み込んでいるのであるが、これは dvipdfmx で最初から規定された動作ではない。それは dvipdfmx の設定ファイル $TMF/dvipdfmx/config/dvipdfmx.cfg を見ればわかる。

[dvipdfmx.cfg; 末尾]
%%
%% Font map files
%%
f psbase14.map
%f dlbase14.map
%f embase14.map
%f kbbase14.map
%f pdfmomegaj.map
% w32tex
f pdfmfnt.map
%
f cid-x.map

つまり、設定ファイルにおいて cid-x.map の読込が指示されているのである。*1dvips も同様の「設定ファイルでマップファイルを指定する」構造になっている。ただこれに対して、「単一の固定のマップファイルを常に読み込む」ソフトウェアもあり、例えば ttf2pk がそうであり、pdfTeX も(事実上)そうである。

updmap は「設定ファイルでマップファイルを指定する」方式をとる。設定ファイルは $TMF/web2c/updmap.cfg である。

[updmap.cfg; 末尾]
# cm, amsfonts, latin modern and fpl (Do not erase the next lines).
Map cm.map
Map cmextra.map
Map cyrillic.map
Map euler.map
Map latxfont.map
Map symbols.map
Map bakoma-part.map
Map lm.map
Map fpls.map
#
Map bxattritta.map

ここで、最後の行は、先ほど「updmap --add bxattritta.map」を実行したこどで追加されたものである(既定のものにはない)。つまり、updmap の --add オプションはこの設定ファイルを自動更新するためのものである。

updmap の動作原理

updmap の組み込んだシステムでも、各 DVI ウェアの動作自体は何も変わらないので、updmap.cfg 自体を dvipdfmx 等が見ている訳ではない。それではどうやって updmap は各ソフトウェアの設定を変えているのか。答えは簡単で、各ソフトウェアの設定ファイルによって読み込むことが決まっているマップファイルの内容を書き換えているのである。例えば、dvipdfmx の場合、前掲の dvipdfmx.cfg に記述されているマップファイル $TMF/fonts/map/dvipdfm/updmap/pdfmfnt.map*2が書き換えられる。事実、このファイルの末尾は以下のようになっている。

[pdfmfnt.map; 末尾]
attr-r-ot1 default attr-r-ot1
attr-r-t1 default attr-r-t1
attr-r-ts1 default attr-r-ts1

これは、前回示した bxattritta.map の内容を dvipdfmx のマップファイルの書式に書き直したものである。もちろんこの変換は updmap が自動で行っている。

W32TeX の updmap は以下に挙げるファイルを更新する。

  • $TMF/fonts/map/dvips/updmap/dvipsfnt.map: dvips 用のマップファイル。追加設定ファイル $TMF/dvips/config/config.bi 等で参照される。*3また gsftopk でも使われる($TMF/dvips/config/config.gsftopk で参照)。
  • $TMF/fonts/map/dvipdfm/updmap/pdfmfnt.map: dvipdfmx 用のマップファイル。設定ファイル $TMF/dvipdfmx/config/dvipdfmx.cfg で参照される。
  • $TMF/fonts/map/pdftex/updmap/pdftex.map: pdfTeX 用のマップファイル。このファイル名は pdfTeX の既定値である。*4
  • $TMF/fonts/map/ps2pk/updmap/pspksupp.map: W32TeX の mktexpk が ps2pk を用いて処理するために使うファイルらしい。*5ファイル名は固定。

ひと段落

整理すると、以下のようになる。

  • 単に updmap を実行すると、現状の設定ファイル updmap.cfg に書かれたマップファイルを全て読み込んで、そこにある全てのエントリについて、それぞれに適した書式に変換した上で、上述の出力対象マップファイルを更新する。*6
  • updmap --add foo.map を実行すると、updmap.cfg の末尾に「Map foo.map」を追記した後、上項の動作を行う。

updmap したいとき

既存のパッケージのインストールで updmap の使用が指定されている場合はそれに従うだけであるが、そうでない場合、例えば、古いフォントパッケージで説明文書で dvips での直接指定が述べられていた、あるいは自分で TFM を用意した等の場合でも、以下の条件を満たせば updmap を利用して複数のマップ設定を一度に済ませることが可能である。

  • 欧文フォントである、すなわち TFM が 8 ビット欧文のものである(Omega の ΩFM や和文 TFM でない)。
  • フォントが Type1 バイナリ形式(*.pfb)である。
  • マップの付加設定(リエンコード等)を含めて、dvips のマップのエントリとして表現できる。

この場合、dvips 用のマップファイルが用意できる(或いは既にされている)はずであるから、それをそのまま updmap のマップファイルとして用いる(つまり updmap --add引数に入れて実行する)だけでよい。逆に言うと、以上の条件を満たさない場合、例えば「和文 TFM である」「TrueType/OpenType 形式の実フォントである」という場合は updmap は使えず、各ソフトウェアについて個別に設定する必要があるということになる。*7

補足事項

  • W32TeX では ls-R を使う運用(mktexlsr 派)と使わない運用(deltexlsr 派)の両方が可能であるが、updmap どちらでも(正しく運用されている限りは)問題なく使用できる。
  • 上で述べた updmap が書き換え対象とするマップファイルについては、(updmap が絶対に使われないという前提が成立しない限りは)手動で書き換えてはいけない。*8
  • ちなみに、UnicodeTeX の場合でも、8 ビット TeX と同じ方法(TFM 経由)で定義されたフォントについては updmap で行った設定が有効である。具体的には、XeTeX は dvipdfmx の設定、LuaTeX は pdfTeX の設定を参照する。

*1:ついでに言うと、和文と欧文で別のマップファイルを使う必然性もない。仮に cid-x.map に欧文のマップを記述しても正常に動作する。

*2W32TeX の既定では $TMF(つまり $TEXMFMAIN)であるが、もし $TEXMFVAR が設定されている場合はそちらの TEXMF ツリーが使われる。このことは後掲の他の「書き換え対象のマップファイル」についても同様。

*3:つまり dvips -Pbi で起動した場合に参照される。W32TeX の dvips は -Pbi-Ppdf 等を指定しないとアウトラインでの埋込にならないことに注意。

*4:つまり、pdfTeX は既定では pdftex.map のみを読み込むと決められている。TeX 文書内で \pdfmapfile 命令を実行することで、マップファイルの変更や追加が可能になるのであるが、文書に関わりなく適用される「既定」を変えることはできないと思われる。

*5:だから TeX Live にはこれに相当するものはないはず。

*6:実は、実際の動作はもう少し複雑である。これについては後日説明したい。

*7:ただし、ptexlive の updmap では本家の TeX Live に対する拡張として、「和文 TFM + TrueType/OpenType」の組み合わせに対して dvips/dvipdfmx の一括設定を行うという機能がある。

*8:マップを書き換えたい時にどのファイルを使えばよいかについては後日改めて述べたい。