使用命令添加计数

使用命令添加计数

我有以下命令:

\newcommand{\addtonewcount}[2]{\advance\#1 #2\relax}

#1 是计数的名称,#2 是想要添加到计数的程度。

该命令返回错误。如何解决?

这是一个更完整的例子:

\documentclass[12pt,a4paper]{article}
\usepackage[utf8]{inputenc}

\newcommand{\addtonewcount}[2]{\advance\#1 #2\relax}

\begin{document}
\newcount\testcountone
\addtonewcount{testcountone}{7}
\end{document}

答案1

#1在定义宏时,宏主体中的 是使用和处理宏时插入实际参数的地方。另一方面,\#1是控制序列,\#后跟标记1。这是完全不同的事情。如果您真的想将 转换name为控制序列\name(已在参数中读取),那么您必须使用\csname ...\endcsname一对 TeX 基元。

你的定义应该是:

\def\addtonewcount#1#2{\advance \csname#1\endcsname by#2\relax}

请注意,\csname...\endcsnameTeX 基元是可扩展的, TeX 基元在主处理器级别工作,并在扩展后读取其参数。因此,在这种情况下\advance您不需要使用TeX 基元。\expandafter

注 2:by是原语的可选关键字\advance。我在我的宏中使用它是为了提高宏代码的可读性。现在我们不需要在这些情况下节省 TeX 内存。40 年前 TeX 创建时,这一点很重要。

答案2

这是定义\addtocounter

\addtocounter:
macro:#1#2->\@ifundefined {c@#1}{\@nocounterr {#1}}{\global \advance \csname c@#1\endcsname #2\relax }

它首先检查计数器 #1 是否已定义,如果已定义,则将 #2 添加到其中。

相关内容