\clist_map_inline 的第二个参数中 #1 的扩展

\clist_map_inline 的第二个参数中 #1 的扩展

在 中有\clist_map_inline:Nn <comma list> {<inline function>}<inline funciton><item>被接收为 #1。如何将 #1 扩展为<item>

的源代码\clist_map_inline

\cs_new_protected:Npn \clist_map_inline:Nn #1#2
  {
    \clist_if_empty:NF #1
      {
        \int_gincr:N \g__kernel_prg_map_int
        \cs_gset_protected:cpn
          { __clist_map_ \int_use:N \g__kernel_prg_map_int :w } ##1 {#2}
        \exp_last_unbraced:Nco \__clist_map_function:Nw
          { __clist_map_ \int_use:N \g__kernel_prg_map_int :w }
          #1 , \q__clist_recursion_tail ,
        \prg_break_point:Nn \clist_map_break:
          { \int_gdecr:N \g__kernel_prg_map_int }
      }
  }

答案1

这种情况完全是 TeX 对#token 的正常处理,但也许它有助于解决这个问题。我们从 开始\cs_new_protected:Npn \clist_map_inline:Nn #1#2,这意味着\clist_map_inline:Nn有两个参数

  • clist
  • 要应用的代码

后者可能包含#1,但确实如此不是表示clist:我们可以看到,如果我们使用\tracingall。在那里,正如我们#在参数中看到的那样,TeX 显示它加倍(##)。这给出了它如何工作的线索:\clist_map_inline:Nn定义一个内部辅助,正如我们在问题中看到的那样,它被表示为采取##1(因为我们是一层嵌套)。我们传递的代码作为#2主函数该辅助函数的主体:它会按原样拾取每个条目#1,这就是工作原理。不涉及扩展,只需替换参数。

相关内容