En LaTeX3, ¿cuáles son las diferencias, tanto prácticas como filosóficas, entre un comando privado que no toma parámetros y una variable de lista de tokens local? ¿En qué situaciones se debe preferir uno sobre el otro? ¿Existe una mejor práctica aceptada?
Como ejemplo, supongamos que estoy definiendo una tecla para mantener los cambios de fuente como \color{red}\itshape
. Usando un comando privado para almacenar los cambios de fuente, podría 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 otro lado, usando una variable de lista de tokens local, podría 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 = ,
}
¿Cuál de estas dos versiones es la preferida en LaTeX3?
Respuesta1
Éste es un caso límite. La distinción entre funciones y variables es que
- funciones realizar acciones
- valores de almacenamiento variables
Cambiar la fuente actual es una acción, por lo que en este caso me inclino más por una función.
La forma más limpia de proceder sería 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 = ,
}
con
\@@_use_font:V \l_@@_font_tl
en el punto de uso.
Por otro lado, el uso directo de una variable de lista de tokens es bastante común en expl3
el código existente, por motivos de eficiencia. Así, en un caso como este, se trata más de una preferencia personal que de un estricto respeto de las directrices: los gastos generales introducidos \@@_use_font:V
son insignificantes en este caso, en otros casos similares la eficiencia podría hacer más atractiva la elección de utilizar la variable.