为什么 \vadjust 的深度不影响行间粘连?

为什么 \vadjust 的深度不影响行间粘连?

请考虑以下示例:

示例1.tex

%\input vadjust_hook
\def\marginalstar{\strut\vadjust{\kern-\dp\strutbox\specialstar}}
\def\specialstar{\vtop to \dp\strutbox{
    \baselineskip\dp\strutbox
    \vss\llap{* }\null}}
\input template

example1.tex 的输出

\hbox(6.94444+1.94444)x57.81621, glue set 1.173 []
\penalty 150
\glue(\baselineskip) 1.55556
\hbox(8.5+3.5)x57.81621, glue set 0.10767 []
\kern -3.5
\vbox(0.0+3.5)x0.0, glue set - 7.5fil []
\penalty 150
\glue(\baselineskip) 1.55556
\hbox(6.94444+1.94444)x57.81621, glue set 11.09389fil []

示例1

示例2.tex

%\input vadjust_hook
\def\marginalstar{\strut\vadjust{\vskip-\dp\strutbox\specialstar}}
\def\specialstar{\vtop to 1pt{
    \baselineskip=1pt
    \vss\llap{* }\null}}
\input template

example2.tex 的输出

\hbox(6.94444+1.94444)x57.81621, glue set 1.173 []
\penalty 150
\glue(\baselineskip) 1.55556
\hbox(8.5+3.5)x57.81621, glue set 0.10767 []
\glue -3.5
\vbox(0.0+1.0)x0.0, glue set - 7.5fil []
\penalty 150
\glue(\baselineskip) 1.55556
\hbox(6.94444+1.94444)x57.81621, glue set 11.09389fil []

示例2

以下是需要的文件\input

vadjust_hook.tex

\let\oldvadjust\vadjust
\def\vadjust{%
  \begingroup\def\par{\endgraf\showboxdepth0\showboxbreadth\maxdimen\showlists\endgroup}%
  \oldvadjust
}

模板.tex

\nopagenumbers
\hsize0.8in
\noindent
Quick brown fox eats a
\marginalstar
fat big
mouse.
\bye

通过比较示例的轨迹,我们可以看到 vbox 的深度不会影响行间粘连的计算。为什么?如果行间粘连相同,为什么生成的文档会有所不同?

答案1

您可以通过\vadjust{parameter}在其参数中扩展宏来创建垂直材料。但这会在水平模式下立即处理,并且宏程序员无法测量前一行的深度,因为此时此行不存在。并且的结果是一个固定的垂直列表,在知道段落行数后无法修改。(有一个例外:您可以在使用、\vadjust后重新装箱整个段落,但不幸的是,这种处理有很多限制。)\par\lastbox\unskip\unpenalty

使用时有一个保证\vadjust:如果生成的垂直列表的高度加深度为零,则段落中的行间网格将被保留,因为行间粘连是从前一行到下一行计算的,无论是否插入垂直材料\vadjust

您的问题“为什么”可以回答:因为上述的保证。

问题在于,这种\vadjust材料(高度加深度为零)相对于行网格的相对位置取决于前一行的深度。如果您需要将其固定到行网格,则必须\strut在段落文本中使用,并且您必须打赌这\strut不会破坏行间粘合。

在您的第一个例子中:\vadjust材料的高度加深度为零,\kern-\dp\strutbox \vtop to\dp\strutbox{...\vss\null}但在您的第二个例子中,材料的高度加深度为零,-\dp\strutbox+1pt并且通常为负数。这就是您的示例不同的原因。

相关内容