从文档中我\tl_use:N
知道\str_use:N
是可选的。这些变量可以直接使用。对于更多类型来说这不是同样如此吗?
是否可能\xx_new:N
将更多内容正式提升到该可选级别(即,如果覆盖不是问题,则无需声明使用意图,并且\xx_set:Nn
可以直接调用吗?(例如\cs_set:Nn
)
特别是考虑到局部变量——我不会养成使用\l_tmpa_tl
描述性变量名(我认为这容易出错)的习惯,所以我会有很多\tl_new:N
函数悬而未决。
答案1
使用\l_siemer_foo_tl
或\l_siemer_foo_str
代替
\tl_use:N \l_siemer_foo_tl
\str_use:N \l_siemer_foo_str
确实允许,但并不推荐。我通常尝试使用\tl_use:N
(或来作为前缀\str_use:N
,因为这样编程更简洁,除非简洁性使得“无前缀”方式更可取。请注意,\tl_use:N
需要几个扩展步骤,而无前缀形式只需要一个,这可能会对已经很长的程序产生影响。
另一方面,当选项生效\tl_use:N
时,还会检查以下变量是否被声明。check-declarations
还有其他<module>_use:N
功能,即\dim_use:N
、\skip_use:N
、\muskip_use:N
、\int_use:N
和;省略这些\box_use:N
功能\fp_use:N
将会导致灾难。
使用任何变量(除了tl
或str
,如上所述)在野外不会有任何好处;在某些情况下,您会得到一个合理的错误,例如A sequence was misused.
或A floating point with value '1.2' was misused
。在其他情况下(想想dim
变量),您会得到一个非常低级的错误消息或意外的输出。
唯一的其他变量类型可以在野外使用是clist
,但这只是为了实现的原因,不应依赖此功能。因此\l_siemer_foo_clist
应该不是被认为是 的简写\clist_use:Nn \l_siemer_foo_clist {,}
(反正我看不出有什么用处)。使用它的漂亮程序可能不再有效,因为clist
变量的内部实现已经改变。
对于其他变量类型,没有<module>_use:N
函数,但需要利用变量的内部结构的其他参数。
而且,<module>_new:N
绝对不是可选的,因为任何变量类型。
答案2
任何最终为宏的变量类型都可以在不带访问器的情况下“使用”。但是,这可能会导致令人惊讶的结果:例如,查看fp
!的原始结构。
关于变量声明的官方立场不会改变:它们必须在使用前声明。唯一的例外是它们由以下方式“自动创建” l3keys
:这是一种避免代码重复性的折衷方法。