Welche praktischen und philosophischen Unterschiede gibt es in LaTeX3 zwischen einem privaten Befehl ohne Parameter und einer lokalen Token-Listenvariable? In welchen Situationen sollte das eine dem anderen vorgezogen werden? Gibt es eine anerkannte bewährte Vorgehensweise?
Nehmen wir beispielsweise an, dass ich eine Taste zum Speichern von Schriftartenschaltern wie definiere \color{red}\itshape
. Wenn ich einen privaten Befehl zum Speichern der Schriftartenschalter verwende, könnte ich Folgendes definieren:
\cs_new:Npn \@@_font: { }
\keys_define:nn { @@ } {
font .code:n = { \cs_set:Npn \@@_font: {#1} } ,
font .value_required:n = true ,
font .initial:n = ,
}
Andererseits könnte ich mithilfe einer lokalen Token-Listenvariable Folgendes definieren:
\tl_new:N \l_@@_font_tl
\keys_define:nn { @@ } {
font .tl_set:N = \l_@@_font_tl ,
font .value_required:n = true ,
font .initial:n = ,
}
Welche dieser beiden Versionen wird in LaTeX3 bevorzugt?
Antwort1
Dies ist ein Grenzfall. Der Unterschied zwischen Funktionen und Variablen besteht darin, dass
- Funktionen führen Aktionen aus
- Variable Speicherwerte
Das Ändern der aktuellen Schriftart ist eine Aktion, daher tendiere ich in diesem Fall eher zu einer Funktion.
Die sauberste Vorgehensweise wäre etwa so:
\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 = ,
}
mit
\@@_use_font:V \l_@@_font_tl
am Einsatzort.
Andererseits ist die direkte Verwendung einer Token-Listenvariable in vorhandenem expl3
Code aus Effizienzgründen recht üblich. In einem Fall wie diesem ist es also eher eine persönliche Präferenz als die strikte Einhaltung von Richtlinien: Der dadurch verursachte Mehraufwand \@@_use_font:V
ist in diesem Fall vernachlässigbar, in anderen ähnlichen Fällen könnte die Effizienz die Verwendung der Variable attraktiver machen.