누락된 숫자, amsmath 및 calc에서 0으로 처리됨

누락된 숫자, amsmath 및 calc에서 0으로 처리됨

이 간단한 코드는

"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

어떤 패키지가 먼저 로드되는지에 관계없이 더 빠른 해결 방법은 확장(현재 기본적으로 모든 TeX 배포에서 사용할 수 있어야 함) \numexpr에서 사용하는 것입니다.e-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\addtocounteramsmath

즉, 서문에 다음 줄을 추가하십시오.\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}

산출

여기에 이미지 설명을 입력하세요

관련 정보