Verwenden eines Befehls zum Erneuern des Befehls

Verwenden eines Befehls zum Erneuern des Befehls

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 \tester im Dokument verwendet wird.

Aber wenn ich versuche, \testeinen neuen Wert einzustellen mit

\test{some other content} 

später scheint es nur den Wert \testund dann „einige andere Inhalte“ auszugeben.

Wie verhindere ich, dass LaTeX die erweitert \testund tatsächlich aufruft, \renewcommandum den Wert zu aktualisieren?

Antwort1

Die erste Verwendung von \testwird 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 , xparseum 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.

verwandte Informationen