Agregar a un conteo con un comando

Agregar a un conteo con un comando

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

#1en 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, \#1es una secuencia de control \#seguida por el token 1. Esto es algo totalmente diferente. Si realmente desea convertir a namea la secuencia de control \name(ya leída en un parámetro), debe usar \csname ...\endcsnameun 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...\endcsnameson primitivas TeX ampliables y que \advancelas 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 \expandafterTeX primitivo en este caso.

Nota 2: la bypalabra clave es opcional de la \advanceprimitiva. 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.

información relacionada