Ich habe:
\newcommand{\test}[1]{\renewcommand{\test}{#1}}
in einer Klassendatei, um das Festlegen des Befehls im Dokument selbst übersichtlicher zu gestalten.
Dies alles funktioniert, wenn das Dokument Folgendes enthält:
\test{some content}
und gibt „einigen Inhalt“ aus, wenn \test
er im Dokument verwendet wird.
Aber wenn ich versuche, \test
einen neuen Wert einzustellen mit
\test{some other content}
später scheint es nur den Wert \test
und dann „einige andere Inhalte“ auszugeben.
Wie verhindere ich, dass LaTeX die erweitert \test
und tatsächlich aufruft, \renewcommand
um den Wert zu aktualisieren?
Antwort1
Die erste Verwendung von \test
wird in einen Befehl ohne Argument umdefiniert \test
, der nur das Argument des ersten Aufrufs ausgibt. Ihr Vorschlag wird also nicht funktionieren. Sie müssen etwas wie Folgendes verwenden:
\newcommand{\test}{}
\newcommand{\settest}[1]{\renewcommand{\test}{#1}}
Dann können Sie verwenden
\settest{some content}
\test, \test, \test% shows "some contents" three times
\settest{some other content}
\test, \test% shows "some other contents" two times
Sie können ein optionales Argument verwenden, z. B. using , xparse
um zwischen der Speicherung eines Arguments und der Ausgabe eines Arguments zu unterscheiden:
\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}
Dies würde jedoch dem Grundsatz widersprechen, dass ein optionales Argument nur das Standardverhalten eines Befehls ändern und ihn nicht in einen völlig anderen Befehl umwandeln sollte. Daher würde ich dies nicht empfehlen.