명령으로 카운트에 추가하기

명령으로 카운트에 추가하기

다음 명령이 있습니다.

\newcommand{\addtonewcount}[2]{\advance\#1 #2\relax}

#1은 카운트의 이름이고 #2는 카운트에 추가하려는 정도입니다.

명령이 오류를 반환합니다. 이 문제를 어떻게 해결할 수 있습니까?

더 완전한 예는 다음과 같습니다.

\documentclass[12pt,a4paper]{article}
\usepackage[utf8]{inputenc}

\newcommand{\addtonewcount}[2]{\advance\#1 #2\relax}

\begin{document}
\newcount\testcountone
\addtonewcount{testcountone}{7}
\end{document}

답변1

#1매크로를 정의할 때 매크로 본문에서 매크로를 사용하고 처리할 때 실제 매개변수가 삽입되는 곳입니다. 반면에 는 토큰이 뒤따르는 \#1제어 시퀀스입니다 . 이것은 완전히 다른 것입니다. a를 제어 시퀀스로 변환하려면 (매개변수에서 이미 읽음) TeX 기본 요소 쌍을 사용해야 합니다 .\#1name\name\csname ...\endcsname

정의는 다음과 같아야 합니다.

\def\addtonewcount#1#2{\advance \csname#1\endcsname by#2\relax}

확장 가능한 \csname...\endcsnameTeX 프리미티브와 \advanceTeX 프리미티브는 메인 프로세서 수준에서 작동하며 확장 후에 해당 매개변수를 읽습니다. 따라서 \expandafter이 경우에는 TeX 프리미티브를 사용할 필요가 없습니다 .

참고 2: 기본 요소 by의 선택적 키워드입니다 \advance. 저는 매크로 코드의 가독성을 높이기 위해 이것을 매크로에 사용하고 있습니다. 요즘에는 이러한 경우에 TeX 메모리를 아끼지 않아도 됩니다. TeX가 만들어지기 40년 전에 중요한 일이었습니다.

답변2

다음은\addtocounter

\addtocounter:
macro:#1#2->\@ifundefined {c@#1}{\@nocounterr {#1}}{\global \advance \csname c@#1\endcsname #2\relax }

먼저 카운터 #1이 정의되어 있는지 확인하고, 그렇다면 여기에 #2를 추가합니다.

관련 정보