我已经看到过这些命令\pushQED
,并\popQED
在很多示例中使用过它们,其中许多与amsthm
proof
环境相关,但我找不到任何文档来解释它们实际上做什么或为什么需要它们。它们有什么作用?
答案1
\pushQED
和的基本目的\popQED
是确保当\qedhere
使用 时, 处不会出现 QED 符号\end{proof}
。
这也允许嵌套证明,这就是使用堆栈的原因。
\documentclass{article}
\usepackage{amsthm}
\newenvironment{innerproof}{%
\renewcommand{\qedsymbol}{\ensuremath{\clubsuit}}%
\proof[Inner proof]
}{\endproof}
\makeatletter
\AddToHook{cmd/endproof/before}{%
\expandafter\typeout\expandafter{\detokenize\expandafter{\QED@stack}}%
}
\makeatother
\begin{document}
\begin{proof}
This is a standard proof.
\end{proof}
\begin{proof}
This is a standard proof ending with an equation
\[
1=1. \qedhere
\]
\end{proof}
\begin{proof}
This proof has inner proofs inside it.
\begin{innerproof}
This has only text.
\end{innerproof}
Some text in between.
\begin{innerproof}
This ends with an equation
\[
0=0. \qedhere
\]
\end{innerproof}
Some final text.
\end{proof}
\end{document}
该\AddToHook
业务仅用于调试,因此我们可以看到每次调用时的堆栈\endproof
。在控制台(和日志文件)中,您将看到
\qed@elt {\qed }
\qed@elt {}
\qed@elt {\qed }\qed@elt {\qed }
\qed@elt {}\qed@elt {\qed }
\qed@elt {\qed }
这表明,当\qedhere
使用 时,堆栈顶部的项目,当\endproof
即将执行时,包含\qed@elt{}
,因此不会\qed
执行任何命令,因为\qedhere
已在相同环境中找到 。基本上,\qedhere
用 替换\qed@elt{\qed}
堆栈顶部的项目\qed@elt{}
。