다음 명령이 있습니다.
\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 기본 요소 쌍을 사용해야 합니다 .\#
1
name
\name
\csname ...\endcsname
정의는 다음과 같아야 합니다.
\def\addtonewcount#1#2{\advance \csname#1\endcsname by#2\relax}
확장 가능한 \csname...\endcsname
TeX 프리미티브와 \advance
TeX 프리미티브는 메인 프로세서 수준에서 작동하며 확장 후에 해당 매개변수를 읽습니다. 따라서 \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를 추가합니다.