私はこれを内部で期待していました\clist_map
が、このコードではそうではありませんでした。おそらく「ダミー」の質問です...
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\pairwise}{mmm}{
\clist_set_eq:NN \l_tmpa_clist #1
\clist_set_eq:NN \l_tmpb_clist #2
\clist_clear:N #3
\bool_until_do:nn {\clist_if_empty_p:N \l_tmpa_clist}{
\clist_pop:NN \l_tmpa_clist \l_tmpa_tl
\clist_pop:NN \l_tmpb_clist \l_tmpb_tl
\clist_put_right:Nn #3 {\l_tmpa_tl / \l_tmpb_tl}
}
}
\ExplSyntaxOff
\begin{document}
\def\this{1,2,3,4,5}
\def\that{a,b,c,d,e}
There is \{\this\} and \{\that\}.
\pairwise{\this}{\that}{\result}
\def\expected{1/a,2/b,3/c,4/d,5/e}
Why \{\result\} not equal \{\expected\}?
\end{document}
答え1
コマンドは入力に、つまり等価性をチェックするために呼び出した時点で、 containsとcontains を\clist_put_right:Nn
残します。\l_tmpa_tl
\result
\l_tmpa_tl
5
\l_tmpb_tl
e
ただし、ペアワイズ コンテンツを取得するには、およびのX/Y
現在の値を評価 (展開) して変数に格納する必要があるため、次の型を使用します。\l_tmpa_tl
\l_tmpb_tl
\clist
x
\clist_put_right:Nx #3 {\l_tmpa_tl/\l_tmpb_tl}
おそらく\seq
リストの方が速くなる可能性がありますが、これはユースケースによって異なります。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\pairwise}{mmm}{
\clist_set_eq:NN \l_tmpa_clist #1
\clist_set_eq:NN \l_tmpb_clist #2
\clist_clear:N #3
\bool_until_do:nn {\clist_if_empty_p:N \l_tmpa_clist}{
\clist_pop:NN \l_tmpa_clist \l_tmpa_tl
\clist_pop:NN \l_tmpb_clist \l_tmpb_tl
\clist_put_right:Nx #3 {\l_tmpa_tl / \l_tmpb_tl}
}
}
\ExplSyntaxOff
\begin{document}
\def\this{1,2,3,4,5}
\def\that{a,b,c,d,e}
There is \{\this\} and \{\that\}.
\pairwise{\this}{\that}{\result}
\def\expected{1/a,2/b,3/c,4/d,5/e}
Now \{\result\} is equal to \{\expected\}?
\end{document}
答え2
あなたは価値トークン リストではなく、トークン リスト変数です。
ここでは、シーケンスとを使用した別のアプローチを示します。\seq_mapthread_function:NNN
これは、2 つのシーケンスを走査し、項目を 2 つの引数を持つ関数に渡します。
`\pairwiseのオプション引数として異なる出力セパレータを与えることもできるので、例えば
\pairwise[|]{a,b}{1,2}{\result}
\result
を定義しますa/1|b/2
。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\pairwise}{O{,}mmm}
{
\seq_set_from_clist:No \l_komarov_first_seq { #2 }
\seq_set_from_clist:No \l_komarov_second_seq { #3 }
\seq_clear:N \l_komarov_output_seq
\seq_mapthread_function:NNN
\l_komarov_first_seq
\l_komarov_second_seq
\komarov_addentry:nn
\tl_set:Nx #4 { \seq_use:Nn \l_komarov_output_seq { #1 } }
}
\seq_new:N \l_komarov_first_seq
\seq_new:N \l_komarov_second_seq
\seq_new:N \l_komarov_output_seq
\cs_generate_variant:Nn \seq_set_from_clist:Nn { No }
\cs_new_protected:Nn \komarov_addentry:nn
{
\seq_put_right:Nn \l_komarov_output_seq { #1 / #2 }
}
\ExplSyntaxOff
\begin{document}
\newcommand\this{1,2,3,4,5}
\newcommand\that{a,b,c,d,e}
There is \{\this\} and \{\that\}.
\pairwise{\this}{\that}{\result}
\newcommand\expected{1/a,2/b,3/c,4/d,5/e}
Now \{\result\} equals \{\expected\}
\pairwise{1,2,3,4,5}{a,b,c,d,e}{\newresult}
Also \{\newresult\} equals \{\expected\}
\end{document}