Definieren eines Befehls zum Definieren von Befehlen, bei denen der Name das Argument mit xparse verwendet

Definieren eines Befehls zum Definieren von Befehlen, bei denen der Name das Argument mit xparse verwendet

Ich möchte einen Befehl erstellen, der andere Befehle definiert. Allerdings xparsemöchte ich, dass der sekundäre Befehl aus Text und dann dem Argument für den ersten Befehl besteht. Zum Beispiel

Zum Beispiel im Folgenden

\documentclass{article}
\usepackage{xparse}
\begin{document}

\ExplSyntaxOn
\DeclareDocumentCommand{\DeclareTest}{m}{%
%
\DeclareDocumentCommand{\csname test#1\endcsname}{}{This is a #1 test}
}
\ExplSyntaxOff

\DeclareTest{work}
\testwork

\end{document}

Ich hätte gerne \testworkeinen Befehl, der als ausgewertet wird This is a work test. Wenn ich das mache, erhalte ich jedoch eine "xparse/bad-arg-spec"Fehlermeldung und bin mir nicht sicher, warum.

Antwort1

Wie es der Fall ist für \newcommand, \DeclareDocumentCommandund Verwandte sind dazu bestimmt, ta Befehl zu nehmenNameals erstes Argument. Wenn Sie derzeit den Namen konstruieren möchten, müssen Sie daher\expandafter

\DeclareDocumentCommand\DeclareTest{m}{%
  \expandafter\DeclareDocumentCommand\csname test#1\endcsname{}{This is a test}%
}

Der Grund dafür, dass es derzeit keine „Variante“ gibt, die dies intern tut, ist, dass „dynamische“ Befehle aus konzeptioneller Sicht problematisch sind. Die Syntax xparsesoll im Code deutlich machen, welche neuen Befehle für ein Dokument erstellt werden, und daher ist es nicht wirklich das Ziel, sie „on the fly“ zu konstruieren. Dies ist jedoch meiner Meinung nach immer noch ein Bereich, der einer Diskussion auf der Grundlage guter Beispiele aus realen Anwendungsfällen bedarf.

verwandte Informationen