Определение команды для определения команд, где имя использует аргумент с помощью xparse

Определение команды для определения команд, где имя использует аргумент с помощью xparse

Используя 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предназначен для того, чтобы сделать понятным в коде, какие новые команды создаются для документа, и, таким образом, их построение «на лету» на самом деле не является целью. Однако я думаю, что это все еще область, которая требует обсуждения на основе хороших примеров из реальных вариантов использования.

Связанный контент