次のコマンドがあります:
\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 を追加します。