改行位置の調整

両端揃え(ジャスティファイ)の段落の中で、LaTeX はどこで行を折るかを自動で最適化します。たいていはそれで十分ですが、ときには「ここで折ってほしい」「ここでは折らせたくない」と人間が口を出したくなります。このページは、段落そのものを区切る話(→「改行・改段落の扱い」)ではなく、段落の内側で行の折り位置を微調整する ための道具立て——強制改行、改行の禁止、ハイフネーションの制御、そして Overfull/Underfull 警告との付き合い方——をまとめます。

まず大前提として、\\(バックスラッシュ 2 つ)や空行で 段落を区切る ことと、これから扱う 行の折り位置の調整 はまったく別の話です。空行は段落を変え、字下げや段落間の空きが入ります。一方ここで扱うのは、同じ一つの段落の中で行末の位置をずらす操作です。両者の違いが曖昧なときは、先に「改行・改段落の扱い」を読んでください。

行を強制的に折る

段落の途中で行を必ず折りたいとき、命令は二系統あります。一つは **\\\newline。どちらも「ここで行を終える」だけで、段落モードを抜けません。重要なのは、直前の行を引き伸ばさず、自然な長さのまま折る** こと——つまり行末は右マージンに届かず、短いまま残ります。住所や詩のように、各行を意図した長さで終えたいときに向いています。

もう一つが **\linebreak。これは折ると同時に 行の空白を引き伸ばして右マージンまで両端揃え** します。だから \\ のように行が短く残ることはなく、代わりに単語間が間延びすることがあります。強さは \linebreak[n](n は 0〜4 の整数)で調整でき、4 が「必ず折る」(引数を省略すると 4)、1 は「別の場所のほうがよいかもしれないが、ここでもよい」という弱い要望です。つまり \linebreak は折り位置の 提案 で、最終的な行の伸縮は LaTeX のジャスティファイに委ねられます。

この違いは実際に組んでみると一目瞭然です。長めの一文の途中に \\ を置くと、その行はそこでぷつりと切れ、左側に余白を残したまま次の行へ移ります。同じ位置に \linebreak を置くと、行はいっぱいに引き伸ばされて右端まで届き、単語と単語のあいだに不自然な空きが開きます。**「短く折りたいなら \\、マージンまで揃えたいなら \linebreak」** と覚えると迷いません。なお \\ には拡張があり、\\[2ex] のように 角括弧で長さ を添えるとその行のあとに縦の空きが入り、\\* はその位置での 改ページを禁止 します(詳しくは「改行・改段落の扱い」)。

latex
% \\ は短く折る/\linebreak は右端まで引き伸ばす
第一の道は険しく\\
第二の道はなだらかだ。

非常に長い一文をここで\linebreak 区切ると、左側の語間が広がります。

\newline は段落モードでは \\ と同じですが、表(tabular)の中では役割が分かれます。**p{...} 列などのセル内では \newline がセル内だけの改行、\\ が行全体の改行** になります。表のセルで「住所を 2 行に折りたいが行は変えたくない」ようなときは \newline を使います。また、折る「行」が存在しない位置(段落の先頭直後など)で \\ を使うと、There's no line here to end というエラーになります。

行を折らせない

逆に「ここでは折ってほしくない」ための道具もそろっています。最も手軽なのがチルダ **~(タイ)。これは 改行されない半角空白**(非分割スペース)で、Fig.~3Dr.~SmithChapter~12式~\ref{eq:1} のように、空白の前後を必ず同じ行に保ちたいときに使います。~ は通常の単語間空白と同じ幅ですが、そこで行が折れない点だけが違います。しかも前後の 単語のハイフネーションは妨げない ので、語を丸ごとくっつける \mbox よりも穏やかで、ふつうはこちらが第一選択です。

折りたくない強さを段階的に指定したいなら **\nolinebreak[n]** を使います。\linebreak と対をなし、n は 0〜4 で、4(引数省略時)はその位置での改行を完全に禁止、1 は「できれば折らないでほしい」という弱い要望です。さらに、語句のまとまりごと折られたくないときは **\mbox{...} が便利で、中身を一つの箱として扱い、途中で行を折ることもハイフネーションすることもしません**(T-34T-34 に割らせたくない、といった場面)。\mbox は plain TeX の \hbox に相当し、\hbox{...} を直接使っても同様です。低水準の **\nobreak** は、その位置に「ここで折るな」という無限のペナルティを置く命令で、~ などの内部でも使われています。

注意したいのは、\mbox で囲んだ語は 絶対に折れないため、行に収まりきらないと右マージンを突き抜けて Overfull box になりやすい ことです。長い URL や化合物名のように本来は折れてほしいものまで \mbox で固めると、かえって組版が崩れます。「この空白だけは折りたくない」なら ~、「この短い語句を割りたくない」なら \mbox、と使い分けましょう。

ハイフネーションを制御する

欧文では、LaTeX が単語の途中にハイフンを入れて行を折る ハイフネーション を自動で行います。たいていは適切ですが、辞書にない固有名詞や専門用語で誤った位置に入ることがあります。一語かぎりの修正には **\-(バックスラッシュ + ハイフン、discretionary hyphen/任意ハイフン)を使います。これは「必要ならここで折ってよい**」という許可を語の中に埋め込む印で、たとえば man\-u\-script と書くと、その語はマークした位置だけで折られます。

ここに落とし穴があります。語の中に \- を一つでも入れると、LaTeX はその語を、自分で見つけた他の候補ではなく、あなたが印を付けた位置でしか折らなくなります。つまり \- は「ここでも折れる」ではなく「ここでしか折れない」を意味します。だから望ましい分割点はすべて自分で書き出す必要があります。なお \- は折りを 強制しません——あくまで「折るなら、その候補のどれか」を示すだけです。

同じ語が文書中で何度も出るなら、本文を汚さずに プリアンブル で例外を一括登録できます。**\hyphenation{...} に、ハイフンで分割点を示した語を並べます。これは文書全体に効く 大域的 な設定で、複数回書けば累積します。注意点として、小文字で書くこと、そして TeX は 完全一致** でしか照合せず、語形変化(複数形など)は別扱いになります。\- が「その場かぎり」なのに対し、\hyphenation は「文書全体の辞書登録」だと考えると使い分けやすいでしょう。

latex
% プリアンブルで分割例外を一括登録(小文字・分割点をハイフンで)
\hyphenation{man-u-script analy-sis FORTRAN}

% 本文では、その場かぎりの任意ハイフン
super\-cali\-fragi\-listic

逆に「この語は絶対にハイフネーションしないでほしい」なら、その語を **\mbox{...}** で囲みます。箱の中身は折られないので、ハイフンも入りません。ただし前項のとおり、折れない語は行からはみ出して Overfull box の原因になり得ます。日本語(和文)にはこの意味でのハイフネーションは無いので、\-\hyphenation は基本的に欧文部分のための道具です。

Overfull / Underfull \hbox 警告

コンパイル時に **Overfull \hboxUnderfull \hbox** という警告を見たことがあるでしょう。\hbox(水平の箱)は組版された 1 行のことです。Overfull は「行が幅に収まりきらず、右マージンを突き抜けた」Underfull は「行がゆるすぎて、単語間が間延びした」 状態を指します。クヌースは、規格外の組版を黙って通すのではなく警告を出し、対処を人間に委ねる設計にしました。draft オプションを付けると、Overfull の箇所に黒い罫(こけし)が出て位置が分かります。

なぜ LaTeX はマージンを突き抜けてまで行を放置するのか。それは、TeX が許された伸縮の範囲内では「見られる」改行を作れなかったとき、むやみに間延びさせる代わりに、はみ出しを警告として見せる からです。原因の多くは、長い語・URL・固有名詞がうまく折れないことにあります。最初に試すべきは前章までの道具——その語に \- で分割点を与える、\linebreak を近くに置く、~ でほどく——という 局所的 な対処です。多くの場合これで解決します。

局所対処が面倒で、多少の間延びを許してでも警告を減らしたいときは、ブラントな(大ざっぱな)道具 に切り替えます。**\sloppy** 宣言は、行分割の許容度(内部的には \tolerance を 9999 に)を大きく緩め、Overfull を避ける代わりに、語間がゆるい行を許容 します。標準の挙動は **\fussy**(既定)で、こちらは語間を整えることを優先し、ときおり Overfull を出します。\sloppy を出したら、効かせたい範囲の終わりで \fussy に戻すのが基本です。

ただし宣言の効き方には癖があります。行分割は 段落が終わる時点で有効な宣言 に従うため、\sloppy の効果をある段落に効かせたいなら、その段落を終える空行や \par までを \sloppy の範囲に含めなければなりません。範囲を一段落に閉じ込めたいなら、**sloppypar 環境** が安全です。\begin{sloppypar}\end{sloppypar} の中だけ \sloppy 相当になり、抜けると自動的に元へ戻ります。

より洗練された手として、\setlength{\emergencystretch}{3em} のように **\emergencystretch** を与えると、最後の手段としてだけ追加の伸びを認め、\sloppy ほど露骨に崩さずに Overfull を減らせます。さらに字幅をわずかに伸縮させてマージンに収める microtype パッケージも有効です。一覧として、各命令の役割を整理します。

命令役割行を引き伸ばす?
\\ , \newline行を強制的に折る(段落は変えない)いいえ(短いまま)
\linebreak[n]折りの提案(n=4 で強制)はい(右端まで両端揃え)
\nolinebreak[n]その位置での改行を禁止(n=4 で完全禁止)
~改行されない空白(タイ)。ハイフネーションは妨げない
\mbox{...}中身を 1 つの箱に。折りもハイフネーションもしない
\-任意ハイフン。語をその位置でだけ折ってよい
\hyphenation{...}プリアンブルで分割例外を大域登録(小文字・完全一致)
\sloppy / \fussy許容度を緩める/既定。sloppypar で局所化\sloppy は語間がゆるみがち