
Этот простой код создает
"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}
Выход