Definindo um comando para definir comandos onde o nome usa o argumento usando xparse

Definindo um comando para definir comandos onde o nome usa o argumento usando xparse

Usando xparsequero criar um comando que defina outros comandos. No entanto, quero que o comando secundário consista em texto e depois no argumento do primeiro comando. Por exemplo

Por exemplo no seguinte

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

Eu gostaria \testworkde ser um comando avaliado como This is a work test. No entanto, quando faço isso, recebo um "xparse/bad-arg-spec"erro e não sei por quê.

Responder1

Como é o caso de \newcommand, \DeclareDocumentCommande parentes são projetados para assumir o comandonomecomo primeiro argumento. Atualmente, se você quiser construir o nome, precisará usar\expandafter

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

A razão pela qual no momento não existe uma 'variante' disponível que faça isso internamente é que os comandos 'dinâmicos' são problemáticos do ponto de vista conceitual. A sintaxe de xparsepretende deixar claro no código quais novos comandos são criados para um documento e, portanto, construí-los 'on the fly' não é realmente o objetivo. No entanto, penso que esta ainda é uma área que necessita de discussão com base em bons exemplos de casos de utilização reais.

informação relacionada