如何让命令在一个参数中只执行一次?

如何让命令在一个参数中只执行一次?

我想创建一个类似于 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 的源代码,但我不明白它是如何工作的,以及如何修改它以满足我的需求(我也尝试了上述使用ifthenetoolbox包的方法,结果相同)。为什么布尔值没有变为 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}

在此处输入图片描述

相关内容