Мне нужна команда, которая будет вести себя по-разному в первый раз, чем в последующие разы, когда ее вызывают. Сейчас я использую \newcommand\foo{First\gdef\foo{Next}}
, то есть она переопределяет себя в первый раз.
Более того, в какой-то момент мне нужно «сбросить» его значение, поэтому я определяю \newcommand\resetfoo{\gdef\foo{First\gdef\foo{Next}}}
.
Но мне это кажется довольно сложным. Может быть, есть обычный способ сделать это, но я о нем не знаю (и я почти ничего не знаю орасширение). Какой правильный способ решения такого рода проблем?
Вопрос
Как указано в вопросе, мне нужен более общий способ: некоторая функция, которая изменит свое определение внth «расширение» (не уверен, что использую слово в правильном месте). Как бы вы решили эту проблему? Мне также нужны необходимые \resetfoo
.
Если это еще не сделано, моя идея — ввести какую-то команду \changedefinitionafter\foo{3}{OneTwoThree}{Next}
или что-то в этом роде. expl3
Решение также приветствуется.
Вот более общая модель 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}
Также приветствуются теги и предложения по названию вопроса.
решение1
Взгляните на следующий пример:
\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}
решение2
\changedefinitionafter
Я люблю использовать счетчики! Здесь изменяется только расширение после указанного числа .
\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}
решение3
Счетчика нет, но есть три макроса для каждой команды этого типа:
\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}
Имейте в виду, что использование таких команд при перемещении аргументов может привести к сбою по нескольким причинам.