我使用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
。