つーさにブログ

つうさにのメモ用ブログ

TeXの1em

TeXの1emがMの横幅と説明されていることについて。

TeXの1emとは何だ?

調べるきっかけ

LaTeXのlistingsパッケージでbasicstyle=\ttfamilyに設定して利用したとき、文字の幅がいい感じにならなかった。そこでbasewidthをちょうどいい値に設定するために、1emを使えばいいんじゃないかと思ったことから1

いくつかの記事では1emはM(大文字のm)の横幅と同じと書いている。1emがそのフォントにおけるMの横幅だとしたら、等幅なタイプライタ体ならbasewidth=1emって書けばいい感じになるはずと思ったら、めっちゃ隙間が空いてわけわからんになった。

1emとは何なのかを調べる。

ググった

tex.stackexchange.com

上の記事を見つけた。 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って何なのか気になった。

さらにググった

tex.stackexchange.com

上の記事を見つけた。quadとは伝統的な組版用語らしい(イタリア語のquadratone(big spaceの意)からきてるとのこと)。そしてこれが、普通Mの横幅、縦幅と同じものらしい。

en.wikipedia.org

WikipediaにQuadの説明があった。Quadとは活版印刷のときのスペーサーで、現在では組版の手法によらず、スペース2個分のサイズの用語となっているとのこと(意味はQuadratからきているとのこと(?))。

ということで、TeXにおいて1emはquadの横幅であるが、活版印刷でのquadはMの横幅(が普通)であるから、TeXの1emはMの横幅と書く記事があるのだろうという感じだった。よくよく検索してみると、1emはMの横幅とほぼ等しいと言ってるWebページもいくつかあった。

TFMを見てみる

実際に1emがMの横幅と等しくないことを確かめるために、TFMを見てみる。TFMはバイナリファイルでありプレーンテキストではないが、tftoplを使えばヒューマンリーダブルなものに出力するすることができる。

tftoplTeX 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はプロパティリストの意味らしい)。

f:id:tsuu_mmj:20191217000511p:plain
tftopl $(kpsewhich cmtt10.tfm) した結果の一部

よく見ると、上で貼ったこのページで見た\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)して見てみる。

f:id:tsuu_mmj:20191217003525p:plain
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の横幅である。

参考

今回調べるに当たって、以下の記事が非常に参考になりました。圧倒的感謝。

zrbabbler.hatenablog.com

他にも様々なWeb上の記事が参考になりました。感謝。

追記

www.morisawa.co.jp

quadというのは、日本の組版用語ではクワタと言うらしい。

LaTeXを使ったことはあっても、伝統的な組版というのがどんなものか全然想像つかなかったが、上のページではそれを知ることができた。


  1. listingsパッケージのいい感じな設定ついては別の記事で説明する。