我是 LaTeX 的初学者。从我找到的许多示例中,我注意到使用命令非常常见\leavevmode
。我找不到有关此命令的任何信息。有人能告诉我它的功能是什么以及如何使用它吗?
答案1
由 LaTeX 和 plainTeX定义\leavevmode
,用于确保结束垂直模式并进入水平模式。在垂直模式下,TeX 垂直堆叠水平框,而在水平模式下,它们被视为文本行的一部分。
例如,\mbox{..}
定义为\leavevmode\hbox{..}
确保如果在段落开头使用,则进入水平模式。如果仅使用,则将\hbox{ }
其堆叠在以下段落上方。
比较:
Text\par\hbox{Hello} World
结果:
Text
Hello
World
和:
Text\par\mbox{Hello} World
结果:
Text
Hello World
您会看到,在第一种情况下,\hbox
由于是在垂直模式下处理的,所以垂直堆叠了两个段落(但没有段落缩进)。在第二种情况下,首先进入水平模式,因此Hello
作为第二段的一部分进行处理。
用于
\leavevmode
所有可以在段落开头使用的宏,并自行添加水平框(例如以文本形式)。
有关更多阅读内容,\leavevmode
请参阅 Donald E. Knuth 编写的《TeXBook》,附录 A,第 13.1 节,第 313 页以及附录 B,第 356 页。
答案2
随着 2018/12/01 LaTeX 的发布,发生了一些变化\leavevmode
。
命令没有改变,但其他一些命令被修改了。特别是
\thinspace
\negthinspace
\enspace
\finph@nt
(由\phantom
、\hphantom
和 所使用\vphantom
)\finsm@sh
(由 使用\smash
)\big
,,,,\Big
\bigg
\Bigg
被修改为添加\leavevmode@ifvmode
,这是一种“隐式的” \leavevmode
。
这些命令的问题是,如果在垂直模式下发出,它们不会启动新段落。例如,\thinspace
和\negthinspace
会\enspace
添加垂直的间距和
... end of a paragraph.
\phantom{X}Other text
将产生一个空行,并在正常缩进处显示“其他”。
在新版本中,如果需要(即,如果在段落结尾后找到,如上例所示),所有上述命令都将正确地开始一个新段落。 的定义\leavevmode@ifvmode
是
% latex.ltx, line 1633:
\protected\def\leavevmode@ifvmode{\ifvmode\expandafter\indent\fi}
这使得之前的一些用法变得多余。不再需要的\leavevmode
典型代码如下\leavevmode
\newcommand{\foo}[1]{\leavevmode\smash{#1}...}
\smash
不过,依赖或功能\phantom
不启动垂直模式的代码将不再按预期工作。据我们所知,这种情况很少见。这可以通过添加进一步的装箱级别来解决。因此,像
\newcommand{\foo}[1]{\vadjust{\smash{#1}}}
(几天前我看到的)应该变成
\newcommand{\foo}[1]{\vadjust{\hbox{\smash{#1}}}}
因为\hbox
仍然没有启动水平模式。