Comando que cambia su definición la enésima vez que se usa

Comando que cambia su definición la enésima vez que se usa

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í. expl3La 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}

Ejemplo actualizado

Respuesta2

¡Me encanta usar contadores! Aquí solo \changedefinitionafterse 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}

ingrese la descripción de la imagen aquí

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}

ingrese la descripción de la imagen aquí

Tenga en cuenta que el uso de dichos comandos para mover argumentos fallará por varias razones.

información relacionada