\leavevmode 的功能和使用

\leavevmode 的功能和使用

我是 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仍然没有启动水平模式。

相关内容