top page > TeX > here

TeX のフォントについて


概要

対象は次のようなものです.

  1. FreeBSD 7.2
  2. TeX 等は,FreeBSD 7.2 の最初の Release に対応する ports/packages

内容は次のようなものです.

  1. TeX がどのようにして dvi ファイルに記述するフォントを決めるか.
  2. dvi ドライバー (xdvi, dvips, ghostscript) がフォントをどう取り扱うか.

目次

1. TeX と dvi ファイル
2. dvi ドライバー
2.1 xdvi
2.2 dvips
2.3 ghostscript
3. 補足
4. 参考資料

1. TeX と dvi ファイル

先ず,次のような TeX の原稿を platex にてコンパイルします.

\documentclass{jarticle}
\begin{document}
日本語と\textbf{その太字}
\ Latin and \textbf{its Bold}
\ $a = \pm b$
\end{document}

この例では,日本語,Latin 文字,および数式中のフォントが使われています. フォントの書体や大きさに関する default の設定と次の書体定義ファイル (.fd) の記述に基づいて,これらのフォントの名称が決まります.

/usr/local/share/texmf/ptex/platex/base/jy1mc.fd, jy1gt.fd
/usr/local/share/texmf-dist/tex/latex/base/ot1cmr.fd
/usr/local/share/texmf-dist/tex/latex/base/omlcmm.fd, omscmsy.fd

例えば,日本語の,太字でない横書き 10 point のフォント名は jy1mc.fd より "min10" になります.

\DeclareFontShape{JY1}{mc}{m}{n}{<5> <6> <7> <8> <9> <10> sgen*min
    <10.95><12><14.4><17.28><20.74><24.88> min10
    <-> min10
    }{}

また,Latin 文字の通常の 10 point のフォント名は ot1cmr.fd より "cmr10" になります.

\DeclareFontShape{OT1}{cmr}{m}{n}%
     {<5><6><7><8><9><10><12>gen*cmr%
      <10.95>cmr10%
      <14.4>cmr12%
      <17.28><20.74><24.88>cmr17}{}

また,数式中の 10 point のフォント名は omlcmm.fd より "cmmi10" になります.

\DeclareFontShape{OML}{cmm}{m}{it}%
     {<5><6><7><8><9>gen*cmmi%
      <10><10.95>cmmi10%
      <12><14.4><17.28><20.74><24.88>cmmi12%
      }{}

書体定義ファイルの記述の枠からはずれた場合,そのフォント名は使われず,名前も実体も標準的なフォントで代用されます.

ここで,\DeclareFontShape のパラメーターの意味は次の通り.

\DeclareFontShape{encode}{family}{series}{shape}
  encode : JY1 は横組み用の JFM,OT1 は文書,OML は数式 Italic,OMS は数学記号
  family : mc は明朝,gt はゴシック,cmr は Roman,cmm は数式 Italic,cmsy は数学記号
  series : m は Medium, bx は Bold Extended
  shape  : n は Normal (Upright), it は Italic

半分しか例示しませんでしたが,このようにして先の TeX の文書で使われているフォントとして日本語の min10, goth10,Latin 文字の cmr10, cmbx10,および数式の cmmi10, cmsy10 の六つの名称が決まります.

この段落で述べることは私の経験的な知識なので,実際にはもっと複雑かもしれません. (また,かなり古い version ではこの記述と異なります.) TeX (platex) はこの後,次のような順序でフォントを処理します.

  1. 同名の JFM (Japanese Font Metric) を探す.
  2. それが無い場合は,同名の TFM (TeX Font Metric) を探す.
  3. それも無い場合は,同名の MetaFont (.mf) を探し,それから metafont により TFM を作る.
    (同時に PK フォント (.pk) も作る.これは dvi ドライバーが使う.)
  4. それも無い場合は,何らかのフォント (たいていは既存の標準的なもの) で代替えする.

なお,JFM も TFM も拡張子は tfm です. 上記の例では,それらは以下のところにあります.

/usr/local/share/texmf/fonts/tfm/ptex/min10.tfm, goth10.tfm
/usr/local/share/texmf-dist/fonts/tfm/public/cm/cmr10.tfm, cmbx10.tfm, cmmi10.tfm, cmsy10.tfm

こうして見つかった JFM, TFM を用いて組版が行なわれ,dvi ファイルが作成されます.

dvi ファイルを (例えば hexdump -Cv にて) dump すると,先述のフォントが記されているのが見て取れます.

000000 : f7 02 01 83 92 c0 1c 3b 00 00 00 00 03 e8 1b 20  | .......;.......
000010 : 54 65 58 20 6f 75 74 70 75 74 20 32 30 30 39 2e  | TeX output 2009.
(中略)
000080 : 00 05 6d 69 6e 31 30 ba 81 46 7c 81 4b 5c 81 38  | ..min10..F|.K\.8
000090 : 6c 81 24 48 f3 15 e9 9f d0 f6 00 0a 00 00 00 0a  | l.$H............
0000a0 : 00 00 00 06 67 6f 74 68 31 30 c0 81 24 3d 81 24  | ....goth10..$=.$
0000b0 : 4e 81 42 40 81 3b 7a 96 03 55 55 f3 07 4b f1 60  | N.B@.;z..UU..K.`
0000c0 : 79 00 0a 00 00 00 0a 00 00 00 05 63 6d 72 31 30  | y..........cmr10
0000d0 : b2 4c 61 74 69 6e 93 61 6e 64 93 f3 1f 1a f2 22  | .Latin.and....."
0000e0 : 56 00 0a 00 00 00 0a 00 00 00 06 63 6d 62 78 31  | V..........cmbx1
0000f0 : 30 ca 69 74 73 91 03 d5 54 42 6f 6c 64 91 06 aa  | 0.its...TBold...
000100 : aa f3 0a 0b a0 62 3e 00 0a 00 00 00 0a 00 00 00  | .....b>.........
000110 : 06 63 6d 6d 69 31 30 b5 61 96 02 c7 18 b2 3d 93  | .cmmi10.a.....=.
000120 : f3 0d 21 22 2c 9a 00 0a 00 00 00 0a 00 00 00 06  | ..!",...........
000130 : 63 6d 73 79 31 30 b8 06 b5 62 8e 8e 9f 1e 00 00  | cmsy10...b......
(後略)

2. dvi ドライバー

xdvipvips は,この dvi ファイルを読んで然るべき出力をする「dvi ドライバー」と呼ばれるプログラムです. (ghostscript は直接 dvi ファイルを扱いませんが,dvi ドライバーに分類されます.) これらが上に示したように dvi ファイルの中に規定されたフォントで文字を出力します. しかし,そのフォントの出力の制御の仕方はドライバーにより異なるので,各々のドライバーの流儀を知っておく必要があります.

ここではフォントを規定するデータがどのように繋がっているかを示します. 具体的なフォントの設定法や,所在を示していないファイルの在処は dvi ドライバーとフォント に記します.

2.1  xdvi

現在の xdvi のフォントは,次のような優先順位で探されます.

  1. 同名の Virtual フォント (.vf) を探す.
  2. それが無い場合は,同名の Type1 フォント (.pfb) を探し,あればそれを使う.
  3. それも無い場合は,同名の PK フォント (.pk) を探し,あればそれを使う.
  4. それも無い場合は,同名の GF フォント (.gf) を探し,あればそれを使う.

先に述べた TeX (platex) の動作に鑑みれば,必ず 1, 2, 3 のどれかに該当するはずです. 先の dvi ファイルを例にとれば,

goth10, min10 :

  1. Virtual フォントが見つかる.
    /usr/local/share/texmf/fonts/vf/ptex/goth10.vf, min10.vf
  2. (Virtual フォントが見つかったので探しに行きませんが,対応する Type1 フォントはありません.)

cmr10, cmbx10, cmmi10, cmsy10 :

  1. Virtual フォントは見つからない.(存在しない.)
  2. Type1 フォントが見つかる.
    /usr/local/share/texmf-dist/fonts/type1/bluesky/cm/cmr10.pfb, cmbx10.pfb, cmmi10.pfb, cmsy10.pfb

Type1 フォントはグリフ (文字の形状) の情報を持っているので,表示することができます. しかし,Virtual フォントの方はその情報を持っていません.

Virtual フォントからどう結び付くのか解らないのですが,日本語のフォントは /usr/local/share/texmf/xdvi/ptex/vfontmap にて,以下のようにグリフの情報を持つフォントのファイル名を指示しています.

/usr/local/lib/X11/fonts/TrueType/ipam.ttf
        min
(中略)
/usr/local/lib/X11/fonts/TrueType/ipag.ttf
        goth

これは point である 10 を無視した min, gothipam.ttf, ipag.ttf を結び付けていると解釈して良いのか,それとも min, goth にはさらに別の意味があるのか,分かりません.

2.2  dvips

dvips も Virtual, Type1, PK とフォントを探すのですが,重要な差異が二つあります. すなわち,

(1) 日本語の取り扱いがより複雑です.

先ず同名の Virtual フォントを探します. dvips と同様に,これは見つかります.

その中身を dump してみます. min10.vf の冒頭は次のようになっています.

000000 : f7 ca 00 00 00 00 00 00 a0 00 00 f3 01 00 00 00  | ................
000010 : 00 00 0f 65 3d 00 a0 00 00 00 03 72 6d 6c f2 00  | ...e=......rml..

また,goth10.vf の冒頭は次のようになっています.

000000 : f7 ca 00 00 00 00 00 00 a0 00 00 f3 01 00 00 00  | ................
000010 : 00 00 0f 65 3d 00 a0 00 00 00 03 67 62 6d f2 00  | ...e=......gbm..

次に,ここに記された "rml", "gbm" と同名の JFM を探します. ただし,「platex で使用する JFM」と「dvips で使用する JFM」とは区別されているようで,

/usr/local/share/texmf/fonts/tfm/ptex/gbm10.tfm, rml10.tfm

でなく

/usr/local/share/texmf/fonts/tfm/ptex/dvips/gbm10.tfm, rml10.tfm

の方が優先して探されるようです.(ちなみに,FreeBSD 4.9 では後者は存在しません.)

いずれにしても,ここでフォント名が "min", "goth" から "rml", "gbm" に切り換わります.

(2) dvipsmap file の記述に従ってフォントを取り扱います.(ここでは config.ps の役割には触れません.)

  1. VF は再びフォント名が切り換わります.
  2. Type1 は,それが存在しかつ map ファイルが正しければ,それに記された pfb file と対応付けられます.
    (xdvi のように,存在しさえすれば自動的に使われるわけではありません.)
  3. そうでなければ,PK に基づく Bitmap になります.対応する PK がなければ自動的に作成されます.

先の dvi ファイルを例にとれば,先ず VF は /usr/local/share/texmf/fonts/map/ptex/dvips/psfonts_jp.map にてフォント名が切り換えられています.

rml         Ryumin-Light-H      ← tfm の名前   ps での名前
gbm         GothicBBB-Medium-H

次いで,Type1 は /usr/local/share/texmf-var/fonts/map/ptex/dvips/updmap/psfonts.map にて,次のように pfb file と対応付けられます.

cmr10 CMR10 <cmr10.pfb          ← dvi での名前   pfb, ps での名前   <pfb ファイル名
cmbx10 CMBX10 <cmbx10.pfb
cmmi10 CMMI10 <cmmi10.pfb
cmsy10 CMSY10 <cmsy10.pfb

なお,この例においては,PK は使われません.

pfb, ps での名前」は既に pfb ファイルの中に記されており,任意に与えることはできません. しかし,ここが正しく指定されていないと,Type1 フォントの指定に失敗します. (変更不能なのだから,これはここに記さないようにして自動的に処理して欲しいものです.) その場合,「該当する Type1 フォントが存在しない」のと同じ扱いになり,PK フォントの利用が試みられます.
なお,pfb ファイルの中身の dump は FontForge の使用例 に示してあります.

こうして dvips が作成した ps ファイルの中で,フォントの名前は次のように記載されています.

%%DocumentFonts: Ryumin-Light-H GothicBBB-Medium-H CMR10 CMBX10 CMMI10
%%+ CMSY10

このうち Type1 フォントと結び付いたものは,次のようにグリフも含めたフォントの情報が ps ファイルの中に展開されます.

%%BeginFont: CMR10
%!PS-AdobeFont-1.1: CMR10 1.00B
%%CreationDate: 1992 Feb 19 19:54:52
% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
(中略)
%%EndFont

一方 VF と結び付いたものは,名前が使われていてもグリフはないままで,その具現化は PS printer とか ghostscript に任されます.

2.3  ghostscript

ps ファイルの中には,VF は名称のみ,それ以外のフォントは形状のデータがあります. 従って,必要なのは VF と実際に表示 (または印刷) するフォントとを結び付けることです. これは次のようにされています.

/Ryumin-Light << /FileType /TrueType /Path (ipag.ttf) /SubfontID 0 /CSI [(Japan1) 3] >> ;
/GothicBBB-Medium << /FileType /TrueType /Path (ipam.ttf) /SubfontID 0 /CSI [(Japan1) 3] >> ;

dvips によりできる ps file のフォントは Ryumin-Light-H, GothicBBB-Medium-H なので,その点は気になります.

なお,実際に FreeBSD に導入される状態では,フォントの置き場の都合で symbolic link を介するなどもう少し複雑になっています.

3. 補足

(1) 既に述べたことの言い換えですが,日本語とその他のフォントとでは,指定の仕方がかなり異なります. 日本語は dvi ファイルでも ps ファイルでも仮の名前で通して,実際のフォントは切り換えることができます. その他のフォントは,実名で管理されるので,切り換えはできません. (ファイル名を入れ換えることはできますが,metric が同じであることは稀です.)

日本語のフォントですが,xdvidvips も,先に例示した TrueType Font 以外にも利用できるフォントの形式はあります. ただし,両者に共通するものを選ばないと出力が同じになりません.
→ FreeBSD 8.2 では,初期設定は TrueType Font でなく Open Type Font を使うようになっています.

(2) "Type1 font" と言った場合,一般には拡張子として pfapfb の二つがあるのですが,ここでは Type1 と pfb とは同じ意味で使っています. ファイルを指す場合に後者を使うようにしています.

(3) Type1 と対になるように AFM (Adobe Font Metric) (拡張子は afm) が用意されているのですが,どこで使われているのか解らないので,上述の話には登場させられませんでした.

4. 参考資料

[1]「日本語 LaTeX2e インストールキット」中野 賢 ら,アスキー出版局 (1997)
[2]「モリサワ5書体TFM&VFセット」株式会社アスキー 出版技術グループ,/usr/ports/japanese/ptex/work/morisawa/README.txt
[3]「README for using Postscript Type1 fonts with xdvik」
  /usr/ports/japanese/xdvik/work/xdvik-22.40y1/texk/xdvik/README.t1fonts
[4]「Ghostscript Another Manual」江口 庄英,ソフトバンク (1997)
[5]「プリント大全」Unix User 2003.1, ソフトバンク