Ich habe folgenden Befehl:
\newcommand{\addtonewcount}[2]{\advance\#1 #2\relax}
#1 ist der Name der Zählung und #2 ist der Grad, um den man die Zählung erhöhen möchte.
Der Befehl gibt einen Fehler zurück. Wie kann das Problem behoben werden?
Hier ist ein ausführlicheres Beispiel:
\documentclass[12pt,a4paper]{article}
\usepackage[utf8]{inputenc}
\newcommand{\addtonewcount}[2]{\advance\#1 #2\relax}
\begin{document}
\newcount\testcountone
\addtonewcount{testcountone}{7}
\end{document}
Antwort1
#1
im Makrokörper, wenn Sie ein Makro definieren, ist dies die Stelle, an der der eigentliche Parameter eingefügt wird, wenn das Makro verwendet und verarbeitet wird. Auf der anderen Seite \#1
folgt eine Steuersequenz, \#
gefolgt vom Token . Das ist etwas völlig anderes. Wenn Sie wirklich eine in die Steuersequenz 1
umwandeln möchten (bereits in einem Parameter gelesen), müssen Sie ein Paar TeX-Grundelemente verwenden .name
\name
\csname ...\endcsname
Ihre Definition sollte sein:
\def\addtonewcount#1#2{\advance \csname#1\endcsname by#2\relax}
Beachten Sie, dass \csname...\endcsname
es sich um erweiterbare TeX-Grundelemente handelt und dass \advance
das TeX-Grundelement auf der Ebene des Hauptprozessors arbeitet und seine Parameter nach der Erweiterung liest. Sie müssen \expandafter
in diesem Fall also kein TeX-Grundelement verwenden.
Hinweis 2: Das by
Schlüsselwort des \advance
Primitivs ist optional. Ich verwende es in meinen Makros, um die Lesbarkeit des Makrocodes zu verbessern. Heutzutage müssen wir in diesen Fällen keinen TeX-Speicher mehr einsparen. Das war vor 40 Jahren wichtig, als TeX erstellt wurde.
Antwort2
Hier ist die Definition von\addtocounter
\addtocounter:
macro:#1#2->\@ifundefined {c@#1}{\@nocounterr {#1}}{\global \advance \csname c@#1\endcsname #2\relax }
Zuerst wird geprüft, ob Zähler Nr. 1 definiert ist. Wenn ja, wird Nr. 2 hinzugefügt.