Используя xparse
Я хочу создать команду, которая определяет другие команды. Однако я хочу, чтобы вторичная команда состояла из текста, а затем аргумента первой команды. Например
Например, в следующем
\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}
Я хотел бы \testwork
быть командой, которая оценивается как This is a work test
. Однако когда я это делаю, я получаю "xparse/bad-arg-spec"
ошибку, и я не уверен, почему.
решение1
Как и в случае с \newcommand
,\DeclareDocumentCommand
и родственники призваны взять на себя командованиеимякак первый аргумент. В настоящее время, если вы хотите построить имя, вам необходимо использовать\expandafter
\DeclareDocumentCommand\DeclareTest{m}{%
\expandafter\DeclareDocumentCommand\csname test#1\endcsname{}{This is a test}%
}
Причина, по которой на данный момент нет «варианта», который бы делал это внутренне, заключается в том, что «динамические» команды проблематичны с концептуальной точки зрения. Синтаксис xparse
предназначен для того, чтобы сделать понятным в коде, какие новые команды создаются для документа, и, таким образом, их построение «на лету» на самом деле не является целью. Однако я думаю, что это все еще область, которая требует обсуждения на основе хороших примеров из реальных вариантов использования.