expl3:如何删除 clist 映射中的最后一个逗号

expl3:如何删除 clist 映射中的最后一个逗号

我想处理一个列表,但无法使用,\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

相关内容