
在許多情況下,定義鍵時會省略圍繞鍵值的大括號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 必須移動更少的標記)。
那麼,什麼是「最佳實踐」:無論您發現什麼更容易閱讀和維護,並且如果您追求微小的速度改進,則省略每組不必要的大括號。但是,一旦您轉發使用者輸入,您就不知道是否會包含空格/逗號/等號,因此在這種情況下,您絕對應該使用大括號。