
這個簡單的程式碼產生
"Missing number, treated as zero"
\documentclass{article}
\newcounter{test}
\newcounter{testtwo}
\usepackage{calc}
\usepackage{amsmath}
\begin{document}
\addtocounter{test}{\value{testtwo}*\value{testtwo}}
\end{document}
在以下情況下編譯良好:
- 沒有
amsmath
- 何時
calc
加載amsmath
- 使用
\setcounter
而不是\addtocounter
這裡發生了什麼事?
如果加載了一個類別calc
並且我們需要amsmath
,我們能做什麼?我知道這種情況下的解決方案將amsmath
在類別之前加載\RequirePackage
.兩者之間可能有另一種解決方法嗎\usepackage
?
答案1
無論首先加載哪個包,一個更快的解決方法是使用\numexpr
擴充功能e-tex
(現在基本上任何 TeX 發行版都應該可用)。
它在前進之前擴展了計算的值\addtocounter
在下面的 MWE 中,結果如預期的那樣:100
\documentclass{article}
\newcounter{test}
\newcounter{testtwo}
\usepackage{calc}
\usepackage{amsmath}
\begin{document}
\setcounter{testtwo}{10}
\addtocounter{test}{\numexpr\value{testtwo}*\value{testtwo}}
\thetest
\end{document}
答案2
由於calc
重新定義了\setcounter
、\stepcounter
和\addtocounter
,因此如果您想保留設置,唯一的方法就是在載入後重新聲明這些定義amsmath
。
也就是說,在序言中加入以下行\usepackage{amsmath}
\makeatletter
\def\setcounter#1#2{\@ifundefined{c@#1}{\@nocounterr{#1}}%
{\calc@assign@count{\global\csname c@#1\endcsname}{#2}}}
\def\addtocounter#1#2{\@ifundefined{c@#1}{\@nocounterr{#1}}%
{\calc@assign@count{\global\advance\csname c@#1\endcsname}{#2}}}%
\def\stepcounter#1{\@ifundefined {c@#1}%
{\@nocounterr {#1}}%
{\global\advance\csname c@#1\endcsname \@ne
\begingroup
\let\@elt\@stpelt \csname cl@#1\endcsname
\endgroup}}%
\@ifpackageloaded{amstext}{%
\expandafter\def\expandafter\stepcounter
\expandafter#\expandafter1\expandafter{%
\expandafter\iffirstchoice@\stepcounter{#1}\fi
}
\expandafter\def\expandafter\addtocounter
\expandafter#\expandafter1\expandafter#\expandafter2\expandafter{%
\expandafter\iffirstchoice@\addtocounter{#1}{#2}\fi
}
}{}
\makeatother
微量元素:
\documentclass{article}
\newcounter{test}
\newcounter{testtwo}
\usepackage{calc}
\usepackage{amsmath}
\makeatletter
\def\setcounter#1#2{\@ifundefined{c@#1}{\@nocounterr{#1}}%
{\calc@assign@count{\global\csname c@#1\endcsname}{#2}}}
\def\addtocounter#1#2{\@ifundefined{c@#1}{\@nocounterr{#1}}%
{\calc@assign@count{\global\advance\csname c@#1\endcsname}{#2}}}%
\def\stepcounter#1{\@ifundefined {c@#1}%
{\@nocounterr {#1}}%
{\global\advance\csname c@#1\endcsname \@ne
\begingroup
\let\@elt\@stpelt \csname cl@#1\endcsname
\endgroup}}%
\@ifpackageloaded{amstext}{%
\expandafter\def\expandafter\stepcounter
\expandafter#\expandafter1\expandafter{%
\expandafter\iffirstchoice@\stepcounter{#1}\fi
}
\expandafter\def\expandafter\addtocounter
\expandafter#\expandafter1\expandafter#\expandafter2\expandafter{%
\expandafter\iffirstchoice@\addtocounter{#1}{#2}\fi
}
}{}
\makeatother
\begin{document}
\setcounter{testtwo}{6}
\addtocounter{test}{\value{testtwo}*\value{testtwo}}
\the\value{test}
\end{document}
輸出