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. expl3
Lö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}
Antwort2
Ich liebe es, Zähler zu verwenden! Hier wird nur die Erweiterung nach der in angegebenen Zahl \changedefinitionafter
geä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}
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}
Beachten Sie, dass die Verwendung solcher Befehle beim Verschieben von Argumenten aus mehreren Gründen fehlschlägt.