Usando xparse
quero 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 \testwork
de 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
, \DeclareDocumentCommand
e 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 xparse
pretende 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.