完全に展開可能な expl3 関数の結果が存在する瞬間を、展開コンテキストで確実に知るにはどうすればよいでしょうか。

完全に展開可能な expl3 関数の結果が存在する瞬間を、展開コンテキストで確実に知るにはどうすればよいでしょうか。

expl3 プログラミング環境によって提供される関数は多数あり、interface3.pdf では、黒いアスタリスク (完全に展開可能) または白いアスタリスク (制限付きで展開可能) でマークされています。

結果を得るために必要な拡張の量に関する公式情報が提供されずに、多くの関数が完全に拡張可能とマークされているのはなぜですか?

\exp:wまあ、 /のような展開制御手段が\exp_end:実装に適用されていない、完全に展開可能な末尾再帰的なものでは、結果を取得するために必要な再帰の量と展開の量の両方が、ユーザーが提供する引数に依存します。したがって、結果を取得するために必要な展開の量に関する正確な情報は、そこでは提供できません。

しかし、そうではない関数も多くあり、結果を得るために必要な拡張の量に関する正確な情報を提供できます。

このように完全に拡張可能な expl3 関数を使用して、拡張コンテキストで結果が存在する瞬間を確実に知るにはどうすればよいでしょうか。

たとえば、 の結果を得るためにトリガーする必要がある拡張の量を知りたいです\str_tail:n

展開コンテキストでは、x-expansion 自体が展開可能ではないため、使用できません。 -expansion を
そのまま使用しても安全ではありませんf。文字列から先頭のスペースが削除される可能性があるためです。
問題の完全に展開可能な関数が、\str_tail:n引数自体が展開不可能な明示的な文字トークンの文字列ではないものである場合、 -expansion は必要以上に展開をトリガーする可能性があります。これに加えて、 - プリミティブが使用できないeエンジンでは、 -expansion はコストがかかります。\expandede

この場合、\str_tail:nsource3.pdf を調べてみると、現在の実装では 4 つの拡張が必要であることがわかります。

\cs_new:Npn \str_tail:n #1
  {
    \exp_after:wN \__str_tail_auxi:w
    \reverse_if:N \if_charcode:w
    \scan_stop: \tl_to_str:n {#1} X X \s__str_stop
  }
\cs_new:Npn \__str_tail_auxi:w #1 X #2 \s__str_stop { \fi: #1 }

展開 1 は の置換テキストを取得します\str_tail:n
展開 2 は を実行します。\exp_after:wNこれは、 の結果\if_charcode:wが評価されたときに終了し、文字列の最初のトークンが引数として使用され、そのカテゴリ コードが のカテゴリ コードと比較されます\scan_stop:
展開 3 は を展開し、一致のために を\__str_tail_auxi:w付加し、カテゴリ 11 で区切られた引数を保持し、 で区切られた引数を削除します。 展開 4 は を削除します。\fi:\if_charcode:wX\s__str_stop
\fi:

しかし、source3.pdf を調べても、実装の公式な詳細に関する情報は得られません。

内部実装が変更された場合、結果を取得するために必要な拡張の量も\str_tail:n変更される可能性があります。

完全に展開可能な関数で、関数の結果となるトークンを他のトークンで囲む適切なタイミングを確実に得るための一般的な方法は、関数の結果が出るまでの展開回数を知ること以外には見当たりません。expl3プログラミング環境によって提供される完全に展開可能な関数の展開をトリガーして、その関数の結果が出るまで
使用する場合、その関数の結果が出るまでの展開回数を知らなくても実行できる、適切なタイミングで展開を停止するため\exp:wの一般的な方法は見当たりません。\exp_end:\exp:w

したがって、完全に拡張可能な機能については、この情報は公式の情報として提供されるべきだと思います。

関数の結果までに何回の展開が必要ですか\exp_args:...、それとも\use_i:nnありますか?
その情報は interface3.pdf では公式には提供されていません。
たとえば、\use_i:nn公式に文書化された事実だけに頼るのではなく、内部実装の詳細から情報を推測したからといって、誰かが文句を言うことなく、常に正確に 1 つの展開が必要であると安全に頼ることができますか? 公式に文書化
されていない側面で、expl3 リリース間の一貫性に頼る理由は何ですか?
(私の Linux ディストリビューションに付属している LaTeX ディストリビューションは、TeX Live 2024 とは大きく異なります...)

答え1

ドキュメント化の状況は設計によるものです。展開の数が重要で、チームや他の人がそれを知っていたり頼りにしたりする必要のある(低レベルの)関数はごくわずかです。これらはドキュメント化されています。その他のケースでは、e- またはf- 型の展開を使用すれば通常は十分です。たとえば、\str_tail:n 必然的に文字列を生成します。したがって、これはe-type コンテキストでは安全であり、必要なし必要な拡張回数を文書化します。

より一般的には、関数が書類eトークンの場合は-type 拡張を使用できませんが、 \protected@edefLaTeX2e の堅牢なコマンドで機能するため、通常は を使用します - はexpl3一般的にこれを行いません。完全なテキストの場合、\text_expand:nと同様の機能を果たします\protected@edefが、非テキスト拡張ではうまく機能しません。いずれにしても、これらのアプローチにより、expl3関数の拡張が可能になり、LaTeX2e の脆弱な素材 (例:\textbfまたは類似のもの) が保持されます。

必要な拡張の数を文書化すると、コードの変更に制限が課せられます。可能な限り、私たちはこれを行いません。制限は API の一部を形成するものだけです。このような API の安定性が必要な明確なユースケースがある場合は、問題をログに記録して (ドキュメントの) 変更を依頼してください。

関連情報