Diferenças entre o comando privado sem parâmetros ou variável de lista de tokens local

Diferenças entre o comando privado sem parâmetros ou variável de lista de tokens local

No LaTeX3, quais são as diferenças - práticas e filosóficas - entre um comando privado sem parâmetros e uma variável de lista de tokens local? Em que situações um deve ser preferido ao outro? Existe uma melhor prática aceita?

Por exemplo, suponha que eu esteja definindo uma chave para manter as opções de fonte, como \color{red}\itshape. Usando um comando privado para armazenar as opções de fonte, posso definir:

\cs_new:Npn \@@_font: { }

\keys_define:nn { @@ } {
  font .code:n = { \cs_set:Npn \@@_font: {#1} } ,
  font .value_required:n = true ,
  font .initial:n = ,
}

Por outro lado, usando uma variável de lista de tokens local, posso definir:

\tl_new:N \l_@@_font_tl

\keys_define:nn { @@ } {
  font .tl_set:N = \l_@@_font_tl ,
  font .value_required:n = true ,
  font .initial:n = ,
}

Qual destas duas versões é preferida no LaTeX3?

Responder1

Este é um caso limítrofe. A distinção entre funções e variáveis ​​é que

  • funções executam ações
  • valores de armazenamento de variáveis

Alterar a fonte atual é uma ação, então neste caso estou mais inclinado para uma função.

A maneira mais limpa de proceder seria algo como

\cs_new_protected:Nn \@@_use_font:n { #1 }
\cs_generate_variant:Nn \@@_use_font:n { V }

\keys_define:nn { @@ }
 {
  font .tl_set:N = \l_@@_font_tl  ,
  font .value_required:n = true ,
  font .initial:n = ,
}

com

\@@_use_font:V \l_@@_font_tl

no ponto de uso.

Por outro lado, o uso direto de uma variável de lista de tokens é bastante comum no expl3código existente, para maior eficiência. Assim, para um caso como este, trata-se mais de uma preferência pessoal do que do estrito respeito das directrizes: a sobrecarga introduzida \@@_use_font:Vé insignificante neste caso, noutros casos semelhantes a eficiência pode tornar a escolha da utilização da variável mais atractiva.

informação relacionada