我需要将列表映射到函数并在结果项之间插入分隔符。
\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]