我的文档中定义了几个宏。
\newcommand{\pa}[1]{\left(#1\right)} % enclose with parentheses
\newcommand{\bra}[1]{\left[#1\right]} % enclose with square brackets
\newcommand{\pfrac}[2]{\pa{\frac{#1}{#2}}} % enclosed in parentheses
\newcommand{\bfrac}[2]{\bra{\frac{#1}{#2}}} % enclosed in square brackets
由于有很多宏,我想在输出 pdf 中创建一个宏及其渲染的列表。
目前,我使用以下宏来生成列表。
\newcommand{\printpa}{\backslash pa\{arg1\}=\pa{arg1}}
\newcommand{\printbra}{\backslash bra\{arg1\}=\bra{arg1}}
\newcommand{\printpfrac}{\backslash pfrac\{arg1\}\{arg2\}=\pfrac{arg1}{arg2}}
\newcommand{\printbfrac}{\backslash bfrac\{arg1\}\{arg2\}=\bfrac{arg1}{arg2}}
这里,我必须为每个宏实现一个打印宏。
请建议我一种更简单的方法来创建这样的列表。例如,一个带有宏名和参数数量的打印宏就很好。
\newcommand{\printmacro}[2] = ??? %takes "macro name" and "number of arguments" as arguments.
\printmacro{pa}{1}
\printmacro{bra}{1}
\printmacro{pfrac}{2}
\printmacro{bfrac}{2}
答案1
这是一个解决方案。理想情况下,只需\printmacro{foo}
理解参数并使用必要的参数,但我想不出一个聪明的方法来做到这一点(只需通过查看然后\meaning
用替换#n
来进行强制{argn}
执行,但如果宏很强大,那么它就做得不好,所以……)。也许有人会来展示一个聪明的定义。
\documentclass{scrartcl}
\usepackage{mathtools}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand \printmacro { m m } { \dips_printmacro:cn { #1 } { #2 } }
\cs_new_protected:Npn \dips_printmacro:Nn #1 #2
{
\ensuremath
{
\texttt { \token_to_str:N #1 \dips_printmacro_args:n { #2 } }
=
\dips_printmacro_meaning:Nn #1 #2
}
}
\cs_new_protected:Npn \dips_printmacro_args:n #1
{
\int_step_inline:nnnn { 1 } { 1 } { #1 }
{ \c_left_brace_str \textit{arg##1} \c_right_brace_str }
}
\cs_new_protected:Npn \dips_printmacro_meaning:Nn #1 #2
{
\tl_clear:N \l_tmpa_tl
\int_step_inline:nnnn { 1 } { 1 } { #2 }
{ \tl_put_right:Nx \l_tmpa_tl { {\noexpand\textit{arg##1}} } }
\exp_last_unbraced:NV #1 \l_tmpa_tl
}
\cs_generate_variant:Nn \dips_printmacro:Nn { c }
\ExplSyntaxOff
\newcommand{\pa}[1]{\left(#1\right)} % enclose with parentheses
\newcommand{\bra}[1]{\left[#1\right]} % enclose with square brackets
\newcommand{\pfrac}[2]{\pa{\frac{#1}{#2}}} % enclosed in parentheses
\newcommand{\bfrac}[2]{\bra{\frac{#1}{#2}}} % enclosed in square brackets
\begin{document}
\printmacro{pa}{1}\par
\printmacro{bra}{1}\par
\printmacro{pfrac}{2}\par
\printmacro{bfrac}{2}\par
\end{document}
请注意,这可能仅适用于您定义的简单命令。如果使用健壮命令或 xparse 定义的命令等,这可能不会像您预期的那样工作。