和文VFの作り方

はじめに

ここではVirtual Fontとは何かを簡単に説明します.和文のTFM, VFを特に区別が必要な場合のみJFM, JVFと呼びます.また全角幅をzwで表します.

TeXおよびDVIwareがどのように文字を表示するのかおさらいしておきましょう.まず,TeXが組版を行う際は,文字の幅,高さ,深さのみを必要とします.これらの情報はTFMファイルに書かれています.このときDVIファイルには,「どのTFMファイルのどの文字コードの文字を置くのか」という情報のみが書かれます.(文字と文字の間のグルーによる移動は説明を省きます.)つぎはDVIwareの処理ですが,和文の場合,多くのDVIwareでVirtual Fontを必要とします.これは括弧「(」などの文字幅がTFMにおいては0.5zwになっていますが,実際のフォント側では1zwになっています.つまり左側の0.5zwの空きを含めてデザインされているのです.このような文字幅の調整を行うのにVFを使っています.

しかしながら,VFの機能はこれだけに止まりません.複数のフォントを組み合わせて一つのフォントにすることや,文字の大きさや位置を調整することも可能です.

では,VFはどのようにして作るのでしょう? 欧文の場合は人間が分かりやすい命令で書かれたVPLファイルをvptovfで処理することにより作成します.しかし,和文用のvptovfはありません.文字幅の調整用のVFを作る為にはアスキーによるmakejvfが利用出来ます.使用方法などはmakejvfのREADMEファイルをご覧下さい.最新の物では漢字の部分と非漢字の部分で別のフォントを用いるようなVFも作成出来ます.vftoolによる方法はobsoleteです.しかし,makejvfでは複数のフォントの組み合わせや個々の文字の調整の自由度がありません.これを行う為にはOmega用のovp2ovfを用います.これはvptovfの2バイト文字への拡張版です.これで殆ど自由にVFを作成することが出来ます.しかし,ovp2ovfで出来ないことがあります,pTeXでは1バイトのTFMの文字は縦書きの際に回転してしまいます.これは普通は問題にならないのですが,1バイトかなフォントを使う際には困ったことになります.

以下ではovpファイルとovp2ovfによるJVFの作成について説明していきます.

OVPファイルの構造

和文のVFファイルからVPLファイルを生成するには松田一朗先生のdisvf.plを使います.「ttf2pkと補助漢字」から入手出来ます.カレントディレクトリにdisvf.pl, jis.vfがあるとして,perl disvf.pl jis.vf > jis.ovpでjis.ovpが生成されます.disvf.plによって生成されるVPLファイルは文字コードが10進数で記述されています,JISコードなどは16進数で表されることが多いので,すこし混乱をします.これを16進数で表示されるように変更しましょう.51行目のprint "(CHARACTER D $cc\n";printf "(CHARACTER H %X\n",$cc;に変更します.次に,90行目のprint " (SETCHAR D $k)\n";printf " (SETCHAR H %X)\n",$k;に変更します.

jis.ovpについて

上記のような変更したdisvf.plにより生成されたjis.ovpを見てみましょう.

(VTITLE )
(DESIGNSIZE R 10.000000)
(CHECKSUM O 0)
(MAPFONT D 1
   (FONTNAME rml)
   (FONTCHECKSUM O 0)
   (FONTAT R 0.962216)
   (FONTDSIZE R 10.000000)
   )
(CHARACTER H 2121
   (CHARWD R 0.962216)
   (MAP
      (SETCHAR H 2121)
      )
   )
(CHARACTER H 2122
   (CHARWD R 0.481108)
   (MAP
      (SETCHAR H 2122)
      )
   )
(中略)
(CHARACTER H 214A
   (CHARWD R 0.481108)
   (MAP
      (MOVERIGHT R -0.481109)
      (SETCHAR H 214A)
      )
   )
(中略)
(CHARACTER H 7E7E
   (CHARWD R 0.962216)
   (MAP
      (SETCHAR H 7E7E)
      )
   )

最初の3行はお約束です,特に変更する必要はないでしょう.次のMAPFONTはどのフォントに割り当てるかの識別子です.jis.vfの場合,rmlというフォントに割り当てるということが分かります.dvipsなどのマップファイルでrml Ryumin-Light-Hという指定があればRyumin-Light-Hというフォントが用いられます.このMAPFONTを複数記述することにより,複数のフォントを組み合わせた合成フォントを作ることが出来ます.以下の部分はCHARACTERで個々の文字にどの文字コードを割り当てるかを記述しています.jis.vfの場合,CHARACTERSETCHARの文字コードが一緒なので文字コードの変換はありません.0x2122の文字の定義をみると(CHARWD R 0.481108)となっています.これは「、」の文字幅が0.481108(=0.5zw)であることを表しています.0x214Aの文字を見てみると(MOVERIGHT R -0.481109)という記述があります.これは「(」を表示させるとき置く位置を右に-0.5zw(=左に0.5zw)移動させてから「(」を表示させることにより,左半分の空白を消しています.(数値が異なっているのは丸め誤差でしょう.実用上は全く問題ありません.)

プロパティ

OVPファイルのプロパティの内,最低限これだけあればというものを書いておきます.

具体例

では,具体的な例に沿って,VFの作り方を説明していきます.

齋藤修三郎

↑インデックスへ 次へ→