我想尝试一下令人鼓舞分页符的使用\pagebreak[number]
。
就目前而言,只有当我定义时它才会破坏页面\pagebreak[4]
(在任何其他情况下它都不会起作用)。
有人能向我解释一下它应该如何工作吗?
如果我在页面底部有一个新的部分并且我使用它则\pagebreak[3]
不会\section{xxxxx}
破坏它。
手册上写道:
\pagebreak 命令告诉 LaTeX 在命令处中断当前页面。使用可选参数 number,您可以将 \pagebreak 命令从命令转换为请求。number 必须是 0 到 4 之间的数字。数字越大,请求越迫切。
答案1
该命令\pagebreak[3]
仅修改分页符出现在该位置的概率。也就是说,它将分页符的惩罚减少了301
。该命令\pagebreak[4]
将惩罚减少了10000
,这是一种“TeX 的无穷大”,它通过不花费任何代价来强制分页符。
但是,\pagebreak[3]
如果 LaTeX 认为输出没有任何问题(例如章节标题非常靠近页面底部),则无法工作。因此,您必须告诉 LaTeX 将底部标题视为坏事,最简单的方法是使用包裹titlesec
:
\usepackage[nobottomtitles]{titlesec}
它的理念很简单:如果页面上剩余空间不多,则强制分页。具体实现起来比较复杂,我肯定无法在这里很好地解释清楚。
答案2
广泛了解分页工作原理会有所帮助。TeX 在主垂直列表,主要是在分割段落后的行,但也有插入行之间的“胶水”。其他材料可以出现在这个垂直列表中,例如在分段标题之前和之后插入的胶水,用于垂直分隔它们。还有其他东西,但完整的描述会花费太长时间;分页的其他主要成分是处罚。
惩罚可以自动插入(通过 TeX 程序)或手动插入(通常嵌入宏中,因此用户无需注意)。自动惩罚会插入在段落的第一行之后(数量由参数指定\clubpenalty
)和倒数第二行之后(\widowpenalty
)。典型的手动惩罚由 插入\pagebreak
。
这些惩罚告诉 TeX 在该点(总是在行之间,因为当 TeX 寻找分页点时,已经执行了分段)是否需要分页。如果惩罚为正,则分页是不可取的,如果为负,则分页是可取的;范围是-10000..10000
:-10000 惩罚强制分页,10000 惩罚不允许分页。
可以进行分页胶水或者处罚(实际上,这不是完全的事实,但非常接近事实。)在惩罚或其他粘连之前紧接着的粘连处不会发生分页符,但对于分页符,惩罚总是被考虑的。
当 TeX 积累材料时,它会跟踪成本在每个可行的断点处分页。TeXbook(第 15 章)中解释了此成本的精确计算。10000 的惩罚会导致“最大成本”(100000)。此成本还取决于累积材料的高度,因此当页面仍然几乎为空时,成本将为此最大值,但是当累积材料高于为页面保留的空间时,它将变为无限。当开始新页面时(更准确地说,当弹出页面后将第一个项目附加到主垂直列表时),为页面保留的空间包含在\pagegoal
等于的内部参数中\textwidth
(在 LaTeXspeak 中\vsize
是原始参数),但如果在处理过程中发现脚注或浮动,则它可能会减少。
命令
\pagebreak[0] \pagebreak[1] \pagebreak[2] \pagebreak[3] \pagebreak[4]
在罚球点插入罚球。如果指令是在段落之间发出的,它将精确地出现在罚球点上;如果指令是在段落中发出的,罚球将插入到指令所在行的后面,前线间胶水。用量为
0 \@lowpenalty \@medpenalty \@highpenalty 10000
(它们的对立面由类似的命令插入\nopagebreak
)。文档类固定了中间值;对于标准类,它们是
\@lowpenalty = 51
\@medpenalty = 151
\@highpenalty = 301
TeX 会跟踪成本,标记“迄今为止最佳”,当它发现分页的成本是无限时,它会回退并按最近的“迄今为止最佳”成本分割页面。当一个分页点被另一个“迄今为止最佳”取代时,与该分页相关的惩罚(当然可能没有)将被丢弃,并且它们将不再影响计算。
因此,如果在距离下一个分页符足够远的位置发出\pagebreak[3]
,即在它之后的页面中可以容纳更多材料,则惩罚将被忽略。相反,\pagebreak[4]
(或者,等同地,简单地\pagebreak
)将产生 -10000 的成本,根据规则,即使累积的材料仍然远离,也会强制分页\pagegoal
。
LaTeX 的分段命令会注意在它们之后开始的第一个段落前面有一个 10000 惩罚,因此标题和第一个段落或紧随其后的分段标题之间不能出现分页符。因此,下一个可行的分页点位于第二下一段的行(因为宏也暂时设置\clubpenalty
为 10000)。
\pagegoal
此行为是可修改的,因为可以随时检查当前值和“迄今为止的高度”,并且负责排版部分标题的宏可以决定可用空间是否低于某个阈值,并在必要时发出\pagebreak
命令。
该软件包needspace
提供了一个用户界面,用于根据可用空间决定是否过早分页。titlesec
带有 nobottomtitles*
选项的软件包可以执行类似操作(但插入的惩罚是 9999 而不是 10000)。
最后要注意的是:分页符所在的惩罚或粘连会被移到下一页,然后消失,因为 TeX 在开始构建新页面时总是会丢弃这些项目。一些聪明的输出例程可以利用这一事实,在丢弃这些项目之前执行一些操作。事实上,LaTeX 输出例程会这样做,以便在需要时容纳页面浮动:发出的惩罚是\clearpage
-10001,因此输出例程可以知道分页符是的结果,\clearpage
并且它会刷新浮动队列。