Пропущенное число, рассматривается как ноль с помощью amsmath и calc

Пропущенное число, рассматривается как ноль с помощью amsmath и calc

Этот простой код создает

"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}

Выход

введите описание изображения здесь

Связанный контент