\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 会位于同一个水平列表中。