我有以下命令:
\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
。這是完全不同的事情。如果您確實想將 a 轉換name
為控制序列\name
(已在參數中讀取),那麼您必須使用\csname ...\endcsname
一對 TeX 原語。
你的定義應該是:
\def\addtonewcount#1#2{\advance \csname#1\endcsname by#2\relax}
請注意,\csname...\endcsname
TeX 原語是可擴展的,\advance
TeX 原語在主處理器層級工作,並在擴展後讀取其參數。因此,\expandafter
在這種情況下您不需要使用TeX 原語。
註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 加到其中。