コマンドでカウントを追加する

コマンドでカウントを追加する

次のコマンドがあります:

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

#1 はカウントの名前、#2 はカウントに追加する度合いです。

コマンドがエラーを返しています。どうすれば解決できますか?

より詳しい例を以下に示します。

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

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

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

答え1

#1マクロを定義するときのマクロ本体の は、マクロが使用および処理されるときに実際のパラメータが挿入される場所です。一方、 は\#1制御シーケンスであり\#、その後にトークン が続きます。これはまったく別のものです。 を制御シーケンス (既にパラメータで読み取られている) に1変換する場合は、TeX プリミティブのペアを使用する必要があります。name\name\csname ...\endcsname

定義は次のようになります:

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

\csname...\endcsname拡張可能な TeX プリミティブであり、 TeX プリミティブはメイン プロセッサ レベルで動作し、拡張後にパラメータを読み取ります。したがって、この場合は TeX プリミティブ\advanceを使用する必要はありません。\expandafter

注 2: はプリミティブbyのオプション キーワードです\advance。マクロ コードの可読性を高めるために、マクロでこれを使用しています。今日では、このような場合に TeX メモリを節約する必要はありません。これは、TeX が作成された 40 年前には重要でした。

答え2

定義は次のとおりです\addtocounter

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

まず、カウンター #1 が定義されているかどうかを確認し、定義されている場合はそれに #2 を追加します。

関連情報