OldSlav フォントの作成

1900 年刊行の教会スラヴ語聖書を眺めていて,SlavTeX フォントにない文字付略号符(буквенное титло)を見つけた。ч の文字にハットを冠したもので,私の見たことのないものだった。これは教会スラヴ語教科書にもない。教会スラヴ語 LaTeX パッケージ OldSlav の Unicode 対応をするなかで,どうしてもこの略号符を出力できるようにしたいと思った。

マクロで重ね打ちするなどの手段を考えたが,やはりフォントを作ることにした。SlavTeX フォントはもともと METAFONT で作成されており,フォントソースが添付されている。これを流用して буквенное титло ч を作ってみた。また,従来の SlavTeX フォントでは,ハイフネーションの文字はハイフン(-)だったわけだが,この聖書ではアンダースコア(_)が使用されていた。こちらのほうがそれらしいと思ったものだが,SlavTeX フォントにはアンダースコアがない。ついでにこいつも追加することにした。

METAFONT

私にとって METAFONT への取り組みは Izhitsa 教会スラヴ語パッケージの日本語対応以来である。METAFONT はタイポグラフィによほど関心のない限りなかなかとっつきにくいものがある。それでも,クヌース教授による『METAFONT ブック』を参照しながら,既存のソースを流用してなんとか作成することができた。

METAFONT フォント作成のメモを簡単にしるしておく。 .mf ファイルに描画命令を記述する。今回 exslav10.mf として別フォントとして生成することにした。適当なエリアで文字を割当て,フォントを生成しておき,仮想フォントで目的とするエリアにマッピングすればよい。参考までに今回作成した METAFONT ソース .mf のうち, буквенное титло ч の描画部分だけをあげておく。

% буквенное титло ч
beginchar(100,9u#,small#,0);
  % titlo hat function (slav.mac)
  hat(1,0);
  % titlo character
  r:=22/10u; s:=7/2u;
  % right vertical line
  z.u=(s+r+1/8u,small+6u);
  z.d=(s+r,small+2u);
  z.m=(s+r,small+10/3u);
  pickup penrazor scaled 4/5u;
  pp:=flex(z.u,z.m,z.d);
  draw pp;
  labels(u,m,d);
  % curve from left upper to right vertical line
  z2.2=(s+r+1/10u, small+21/5u);
  z2.1l=(s,small+6u);
  penpos2.1(4/5u,0);
  penpos2.2(3/10u,90);
  penstroke z2.1e{down}..tension 0.75..{right}z2.2e;
  penlabels(2.1,2.2);
endchar;

gftodvi ゲラ刷り DVI 生成

exslav10.mf ができたら,mf ユーティリティで処理し,gftodvi ユーティリティでゲラ刷り DVI ファイル(下図)を作成する。これを確認しながら,METAFONT の記述を修正しつつ,満足のゆくものができるまで文字のデザインを調整する。クヌース教授は,smoke モードで生成した DVI を紙に印刷して壁に貼り,後ろに下がって眺めるとよい,と勧めておられる。tex testfont を実行するとフォントチャートが得られる。それとともに tfm 及び pk フォントのファイルが生成される。

mfgera.png
ゲラ刷り DVI

mftrace アウトラインフォント生成

これでできたフォントは tfm と pk である。tfm は LaTeX で組版するときに必要となる。しかしながら,pk フォントは,紙に印刷すると暖かみのあるものだと私は思うけれども,いわゆるビットマップフォントであり,PDF などに埋め込むにはあまり推奨されない。そこで mftracet1binary の両プログラムを用いて PostScript Type1 アウトラインフォントに変換した。DVIWARE にフォントを拾ってもらうための map ファイルも作成する必要がある。

以上の一連の流れのコマンドラインを以下に示す。私は Mac OS X で行ったが,FreeBSD, Linux, Windows でも手順はそれほど変わらないと思う。

% mf exslav10
% gftodvi exslav10.2602gf
% tex testfont
...
Name of the font to test = exslav10
...
*\table
 
*\end
...
% mftrace --magnification=4000 --encoding=tex256.enc exslav10
% t1binary exslav10.pfa exslav10.pfb
% cat > oldslavex.map
exslav10 exslav10 <exslav10.pfb
(control-D)
%

仮想フォントの作成

さて,exslav10.tfmexslav10.pfboldslavex.map までできたけれども,これだけでは OldSlav の組版でフォントが使用できるわけではない。OldSlav の仮想フォントのしかるべきエリアに,作成したフォントをマッピングしなければならない。既存の OldSlav 仮想フォント・ソース fslavrm.vplexslav10.vpl の当該文字定義を反映する。この定義の元ネタ vpl ファイルを tftopl ユティリティで生成し,MAPFONT 命令で exslav10 のエントリを追加するとともに,буквенное титло ч の文字定義を fslavrm の空きエリア 6 番に,アンダースコアをハイフンの位置 45 番に(ハイフンの代わりとして使うので)MAP 命令でマッピングする。定義が終われば,vf と tfm を vptovf ユティリティで生成する。仮想フォントの作成は面倒だが,以前 OldSlav 用 vf を作成したとき,メモを残しておいたのが役に立った。いまこうして書きしるすのも,自分のためである。

フォント・インストール/試験

以上できた tfm, vf, map, pfb ファイルを TDS に従った場所にコピーし,mktexlsrupdmap-sys --enable Map=oldslavex.map を実行する。これでやっと追加フォントが使用できるようになった。

% tftopl exslav10.tfm exslav10.vpl
% emacs fslavrm.vpl exslav10.vpl &
(ターゲットの fslavrm.vpl を編集し,exslav10.vpl 定義を反映する)
% vptovf -verbose fslavrm.vpl
% su -m
# setenv TEXDIR /usr/local/teTeX/share/texmf-local
# cp fslavrm.vf $TEXDIR/fonts/vf/oldslav/
# cp fslavrm.tfm exslav10.tfm $TEXDIR/fonts/tfm/oldslav/
# cp exslav10.pfb $TEXDIR/fonts/type1/oldslav/
# cp oldslavex.map $TEXDIR/fonts/map/dvips/oldslav/
# mktexlsr
# updmap-sys --enable Map=oldslavex.map
# exit

OldSlav に буквенное титло ч アクセント命令(\ttlh)を追加して,早速組んでみた。実際の文献でも文字付略号符は虫眼鏡でみないと判別できないくらいのシロモノだけど,まあできた,できた。ハイフネーションも聖書のマナーを再現できて満足。今回の成果を含めなるべくはやく UTF-8 対応版パッケージを整理して公開したいと思う。

ocstitlo.png
буквенное титло ч タイプセット試験

参考文献