Скобки в 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которая определяет, что является допустимым вводом внутри key=value-lists (см. подраздел 27.10). Я не хочу повторять все здесь, но это сводится к следующему:

Фигурные скобки необязательны и не имеют значения, если только (за пределами вложенных фигурных скобок):

  • ваше значение включает запятые
  • Ваше значение включает как минимум один знак равенства
  • Ваше значение имеет по крайней мере один пробел с обеих сторон

Если ни одно из вышеперечисленных утверждений не верно, то скобки совершенно необязательны (и, действительно, вы получите лучшую производительность, если их опустить, поскольку TeX придется перемещать меньше токенов).

Итак, что такое «лучшая практика»: все, что вы считаете более простым для чтения и поддержки — и если вы хотите минутного улучшения скорости, опуская все ненужные наборы фигурных скобок. Но как только вы пересылаете пользовательский ввод, вы не знаете, будут ли в нем пробелы/запятые/знаки равенства, поэтому в этом случае вам определенно следует использовать фигурные скобки.

Связанный контент