Использование команды для обновления команды

Использование команды для обновления команды

У меня есть:

\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}

Но это противоречило бы принципу, что необязательный аргумент должен только изменять поведение команды по умолчанию, а не превращать ее в совершенно другую команду. Поэтому я бы не рекомендовал так делать.

Связанный контент