当 TeX 换行算法需要设置超满框时,它具体采用什么程序?

当 TeX 换行算法需要设置超满框时,它具体采用什么程序?

TeXbook(第 14 章)详细描述了 TeX 如何计算将段落分成几行所产生的总缺点,以及 TeX 如何选择产生最少总缺点的断点序列(在三次传递的过程中)。但是,它仅简要描述了如果不存在满足要求的断点序列时会发生什么:

粗略地说,\TeX\ 按以下方式将段落分成行:在单词之间或连字符后插入断点,以便生成其错误率不超过当前 ^|\tolerance| 的行。如果无法插入此类断点,则会设置 ^{overfull box}。

接下来没有关于框满情况的更多细节。我对这些细节感兴趣:能否用简单的术语描述 TeX 在这种情况下选择哪些单词突出到边距中?(或者您必须阅读 TeX 源代码才能理解这一点?)由于 TeX 将段落视为一个整体,因此没有允许的断点序列的问题实际上并不是由单个单词引起的。

此外,我认为 TeXbook 中的上述说法并不完全正确:当段落包含 时\linebreak,可能会改为设置未满行。这种情况基本上满足了“无法插入此类断点”的前提,但 TeX 会设置未满行,而不是如上所述的过满行。

(提出这个问题主要出于兴趣。但确实存在这样一种情况,即在完成的文档中可能会出现行数过大的段落,即如果过大的行数超出的部分不超过\hfuzz。)

答案1

TeX 根据行错误总数的计算来选择换行符,总数称为总缺点

第一次运行没有应用 TeX 的连字功能,可能无法遵守整数参数设置的限制\pretolerance。但第二次运行 TeX 总会成功。从 TeX 必须创建过满行的角度来看,它可能不会成功。仅当用户需要时才会创建过满行。

我的意思是。您可以设置\parfillskip=0pt并给 TeX 一个短行,例如只有一个空格,TeX 会报告行未满。作者始终对最后的换行符负责;TeX 不会在单行段落中插入任何内容。类似地,输出的换行符命令\penalty-10000 会强制 TeX 遵从作者的意愿在此处换行。这是强制换行,TeX 不会插入任何内容。

TeX 的操作方式如下;我尝试使用简单的词语,但这是一个技术话题:TeX 在粘合处(包括在 kern 后跟粘合处以及在内联数学末尾后跟粘合处)或在惩罚处断行,即文本中的连字符、TeX 在第二遍中插入的连字符、数学模式中的关系后等,以及\penalty-10000如上所述。

当然,TeX 将文本的开头视为初始断点。为了创建一个段落,TeX 会从可能出现断点的位置(在第二遍中,TeX 可能会通过插入的连字符创建该位置)移动到下一个位置,直到收集的材料(包括收缩或拉伸性)的宽度允许 TeX 构建一条符合当前容差的线,同时使用先前找到的(或强制的)断点之一。TeX 将这样的地方标记为断点,并记住与之关联的前一个断点,以便它稍后可以从段落末尾返回到开头,并找到总缺点最少的行。

如果 TeX 发现用户插入了 ,它也会创建一个断点\penalty-10000。然后它会像在段落开头一样开始处理。没有后续断点可以越过此断点,即下一个断点必须将此用户强制断点记录为上一个断点。

如果找不到任何位置来构建一个最大坏度为当前容差的行,TeX 会停止处理(如果是第一遍),然后开始第二遍。否则,如果 TeX 处于第二遍,它会寻找下一个可以断点而不会构建未满行的位置。尽管行已满,但这仍会成为断点。接下来,TeX 继续该过程。因此,第二遍将遍历整个段落。注意,一个段落可以有多个已满行。

如果\emergencystretch不是 0pt,并且第二遍无法完成所要求的操作,即,找到没有过满行的断点,或者如果 则减少行数\looseness=-1,则 TeX 会启动第三遍,其工作方式与第二遍类似。不同之处在于 TeX 将 的尺寸添加\emergencystretch到每条线的可拉伸性中。因此,尽管收集的材料的宽度和材料中的可拉伸性无法以小于或等于当前容差的坏度填充线,但 TeX 仍会接受一个位置作为断点。但宽度加上可拉伸性加上 尺寸 \emergencystretch足以做到这一点;从视觉上看,这样的线是不完整的。

有几个参数会影响报告和标记。正如您所说,\hfuzzdimen 可以省略超满规则,但这不会改变事实:存在超满线。另一个参数\hbadness负责是否发出警告。

因此,我不明白为什么 TeXbook 所引用的文本是错误的,因为它是一个高级的非正式描述。

相关内容