
Во многих случаях скобки, окружающие значения ключей, 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
которая определяет, что является допустимым вводом внутри key=value
-lists (см. подраздел 27.10). Я не хочу повторять все здесь, но это сводится к следующему:
Фигурные скобки необязательны и не имеют значения, если только (за пределами вложенных фигурных скобок):
- ваше значение включает запятые
- Ваше значение включает как минимум один знак равенства
- Ваше значение имеет по крайней мере один пробел с обеих сторон
Если ни одно из вышеперечисленных утверждений не верно, то скобки совершенно необязательны (и, действительно, вы получите лучшую производительность, если их опустить, поскольку TeX придется перемещать меньше токенов).
Итак, что такое «лучшая практика»: все, что вы считаете более простым для чтения и поддержки — и если вы хотите минутного улучшения скорости, опуская все ненужные наборы фигурных скобок. Но как только вы пересылаете пользовательский ввод, вы не знаете, будут ли в нем пробелы/запятые/знаки равенства, поэтому в этом случае вам определенно следует использовать фигурные скобки.