top page > TeX > here

FontForge の使用例


概要

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

  1. Bold Extended Small Caps や Bold RSFS の mf file を作成し,それから pfb file を作る.
  2. LH font (ロシア語) の既存の mf file から pfb file を作る.

目次

1. 概要
2. Bold Extended Small Caps の作成
3. Bold RSFS の作成
4. LH font の作成
5. 配布ファイル

1. 概要

現在,xdvi のフォントは,default では Type1 (pfb) を PK (pk) よりも優先的に使うようになっています. また dvips も Type1 があればそれを使うように設定することができます.[1]

したがって,表示,印刷を美しくするために [2],必要な Type1 フォントはそろえておきたいところです. それがない場合には,作ることができれば都合が良いです. 次節以降で,以下の二つの場合を考えます.

  1. そもそも mf file がなく,それを自分で記述する場合.
  2. mf file はあるが対応する pfb file がない場合.

なお,以下に作成したフォントですが,古い xdvi (FreeBSD 4.9 の頃の ja-xdvik-vflib-20.40w.1.17) で表示すると,一部の文字が正しく表示されません. ghostscript の方ではこの問題は生じておらず,印刷は問題なくできます.

[1] 一昔前の xdvi は Type1 が扱えなかったので,dvips で Type1 を使うと両者 (xdvigv) の表示が微妙に違いました. 現在では,両者の表示をそろえるために必要なことは,dvips の側で config.psmap file を適切に記述することです. これらを FreeBSD の ports/packages から導入すれば,既にそのような状態になっています.
[2] PK を使った場合,ghostscript (gv) で見ていまいち綺麗ではありません.特に拡大した場合に.(印刷した状態でそれが気になるレベルかどうかこそが問題なのですが.)

2. Bold Extended Small Caps の作成

この節では,mf file 自体がない場合について述べます.

Small Caps には bold extended 書体がありません. すなわち,/usr/local/share/texmf-dist/tex/latex/base/ot1cmr.fd には

\DeclareFontShape{OT1}{cmr}{bx}{sc}{   ← bx が bold extended,sc が Small Caps

という項目がありません. 従って,それが文書中で使われた場合,何かで代用された旨が log に出力されます.

LaTeX Font Warning: Font shape `OT1/cmr/bx/sc' undefined
(Font)              using `OT1/cmr/bx/n' instead on input line 36.

すなわち,この場合にはこのフォントは以下に抜粋するように ot1cmr.fd に従って cmbx で代用されます.

%%%%%%%% bold extended series
\DeclareFontShape{OT1}{cmr}{bx}{n}     ← n が Normal
   {%
      <5><6><7><8><9>gen*cmbx%
      <10><10.95>cmbx10%
      <12><14.4><17.28><20.74><24.88>cmbx12%
      }{}

例えば "BibTeX" の" Bib" は Small Caps なので,これを意識的に太字にしたい場合だけでなく,\section{} などの中で使う場合には困ります. (気にしないと言われればそれまでですが.)

(1) 準備

作業用の directory を作成し,先ずそこに素材を集めます. FreeBSD 7.2 では,次のファイルを cp します.

% cp -p /usr/local/share/texmf-dist/fonts/source/public/cm/cmb10.mf .
% cp -p /usr/local/share/texmf-dist/fonts/source/public/cm/cmbx10.mf .
% cp -p /usr/local/share/texmf-dist/fonts/source/public/cm-bold/cmbcsc10.mf .
% cp -p /usr/local/share/texmf-dist/fonts/type1/bluesky/cm/cmcsc10.pfb .

そして,新たにファイル cmbxcsc10.mf を作成します.

% cp cmbcsc10.mf cmbxcsc10.mf

このファイルの内容を,

% diff cmb10.mf cmbx10.mf

の出力を参考に修正します. すなわち,cmb10.mfcmbx10.mf との差異が cmbcsc10.mfcmbxcsc10.mf との差異と同様であると考えるわけです.

なお,FreeBSD 4.11 では,素材は texmf-disttexmf に読み替えたところにあります.

(2) 既存の pfb file からの Encode の取得と登録

% env LC_ALL=C fontforge cmcsc10.pfb

として読み込み,次のようにメニューを選択します.

[Encoding] → [Make From Font]
please name this encoding : CMR   ← 例えばこう命名して,それを入力する.
[OK]

ここで,~/.Fontforge/ の中に Encoding.ps が新規作成,または追加されます. (これはテキストなので中身を見てみましょう.)

ここで,

[Encoding] → [Reencode]

とすれば,メニューの一番下に CMR が追加されているので,それを選択します. title bar の表示も (Custom) から (CMR) に変わります. 次に,

[Element][Font Info]

とすれば新たな Window が開きます.(その Window の左側の選択肢の default は Names です.) ここに表示される内容をメモしておいてください.

Fontname:        CMCSC10
Family Name:     Computer Modern
Name for Humans: CMCSC10
Weight:          Medium
Version:         1.0
Base Filename:  ("Same as Fontname" の方がチェックされています.)
Copyright:      (ここはメモしなくても良いですが,読んでおきましょう.)

[Cancel] を選べばこの Window が閉じます. 最後に,元の Window にて一旦終了します.

[File] → [Quit]

(3) mf file からのフォントの作成

% env LC_ALL=C fontforge cmbxcsc10.mf
[Encoding] → [Force Encoding]

メニューから CMR を選択します.
(注意) ここで [Reencoding] を選ぶと,作成されたフォントが code 256 以降に飛ばされてしまいます! 誤ってこれを選んでしまったら,一旦 [Quit] して mf file の読み込みからやり直してください.

次に,グリフが作成されていない箇所があれば,それを作成します. (この例ではあります.) グリフ一覧が表示されている画面を下にスクロールすると,上の枠が黒地でなく,かつ文字が ? ではないのに,下の枠 (グリフが表示される部分) が赤の X 印になっているところがあります. その赤の X 印を Mouse の左ボタンで double click して下さい. 新たな Windows が立ち上がり,グリフが作成されます. その Window は

[File] → [Close]

で閉じます.(絶対に [Quit] を選ばないで下さい.) 元の画面に戻って,再度 X 印を Mouse の左ボタンで click して下さい. そこにグリフが表示されます.

その作業が一通り終わったら,次にフォントの情報を記述します.

[Element] → [Font Info] (Names)

先にメモした内容を参考に,次のように書き換えます.

Fontname:        CMBXCSC10
Family Name:     Computer Modern
Name for Humans: CMBXCSC10
Weight:          Bold           ← Medium から書き換える.
Version:         1.0
Base Filename:   cmbxcsc10      ← Fontname を小文字で書き換える.
Copyright:       Created by S.Kimura with FontForge 2.0 (http://fontforge.sf.net)

Copyright のところの名前は,/etc/passwd から自動的に引用されます. 当然,変更可能です.

[OK]

を選べばこの Window が閉じます.

(4) フォントの出力 (pkb, afm)

元の Window にて,次のように進みます.

[File] → [Generate Fonts]
[PS Type1 (Binary)]   を選んで
[Save]

この時,title bar に "Errors detected Window" と書かれた Window が開いて次のように警告されます.

The font contains errors.

これは,先ほど手作業で作成したいくつかの文字に関するエラーです. エラーの内容を確認するなら [Review] を選びます. この場合,フォントは出力されません.

出力に再挑戦します.今度は警告されても [Save] を選びます.

[File] → [Generate Fonts] → [Save] → 警告画面で [Save]

この段階で cmbxcsc10.pfb, cmbxcsc10.afm が作成されます. さらに,次のように進みます.

[File] → [Save]

この段階で cmbxcsc10.sfd が作成されます. これで終了です.

[File] → [Quit]

((3) の補足) "Fontname" は,pfb file 名の default を決めるだけでなく,その pfb file の中にも書かれ,それは map file の内容に影響します. "Name for Humans" の方は何にどう影響するか不明.(fontforge に任せておくと,"Fontname" と同じにされます.)

作成された cmbxcsc10.pfb の冒頭は次のようになっています.

% hexdump -Cv cmbxcsc10.pfb | jless

000000 : 80 01 e9 0b 00 00 25 21 50 53 2d 41 64 6f 62 65  | ......%!PS-Adobe
000010 : 46 6f 6e 74 2d 31 2e 30 3a 20 43 4d 42 58 43 53  | Font-1.0: CMBXCS
000020 : 43 31 30 20 31 2e 30 0a 25 25 54 69 74 6c 65 3a  | C10 1.0.%%Title:
000030 : 20 43 4d 42 58 43 53 43 31 30 0a 25 56 65 72 73  |  CMBXCSC10.%Vers
000040 : 69 6f 6e 3a 20 31 2e 30 0a 25 25 43 72 65 61 74  | ion: 1.0.%%Creat
000050 : 69 6f 6e 44 61 74 65 3a 20 54 68 75 20 41 75 67  | ionDate: Thu Aug
000060 : 20 32 37 20 31 34 3a 30 37 3a 35 31 20 32 30 30  |  27 14:07:51 200

((4) の補足) 古い version の FontForge では,これと同じことをしてもエラーにはなりませんでした. また,この警告を無視して作成したフォントを使っても,今のところ問題は生じていません. そういう経験から,ある程度確信を持ってこの警告を無視しています. ただし,気味が悪いのも事実ですので,機会があれば,警告されないために何が必要なのかを追求したところです.

3. Bold RSFS の作成

同様に,mf file 自体がない場合について述べます. 要領は Bold Extended Small Caps の場合と同じです.

RSFS にも bold 書体がありません. これは数式環境で用いるのですが,ベクトルを表わすために bold 書体が必要になる場合もあり得ます. (あったからこれを書いているのですが.)

現在配布されている RSFS font は mfpfb のみで,afm がありません. これらが必要ならば,既存の pfb は無視してこれらを再度 mf から作り直す必要があります. (afm を既存の pfb から作成する手段があれば,それが最良ですが.) ここではそれは追求せす,目的を Bold RSFS の作成に限定します.

作業用の directory を作成し,そこに素材を集めます. FreeBSD 7.2 では,次のファイルを cp します.

% cp -p /usr/local/share/texmf-dist/fonts/source/public/rsfs/rsfs10.mf .
% cp -p /usr/local/share/texmf-dist/fonts/source/public/cm/cmsy10.mf .
% cp -p /usr/local/share/texmf-dist/fonts/source/public/cm/cmbsy10.mf .
% cp -p /usr/local/share/texmf-dist/fonts/type1/hoekwater/rsfs/rsfs10.pfb .

そして,新たにファイル rsfsb10.mf を作成します.

% cp rsfs10.mf rsfsb10.mf

このファイルの内容を,

% diff cmsy10.mf cmbsy10.mf

の出力を参考に修正します. ただし,両者の差異が大き過ぎるので,実際には試行錯誤でパラメーターを変えることになります.

フォントの情報ですが,rsfs10.pfb

Fontname:        rsfs10
Family Name:     rsfs10
Name for Humans: rsfs10
Weight:          Roman
Version:         001.0001

から次のように書き換えました.

Fontname:        rsfsb10
Family Name:     rsfs
Name for Humans: rsfsb10
Weight:          Bold
Version:         1.0
Base Filename:   "Same as Fontname"
Copyright:       Created by S.Kimura with FontForge 2.0 (http://fontforge.sf.net)

4. LH font の作成

この節では,mf file はあるが対応する pfb file がない場合について述べます. ただし,「mf file はある」に一捻りあること,Encoging が素直でないことからわざわざ例示しています.

LH font はロシア語のフォントであり,最近の FreeBSD の TeX の ports/packages においては wncyr (Washington Computer Modern Cyrillic) に代わって標準扱いになっています. その割には pfb file が用意されていないので,自前で作成します.
ports/print/cm-super には LH font が含まれていますが,Encode は T1, T2* 等であり,OT2 では利用できません.

(1) 先ず LH font を OT2 で使う際のバグを修正します. (これは TeX におけるロシア語  4. OT2 に関する諸注意 にも書きましたが,ここに再提示します.) これを直さないと,\textsc (Small Caps) で ц が大文字と同じ大きさのフォントの Ц にされてしまいます.
(TexLive の環境においては,ここは修正されています.)

% cd /usr/local/share/texmf-dist/fonts/source/lh/lh-ot2
% diff -u wnliker.mf.org wnliker.mf
--- wnliker.mf.org      2004-05-30 03:51:27.000000000 +0900
+++ wnliker.mf  2009-09-05 11:57:50.000000000 +0900
@@ -1163,7 +1163,7 @@

    beginligtable
       labelchar ( CYR_.t );
-            setlig([ASCII "s"],CYR_.C);
+            setlig([ASCII "s"],CYR_.c);
       labelchar (
              CYR_.g
             ,CYR_.r

(2) LH font は,それを使う TeX の原稿をコンパイルすることにより作成されます. その基になるデータは /usr/local/share/texmf-dist/fonts/source/lh/lh-ot2/ にある mf file です. また作成されるファイルは mf, tfm, pk であり,各々以下のところに置かれます.

/var/tmp/texfonts/source/lh/lh-ot2/         ← mf
/var/tmp/texfonts/tfm/lh/lh-ot2/            ← tfm
/var/tmp/texfonts/pk/ljfour/lh/lh-ot2/      ← pk

(3) 作業用の directory を作成し,そこに素材を集めます. 次のファイルを cp します.

% cp -p /var/tmp/texfonts/source/lh/lh-ot2/* .

(4) fontforge から例えば wnr10.mf を読み込みます.

% env LC_ALL=C fontforge wnr10.mf

次いで,このファイルのための Encode を記述したファイル (以下の配布ファイルに同封します) を読み込みます. (なお,ここで読み込まれた Encode は自動的に登録されますので,この作業は二回目以降は不要です.)

[Encoding] → [Load Encoding]
OT2Encoding.ps   ← 選択肢の中からこのファイルを選ぶ.
[OK]

次いで,新たに登録した Encode に切り換えます.

[Encoding] → [Force Encoding]

メニューから TeX-OT2AdobeEncoding を選択します.

フォントの情報ですが,次のように書きました.

Fontname:        wnr10
Family Name:     LH
Name for Humans: wnr10
Weight:          Medium
Version:         1.0
Base Filename:   "Same as Fontname"
Copyright:       Created by S.Kimura with FontForge 2.0 (http://fontforge.sf.net)

以後は,先の二例と同様です.

(補足) 以下の作業は必ずしも行なわなくてかまいません.

/var/tmp/texfonts/ に作成された種々のファイルですが,pfb を TeX から使える状態にした後は pk file は不要なので消してかまいません. また,mf, tfm file を ~/texmf の然るべきところに移動させると,後々の「引っ越し」が楽になるかもしれません.

なお,/var/tmp/texfonts/~/texmf のファイルを手作業で増減させた場合,/var/tmp/texfonts/ または ~/texmf にて

% mktexlsr .

を実行しましょう.

5. 配布ファイル

まだ配布できる形にできておりませんが,作成した mf file や LH font 用の Encode を反映させた OT2Encoding.ps を配布する予定です. あと,sty file や dvips のための map file もです.