\cs_new_eq:NN 和 \cs_gset_eq:NN 之间有什么区别?

\cs_new_eq:NN 和 \cs_gset_eq:NN 之间有什么区别?

\cs_new_eq:NN和有什么区别\cs_gset_eq:NN在“复制控制序列”一节中定义的LaTeX3 接口手册(当前版本第 19 页第 4.3.4 节,版本为2022-12-17) 如下。

有关 \cs_new_eq 和 \cs_gset_eq 的文档

\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?是的,有很大区别。前者是安全的,后者应谨慎使用。

相关内容