マクロを展開せずにコマンドを追加する方法

マクロを展開せずにコマンドを追加する方法

私はパッケージの構築に取り組んでいますexpenses。目的は、

\expense{someone}{something}{something a bit longer}{10}{GBP}
\expense{someone else }{something else}{something a bit longer}{11}{EUR}
\makeexpensetable

\allexpensesこれを実現するために、内部マクロを開始しています

\def\allexpenses{}

そして各\expenseコマンドは次\writeexpenseのように定義されたコマンドを追加します。

\newcommand{\writeexpense}[5]{%
    #1 & #2 & #4 \\ %
}

最終的に、\makeexpensetableコマンドは単にテーブルを開始し、\allexpensesすべての行を含む行を作成してテーブルを終了することになります。

私の現在の\expense指揮は

\newcommand{\expense}[5]{%
    \edef\allexpenses{\allexpenses%
        \writeexpense{#1}{#2}{#3}{#4}{#5}%
    }%
}

しかし、TeX は内部にコマンドが存在するためエラーをスローします\writeexpense。そのコマンドの展開を停止するにはどうすればよいでしょうか? 答えはコマンドの正しい使用法に関係していると思いますが\noexpand、わかりません。

答え1

代替の、@-freeソリューション:

\usepackage{etoolbox}
\appto\allexpenses{\writeexpense{#1}{#2}{#3}{#4}{#5}}

1つか2つありますパッケージフリーのソリューションですが、実質的に\appto車輪の再発明です。問題は、\edefその内容を再帰的に展開し、最初の部分だけ\allexpensesを展開したいということです。一度実際には、あなたが望んでいるのは\noexpandそれではありません\unexpanded:

\edef\allexpenses{%
  \expandafter\unexpanded\expandafter{\allexpenses}%
  \unexpanded{\writeexpense{#1}{#2}{#3}{#4}{#5}}%
}

これにより、 は\allexpensesそれに含まれる内容に一度展開され、その後、その内容はそれ以上の展開から保護されます。最初の行は と同等で\expandonce\allexpenses\expandonceも で定義されていますetoolboxeTeXを使用しないソリューションは、これにトークン レジスタを使用することです。

\toks0=\expandafter{\allexpenses \writeexpense{#1}{#2}{#3}{#4}{#5}}
\edef\allexpenses{\the\toks0}

トークン レジスタは元々の でした\expandonceが、その割り当ては完全に拡張可能ではないため、この eTeX ベースのマクロが使用される場所では必ずしも適切ではありません。

答え2

\g@addto@macro\allexpenses{\writeexpense{#1}{#2}{#3}{#4}{#5}}
パッケージファイル内または\makeatletter \makeatother

関連情報