请考虑以下示例:
\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 个。