如何避免段落内分页?

如何避免段落内分页?

我想知道是否有任何全局命令可以防止段落内出现分页符。我宁愿将整个段落放在下一页,而不是将其从中间截断。我尝试了该\nopagebreak命令,但没有奏效。有什么想法吗?

答案1

你可以在序言中禁止段落中间的分页符

\widowpenalties 1 10000
\raggedbottom

如果没有\raggedbottom(文章类自动完成的),页面就会很糟糕。

该原语\widowpenalties是原始 TeX 程序的扩展,存在于基于 e-TeX 的引擎(pdftex、xetex 和 luatex)中。它概括了\widowpenaltyTeX 的参数,其中包含在段落最后一行之前插入的惩罚,以帮助控制寡行。

的一般语法\widowpenalties

\widowpenalties NP1 2 ... n

在哪里n是非负整数,并且12,...,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

我使用过nowidowRaphael Pinson 提供的包,并取得了一些成功。

\usepackage[<options>]{nowidow}

我用:\usepackage[defaultlines=4,all]{nowidow}

对于我来说,值 4 比较合适,因为我可以容忍非常大的段落中的一些断续。

defaultlines我认为,如果将的值设置为相当高的 值,那么您就可以非常确定禁止段落中的所有分页符。

相关内容