Fehlende Zahl, wird mit amsmath und calc als Null behandelt

Fehlende Zahl, wird mit amsmath und calc als Null behandelt

Dieser einfache Code erzeugt

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

In den folgenden Situationen kompiliert es gut:

  • Ohneamsmath
  • Wann calcwird geladen nachamsmath
  • anstelle \setcountervon\addtocounter

Was passiert hier?

Wenn eine Klasse geladen wird calcund wir benötigen amsmath, was können wir tun? Ich weiß, dass eine Lösung in diesem Fall darin besteht, amsmathvor der Klasse mit zu laden \RequirePackage. Ist zwischen beiden ein anderer Workaround möglich \usepackage?

Antwort1

Eine schnellere Problemumgehung, unabhängig davon, welches Paket zuerst geladen wird, ist die Verwendung \numexprvon e-texErweiterungen (die heutzutage praktisch für jede TeX-Distribution verfügbar sein sollten).

Es erweitert die Werte der Berechnung, bevor sie fortgesetzt wird um\addtocounter

Im folgenden MWE ist das Ergebnis, wie erwartet,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}

Antwort2

Da und calcneu definiert werden \setcounter, besteht die einzige Möglichkeit, wenn Sie Ihre Einstellungen beibehalten möchten, darin, diese Definitionen nach dem Laden erneut zu deklarieren .\stepcounter\addtocounteramsmath

Das heißt, fügen Sie in Ihrer Präambel die folgenden Zeilen hinzu nach\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

MWE:

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

Ausgabe

Bildbeschreibung hier eingeben

verwandte Informationen