\box 和 \unvbox 之间或 \box 和 \unhbox 之间有什么区别

\box 和 \unvbox 之间或 \box 和 \unhbox 之间有什么区别

\box和之间\unvbox\box和之间有什么区别\unhbox

答案1

如果你去\setbox0\hbox{abc},那么盒子 0 是一个盒子寄存器,其水平盒子包含三个项目,即 a、b 和 c 的字符节点。

所以如果您使用\box0它会将一个项目添加到当前列表,即一个 hbox。

但是如果您使用,\unhbox0那么您添加的是包含在盒子中的列表,而不是盒子本身,因此会添加 a、b 和 c 的节点。

\documentclass{article}

\showoutput

\begin{document}

\setbox0\hbox{abc}
1 xxx \box0 zzz

\setbox0\hbox{abc}
2 xxx \unhbox0 zzz


\end{document}

第一段是

....\hbox(0.0+0.0)x15.0
....\OT1/cmr/m/n/10 1
....\glue 3.33333 plus 1.66666 minus 1.11111
....\OT1/cmr/m/n/10 x
....\OT1/cmr/m/n/10 x
....\OT1/cmr/m/n/10 x
....\glue 3.33333 plus 1.66666 minus 1.11111
....\hbox(6.94444+0.0)x15.27782
.....\OT1/cmr/m/n/10 a
.....\OT1/cmr/m/n/10 b
.....\kern0.27779
.....\OT1/cmr/m/n/10 c
....\OT1/cmr/m/n/10 z
....\OT1/cmr/m/n/10 z
....\OT1/cmr/m/n/10 z
....\penalty 10000
....\glue(\parfillskip) 0.0 plus 1.0fil
....\glue(\rightskip) 0.0

xxx 后面的空格后面有一个水平盒子,但第二段是

....\hbox(0.0+0.0)x15.0
....\OT1/cmr/m/n/10 2
....\glue 3.33333 plus 1.66666 minus 1.11111
....\OT1/cmr/m/n/10 x
....\OT1/cmr/m/n/10 x
....\OT1/cmr/m/n/10 x
....\glue 3.33333 plus 1.66666 minus 1.11111
....\OT1/cmr/m/n/10 a
....\OT1/cmr/m/n/10 b
....\kern0.27779
....\OT1/cmr/m/n/10 c
....\OT1/cmr/m/n/10 z
....\OT1/cmr/m/n/10 z
....\OT1/cmr/m/n/10 z
....\penalty 10000
....\glue(\parfillskip) 0.0 plus 1.0fil
....\glue(\rightskip) 0.0

直接添加 a、b、c,不需要包含框。

直接添加列表意味着任何胶水都可以参与胶水拉伸,并且可以发生换行(几乎),就好像内容从未被装箱一样。

请注意,框始终可以放置在垂直或水平列表中,它只会影响框的堆叠方式,但只能将框取消装箱放入正确类型的列表中。

如果你将示例更改为

\documentclass{article}

\showoutput

\begin{document}

\setbox0\hbox{abc}
\box0 zzz

\setbox0\hbox{abc}
\unhbox0 zzz


\end{document}

你得到

在此处输入图片描述

因为\box0直接进入垂直列表而不开始一个段落,所以下面zzz会在下面开始一个新段落。相反,\unhbox0开始一个水平列表,所以会开始一个段落,所以会在一个段落缩进之后,后面的 zzz 会位于同一个水平列表中。

相关内容