我想重新定义文档中的 \section 宏,我发现 LaTeX3e 是在其中进行整数运算的最简单方法之一。但是我在编译时收到“缺少 $ 插入”错误。一个最小示例如下:
\documentclass{article}
\usepackage{expl3}
\ExplSyntaxOn
\int_zero_new:N \g_int
\ExplSyntaxOff
\newcommand\fooinc{
\ExplSyntaxOn
\int_incr:N \g_int
\ExplSyntaxOff
}
\begin{document}
\fooinc
\end{document}
上面的代码为什么不起作用?
答案1
你应该读ExplSyntaxOn 和 ExplSyntaxOff 起什么作用?和它的兄弟姐妹\makeatletter 和 \makeatother 起什么作用?
当 TeX 读取定义时,它只存储给出的标记,没有执行任何分配。特别是,\ExplSyntaxOn
在您的定义中没有执行,因此\fooinc
定义为扩展为以下标记(我使用 • 作为标记分隔符,以便更好地阅读):
\ExplSyntaxOn•\int•_•i•n•c•r•:•N• •\g•_•i•n•t• •\ExplSyntaxOff
因此宏\ExplSyntaxOn
将会执行得太晚。
正确的方法是
\ExplSyntaxOn
\int_zero_new:N \g_florian_whatever_int
\cs_new_protected:Npn \fooinc
{
\int_gincr:N \g_florian_whatever_int
}
\ExplSyntaxOff
您已将整数参数声明为全局参数,因此应始终使用全局赋值来管理它。并且\g_int
这个名字选得很糟糕。
而不是\newcommand
,最好使用\cs_new_protected:Npn
,如果不是\NewDocumentCommand
(xparse
甚至可能是更好的选择)。