请考虑以下示例:
示例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 []
示例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 []
以下是需要的文件\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
并且通常为负数。这就是您的示例不同的原因。