如何在证明环境末尾用 \qed 标记添加定理编号

如何在证明环境末尾用 \qed 标记添加定理编号

我使用amsthm。所有定理类环境都使用一个公共计数器。由于我有一些非常长的证明,我想在证明末尾的方框/正方形/qed 标记旁边添加证明所引用的定理编号。

\qedsymbol像这样更新命令:

\renewcommand\qedsymbol{\ensuremath{\openbox}~\arabic{theorem}}

几乎没问题。唯一的问题是,如果我的证明中有一些事实或引理,

\begin{theorem}
\end{theorem}
\begin{proof}
  ...
  \begin{fact}
    ...
  \end{fact}
  ...
\end{proof}

那么的数字\qed就是这个事实的数字而不是定理的数字。

我很失望,因为看到amsthm.sty文件中的证明定义

\newenvironment{proof}[1][\proofname]{\par
  \pushQED{\qed}%
  \normalfont \topsep6\p@\@plus6\p@\relax
  \trivlist
  \item[\hskip\labelsep
         \itshape
    #1\@addpunct{.}]\ignorespaces
}{%
  \popQED\endtrivlist\@endpefalse
}
\providecommand{\proofname}{Proof}

我可以看到,当环境初始化时,qed 以某种方式被处理并放在某个堆栈上,然后它就被弹出。所以它可以记住原始定理数。

我怀疑我的问题是由于对我的评估\qedsymbol被推迟到证明环境关闭而引起的。

有没有办法强制它在某个地方进行评估\pushQED{\qed}%

或者也许有人可以解释一下这些行中实际上发生了什么,以便我自己可以摆弄它?:

\newcommand{\pushQED}[1]{%
  \toks@{\qed@elt{#1}}\@temptokena\expandafter{\QED@stack}%
  \xdef\QED@stack{\the\toks@\the\@temptokena}%
}
\newcommand{\popQED}{%
  \begingroup\let\qed@elt\popQED@elt \QED@stack\relax\relax\endgroup
}

我最先进的想法是

\renewcommand{\qedsymbol}{\edef\qednow{\ensuremath{\openbox}~\arabic{theorem}}\qednow}

但效果不太好。

答案1

为什么不利用这个\label设施呢?例如:

\documentclass{article}
\usepackage{amsthm}

\renewcommand\qedsymbol{\ensuremath{\openbox}~\ref{\theqedlabel}}
\def\qedlabel#1{\def\theqedlabel{#1}}

\newtheorem{theorem}{Theorem}

\begin{document}

\begin{theorem}\label{mythm}
This is a theorem.
\end{theorem}

\begin{proof}
\qedlabel{mythm}
This is the proof.
\end{proof}

\end{document}

这种方法不需要对所有内容都使用单个计数器。这意味着,例如,证明的顺序可以与定理的顺序不同。或者可以构建上述代码的变体,允许在墓碑后插入包含对所证明内容的更完整标识,例如“定理 m”或“引理 n”。(构造留作练习。)

答案2

似乎你有类似的东西

\newtheorem{theorem}{Theorem}
\newtheorem{fact}[theorem]{Fact}

然后,\begin{fact}...\end{fact}计数器theorem将会步进并\arabic{theorem}变为分配给的数字fact

您可以使用\pushQED,但要重新定义它:

\let\ORIpushQED\pushQED
\def\pushQED#1{\begingroup\edef\x{\endgroup
  \noexpand\ORIpushQED{\unexpanded{#1}\noexpand~\arabic{theorem}}}\x}

\begingroup和的目的\endgroup只是没有留下一个定义\x

相关内容