在许多情况下,定义键时会省略键值周围的括号l3keys
,即使键本身具有n
-、c
- 或e
-type 参数(这些参数通常需要括号参数)。这难道不比提供括号更不一致且更令人困惑吗?
我的问题:(1)为什么有时会省略括号?(2)哪种编程最佳实践是expl3
?
我的 MWE 只是对不使用括号值定义键的快速演示l3keys
。在注释掉的代码中,键是用括号值定义的。
\documentclass{article}
\ExplSyntaxOn
\keys_define:nn { my }
{
string .str_set:c = l__my_tmpa_str , % note the 'c'-type argument
string .initial:n = initial ,
string .value_required:n = true ,
stringadd .code:n = \str_put_right:Nn \l__my_tmpa_str { foo } ,
stringadd .value_forbidden:n = true ,
stringadde .code:n = \str_put_right:Ne \l__my_tmpa_str {#1} ,
stringadde .value_required:n = true
}
% \keys_define:nn { my }
% {
% string .str_set:c = { l__my_tmpa_str } ,
% string .initial:n = { initial } ,
% string .value_required:n = { true } ,
% stringadd .code:n = { \str_put_right:Nn \l__my_tmpa_str { foo } } ,
% stringadd .value_forbidden:n = { true } ,
% stringadde .code:n = { \str_put_right:Ne \l__my_tmpa_str {#1} } ,
% stringadde .value_required:n = { true }
% }
\ExplSyntaxOff
\begin{document}
\ExplSyntaxOn
\str_use:N \l__my_tmpa_str
\par
\keys_set:nn { my }
{
string = blah
}
\str_use:N \l__my_tmpa_str
\par
\keys_set:nn { my }
{
stringadd
}
\str_use:N \l__my_tmpa_str
\par
\tl_set:Nn \l_tmpa_tl { blah!!! }
\keys_set:nn { my }
{
stringadde = \l_tmpa_tl
}
\str_use:N \l__my_tmpa_str
\par
\keys_set:nn { my } { stringadd }
\str_use:N \l__my_tmpa_str
\ExplSyntaxOff
\end{document}
答案1
有一个文档interface3
定义了 -lists 中的有效输入是什么key=value
(请参阅第 27.10 节)。我不想在这里重复所有内容,但归结为以下内容:
括号是可选的,并且不会产生任何影响,除非(在任何嵌套括号之外):
- 您的值包含逗号
- 您的值至少包含一个等号
- 您的值两端至少有一个空格
如果以上情况都不成立,那么括号完全是可选的(事实上,如果省略括号,可以获得更好的性能,因为 TeX 需要移动更少的标记)。
那么,什么是“最佳实践”:只要您觉得更容易阅读和维护就行——如果您追求的是省去每一组不必要的括号,从而提高速度。但是,一旦转发用户输入,您就不知道其中是否包含空格/逗号/等号,因此在这种情况下,您绝对应该使用括号。