min10.tfmやjis.tfmの問題点

min10.tfmとjis.tfm

TeXは一般的なDTPソフトとは違って、OSのフォントファイルを見たりはしません。その代わり、TeX専用の「TFMファイル」というファイルを見ます。このファイルには、具体的な文字の形状データは含まれていなくて、文字コード何番の文字がどれぐらいの幅か、またどの文字とどの文字の間はどれぐらい詰められるのかといった情報だけが含まれています。

ASCII日本語TeXの標準TFMファイルが「min10.tfm」です。和文用TFMはJFMと呼ばれることもありますが、以下TFMで統一しておきます。さて、このmin10.tfmを使って組むと、小さい「ゃ」「っ」などの文字が連続したときに間が詰まり過ぎるなどの不具合が知られていました。下図はmin10.tfmで組んだ例で「ちょっと」の部分が変に詰まっています。

【min10.tfmを使って「ちょっと」と書いた図】

また、JISの行組版方法とも違っていたので、この点を改良したものとして東京書籍のjis.tfmが有名です。確かに上記の問題は起こりませんし、漢字や仮名はすべて全角で、括弧などの約物は半角というJIS規格通りのメトリックスになっています。でも、これでもまだ問題があるのです。

10ptを指定して10ptにならない

前回の「TeXの10ptとDTPソフトの10ptは違う」の回で書いた問題です。まあ、英米ポイントとPostscriptポイントの違いは単位をbpと書けばいいだけの話ですが、和文サイズが0.962216倍に縮小されてしまうのはTFMのせいです。

これは、TeXは欧文サイズを基本とし、和文サイズをそれに合わせているからですが、日本語文書を組版するのなら、逆に、和文サイズを基本とし、欧文サイズをそれに合わせるべきではないでしょうか? もちろん、欧文を組版するなら欧文が基本になるべきです。具体的には、文書クラスがarticleなら欧文サイズを基本とし、jarticleなら和文サイズを基本とするといった対応が良いと思われます。

またフォントの組み合わせによって最適な調整比率も違うはずです。このような柔軟な調整をするためにはTFMでは倍率を掛けず、調整はすべてマクロで行なうべきだと思います。

また、jis.tfmでは文字の縦の長さ (高さ + 深さ) が0.916443で横の長さ (幅) が0.962216と異なった設定になっていますが、和文の文字は正方形が基本なので、これは一致してしかるべきでしょう。まとめると、縦も横もフォントサイズに対して1.0であるべきだとなります。

TFMグルーがあると \kanjiskip が入らない

次に、以下のソースをjis.tfmで組版してみます。

\kanjiskip=0zw plus 3zw
\hbox to 20zw{あ「い」う、えお}

つまり、各文字間がかなり伸びるようにしておいて、上記8文字を20文字の幅に配置します。結果は以下の通り。

【上記ソースを組版した図】

普通に考えると均等に空きが入るはずですが、実際は括弧の内側や読点の前に空きが入り、括弧の外側や読点の後には空きが入っていません。

ASCII pTeXでは、和字間には \kanjiskip というグルー (伸び縮みする間隔) が自動的に入るようになっていて、上記のような文字幅調整の時はこの \kanjiskip が伸びることで指定の幅になります。しかし、TFMでグルーの設定がある部分には \kanjiskip が入らない仕様になっているのです。例えば括弧の外側や読点の後には「通常二分アキ、詰まるときにはベタまで詰める」という設定 (TFMグルー) があります。TFMでこのような設定をした所には \kanjiskip が入らないのです。

TFMグルーがある所に \kanjiskip を入れないという仕様の是非は置いておいても、このjis.tfmを使うと、禁則処理の時にアンバランスな調整がされることはわかるかと思います。

禁則処理の実態

上記の例はわざと極端に文字間を広げた場合なので、通常の禁則処理ではここまでの状況にはなりません。でも、追い出し禁則処理で文字間を空ける場合は常にこの状況が発生します。つまり、読点の後ろはTFMグルーがあるため \kanjiskip が入らず文字間は空かないですが、読点の前には \kanjiskip が入るため文字間を空け調整に使われます。結果、読点の後ろより読点の前の方が間隔が空いてしまうのです。

では、この場合、次のように読点や括弧の前後を均等に空けて調整すればいいのでしょうか?

【約物の前後を均等に空けた図】

否。私は、次のように括弧の内側や読点の前は調整に使わないのがきれいと思います。

【括弧の内側などをベタ固定にした図】

JISの行組版方法でも、括弧の内側や句読点の前、クエスチョンマークの前などはベタ固定で調整に使わない規格になっています。つまり、括弧の内側などこそ \kanjiskip が入ってはいけない場所だということです。

TFMグルーで設定

TFMグルーのある所には \kanjiskip が入らない。ならば、\kanjiskip を入れないようにするにはTFMでグルーを設定すればいいということになります。つまり、「括弧の内側は通常ベタ、調整で伸びるときもベタ」という設定がTFM内に必要です。

なお、追い込み禁則処理などで文字間が縮む場合は、他の漢字間が縮むのに括弧の内側だけ縮まないと相対的に括弧の内側が他より空くことになって変です。従って、括弧の内側も \kanjiskip の縮み設定分に相当する分だけは縮むとしたいです。要は、まったく伸びないけど少しは縮むってことですね。

逆に、括弧の外側は、通常二分アキですが、縮むときにいくらまで調整できるという設定だけでなく、少しは伸びる設定も必要でしょう。

こんな細かい話は必要か

ここまでを読んで、「こんなに極端に文字が詰まったり広がったりする状況なんて通常は発生しないから、ここまで考えなくてもいいのでは?」と思った方もあるかもしれませんね。

確かにこの辺の話は、書籍系レイアウトの場合はあまり深く考えなくてもほぼ影響がない部分だと思います。でも、雑誌系レイアウトでは大きく影響するのです。

一般に、書籍は横書きなら1行が25〜45文字ぐらい、縦書きで1行が30〜50文字ぐらいあるのが普通ですが、雑誌は縦横とも1行が15〜25文字ぐらいが普通です。行が長いと調整できる箇所が多いので一文字あたりの調整量は少なくて済み、多少おかしな設定をしていてもほとんど目立ちません。でも、行が短い場合は一文字当たりの調整量が大きくなるので、設定の違いがモロに出るのです。

なお、これらの話以前の問題として、和文の組版では、一行の長さが文字サイズの整数倍になっているべきというのがあります。これがなっていないと、禁則文字が存在しなくても常に伸びが発生することになるので、こんな細かい話を考える以前の問題になります。

% plain TeXの場合
\hsize=16zw
% LaTeXの場合
\setlength{\textwidth}{16zw}

上記は1行を16文字にする場合の例です。このように行の長さはzw単位の整数値で指定しておきましょう。もちろん、LaTeXで段組にする場合は、段数を掛けて段間隔も足す必要があります。


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