胶水是怎么计算的?

胶水是怎么计算的?

请考虑以下示例:

\tracingonline=1
\hfuzz=10000pt
\setbox0=\hbox spread-1pt{a. b}
\showbox0
\setbox0=\hbox{a.b}
\showthe\wd0
\end

输出为:

> \box0=
\hbox(6.94444+0.0)x16.77782, glue set - 1.0
.\tenrm a
.\tenrm .
.\glue 4.44444 plus 4.99997 minus 0.37036
.\tenrm b

> 13.33337pt.

现在我们尝试根据 TeXbook 第 77 页手动计算胶水:

这里必须使用粘合的收缩分量(为spread负)。它等于0.37036(根据第 76 页顶部的规则,即正常收缩 1.11111pt 乘以 1000/f,其中 f 为 3000,因为有点)。所以,z0是 0.37036。我们转到情况 (b)。“粘合设置顺序”为 0。“粘合设置比率”为 1.0,因为x-w,即 1pt( 的参数spread)大于 0.37036。(比率也显示在\showbox输出中:glue set - 1.0。)然后粘合采用新的宽度 4.44444-0.37036。因此总宽度必须是 13.33337+4.44444-0.37036=17.40745。但\showbox显示 16.77782。为什么?

答案1

您按错误的顺序进行计算,首先计算的是框宽度。

\tracingonline=1
\hfuzz=10000pt
\setbox2=\hbox{a. b}
\showbox2
\setbox0=\hbox spread-1pt{a. b}
\showbox0
\setbox0=\hbox{a.b}
\showthe\wd0
\end

显示自然宽度为 17.77782pt

> \box2=
\hbox(6.94444+0.0)x17.77782

因此,框spread -1pt少了 1pt:

> \box0=
\hbox(6.94444+0.0)x16.77782, glue set - 1.0

为达到此目的而拉伸或收缩的胶水量(根据设计)是内部计算,无法从 tex 宏层访问。

在这种情况下,胶水不能充分收缩,所以内容物会溢出盒子,你会被警告

Overfull \hbox (0.62964pt too wide) detected at line 5

除非您设置\hfuzz抑制警告,但这只会抑制警告,而不会改变框小于其内容的事实。

答案2

考虑以下五个盒子:

\setbox1=\hbox{ab}
\setbox2=\hbox{a.b}
\setbox3=\hbox{a b}
\setbox4=\hbox{a. b}
\setbox5=\hbox spread -1pt{a. b}

通过查看它们的宽度(与pt等同\showbox1或在sp\count1=\wd1 \showthe\count1等同),我们可以看到:


在第一种情况下\hbox{ab},宽度是691771sp (= 691771/65536 pt ≈ 10.55559pt)。这是通过将字体中的a和 的宽度相加而得出的。b\tenrm


在第二种情况下\hbox{a.b},宽度为873816sp (= 873816/65536 pt ≈ 13.33337pt)。这是通过将字体中的a.和 的宽度相加而得出的。b\tenrm


在第三种情况下\hbox{a b},宽度为910224sp (≈ 13.88892pt)。在这种情况下,粘连是正常的单词间粘连,计算自字体。此胶水具有:

  • 自然宽度\fontdimen2\font=218453(≈3.33333pt)。

  • 拉伸\fontdimen3\font= 109226 (≈ 1.66666pt)。

  • 收缩\fontdimen4\font= 72818 (≈ 1.11111pt)。

因此我们取的宽度\hbox{ab}并加上上面粘合的自然宽度,得到 691771 + 218453 = 910224。


在第四种情况下\hbox{a. b},宽度为1165087sp (= 17.77782pt)。此处粘连较大,因为其.空间因子为 3000。自然宽度、拉伸和收缩从上一种情况转换为:

  • 自然宽度:添加\fontdimen7\font=72818(≈ 1.11111pt),得到 218453+72818=291271(≈ 4.44444pt)。

  • 拉伸:乘以f/1000=3,所以109226*3 = 327678(≈4.99997pt)。

  • 缩小:乘以 1000/f=1/3,所以 72818/3 = 24272 (≈ 0.37036pt)。

因此我们取的宽度\hbox{a.b},并添加上面的自然宽度,得到 873816 + 291271 = 1165087。


在第五种情况下\hbox spread -1pt{a. b},宽度为1099551(≈ 16.77782pt)。我们只需按照要求将之前的宽度减少 65536(=1pt)即可获得此值,因此 1165087 - 65536 = 1099551。

与自然宽度 1165087 相比,其减少了 24272 个缩减量(因此 1165087 - 24272 = 1140815 ≈ 17.40745pt),这又减少了 41264 个(≈0.62964pt),因此您会收到一个提及该长度的过满警告。或者正如 @frougon 指出的那样,我们可以看到可用的缩减量为 24272,而我们要求的缩减量为 65536,因此我们要求的缩减量比可用的缩减量多 65536 - 24272 = 41264 个。

相关内容