Wie kann ich Text wiederholen, ohne ihn zu duplizieren?

Wie kann ich Text wiederholen, ohne ihn zu duplizieren?

Ich habe einen Befehl zum Aufschreiben von „Anforderungen“ in meinem Dokument definiert. Er formatiert und nummeriert sie automatisch und erstellt ein Etikett, auf das ich verweisen kann, um die Nummer zu erhalten – wirklich nett. Manchmal möchte ich jedoch den vollständigen Text der Anforderung wiederholen, wenn ich darauf verweise, damit der Leser nicht im Dokument zurückblättern muss. Ich möchte ihn natürlich nicht neu schreiben, da dies fehleranfällig wäre, wenn ich ihn an einer Stelle ändere. Wie kann ich den Text mithilfe eines Befehls wiederholen?

Die aktuelle Form meiner Befehlsdefinition lautet wie folgt:

\newcommand{\requirement}[2]{
    \vspace{10pt}
    \noindent
    \textbf{
        \refstepcounter{reqnum}
        \label{req:#2}
        R\thereqnum: #1
    }
}

Ich habe viele Variationen des folgenden Ansatzes ausprobiert, jedoch ohne Erfolg:

\newcommand{\requirement}[2]{
    \vspace{10pt}
    \noindent
    \textbf{
        \refstepcounter{reqnum}
        \label{req:#2}
        R\thereqnum: #1
    }
    \newcommand{\req{#2}}{#1}
}

Antwort1

Es gibt den \csname <string>\endcsname, der einen Befehl ausführt \<string>. Sie können auch die Makros aus der etoolbox verwenden, die sehr bequem zu verwenden sind.

Wenn Sie \newcommand{\req{#2}}{#1}durch ersetzen \expandafter\def\csname req#2\endcsname {#1}, sollte es funktionieren.

\def\namedefiniert ein Makro \name. Im Gegensatz zu fragt es nicht \newcommand, ob es bereits existiert. Es überschreibt also \name, wenn es \namebereits existiert. Das kann nützlich sein, ist aber normalerweise schädlich.

Wenn Sie nur schreiben \def\csname req#2\endcsname {<definition>}, versucht es eine Neudefinition \csnameund gibt einen Fehler aus, weil einsames Element vorhanden ist \endcsname(und ein fehlt \).

Wenn Sie \expandaftervor setzen \def,

\expandafter\def\csname req#2\endcsname {<definition>}

wird

\def\req<argument2> {<definition>}

und tada, es ist definiert. \expandafterverzögert die Expansion des nächsten Tokens (kann eine Befehlssequenz sein). Zwei Expandafters verzögern um zwei Zyklen.

verwandte Informationen