私はパッケージの構築に取り組んでいます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
も で定義されていますetoolbox
。eTeX
を使用しないソリューションは、これにトークン レジスタを使用することです。
\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