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 expl3
có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.