l3keys 中的括号

l3keys 中的括号

在许多情况下,定义键时会省略键值周围的括号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 需要移动更少的标记)。

那么,什么是“最佳实践”:只要您觉得更容易阅读和维护就行——如果您追求的是省去每一组不必要的括号,从而提高速度。但是,一旦转发用户输入,您就不知道其中是否包含空格/逗号/等号,因此在这种情况下,您绝对应该使用括号。

相关内容