
多くの場合、キーを定義するときに、キーの値を囲む中括弧はl3keys
省略されます。これは、キー自体に、通常は中括弧で囲まれた引数を必要とするn
-、c
-、またはe
- 型の引数がある場合でも同様です。これは一貫性がなく、中括弧を指定するよりも混乱を招くのではないでしょうか。
私の質問: (1) 中括弧が省略されることがあるのはなぜですか? (2) でのプログラミングのベストプラクティスは何ですかexpl3
?
私の MWE は、中括弧で囲まれた値を使わずにキーを定義する簡単なデモンストレーションですl3keys
。コメントアウトされたコードでは、キーは中括弧で囲まれた値で定義されています。
\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}
答え1
interface3
には、リスト内で有効な入力が何であるかを定義するドキュメントがありますkey=value
(サブセクション 27.10 を参照)。ここですべてを繰り返すつもりはありませんが、要約すると次のようになります。
中括弧はオプションであり、次の場合を除き、違いはありません (ネストされた中括弧の外側):
- 値にカンマが含まれています
- 値に少なくとも1つの等号が含まれています
- 値の両端に少なくとも1つのスペースが必要です
上記のいずれにも当てはまらない場合、中括弧は完全にオプションです (実際、中括弧を省略すると、TeX が移動する必要があるトークンが少なくなるため、パフォーマンスが向上します)。
では、「ベスト プラクティス」とは何でしょうか。読みやすく、保守しやすいと思うものなら何でもかまいません。また、わずかな速度向上を追求する場合は、不要な中括弧をすべて省略します。ただし、ユーザー入力を転送するとすぐに、スペース、カンマ、等号が含まれるかどうかがわからないため、その場合は必ず中括弧を使用する必要があります。