将 \clist_use:nn 和 \clist_map_function:nN 与分隔符组合起来

将 \clist_use:nn 和 \clist_map_function:nN 与分隔符组合起来

我需要将列表映射到函数并在结果项之间插入分隔符。

\clist_use接受分隔符,但clist_map_function不接受。我该如何将两者结合起来。

我尝试过的:

在下面的示例中,\mybrackets{a, b, c}输出[a][b][c]\mypath{a, b, c}输出a>b>c

我需要的是两者的结合:[a]>[b]>[c]

\documentclass[]{article}

\ExplSyntaxOn
\NewDocumentCommand \mypath { O{>} m } {
    \clist_use:nn { #2 } { #1 }
}
\NewDocumentCommand \mybrackets { m } {
    \clist_map_function:nN { #1 } \myfunction:n
}
\cs_new_protected:Npn \myfunction:n #1 {
    [ { #1 } ]
}
\ExplSyntaxOff

\begin{document}
\mybrackets{a, b, c} % outputs [a][b][c]
\mypath{a, b, c}    % outputs a>b>c
\end{document}

答案1

您想使用比 clist 更灵活的序列。

首先设置“in”序列,然后将其映射以在“out”序列中添加括号,最后即可使用。

\documentclass[]{article}
\usepackage[T1]{fontenc}

\ExplSyntaxOn

\NewDocumentCommand \mybrackets { m }
  {
    \wolfrevo_mybrackets:n { #1 }
  }

\seq_new:N \l__wolfrevo_mybrackets_in_seq
\seq_new:N \l__wolfrevo_mybrackets_out_seq

\cs_new_protected:Nn \wolfrevo_mybrackets:n
  {
    \seq_set_from_clist:Nn \l__wolfrevo_mybrackets_in_seq { #1 }
    \seq_set_map:NNn \l__wolfrevo_mybrackets_out_seq \l__wolfrevo_mybrackets_in_seq { [##1] }
    \seq_use:Nn \l__wolfrevo_mybrackets_out_seq { > }
  }

\ExplSyntaxOff

\begin{document}

\mybrackets{a, b, c}

\end{document}

在此处输入图片描述

或者,使用索引映射:

\documentclass[]{article}
\usepackage[T1]{fontenc}

\ExplSyntaxOn

\NewDocumentCommand \mybrackets { m }
  {
    \wolfrevo_mybrackets:n { #1 }
  }

\seq_new:N \l__wolfrevo_mybrackets_in_seq

\cs_new_protected:Nn \wolfrevo_mybrackets:n
  {
    \seq_set_from_clist:Nn \l__wolfrevo_mybrackets_in_seq { #1 }
    \seq_map_indexed_function:NN \l__wolfrevo_mybrackets_in_seq \__wolfrevo_mybrackets_do:nn
  }

\cs_new:Nn \__wolfrevo_mybrackets_do:nn
  {
    \int_compare:nT { #1 > 1 } { > } [#2]
  }
\ExplSyntaxOff

\begin{document}

\mybrackets{a, b, c}

\end{document}

答案2

在此处输入图片描述

您可以在第一个项目前添加一个空分隔符

\documentclass[]{article}
\usepackage[T1]{fontenc}

\ExplSyntaxOn
\tl_new:N\l_mypath_sep


\NewDocumentCommand \mybrackets { m } {
        \tl_set:Nn\l_mypath_sep{}
    \clist_map_function:nN { #1 } \myfunction:n
}
\cs_new_protected:Npn \myfunction:n #1 {
     \l_mypath_sep
    \tl_set:Nn\l_mypath_sep{~>~}
    [ { #1 } ]
}
\ExplSyntaxOff

\begin{document}
\mybrackets{a, b, c} % outputs [a] > [b] > [c]

\end{document}

答案3

为了进行比较,我们可以在 TeX 原始级别执行以下操作:

\def\mybrackets#1{\mybracketsA#1,\end}
\def\mybracketsA#1,#2{\ifx\end#2[#1]\else [#1]>\expandafter\mybracketsA\expandafter#2\fi}

\mybrackets{a, b, c}  % prints [a]<[b]<[c]

相关内容