我想知道是否有任何全局命令可以防止段落内出现分页符。我宁愿将整个段落放在下一页,而不是将其从中间截断。我尝试了该\nopagebreak
命令,但没有奏效。有什么想法吗?
答案1
你可以在序言中禁止段落中间的分页符
\widowpenalties 1 10000
\raggedbottom
如果没有\raggedbottom
(文章类自动完成的),页面就会很糟糕。
该原语\widowpenalties
是原始 TeX 程序的扩展,存在于基于 e-TeX 的引擎(pdftex、xetex 和 luatex)中。它概括了\widowpenalty
TeX 的参数,其中包含在段落最后一行之前插入的惩罚,以帮助控制寡行。
的一般语法\widowpenalties
是
\widowpenalties
NP1 页2...
页n
在哪里n是非负整数,并且页1、页2,...,页n是从底部开始插入到段落各行之前的惩罚值。如果段落包含超过n+1 行,最后一个值重复。因此以下设置是等效的
\widowpenalty 1000
\widowpenalties 2 1000 0
如果要将数组重置为零(并且 TeX 将使用标准参数\widowpenalty
),只需说
\widowpenalties 0
或者将数组设置为一个组。根据所述规则,
\widowpenalties 1 10000
将在每一段的所有行之间插入 10000(不换行)的惩罚,从而禁止段落中间的分页。
数组\clubpenalties
类似,但它从段落顶部向下工作。因此,另一种解决方案是
\clubpenalties 1 10000
当然,正如 lockstep 指出的那样,有一个“纯 TeX”解决方案:
\interlinepenalty 10000
但\widowpenalties
功能比这更强大。例如,如果我们需要在倒数第三行之前分节,我们可以说
... here the paragraph ends.
{\widowpenalties 4 10000 10000 -10000 0 \brokenpenalty 0 \par}
这比将 TeX 方法放在\vadjust{\break}
所需换行符之前的某处更简单;\brokenpenalty 0
这是必要的,因为否则插入的惩罚将大于 -10000。
由于 TeX 使用在检测到 a 时当前的参数值\par
,因此它将使用指定的值,并在组结束时重置它们。组是(几乎)必要的,因为的设置\widowpenalties
是永久的,不像\hangindent
,\hangafter
或\parshape
会作为 操作的一部分自动重置\par
。
笔记
TeX 总是使用当时的参数值\par
来决定如何将段落分成行并创建垂直列表以提供给“最近的贡献”,无论它们在段落本身中被更改了多少次:、\leftskip
、\rightskip
、\hangindent
、\hangafter
、、\parshape
(可能还有其他的,太多了)。在决定了换行符之后,它会评估要转移到封闭垂直列表中的行间惩罚和缺点,并根据、和的值(这些也是“唯一值”参数之一)插入它所构建的框,同时插入行间粘连。\pretolerance
\tolerance
\emergencystretch
\baselineskip
\lineskip
\lineskiplimits
因此,可以更改适用的值,例如,\widowpenalties
在段落的开头、中间或结尾之前,并且只会考虑最后一个设置。可以通过\widowpenalties
在开头设置来解决“在倒数第三行之前中断”的问题,将整个段落放在一个组中。但是将其设置在组中的技巧可以避免这种需要。它有一些“优点和缺点”:优点是我们不需要重置更改的值;缺点是\hangindent
,\hangafter
和\parshape
是不是有效地重置,因为组的结尾会消除 所做的重置\par
!在使用 的 LaTeX 列表中,这可能是一个问题\parshape
;在某些特殊的地方,LaTeX\par
以某种方式重新定义自己为“正常\par
”,这也可能是一个问题。
答案2
“原始 TeX” 解决方案:\interlinepenalty 10000
。
答案3
我使用过nowidow
Raphael Pinson 提供的包,并取得了一些成功。
\usepackage[<options>]{nowidow}
我用:\usepackage[defaultlines=4,all]{nowidow}
对于我来说,值 4 比较合适,因为我可以容忍非常大的段落中的一些断续。
defaultlines
我认为,如果将的值设置为相当高的 值,那么您就可以非常确定禁止段落中的所有分页符。