我使用分隔符列表来定义将文本包含在所述分隔符内的函数。
以下是 MWE:
\ExplSyntaxOn
\clist_new:N \l_delim_clist
\clist_put_right:Nn \l_delim_clist {
{paren, (, )},
{curly, \{, \}},
{brac, [, ]}
}
\clist_new:N \l_delim_specs
\clist_map_inline:Nn \l_delim_clist {
\clist_clear:N \l_delim_specs
\clist_put_right:Nn \l_delim_specs {#1}
\clist_pop:NN \l_delim_specs \l_delim_name
\clist_pop:NN \l_delim_specs \l_delim_start
\clist_pop:NN \l_delim_specs \l_delim_end
\cs_new_nopar:cpx {delim_ \l_delim_name :n} ##1 {\l_delim_start ##1 \l_delim_end}
}
\show\delim_paren:n
\show\delim_brac:n
\ExplSyntaxOff
现在,在编译时,TeX 会耗尽堆栈空间。这似乎是由于卷曲部分造成的。特别是删除第 6 行:
{curly, \{, \}},
编译正确,结果符合预期。也就是说,\show\delim_paren:n
结果为:
> \delim_paren:n=macro:
#1->(#1)
我希望\delim_curly:n
成为可以在数学模式中使用的宏#1->\{#1\}
。有人能解释一下 TeX 陷入无限循环的原因以及我该如何修复上述代码吗?谢谢!
答案1
你不能在扩展参数中使用\{
and ,除非你采取预防措施不扩展它们。其他分隔符不会出现同样的问题,因为它们是字符标记。\}
x
\clist_item:nn
您可以利用返回其周围的物品这一事实\exp_not:n
。
\RequirePackage{expl3}
\ExplSyntaxOn
\clist_new:N \l_arakonam_delim_clist
\clist_set:Nn \l_arakonam_delim_clist
{
{paren, (, )},
{curly, \{, \}},
{brac, [, ]}
}
\clist_map_inline:Nn \l_arakonam_delim_clist
{
\cs_new_nopar:cpx {delim_ \clist_item:nn {#1} {1} :n} ##1
{
\clist_item:nn {#1} {2}
##1
\clist_item:nn {#1} {3}
}
}
\cs_show:N \delim_paren:n
\cs_show:N \delim_brac:n
\cs_show:N \delim_curly:n
\ExplSyntaxOff
这是终端上的输出:
> \delim_paren:n=macro:
#1->(#1).
<recently read> }
l.24 \cs_show:N \delim_paren:n
?
> \delim_brac:n=macro:
#1->[#1].
<recently read> }
l.25 \cs_show:N \delim_brac:n
?
> \delim_curly:n=macro:
#1->\{#1\}.
<recently read> }
l.26 \cs_show:N \delim_curly:n
?