
Em muitos casos, os colchetes que cercam os valores das chaves l3keys
sã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 l3keys
sem 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 interface3
que 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.