欧文(ラテン文字の文章)は、LaTeX にただ打ち込むだけで驚くほどきれいに組み上がります。office と書けば ffi が一つの字形に溶け、AV の間は 1.11084 pt 詰まり、段落全体を見渡して改行位置が選ばれます。ところがその自動処理は、wolffish を wolff-ish と割ってしまう ような取りこぼしも残します。しかも「合字を切れば直る」と思って \/ を挟むと、今度はその語のハイフネーションが 完全に消えます。このページでは、欧文を組むときに書き手が引き受けるべき判断——合字をいつ切るか、babel に何を宣言するか、大文字とスモールキャップスをどう使うか、そして和文の原稿に欧文を混ぜると何が変わるか——を実測とともに整理します。
合字(リガチャ)は五つ——ff fi fl ffi ffl
リガチャ(合字) は隣り合う字を一つの字形に溶かしたもので、LaTeX が既定で作るのは ff・fi・fl・ffi・ffl の五つです。本文に office や fluffier と打つだけで置き換わり、ソースには何の印も残りません。理由は形にあります。f の右上のはらいが次の i の点や l の縦線とぶつかるため、金属活字の時代から f 系の合字が鋳造されてきました。実測すると T1 の Computer Modern 10 pt で fi の合字は 5.5542 pt、字を分けた f{}i は 5.83191 pt——合字のほうが 0.27771 pt 狭く、その差が「ぶつからないように寄せた」ぶんです。
同じ仕組みは 約物にも働きます。ハイフンを二つ続けた -- は en ダッシュ(数値の範囲などに使う)に、三つ続けた --- は em ダッシュ(挿入句に使う)になり、逆向きの引用符(グレイヴアクセント)を二つ、アポストロフィを二つ並べると、それぞれ活字らしい開き・閉じの二重引用符になります。これらはフォントのメトリックに焼き込まれた変換なので、特別な命令は要りません(ダッシュと引用符の選び分けは「引用符・ダッシュ」に詳しくあります)。
合字を切る三つの方法——ハイフネーションが残るのは一つだけ
合字が 語の成り立ち(形態素)の境目をまたぐ と、かえって読みにくくなります。古典的な例が shelfful(shelf + ful)で、ff を溶かすと二つの部品の継ぎ目が見えなくなります。この語を挙げたのは Knuth 自身で、『The TeXbook』の 19 ページに出てきます、いまも selnolig パッケージの説明書がその出典を明記しています。cufflink・offload・wolffish・halflife も同類です。断ち切る手段は伝統的に三つ——shelf\/ful(イタリック補正)、shelf{}ful(空のグループ)、shelf\kern0pt ful(幅ゼロのカーン)。
ここに 測ってはじめて分かる差 があります。\showhyphens で分割点を調べると、wolffish は素のままだと wolff-ish と割られます(形態素からすれば wolf-fish であるべきところです)。wolf{}fish も同じく wolff-ish ——ハイフネーションは生きたまま 合字だけが消えます。ところが wolf\/fish と wolf\kern0pt fish はどちらも 分割点がゼロになります。\mbox{} を挟んだ場合も同じです。理由は単純で、\/ と \kern は組版のノードを一つ挿入するため、TeX が語を認識する走査がそこで止まるからです。{} は何も残さないので語は語のまま——だから ハイフネーションを保ったまま合字を切れるのは {} だけ です。
| 書き方 | 幅(10pt, T1 CM) | showhyphens の結果 |
|---|---|---|
shelfful | 30.88135 pt | shelf-ful — 合字あり、分割点あり |
shelf{}ful | 31.15906 pt | shelf-ful — 合字だけ消え、分割点は残る |
shelf\kern0pt ful | 31.15906 pt | 分割点なし — ハイフネーションが消える |
shelf\/ful | 31.93665 pt | 分割点なし。さらに f のイタリック補正 0.77759 pt が加わる |
実務の結論はこうです。手で切るなら {} を使う。 \/ は『The TeXbook』が示した由緒ある書き方で、f のはらいのぶんを補うという意味では理屈が通っていますが、その語を行末で割れなくしてしまいます。短い語なら実害は小さいものの、selffulfilling のような長い合成語で分割点がゼロになると、その行だけ語間が伸びて段落全体が痩せて見えます。LuaLaTeX を使えるなら selnolig がいちばん上等な解で、英語とドイツ語の形態素をパターンとして持ち、shelfful や offload の不要な合字を 本文に印を付けずに 抑えます(TeX Live 2024 同梱は 0.302 版、LuaLaTeX 専用)。
% \showhyphens output, TeX Live 2024, T1 Computer Modern:
% shelfful -> shelf-ful (ligature, break point kept)
% shelf{}ful -> shelf-ful (ligature broken, break point kept)
% shelf\kern0pt ful -> shelfful (no break points)
% shelf\/ful -> shelfful (no break points)
% wolffish -> wolff-ish (a break TeX gets wrong on its own)
A shelf{}ful of books, one cuff{}link, an off{}load.
% LuaLaTeX only: handles the whole word list for you
% \usepackage{selnolig}カーニングは AV を 1.11084 pt 詰める——そして {} はそれも消す
カーニング(kerning) は、隣り合う特定の対の間隔を、見た目が均等になるよう詰めたり空けたりする調整です。AV・To・Wa・LT のように字形が傾いている対は、何もしないと間が抜けて見えます。実測すると T1 の Computer Modern 10 pt で AV は 13.8855 pt、あいだに {} を挟んだ A{}V は 14.99634 pt——フォントが指示していた 1.11084 pt の詰めが消えています。カーニングの表は フォントメトリック に入っていて(pdfLaTeX 系なら .tfm ファイル、OpenType ならフォント内のテーブル)、TeX がそれを読んで字間を決めます。書き手は何も書きません。
ここから前節へ跳ね返る注意が一つ。合字を {} で切ると、その位置のカーンも一緒に消えます。f と f のあいだにカーンが定義されていれば、それも失われるわけです。shelf{}ful の場合、合字の 30.88135 pt に対して 31.15906 pt——増えた 0.27771 pt がそれです。目に見えるほどではありませんが、ロゴや商標のように字面を厳密に合わせたい場面では、{} ではなく \kern に自分で数値を与えるほうが確実です。逆に 語全体を均等に字送りしたい(トラッキング/レタースペーシング)ときは、自前で \kern を撒かず microtype の \textls{...} を使います。こちらはハイフネーションを壊しません。
ハイフネーションは言語ごとに違う——babel で言語を宣言する
同じ綴りの語でも、どこで割れるかは言語ごとに違います。 \showhyphens で確かめると、signature は英語のパターンで sig-na-ture、フランス語では si-gna-ture、スペイン語では sig-na-tu-re と、割れる位置そのものが変わります。もっと極端なのが Kongress で、英語のパターンでは 分割点がひとつも見つかりません。行が詰まらない、語間が伸びる、といった症状の少なくない部分が、言語を宣言していないことに由来します。\usepackage[french]{babel}(XeLaTeX・LuaLaTeX なら polyglossia)は装飾ではなく、正しく組むための前提 です。
| 語 | english | french | ngerman | spanish |
|---|---|---|---|---|
signature | sig-na-ture | si-gna-ture | si-gna-ture | sig-na-tu-re |
Analyse | Anal-yse | Ana-lyse | Ana-ly-se | Analy-se |
Kongress | Kongress(分割点なし) | Kon-gress | Kon-gress | Kon-gress |
impossible | im-pos-si-ble | im-pos-sible | im-pos-si-ble | im-pos-si-ble |
transatlantique | transat-lan-tique | trans-at-lan-tique | trans-at-lan-ti-que | trans-atlan-ti-que |
言語を宣言してもなお、固有名詞や専門語では自動判定が外れます。手当ては三段階です。(1) その語をいつも同じ位置でだけ割ってほしいなら、プリアンブルで \hyphenation{...} に許可位置を - で示した語を空白区切りで並べます。既定の(米語)パターンでは manuscript に分割点が 一つもない ので、\hyphenation{man-u-script} は昔から定番の例でした。(2) その場かぎりなら語中に \-(任意ハイフン)を置きます。ただし \- を入れた語は そこでしか割れなくなります。(3) 絶対に割らせたくないなら \mbox{...} で囲みます。前節の測定どおり、\mbox{} は分割点をすべて奪うので、これはむしろ狙いどおりの用法です。
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[english]{babel} % loads the English hyphenation patterns
\hyphenation{man-u-script data-base FORTRAN} % global exceptions
\begin{document}
We rewrote the manuscript in \mbox{FORTRAN} overnight,
and the data\-base held.
\end{document}
% \showhyphens{...} prints the break points to the log --
% the fastest way to see what the current patterns actually do.babel はハイフネーションだけでなく文字そのものも変える
babel に言語を渡すと、その言語の 組版慣習 まで適用されます。もっとも分かりやすいのがフランス語です。Bonjour: oui! という同じ入力の幅を測ると、babel なしで 58.48572 pt、\usepackage[french]{babel} を入れると 62.37366 pt ——3.88794 pt 増えます。PDF から取り出すと理由は明白で、出力は Bonjour : oui !。フランス語の組版では二点符号(: ; ! ?)の前に空きを置くという規則があり、babel がそれを自動で入れているのです。\og ... \fg{} と書けばギユメ « » も出ます。
ドイツ語なら " と "' が下付き・上付きの引用符 „ … “ を出し、スペイン語やイタリア語も同様に自国の慣習を持ち込みます。ここに 落とし穴 が一つあります。babel の言語を切り替えた瞬間、原稿を書いたときと違う位置に空きが入るので、行分割が丸ごと変わり、レイアウトが動きます。査読対応の途中で言語オプションを足すと、指定した箇所と無関係なページの図表がずれる、という事故はこれです。言語は最初のプリアンブルで決め、複数言語の文書なら main= で主言語を明示しておくのが安全です。
スモールキャップスと大文字——\textsc{UNESCO} は小さくならない
欧文の地の文で頭字語や人名を目立たせるとき、大文字を並べるより スモールキャップス(small caps) のほうが行の色(濃さ)を乱しません。命令は \textsc{...} ですが、ここに よくある取り違え があります。スモールキャップス書体は「小文字の位置に、小さい大文字が入っている」書体です。したがって \textsc に渡すのは 小文字 でなければなりません。実測すると 10 pt T1 の Computer Modern で \textsc{unesco} は 34.68042 pt、\textsc{UNESCO} は 46.09985 pt——後者は普通の UNESCO(42.35077 pt)より大きく なります。「小さくしたつもりが一番大きい」という結果です。
スモールキャップスにはもう一つ PDF 側の代償 があります。\textsc{unesco} を組んだ PDF から pdftotext で文字を取り出すと、戻ってくるのは unesco ——小文字のまま です。字形は大文字なのに、テキスト層には小文字が入っている。組織名や規格名をスモールキャップスで組んだ論文は、その語で検索してもヒットしないことがあります。書誌情報や検索性を重視するなら、頭字語は普通の大文字で組み、目立たせたい箇所だけ \textsc に回すのが無難です。なお \MakeUppercase は近年のカーネルでアクセントを正しく扱い、\MakeUppercase{stra\ss e caf\'e na\"\i ve} は STRASSE CAFÉ NAÏVE になります(ß が SS に開くのが慣習どおりです)。
もう一点、書体の在庫にも限りがあります。Computer Modern には イタリックのスモールキャップスがない ので、\textit{\textsc{unesco}} と書くと LaTeX Font Warning: Font shape T1/cmr/m/scit undefined が出て、傾いた(slanted)スモールキャップスで代用されます。エラーではないので気づかずに出版まで行きがちです。イタリックのスモールキャップスが必要なら、Latin Modern を含む別の書体を選ぶか、その組み合わせをやめるかの二択になります。
\textsc{unesco} % 34.68042pt -- real small caps
\textsc{UNESCO} % 46.09985pt -- full-size caps in the SC font
UNESCO % 42.35077pt -- ordinary capitals
% pdftotext of the first line gives "unesco", in lowercase
\MakeUppercase{stra\ss e caf\'e} % -> STRASSE CAFÉ
% English abbreviations keep the period, and the period is not a sentence end:
e.g.\ and i.e.\ and cf.\ and et al.\ -- see the punctuation page右マージンを整える——microtype と Overfull \hbox
欧文の仕上がりを段違いに引き上げるのが microtype パッケージです。\usepackage{microtype} の一行で二つの微細組版が効きます。文字の突き出し(protrusion) は、行末の句読点や o・A のような丸い・傾いた字をほんのわずかマージンの外へ押し出し、視覚的にそろった端を作ります。フォントの伸縮(expansion) は各行の字幅をコンマ数パーセント伸び縮みさせ、語間の伸縮を肩代わりします。エンジンによって使える機能が違い、microtype-xetex.def は伸縮について Font expansion does not work with xetex、レタースペーシングについて Letterspacing currently doesn't work with xetex というエラーを持っています——XeLaTeX では突き出しだけが使えると考えてください。
それでも右端がはみ出す行は残ります。ログに出る Overfull \hbox がその合図です。TeX はその改行位置を、段落全体を一度に見渡して選んでいます——Knuth–Plass のアルゴリズム、Donald Knuth と Michael Plass が 1981 年に『Software: Practice and Experience』誌で発表したものです。だから一行はみ出したということは、「その行で諦めた」のではなく「それより気に入る組み合わせが全体として見つからなかった」という意味になります。段落の詰め具合は二つの宣言で調整できて、\sloppy は語間が広がるのを許してでもはみ出しを避け、\fussy(既定)は語間を厳しく保つ代わりにはみ出しを許します。一段落だけ緩めたいなら sloppypar 環境で囲みます。ただし順序が大事で、\sloppy に逃げるのは最後 にしてください。まず microtype を入れ、次に言い回しを一語変えるか \- を一つ足す——たいていはそれで収まりますし、そのほうが段落は美しく残ります。
和文の書き手が欧文の文書を組むとき
日本語の環境で英語論文を書き始めると、まず出るのがこのエラーです——! LaTeX Error: Unicode character (U+3000) not set up for use with LaTeX. 犯人は 全角スペース で、IME が変換の途中で残したものが一つ紛れているだけで pdfLaTeX は止まります。同じ形で ((U+FF08)や )(U+FF09)も not set up for use with LaTeX になります。厄介なのは、エディタの画面では半角スペースや半角括弧と 見分けがつかない ことです。原稿を英語で書き始めた日に、全角スペース・全角括弧・全角コンマを検索して落とす一手間を入れておくと、以後この種のエラーで止まりません。
もう一つ、文書クラスとエンジンの選択 が効いてきます。和文用のクラス(jsarticle など)や upLaTeX で英語の文書を組むと、和文の組版モデルが後ろに控えたままになり、欧文としては余計な処理が挟まります。英語だけの原稿なら素直に article + pdfLaTeX(あるいは fontspec を使う LuaLaTeX)に移すのが確実です。逆に和文が主で欧文が混じる原稿なら、欧文部分の文末スペースがばらつきやすいので \frenchspacing を検討する価値があります(その仕組みは「句読点・括弧類」に詳しくあります)。そして microtype の突き出しや伸縮は 欧文のためのもの で、和文の組版は luatexja などが別のモデルで受け持ちます。
- 着手日に全角文字を掃除する。 全角スペース U+3000、全角括弧
()、全角コンマを検索して落とす。not set up for use with LaTeXはこれが原因です。 - 言語を宣言してから書き始める。
\usepackage[english]{babel}を後から足すと行分割が変わり、図表の位置まで動きます。 - 合字を手で切るなら
{}。\/と\kern0ptはその語のハイフネーションを消します。LuaLaTeX ならselnoligに任せる。 - 頭字語は普通の大文字で。
\textscは PDF のテキスト層に小文字を残すので、検索されたい語には向きません。 \sloppyは最後の手段。 まずmicrotype、次に言い回しか\-。Overfull \hboxはそのあとで数えます。