LaTeX 中的匿名函数(闭包)

LaTeX 中的匿名函数(闭包)

有没有办法匿名函数或者闭包在 LaTeX 中。我正在使用威尔·罗伯逊的 列表,我需要几个用途非常有限的宏。因此,我希望能够定义一个宏,如下所示

\newfunc\wavefcn{\Psi}[elemcmd=\anon{\vec{r}_#2},index={1,2,:,n}]

其中\wavefcn产生

Psi 作为 n 个变量的函数

在上面的声明中,\anon{\vec{r}_#2}匿名函数已定义到位。如何设置它?

答案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

相关内容