\cs_new:Npn 与 \cs_new:Nn

\cs_new:Npn 与 \cs_new:Nn

我注意到在 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明确#1ETC。会被视为一件好事,而对于其他人来说,与自动检测版本相比,这会使得代码变得不那么清晰:Nn。这里有两种说法,因此提供了两种版本。

相关内容