`\tl_set:Nn` 和 `\cs_set:Npn` 之间有什么区别?

`\tl_set:Nn` 和 `\cs_set:Npn` 之间有什么区别?

我是 LaTeX3 的新手,正在尝试了解一些基础知识。

假设我想做类似的事情

\newcommand{\contentsname}{Contents}

我可以通过以下方法之一实现此目的

\tl_const:Nn \c_myclass_contentsname_tl {Contents}

\tl_set:Nn \myclass_contentsname_tl {Contents}

\cs_set:Npn \myclass_contentsname: {Contents}

最好的方法是什么?有什么区别吗?

答案1

它们在内部大体相同(概念上它们是非常不同),但它们有所不同,例如,参数标记不同:

\tl_const:Nn \c_myclass_contentsname_tl { # Contents } % works
\tl_set:Nn \l_myclass_contentsname_tl { # Contents } % works
\cs_set:Npn \myclass_contentsname: { # Contents } % breaks

\tl_new:N+\tl_set:Nn\tl_const:Nn大致相同,只是你应该使用后者仅有的如果令牌列表的内容永远不会改变。)

但除此之外,你真的需要评估什么您正在定义。由于您正在定义一些文本的容器,而不是命令某事(对于“做”的某些定义),你想要一个标记列表,所以正确的方法是使用tl

使用

\tl_const:Nn \c_myclass_contentsname_tl { Contents }

如果\c_myclass_contentsname_tl不应修改,或者

\tl_new:N \l_myclass_contentsname_tl
\tl_set:Nn \l_myclass_contentsname_tl { Contents }

用户可以根据需要更改令牌列表。

相关内容