
In vielen Fällen l3keys
werden die Klammern, die die Werte der Schlüssel in umgeben, bei der Definition von Schlüsseln weggelassen, selbst wenn die Schlüssel selbst Argumente vom Typ n
-, c
- oder - haben e
, die normalerweise geschweifte Argumente erfordern. Ist das nicht inkonsistent und verwirrender als die Angabe der Klammern?
Meine Fragen: (1) Warum werden die Klammern manchmal weggelassen? (2) Was ist die beste Vorgehensweise beim Programmieren in expl3
?
Mein MWE ist nur eine kurze Demonstration der Definition von Schlüsseln l3keys
ohne Verwendung von geschweiften Werten. Im auskommentierten Code werden die Schlüssel mit geschweiften Werten definiert.
\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}
Antwort1
Es gibt eine Dokumentation, interface3
die definiert, was gültige Eingaben in key=value
-Listen sind (siehe Unterabschnitt 27.10). Ich möchte hier nicht alles wiederholen, aber es läuft auf Folgendes hinaus:
Klammern sind optional und machen keinen Unterschied, es sei denn (außerhalb verschachtelter Klammern):
- Ihr Wert enthält Kommas
- Ihr Wert enthält mindestens ein Gleichheitszeichen
- Ihr Wert hat an beiden Enden mindestens ein Leerzeichen
Wenn keine der oben genannten Bedingungen zutrifft, sind die Klammern völlig optional (und Sie erzielen tatsächlich eine bessere Leistung, wenn Sie sie weglassen, da TeX weniger Token verschieben muss).
Was ist also die „Best Practice“? Was auch immer Sie leichter lesbar und pflegeleicht finden – und wenn Sie nur minimale Geschwindigkeitsverbesserungen erzielen möchten, lassen Sie jede unnötige Klammer weg. Sobald Sie jedoch Benutzereingaben weiterleiten, wissen Sie nicht, ob diese Leerzeichen/Kommas/Gleichheitszeichen enthalten, also sollten Sie in diesem Fall unbedingt Klammern verwenden.