为什么 pts 值过高,而 badness 值过低?

为什么 pts 值过高,而 badness 值过低?

我正在读 Knuth 的TeXbook,并按照第 6 章的指示进行实验,我发现过满警告由 x 为小数报告x pt too wide;而未满警告报告为,badness N其中 N 是非负整数。

问题:为什么不以相同格式(或两种格式)报告两个警告?此外,如何从一种格式转换为另一种格式?


编辑:

我目前的理解是这样的:x pt too wide表示该行超出右边距 x 个点;另一方面,badness N表示单词间距太宽(宽,而不是窄,因为我们有“未满”的字距)N 个单位(线性比例为 0 表示“完美”)。因此,未满的框不会超出右边距。因此,不报告x pt too wide未满行确实有意义。但是,不报告过满行的不良情况似乎表明每次超额的坏程度都是一样的,也就是最坏的10000次,是吗

答案1

箱子溢出的量就是长度,它突出那么多,所以pt和任何单位一样好。

盒子的未充满程度不是长度,而是衡量空白被拉伸了多少,以使内容拉伸到盒子尺寸的指标。Badness 是一个公式,它将盒子中所有空白的拉伸和收缩分量组合起来,并衡量其拉伸程度。

答案2

TeX 不仅会计算比其隐含宽度更宽的框的坏度,还会计算比其隐含宽度更窄的框的坏度。从这个角度来看,它们是对称的。空间包括它们的隐含宽度以及它们的拉伸值和收缩值(即每个空间有三个值)。当一个框应该从其隐含宽度拉伸时,将计算当前空间的所有拉伸值的总和。当该框应该缩小时,将计算所有收缩值。在这两种情况下,将此总和表示为 S。表示所需的拉伸或收缩 R。然后计算坏度为 100*(R/S)^3。

拉伸和收缩之间的唯一区别(或不对称)是 TeX 允许比 S 更宽的框,即 R 应该大于 S,即 badness 应该大于 100。但收缩不允许这样。S 是允许的最大收缩,绝不会更大。如果收缩时 R>S,则框设置为 R=S,其余框材料超出右侧的框边界。这种特定情况是 Overfull \hbox,并且 badness 被假定为无穷大(未计算)。报告超出框的量。

当拉伸框且 R>S 时,将计算 badness,并将此框内的空间拉伸至比其拉伸值更宽。 badness 值的最大允许值为 10000,如果 badness 公式(如上所述)给出更高的值,则 badness 设置为 10000。

假设以下示例。警告报告作为注释添加到此示例中的相应行:

\hbadness=0

\hbox to20pt{a b} % Underfull \hbox (badness 4927) detected at line 3
\hbox to18pt{a b} % Underfull \hbox (badness 1496) detected at line 4
\hbox to16pt{a b} % Underfull \hbox (badness 203) detected at line 5
\hbox to15pt{a b} % Loose \hbox (badness 29) detected at line 6
\hbox to14pt{a b} 
\hbox to13pt{a b} % Tight \hbox (badness 51) detected at line 8
\hbox to12pt{a b} % Overfull \hbox (0.7778pt too wide) detected at line 9

\setbox0=\hbox{a b}

normal width: \the\wd0              % 13.88892pt

stretch value: \the\fontdimen3\font % 1.66666pt

shrink value: \the\fontdimen4\font  % 1.11111pt

\bye

我们希望针对所有正的不良值打印警告。这是使用 完成的\hbadness=0。我们尝试手动计算不良值,例如对于第 5 行:

盒子的隐式宽度为 13.88892pt,盒子应该为 16pt 宽度,即比其隐式宽度宽 2.11108pt。这是 R 值,我们希望拉伸盒子。盒子内空间的拉伸值为 1.66666pt,这是 S 值。Badness 为 100*(2.11108/1.66666)^3 = 203.223。Badness 为整数值,即 203。

请注意,第 6 行报告“松散”框(即框比其隐含宽度更宽,但 R<S)。第 6 行报告“紧密”框,即框比其隐含宽度更窄,但不过满。此行的不良度计算为 b = 100*(.88892/1.11111)^3 = 52。此处使用空间的收缩值 1.1111pt。

请注意,第 7 行未报告任何警告,因为 badness 是 100*(.11108/1.6666)^3 = .029 = 0。

相关内容