问题涉及TeXbook,第 78 页,第 4 个危险弯段。
例如,假设
\baselineskip=12pt plus 2pt
、\lineskip=3pt minus 1pt
和\lineskiplimit=2pt
... 进一步假设一个深度为 3pt 的框最近被添加到当前垂直列表中;我们即将添加一个高度为H。 如果H= 5pt,行间粘连将是 4pt 加 2pt,因为当我们添加时,这将使基线相距 12pt 加 2ptH并将之前的深度添加到行间粘合。但如果H= 8pt,行间粘连将是 3pt 减 1pt,因为在忽略拉伸和收缩时\lineskip
将选择以避免违反给定值。\lineskiplimit
本段末尾提到,该示例中忽略了拉伸和收缩。但如果不忽略它们,答案会有什么变化?
以下考虑是否正确?
8+3=11pt
这小于\lineskiplimit
除边缘之外,但使用拉伸分量\baselineskip
(加 2pt)\lineskiplimit
不超过,因为
12+2 = 14-(8+3) = 3 > \lineskiplimit
1pt plus 2pt
所以必须使用胶水。
答案1
请考虑以下示例:
\showboxdepth=\maxdimen \showboxbreadth=\maxdimen \tracingonline=1
\baselineskip=12pt plus 2pt
\lineskip=3pt minus 1pt
\lineskiplimit=2pt
\setbox0=\vbox{
\hbox{\vrule height 5pt depth 3pt} % this has depth 3pt
\hbox{\vrule height 5pt} % this has height 5pt
}
\showbox0
\setbox0=\vbox{
\hbox{\vrule height 5pt depth 3pt} % this has depth 3pt
\hbox{\vrule height 8pt} % this has height 8pt
}
\showbox0
\bye
终端上的输出是
> \box0=
\vbox(17.0+0.0)x0.4
.\hbox(5.0+3.0)x0.4
..\rule(5.0+3.0)x0.4
.\glue(\baselineskip) 4.0 plus 2.0
.\hbox(5.0+0.0)x0.4
..\rule(5.0+*)x0.4
! OK.
l.11 \showbox0
?
> \box0=
\vbox(19.0+0.0)x0.4
.\hbox(5.0+3.0)x0.4
..\rule(5.0+3.0)x0.4
.\glue(\lineskip) 3.0 minus 1.0
.\hbox(8.0+0.0)x0.4
..\rule(8.0+*)x0.4
! OK.
l.17 \showbox0
?
这反映了您在 TeXbook 中的引用内容。
现在,我们将示例修改为
\showboxdepth=\maxdimen \showboxbreadth=\maxdimen \tracingonline=1
\baselineskip=12pt plus 2pt
\lineskip=3pt minus 1pt
\lineskiplimit=2pt
\setbox0=\vbox spread 2pt{
\hbox{\vrule height 5pt depth 3pt} % this has depth 3pt
\hbox{\vrule height 5pt} % this has height 5pt
}
\showbox0
\setbox0=\vbox spread 2pt{
\hbox{\vrule height 5pt depth 3pt} % this has depth 3pt
\hbox{\vrule height 8pt} % this has height 8pt
}
\showbox0
\bye
现在终端上的输出是
> \box0=
\vbox(19.0+0.0)x0.4, glue set 1.0
.\hbox(5.0+3.0)x0.4
..\rule(5.0+3.0)x0.4
.\glue(\baselineskip) 4.0 plus 2.0
.\hbox(5.0+0.0)x0.4
..\rule(5.0+*)x0.4
! OK.
l.11 \showbox0
?
Underfull \vbox (badness 10000) detected at line 16
\vbox(21.0+0.0)x0.4
.\hbox(5.0+3.0)x0.4
..\rule(5.0+3.0)x0.4
.\glue(\lineskip) 3.0 minus 1.0
.\hbox(8.0+0.0)x0.4
..\rule(8.0+*)x0.4
> \box0=
\vbox(21.0+0.0)x0.4
.\hbox(5.0+3.0)x0.4
..\rule(5.0+3.0)x0.4
.\glue(\lineskip) 3.0 minus 1.0
.\hbox(8.0+0.0)x0.4
..\rule(8.0+*)x0.4
! OK.
l.17 \showbox0
?
第一个盒子有足够的伸展空间以便装满,而第二个盒子却没有。
相反,如果我们改成spread 2pt
,spread -1pt
终端上的输出将是
Overfull \vbox (1.0pt too high) detected at line 10
\vbox(16.0+0.0)x0.4
.\hbox(5.0+3.0)x0.4
..\rule(5.0+3.0)x0.4
.\glue(\baselineskip) 4.0 plus 2.0
.\hbox(5.0+0.0)x0.4
..\rule(5.0+*)x0.4
> \box0=
\vbox(16.0+0.0)x0.4
.\hbox(5.0+3.0)x0.4
..\rule(5.0+3.0)x0.4
.\glue(\baselineskip) 4.0 plus 2.0
.\hbox(5.0+0.0)x0.4
..\rule(5.0+*)x0.4
! OK.
l.11 \showbox0
?
> \box0=
\vbox(18.0+0.0)x0.4, glue set - 1.0
.\hbox(5.0+3.0)x0.4
..\rule(5.0+3.0)x0.4
.\glue(\lineskip) 3.0 minus 1.0
.\hbox(8.0+0.0)x0.4
..\rule(8.0+*)x0.4
! OK.
l.17 \showbox0
?
第一个盒子超载了 1pt,因为没有可收缩性;另一方面,第二个盒子很好,因为它有可收缩性。
如您所见,在这三种情况下,.\glue(\baselineskip)
和\glue(\lineskip)
线都是相同的。
“忽略拉伸和收缩”的意思是,行间粘连的计算仅考虑 的自然大小\baselineskip
;如果\lineskiplimit
不超过 ,则\baselineskip
插入 ,其自然大小适当减小,并带有规定的plus
和minus
组件;否则\lineskip
插入 ,其plus
和minus
组件。当正在构建的垂直列表(通常但不一定是一个段落)被装入垂直框(通常用于发送页面)时,可拉伸性和可收缩性将起作用。
因此,第一个框中的粘连计算为:12 - 3 - 5 = 4 > \lineskiplimit
,因此将基线跳过粘连设置为4pt plus 2pt
;在第二个框中,我们有12 - 3 - 8 = 1 < \lineskiplimit
,因此\lineskip
使用。的可拉伸性和可收缩性\baselineskip
在此计算中不起作用:TeX 无法知道当前垂直列表最终所在的框是否需要拉伸或收缩粘连。