我想为我的列表创建一个参数化宏(使用 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}