在 LaTeX 的分页命令中,\newpage 与 \pagebreak 在 latex.ltx 里的差别正好是一个 \vfil。\newpage 是 \vfil \penalty -10000;\pagebreak 则是去掉 \vfil 的同一条 \penalty -10000。有没有这段可无限伸展的空白,决定了是把本页剩余部分当作空白丢掉,还是把正文一直拉伸到下边距。\clearpage 更进一步,放下 \penalty -10001——一个比 TeX 的无穷大还大 1 的值,正是这一手把积压的浮动体逼了出来。本页覆盖 \pagebreak[n]、\newpage、\clearpage、\cleardoublepage、\nopagebreak[n]、\samepage、needspace 与 \enlargethispage,并附上实际编译的结果。
先把层次说清楚。本页负责的是在具体位置干预分页的命令。整份文档的节奏——\widowpenalty 与 \clubpenalty(标准文档类中默认都是 150)、\raggedbottom 与 \flushbottom 的取舍、浮动体的占页比例,以及「这一页为什么在此结束」的诊断——由「分页的设计与诊断」那一页深入处理。那里的核心原则在这里同样成立:分页调整放到最后做。 多打一个字符,其后所有断点都会移位;正文尚未定稿就四处撒 \newpage,每改一次文字就会留下莫名其妙的空白。以下命令请当作定稿之后的收尾工具。
\pagebreak 与 \newpage 的区别:把剩余拉开,还是丢掉
两者都在该处结束本页,但对剩余竖直空白的处理正好相反。 \newpage 先放一个 \vfil 再断开,这段可无限伸展的空白吸走全部剩余,于是页面下部保持空白,径直翻页。\pagebreak 不放 \vfil,于是页面上原有的行距等胶水被拉开,正文一直铺到下边距。选择的标准是:像章末那样「到此为止」就用 \newpage;宁可略微拉开行距也要把版面填满,就用 \pagebreak。但 \pagebreak 有个副作用:它可能在段落中间断开。
\pagebreak[n] 里的 n 与行一侧的 \linebreak[n] 用的是同一套机制:经由 latex.ltx 的 \@getpen,按 article.cls 的取值翻译成 0、51、151、301、10000。\pagebreak 取负,\nopagebreak 取正;省略参数时两者都按 4,即 ∓10000。记住 [0] 是「允许在此断开」,只有 [4] 是命令,就够用了。另外,在 \flushbottom 生效的文档里(twoside 的 article,或默认的 book)使用 \pagebreak,可能因拉不满而报出 Underfull \vbox (badness 10000) has occurred while \output is active。实测:在 twoside 的 article 中把 \pagebreak 放到段落中间,这一行立刻出现在日志里。而在 \raggedbottom 的文档中,页面允许排短,所以不会有此警告。
\clearpage 与 \newpage 的区别:插图为何被丢在下一节里
\clearpage 会先输出所有待处理的浮动体(figure 与 table)再断页,\newpage 则不会。 这个差别有多大,实测一目了然。取一份依次为正文、图 A、图 B、\section* 的文档,编译三次。什么都不加时,第 1 页是节标题加图 A,第 2 页是图 B。插入 \newpage 后文档仍是两页,但第 2 页上节标题与图 B 同处一页——本该「排在图之后」的那一节,反倒跑到图 B 前面去了。插入 \clearpage 则变成三页:第 1 页图 A,第 2 页图 B,第 3 页才轮到节标题。若图表的先后关系承载意义,节与节的交界处该放的是 \clearpage。
\begin{figure}[b]\centering\rule{4cm}{3cm}\caption{Figure A}\end{figure}
\begin{figure}[b]\centering\rule{4cm}{3cm}\caption{Figure B}\end{figure}
% \newpage -> heading and Figure B end up together on page 2
% \clearpage -> Figure A p.1, Figure B p.2, heading p.3
\clearpage
\section*{This section must come after its figures}奥妙就在定义本身。\clearpage 先调用 \newpage,随后放下 \write\m@ne{}、一个空的 \vbox{} 以及 \penalty -\@Mi。\@Mi 等于 10001,也就是比 TeX 的无穷大还大 1 的值,它促使输出例程再跑一遍,把积压的浮动体队列清空。这里要提醒一点:在双栏模式下,\newpage 只结束「栏」。 实测:在 twocolumn 的 article 中打下 \newpage,其后的文字落到了同一页的右栏,页面并没有换;同一份文档里的 \clearpage 才第一次翻到下一页。双栏排版要换页,请用 \clearpage 或 \cleardoublepage。
\cleardoublepage:让每一章都从右页开始
\cleardoublepage 先执行 \clearpage,然后仅在 twoside 下插入空白页,使随后的正文从奇数(右)页开始。 它的定义短到可以直接念出来:\clearpage 之后,若 twoside 生效且页码为偶数,就执行 \hbox{}\newpage。这个 \hbox{} 的作用是把空页伪装成「有内容」;没有它,空页会被丢弃而不会输出。双栏模式下该步骤重复两次。装订成册的书里章节总是从右页开始,靠的正是这套机制,book 类的 \chapter 默认就会调用它。在单面印刷(oneside)下条件不成立,于是它的行为与 \clearpage 完全一致。
不许在此分页:\nopagebreak 有效,\samepage 无效
\samepage 无法把连续的几个段落绑在一起。 实测毫不留情,先摆出来。取一份在页脚附近排了六个单行段落的文档:原样编译时 BLOCK1–4 在第 1 页,BLOCK5–6 在第 2 页。把这六段用 \begin{samepage} … \end{samepage} 包住,或者写成分组的 {\samepage …},断法一模一样。看定义就明白了:\samepage 只是一条把九个参数——\interlinepenalty、\predisplaypenalty、\postdisplaypenalty、\interdisplaylinepenalty、\@beginparpenalty、\@endparpenalty、\@itempenalty、\@secpenalty、\interfootnotelinepenalty——设为 \@M(10000)的声明,而段落与段落之间的接缝,这九个一个都管不着。它守得住段落内部、列表项之间、行间公式前后;普通的分段则畅通无阻。
若只想守住某一处接缝,\nopagebreak[n] 才是正解。同一个实验里,把 \nopagebreak 放在原本断开的 BLOCK4 与 BLOCK5 之间,断点便移到了 3 与 4 之间,BLOCK4 随 BLOCK5、6 一起去了下一页。放在段落之前还是之后,结果一样。\nopagebreak 只是在该处放一个惩罚值——水平模式下经由 \vadjust,垂直模式下直接放——因此在明确知道哪一道缝不能撕开时最为可靠:标题与紧随其后的正文之间、插图与其说明之间,都是缝口唯一的场合。反过来,「把这一整块若干行留在一起」这类要求,用下面的 needspace 更合适。
% Measured: six one-line paragraphs at the foot of a page split 4 | 5.
% \samepage around all six changes nothing.
% \nopagebreak at the seam moves the split to 3 | 4.
BLOCK4\par\nopagebreak
BLOCK5\par
% Reserve room instead of forbidding a break:
\usepackage{needspace}
\needspace{6\baselineskip}
% Or make just this one page one line taller:
\enlargethispage{\baselineskip}needspace 宏包:「若剩不下六行就换页」
\needspace{6\baselineskip} 是一条带条件的命令:「若此处到页脚不足六行的高度,就立刻换页。」 在 \samepage 失手的那个实验里加上 \usepackage{needspace},并在六个段落之前放上 \needspace{6\baselineskip},结果 BLOCK1 到 6 全部移到了第 2 页。它的思路是预留空间而非禁止断开,因此不会像 \samepage 那样「守不住却一声不吭」。长度写成 \baselineskip 的倍数最直观,用 pt 或 cm 也行。此外还有预留更精确的 \Needspace{...},以及在 \flushbottom 下让短页底部对齐的 \Needspace*{...},后两者用在段落之间。要防止标题孤零零留在页脚,这是最直截了当的工具。
\enlargethispage:只把这一页拔高一行
\enlargethispage{\baselineskip} 只临时增大当前这一页的 \textheight,好让版面多容一行。 效果是可以数出来的。给一份 article 灌入 120 个单行段落,原样编译时第 1 页最后一行是 LINE46。加上 \enlargethispage{\baselineskip} 变成 LINE47,{2\baselineskip} 变成 LINE48,负长度 {-\baselineskip} 则反过来缩到 LINE45。分毫不差。实现方式坦率得可爱:latex.ltx 通过往一个名叫 \@kludgeins 的插入里塞进负的 \vskip 来骗过版面的目标高度——LaTeX 自己把这套机制命名为 kludge(权宜之计),这个名字很能说明该命令的性格。若非得挤进一行、哪怕压缩行距也在所不惜,就用带星号的 \enlargethispage*{\baselineskip}。
这条命令的典型用武之地是收拾落单的行。当某段的最后一行孤零零留在下一页顶端(寡行)时,用 \enlargethispage{\baselineskip} 把那一页拔高一行,走失的行就被叫了回来,寡行随之消失。当然也可以把 \widowpenalty 提到 10000 在全文范围内禁止,但其代价——页脚不再齐平,\flushbottom 下会冒出 Underfull \vbox——在「分页的设计与诊断」那一页有实测对比。最终工序的定式是:用全局设置定下大局,剩下的那几处再用 \enlargethispage 逐个处理。 手工加进去的那一行务必配上注释。等正文改过之后,唯一能告诉你这一行是否已经有害的,就是那条注释。
| 命令 | 作用 | 注意 |
|---|---|---|
\pagebreak[n] | 放入惩罚值 −(0/51/151/301/10000);不放 \vfil,故正文被拉到页脚 | 可能在段落中间断开;\flushbottom 下可能报 Underfull \vbox |
\newpage | \vfil \penalty -10000;把本页剩余留白 | 双栏下只结束栏;不会输出待处理的浮动体 |
\clearpage | \newpage 再加 \penalty -10001;先输出全部待处理浮动体再断页 | 应放在节的交界处;放在正文中间会留下大片空白 |
\cleardoublepage | 先 \clearpage,twoside 下从奇数(右)页续排,必要时插入空白页 | oneside 下与 \clearpage 相同;双栏时该步骤执行两次 |
\nopagebreak[n] | 在该处放入惩罚值 +(0/51/151/301/10000) | 缝口唯一时最可靠,如标题与其正文之间 |
\samepage | 把九个惩罚参数设为 10000 的声明(也可当作同名环境使用) | 对段落之间无效。 实测中它没能阻止 BLOCK4/5 的断开 |
\needspace{N\baselineskip} | 若到页脚不足 N 行的空间就立即换页(needspace 宏包) | 是预留而非禁止——最适合让标题与开头几行同页 |
\enlargethispage{\baselineskip} | 只临时增大本页的 \textheight;实测中 LINE46 变成 LINE47 | 负长度会缩小;带星号者靠压缩行距硬塞进一行 |
分页的最终工序:按什么顺序检查
分页检查要等正文、图表和参考文献全部就位之后再开始。 是有顺序的。先看浮动体有没有堵塞,需要时用 \clearpage 放行。其次,用 needspace 保护那些可能被留在页脚的标题。最后,只对显眼的孤行用 \enlargethispage 逐个处理。\newpage 只撒在章节结构确实要求的位置。凡是动过手的地方都要留下注释说明理由——半年之后的你,绝对想不起那条 \enlargethispage 为什么在那儿。
- 章与附录的交界处用
\clearpage或\cleardoublepage。 免得图表漂到下一部分去;双栏下\newpage不够用。 - 标题之前预留
\needspace{3\baselineskip}左右。 是预留空间而非禁止断开,别指望\samepage。 - 缝口唯一时就用
\nopagebreak。 例如插图与其说明、标题与其第一段。 - 单行孤行用
\enlargethispage{\baselineskip}。 动手之前先同时看看留白的量和页脚是否齐平。 - 手工加的分页一律写注释。 正文改动之后,唯一能判断它该不该撤掉的,就是那一行注释。