\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
。只是为了安全起见:无论如何,用显示开始证明并不是最好的选择。