\pushQED​​ 和 \popQED 起什么作用?

\pushQED​​ 和 \popQED 起什么作用?

我已经看到过这些命令\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{}

在此处输入图片描述

相关内容