長体・平体

長体・平体とは

和文の文字は基本的に正方形ですが、これを縦横異なる比率で拡大縮小して使うことがあります。文字が縦に長い場合を長体、横に長い場合を平体と呼びます。昔のワープロで横に2倍に拡大した「倍角」という文字を使うことがありましたが、これは平体の一種ですね。長体でも平体でもない通常の状態は正体と呼ばれます。

【長体と平体の例】

長体や平体は、見出しなどで効果として使う場合が多いですが、本文で使う場合もあります。例えば、大抵の新聞は少し平体で組まれています。縦書きで平体 (横書きなら長体) を使うと、文字を大きく見せながら1行に多くの文字を詰め込めます。もちろん、やり過ぎると読みにくいだけですが。

逆に、縦書きで文字を横方向に縮小して長体にすると (同様に横書きでは平体にすると)、元の状態より行間が空くことになります。行間が詰まっていると文章が読みにくくなりますが、行数が決まっていて行間が空けられないような場合に、こうやって文字の大きさを確保したまま仮想的に行間を空けることもできます。

LaTeXでは…

では、TeXで長体・平体を作ってみましょう。以下、横書きの横方向や縦書きの縦方向、つまり行内で字が進む方向を「字送り方向」と呼び、横書きの縦方向や縦書きの横方向、つまりページ内で行が増えていく方向を「行送り方向」と呼ぶことにします。

LaTeX2eでは、graphicパッケージにある \scalebox 命令を使うと、文字を自由に縦横に拡大縮小できます。この命令を使う場合、プリアンブルに、

\usepackage{graphicx}

などと書いておく必要があります。あとは、

\scalebox{0.9}[1]{長体}
\scalebox{1}[0.9]{平体}

このように「\scalebox{字送り方向拡大率}[行送り方向拡大率]{文字列}」で縦横異なる比率で拡大縮小できます。但し、縦横で比率を指定するのではなく、字送り方向・行送り方向で指定するので、「\scalebox{0.9}[1]」という命令は横書きでは長体、縦書きでは平体になります。

plain TeXでも…

graphicパッケージは基本的にLaTeX2e用ですが、最近のteTeXパッケージ (pTeX 3.1.xぐらいとか) では、plain TeXでgraphicパッケージを使うマクロも自動的にインストールされます。この場合、ファイルの先頭などに、

\input graphicx.tex

などと書いておくと、LaTeX同様に \scalebox 命令が使えます。

本文では…

見出しなどでは上述の \scalebox 命令で事足りますが、この命令は単にPostscriptのscale命令を呼び出しているだけなので、行組み (複数行にまたがる処理) ができません。本文を長体や平体で組みたい場合は、以前の「「リュウミンL」従属欧文の問題点」の回で出てきたdvipsのExtendFont機能を使うといいでしょう。

但し、普通に正体で組んでDVIを作り、その後単純にpsfonts.map内でExtendFontを指定しただけでは、縦書きはいいのですが、横書きで失敗します。

【単純にExtendFontを使っただけの例】

このように、組み終わった後の各文字をそれぞれその位置のままで横方向に拡大縮小するのがExtendFont機能なので、長体の場合は横縮小ですき間が空き、平体の場合は横拡大で文字が重なるのです。なお縦書きでは、横方向に拡大縮小しても行間さえきちんと取っていれば何の問題も起こりません。

解決方法

この問題を解決するには、仮想フォント(VF)で対処する方法が考えられます。まず、TeXで組む際に字送り方向の長さを指定して正体で組みます。これをVFで、ExtendFontの倍率の逆数倍に変換し、その後ExtendFont機能を使うとうまく収まります。

例えば、横方向を50% に縮小した長体にしたかったら、あらかじめ50% のサイズの文字で組んでDVIを作り、VFで各文字をそれぞれの位置で2倍の文字サイズに変換し、その後0.5 ExtendFontを指定して横方向に50% 縮小すればいいわけです。

もう1つの方法があります。長体や平体のTFMを作ってしまうのです。これなら、そのTFMを使ってそのまま組んでいくだけです。後々の流用性を考えると、こちらの方がいいでしょう。

TFM作成方針

さて、和文の文字は正方形イメージなので、文字サイズとは文字の縦の長さでもあり横の長さでもありました。しかし、長体や平体では縦横の長さが異なります。このどちらを文字サイズと考えればいいのでしょうか? 要するに「10ptの長体」と指定されたら、縦横どちらを10ptにすべきかということです。

●長い方の辺の長さを文字サイズと考える

伝統的な写植の文字指定がこの考え方のようです。そして、短い方の辺を90% に縮小したものを「長体1」「平体1」などと言います。80% に縮小したら「長体2」「平体2」です。つまり、「13級長体1」は縦13級で横11.7級、「13級平体1」は縦11.7級で横13級となります。

●縦の長さを文字サイズと考える

dvipsのExtendFont命令は、縦の長さをそのままで横にだけ拡大縮小するという命令です。従って、この命令の仕様に合わせるなら、文字の縦の長さを文字サイズの基準と考えることになります。

●字送り方向の長さを文字サイズと考える

各文字の字送り方向の長さを変えると1行に収まる文字数が変わり組版が大きく変化しますが、行送り方向の長さを少々変えても行間で吸収されて影響が出ません。つまり、和文ベタ組みでは字送り方向の長さこそが重要で、こちらを基準にすべきと考えられます。

●行送り方向の長さを文字サイズと考える

和文と欧文を混ぜて組む場合、欧文は元々各文字幅がバラバラなため、字送り方向の長さが和文と欧文で少々違っても問題ありませんが、行送り方向の長さが和文と欧文で合っていないとバランスが悪いです。和欧バランスを合わせることを考えれば、行送り方向の長さを基準にすべきとなるでしょう。

つまり、いろんな考え方ができるので、縦横どちらを基準にしたら最適かは状況によって変わるということです。もう面倒なので、両方のパターンでTFMを作ってしまいましょう(笑)。

用意するTFM

というわけで、例えば、

Y-J800-shingo-l.tfm
横書きで字送り方向を80% 縮小したもの。
Y-G800-shingo-l.tfm
横書きで行送り方向を80% 縮小したもの。

という感じの名前でTFMを用意することにします。J, Gはそれぞれ「字送り」「行送り」の頭文字を取りました。J900やG1250など拡大縮小する側の方向とその比率(千分率)を名前に含めることにします。

例えばY-J800-* のフォントで10ptを指定すると、行送り方向 (この場合、縦) が指定サイズの10pt、字送り方向 (この場合、横) が縮小された8ptになります。Y-G800-* なら逆です。縦書き用のT-J* やT-G* も同様に考え、拡大縮小する側の頭文字を名前に付けることにしましょう。

なお、欧文は正方形イメージではないし各文字幅がバラバラなので、字送り方向の長さの方を指定することはあまり意味がないと思われます。従って、R-G* (従属欧文で行送り方向を拡大縮小) のTFMを用意する必要はなく、R-J* だけでいいでしょう。……って、本当はR-G* には欧文VFを用意しないとならないので面倒だからというのがあるけど(笑)。

さてここで、例えばT-J800の10ptとT-G1250の8ptは、まったく同じ意味になることがわかります。一般に「固定長の行に指定文字数を入れたい」といった場合には字送り方向の長さを指定したいですからG (行送り方向を拡大縮小) で指定し、「同じサイズ指定で欧文と高さを揃えたい」といった場合には行送り方向の長さを指定したいですからJ (字送り方向を拡大縮小) で指定した方が楽だと思います。マクロで変換する手もあるでしょうが、両方のTFMを用意しておけば好きな方で指定できます。

長体・平体TFMを作ろう

以前の「文字組空き量設定とTFMファイルの作成」の回で作ったmakenewjis.plスクリプトは、ソースを見た人はわかったでしょうが、実は長体・平体TFMを作る機能も含まれていました(笑)。

./makenewjis.pl -j800
./makenewjis.pl -g800

という風にスクリプトの引数として、字送り方向を拡大縮小するか (-j)、行送り方向を拡大縮小するか (-g) と、その拡大縮小率 (千分率) を指定します。引数が「-j800」ならynewjis-j800.plとtnewjis-j800.plが、「-g800」ならynewjis-g800.plとtnewjis-g800.plが作成されます。引数を指定しなかった場合は、前に作ったように正体のynewjis.plとtnewjis.plができます。

次にこれらをpltotfでTFMにし、例えば「新ゴL」で使いたければ、

ln ynewjis-j800.tfm Y-J800-shingo-l.tfm
ln ynewjis-g800.tfm Y-G800-shingo-l.tfm
ln tnewjis-j800.tfm T-J800-shingo-l.tfm
ln tnewjis-g800.tfm T-G800-shingo-l.tfm

などとリンクしてTFMを作成します。もちろん、コピーでも構いません。次に、

makejvf -C Y-J800-shingo-l H800-shingo-l
makejvf -C Y-G800-shingo-l H1250-shingo-l
makejvf T-J800-shingo-l V1250-shingo-l
makejvf T-G800-shingo-l V800-shingo-l

と、makejvfコマンドでVFを作ります。ExtendFont命令は縦方向が指定サイズで横方向が拡大縮小と決まっていますから、例えば「10ptのY-J800」なら「10ptの0.8 ExtendFont」で実現できますが、「10ptのY-G800」なら「8ptの1.25 ExtendFont」に変換しないとなりません。この変換をVFで行ないます。従ってY-G* やT-J* は、その逆数と対応させないとならないことに注意して下さい。この場合、0.8 (千分率800) の逆数で1.25 (千分率1250) になります。

また、makejvfの -Cオプションは1zw (字送り方向長さ) の代わりに1zh (行送り方向長さ) を基準にして文字サイズを計算するオプションです。従って、ExtendFont命令との絡みから考えて、横書きの場合は -Cオプションが必須で、縦書きの場合は -Cオプションを付けてはならないことになります。なお、バージョンの古いmakejvfでは -Cオプションがないので、必ずver 1.1以降を使って下さい。

その後、dvipsのpsfonts.mapに、

H800-shingo-l ShinGo-Light-H "0.8 ExtendFont "
H1250-shingo-l ShinGo-Light-H "1.25 ExtendFont "
V800-shingo-l ShinGo-Light-V "0.8 ExtendFont "
V1250-shingo-l ShinGo-Light-V "1.25 ExtendFont "

などと、フォント名と拡大縮小率を設定すればOKです。もちろん、dvipsを -SJISで動かしている場合はRKSJ系のフォントを指定して下さい。

写植の「長体1」「長体2」「平体1」「平体2」相当をあらかじめTFMで用意しておくなら、900, 800, 1111, 1250 (すべて千分率) のExtendFontを用意すればいいですね。5% 変形の950と1053なども用意しておくと使えるかもしれません。見出し等は \scalebox 命令が使えますので、これらを用意するのは本文用フォントだけで充分です。比率も本文で使いそうな比率だけでOKです (通常、本文で20% を越える変形はしません)。

従属欧文は…

従属欧文も同じ比率で長体・平体にする場合は、PLファイルの横方向の長さすべてにExtendFontで指定する比率を掛けていけばいいです。

#!/usr/bin/perl
$ext = $ARGV[0] / 1000.;
while (<STDIN>) {
 unless (/DESIGNSIZE|SLANT|XHEIGHT|CHARHT|CHARDP/) {
  s/\s+R\s+([\+\-]?\d*\.?\d*)\)/sprintf(" R %f)", $1 * $ext)/eo;
 }
 print;
}

例えば、こんなスクリプトをextendroman.plという名前で実行可能にしたなら、コマンドラインから、

./extendroman.pl 800 < R-shingo-l.pl > R-J800-shingo-l.pl

こんな感じで、横80% 縮小の従属欧文PLに変換できます。これをpltotfでTFMにし、psfonts.mapには、

R-J800-shingo-l ShinGo-Light-83pv-RKSJ-H "0.8 ExtendFont "

と書いておくといいです。

使い方

例えば前回の「より具体的なフォント指定」の回の \setfont 命令を使って、

\setfont{J800-shingo-l}{10pt}

とフォント指定した場合、縦書きなら縦が8ptで横が10ptの平体、横書きなら縦が10ptで横が8ptの長体になります。\setfont 命令は縦・横・欧文を同時に指定するので、欧文にGがないことを考えると、J側しか指定できません。G側の和文を指定するには、

\setfont[R-J1250-shingo-l][0.8]{G800-shingo-l}{10pt}

というように、欧文を別に指定する必要があります。

なお、今回の話はdvips限定のような対処法になってしまいましたが、他のソフトを使う場合はまた別に対応を考えないとならないと思います。


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