Definir un comando para definir comandos donde el nombre usa el argumento usando xparse

Definir un comando para definir comandos donde el nombre usa el argumento usando xparse

Usando xparseQuiero crear un comando que defina otros comandos. Sin embargo, quiero que el comando secundario consista en texto y luego el argumento del primer comando. Por ejemplo

Por ejemplo en el siguiente

\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}

Me gustaría \testworkser un comando que evalúe a This is a work test. Sin embargo, cuando hago esto aparece un "xparse/bad-arg-spec"error y no estoy seguro de por qué.

Respuesta1

Como es el caso de \newcommand,\DeclareDocumentCommand los familiares están diseñados para tomar el mando.nombrecomo primer argumento. En la actualidad, si desea construir el nombre, debe utilizar\expandafter

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

La razón por la que por el momento no hay una "variante" disponible que haga esto internamente es que los comandos "dinámicos" son problemáticos desde un punto de vista conceptual. La sintaxis de xparsetiene como objetivo dejar claro dentro del código qué nuevos comandos se comienzan a crear para un documento y, por lo tanto, construirlos "sobre la marcha" no es realmente el objetivo. Sin embargo, creo que esta es todavía un área que necesita discusión basada en buenos ejemplos de casos de uso reales.

información relacionada