我注意到在 LaTeX3 中有两种不同的方法来定义新函数:使用参数文本或者签名。
例如,我可以同时使用\cs_new:Npn
和\cs_new:Nn
来创建一个函数\mytest_foo:n
:
\cs_new:Npn \mytest_foo:n #1
{ some~ code~ containing~ #1 }
或者
\cs_new:Nn \mytest_foo:n
{ some~ code~ containing~ #1 }
我只知道第二种方法会“自动从函数签名中检测参数数量”。但它们之间有什么真正的区别?我该如何在这两种方法中选择\cs_new:...
?
PS:在一个文件中同时使用它们是否是一个不好的惯例?
答案1
首先,我要指出的是,该:Nn
版本仅适用于定义“行为良好”的expl3
函数:如果我们想要w
-type 参数或定义文档命令(里面 xparse
),我们必须使用版本。因此,在某些地方,:Npn
我们完全可以接受:Nn
但仍使用。:Npn
有了这种限制,这两个版本在功能上是等效的:问题中的两个版本都给出了相同的结果。但在使用上有两个区别。首先,该:Nn
版本必须比提取签名的版本更加努力:Npn
。如果你进行跟踪,则有很多代码可以执行,因此该:Nn
版本速度较慢。对于大多数用途来说,这不是一个大问题,因为它们被用作加载点,实际时间成本很小。但是,如果你在加载点进行定义使用(特别是在“紧密”循环中)那么您会想要:Npn
。
因此,主要的区别在于外观/风格,团队提供了这两种方式,因为代码作者对此有不同的看法。对于一些人来说,需要:Npn
明确#1
的ETC。会被视为一件好事,而对于其他人来说,与自动检测版本相比,这会使得代码变得不那么清晰:Nn
。这里有两种说法,因此提供了两种版本。