防止在 vbox 开头的特殊字符后跳过 parskip

防止在 vbox 开头的特殊字符后跳过 parskip

如果我理解正确,当进入不受限制的水平模式时,如果包含的垂直列表非空,TeX 会插入 parskip。即使列表中的唯一项目实际上不是段落,而是特殊的:

\vbox{\special{}x}

在这种情况下,有没有办法防止出现 parskip 现象?

更具体地说,我该如何编写一个\foo涉及\special并应在这两种情况下起作用的宏:

\vbox{\foo x}
\vbox{\foo\hbox{x}}

即宏之后是否进入水平模式。第一种情况可以通过添加\leavevmode到宏来解决,但对于第二种情况,这不是一个选项。

但我无法检测扩展过程中\foo是否\leavevmode需要这样做。

答案1

这就是为什么\color有时会影响间距,它在经典 tex 中基本上不可溶解。

使用 e-tex 你可以发现一些案例


\tracingoutput1
\tracingonline1
\showboxdepth=6

\def\foo{%
\ifnum\currentgrouptype=4
\ifnum\lastnodetype=-1
\vbox\bgroup\aftergroup\foox
\else
\special{}%
\fi
\else
\special{}%
\fi}

\def\foox{\setbox0\lastbox\special{}\unvbox0\egroup}

\vbox{\foo x}

\bye

生产一个盒子

..\vbox(4.30554+0.0)x469.75499
...\special{}
...\hbox(4.30554+0.0)x469.75499, glue set 444.47719fil
....\hbox(0.0+0.0)x20.0
....\tenrm x
....\penalty 10000
....\glue(\parfillskip) 0.0 plus 1.0fil
....\glue(\rightskip) 0.0

其中特殊位置位于带有 x 的 hbox 之前。

这基本上检测它是否在 vbox 的开始处,如果是,则创建一个没有的 vbox,\special然后在添加后重新装箱,\special 但在实际文档中使用这样的代码而不破坏某些东西是很困难的

相关内容