Adicionando a uma contagem com um comando

Adicionando a uma contagem com um comando

Eu tenho o seguinte comando:

\newcommand{\addtonewcount}[2]{\advance\#1 #2\relax}

#1 é o nome da contagem e #2 é o grau em que se deseja adicionar à contagem.

O comando está retornando um erro. Como isso pode ser resolvido?

Aqui está um exemplo mais completo:

\documentclass[12pt,a4paper]{article}
\usepackage[utf8]{inputenc}

\newcommand{\addtonewcount}[2]{\advance\#1 #2\relax}

\begin{document}
\newcount\testcountone
\addtonewcount{testcountone}{7}
\end{document}

Responder1

#1no corpo da macro quando você está definindo uma macro é o local onde o parâmetro real é inserido quando a macro é usada e processada. Por outro lado, \#1é uma sequência de controle \#seguida pelo token 1. Isso é algo totalmente diferente. Se você realmente deseja converter a namena sequência de controle \name(já lida em um parâmetro), então você deve usar \csname ...\endcsnameum par de primitivas TeX.

Sua definição deve ser:

\def\addtonewcount#1#2{\advance \csname#1\endcsname by#2\relax}

Observe que \csname...\endcsnamesão primitivas TeX expansíveis e \advanceprimitivas TeX funcionam no nível do processador principal e lê seus parâmetros após a expansão. Portanto, você não precisa usar \expandaftero primitivo TeX neste caso.

Nota2: a bypalavra-chave is opcional do \advanceprimitivo. Estou usando isso em minhas macros para aumentar a legibilidade do código da macro. Não precisamos poupar memória TeX nesses casos hoje em dia. Foi importante há 40 anos quando o TeX foi criado.

Responder2

Aqui está a definição de\addtocounter

\addtocounter:
macro:#1#2->\@ifundefined {c@#1}{\@nocounterr {#1}}{\global \advance \csname c@#1\endcsname #2\relax }

Ele primeiro verifica se o contador nº 1 está definido e, em caso afirmativo, adiciona o nº 2 a ele.

informação relacionada