重新定义 align* 环境后,如何修复“Package amsthm 警告:\qedhere 命令...”

重新定义 align* 环境后,如何修复“Package amsthm 警告:\qedhere 命令...”

以下 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中时,会发出警告。foofoo@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

相关内容