如何使用 \clist_map_tokens:Nn?

如何使用 \clist_map_tokens:Nn?

第 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}

相关内容