TeX - LaTeX Stack Exchange is a question and answer site for users of TeX, LaTeX, ConTeXt, and related typesetting systems. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I want to create a command that changes its output the second time it gets called. For example, I want it to yield 1 the first time it's called, and 2 the second time:

\newcommand\mycommand { do stuff }
\mycommand % yields 1
\mycommand % yields 2

My idea was to define a global variable, something like \hasbeencalled, and globally redefine that variable if the command has been called. Something like:

\def\hasbeencalled{0}
\newcommand\mycommand[1] {
    \ifnum\hasbeencalled=0
        1
        \global\def\hasbeencalled{1}
    \else
         2
    \fi
}

But this doesn't work. Somehow the global redefinition happens retroactively and changes it so that I get the output

\mycommand % yields 2
\mycommand % yields 2

But if I take away the \global, then I get

\mycommand % yields 1
\mycommand % yields 1

What can I do?

share|improve this question

enter image description here

as plain tex but works in latex as well:

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

\mycommand

\mycommand

\mycommand

\bye
share|improve this answer
    
+1 That's what I do so often! – yo' Jan 14 at 8:21
    
\bye in LaTeX? – cfr Jan 15 at 2:05
    
@cfr as it says in what I wrote, the example is plain tex, but the definition would work in latex. – David Carlisle Jan 15 at 7:49
    
All I meant was that somebody who doesn't know much about TeX/LaTeX is likely to copy paste all of the code and not realise they should just use the relevant bit. But maybe I'm wrong about that. – cfr Jan 15 at 20:23

You can just set a "toggle", which starts out as being false, and is set to true once you've received the special input.

Below I've made an \if that represents this toggle:

enter image description here

\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}

Comparison is done using e-TeX's \pdfstrcmp{<strA>}{<strB>}, which performs a string comparison. The result is 0 if the <strA> = <strB>.

share|improve this answer
    
Thanks for your quick reply. I don't know why, but this isn't working where I'm applying it. I'm trying to use it inside of a tikz plot, and I get "subsequent call" all times :\ – rhombidodecahedron Jan 14 at 1:43
1  
@rhombidodecahedron: The usage of this within some other context surely makes for a complication. Could you please add these details to your question so we can replicate your problem? – Werner Jan 14 at 1:47
1  
@rhombidodecahedron If you mean pgfplots by TikZ yes it won't work. You have to expand the macro immeadiately before the axis environment is finished. – percusse Jan 14 at 5:57
    
@percusse how can I do that? – rhombidodecahedron Jan 14 at 17:38
    
@rhombidodecahedron: Please show us a use-case. – Werner Jan 14 at 19:26

This might be a simple typing error. In your \ifnum you use \hasbeenseen but everywhere else it's \hasbeencalled. If you change it you get a working

\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}

Please note that you define \mycommand with an mandatory argument (which you don't use) so you should call it

\mycommand{}
\mycommand{}

giving empty arguments. A simple

\mycommand
\mycommand

will result in plugging the second \mycommand as argument for the first one and thus only showing one number.

share|improve this answer
    
And you get so many spaces… ;-) – egreg Jan 14 at 9:20
    
@egreg: I suspected, Werner had only presented us a reduced version and his real-world use actually uses this argument, so I didn't change the definition. – David Woitkowski Jan 14 at 12:11
    
I think @egreg means the other spaces, but I could be mistaken. – cfr Jan 15 at 2:04

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.