![如何使用 \clist_map_tokens:Nn?](https://linux22.com/image/443744/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20%5Cclist_map_tokens%3ANn%EF%BC%9F.png)
第 175 页:对存储在中的每个\clist_map_tokens:Nn⟨clist var⟩{⟨code⟩}
进行调用。如果由单个函数组成,则这相当于。有人可以举个例子吗?⟨code⟩{⟨item⟩}
⟨item⟩
⟨comma list⟩
⟨code⟩
\clist_map_function:nN
\documentclass{article}
\begin{document}
\ExplSyntaxOn
%\clist_map_tokens:nn {x,y,x} {(#1)} % ERROR
\clist_map_inline:nn {x,y,x} {(#1)}
\ExplSyntaxOff
\end{document}
答案1
当您使用\clist_map_inline:Nn
或时,\clist_map_inline:nn
您只能#1
在第二个参数中使用,以引用循环中的当前项目。
使用时\clist_map_tokens:Nn
,第二个参数应该是一个函数少一个论点传递的比需要的要多;后面的将作为支撑的当前项提供。
\documentclass{article}
\usepackage{amsmath}
\ExplSyntaxOn
\NewDocumentCommand{\makematrix}{O{0pt}m}
{
\begin{bmatrix}
\clist_map_tokens:nn { #2 } { \erwann_make_row:nn { #1 } }
\\[\dim_eval:n { -\normalbaselineskip - #1 }]
\end{bmatrix}
}
\cs_new:Nn \erwann_make_row:nn { \clist_use:nn { #2 } { & } \\[#1] }
\ExplSyntaxOff
\begin{document}
$\makematrix{{1,2,3},{4,5,6},{7,8,9}}\ne\makematrix[12pt]{{1,2,3},{4,5,6},{7,8,9}}$
\end{document}
另一个优点\clist_map_inline:nn
是它\clist_map_tokens:nn
完全可扩展,但请注意空心星。
答案2
\clist_map_inline:nn
与函数的第二个参数不同_map_token:nn
(例如等\prop_map_tokens:Nn
也是如此),它不是内部宏的定义,而是应该使用第二个参数中的一些标记来调用它,这些标记需要包含列表项的括号组。例如,以下内容仅输出每个项目:
\clist_map_tokens:nn { a, b, c } { \use:n }
如果您的代码需要另一个参数,而该参数只是被转发,那么这很有用。例如,如果我们只想输出 clist 中大于另一个给定数字的数字项,该怎么办?您可以使用以下函数完全扩展地实现这一点(然后您可以使用 -typee
扩展将其嵌套在另一个 clist 函数的参数中):
\documentclass[]{article}
\ExplSyntaxOn
\cs_new:Npn \mymodule_filter_numbers:nn #1#2
{
\clist_if_empty:nF {#2}
{
\exp_args:Ne \exp_not:o
{
\exp_not:N \use_none:n
\clist_map_tokens:nn {#2} { \__mymodule_filter_numbers:nn {#1} }
}
}
}
\cs_new:Npn \__mymodule_filter_numbers:nn #1#2
{
\int_compare:nT { (#2) #1 } { , { \exp_not:n {#2} } }
}
\NewExpandableDocumentCommand \filternumbers { m m }
{
\mymodule_filter_numbers:nn {#1} {#2}
}
\ExplSyntaxOff
\edef\foo{\filternumbers{>5}{1,2,3,4,5,6,7,8,9}}\show\foo
\begin{document}
\filternumbers{>5}{1,2,3,4,5,6,7,8,9}
\end{document}