有人制作过无穷大大于 10,000 的修改版 TeX 吗?

有人制作过无穷大大于 10,000 的修改版 TeX 吗?

我们都熟悉这样的结果\sloppy:如果一个段落里必须有一些不好的东西,那么最好把所有的东西都塞进一个段落里。真的坏行。毫无疑问,部分原因是在计算坏度时,TeX 将无穷大设置为相对较低的值 10,000。当使用 16 位数字计算坏度时,这很有意义,但如果我没记错的话,支持数据结构已经很久没有使用 16 位数字了。有人尝试过制作 TeX 的修改版本,将无穷大设置为更大的值吗?这有帮助吗?

答案1

这是一个没有答案的老问题,虽然我没有在 TeX 实现中增加 badness 值,但我认为应该将一些事情放入正确的上下文中。

首先:不是,\badness不是 16 位整数。它是一个完整的 TeX 整数,因此可以大到 $2^{31}-1$。而且 TeX 使用一个大于 10000 的值:\setbox0=\hbox to 1pt{?}\showthe\badness给出 1000000,显然不是 16 位数字。

您可能知道,在换行期间,badness 为 800 表示已用空间是可用空间的两倍。这看起来很糟糕。(如果出现这样的值,我会重写我的文本。)badness 为 2700 表示是三倍,6400 表示是四倍,12500 表示是五倍,21600 表示是六倍。TeXbook 第 29 页显示了效果。

那么,当换行时甚至小于 1000 的值都无法容忍时,为什么要开始区分 12500 和 21600 的不良值呢?分页是类似的,但有理由说明不良值可能比换行时要大一些。没有,\tolerance只有参数\vbadness

TeX 本身具有 dimen 参数\emergencystretch,可以人为地增加换行时的不良度限制。Knuth 引入它是为了避免过高的值\tolerance。参见 https://tug.org/TUGboat/tb10-3/tb25knut.pdf,第 327 页。(据我所知 也\sloppy使用了\emergencystretch;因此它不仅仅是设置 \tolerance为高值。)

因此,正如@DavidCarlisle 在评论中指出的那样,增加范围没有多大意义。

最后说明一下;从你的个人资料中,我发现你可能没有使用过 TeX78,但你可能知道文件 errorlog.tex 是什么。TeX78 的第 296 条是

R296. 强制 \\{badness} 最多为 $10^{19}$。@108

所以,很明显,\badness当时也不是 16 位的。也许有人会说 Knuth 试验了一种 TeX,其不良程度范围大于 0-10000。但我没有研究过 TEXSEM.SAIL 中的代码,它可能代表不同的概念。

相关内容