![无参数的私有命令与本地令牌列表变量之间的区别](https://linux22.com/image/353474/%E6%97%A0%E5%8F%82%E6%95%B0%E7%9A%84%E7%A7%81%E6%9C%89%E5%91%BD%E4%BB%A4%E4%B8%8E%E6%9C%AC%E5%9C%B0%E4%BB%A4%E7%89%8C%E5%88%97%E8%A1%A8%E5%8F%98%E9%87%8F%E4%B9%8B%E9%97%B4%E7%9A%84%E5%8C%BA%E5%88%AB.png)
在 LaTeX3 中,不带参数的私有命令和本地标记列表变量之间在实际和哲学上有什么区别?在什么情况下应该优先使用其中一个?是否有公认的最佳实践?
举个例子,假设我定义了一个键来保存字体开关,例如\color{red}\itshape
。使用私有命令来存储字体开关,我可能会定义:
\cs_new:Npn \@@_font: { }
\keys_define:nn { @@ } {
font .code:n = { \cs_set:Npn \@@_font: {#1} } ,
font .value_required:n = true ,
font .initial:n = ,
}
另一方面,使用本地标记列表变量,我可能会定义:
\tl_new:N \l_@@_font_tl
\keys_define:nn { @@ } {
font .tl_set:N = \l_@@_font_tl ,
font .value_required:n = true ,
font .initial:n = ,
}
LaTeX3 中这两个版本哪个更受欢迎?
答案1
这是一个边界情况。函数和变量之间的区别在于
- 函数执行操作
- 变量存储值
改变当前字体是一个动作,所以在这种情况下我更倾向于使用功能。
最干净的方法是这样的
\cs_new_protected:Nn \@@_use_font:n { #1 }
\cs_generate_variant:Nn \@@_use_font:n { V }
\keys_define:nn { @@ }
{
font .tl_set:N = \l_@@_font_tl ,
font .value_required:n = true ,
font .initial:n = ,
}
和
\@@_use_font:V \l_@@_font_tl
在使用时。
另一方面,expl3
为了提高效率,直接使用标记列表变量在现有代码中相当常见。因此,对于这种情况,这更多的是个人偏好而不是严格遵守指导方针:\@@_use_font:V
在这种情况下引入的开销可以忽略不计,在其他类似情况下,效率可能会使使用变量的选择更具吸引力。