マクロツイーター

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

文書内でフォントマップを指定する命令

DVI ウェアにおいて、TFM と実物の(アウトライン*1)フォントとの対応が記述されるのが「マップファイル」*2である。どのマップファイルを読み込むかは、基本的には各ソフトウェアの設定ファイル*3において指示するが、それとは別に「起動時に」マップファイルを追加で指定できるものもある。例えば、dvipdfmx であれば「-f foo.map」、dvips であれば「-u foo.map」で foo.map が追加で読み込まれる。

pdfTeX でも「起動時」にマップファイルを指定する仕組みがある。といっても、pdfTeX はそもそも TeX 文書から直接 PDF 文書に変換するものなので、「起動時の設定の記述」は TeX 文書中に書くことになる。((dvips や dvipdfmx の「起動時オプション」による設定に相当するものは、pdfTeX では「TeX の(拡張)プリミティブ」になっていることが多い。例えば、出力する PDF のバージョンを 1.5 にしたい場合、dvipdfmx では起動時に「-V 5」と指定するが、pdfTeX では TeX 文書で「\pdfminorversion=5」を実行することになる。))すなわち、TeX 文書において「\pdfmapfile[foo,map}」という命令を実行することでマップファイルの読込を指示できる。また、\pdfmapline というマップ行を直接書くための命令も用意されている。

文書中でフォントマップの設定ができるのは非常に便利なので、後になって、dvipdfmx でも同様の機能が実装された。これは DVI special 命令によって実現していて、マップファイルを指定するのが pdf:mapfile 命令、マップ行そ指定するのが pdf:mapline 命令である。

この記事ではこれらの「文書中でフォントマップを指定する命令」について解説する。特に、その書式の中の「修飾子」がの働きが把握しにくく間違いやすいのでこれを中心に扱う。*4「マップ行」の書式については扱わない。

pdfTeX の \pdfmapfile/\pdfmapline プリミティブ
  • \pdfmapfile{<修飾子><マップファイル名>} : [命令] その場でマップファイルを読み、そこに書かれた各マップ行に基づいてフォントマップを置換/追加/削除する。
  • \pdfmapline{<修飾子><マップ行>} : [命令] 当該のマップ行の記述に基づいてフォントマップを置換/追加/削除する。
  • <修飾子>=+-、無しの何れか。

修飾子による動作の違いを、\pdfmapline について述べると以下のようになる。((\pdfmapfile については、ファイル中の全ての行に同じ修飾子が付されていると考えればよい。))

  • 修飾子が「有る」場合: まず pdftex.map(既定のマップファイル*5)がまだ読まれていない*6ならばそれを読み込む。その後、当該のマップ行を処理する。
    • 修飾子が「=」(置換): 当該の TFM に対するマップが既に存在するか否かに関わらず、マップを指定されたものに設定する。
    • 修飾子が「+」(追加): 当該の TFM に対するマップが存在しないならばマップを指定されたものに設定する。存在するならば無視する(警告が出る)。
    • 修飾子が「-」(削除): 当該の TFM に対するマップが存在するならばそれを削除する。(つまり命令のマップ行の記述は無関係。)
  • 修飾子が「無い」場合: pdftex.map(既定のマップファイル)の読込を放棄する。((pdftex.map の読込のタイミングは以下のようになる。「\pdfmapfile\pdfmapline の実行」「マップ情報への参照」の何れかが最初に起こったときに行われる。ただしそれが「修飾子なしの \pdfmap〜」だった場合は結局読み込まれない。))その後、当該のマップ行を「追加」(つまり修飾子 + と同じ動作)する。
dvipdfmx の pdf:mapfile/pdf:mapline special 命令

DVI special なので、\AtBeginDvi{\special{pdf:mapfile foo.map}} のように用いられるのが通例である。

  • pdf:mapfile <修飾子><マップファイル名> : その場でマップファイルを読み、そこに書かれた各マップ行に基づいてフォントマップを置換/追加/削除する。
  • pdf:mapline <修飾子><マップ行> : 当該のマップ行の記述に基づいてフォントマップを置換/追加/削除する。
  • <修飾子>+-、無しの何れか。(= は存在せず、「無し」が「置換」を意味する。)

dvipdfmx では、「既定のマップファイルの読込の放棄」という概念は存在しない。設定ファイルや起動時オプションで指定されたマップファイル*7は常に読み込まれる。修飾子の意味は次の通り。

  • 修飾子が無い(置換): pdfTeX の「置換」と同じ。
  • 修飾子が「+」(追加): pdfTeX の「追加」と同じだが、警告は出ない。
  • 修飾子が「-」(削除): pdfTeX の「削除」と同じ。
要するに

ほとんどの場合、意図している動作は「置換」であろう。マップファイルを「置換」で読み込む場合、以下のようにすればよい。

  • pdfTeX の場合:
    \pdfmapfile{=foo.map} % 修飾子は「=」
    
  • dvipdfmx の場合:
    \AtBeginDvi{\special{pdf:mapfile foo.map}} % 修飾子は無し
    

*1:大抵の DVI ウェアは、自身のマップ中に対応するフォントが見つからない場合は、mktexpk を実行して PK ファイルを使用する。

*2:DVI ウェアによって書式に違いがあるが、(標準の)ファイル拡張子はどれも .map である。

*3:dvips では config.ps、dvipdfmx では dvipdfmx.cfg というファイル。

*4:この命令を使うときに、私はいつでも修飾子で迷っている。ところで、dvipdfmx のフォントマップ命令の「修飾子」の説明ってどこかにあるのですかね? 私は見つけられなかったので、プログラムソースと実験で把握した。

*5:この「既定値」は固定されていて設定ファイル等で変更することはできない。

*6:かつ「放棄」もされていない。

*7:ちなみに、これらは「置換」として読み込まれる。すなわち、同じ TFM がある場合は後のものが有効になる。