Usando um comando para renovar o comando

Usando um comando para renovar o comando

Eu tenho:

\newcommand{\test}[1]{\renewcommand{\test}{#1}}

em um arquivo de classe para tornar a configuração do comando mais limpa no próprio documento.

Tudo isso funciona se o documento contiver:

\test{some content}

e gera 'algum conteúdo' quando \testé usado no documento.

Mas quando tento definir \testum novo valor com

\test{some other content} 

mais tarde, parece apenas gerar o valor \teste depois 'algum outro conteúdo'.

Como faço para impedir que o LaTeX expanda \teste realmente chame the \renewcommandpara atualizar o valor?

Responder1

O primeiro uso de \testserá redefinido \testpara um comando sem argumento, que apenas gera o argumento da primeira chamada. Portanto, sua sugestão não funcionará. Você tem que usar algo como:

\newcommand{\test}{}
\newcommand{\settest}[1]{\renewcommand{\test}{#1}}

Então você pode usar

\settest{some content}
\test, \test, \test% shows "some contents" three times
\settest{some other content}
\test, \test% shows "some other contents" two times

Você poderia usar um argumento opcional, por exemplo, using xparsepara distinguir entre armazenar um argumento e produzir um argumento:

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

Mas isso seria contra o princípio de que um argumento opcional deveria apenas modificar o comportamento padrão de um comando e não transformá-lo em um comando completamente diferente. Então eu não recomendaria fazer isso.

informação relacionada