我想创建一个命令,在第二次调用时更改其输出。例如,我希望它在第一次调用时产生 1,第二次调用时产生 2:
\newcommand\mycommand { do stuff }
\mycommand % yields 1
\mycommand % yields 2
我的想法是定义一个全局变量,类似于\hasbeencalled
,然后在调用该命令时全局重新定义该变量。类似于:
\def\hasbeencalled{0}
\newcommand\mycommand[1] {
\ifnum\hasbeencalled=0
1
\global\def\hasbeencalled{1}
\else
2
\fi
}
但这不起作用。不知何故,全局重新定义会追溯发生并改变它,以便我得到输出
\mycommand % yields 2
\mycommand % yields 2
但如果我拿走\global
,那么我得到
\mycommand % yields 1
\mycommand % yields 1
我能做些什么?
答案1
答案2
您可以设置一个“切换”,它开始是假的,一旦您收到特殊输入就会设置为真。
下面我制作了一个\if
代表此切换的按钮:
\documentclass{article}
\makeatletter
\newif\if@mycommand@special
\newcommand\mycommand[1]{%
\ifnum\pdfstrcmp{#1}{7}=0 % Compare argument to "7" (or something special)
\if@mycommand@special
#1 (subsequent call)%
\else
#1 (first call)%
\fi
\global\@mycommand@specialtrue% "7" has been used...
\else
#1% Do something else
\fi
}
\makeatother
\begin{document}
\setlength{\parindent}{0pt}% Just for this example
\mycommand{1}
\mycommand{2}
\mycommand{1}
\mycommand{7}
\mycommand{9}
\mycommand{7}
\mycommand{9}
\mycommand{7}
\end{document}
比较是使用 e-TeX 的 进行的,它执行字符串比较。如果= ,\pdfstrcmp{<strA>}{<strB>}
则结果为 0 。<strA>
<strB>
答案3
这可能是一个简单的输入错误。在您的版本中,\ifnum
您使用\hasbeenseen
,但在其他地方则使用\hasbeencalled
。如果您更改它,您将获得一个有效的
\documentclass{article}
\begin{document}
\def\hasbeencalled{0}
\newcommand\mycommand[1] {
\ifnum\hasbeencalled=0
1
\global\def\hasbeencalled{1}
\else
2
\fi
}
\mycommand{}
\mycommand{}
\end{document}
请注意,您\mycommand
使用强制参数(您不使用)来定义,因此您应该调用它
\mycommand{}
\mycommand{}
给出空的参数。一个简单的
\mycommand
\mycommand
将导致将第二个\mycommand
作为第一个的参数插入,从而只显示一个数字。