在 LaTeX2e 宏中使用 expl3

在 LaTeX2e 宏中使用 expl3

我想重新定义文档中的 \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,如果不是\NewDocumentCommandxparse甚至可能是更好的选择)。

相关内容