我正在尝试将命令编写成令牌列表。
\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}{\{}.