Hatena::ブログ(Diary)

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

2011-09-19

updmap はなぜ動くのか (1)

BXattiritta パッケージについて、「普通に updmap を使えばよい」と書いた。恐らくは、これだけではほとんどの人は何をすればよいか解らないだろうし、設定手順を知っている人でも、そもそも updmap が何をするものなのかを理解している人はそう多くないだろう。ここでは BXattritta を題材にして、updmap の話をしようとする。ただし、例の資料を読んでいることを前提とする。

パッケージのファイル構成と配置場所

まずは、updmap を使うことが前提とされる場合の、パッケージのファイル構成および各ファイルの適切な置き場所について確認してみる。

BXattiritta の実質的な中身は以下の通りである。(METAFONT ソース *.mf は実際には全く使われないので無視する。)

  1. attr-r-{ot1,t1,ts1}.tfm
  2. attr-r-{ot1,t1,ts1}.pfb
  3. bxattritta.sty
  4. ts1attritta.fd
  5. bxattritta.map

3 は拡張子が .sty だから LaTeX のパッケージファイルである(\usepackage{bxattritta} で読み込まれる)。4 は以前の記事で触れられていた「フォント定義ファイル」である。*1つまり、この 2 つは LaTeX 用のファイルだから、TeX レベルでのフォント定義(DVI ウェアの設定)には直接関係しない。パッケージ名が BXattritta だから、

に置けばよいであろう。

TeX レベルでのフォント定義に相当するのは、例の資料によると TFM ファイルのはずである。ここでは 1 に挙げる 3 つがある。ファイル名*2から判断すると「例のフォント」を OT1、T1、TS1 の各エンコーディングで用いるためのものであろう。*3全く同じベース名の Type1 フォント(2 に挙げたもの)があるので、これらの TFM はそれぞれ別の実フォント(物理フォント)を参照していることが予想される。*4これらの置き場所は、例の資料によると*5

  • *.tfm → $LOCAL/fonts/tfm/public/BXattritta
  • *.pfb → $LOCAL/fonts/type1/public/BXattritta
ということになる。 残りの 5 の bxattritta.map であるが、拡張子が .map だから、「何らかの」マップファイルであることは解る。少し中を見てみよう。
attr-r-ot1  CMAttritta-Regular    <attr-r-ot1.pfb
attr-r-t1   CMAttrittaT1-Regular  <attr-r-t1.pfb
attr-r-ts1  CMAttrittaTS1-Regular <attr-r-ts1.pfb

updmap を使うという話なので、これは「updmap 用」のマップファイルということなのだが、実は updmap 用の形式は dvips 用の形式(のサブセット)になっている。残念ながら例の文書は dvips のフォントの取扱には直接触れていない*6が、そこで述べられているレンダラ―の 1 つの gsftopk は dvips 用の設定を借用している。すなわち、例の文書で「gsftopk 用」と言っているのが実は dvips 用でかつ updmap 用のマップファイルなのである。(付録 G の eggtoothcroc.map と上の内容を比べると何となく似ていることが解るだろう。*7)従って、例の資料に従うなら

  • *.map → $LOCAL/fonts/map/dvips/public

に置くことになろう。ただし、私自身は $LOCAL/fonts/map/dvips/BXattritta(末尾ディレクトリをパッケージ名にする)を推奨する。

これで全てのファイルの配置が完了した。ここでの重要事項をまとめる。

  • updmap でのフォントインストールで用いられるのは、Type1 フォント(*.pfb)と TFM ファイル(*.tfm)とマップファイル(*.map)である。
  • updmap 用のマップファイルは dvips 用(gsftopk 用)のマップファイルである。
  • 従って、配置場所は $LOCAL/fonts/map/dvips 以下になる。

もちろん、このままでは bxattritta.map はどのソフトウェアにも読み込まれないのでフォントインストールしたことにはなっていない。

updmap の実行手順

updmap の実行の手順そのものは非常に簡単である。W32TeX では以下のコマンドを実行するだけである。

updmap --add bxattritta.map

これで、dviout、dvips、dvipdfmx、pdftex の全てで attritta-r-ot1 等のフォントを使った TeX 文書が正常に出力されるようになる。このように、複数の DVI ウェアに対して Type1 フォントのマップの設定を一度に行うことこそが updmap の目的なのである。

UNIX 系の TeX ディストリビューション(その多くは TeX Live に基づく)では、典型的には updmap に「個人用」と「システム(全ユーザ)用」の 2 種類あり別のコマンドになっている。*8書式は次のようになる。

updmap --enable Map bxattritta.map
#(コマンド名「updmap」は正しいものに置き換えること)

ここからは、updmap がなぜ必要なのか、どうやって動いているのかの解説になる。この話の主眼は「updmap を実行するための方法」ではないので、構造が単純な W32TeX の updmap を念頭におくことにする。TeX Live 系の updmap は仕様自体は大きく異なるが、動作原理という点では W32TeX のものと変わらない。

なぜ updmap を使うのか

「updmap の恩恵」は、それがなかった時(実際に昔はなかった)の状況を想像すれば容易に理解できる。dvips、dvipdfmx、pdfTeX は Type1 フォントを直接扱える(PostscriptPDF 文書に埋め込める)が、それぞれ別のマップファイルを持っていて、また書式が異なる。*9dviout では、Type1 は gsftopk か ps2pk で PK フォントに変換することになるが、この 2 つもまた個別のマップファイルを持っている。*10ゆえに、全部のソフトウェアDVI ウェアとレンダラ)に対応しようとすると 1 つの設定をあちこちのマップファイルに記述する必要があり、大変な労力になることは明らかである。無論、あるユーザが常用するソフトウェアの数はそれほど多くないので、必ずしもそれだけの労力になるとは限らないが、実は、実際に「大量のマップファイル地獄」の被害を受ける人が確実に存在する。それはフォントパッケージの開発者(つまり「BXattritta パッケージ」とかを作っている人)である。折角パッケージを作るのだから、なるべく多くのソフトウェアに対応したいと思うのが開発者の常であり、また適当なマップファイルを書けばそれが可能であることは判っているのであるが、実際に対応しようとすると、大量のマップファイルを用意した上で、もっと大量の「インストール手順書」をドキュメントに書き連ねる必要に迫られるのである。*11

(続く)

*1:TS1/attritta の定義ファイルだけあって、T1 や OT1 のものがないのを不審に思うかも知れないが、これに相当するものは bxattritta.sty の中に書かれている。

*2:これらは「Berry 命名法」ではなく「ZR 命名法(謎)」に基づいている。

*3:「TS1 なんて初めて聞いた」という人は「texdoc encguide」をやってみよう。

*4:勿論それが正解なのだが、必然性はないことに注意。

*5:「例の資料」で示されているのは、TDS に従った配置、すなわち「TeX での常識的な配置方法」である。

*6:付録 I で dvips + Type1 フォントの設定例があるが、この文書があくまで dviout 用の「ビットマップPK フォント)に変換する」という方式を前提にしているため、dvips で通常行われる「アウトラインフォントを埋め込むための設定」にはなっていない。(つまりこの方法だと埋込がビットマップになってしまう。)

*7:ただしこのマップ指定は「再エンコード」を行わない、つまり「Type1 フォントが保持している既定のエンコーディングをそのまま用いる」という点が異なる。だから、「〜 ReEncodeFont」の指令や .enc ファイルの指定が存在しないのである。

*8:後者は updmap-sys というコマンド名で、管理者権限を要求されることが多い。なお、OS のパッケージ管理システムから入れた場合は、結局ファイルの配置などはシステム毎に大きく異なることになると思われる。

*9:Type1 の場合、pdfTeX は dvips と同じだが、dvipdfmx は異なる。

*10:例の文書で挙げられている「下位レンダラ」のうち、ttf2pk は Type1 には適用されない。hbf2gf は私も知らないので無視。gsftopk は dvips と設定を共有できる。ps2pk は別書式のマップファイルをもつ。

*11:実際に全てをサポートする必要に迫られる立場という点では、TeX ディストリビューションのメンテナも同じである。