LaTeX3:花括号的标记

LaTeX3:花括号的标记

我使用分隔符列表来定义将文本包含在所述分隔符内的函数。

以下是 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

? 

相关内容