変数を拡張し\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
V
tl 変数の値にアクセスしたいのですが、コロンのスコープが\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}