そのフォントサイズほんとに9pt?―jsclassesのフォントサイズ指定について

いよいよもって冬らしくなってきたこの頃ですがTUTの皆さんはいかがお過ごしでしょうか。 TUT Advent Calendar 2017 6日目を担当する@akahana_1です。 普段はコンピュータクラブでコンテキストに多分に依存した雑談をしたり、年に非負整数回発行される部誌『とよぎぃ通信』の編集をしたりしています。

さて、学部4年生の方々はそろそろ卒論の提出(あるいはもうすでに終わっている?)や卒研発表等に追われる忙しい時期ですね。 中にはTeXを使って原稿を制作する人もいるでしょう。そういう原稿にはなぜだかフォントサイズの指定がなされていたります。 というわけで、そんな人達のために使える小話を一つ

結論

  • LaTeX + js~~で指定できるフォントサイズは基本的に欧文のもの、和文はそれに合わせてやや小さくなる
  • ただしいくつかの和文フォントサイズは指定可能
  • TeXのフォントサイズは他のソフトウェアのものよりやや小さくなるので、他のソフトウェアと完全に同じ出力を実現することはそのままでは難しい。

前フリ

LaTeXで日本語文章を作成する時に皆さんが使われるクラスファイルといえばjsの接頭辞で始まるクラスファイル群(以下jsclassesと呼ぶ)だと思います。 jsclassesではドキュメントクラスの読み込み時にクラスオプションを指定することで本文のフォントサイズを変更することが出来ます。 例えば、本文を9ptにしたいときは

\documentclass[a4paper, 9pt]{jsarticle}

と指定しますね。

ところでこの時指定される9ptって日本語の9ptですか?

というわけでちょっと確かめてみましょう。

次に示す二つの例は、それぞれpLaTeX(w/jsclasses)でフォントサイズに10ptを指定した時の出力結果と、Adobe Indesign CCでフォントサイズに10ptを指定した時の出力結果です。

f:id:akahana_1:20171206232458p:plain f:id:akahana_1:20171206232512p:plain

おや?よく見るとpLaTeXを用いた出力結果のほうがややフォントサイズが小さくなっていますね。 なんでこうなってるんでしょうか?

答えは単純です。なぜならば 『jsclassesで指定できるフォントサイズは欧文フォントのサイズで和文フォントのサイズではない』 からです。 どういうことなのか具体的に見ていきましょう。

jsclassesにおけるフォントサイズ決定について

さて、jsclassesにおけるフォントサイズ指定では欧文フォントのサイズが指定されるということを明らかにしましたが、だとしても疑問が残ります。

1 : 欧文フォントサイズの指定だったとして和文フォントのサイズはどうやって決定されるの?

2 : 和文フォントサイズを思い通りにする方法はないの?

あたりが定番じゃないでしょうか。 順を追って解説していきます。

まずはじめに、jsclassesでは指定された欧文フォントのサイズに対して和文フォントのサイズをやや小さくすると言う処理を行っています。 なぜ、そのようなことになっているのでしょうか?

皆さんご存知のことと思いますが、pLaTeXエンジンではフォントファイルをそのまま取り扱うことはしません。 代わりにtfm(TeX font metric)ファイルを参照して文字の幅を取得して、文字を配置していきます。 配置された文字が実際のフォントに置き換わるのはdviファイルをdviドライバによって変換したタイミングです。 このことから、TeXで日本語を取り扱うためにはまず日本語文字に対応するtfmファイルが必要なことがわかります。

そのようなtfmファイルとして作成されたものの一つがmin10.tfmです。これはpTeXのさらに前身である「アスキー日本語TeX」向けに作られたtfmファイルです。 そして、このtfmファイルに定義される10pt指定で出力されるフォントのサイズが9.62216ptとなっています。*1 TeXが取り扱う1ptの大きさは1/72.27inchですから*2 、9.62216 / 72.27 * 25.4 = 3.3818mmが実際に出力されるサイズとなっていました。 現在ではmin10.tfmファイルによるメトリックは用いられていませんが、jsclassesで用いられているjisフォントメトリックでも同様に10ptでは9.62216ptで出力されるようになっています。

さて、話がここで終われば単純ですが、まだ続きます。 和文組版では一般的にptの代わりに級(Q)という単位を使います。1Q=0.25mmとして定義されています。 jisフォントメトリックでは10ptの欧文に対して9.62216ptの和文となっていましたが、jsclassesではさらにこれを13Q相当に縮小して用いています。 ということは3.3818mm / 0.25mm = 13.527Qとなるので、13 / 13.527 = 0.961倍すればよいことになります。 よって、jsclassesでは標準設定となる10pt指定の和文フォントサイズは13Q、おおよそ9.24ptとなります。 これはTeXにおけるptの定義を用いているので、他のソフトウェアで用いられる定義の1/72inchを用いてptに換算すれば9.21ptということになります。

1.の解答は 「jsclassesでは欧文10ptに対して和文が0.962216 * 0.961 = 0.9247倍されたフォントサイズになる」

ということになります。 そして解説の中で明らかにしましたが、TeXのptは他のソフトウェアで扱うptよりもやや小さい」ということもわかります。 というわけで、フォント指定がなされているタイプの原稿を執筆する時に厳密に他のソフトウェアでの出力にTeXを追従させようとする試みはかなり難しいといえます。 ちなみに、タイトルで取り上げている9ptも同じように換算してみると10pt * 0.913 * 0.9247 = 8.4425ptとなります。 クラスオプションで9ptを指定したつもりが本文の和文は8ptのほうが近い値で組まれることになってしまいますね。

おや?今9ptの換算をしたつもりなのに、なぜか10ptを元にして計算を行い謎の係数を乗じてますね。この謎については後で答えることにして、次の疑問を解決します。

jsclassesでクラスオプションに指定したフォントサイズは欧文のフォントサイズを指すことがわかり、それに比べて和文のフォントサイズはやや小さくなるということがわかりました。 では、和文のフォントサイズを指定してしまう方法はないのでしょうか。

これについてもjsclassesのクラスオプションに用意されています。 具体的には次のフォントサイズで和文を出力するように設定することが可能です。

  • pt指定のもの
    • 10ptj
    • 10.5ptj
    • 11ptj
    • 12ptj
  • 級数指定のもの
    • 12Q
    • 14Q

これらのフォントサイズについては和文のフォントサイズを指定することになります。この時、和文のフォントサイズに合わせて先ほどとは反対に欧文のフォントサイズがやや大きくなります。 というわけで2.の解答は

「一部のフォントサイズであれば和文のフォントサイズを指定することができる」

となります。 あっさりしたものですね。

ただし、まだ一つだけ疑問が残っています。 先程、和文フォントサイズが欧文フォントサイズに対してやや小さくなると言う説明をして、9ptでも換算してみた時に登場した謎の係数0.913は一体何なのでしょうか。 そして、tfmファイルには文字の幅が記録されていると言いましたが、そのままだと複数のフォントサイズ向けに複数のtfmファイルを用意する必要があるように見えます。 ところがjisフォントメトリックを用いる時に利用するtfmファイルは二つだけ(jis.tfmおよびjisg.tfm)です。 どうやって様々なフォントサイズを実現しているのでしょうか。

というわけで3つ目の疑問はこれです。

3 : pLaTeX + jsclassesにおいて複数のフォントサイズの切り替えをどうやって実現しているのか

先に結論だけを言うと組版時に用紙サイズを任意に拡大(縮小)してから10ptで組版を行い、それを元の用紙サイズになるように縮小(拡大)して指定のフォントサイズを実現します」

どういうことなのか、詳しく説明します。 jis.tfmおよびjisg.tfmに記載されているフォントメトリックは10pt指定時のものです。このままでは他のフォントサイズを取り扱うことが出来ません。 しかし、現実にはそのような複数のフォントサイズを取り扱う需要があるわけです。 この解決方法はふたつ考えられます。

  • フォントサイズごとに異なるフォントメトリックを用意する
  • フォントメトリックを固定して何らかの方法でフォントサイズを実現する

前者の方法はjisメトリックの前身であるmin10を始めとするフォントメトリックで用いられていた方法です。 しかしjisメトリックを利用するjsclassesでは後者の何とかする方法を採用します。

これを実現するのがTeXプリミティブとして用意されている\mag命令です。この命令は引数に取る数値の1000分率の割合で組版を行う版面を拡大します。 つまり\mag 1414と書かれていれば、版面が1.414倍拡大された状態になります。そしてjsclassesではこれを利用して10pt設定のフォントメトリックを用いて所望のフォントサイズを得ています。 このような組版を行っているのは世界広しといえどもjsclassesくらいのものなようです。

というわけで先程の換算で出現した0.913と言う謎の係数はこの\magにおける拡大率になります。 そしてこの\magにおける拡大縮小はすべてのフォントサイズ指定に関わってきます。

次の画像を見てください。 どちらもソースファイルのプリアンブルを除くと同じ

\begin{document}
\section{これがLargeサイズ}
Windowsでコンピューターの世界が広がります
\end{document}

です。

f:id:akahana_1:20171206233447p:plain f:id:akahana_1:20171206233459p:plain

見比べると下の画像のほうが上の画像よりも全体的にフォントサイズが大きくなっていることがわかりますね。 というのも上の画像ではプリアンブルが

\documentclass[a4paper, 9pt]{jsarticle}

なのに対して、下の画像ではプリアンブルが

\documentclass[a4paper, 10pt]{jsarticle}

となっているためです。

つまり\magによる版面拡大縮小の影響は本文フォント以外のフォントも影響を受けます。 TeXとフォントサイズの変更で検索すると本文フォントに対して\Largeなどが何ptであるか記載されている例がありますが、あくまでも欧文10ptの時に他のフォントサイズ指定が欧文でどのptに相当するかを書いているだけであって、jsclassesのクラスオプションでフォントサイズを変更した場合は連動して変わりうるということです。

まとめ

卒論や修論、あるいは発表予稿などを書く時に役に立つかもしれないTeXの豆知識について書いてみました。 \magの解説についてはかなり怪しい部分があると思うので、詳細な動作を知っている方がいらっしゃいましたら教えていただけると幸いです。 それでは皆様よきTeXライフを。

また、僕も編集に関わっている豊橋技術科学大学コンピュータクラブ部誌『とよぎぃ通信』が冬のコミックマーケット93で頒布される予定です。 C93初日東ク-34aで皆様をお待ちしています。

さて、明日は@_Nnwww氏の音楽についての記事です。氏は現代音楽が好みであることを存じているので、どんな飛び道具がやってくるのか期待しています。

参考文献

*1:10ptは欧文における標準のフォントサイズです

*2:ちなみにPostScriptの1ポイントは1/72inchです。このことからもTeXのptのほうがそれ以外のソフトでの出力よりやや小さくなることがわかります。