Chaves em l3keys

Chaves em l3keys

Em muitos casos, os colchetes que cercam os valores das chaves l3keyssão omitidos ao definir as chaves, mesmo quando as próprias chaves têm argumentos do tipo n-, c- ou - e, que normalmente requerem argumentos entre colchetes. Isso não é inconsistente e mais confuso do que fornecer aparelho ortodôntico?

Minhas perguntas: (1) Por que às vezes os colchetes são omitidos? (2) Qual é a melhor prática para programação em expl3?

Meu MWE é apenas uma demonstração rápida de como definir chaves l3keyssem usar valores entre colchetes. No código comentado, as chaves são definidas com valores entre colchetes.

\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}

Responder1

Existe uma documentação interface3que define o que é entrada válida dentro de key=value-lists (ver subseção 27.10). Não quero repetir tudo aqui, mas tudo se resume ao seguinte:

Chaves são opcionais e não fazem diferença, a menos que (fora de chaves aninhadas):

  • seu valor inclui vírgulas
  • seu valor inclui pelo menos um sinal de igual
  • seu valor tem pelo menos um espaço em cada extremidade

Se nenhuma das opções acima for verdadeira, as chaves são completamente opcionais (e de fato você obtém melhor desempenho se elas forem omitidas, porque o TeX precisa transferir menos tokens).

Então, o que é "melhor prática": o que você achar mais fácil de ser lido e mantido - e se você deseja melhorias de velocidade minuciosas, omitindo todos os conjuntos desnecessários de chaves. Mas assim que você encaminha a entrada do usuário, você não sabe se isso incluirá espaços/vírgulas/sinais de igual; portanto, nesse caso, você deve absolutamente usar colchetes.

informação relacionada