Befehl, der seine Definition beim n-ten Mal ändert

Befehl, der seine Definition beim n-ten Mal ändert

Ich brauche einen Befehl, der sich beim ersten Aufruf anders verhält als bei den nächsten Malen. Momentan verwende ich \newcommand\foo{First\gdef\foo{Next}}, das heißt, er definiert sich beim ersten Aufruf selbst neu.

Darüber hinaus muss ich seine Bedeutung irgendwann „zurücksetzen“, also definiere ich \newcommand\resetfoo{\gdef\foo{First\gdef\foo{Next}}}.

Aber das scheint mir ziemlich schwierig. Vielleicht gibt es eine übliche Methode, dies zu tun, aber ich kenne sie nicht (außerdem weiß ich fast nichts überErweiterung). Welches ist der richtige Weg, um diese Art von Problem zu lösen?

Frage

Wie die Frage schon sagt, brauche ich einen allgemeineren Weg: eine Funktion, um ihre Definition in ihrerNdie „Erweiterung“ (ich bin mir nicht sicher, ob ich das Wort an der richtigen Stelle verwende). Wie würdest du dieses Problem lösen? Ich brauche auch die notwendigen \resetfoo.

Falls dies nicht bereits irgendwie geschehen ist, wäre meine Idee, einen Befehl \changedefinitionafter\foo{3}{OneTwoThree}{Next}oder etwas in der Art zu haben. expl3Lösungen sind auch willkommen.

Hier ist ein allgemeineres MWE.

\documentclass{scrartcl}

\newcommand\foo{First\gdef\foo{Next}}
\newcommand\resetfoo{\gdef\foo{First\gdef\foo{Next}}}

\begin{document}

\foo~\foo~\foo
\resetfoo~\foo~\foo

\end{document}

Auch Tags und Vorschläge für den Titel der Frage sind willkommen.

Antwort1

Schauen Sie sich das folgende Beispiel an:

\documentclass{article}

\newcounter{testcount}

\newcommand{\modifyme}{%
\addtocounter{testcount}{1}
\ifnum\thetestcount<3%
    Hello 
\fi
\ifnum\thetestcount>2%
    World
\fi
}

\newcommand{\resetme}{\setcounter{testcount}{0}}

\begin{document}

\modifyme

\modifyme

\modifyme

\modifyme

\resetme

\modifyme

\end{document}

Aktualisiertes Beispiel

Antwort2

Ich liebe es, Zähler zu verwenden! Hier wird nur die Erweiterung nach der in angegebenen Zahl \changedefinitionaftergeändert.

\documentclass{article}
\pagestyle{empty}% for cropping
\makeatletter
\newcount\count@foo
\newcount\nth@foo
\newcommand\changedefinitionafter[4]{
    % #1: name of macro
    % #2: exceptional occurence
    % #3: normal expansion
    % #4: exceptional expansion
    \global\count@foo=0
    \global\nth@foo=#2
    \gdef#1{%
        \advance\count@foo by 1
        \ifnum\count@foo=\nth@foo
            #4%
        \else
            #3%
        \fi
    }
    \edef\resetname{reset\expandafter\@gobble\string#1}
    \expandafter\gdef\csname \resetname \endcsname{\global\count@foo=0 }
}
\makeatother
\begin{document}
\obeylines
\changedefinitionafter\foo{3}{OneTwoThree}{Next}
\foo
\foo
\foo
\foo
\resetfoo
\foo
\foo
\foo
\foo
\end{document}

Bildbeschreibung hier eingeben

Antwort3

Kein Zähler, aber drei Makros für jeden Befehl dieses Typs:

\documentclass{article}

\makeatletter
\newcommand{\newchangingcommand}[4]{%
  % #1 = macro name
  % #2 = steps
  % #3 = value until step #1
  % #4 = value from step #1
  \@namedef{\string#1@counter}{0}%
  \@namedef{\string#1@limit}{#2}%
  \def#1{%
     % step the counter
     \global\@nameedef{\string#1@counter}{\number\numexpr\@nameuse{\string#1@counter}+1\relax}%
     \ifnum\@nameuse{\string#1@counter}=\@nameuse{\string#1@limit}\relax
       \gdef#1{#4}#4%
     \else
       #3%
     \fi
  }%
}
\providecommand\@nameedef[1]{\expandafter\edef\csname#1\endcsname}
\makeatother

\newchangingcommand{\foo}{3}{Two}{Next}
\newchangingcommand{\foob}{2}{One}{Next}

\begin{document}

\foo--\foob\par
\foo--\foob\par
\foo--\foob\par
\foo--\foob\par

\end{document}

Bildbeschreibung hier eingeben

Beachten Sie, dass die Verwendung solcher Befehle beim Verschieben von Argumenten aus mehreren Gründen fehlschlägt.

verwandte Informationen