Ich möchte einen Befehl erstellen, der andere Befehle definiert. Allerdings xparse
mö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 \testwork
einen 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
, \DeclareDocumentCommand
und 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 xparse
soll 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.