文字組み空き量設定とTFMファイルの作成

TFMファイルの構造

ここで、和文TFMファイル (JFMファイル) の内部構造に関して簡単に説明します。TFMファイル内には以下のようなことがバイナリで書かれています。

■文字を文字クラスに分類

例えば、始め括弧類は文字クラス1、終わり括弧類は文字クラス2、中点類が文字クラス3……という風に、それぞれの文字クラスに分類される文字を列挙します。好きな文字を好きな文字クラスに入れられますが、この時、何も設定しなかった文字 (その他の文字) は文字クラス0になります。

■各文字クラスの文字幅等設定

文字クラス0は文字幅1.0、文字クラス1は文字幅0.5……などというように、各文字クラスごとに、文字幅を「文字サイズ」に対する比で設定します。min10.tfmやjis.tfmはここで0.962216と設定されています。他にも文字の縦方向の長さも設定しますが、和文ならすべて同じでいいでしょう。

■各文字クラス間の空き量設定

文字クラス0の文字の後に文字クラス1の文字が来るといくら空けるか……という風に、各文字クラス間の空き量について「文字サイズ」の比で設定します。空き量は「標準的な空き」「調整時にどれぐらい伸ばすか」「調整時にどれぐらい縮ませるか」の3つを設定できます。

あと、ちょっとしたパラメータがありますが、基本的にはこれだけです。

ただ、バイナリのTFMファイルはそのままでは編集しにくいので、これをテキストファイルにしたPLファイルというものがあります。PLファイルはそのままでは使えませんが、pltotfコマンドでTFMに変換できます。

従って、まずPLファイルを作り、pltotfコマンドでTFMにするというのがTFMファイルの作成手順になります。pltotfコマンドは、最新のTeXをインストールすれば自動的に入っていると思います。

漢字間のTFMグルー

さて、前回の「min10.tfmやjis.tfmの問題点」の回で考えたように、括弧の内側などにもTFMグルーの設定が必要です。また括弧の外側の伸び設定も要ります。このようないろんな伸び縮みの設定をTFMに書くことを考えると、\kanjiskip を使わず、すべてをTFMグルーで設定することができることに思い当たります。

つまり、文字クラス0の後に文字クラス0が来たときの空き量もTFMに書くなど、すべての文字クラス間の空き量設定をTFMに書いてしまうのです。そうすると、どこにも \kanjiskip が入らなくなりますが、伸び縮みの量を \kanjiskip ではなく、すべてTFMで設定するという考え方ですね。

ブロック境界の問題

しかし、実はこれをすると困ったことが起こるのです。実はASCII pTeXではブロックの開始位置や終了位置は文字クラス0に分類され、勝手にTFMグルーが入るのです。例えば、平仮名が文字クラス0に分類されているとして、

\mc{\gt いうえ}

という風に「いうえ」部分のフォントを変えたとします。「あ」と「い」の間にはブロック境界があるために、

と2か所に、文字クラス0どうしの間のTFMグルーが入ります。結果的に、「あ」と「い」の間は「い」と「う」の間の2倍伸びるのです。中括弧を書いただけでグルーが余分に入ってはマクロもおちおち書けません。ちなみに、\kanjiskip が入るときにはこのようなことは起きません。

結局 \kanjiskip のお世話に…

この解決方法は2つあるでしょう。

  1. すべての文字を文字クラス1以上のどこかに入れ、文字クラス0に該当する文字をなくしてしまう。
  2. 約物どうしや、約物と漢字などの間はすべてTFMで設定し、漢字間などだけ \kanjiskip に任せる。

1番は、例えば漢字を文字クラス1に分類するなら、そこにすべての漢字を列挙するわけですね。しかしこれは、「設定のない文字は文字クラス0」という仕様のおかげで和文TFMは少ない記述ですべてを記述できるという長所があったのに、それを完全に無視した形です。また、すべての文字が列挙されているTFMなどを使うとTeXが重くなることも想像できます。\kanjiskip もまったく無用の変数になってしまいますね。まあ、悪くはない方針だとは思いますが、総合的に考えれば2番の方針が妥当でしょうか。

文字組み空き量設定

方針が決まりましたので、後は各文字クラスの間をどれぐらい空けるかの設定です。以前の「JIS行組版ルールを考える」「min10.tfmやjis.tfmの問題点」の回で考えたことは、

括弧の内側や句読点の前、クエスチョンマークの前など
… 少しは縮んでもいいが、絶対に伸びない (空かない) ようにしたい。
括弧の外側や句読点の後
… 少しは伸びてもいい。
読点の後
… ベタまでは縮んでほしくない。必ず四分アキ以上は空くこと。
カギ括弧類の外側
… ベタまでは縮んでほしくない。必ず八分アキ以上は空くこと。

といった感じの変更をjis.tfmに対して行なうことでした。

\kanjiskip 相当量

では、「少しは縮んでもいい」とか「少しは伸びてもいい」の「少し」とはどのぐらいかという問題を考えてみましょう。前にこれは \kanjiskip 相当量と考えましたが、実際には \kanjiskip の伸び縮み量と多少違っていても問題はありません。JIS規格でも、約物周りと漢字間では調整量は違います。

ではまず縮み量を考えると、pLaTeX2eの標準は9.62216ptの文字に対して0.5pt縮められるようになっています。これは全角幅の約5.2% まで縮む調整です。しかし、フォントによっては文字枠いっぱいにデザインされたものもあって、あまり詰めるのは危険ですから、もう少し小さめで2% ぐらいまでの調整で止めておきましょうか。

次に伸ばし調整量です。TeXでは、縮み方向は最大どこまで縮むかを設定しますが、伸ばし方向は最大値を設定するわけではありません。伸ばし方向で設定するのは、最も縮んだ状態と同じぐらいの汚さはどれぐらい伸びたときかという値です。例えば、

\kanjiskip=0pt plus .4pt minus .5pt

は、通常時の文字間は0ptで、伸び量0.4pt、縮み量0.5ptという設定ですね。この設定では、文字間が縮むときは最大0.5ptまで縮み、それ以上は縮みませんが、伸びるときは設定した値の0.4ptを越え0.5ptでも伸びます。この0.4ptというのは、TeXが組版の汚さの評価値 (badness) を計算するときに、0.5pt縮んだ場合と0.4pt伸びた場合の評価値を同じと考えるという設定なのです。TeXは調整量ができるだけ少なくなるように行分割をしますが、縮み調整と伸ばし調整では同じ長さで比較するわけにはいかないので、この設定にしたがって評価します。

伸ばし量

縮み調整で読点の後などがベタまで縮むと格好悪いですから、そこまで縮むぐらいなら伸ばしてほしいということで、縮み量に比べて伸ばし量を多めに設定するというやり方があります。

しかし、今回作成するTFMでは、読点後は四分アキ以上は縮まないなど、従来のTFMに比べて縮みにくい性質になっています。そして、この範囲ならバンバン縮んでくれてもいいぐらいです。つまり、このTFMでは無駄に大きな伸ばし量を設定する必要はありません。まあ、5% ぐらいに設定しておきましょうかね。

ベースラインの位置

さて、今回作成するTFMはmin10.tfmやjis.tfmとは違って、10ptを指定するときちんと10ptになるTFMです。横幅は文字サイズに対して1.0の長さになります。同様に、正方形イメージを考えて縦の長さも1.0です。しかしTeXでは、縦方向は欧文ベースラインを境に上側を「高さ」、下側を「深さ」といって、二つに分けて認識しています。1.0にすべきはこの「高さ + 深さ」の合計です。では、どういう比率で分割しましょう。

この、高さと深さの比率はフォントによって違います。TrueTypeフォントとPostscriptフォントでも異なるのですが、Adobe社製の和文Postscriptフォントでは、高さ88% で深さ12% という比率になっています。

しかし、モリサワフォントでは、高さ87.6% で深さ12.4% の比率になっていると聞いたことがあります。今、改めて情報ソースを確かめようと思いましたが見当たりませんでした。しかし、公開されている「リュウミンL」のAFMファイルの漢字部分を調べてみると、明らかに88 : 12よりは87.6 : 12.4の比率の方が近いように思います。

根拠は少し希薄かもしれませんが、そんなわけで以下、「幅1.0高さ0.876深さ0.124」でTFMを作ることにしましょう。

TFMファイルの作成

TFMを作るためにはまずPLファイルを作りますが、PLファイルを直接編集していると、括弧の前と後ろで違う値を入れてしまって対称にならないといったミスが発生しやすくなります。そこで私はPLファイルを生成するperlスクリプトを作って生成させました。

makenewjis.pl (perlスクリプト、EUC)

実行すると横書き用のynewjis.plと縦書き用のtnewjis.plを作成します。jis.tfmの改良版ということで、こんな名前にしました。あとはコマンドラインから、

pltotf ynewjis
pltotf tnewjis

で、ynewjis.tfmとtnewjis.tfmに変換できます。これは直接使うよりは、後の回で紹介するように各フォント名のファイルにリンクして使うのがいいと思います。

【追記】TeX Live では「ppltotf -kanji=euc」にしないとうまく動かないかも (pltotf は英語版で、ppltotf が日本語版のようなので)。


渡邉たけし <t-wata@dab.hi-ho.ne.jp>