
expl3
SE, in letzter Zeit habe ich ein wenig damit herumgespielt xparse
und bin auf folgendes Problem gestoßen: Ich möchte einen Befehl erstellen, der einen neuen Befehl erstellt - ähnlich wiedieser Beitrag. Dies ist nicht so schwierig, solange der zweite Befehl keine Argumente hat. Der Versuch, einen Befehl zu erstellen, der Argumente akzeptiert, ist etwas schwieriger.
Was ich bisher habe:
\documentclass{article}
\usepackage{xparse}
\NewDocumentCommand\test{ m}
{
\NewDocumentCommand#1 {m}
{My name is \string#1, king of kings}
}
\begin{document}
\test{\ozymandias}
\ozymandias{\manthano}
\end{document}
Dies gibt My name is ozymandias, king of kings
das richtige Sonett aus, aber nicht das, was ich wollte. Ich weiß, wo das Problem liegt, ich weiß nur im Moment nicht, wie ich es beheben kann :)
Antwort1
Ich frage mich, wie es \string#1
innen aussieht.
Der neue Befehl darin kann wie folgt erstellt werden:
\expandafter\NewDocumentCommand\csname #1\endcsname{...}{....}
d. h. der Name der neuen Sequenz muss zuerst mit konstruiert werden \expandafter
(erst wird der Name vergeben, dann \NewDocumentCommand
tritt die Aktion ein). Dasselbe Vorgehen muss für das traditionelle \newcommand
oder \renewcommand
usw. gewählt werden.
Allerdings \test
muss der Befehl als verwendet werden \test{ozymandias}
, ohne \
!
Bitte beachten Sie, dass ##1
für den Zugriff auf das erste Argument des inneren Makros (sofern dies überhaupt gewünscht ist) unbedingt die Taste verwendet werden muss, nachfolgende Argumente werden mit nummeriert ##2
usw.
\documentclass{article}
\usepackage{xparse}
\NewDocumentCommand{\manthano}{}{Manthano}
\NewDocumentCommand\test{ m}
{%
\expandafter\NewDocumentCommand\csname #1\endcsname{m}{%
My name is ##1, king of kings%
}
}
\begin{document}
\test{ozymandias}
\ozymandias{\manthano}
\end{document}
BEARBEITEN:\test
Um mit zu verwenden \
, müssen Sie den Befehl anpassen an
\makeatletter
\NewDocumentCommand\test{ m}
{%
\expandafter\NewDocumentCommand\csname\expandafter\@gobble\string #1\endcsname{m}{%
My name is ##1, king of kings%
}
}
\makeatother