关于垂直粘连的问题(涉及 TeXbook 的示例)

关于垂直粘连的问题(涉及 TeXbook 的示例)

问题涉及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 2ptspread -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插入 ,其自然大小适当减小,并带有规定的plusminus组件;否则\lineskip插入 ,其plusminus组件。当正在构建的垂直列表(通常但不一定是一个段落)被装入垂直框(通常用于发送页面)时,可拉伸性和可收缩性将起作用。

因此,第一个框中的粘连计算为:12 - 3 - 5 = 4 > \lineskiplimit,因此将基线跳过粘连设置为4pt plus 2pt;在第二个框中,我们有12 - 3 - 8 = 1 < \lineskiplimit,因此\lineskip使用。的可拉伸性和可收缩性\baselineskip在此计算中不起作用:TeX 无法知道当前垂直列表最终所在的框是否需要拉伸或收缩粘连。

相关内容