Ist dieser Opferbefehl eine gute Idee?

Ist dieser Opferbefehl eine gute Idee?

Ich habe diesen Befehl:

\newcommand{\name}[1]{\edef\name{#1}}

Sie rufen es zuerst wie in auf \name{Don}und können anschließend mit auf Don verweisen \name.Ist dies eine akzeptable Möglichkeit, eine Konstante auszudrücken, die nur einmal festgelegt werden sollte?

Antwort1

Ich würde unterschiedliche Befehle verwenden, einen zum Halten des Namens und einen anderen zum Festlegen des Namens.

In einem Paket ist es üblich, eine externe Version des Befehls ( \name) zu verwenden, um den Wert eines internen Makros ( \@name) festzulegen. So \authorfunktioniert es \titlein der articleKlasse.

\makeatletter
\newcommand{\name}[1]{\gdef\@name{#1}}
\makeatother

Es wäre jedoch klarer und einfacher, wenn Sie verschiedene Befehlstypen verwenden würden, um unterschiedliche Verhaltensweisen anzuzeigen. \nameErweitert sich also zum Namen und \setnamedefiniert den Wert von \name:

\newcommand{\setname}[1]{\gdef\name{#1}}

Es ist gut, zwischen Befehlen zu unterscheiden, die Material angeben, das gesetzt werden soll, und Befehlen, die Konstanten definieren. Meiner Meinung nach sollten die Standard- \authorund \title-Befehle in LaTeX eigentlich \setauthorund sein \settitle, da der eigentliche Satz erst erfolgt, wenn Sie den Befehl eingeben \maketitle.

Antwort2

Klar, warum nicht. Ihr Einsatzzweck, Ihre Wahl.

Abhängig von der spezifischen Anwendung könnten Sie die Verwendung von \xdeftake in Erwägung ziehen, um die (erweiterte) Neudefinition global zu machen oder \protected@xdefum „seltsame Konstruktionen“ in Namen zu berücksichtigen …

verwandte Informationen