我想创建一个类似于 AMS 的证明环境的命令,\qedhere
当它到达末尾时会自动调用一个命令(如 AMS 的),但允许您在需要时更早地调用该命令。就我而言,我希望命令执行一些代码并放置标签。当命令以文本结束时,标签就在正确的位置。但是当命令以显示的方程式结束时,标签就太靠后了。在这些情况下,我想手动将标签移动到正确的位置。我尝试用布尔值来判断是否已经到达末尾,但似乎直到命令结束后才会切换布尔值:
\documentclass{article}
\newcommand{\currentLabel}{\nosuchcommand}
\newcounter{exampleends}
\newif\ifendencountered
\newcommand{\exampleendhere}{\ifendencountered\else%
\stepcounter{exampleends}%
\label{e\currentLabel}%
\textbf{End of \currentLabel.}%
\endencounteredtrue%
\renewcommand{\currentLabel}{\nosuchcommand}%
\fi%
}
\newcommand{\myexample}[2]{%
\renewcommand{\currentLabel}{#1}%
\endencounteredfalse%
\textbf{Start of \currentLabel.}\label{#1}\\
#2\\
\exampleendhere}
\begin{document}
\myexample{exampleOne}{This is my example.}
\bigskip
\myexample{exampleTwo}{This is my next example.
\[1+1=2\exampleendhere\]}
\bigskip
example end called: \arabic{exampleends} time(s).
\end{document}
结果是:
我查看了 amsthm.sty 的源代码,但我不明白它是如何工作的,以及如何修改它以满足我的需求(我也尝试了上述使用ifthen
和etoolbox
包的方法,结果相同)。为什么布尔值没有变为 true?我如何删除最后一个“exampleTwo 的结尾”,并使增量\exampleends
仅增加两次?
答案1
放置\global
在 之前\endencounteredtrue
。由于它在您的 MWE 中,并且是在\[...\]
环境内部发出的,因此 的值\ifendencountered
在退出时会丢失,除非它被全局保存。
您可能还考虑将 更改#2\\
为#2\par\noindent
,但我在这里没有这样做。
\documentclass{article}
\newcommand{\currentLabel}{\nosuchcommand}
\newcounter{exampleends}
\newif\ifendencountered
\newcommand{\exampleendhere}{\ifendencountered\else%
\stepcounter{exampleends}%
\label{e\currentLabel}%
\textbf{End of \currentLabel.}%
\global\endencounteredtrue%
\renewcommand{\currentLabel}{\nosuchcommand}%
\fi%
}
\newcommand{\myexample}[2]{%
\renewcommand{\currentLabel}{#1}%
\endencounteredfalse%
\textbf{Start of \currentLabel.}\label{#1}\\
#2\\
\exampleendhere}
\begin{document}
\myexample{exampleOne}{This is my example.}
\bigskip
\myexample{exampleTwo}{This is my next example.
\[1+1=2\exampleendhere\]}
\bigskip
example end called: \arabic{exampleends} time(s).
\end{document}