在用作新命令中列出的参数之前扩展宏

在用作新命令中列出的参数之前扩展宏

我想为我的列表创建一个参数化宏(使用 newcommand):

只要我使用文本作为输入参数,它就会起作用。一旦我切换到宏作为参数,它就不起作用了。

我有以下 MWE:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{listings}
\begin{document}
\def\A{name}
\def\C{value}
\newcommand{\paramListing}[4]{
\begin{lstlisting}^^J
#1(#2, #3, #4);^^J
\end{lstlisting}
}

\paramListing{func}{\A}{true}{\C} %prints 'func(A, true, C)', but should be 'func(name, true, value)'
\paramListing{func}{name}{true}{value} %prints func(name, true, value)
\end{document}

它产生两行:一行带有func(A, true, C)(这不是我想要的),另一行带有func(name, true, value)。因此,我做了一些研究,发现\expandafter应该可以解决问题。

但是,我不知道如何正确使用它(即使有多个参数),因为我仍然不能将它与只接受一个参数的新命令一起使用!

例如这个 MWE:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{listings}
\begin{document}
\def\A{name}

\newcommand{\oneParamListing}[1]{
\begin{lstlisting}^^J
func(#1, true, value);^^J
\end{lstlisting}
}

\expandafter\oneParamListing\A %prints 'func(n, true, value)\name'
\expandafter\oneParamListing{\A} %prints 'func(A, true, value)'
\end{document}

它产生了该行func(n, true, C)(这是宏的第一个字符\A,所以在我看来它可能是正确的方向?)并且该行func(A, true, C)也不是我想要的?

我尝试了 pdfTeX 3.14159265-2.6-1.40.21 的所有功能。

总结一下我有两个问题:

  • 这是\expandafter我需要的吗?如果是,我该如何使用它?
  • 我可以将它用于具有多个参数的宏吗?或者您有其他方法吗?

答案1

与此同时,我自己也找到了答案:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{listings}
\begin{document}
\def\A{name}
\def\C{value}
\newcommand{\paramListing}[4]{
\begin{lstlisting}^^J
#1(#2, #3, #4);^^J
\end{lstlisting}
}

\edef\params{{func}{\A}{true}{\C}}
\expandafter\paramListing\params
\end{document}

打印结果func(name, true, value);与预期一致。

答案2

使用以下函数很容易进行实函数组合functional包。在下面的代码中,\Value是一个预定义的函数。

\documentclass{article}

\usepackage[utf8]{inputenc}
\usepackage{listings}
\usepackage{functional}

\begin{document}

\def\A{name}
\def\C{value}

\PrgNewFunction \paramListing {mmmm} {
\begin{lstlisting}^^J
#1(#2, #3, #4);^^J
\end{lstlisting}
}

\paramListing{func}{name}{true}{value}
\paramListing{func}{\Value\A}{true}{\Value\C}

\end{document}

在此处输入图片描述

相关内容