在 中有\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
,这就是工作原理。不涉及扩展,只需替换参数。