在下面的例子中,我\strut
在两行中都使用了 's,但规则之间仍然有差距。为什么这两条规则之间会有差距?
示例 1:
\vbox{X\strut\hrule}
\vbox{\hrule Y\strut\hrule}
\bye
如果我们仅添加\nointerlineskip
或删除\vbox
一 X
或者Y
,那么差距就消失了。这该如何解释呢?
示例 2:
\vbox{X\strut\hrule}
\nointerlineskip
\vbox{\hrule Y\strut\hrule}
\bye
示例 3:
X\strut\hrule
\vbox{\hrule Y\strut\hrule}
\bye
示例 4:
\vbox{X\strut\hrule}
\hrule Y\strut\hrule
\bye
另外,如果我们从示例 1 中删除最后一个\hrule
,差距就会变得更大。为什么?
示例 5:
\vbox{X\strut\hrule}
\vbox{\hrule Y\strut}
\bye
答案1
\lineskip
在TeXbook 中查找\lineskiplimit
:没有额外的粘合,因为规则告诉 TeX 要这样做。
如果您查看 TeXbook 中的横线表示例,您会注意到已\strut
使用,但也\offinterlineskip
发出以消除所有行间粘连插入。
规则是 TeX 不会在规则前后添加行间粘连(无论如何用\baselineskip
或确定\lineskip
),但您的情况有所不同,因为规则埋在框中。因此,两个框之间的行间粘连的计算完全是通过查看它们的高度和深度来完成的。
\lineskip
例如,您可以尝试设置为 20pt 来查看效果。
回想一下,a 的深度\vbox
取决于最后的垂直列表中的项目和其余所有内容都添加到高度。
因此,第一个框\vbox
的深度为零,而第二个框的高度由最后一个项目是另一条规则这一事实决定,因此高度为 12.8pt,超出后\baselineskip-\lineskiplimit
进入\lineskip
场景。为什么是 12.8?第一个规则的高度为 0.4pt,水平框包含一个支柱,因此其高度加上深度为 12pt,然后还有另一条规则的高度为 0.4pt;最后一个规则没有深度,因此深度为零\vbox
。
..\vbox(12.79999+0.0)x469.75499
...\rule(0.4+0.0)x*
...\glue(\parskip) 0.0 plus 1.0
...\hbox(8.5+3.5)x469.75499, glue set 442.25497fil []
...\rule(0.4+0.0)x*
当然,添加\nointerlineskip
可以解决问题,或者通过告诉 TeX来\offinterlineskip
终止行间粘合计算,因此两条线永远不会太靠近彼此,并且基线跳过设置为 -1000pt。\lineskiplimit
\maxdimen
顶层\vbox
带有 后跟 的示例很明显:TeX 没有在规则之前和之后添加行间粘连。\hrule
答案2
在你的第一个例子中
\vbox{X\strut\hrule}
\vbox{\hrule Y\strut\hrule}
\setbox0\vbox{X\strut\hrule}
\the\ht0, \the\dp0
\setbox0\vbox{\hrule Y\strut\hrule}
\the\ht0, \the\dp0
\the\baselineskip
\nopagenumbers
\bye
所加的垂直胶水为\lineskip
胶水。
第二个盒子(也是第一个,但这与此无关,只与它的参考点的位置有关)的高度超过\baselineskip
,因此尝试将其参考点定位\baselineskip
在第一个盒子的参考点之下会导致从盒子 1 的底部到盒子 2 的顶部的距离为负。正如在Plain
处所\lineskiplimit
设置的0pt
,规则(参见TeX by Topic
,15.1 Interline glue
)导致TeX
插入\lineskip
胶水。
根据示例 5,以下是
\vbox{X\strut\hrule}
\vbox{\hrule Y\strut}
\setbox0\vbox{X\strut\hrule}
\the\ht0, \the\dp0
\setbox0\vbox{\hrule Y\strut}
\the\ht0, \the\dp0
\the\baselineskip
\nopagenumbers
\bye
生成:
它显示了盒子的参考点位于何处,因此插入Y
(所谓的)基线跳过粘合(与其本身不同)以使两个参考点分开:\baselineskip
\baselineskip
12pt-8.9pt=3.1pt
您还可以通过\tracingoutput1
添加到源中来进一步诊断:
..\glue(\baselineskip) 3.1