パラメータなしのプライベートコマンドとローカルトークンリスト変数の違い

パラメータなしのプライベートコマンドとローカルトークンリスト変数の違い

LaTeX3 では、パラメータを取らないプライベート コマンドとローカル トークン リスト変数との間に、実用的および哲学的な違いは何ですか? どのような状況で、どちらか一方を他方よりも優先すべきですか? 受け入れられているベスト プラクティスはありますか?

たとえば、 などのフォント スイッチを保持するキーを定義するとします\color{red}\itshape。フォント スイッチを格納するプライベート コマンドを使用して、次のように定義します。

\cs_new:Npn \@@_font: { }

\keys_define:nn { @@ } {
  font .code:n = { \cs_set:Npn \@@_font: {#1} } ,
  font .value_required:n = true ,
  font .initial:n = ,
}

一方、ローカル トークン リスト変数を使用すると、次のように定義できます。

\tl_new:N \l_@@_font_tl

\keys_define:nn { @@ } {
  font .tl_set:N = \l_@@_font_tl ,
  font .value_required:n = true ,
  font .initial:n = ,
}

LaTeX3 では、これら 2 つのバージョンのどちらが推奨されますか?

答え1

これは境界線上のケースです。関数と変数の違いは

  • 関数はアクションを実行する
  • 変数は値を格納する

現在のフォントを変更するのはアクションなので、この場合は関数を使用する方がよいでしょう。

最もクリーンな方法は次のようになります

\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 = ,
}

\@@_use_font:V \l_@@_font_tl

使用時点で。

一方、既存のexpl3コードでは、効率性のためにトークン リスト変数を直接使用することが一般的です。したがって、このようなケースでは、ガイドラインを厳密に遵守するよりも個人的な好みが重要になります。この場合、導入されるオーバーヘッドはごく\@@_use_font:Vわずかですが、他の同様のケースでは、効率性により、変数を使用する選択がより魅力的になる可能性があります。

関連情報