XParse: Befehl, der einen Befehl erstellt

XParse: Befehl, der einen Befehl erstellt

expl3SE, in letzter Zeit habe ich ein wenig damit herumgespielt xparseund 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 kingsdas 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#1innen 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 \NewDocumentCommandtritt die Aktion ein). Dasselbe Vorgehen muss für das traditionelle \newcommandoder \renewcommandusw. gewählt werden.

Allerdings \testmuss der Befehl als verwendet werden \test{ozymandias}, ohne \!

Bitte beachten Sie, dass ##1fü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 ##2usw.

\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:\testUm 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

verwandte Informationen