行分割・ページ調整

LaTeX の改ページは、段落の行分割とは似ても似つかない仕組みで決まります。段落は「全体でいちばん美しい分けかた」を総当たりで探しますが、ページは一度切ったら後戻りしません。だから「なぜここでページが終わるのか」を理解しないまま \newpage を打ち込むと、その先の 40 ページが道連れになります。このページは、ウィドウとオーファン(\widowpenalty\clubpenalty、既定値はどちらも 150)、\raggedbottom\flushbottom の違い、フロートがどう本文を押しのけるかを実測しながら、改ページを力ずくで制御するのではなく診断する手順を組み立てます。

ページはなぜそこで終わるのか — 行分割と改ページの決定的な違い

ページが終わる位置は、そのページを組んでいる時点で分かっている情報だけで決まります。TeX は本文を上から流し込みながら、行と行のあいだに現れる「切ってよい場所」を候補として見張り、ページの高さが目標を超えた瞬間に、それまで見てきた候補のうちいちばんコストの小さいところまで戻って切ります。段落の行分割が全行を見渡してから最適解を選ぶ総当たりなのに対し、改ページは前に進みながら決める逐次の処理です。ここが実務上いちばん効く違いで、40 ページ目の改ページを直すと 41 ページ目以降がすべてずれるのはこのためです。

逐次で決めるということは、あとから交渉する余地がないということでもあります。TeX に残されているのは、候補ごとの「切りたくなさ」を数字で申告する手段だけ——それがペナルティです。ペナルティは切る候補に付けられる整数で、値が大きいほどそこで切りたくない。10000 は「絶対に切らない」を意味する特別な値で、-10000 は逆に「必ず切る」。段落末尾で 1 行だけ取り残される事故を避ける仕組みも、フロートの置き場所も、章見出しの直後で切らせない仕掛けも、すべてこの一種類の数字で表現されています。だから改ページの調整とは、実質的にペナルティの調整のことです。

ウィドウとオーファン — \widowpenalty\clubpenalty の既定値は 150

article クラスで測ると \widowpenalty\clubpenalty150\displaywidowpenalty50 です。ウィドウは段落の最終行がページの先頭に 1 行だけ取り残されること、オーファンは段落の最初の行がページの末尾に 1 行だけ残ること。ドイツ語圏では前者を Hurenkind、後者を Schusterjunge と呼び分けます。ここで最初につまずくのが名前です——オーファンを止めるパラメータは \orphanpenalty ではなく \clubpenalty で、そんな名前の変数は TeX にも LaTeX にも存在しません。組版の古い用語で段落冒頭の孤立行を club line と呼んだ名残です。

latex
% Print the defaults into the .log yourself:
%   pdflatex penalties.tex  ->  grep MEASURE penalties.log
\documentclass{article}
\begin{document}
\typeout{MEASURE widowpenalty=\the\widowpenalty}
\typeout{MEASURE clubpenalty=\the\clubpenalty}
\typeout{MEASURE displaywidowpenalty=\the\displaywidowpenalty}
\typeout{MEASURE brokenpenalty=\the\brokenpenalty}
x
\end{document}

150 という値には由来があります。TeX Live 2024 の latex.ltx の 514〜516 行目にこの三つの代入が並んでいますが、まったく同じ三行が Knuth の plain.tex の 290〜292 行目にもあります。つまり LaTeX は プレーン TeX の既定値をそのまま引き継いだだけで、40 年のあいだ一度も見直していません。そして 150 は、実務的にはほとんど効きません。ページを 1 行分縮めることの醜さ(badness)は、行間に伸縮の余地が乏しい本文では簡単に 1000 を超えます。150 のペナルティは、その勝負にまず勝てないのです。

パラメータ既定値何を止めるか
\widowpenalty150段落の最終行がページ先頭に 1 行だけ残ること
\clubpenalty150段落の最初の行がページ末尾に 1 行だけ残ること
\displaywidowpenalty50別行立ての数式の直前に 1 行だけ残ること
\brokenpenalty100ハイフンで折れた行の直後で改ページすること
\interlinepenalty0段落の途中で改ページすること全般(既定では抑止しない)
\predisplaypenalty10000別行立ての数式の直前での改ページ(実質禁止)

ひとつだけ、LaTeX 自身がこの既定値を放棄している場所があります。article.clsthebibliography 環境は、開始直後に \sloppy を呼び、\clubpenalty4000\widowpenalty4000 を設定します(TeX Live 2024 同梱の article.cls 576〜579 行)。参考文献リストは短い項目が延々と続くのでウィドウが出やすく、しかも 1 項目が 2 ページにまたがると読みにくい——標準クラスがこの一箇所だけ本気を出しているのは、そういう理由です。逆に言えば、本文でウィドウが気になるなら、標準クラスは何もしてくれないということでもあります。

\widowpenalty=10000 にすると何が起きるか — 実測した取引

ウィドウは消えますが、代わりに短いページが現れます。 1 ページ 20 行・段落 6 行の文書を \flushbottom で組んで実測すると、既定のままではページ 1 が 23 行、4 番目の段落の最終行だけがページ 2 の先頭に置き去りになりました。\widowpenalty=10000 を足すと、ページ 1 は 22 行に減って最後の 2 行がまとめて次ページへ移り、ウィドウは消えます。ただしログには次の一行が増えます。

log
Underfull \vbox (badness 10000) has occurred while \output is active []

この警告は「ページの縦の隙間を埋めきれなかった」という意味で、\flushbottom のときだけ出ます。同じ実験を \raggedbottom でやると、警告は一度も出ません——ページが下端まで届かなくてよいので、埋める必要そのものが無いからです。つまり \widowpenalty=10000 の代償は、\flushbottom では行間が広がって不揃いになり、\raggedbottom ではページ下端の白が伸び縮みするという形で現れます。どちらにせよ代償はゼロではありません。それでも、本文だけの原稿なら 10000 は妥当な設定です。段落末に 1 行だけ残る事故は読者が確実に気づくのに対し、下端の 1 行分の白は多くの読者が気づきません。

latex
% A defensible pair of settings for a text-heavy manuscript.
\widowpenalty=10000
\clubpenalty=10000
% Also stop a two-line gap opening before a displayed formula:
\displaywidowpenalty=10000
% Prefer this over sprinkling \newpage through the source.

\raggedbottom\flushbottom の違い、そしてどちらが既定か

\flushbottom は全ページの下端を揃えるために縦の空きを伸縮させ、\raggedbottom は下端が不揃いになるのを許します。ここで多くの解説が間違えているのですが、片面組みの article の既定は \flushbottom ではなく \raggedbottom です。article.clsreport.clsbook.cls はいずれも末尾で \if@twoside \else \raggedbottom \fi を実行するので、twoside を指定していない限り \raggedbottom が有効になります。既定で twosidebook だけが \flushbottom 側に残ります。二段組を指定した場合は、どのクラスでも \flushbottom が明示的に呼ばれます。

クラス指定実際に効くのはページ下端の見え方
\documentclass{article}\raggedbottomページごとに下端の高さが変わる
\documentclass[twoside]{article}\flushbottom下端が揃う。行間が伸びることがある
\documentclass{book}\flushbottombook は既定で twoside なのでこちら
\documentclass[twocolumn]{article}\flushbottomクラスが明示的に呼ぶ。二段は揃わないと目立つ

仕掛けは拍子抜けするほど単純です。latex.ltx では \raggedbottom\def\@textbottom{\vskip \z@ \@plus.0001fil}\flushbottom\let\@textbottom\relax と定義されているだけ。前者は「長さ 0 だが無限に伸びる」グルーをページの最後に置くもので、この fil が本文側のわずかな伸縮を圧倒するため、余りはすべて末尾の空白へ吸い込まれます。実際に \meaning\@textbottom を出力させると、article では macro:->\vskip \z@ \@plus .0001filbook では \relax が返ります——プリアンブルで一行書けば、自分の文書がどちらで組まれているかその場で確認できます。

latex
% Which bottom mode am I in? Put this in the preamble and read the .log.
\makeatletter
\AtBeginDocument{\typeout{MEASURE textbottom=\meaning\@textbottom}}
\makeatother
% article  -> macro:->\vskip \z@ \@plus .0001fil   (\raggedbottom)
% book     -> \relax                                (\flushbottom)

フロートがページを押しのけるとき — \topfraction\textfraction

本文の改ページが不可解に見えるとき、犯人はたいていフロートです。LaTeX は図表を置く前に、そのページに置いてよい割合と個数を確認します。標準クラスの実測値は、上部フロートが本文高さの \topfraction = .7 まで、下部が \bottomfraction = .3 まで、本文が最低でも \textfraction = .2 残ること、1 ページのフロートは合計 totalnumber = 3(上 topnumber = 2、下 bottomnumber = 1)まで。この条件を一つでも満たせない図は、そのページに置かれず次のページ以降へ持ち越されます。持ち越された図は本文より先に置かれるので、結果として「文章は 12 ページ、図は 14 ページ」というずれが起きるわけです。

パラメータ既定値意味
\topfraction.7ページ上部のフロートが占めてよい本文高さの割合
\bottomfraction.3ページ下部のフロートが占めてよい割合
\textfraction.2フロートのあるページに最低限残すべき本文の割合
\floatpagefraction.5フロート専用ページを作ってよい最小の占有率
totalnumber31 ページに置けるフロートの総数
topnumber2ページ上部に置けるフロートの数
bottomnumber1ページ下部に置けるフロートの数

フロートが原因のときは、ログが先に教えてくれます。[h] だけを指定した図が置けないと、LaTeX は LaTeX Warning: 'h' float specifier changed to 'ht'. と言って勝手に上部へ回します。持ち越しが溜まりすぎると ! LaTeX Error: Too many unprocessed floats.latex.ltx\@fltovf)で止まります。実務では、章の切れ目に placeins\FloatBarrier を置いて図の流出を章内に閉じ込めるか、afterpage パッケージの \afterpage{\clearpage} で「今のページを組み終えてから掃き出す」のが定石です。素の \clearpage をその場に書くと、本文の途中に大きな白ができます。

latex
\usepackage{placeins}   % \FloatBarrier
\usepackage{afterpage}  % \afterpage{\clearpage}

% Keep every figure inside the section that discusses it:
\let\oldsection\section
\renewcommand\section{\FloatBarrier\oldsection}

% Or loosen the rules instead of forcing breaks:
\renewcommand{\topfraction}{0.85}
\renewcommand{\textfraction}{0.1}
\renewcommand{\floatpagefraction}{0.75}

悪い改ページの直し方 — 力ずくの前にやること

順番が決まっています。まず原因を特定し、次に大域の設定を直し、最後にどうしても残った一箇所だけ手で触る。 逆順にやると、原稿を一文足しただけで手作業がすべて崩れます。原因の特定は .log から始めます——Underfull \vbox が出ていれば \flushbottom とペナルティの綱引き、float specifier changed が出ていればフロート、Overfull \hbox が並んでいれば行分割側の問題で、それは別ページの領分です。原因が分かってから、ペナルティ・フロートの割合・段落そのものの長さのどれを動かすかを決めます。

  • .log を読む。Underfull \vbox / float specifier changed / Overfull \hbox のどれが出ているかで犯人が分かれる。
  • プリアンブルで \widowpenalty\clubpenalty を上げる。文書全体に効くので、直った箇所が再発しない。
  • フロートが原因なら \FloatBarrier\topfraction の調整。図の位置指定を [htbp] のように広げるのも効く。
  • 段落そのものを 1 行縮める/伸ばす。原稿を一語直すのが、じつは最も安定した修正であることが多い。
  • \enlargethispage{\baselineskip} でそのページだけ 1 行分高くする。ここまで来て初めて手作業。
  • \newpage\pagebreak は最後の手段。入れたら、原稿を直すたびに位置を見直す必要がある。

「段落を 1 行縮める」を TeX に頼む道具が \looseness です。段落の中で \looseness=-1 と書くと「可能なら 1 行短く組め」、+1 なら「1 行長く」。ただし実測すると期待どおりにはいきません。\tolerance=9999 \emergencystretch=3em を設定した段落で \looseness=1 は確かに 6 行を 7 行に伸ばしましたが、代わりに Underfull \hbox が 6 本出ました。そして \looseness=-1 は——多くの人がほしがるほうです——行数を変えられませんでした\tolerance の範囲内に、より短い解が存在しなかったからです。\looseness は「試す価値のある一手」であって、確実に効くレバーではありません。効かなかったときは、素直に原稿の語を一つ削るほうが早い。

latex
% Ask for one line fewer inside the paragraph itself.
% \looseness is reset by every \par, so it must sit inside the paragraph.
\tolerance=9999 \emergencystretch=3em
Some paragraph text ... \looseness=-1

% Only after the above has failed: one page, one line taller.
\enlargethispage{\baselineskip}

\pagebreak\linebreak\- はどこで扱うか

このページは文書全体のリズムを扱い、個々の切断命令は別ページの担当です。改ページを命じる \pagebreak[n]\nopagebreak[n](n は 0〜4)、無条件の \newpage、フロートも掃き出す \clearpage、両面で白ページを補う \cleardoublepage は「ページ分割の調整」へ。行の側の \\\newline\linebreak[n]\nolinebreak[n]、任意ハイフン \-、プリアンブルの \hyphenation{man-u-script}hyphenat パッケージは「行分割の調整」へ。段落そのものの構造と \par は「段落と改行」が持ち主です。そして Overfull \hbox\sloppy\emergencystretch は専用のエラーページで詳しく扱っています——\sloppy が実際には 4 つの代入(\tolerance 9999\emergencystretch 3em\hfuzz .5\p@\vfuzz\hfuzz)でしかないことも、そちらで測ってあります。

最後に、この一群のうち LaTeX があなたに黙って使っているものがあります。\section などの見出しコマンドは、直後の段落について一時的に \clubpenalty10000 に上げ、見出しの直後で改ページが起きないようにしています(latex.ltx\@clubpenalty の仕掛け)。だから「見出しだけがページの最後に取り残される」事故は、標準の LaTeX ではまず起きません。起きたとしたら、その見出しコマンドを自作マクロで置き換えたときです。