\vbox 之间有额外的行间粘连吗?

\vbox 之间有额外的行间粘连吗?

在下面的例子中,我\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 Topic15.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\baselineskip12pt-8.9pt=3.1pt

您还可以通过\tracingoutput1添加到源中来进一步诊断:

..\glue(\baselineskip) 3.1

相关内容