マクロツイーター

はてダから移行した記事の表示が崩れてますが、そのうちに直せればいいのに(えっ)

和文フォントのスケールについての諸々

pLaTeX 系の和文フォントのスケールの値のまとめ。

エンジン文書クラス
+ パッケージ
TFM名(明/ゴ)原・横幅原・高さ原・深さ原・縦幅
NFSSスケール実・横幅実・高さ実・深さ実・縦幅
pLaTeXjarticle系
 (既定)
min10 / goth100.9622160.7775880.1388550.916443
1.0000000.962220.777590.138860.91644
jarticle系
 + otf
nmlminr-h / nmlgothr-h1.0000000.8800000.1200001.000000
0.9622160.962220.846750.115470.96222
jarticle系
 + minijs
jis / jisg0.9622160.7775880.1388550.916443
0.9610000.924690.747260.133440.88070
jsarticle系
 (既定)
jis / jisg0.9622160.7775880.1388550.916443
0.9610000.924690.747260.133440.88070
jsarticle系
 + otf
nmlminr-h / nmlgothr-h1.0000000.8800000.1200001.000000
0.9246900.924690.813730.110960.92469
upLaTeXujarticle系
 (既定)
upjisr-h / upjisg-h1.0000000.8800000.1200001.000000
0.9622160.962220.846750.115470.96222
ujarticle系
 + otf
upnmlminr-h / upnmlgothr-h1.0000000.8800000.1200001.000000
0.9622160.962220.846750.115470.96222
jsarticle系
 (既定)
upjisr-h / upjisg-h1.0000000.8800000.1200001.000000
0.9246900.924690.813730.110960.92469
jsarticle系
 + otf
upnmlminr-h / upnmlgothr-h1.0000000.8800000.1200001.000000
0.9246900.924690.813730.110960.92469
  • 文書クラスとパッケージはそれぞれの既定(オプションなし)の状態を表す。
  • 「TFM名(明/ゴ)」は当該の文書クラス(+パッケージ)において横組の明朝(\mcfamily)/ゴシック(\gtfamily)に既定で割り当てられている和文フォントの和文 TFM(JFM)の名前。((min10/goth10 は指定サイズが 5, 6, 7, 8, 9pt の時には代わりに min5 等が使われる。その他のフォントはサイズに依らず同じ TFM が使われる。ちなみに、明朝/ゴシックの和文ファミリ名は通常は mcgt であるが、otf パッケージ(noreplace 非指定)使用時は hmchgt に変わる。))
  • 「原・横幅/高さ/深さ/縦幅」は和文 TFM に記された各々の寸法の値を表す。*1単位は「指定サイズ」である。
  • 「NFSS スケール」は LaTeX 側(NFSS の \DeclareFontShape 命令)で指定されたスケールの値を表す。
  • 「実・横幅/高さ/深さ/縦幅」は「原・〜」の各々の値に「NFSS スケール」の値を乗じた値*2である。これにさらに「指定サイズ」を乗じたものが実際の寸法となる。
表の見方

1 つ例を挙げて表の見方を示す。

  • jsarticle の既定では、明朝体フォントに使われる和文 TFM(JFM)は jis である。
  • 指定サイズ 10pt において、jis の漢字は 9.62216pt の横幅をもつ。*3
  • LaTeX でフォントサイズを 10pt に設定した場合、((つまり、\fontsize{10}{...} とした場合。基底文字サイズが 10pt の場合は \normalsize でも 10pt になる。))実際には 9.61pt の jis が指定される。
  • 従って、前項の指定において、漢字は 9.2469pt の横幅をもつ。(これが 1zw の値となる。)*4
重要な値は 1 つだけ

この表をそのまま見ると物凄く複雑であるが、普通に (u)pLaTeX を使う範囲において有意義な値は実は「実・横幅」だけである。つまり次のことだけを知っていればよい。

  • jarticle 系では、漢字の幅(= 1zw)は指定サイズの 0.962216 倍になる。
  • jsarticle 系では、漢字の幅(= 1zw)は指定サイズの 0.92469 倍になる。*5

つまり「縦幅」の方の値は意味がないのである。その理由は「その値は間違っているから」である。

  • 「実際の日本語フォント」(ヒラギノIPAフォント・MSフォント等)では文字の「縦幅」は「横幅」と同じ寸法であり、かつ「高さ」と「深さ」の比が 88:12 になるように字形が造られている。*6
  • だから、min10 や jis の「縦幅」の値は実状と一致していない。「歴史的な事情」により不適切な値となっている。
  • ちなみに、「実・縦幅」に指定サイズを乗じたのが「1zh」の値である。pTeX の参考書で「zh は使用禁止」と述べられている理由は、この値が本来の意味を持っていないからである。(本来なら、1zh = 1zw であるはず。)

従って、min10 や jis を使っている(つまり pLaTeX でありかつ OTF パッケージ不使用)時には、「和文文字の縦幅」に依存する処理には注意する必要がある。TeX が認識している値が実状と合わないからである。例えば、和文文字を枠で囲って出力する場合に単純に \fbox を使うのでは垂直位置が合わない。(中央より少し上にずれる。)

\fbox{謹賀新年}

正しく中央に文字を置くには次のようにして縦幅を矯正する必要がある。

\fbox{\raisebox{0pt}[0.88zw][0.12zw]{謹賀新年}}

*1:「横幅」は QUAD、「縦幅」は XHEIGHT の値。「高さ」「深さ」は各文字の CHARHT と CHARDP の値で、表に挙げた全ての TFM についてこの値は全ての文字で同じになっている。

*2:有効数字 5 桁に丸めた。

*3:等幅なので仮名も英数字も同じ横幅であるが、一部の約物は異なる。

*4:なお、Word のテンプレートに合わせた形で文書クラスを設計している人は、「TeX の pt」と「Word のポイント(= bp)」の違いにも注意する必要がある。9.2469pt は 9.2123bp に相当する。

*5:minijs パッケージは「jsarticle 系と同じ和文フォント設定を与える」ためのものである。

*6:海外製の CJK なフォントでは 80:20 としているものも存在する。