欧文の書き方

欧文(ラテン文字の文章)は、LaTeX にただ打ち込むだけで驚くほどきれいに組み上がります。office と書けば ffi が一つの字形に溶け、AV の間は 1.11084 pt 詰まり、段落全体を見渡して改行位置が選ばれます。ところがその自動処理は、wolffishwolff-ish と割ってしまう ような取りこぼしも残します。しかも「合字を切れば直る」と思って \/ を挟むと、今度はその語のハイフネーションが 完全に消えます。このページでは、欧文を組むときに書き手が引き受けるべき判断——合字をいつ切るか、babel に何を宣言するか、大文字とスモールキャップスをどう使うか、そして和文の原稿に欧文を混ぜると何が変わるか——を実測とともに整理します。

合字(リガチャ)は五つ——ff fi fl ffi ffl

リガチャ(合字) は隣り合う字を一つの字形に溶かしたもので、LaTeX が既定で作るのは fffiflffiffl の五つです。本文に officefluffier と打つだけで置き換わり、ソースには何の印も残りません。理由は形にあります。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 パッケージの説明書がその出典を明記しています。cufflinkoffloadwolffishhalflife も同類です。断ち切る手段は伝統的に三つ——shelf\/fulイタリック補正)、shelf{}ful空のグループ)、shelf\kern0pt ful幅ゼロのカーン)。

ここに 測ってはじめて分かる差 があります。\showhyphens で分割点を調べると、wolffish は素のままだと wolff-ish と割られます(形態素からすれば wolf-fish であるべきところです)。wolf{}fish も同じく wolff-ish ——ハイフネーションは生きたまま 合字だけが消えます。ところが wolf\/fishwolf\kern0pt fish はどちらも 分割点がゼロになります\mbox{} を挟んだ場合も同じです。理由は単純で、\/\kern は組版のノードを一つ挿入するため、TeX が語を認識する走査がそこで止まるからです。{} は何も残さないので語は語のまま——だから ハイフネーションを保ったまま合字を切れるのは {} だけ です。

書き方幅(10pt, T1 CM)showhyphens の結果
shelfful30.88135 ptshelf-ful — 合字あり、分割点あり
shelf{}ful31.15906 ptshelf-ful — 合字だけ消え、分割点は残る
shelf\kern0pt ful31.15906 pt分割点なし — ハイフネーションが消える
shelf\/ful31.93665 pt分割点なし。さらに f のイタリック補正 0.77759 pt が加わる

実務の結論はこうです。手で切るなら {} を使う。 \/ は『The TeXbook』が示した由緒ある書き方で、f のはらいのぶんを補うという意味では理屈が通っていますが、その語を行末で割れなくしてしまいます。短い語なら実害は小さいものの、selffulfilling のような長い合成語で分割点がゼロになると、その行だけ語間が伸びて段落全体が痩せて見えます。LuaLaTeX を使えるなら selnolig がいちばん上等な解で、英語とドイツ語の形態素をパターンとして持ち、shelffuloffload の不要な合字を 本文に印を付けずに 抑えます(TeX Live 2024 同梱は 0.302 版、LuaLaTeX 専用)。

latex
% \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) は、隣り合う特定の対の間隔を、見た目が均等になるよう詰めたり空けたりする調整です。AVToWaLT のように字形が傾いている対は、何もしないと間が抜けて見えます。実測すると T1 の Computer Modern 10 pt で AV は 13.8855 pt、あいだに {} を挟んだ A{}V は 14.99634 pt——フォントが指示していた 1.11084 pt の詰めが消えています。カーニングの表は フォントメトリック に入っていて(pdfLaTeX 系なら .tfm ファイル、OpenType ならフォント内のテーブル)、TeX がそれを読んで字間を決めます。書き手は何も書きません。

ここから前節へ跳ね返る注意が一つ。合字を {} で切ると、その位置のカーンも一緒に消えますff のあいだにカーンが定義されていれば、それも失われるわけです。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)は装飾ではなく、正しく組むための前提 です。

englishfrenchngermanspanish
signaturesig-na-turesi-gna-turesi-gna-turesig-na-tu-re
AnalyseAnal-yseAna-lyseAna-ly-seAnaly-se
KongressKongress(分割点なし)Kon-gressKon-gressKon-gress
impossibleim-pos-si-bleim-pos-sibleim-pos-si-bleim-pos-si-ble
transatlantiquetransat-lan-tiquetrans-at-lan-tiquetrans-at-lan-ti-quetrans-atlan-ti-que

言語を宣言してもなお、固有名詞や専門語では自動判定が外れます。手当ては三段階です。(1) その語をいつも同じ位置でだけ割ってほしいなら、プリアンブルで \hyphenation{...} に許可位置を - で示した語を空白区切りで並べます。既定の(米語)パターンでは manuscript に分割点が 一つもない ので、\hyphenation{man-u-script} は昔から定番の例でした。(2) その場かぎりなら語中に \-任意ハイフン)を置きます。ただし \- を入れた語は そこでしか割れなくなります(3) 絶対に割らせたくないなら \mbox{...} で囲みます。前節の測定どおり、\mbox{} は分割点をすべて奪うので、これはむしろ狙いどおりの用法です。

latex
\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 を含む別の書体を選ぶか、その組み合わせをやめるかの二択になります。

latex
\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) は、行末の句読点や oA のような丸い・傾いた字をほんのわずかマージンの外へ押し出し、視覚的にそろった端を作ります。フォントの伸縮(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 はそのあとで数えます。