l3変数を展開して分割する

l3変数を展開して分割する

変数を拡張し\pmbc_bounds_tlて分割する必要があります。 を試してみましたが、うまくexp_argsいきませんでした。 のどのバージョンをexp_args使用すればよいですか?

\documentclass{article}

\ExplSyntaxOn

\tl_new:N \pmbc_bounds_tl

\NewDocumentEnvironment{foo}{b}{
  \seq_set_split:Nnn \l_tmpa_seq { ; } { #1 }
%  \seq_show:N  \l_tmpa_seq
    
  \seq_pop_left:NNTF \l_tmpa_seq \pmbc_bounds_tl { } {
    BOUNDS ~ PB !
  }
%  \tl_show:N \pmbc_bounds_tl
  
% WHICH VERSION TO USE?
  \seq_set_split:Nnn \l_tmpb_seq { : } { \pmbc_bounds_tl }
  \seq_show:N  \l_tmpb_seq
}{}

\ExplSyntaxOff


\begin{document}

TEST.

\begin{foo}
    a = b : c ;
    d = e : f
\end{foo}

\end{document}

答え1

Vtl 変数の値にアクセスしたいのですが、コロンのスコープが\ExplSyntaxOn通常の設定と異なることにも注意する必要があります。

に格納されているものをコロンで分割したい場合\l_pmbc_bounds_tl、正しい方法は

\seq_set_split:NVV \l_tmpb_seq \c_colon_str \l_pmbc_bounds_tl

中括弧はいつも引数の型がNまたVはの場合、省略可能であり、変数はそのスコープを宣言する必要がある(l変数は名前の中でまたはgまたは) を宣言する必要があります:は無効な名前です。c\pmbc_bounds_tl

nシグネチャに以下の関数が含まれる場合は、V、を置き換えたn。この場合は、\seq_set_split:Nnnバリアント を使用しますが、 は です\seq_set_split:NVV

このバリアントはあらかじめ定義されていますが、常にそうであるとは限りません。LaTeXがバリアントが定義されていないことに反発することが判明した場合は、標準的な方法を使用する方がよいでしょう。

\cs_generate_variant:Nn

いくつかの関数を試すのではなく\exp_args:...、コードが明確になり、パフォーマンスが大幅に低下することはありません。

この状況では、マクロ展開の観点から考えることは適切なアプローチではありません。これはむしろ「値にアクセスする」ことであり、これがマクロ展開を使用して内部的に実装されているという事実は問題にならないためです。

答え2

最初の 2 つのコメントのおかげで、解決策は上に示されています。

\documentclass{article}

\ExplSyntaxOn

\tl_new:N \l_pmbc_bounds_tl

\NewDocumentEnvironment{foo}{b}{
  \seq_set_split:Nnn \l_tmpa_seq { ; } { #1 }
%  \seq_show:N  \l_tmpa_seq
    
  \seq_pop_left:NNTF \l_tmpa_seq \l_pmbc_bounds_tl { } {
    BOUNDS ~ PB !
  }
%  \tl_show:N \l_pmbc_bounds_tl

  \seq_set_split:NVV \l_tmpb_seq \c_colon_str \l_pmbc_bounds_tl
  \seq_show:N  \l_tmpb_seq
}{}

\ExplSyntaxOff


\begin{document}

TEST.

\begin{foo}
    a = b : c ;
    d = e : f
\end{foo}

\end{document}

関連情報