l3keys 中的大括號

l3keys 中的大括號

在許多情況下,定義鍵時會省略圍繞鍵值的大括號l3keys,即使鍵本身俱有n-、c- 或e- 類型參數(通常需要大括號參數)。這不是不一致並且比提供大括號更令人困惑嗎?

我的問題:(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 必須移動更少的標記)。

那麼,什麼是「最佳實踐」:無論您發現什麼更容易閱讀和維護,並且如果您追求微小的速度改進,則省略每組不必要的大括號。但是,一旦您轉發使用者輸入,您就不知道是否會包含空格/逗號/等號,因此在這種情況下,您絕對應該使用大括號。

相關內容