TeXの1em
TeXの1emがMの横幅と説明されていることについて。
TeXの1emとは何だ?
調べるきっかけ
LaTeXのlistingsパッケージでbasicstyle=\ttfamily
に設定して利用したとき、文字の幅がいい感じにならなかった。そこでbasewidth
をちょうどいい値に設定するために、1emを使えばいいんじゃないかと思ったことから1。
いくつかの記事では1emはM(大文字のm)の横幅と同じと書いている。1emがそのフォントにおけるMの横幅だとしたら、等幅なタイプライタ体ならbasewidth=1em
って書けばいい感じになるはずと思ったら、めっちゃ隙間が空いてわけわからんになった。
1emとは何なのかを調べる。
ググった
上の記事を見つけた。 1つ目の解答のリンク(https://tex.stackexchange.com/questions/88991/what-do-different-fontdimennum-mean/88993#88993)を見てみると、1emというのはquad-width、つまり\quad
の横幅らしい。LaTeXのソース(latex.ltx)を見てみたら確かに\def\quad{\hskip1em\relax}
と書いてあった。
どうして\quad
の横幅なのにMの横幅って説明をしている記事があるのか、というかquadって何なのか気になった。
さらにググった
上の記事を見つけた。quadとは伝統的な組版用語らしい(イタリア語のquadratone(big spaceの意)からきてるとのこと)。そしてこれが、普通Mの横幅、縦幅と同じものらしい。
WikipediaにQuadの説明があった。Quadとは活版印刷のときのスペーサーで、現在では組版の手法によらず、スペース2個分のサイズの用語となっているとのこと(意味はQuadratからきているとのこと(?))。
ということで、TeXにおいて1emはquadの横幅であるが、活版印刷でのquadはMの横幅(が普通)であるから、TeXの1emはMの横幅と書く記事があるのだろうという感じだった。よくよく検索してみると、1emはMの横幅とほぼ等しいと言ってるWebページもいくつかあった。
TFMを見てみる
実際に1emがMの横幅と等しくないことを確かめるために、TFMを見てみる。TFMはバイナリファイルでありプレーンテキストではないが、tftopl
を使えばヒューマンリーダブルなものに出力するすることができる。
tftopl
はTeX Liveに収録されている。これを使って、LaTeXのデフォルトの\ttdefault
であるcmtt(コンピュータモダンのタイプライタ体)や、psnfssパッケージで使えるpcr(Courierのクローン書体)などのTFMを見てみる。
cmtt(コンピュータモダンのタイプライタ体)
まず、\ttdefault
がファミリ名cmttとなっている状態で、\ttfamily
マクロ後の文にどのTFMが使われているのかを調べる(ファミリ名からTFMを調べる)。フォントエンコーディングがデフォルトのOT1のときについてはtexmf-dist/tex/latex/base/ot1cmtt.fd
を見れば、cmtt10.tfmが使われることがわかる(自分も詳しくわかってないのでfdファイルの説明は省きます)。
ということで、tftopl $(kpsewhich cmtt10.tfm)
するとTFMがヒューマンリーダブルな形式になって端末に出力される。形式はS式っぽいものである(tftopl.webによると、plはプロパティリストの意味らしい)。
よく見ると、上で貼ったこのページで見た\fontdimen<num>
というのと明らかに関係がありそうな、FONTDIMENが先頭のリストがある。しかもanswerで説明されてるパラメータと同じ順にプロパティがある(slant、space、stretch...の順)。quadはFONTDIMENの一要素となっていて、TFMにこれが書かれているということは1emの大きさはTFM(現在利用している書体)ごとのようだ。
FONTDIMENの中には(QUAD R 1.049991)
というリストがある。また、後ろでズラーと並んでいる(CHARACTER ...)
なリストには全て(CHARWD R 0.524996)
というリストが含まれている(cmtt10は等幅フォントであり、全ての文字で横幅が一緒なためだと思われる)。1.049991
という数値が1emの大きさで、0.524996
という数値が文字の横幅なので、両者は等しくない。つまり、cmtt10.tfmでは1emはMの横幅ではないということになる。
これらの数値が一体何なのかと思って、以下のようなLaTeXファイルをpdflatexで処理すると、5.24995ptと出力された。つまり、0.524996
のような数値はほぼ1/10ptの値のようだ。そうだとすると、cmtt10.tfmにおいて、1emはほぼ10.49991ptということになる。(なぜ1/10なのかは、出力に書かれている(DESIGNSIZE R 10.0)
が関係してそうだが、さっぱりである)
\documentclass{article} \begin{document} {\ttfamily \the\fontcharwd\font`M} \end{document}
pcr (Courierのクローン)
psnfssパッケージに含まれるタイプライタ体pcrについても調べる。kpsewhich ot1pcr.fd
にあるファイルから、pcrr7t.tfmが普通で使われるTFMだとわかる。これもtftopl $(kpsewhich pcrr7t.tfm)
して見てみる。
pcrでは、FONTDIMENに(QUAD R 1.0)
、CHARACTER C M(文字Mについてのリスト)には(CHARWD R 0.6)
となっていた。
ということで、pcrでは1emの大きさがほぼ10pt、Mの横幅がほぼ6ptであり、これまた1emはMの横幅ではないことがわかった。
cmr(コンピュータモダンのラテン体)とかptm(Timesのクローン)とか
ラテン体では1emの大きさがMの横幅とと同じなのでは?と思ったがcmr10.tfm(コンピュータモダンのラテン体)を見ても、ptmr7t.tfm(Timesのクローン書体)を見ても、1emの大きさ(QUADの値)とMの横幅は同じではなかった。
結論
TeXの1emはMの横幅ではなく、quadの横幅である。
参考
今回調べるに当たって、以下の記事が非常に参考になりました。圧倒的感謝。
他にも様々なWeb上の記事が参考になりました。感謝。
追記
quadというのは、日本の組版用語ではクワタと言うらしい。
LaTeXを使ったことはあっても、伝統的な組版というのがどんなものか全然想像つかなかったが、上のページではそれを知ることができた。
-
listingsパッケージのいい感じな設定ついては別の記事で説明する。↩