什么是惩罚以及惩罚的具体定义是什么?

什么是惩罚以及惩罚的具体定义是什么?

通常,您可以通过改变惩罚来找到解决方案。一种方法是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 n1 ... 我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\@endparpenaltylist\@secpenalty

例如,情况是\@clubpenalty:LaTeX 不断改变的值\clubpenalty,因此必须设置这个新参数,以便为通常为阻止俱乐部线路而添加的惩罚建立一个不同的值。

也是\interfootnotelinepenalty一个存储箱:此参数的值用作脚注中的行间惩罚。

当然,也可以直接手动插入惩罚;例如\nobreak定义为

\penalty 10000

如果在垂直或水平模式下发现分页符或换行符,则会禁止分页或换行。

然而,我们应该记住,处罚是可丢弃项目,因此它们会在分页符或换行符处消失(如果不用于触发换行符),但讨论这一点会扯得太远。TeX 还会自动\penalty-10000在段落末尾插入以强制进行最后的换行。

相关内容