\cs_new_eq:NN
和有什么区别\cs_gset_eq:NN
在“复制控制序列”一节中定义的LaTeX3 接口手册(当前版本第 19 页第 4.3.4 节,版本为2022-12-17) 如下。
\cs_new:Nn
上一节中和defined的区别\cs_gset:Nn
很明显:前者在函数已经定义时中止TeX引擎的执行,而后者则默默地重新定义该函数。
\cs_new_eq:NN
但和之间的区别\cs_gset_eq:NN
我不清楚。
答案1
所有\cs_new...
函数都会检查要定义的函数是否不存在,否则会出错。
相反,\cs_(g)set...
函数不进行这样的检查。
与变量相反,函数不需要提前声明,但更好的编程风格是确保我们稍后需要set
用于不同含义的函数已经有一个定义,可能只是\scan_stop:
,或者更好的是,什么都不做。
请注意,\cs_new...
始终在最外层定义函数,但\cs_set...
仅在当前范围内定义有效。
那么,为什么会有函数呢\cs_gset...
?
因为有时需要在全局级别更改某些函数的值,但这些函数很可能是内部函数(名称以 开头__
),而不是公共函数,因为公共函数需要具有明确定义的含义。内核必须有一种方法来执行这种全局重新定义。
用法的一个示例是\tl_map_inline:nn
,其中使用名称中的嵌套级别和第二个参数来定义临时函数\tl_map_inline:nn
替换文本来定义临时函数。此类临时函数必须必须在最外层定义,否则它的工作就无法正确完成。然而,程序员使用\tl_map_inline:nn
不需要知道这个暂存控制序列的名称;更好的是,他们必须忽略它,因为它是一个实现细节,将来可能会更改,恕不另行通知(但\tl_map_inline:nn
工作原理不会改变)。\cs_gset_protected:cpn
因此,使用此暂存函数是绝对安全的(如果程序员遵守推荐的命名惯例)。
\cs_new_eq:NN
那么,和之间有区别吗\cs_gset_eq:NN
?是的,有很大区别。前者是安全的,后者应谨慎使用。