为什么这个例子中需要 \leavevmode?

为什么这个例子中需要 \leavevmode?

\leavevmode在下面的 mwe 中,如果我在环境的重新定义中注释掉equation*,证明标题就会消失

\documentclass{article}
\usepackage{amsmath}
\usepackage{amsthm}

% from https://tex.stackexchange.com/a/59955/172923
\makeatletter
\newcommand{\settowidthofalign}[2]{%
  \setbox\z@=\vbox{
    \begin{align*}
    #2
    \ifmeasuring@\else\global\let\got@maxcolwd\maxcolumn@widths\fi
    \end{align*}
  }%
  \begingroup
  \def\or{+}\edef\x{\endgroup#1=\dimexpr\got@maxcolwd\relax}\x}
\makeatother

\ExplSyntaxOn

\dim_new:N \l_eqn_width_dim

\cs_set_eq:cc { oldequation* }{ equation* }
\cs_set_eq:cc { endoldequation* }{ endequation* }

\RenewDocumentEnvironment{ equation* }{ +b }
  {
    %\leavevmode
    \settowidthofalign{ \l_eqn_width_dim } { #1 }
    \begin{oldequation*} #1 \end{oldequation*}
  }{}

\ExplSyntaxOff

\begin{document}
\begin{proof}
  \begin{equation*}
    a + b = c
  \end{equation*}
\end{proof}
\end{document}

没有\leavevmode

在此处输入图片描述

\leavevmode

在此处输入图片描述

造成这种行为的原因是什么?

答案1

当您说 时\begin{proof},标签“证明”是通过 获得的\item[...],并且它是 的标准功能trivlist(用于实现proof),当扫描和排版跟在它后面的第一个文本时,标签的排版会延迟。

在你的情况下,这发生在\begin{align*} 里面执行\vbox了,因此标签会随盒子一起丢失。

您需要\leavevmode在 的开头\settowidthofalign。只是为了安全起见:无论如何,用显示开始证明并不是最好的选择。

相关内容