expl3:\tl_put_right:Nx 窒息\{

expl3:\tl_put_right:Nx 窒息\{

我正在尝试将命令编写成令牌列表。

\documentclass{article}
\usepackage{expl3}
\begin{document}
  \ExplSyntaxOn
  \tl_new:N \__a
  \tl_new:N \__b
  \tl_new:N \__c
  \tl_set:Nn \__a { test }
  \tl_set:Nn \__b { \{ }  % works with { brace } but not with { \{ }
  \tl_put_right:Nx \__c { \exp_not:N \m { \__a } { \__b } }
  \tl_show:N \__c % expected result: \m{test}{\{}
  \ExplSyntaxOff
\end{document}

一切都运行正常,但当我有一个\{令牌时,整个系统就崩溃了。有什么办法可以解决这个问题吗?

答案1

诸如这样的命令\{应谨慎使用,因为它们是用 定义的\DeclareRobustCommand。 的扩展\{

\x@protect \{\protect \{

这是一个明确的信号,表明在x争论中使用它注定会失败。

你可以重新定义

\protected\def\{{\ifmmode \lbrace \else \textbraceleft \fi}

并且它会起作用;用xparse行话来说就是

\DeclareDocumentCommand \{ { }
 {
  \mode_if_math:TF { \lbrace } { \textbraceleft }
 }

并且这将在x扩展中幸存下来。等待 LaTeX3 团队的任务之一是用 '\protected' 宏而不是 重新定义所有此类命令\DeclareRobustCommand。原因是\protected在开发 LaTeX2e 时不可用:它是 e-TeX 扩展之一。

这将是一个巨大的重新定义所有强健命令的任务(\textbraceleft需要相当不同的处理方式)。您可以安全地只扩展一个级别,但可能您应该采取不同的方法。

\documentclass{article}
\usepackage{expl3}
\begin{document}
  \ExplSyntaxOn
  \tl_new:N \__my_a_tl
  \tl_new:N \__my_b_tl
  \tl_new:N \__my_c_tl
  \tl_set:Nn \__my_a_tl { test }
  \tl_set:Nn \__my_b_tl { \{ }
  \tl_put_right:Nx \__my_c_tl
   {
    \exp_not:N \m { \exp_not:V \__my_a_tl } { \exp_not:V \__my_b_tl }
   }
  \tl_show:N \__my_c_tl % expected result: \m{test}{\{}
  \ExplSyntaxOff
\end{document}

终端输出:

> \__my_c_tl=macro:
->\m {test}{\{}.

相关内容