В Latex 3 я хотел бы написать макрос, который принимает в качестве аргумента код, который может внутренне определять макрос. Как мне сделать это таким образом, чтобы передаваемый код мог получить доступ к аргументам оригинала. Например, я хотел бы иметь возможность сделать что-то вроде следующего.
\documentclass{article}
\usepackage{xparse, expl3}
\begin{document}
\DeclareDocumentCommand{\CodeMacro}{m +m}
{
Do Something
#2
}
\CodeMacro{Test}
{
\DeclareDocumentCommand\csname Testing#1\endcsname{m}
{
#1-##1
}
}
\end{document}
Я хотел бы, чтобы это расширилось до
Do Something
\DeclareDocumentCommand\csname TestingTest\endcsname{m}
{
Test-#1
}
решение1
Для начала вам не следует использовать \DeclareDocumentCommand
; у команды есть свои области применения, но в целом вам следует предпочесть \NewDocumentCommand
.
Похоже, вам нужна функция вроде \NewNamedDocumentCommand
, плюс какой-нибудь грязный трюк.
\documentclass{article}
\usepackage{expl3,xparse}
\ExplSyntaxOn % or spaces would count
\NewDocumentCommand{\CodeMacro}{m +m}
{
Do Something
\nate_do:nn {#1}{#2}
}
\NewDocumentCommand{\NewNamedDocumentCommand}{mmm}
{
\exp_args:Nc \NewDocumentCommand{#1}{#2}{#3}
}
\cs_new_protected:Nn \nate_do:nn
{
\cs_set_protected:Nn \__nate_do:n { #2 }
\__nate_do:n { #1 }
}
\ExplSyntaxOff
\begin{document}
\CodeMacro{Test}{%
\NewNamedDocumentCommand{Testing#1}{m}{%
#1-##1%
}%
}
\TestingTest{X}
\end{document}