通常,您可以通过改变惩罚来找到解决方案。一种方法是widowpenalty
。但是什么是惩罚?是否有一份列出所有已定义惩罚的小清单。
有一个德国网站它的作用正是如此。
答案1
惩罚是 TeX 在换行或分页时试图最小化的主要值,它们可能被明确插入(\penalty125
意味着在该点处断行的惩罚是 125)。一些惩罚是内置于 TeX 系统中并自动插入的,例如 LaTeX 为内置惩罚设置了这些默认值
\linepenalty=10
对段落中每行的糟糕程度增加惩罚(没有相关的惩罚节点)增加该值会使 tex 尝试在段落中包含更少的行。
\interlinepenalty=0
在段落的每一行后面添加的惩罚值(节点)。
\hyphenpenalty=50
自动插入连字符处的换行惩罚
\exhyphenpenalty=50
在显式连字符处断行的惩罚
\binoppenalty=700
在二进制运算符处断线的惩罚
\relpenalty=500
违反关系的惩罚
\clubpenalty=150
段落第一行之后的断行将受到额外惩罚
\widowpenalty=150
在段落最后一行之前中断的额外惩罚
\displaywidowpenalty=50
在显示数学之前的最后一行之前中断的额外惩罚
\brokenpenalty=100
连字符行后分页的额外惩罚
\predisplaypenalty=10000
展示前破坏的惩罚
\postdisplaypenalty=0
展示后违反规定的处罚
\floatingpenalty = 20000
拆分插入的惩罚(只能在标准 LaTeX 中拆分脚注)
e-tex 增加了一些额外的惩罚(在 LaTeX 中默认未设置),但三大主流引擎均支持这些惩罚
\interlinepenalties
对此的扩展\interlinepenalty
允许在每行后添加不同的惩罚。它以空格分隔的数字列表作为值。如果n是积极的interlinepenalties
n我1 ... 我n指定段落中每一行之后使用的惩罚,如果段落包含超过n線。
\clubpenalties
\clubpenalty
与 具有相同语法的扩展\interlinepenalties
。
\widowpenalties
\widowpenalty
具有与 相同语法的扩展\interlinepenalties
(在这种情况下,行数从最后一行向后计算)。
\displaywidowpenalties
使用与段落内每行显示数学式向后计数的\widowpenalty
相同语法的扩展。\widowpenalties
XeTeX 支持一项额外的原始惩罚:
\XeTeXlinebreakpenalty
完整文档如下:字符间换行惩罚我相信这是在亚洲排版中插入的字符之间的惩罚,因为亚洲排版通常不使用字间空格。
其他惩罚通过以下格式插入,例如 LaTeX 定义计数
\newcount\interfootnotelinepenalty \interfootnotelinepenalty=100
但\linepenalty
在设置脚注时本地安排设置为该值。
类似article
类集
\@lowpenalty 51
\@medpenalty 151
\@highpenalty 301
\pagebreak[1]
这些是...使用的值
\samepage
通过将许多惩罚设置为“无限”值来实现:
\def\samepage{\interlinepenalty\@M
\postdisplaypenalty\@M
\interdisplaylinepenalty\@M
\@beginparpenalty\@M
\@endparpenalty\@M
\@itempenalty\@M
\@secpenalty\@M
\interfootnotelinepenalty\@M}
笔记惩罚不仅仅是数值,它们是插入到水平或垂直列表中的实际节点。它们可以被检查\lastpenalty
或删除(在某些情况下),\unpenalty
例如\count0=\lastpenalty
,如果惩罚是当前水平或垂直列表中的最后一项,则会将惩罚的值(即使它是自动插入的)放入计数寄存器中。
例如,这段 LaTeX 代码试图插入斜体修正,而不会干扰水平列表中的惩罚
\def \fix@penalty {%
\ifnum \lastpenalty=\z@
\@@italiccorr
\else
\count@ \lastpenalty
\unpenalty
\@@italiccorr
\penalty \count@
\fi
}
这是所有命令的一部分,例如\textit
尝试插入自动斜体校正。
缺点
上面说 TeX 试图将惩罚最小化,其实是一种简化。对于换行,实际最小化的数量是缺点它(或多或少)是段落中换行符相关的惩罚的平方和以及每行的糟糕程度(衡量空白空间超出其指定限制的程度)加上下面描述的三个额外的缺点参数。确切的公式在 TeXBook 中,但通常不相关。
LaTeX 赋予这三个缺点参数的默认值为:
\doublehyphendemerits=10000
对于每对以自由选择符号(通常是连字符)结尾的连续行,段落中都会增加额外的缺点。
\finalhyphendemerits=5000
如果倒数第二行以自由裁量词结尾,则会添加额外扣分。
\adjdemerits=10000
对于“不兼容”的线条对(即,一条紧密的线条中的空白被挤压,而另一条松散的线条中的空白被拉伸),会增加额外的缺点。
请注意,缺点参数的值通常很大(它们与正方形惩罚和不良单位)同样,缺点只是用于换行计算的值。与惩罚不同,它们不对应于可在 TeX 列表中操作的节点。
答案2
TeX 使用惩罚来控制换行和分页例程。其中一些是隐式插入的,其他的可以由用户添加(通常通过宏)。在水平或数学模式下发出的惩罚将影响换行,在垂直模式下发出的惩罚将影响分页决策。
“隐性惩罚”列表可以在 TeXbook(第 272 页)中找到:
\linepenalty
段落中每行的不良率增加的量 (v)
\hyphenpenalty
自由连字符后换行的惩罚 (h)
\exhyphenpenalty
明确连字符后换行的惩罚 (h)
\binoppenalty
二进制运算后换行的惩罚 (m)
\relpenalty
数学关系后换行的惩罚 (m)
\clubpenalty
在页面底部创建方行的惩罚 (v)
\widowpenalty
在页面顶部创建寡妇行的惩罚 (v)
\displaywidowpenalty
同上,在屏幕前 (v)
\brokenpenalty
连字符行后分页的惩罚 (v)
\predisplaypenalty
在屏幕前分页的惩罚 (v)
\postdisplaypenalty
在屏幕后分页的惩罚 (v)
\interlinepenalty
在行间分页的额外惩罚 (v)
\floatingpenalty
拆分插入的惩罚 (v)
(我添加了“h”、“m”和“v”来显示在水平、数学和垂直模式下添加了哪些)。
它们的默认值可以通过通常的来查看\show\...penalty
。
LaTeX 内核在此列表中添加了其他几个惩罚参数:
\@clubpenalty
(储藏箱)
\interfootnotelinepenalty
(储藏箱)
\interdisplaylinepenalty
(储藏箱,用于eqnarray
)
\@beginparpenalty
放在列表的开头(v)
\@endparpenalty
放在列表的末尾(v)
\@itempenalty
放在列表的项目之间(v)
\@secpenalty
放在分段标题之前(v)
\@floatpenalty
用于浮动机制(以相当复杂的方式)
\@lowpenalty
当可选参数为\pagebreak
或时放置当可选参数为或时\linebreak
放置当可选参数为或时放置[1]
\@medpenalty
\pagebreak
\linebreak
[2]
\@highpenalty
\pagebreak
\linebreak
[3]
它们既可以用来在适当的位置插入惩罚(在基于的环境中;对于\@itempenalty
分段标题),也可以用作临时更改隐式惩罚值的储物箱。\@beginparpenalty
\@endparpenalty
list
\@secpenalty
例如,情况是\@clubpenalty
:LaTeX 不断改变的值\clubpenalty
,因此必须设置这个新参数,以便为通常为阻止俱乐部线路而添加的惩罚建立一个不同的值。
也是\interfootnotelinepenalty
一个存储箱:此参数的值用作脚注中的行间惩罚。
当然,也可以直接手动插入惩罚;例如\nobreak
定义为
\penalty 10000
如果在垂直或水平模式下发现分页符或换行符,则会禁止分页或换行。
然而,我们应该记住,处罚是可丢弃项目,因此它们会在分页符或换行符处消失(如果不用于触发换行符),但讨论这一点会扯得太远。TeX 还会自动\penalty-10000
在段落末尾插入以强制进行最后的换行。