如果命令已经被调用,如何改变其输出?

如果命令已经被调用,如何改变其输出?

我想创建一个命令,在第二次调用时更改其输出。例如,我希望它在第一次调用时产生 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

在此处输入图片描述

和普通 tex 一样,但也可以在乳胶中使用:

\def\mycommand{1\gdef\mycommand{2}}

\mycommand

\mycommand

\mycommand

\bye

答案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作为第一个的参数插入,从而只显示一个数字。

相关内容