Necesito que un comando se comporte de manera diferente la primera vez que las próximas veces que se llame. Ahora mismo uso \newcommand\foo{First\gdef\foo{Next}}
, es decir, se redefine a la primera.
Además, necesito “restablecer” su significado en algún momento, así que defino \newcommand\resetfoo{\gdef\foo{First\gdef\foo{Next}}}
.
Pero esto me parece bastante difícil. Puede que haya una forma habitual de hacer esto, pero no lo sé (además, no sé casi nada sobreexpansión). ¿Cuál es la forma correcta de resolver este tipo de problema?
Pregunta
Como dice la pregunta, necesito una forma más general: alguna función para cambiar su definición en sunorteª “expansión” (no estoy seguro de estar usando la palabra en el lugar correcto). Como resolverías este problema? Necesito también lo necesario \resetfoo
.
En caso de que no esté ya hecho de alguna manera, mi idea es tener algún comando \changedefinitionafter\foo{3}{OneTwoThree}{Next}
o algo así. expl3
La solución también es bienvenida.
Aquí hay un MWE más general.
\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}
Además, se aceptan etiquetas y sugerencias para el título de la pregunta.
Respuesta1
Eche un vistazo al siguiente ejemplo:
\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}
Respuesta2
¡Me encanta usar contadores! Aquí solo \changedefinitionafter
se modifica la expansión después del número especificado en .
\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}
Respuesta3
Sin contador, sino tres macros para cada comando de este tipo:
\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}
Tenga en cuenta que el uso de dichos comandos para mover argumentos fallará por varias razones.