答案1
实际上,这个包的最初计划是使用这样的语法,但当时 xkeyval 无法处理这样的构造。从那时起,事情发生了变化!试试这个:
\documentclass{article}
\usepackage{mlist}
\makeatletter
\define@key[mlist]{sym}{elemfn}{\def\mlist@elemcmd##1##2{#1}}
\makeatother
\begin{document}
\newfunc\wavefcn{\Psi}[elemfn=\vec{r}_####2,index={1,2,:,n}]
$\wavefcn$
\end{document}
不幸的是,你需要将里面的哈希值翻倍两次\newfunc
,但这个包需要更多的重新设计才能使其工作。(我第一次没有关注这一点,因为这个想法无论如何都行不通。)
回答你的实际问题,不,TeX 本身没有匿名函数。在这种情况下,keyval 处理隐藏了正在定义特定宏的事实。在内部,编写
\newfunc \foo {...} [ key = val ]
key
执行给定参数的内部宏val
。从上面的示例中可以看出,内部宏只是elemfn
根据 keyval 列表中给出的参数定义一个新宏;经过一些处理后,您会看到类似
\def\mlist@elemcmd##1##2{\vec{r}_##2}
因此,语法本身使它看起来像一个匿名函数,但 TeX 中却没有这样的东西。(事实上,根本没有“函数”——它是一种宏扩展语言,因此您通常不能用与常规编程语言相同的术语来思考它。)
PS:关于哈希的问题在于,每次你在命令(或类似命令)\def
中嵌套一个时\def
,你都必须将它们加倍,这样你才知道哪个参数属于哪个\def
。