Llaves en l3keys

Llaves en l3keys

En muchos casos, las llaves que rodean los valores de las claves l3keysse omiten al definir claves, incluso cuando las claves mismas tienen argumentos de tipo n-, c- o - e, que normalmente requieren argumentos entre llaves. ¿No es esto inconsistente y más confuso que proporcionar los frenos?

Mis preguntas: (1) ¿Por qué a veces se omiten las llaves? (2) ¿Cuál es la mejor práctica para programar en expl3?

Mi MWE es solo una demostración rápida de cómo definir claves usando l3keyssin usar valores entre llaves. En el código comentado, las claves se definen con valores entre llaves.

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

Respuesta1

Hay una documentación interface3que define qué es la entrada válida dentro de key=value-lists (consulte la subsección 27.10). No quiero repetir todo aquí, pero se reduce a lo siguiente:

Las llaves son opcionales y no hacen ninguna diferencia a menos que (fuera de las llaves anidadas):

  • tu valor incluye comas
  • su valor incluye al menos un signo igual
  • tu valor tiene al menos un espacio en cada extremo

Si nada de lo anterior es cierto, las llaves son completamente opcionales (y de hecho se obtiene un mejor rendimiento si se omiten, porque TeX tiene que mover menos tokens).

Entonces, ¿cuál es la "mejor práctica": lo que le resulte más fácil de leer y mantener, y si busca mejoras mínimas en la velocidad, omita cada juego de llaves innecesario? Pero tan pronto como reenvías la entrada del usuario, no sabes si incluirá espacios/comas/signos iguales, por lo que en ese caso deberías usar llaves.

información relacionada