У меня есть:
\newcommand{\test}[1]{\renewcommand{\test}{#1}}
в файле класса, чтобы сделать настройку команды очистки в самом документе.
Все это работает, если документ содержит:
\test{some content}
и выводит «некое содержимое» при \test
использовании в документе.
Но когда я пытаюсь установить \test
новое значение с помощью
\test{some other content}
позже, похоже, он просто выводит значение \test
, а затем «какое-то другое содержимое».
Как мне остановить LaTeX, расширяющий \test
и фактически вызывающий \renewcommand
для обновления значения?
решение1
Первое использование \test
переопределит \test
команду без аргумента, которая просто выведет аргумент первого вызова. Так что ваше предложение не сработает. Вам придется использовать что-то вроде:
\newcommand{\test}{}
\newcommand{\settest}[1]{\renewcommand{\test}{#1}}
Тогда вы можете использовать
\settest{some content}
\test, \test, \test% shows "some contents" three times
\settest{some other content}
\test, \test% shows "some other contents" two times
Вы можете использовать необязательный аргумент, например, using, xparse
чтобы различать сохранение аргумента и вывод аргумента:
\documentclass{article}
\usepackage{xparse}
\newcommand*{\testvalue}{}
\NewDocumentCommand{\test}{o}{%
\IfNoValueTF{#1}{\testvalue}{\def\testvalue{#1}}%
}
\begin{document}
Define: \test[some content]
Show: \test, \test
Define: \test[some other contents]
Show: \test, \test.
\end{document}
Но это противоречило бы принципу, что необязательный аргумент должен только изменять поведение команды по умолчанию, а не превращать ее в совершенно другую команду. Поэтому я бы не рекомендовал так делать.