我是 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 }
用户可以根据需要更改令牌列表。