我想处理一个列表,但无法使用,\clist_use:Nn
因为我必须对项目进行一些相当复杂的事情。但是,在使用时如何轻松移除最后的分隔符\clist_map_inline:Nn
?
\documentclass[a4paper]{article}
\usepackage{expl3}
\begin{document}
\ExplSyntaxOn
\clist_const:Nn\c_UF_clist {a,b,c,d}
\clist_map_inline:Nn\c_UF_clist
{\textbf{#1},~} %no comma after d!!!!
\ExplSyntaxOff
\end{document}
答案1
在我看来,这是很自然的,尽管有点乏味。(我将这个\seq_pop_left:NN
选项留给另一个答案)。
\documentclass[a4paper]{article}
\usepackage{expl3}
\begin{document}
\ExplSyntaxOn
\seq_set_from_clist:Nn \l_tmpa_seq { a , b , c , d }
\seq_set_map:NNn \l_tmpb_seq \l_tmpa_seq { \exp_not:n { \textbf { #1 } } }
\seq_use:Nn \l_tmpb_seq { ,~ }
\ExplSyntaxOff
\end{document}
\seq_set_map:NNn
如果由于其实验性而无法使用,你可以定义自己的函数
\seq_new:N \l__map_and_use_seq
\cs_new_protected:Npn \uf_seq_map_use:Nnn #1 #2 #3
{
\seq_clear:N \l__map_and_use_seq
\seq_map_inline:Nn #1 { \seq_put_right:Nn \l__map_and_use_seq { #2 } }
\seq_use:Nn \l__map_and_use_seq { #3 }
}
\seq_set_from_clist:Nn \l_tmpa_seq { a , b , c , d }
\uf_seq_map_use:Nnn \l_tmpa_seq { \textbf { [#1] } } { ,~ }
或者直接列出如果你愿意的话
\seq_new:N \l__map_and_use_seq
\seq_new:N \l__set_and_map_seq
\cs_new_protected:Npn \uf_clist_map_use:nnn #1 #2 #3
{
\seq_clear:N \l__map_and_use_seq
\seq_set_from_clist:Nn \l__set_and_map_seq { #1 }
\seq_map_inline:Nn \l__set_and_map_seq { \seq_put_right:Nn \l__map_and_use_seq { #2 } }
\seq_use:Nn \l__map_and_use_seq { #3 }
}
\uf_clist_map_use:nnn { a , b , c , d } { \textbf { [#1] } } { ,~ }
答案2
如果不使用序列,您可以弹出 clist 中最左边的项目并映射剩余的 clist:
\documentclass{article}
\usepackage{expl3}
\ExplSyntaxOn
\tl_new:N \l__UF_clist_use_head_tl
\clist_new:N \l__UF_clist_use_tail_clist
\cs_new_protected:Npn \UF_clist_use:NNn #1 #2 #3
{
\clist_set_eq:NN \l__UF_clist_use_tail_clist #1
\clist_pop:NN \l__UF_clist_use_tail_tl \l__UF_clist_use_head_tl
\exp_args:NV #2 \l__UF_clist_use_head_tl
\clist_map_inline:Nn \l__UF_clist_use_tail_clist
{
#3 #2 { ##1 }
}
}
\clist_const:Nn \c_UF_clist {a,b,c,d}
\begin{document}
\UF_clist_use:NNn \c_UF_clist \textbf { ,~ }
\end{document}
的第一个参数\UF_clist_xuse:NNn
是 clist 变量,第二个参数是一个参数函数(此处为\textbf
),第三个参数是参数之间的分隔符。此函数不能嵌套,但这似乎不是一个很大的限制。
如果您打算模拟\clist_use:Nnnn
,那么将 clist 转换为序列并应用\seq_set_map:NNn
似乎是最好的方法。
在我看来,核函数称为\seq_use:NNnnn
、\seq_use:NNn
和,其中第二个参数是一个应用于每个项目的单参数函数,会受到欢迎(即使它们不是完全可扩展的)。\clist_use:NNnnn
\clist_use:NNn