TeX の仮想フォント

TeX Q and A で教会スラヴ語フォント(SlavTeX)に英数字がないことに関して,H 氏と I 氏の経験豊かな二人の TeXnician から 仮想フォント (vf: Virtual Fonts) を示唆いただいた。私はこれまで vf は DVIWARE に依存するので考えなかった。でも vf を扱えない DVIWARE は実質ないわけで,これを機会に少し研究してみた。

vf 機構を活用すれば,複数のフォントをひとまとめにして取り扱ったり,文字の配置を変えたりすることが可能である。SlavTeX 教会スラヴ語フォントは英数字をもたない点と,CP866 という古い文字コードを基盤とした 8 ビットエンコーディングである点とで,ちょっと扱いに困るところがあった。これを仮想フォントで解決できた。つまり数字,記号類は EC ラテンフォントから持ってきて対処し,文字の位置を変更することで OldSlav において教会スラヴ語をロシア語 OT2 と同じようにローマ字翻字方式で記述できるようにした。例えば,オリジナルの SlavTeX フォントでは教会スラヴ語の az (a) は x"A0" の 8 ビットエリアに配置されていて pTeX ではコントロールシーケンスでアクセスするしか手だてがないが,仮想フォントにより x"61" に再配置しておけばローマ字 a で出力できるわけである。

OldSlav fslavas 仮想フォント作成作業の概略を示しておく。slav10 SlavTeX 教会スラヴ語フォントと ecrm1000 EC ラテンフォントをもとに OldSlav ローマ字翻字用仮想フォント fslavas.vf を作成する流れである。仮想プロパティリスト fslavas.vpl を作成することが主な作業となる。以下にその手順を示す。

  1. ベースになる二つのフォント slav10.tfm,ecrm1000.tfm のプロパティリスト (pl) を取得 (tftopl ユーティリティ)。SlavTeX フォント,EC フォントが利用可能な状態になっていなければならない。
    % tftopl slav10.tfm slav10.pl
    % tftopl ecrm1000.tfm ecrm1000.pl
  2. slav10.tfm のプロパティリスト slav10.pl を fslavas.vpl にコピー (編集作業はこのファイルに対し ecrm1000.pl データを対置しつつ行う)
    % cp slav10.pl fslavas.vpl
  3. 二フォントの参照を MAPFONT で定義。D 0 で slav10 が,D 1 で ecrm1000 が参照できる指定になっている。
    (MAPFONT D 0
       (FONTNAME slav10)
       (FONTAT R 1.0)
       (FONTDSIZE R 10.0)
       )
    (MAPFONT D 1
       (FONTNAME ecrm1000)
       (FONTAT R 1.0)
       (FONTDSIZE R 10.0)
       )
  4. EC のプロパティリストにある数字・記号類の CHARACTER 定義をコピーし fslavas.vpl に貼付け(主に x"20"-x"41" エリア)。
  5. EC フォントから借用した文字については MAP, SELECTFONT, SETCHAR で EC フォント参照定義を追加する。次のコードは数字 0 の定義である。CHARWDCHARHT などのメトリック情報定義は ecrm1000 のものを拝借すればよい。
    (CHARACTER C 0
       (CHARWD R 0.499878)
       (CHARHT R 0.64151)
       (MAP
          (SELECTFONT D 1)
          (SETCHAR C 0)
          )
       )
  6. SlavTeX の x"41"-x"7A" 領域に翻字で割り当てたい文字を MAP, SELECTFONT, SETCHAR で再配置。次のコードは,a の文字位置 (x"61") に slav10 SlavTeX フォント (D 0) の文字位置 o"240" (=x"A0") を再配置する定義である。CHARWDCHARHT などのメトリック情報定義は slav10 のものを拝借すればよい。
    (CHARACTER C a
       (CHARWD R 0.314995)
       (CHARHT R 0.4)
       (MAP
          (SELECTFONT D 0)
          (SETCHAR O 240)
          )
       )
  7. 合字定義 LIGTABLE 中の文字間の関係にも再配置定義を反映(以下例は省略。完成ファイル fslavas.vpl を参照)。
  8. アスキートランスクリプションで独自に設定したい合字を LIGTABLE に追加

文字の移動関係の LIGTABLE への反映/修正は,手作業でやっていると頭が混乱してイライラして間違いを起すので,基準をプログラム(chgligtbl)に書いて機械的に変換した。こうしておくと再作成のときも苦労しなくてすむ。

fslavas.vpl を vptovf ユーティリティで処理して fslavas.vf 及び fslavas.tfm を生成する。これを TeX ツリーに格納して仮想フォント作成作業は完了である。

% vptovf fslavas.vpl
% sudo mkdir -p $TEXDIR/fonts/{vf,tfm}/oldslav
% sudo cp fslavas.vf $TEXDIR/fonts/vf/oldslav
% sudo cp fslavas.tfm $TEXDIR/fonts/tfm/oldslav
% mktexlsr

さらに,fslavas 仮想フォントを LSA フォントエンコーディングとして利用するためのフォント定義 (lsacmr.fd) 及びフォントエンコーディング定義 (lsaenc.def) を追加する。これで vf で組む最小限のフォント・パッケージはできあがりである。もちろん教会スラヴ語の組版規則実現のための言語マクロ・スタイルを作成してはじめて言語パッケージとして完成する。fslavas のフォントテーブルを掲載しておく。

この方法で vf を作成することにより,例えば T2A エンコーディングしか提供されていない PSCyr キリル Type1 フォントなども OT2 のトランスクリプション入力で使えるようにすることは簡単にできてしまうはずである。

ところで vptovf ユーティリティの気難しさには手間取ってしまった。

(FONTDIMEN
   (SLANT R 0.0)
   (SPACE R 0.359995)
   (STRETCH R 0.179997)
   (SHRINK R 0.119998)
   (XHEIGHT R 0.4)
   (QUAD R 1.0)
   (EXTRASPACE R 0.079999)
   )

ここで,対になる括弧を書く位置がずれるとエラーになる仕様を理解するのにどんなに悩んだことか。はじめて vf を作成するひとは絶対に面食らうに違いない。

仮想フォント機構を詳しく解説した書籍を最後に挙げておく。本田知亮/吉永徹美共著『LaTeX2e マクロ&クラス プログラミング基礎解説』, 2002年, 技術評論社刊。高度かつ正確な解説書である。残念ながら現在品切れになってしまっているようで,古書で探していただきたい。本田さん,吉永さんの本のみならず,藤田先生のマクロ本など,TeX のマクロ/フォント機構を丁寧に解説した良書が,入門書の売れ行きに圧され絶版となってゆくのだとしたら嘆かわしい。『LaTeX2e マクロ&クラス プログラミング』は基礎解説と実践解説との二冊シリーズになっている。ともに,私の LaTeX ハックの最良のリファレンスのうちのひとつである。