Hinzufügen zu einer Zählung mit einem Befehl

Hinzufügen zu einer Zählung mit einem Befehl

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

#1im 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 \#1folgt eine Steuersequenz, \#gefolgt vom Token . Das ist etwas völlig anderes. Wenn Sie wirklich eine in die Steuersequenz 1umwandeln 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...\endcsnamees sich um erweiterbare TeX-Grundelemente handelt und dass \advancedas TeX-Grundelement auf der Ebene des Hauptprozessors arbeitet und seine Parameter nach der Erweiterung liest. Sie müssen \expandafterin diesem Fall also kein TeX-Grundelement verwenden.

Hinweis 2: Das bySchlüsselwort des \advancePrimitivs 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.

verwandte Informationen