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 \test
um novo valor com
\test{some other content}
mais tarde, parece apenas gerar o valor \test
e depois 'algum outro conteúdo'.
Como faço para impedir que o LaTeX expanda \test
e realmente chame the \renewcommand
para atualizar o valor?
Responder1
O primeiro uso de \test
será redefinido \test
para 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 xparse
para 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.