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
#1
no 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 name
na sequência de controle \name
(já lida em um parâmetro), então você deve usar \csname ...\endcsname
um par de primitivas TeX.
Sua definição deve ser:
\def\addtonewcount#1#2{\advance \csname#1\endcsname by#2\relax}
Observe que \csname...\endcsname
são primitivas TeX expansíveis e \advance
primitivas TeX funcionam no nível do processador principal e lê seus parâmetros após a expansão. Portanto, você não precisa usar \expandafter
o primitivo TeX neste caso.
Nota2: a by
palavra-chave is opcional do \advance
primitivo. 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.