\leavevmode 起什么作用?

\leavevmode 起什么作用?

基于这个问题以及令人惊叹的 @egreg 的回答,我决定进行一些测试来研究和了解一些盒子行为。更准确地说,是为了理解\leavevmode

在第一个例子中,一个水平框里面有两个垂直框,里面还有一些水平框,一切都很好。

在第二个例子中,我放入\leavevmode了第一个垂直框,并且正如我所料,行为变为水平,因此aaabbb并排。

但输出完全受此影响。也就是说,第二个垂直框超出或超出范围。

那么,为什么第二个例子太宽了?

在此处输入图片描述

平均能量损失

\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因此该框的宽度等于页面的整个宽度。

相关内容