我有以下命令:
\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...\endcsname
TeX 基元是可扩展的, 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 添加到其中。