マイクロタイポグラフィー(microtype)

同じ原稿を 2 回組んでみます。11pt の article、行長 180pt、lipsum の段落 100 本。microtype 無しでは 1731 行 になり、オーバーフルボックスが 117 個 出ました。プリアンブルに \usepackage{microtype} を 1 行足すと、1702 行オーバーフルは 6 個。マイクロタイポグラフィとは、句読点を髪一本ぶん余白へ出し、字幅を 1 パーセント未満だけ伸び縮みさせる——それだけの技術です。このページでは LaTeX の microtype が実際に何をしているのか、突き出し(protrusion)と伸縮(expansion)とトラッキングを、測った数字と一緒に見ていきます。

microtype は何をしているのか

microtype そのものは組版をしません。pdfTeX が導入し、のちに LuaTeX と XeTeX に一部が広がったマイクロタイポグラフィ機能への、統一された LaTeX インターフェース です。作者は R. Schlicht。中心にあるのは 文字の突き出し(protrusion、別名 margin kerning)フォントの伸縮(font expansion) の二つで、これに トラッキング(letterspacing)、合字の無効化、語間スペースと追加カーニングの調整が続きます。突き出しと伸縮は、そのエンジンで安全に動くと判断できれば 既定で有効 になります。

この 2 機能の出どころははっきりしています。Hàn Thế Thành が 2000 年にブルノのマサリク大学へ提出した学位論文「Micro-typographic extensions to the TeX typesetting system」——TUGboat 第 21 巻 4 号 317–434 ページとして公刊——で pdfTeX に実装されたものです。同じ論文が margin kerning を「機械的に揃えた行端は目にはむしろ不揃いに見えるので、視覚的に揃えるために必要になる」と説明し、font expansion を「ゆるい行では幅広の異体を、詰まった行では幅狭の異体を使って語間の伸縮量を減らす方法」と定義しています。つまり microtype が実装しているのは、人間の目が行端をどう錯覚するか という観察から出発した仕組みです。

ひとつ範囲を確認しておくと、これらは 欧文(ラテン文字) に対する仕上げです。和文には突き出しや伸縮とは別の組版モデル——行頭・行末の禁則、和文と欧文のあいだのスペース——があり、luatexja などが受け持ちます。microtype を読み込んでも和文の体裁は変わりません。合字やカーニングといった、より基本的な欧文の自動処理については姉妹ページに譲ります。

microtype の効果はどれくらいか — 実測

狭い行長ほど効きます。TeX Live 2024、11pt の article、\usepackage[T1]{fontenc}、行長 180pt(二段組の 1 段に近い幅)で lipsum の段落 100 本を組み、行数と Overfull \hbox の件数を数えました。結果は下の表のとおりで、microtype を足すと総行数は 1731 → 1702(−1.7 %)、はみ出しは 117 → 6 になりました。同じ測定を 345pt(a4paper の article の本文幅に近い)で行うと差は縮まり、921 → 909 行(−1.3 %)。効果はゼロではありませんが、「劇的に短くなる」わけでもありません。

設定総行数(180pt 幅・100 段落)Overfull hbox の件数
(package not loaded)1731117
expansion=false1718(突き出しだけ)102
protrusion=false1711(伸縮だけ)9
\usepackage{microtype}1702(両方・既定)6

この分解が教えるのは、二つの機能の仕事が違う ということです。行数をいちばん削るのは伸縮(1731 → 1711)ですが、突き出しも 13 行ぶん寄与しています。一方 オーバーフルボックスを潰しているのはほぼ伸縮の単独仕事 で、117 個が 9 個まで落ちます。突き出しだけでは 102 個までしか減りません。行が 1 行はみ出して困っているなら伸縮が効き、行端がガタついて見えるのが不満なら突き出しが効く——そう覚えておくと、どちらを切るか迷ったときの判断がつきます。なお microtype を入れると \pdfprotrudechars\pdfadjustspacing がどちらも 2 になります(無しではどちらも 0)。効いているかどうかはこの 2 つを \the で覗けば確認できます。

文字の突き出し(protrusion)— 目の錯覚を打ち消す

突き出し(protrusion、margin kerning) は、行頭・行末の文字をほんのわずかにマージンの外へはみ出させる機能です。狙いは錯覚の打ち消しにあります。ピリオドやカンマ、ハイフン、あるいは oAv のように 丸い・傾いた輪郭 を持つ字を行端にぴったり揃えると、その字の左右の空きぶん、行端が内側に へこんで見えます。少しだけ外へ出してやると、行端は 視覚的に まっすぐ揃います。突き出す量は字ごとに違い、句読点は大きく、丸い文字は小さく、H のような直線の字はゼロ——という設定ファイルがフォントごとに用意されています。

突き出し量をまとめて増減したいときは factor オプションを使います(factor=1100 なら既定の 1.1 倍)。また突き出しは、TeX から見て「マージン」に当たらない場所——itemize の項目や tabular のセルの端——では働きません。そこを揃えたいときのために \leftprotrusion\rightprotrusion が用意されていて、その位置の最初/最後の字を、通常のマージンにいるかのように突き出させられます。表の左端に括弧やクォートが並ぶ表では、これを入れるだけで見え方が変わります。

フォントの伸縮(expansion)— 語間の仕事を字幅に肩代わりさせる

伸縮(font expansion) は、各行の字形を横方向にごく僅か——ふつうコンマ数パーセントから数パーセント——引き伸ばしたり詰めたりして、行幅を合わせる機能です。両端揃えでは本来、行幅は 語間(interword glue) の伸び縮みだけで作ります。その仕事の一部を字幅そのものに肩代わりさせれば、語間の変動が小さくて済み、行ごとの空きのばらつきが減って段落全体の濃淡(タイポグラフィでいう「色」)が均一になります。上の実測でオーバーフルボックスを 117 個から 9 個まで落としたのは、この機能です。伸縮の上限は stretch / shrink、刻みは step で調整できますが、既定のままでまず問題ありません。

ここに一つ、動かしがたい制約があります。伸縮は pdfTeX と LuaTeX でしか使えず、XeTeX では使えません。 何もオプションを付けずに XeLaTeX で microtype を読み込むぶんにはエラーになりません——パッケージが安全に動く機能だけを有効にするので、突き出しとトラッキングは効き、伸縮だけが静かに切られます。しかし \usepackage[expansion=true]{microtype} と明示すると、次のエラーで止まります。

log
$ xelatex xe.tex
! Package microtype Error: Font expansion does not work with xetex.

See the microtype package documentation for explanation.

% The reason is one missing primitive. Asking each engine directly:
%   pdftex : has \efcode, has \lpcode
%   xetex  : NO \efcode, has \lpcode
%   luatex : has \efcode, has \lpcode
% XeTeX can shift glyphs into the margin, but it cannot scale their widths.

理由はエンジンのプリミティブ 1 個の有無に還元できます。突き出しに使う \lpcode / \rpcode(左右の突き出し量)は三つのエンジンすべてが持っていますが、伸縮に使う \efcode は XeTeX に存在しません(pdfTeX と LuaTeX にはあります)。つまり XeTeX は字を余白へずらすことはできても、字幅そのものを拡大縮小する術を持たないわけです。XeTeX で伸縮まで含めた仕上げが欲しいなら、LuaTeX へ移行するのが筋の通った選択になります。

トラッキング(\textls)— ハイフネーションを壊さない字間空け

トラッキング(tracking)/レタースペーシング(letterspacing) は、文字の間隔を均等に広げる調整です。microtype のそれが優れているのは、字と字のあいだに空きを差し込むのではなく フォント側の字幅を広げたコピーを作って使う 点にあります。だから語はひとつながりのままで、ハイフネーションが壊れません。語の途中に \kern を手で撒く古典的なやり方では、その語が二度と行末で割れなくなります。その場かぎりの字間空けには \textls{...} を、そこから先の文字すべてに掛けるには \lsstyle を使い、後者はグループの終わりまで有効です。見出しのように前後に余分なカーニングを足したくない場合は星付きの \textls*{...} が便利です。

document.tex
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{microtype}
% Space out small caps by 40/1000 em wherever they appear
\SetTracking{encoding = *, shape = sc}{40}
\begin{document}
\textsc{Small Caps}, and an ad-hoc \textls[200]{wide run of letters}.

% \lsstyle stays on until the end of the group
{\lsstyle everything here is letterspaced}

% The starred form adds no kerning before or after - good for headings
\section*{\textls*{Chapter Title}}
\end{document}

空ける量は 1000 分率で、microtype のマニュアルによれば既定は 100/1000 em = 0.1 em\textls[200]{...} のように省略可能引数で個別に指定でき、フォント集合に対してまとめるなら \SetTracking{encoding=*, shape=sc}{40} のようにプリアンブルで宣言します(この例はスモールキャップスを 40/1000 空ける指定)。ここで注意が要ります——マニュアル自身が、小文字の字間空けは「忌み嫌われている」 と書き、「何をしているか分かっているのでなければ、大文字かスモールキャップスだけを字間空けすべきだ」と釘を刺しています。トラッキングは pdfTeX と LuaTeX で使えます(microtype の README がバージョン条件まで明記しています)。plain TeX でも使いたい場合は、レタースペーシングだけを取り出した letterspace パッケージがあります。

合字を切る・語間を触る — \DisableLigatures と kerning / spacing

合字を切りたい場面は限られていますが、来たときは切実です。コードを示す文で -- が en ダッシュに合成されてしまう、といった場合です。\DisableLigatures はフォント集合を指定して合字を無効化します——\DisableLigatures{encoding = T1, family = tt*} なら T1 のタイプライタ体だけ。ただし フォントの全合字を無効化すると、そのフォントのカーニングも同時に切れます(マニュアルが明記しています)。合字を始める文字を省略可能引数に並べれば、\DisableLigatures[?,!]{encoding = T1} のように狙った合字だけを止められます。この命令は プリアンブルでのみ、しかも 1 度だけ 使えます。

kerningspacing のオプションは、それぞれ 追加のカーニング語間スペースの微調整 を有効にしますが、これらは pdfTeX 専用 です(LuaTeX・XeTeX では効きません)。どちらも既定では無効なので、必要なときだけ明示します。読み込み後に設定を変えるなら \microtypesetup{...}——たとえば目次の生成中だけ突き出しを切りたければ、前後を \microtypesetup{protrusion=false}\microtypesetup{protrusion=true} で挟みます。文書の一部だけ別設定にしたいときは \microtypecontext{...}(または microtypecontext 環境)で文脈を切り替えられます。draft を渡せば微細組版を一括で無効化でき、final は逆に、文書クラスが draft モードでも強制的に有効にします——比較実験にはこの 2 つが便利です。

エンジンごとに使える機能が違う

要点は 2 つ——伸縮は XeTeX で使えない語間スペースと追加カーニングは pdfTeX 専用。したがって最も多機能なのは pdfTeX(突き出し+伸縮+トラッキング+カーニング+スペーシング)、次いで LuaTeX(突き出し+伸縮+トラッキング)、XeTeX は突き出しとトラッキングだけです。microtype はエンジンで安全に動く機能だけを自動で有効にするので、無引数で読み込むかぎりエラーにはなりません——だからこそ、何が効いていないかは自分で把握しておく必要があります。

機能pdfTeX / LuaTeX / XeTeX備考
protrusion○ / ○ / ○\lpcode\rpcode は三つとも持っている。既定で有効
expansion○ / ○ / ×XeTeX には \efcode が無い。明示すると Package microtype Error
tracking○ / ○ / ○\textls\lsstyle。既定では無効なので tracking で有効化
kerning○ / × / ×pdfTeX 専用。既定では無効
spacing○ / × / ×pdfTeX 専用。語間スペースの微調整

実際のプリアンブルにどう書くか

基本は \usepackage{microtype} の一行だけ です。これで突き出しと伸縮(エンジンが対応していれば)が既定で有効になり、ほとんどの文書はこれで十分によくなります。microtype は安定していて副作用がほぼなく、追加して困ることはまずありません。pdfTeX 系なら \usepackage[T1]{fontenc} と組み合わせるのが定石で、これは突き出し・伸縮の設定ファイルがエンコーディング単位で用意されているためでもあります。以下はもう少し踏み込んだ例で、突き出しと伸縮を明示的に有効化し、スモールキャップスの字間を軽く空け、コード表示用のタイプライタ体だけ合字を切っています。

preamble.tex
\documentclass{article}
\usepackage[T1]{fontenc}
% protrusion and expansion explicitly on;
% "final" forces them on even when the class is in draft mode
\usepackage[activate={true,nocompatibility},final]{microtype}

% letterspace small caps a little (40/1000 em)
\SetTracking{encoding = *, shape = sc}{40}

% no ligatures in the typewriter family, so "--" stays two hyphens
\DisableLigatures{encoding = T1, family = tt*}

\begin{document}
% turn protrusion off just while the table of contents is built
\microtypesetup{protrusion=false}
\tableofcontents
\microtypesetup{protrusion=true}
\end{document}

最後に、期待値の調整を一つ。この種の調整は控えめで、1 ページを見ただけでは分からないこともあります。実測でも、狭い行長で総行数が 1.7 パーセント縮んだにすぎません。それでも オーバーフルボックスが 117 個から 6 個に落ちた ことのほうが、日々の執筆では効きます——行がはみ出すたびに文言を書き換える手間が、そのぶん消えるからです。microtype の値打ちは「短くなる」ことより、手で直す回数が減る ことにあります。