Tengo el siguiente comando:
\newcommand{\addtonewcount}[2]{\advance\#1 #2\relax}
#1 es el nombre del conteo y #2 es el grado en el que se quiere agregar al conteo.
El comando devuelve un error. ¿Como puede ésto ser resuelto?
Aquí hay un ejemplo más completo:
\documentclass[12pt,a4paper]{article}
\usepackage[utf8]{inputenc}
\newcommand{\addtonewcount}[2]{\advance\#1 #2\relax}
\begin{document}
\newcount\testcountone
\addtonewcount{testcountone}{7}
\end{document}
Respuesta1
#1
en el cuerpo de la macro cuando se define una macro es el lugar donde se inserta el parámetro real cuando se utiliza y procesa la macro. Por otro lado, \#1
es una secuencia de control \#
seguida por el token 1
. Esto es algo totalmente diferente. Si realmente desea convertir a name
a la secuencia de control \name
(ya leída en un parámetro), debe usar \csname ...\endcsname
un par de primitivas TeX.
Tu definición debería ser:
\def\addtonewcount#1#2{\advance \csname#1\endcsname by#2\relax}
Tenga en cuenta que \csname...\endcsname
son primitivas TeX ampliables y que \advance
las primitivas TeX funcionan en el nivel del procesador principal y leen sus parámetros después de la expansión. Por lo tanto, no es necesario utilizar \expandafter
TeX primitivo en este caso.
Nota 2: la by
palabra clave es opcional de la \advance
primitiva. Estoy usando esto en mis macros para aumentar la legibilidad del código de la macro. Hoy en día no necesitamos ahorrar memoria TeX en estos casos. Fue importante hace 40 años cuando se creó TeX.
Respuesta2
Aquí está la definición de\addtocounter
\addtocounter:
macro:#1#2->\@ifundefined {c@#1}{\@nocounterr {#1}}{\global \advance \csname c@#1\endcsname #2\relax }
Primero comprueba si el contador n.° 1 está definido y, de ser así, le agrega el n.° 2.