为了解决这个问题,让我们从一个更简单的任务开始:如何让用户在定义 时输入的文本\NewDocumentCommand
接近我在\meaning
用 定义的宏上输入的结果\def
?我猜它应该定义在一些名字奇怪的宏中,但我找不到它的名字,而且阅读 xparse 的源代码很难。
\documentclass[]{article}
\def\test[#1]#2{Hey (#1) #2 you are nice.}
\NewDocumentCommand{\testXparse}{O{}m}{Hey (#1) #2 you are nice.}
\begin{document}
\test[Alice]{Bob}
\show\test
This corresponds to what the user typed. Great.
\texttt{\meaning\test}\\
\testXparse[Alice]{Bob}
\show\testXparse
This does NOT correspond to what the user typed. Not great.
\texttt{\meaning\testXparse}
\end{document}
PS:让我们保持简单:我不关心 catcode 或复杂的边缘情况。
编辑 噢,我找到了:
\texttt{\expandafter\meaning\csname testXparse code\endcsname}
给我:
\protected\long
macro:#1#2->Hey (#1) #2 you are nice.
!! 现在让我们尝试找到如何将其放入字符串中、提取参数并对 执行相同操作\newcommand
。
答案1
它在里面\testXparse code
(名称中有一个空格)。
\documentclass{article}
\ExplSyntaxOn
\NewDocumentCommand{\retrievexparsedefinition}{m}
{
\texttt{\cs_replacement_spec:c { \cs_to_str:N #1 ~ code }}
}
\ExplSyntaxOff
\NewDocumentCommand{\testXparse}{O{}m}{Hey (#1) #2 you are nice.}
\begin{document}
\retrievexparsedefinition{\testXparse}
\end{document}
你可以在控制台中通过以下方式获得相同的结果
\ShowCommand{\testXparse}