Макросы, принимающие код в качестве аргумента, которые могут получить доступ к родительским аргументам в LaTeX 3

Макросы, принимающие код в качестве аргумента, которые могут получить доступ к родительским аргументам в LaTeX 3

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

введите описание изображения здесь

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