基于这个问题以及令人惊叹的 @egreg 的回答,我决定进行一些测试来研究和了解一些盒子行为。更准确地说,是为了理解\leavevmode
。
在第一个例子中,一个水平框里面有两个垂直框,里面还有一些水平框,一切都很好。
在第二个例子中,我放入\leavevmode
了第一个垂直框,并且正如我所料,行为变为水平,因此aaa
和bbb
并排。
但输出完全受此影响。也就是说,第二个垂直框超出或超出范围。
那么,为什么第二个例子太宽了?
平均能量损失
\documentclass[11pt,a4paper]{report}
\usepackage{showframe}
\newcommand{\linha}{\noindent\makebox[0pt][l]{\rule[0pt]{\linewidth}{.4pt}}}
\begin{document}%
\noindent%
\hbox{%
\vbox{%\leavevmode%
\hbox{aaa}%
\hbox{bbb}%
}%
\vtop{%
\hbox{xxx}
\hbox{yyy}
\hbox{zzz}
}%
123456
}%
\medskip
\noindent%
\hbox{%
\vbox{\leavevmode%
\hbox{aaa}%
\hbox{bbb}%
}%
\vtop{%
\hbox{xxx}
\hbox{yyy}
\hbox{zzz}
}%
123456
}
\end{document}
答案1
它的定义是
\newbox\voidb@x % permanently void box register
\def\leavevmode{\unhbox\voidb@x}
因此在水平模式下它基本上不执行任何操作,而在垂直模式下它会强制启动水平模式(因此类似于原luatex
语\quitvmode
,除了对\everypar
令牌触发时间的一些边缘影响之外)。
\hbox
在 vmode 中沿垂直方向堆叠,在 hmode 中沿水平方向堆叠(因此模式名称)这解释了您显示的不同输出。
也许你会问为什么
\vbox{\leavevmode%
\hbox{aaa}%
\hbox{bbb}%
}%
这么宽?在垂直框内开始一个段落后,在框的末尾,该段落被分成长度为 的行\hsize
,\textwidth
因此该框的宽度等于页面的整个宽度。