
Este código simple produce
"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}
En las siguientes situaciones se compila bien:
- Sin
amsmath
- Cuando
calc
se carga despuésamsmath
- usando
\setcounter
en lugar de\addtocounter
¿Que está sucediendo aquí?
Si una clase se carga calc
y necesitamos amsmath
, ¿qué podemos hacer? Sé que una solución en este caso sería cargar amsmath
antes de la clase con \RequirePackage
. ¿Es posible otra solución entre ambos \usepackage
?
Respuesta1
Una solución más rápida, independientemente de qué paquete se cargue primero, es utilizar extensiones \numexpr
from e-tex
(que deberían estar disponibles básicamente para cualquier distribución TeX hoy en día).
Expande los valores del cálculo antes de que avance en\addtocounter
En el siguiente MWE el resultado es, como se esperaba,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}
Respuesta2
Dado que calc
redefine \setcounter
, \stepcounter
y \addtocounter
, la única forma que tiene si desea mantener su configuración es redeclarar estas definiciones después de cargarlas amsmath
.
Es decir, agregue las siguientes líneas en su preámbulo después\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}
Producción