
이 간단한 코드는
"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
\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
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}
산출