以下 MWE
\documentclass{article}
\usepackage{amsmath}
\usepackage{amsthm}
\ExplSyntaxOn
\cs_set_eq:cc { oldalign* }{ align* }
\cs_set_eq:cc { endoldalign* }{ endalign* }
\cs_set:cpn { endalign* }{ \endoldalign }
\RenewDocumentEnvironment{ align* }{ +b }
{ \begin{oldalign*} #1 \end{oldalign*}}
{}
\ExplSyntaxOff
\begin{document}
\begin{proof}
\begin{align*}
a + b &= c \qedhere
\end{align*}
\end{proof}
\end{document}
导致警告
Package amsthm Warning: The \qedhere command may not work correctly here on inp
ut line 22.
并导致 qed 符号的水平间距出现问题:
我该如何解决?
答案1
当出现在未定义的环境\qedhere
中时,会发出警告。foo
foo@qed
添加
\cs_new_eq:cc { oldalign*qed } { align@qed }
我怎么知道的?很简单,我查看了amsthm.sty
警告信息,发现
\def\qed@warning{%
\PackageWarning{amsthm}{The \@nx\qedhere command may not work
correctly here}%
}
好的,寻找\qed@warning
,然后:
\@ifpackageloaded{amsmath}{%
\def\math@qedhere{%
\@ifundefined{\@currenvir @qed}{%
\qed@warning\quad\hbox{\qedsymbol}%
}{%
\@xp\aftergroup\csname\@currenvir @qed\endcsname
}%
}
[...]
\@xp\let\csname align*@qed\endcsname\align@qed
[...]
现在我对 LaTeX 内部机制有所了解,知道这\@currenvir
是当前 LaTeX 所处环境的名称,因此我推断\align@qed
需要 和 类似的定义。再快速查看一下就会发现 的\align*@qed
定义(\csname
当然是用 )与 相同\align@qed
。