Ich arbeite an einem expenses
Paket. Die Absicht ist, schreiben zu können
\expense{someone}{something}{something a bit longer}{10}{GBP}
\expense{someone else }{something else}{something a bit longer}{11}{EUR}
\makeexpensetable
Dazu starte ich ein internes \allexpenses
Makro
\def\allexpenses{}
Dann fügt jeder \expense
Befehl einen Befehl hinzu, der \writeexpense
definiert ist als
\newcommand{\writeexpense}[5]{%
#1 & #2 & #4 \\ %
}
So dass der \makeexpensetable
Befehl letztendlich einfach eine Tabelle beginnt, dann eine \allexpenses
Zeile mit allen Zeilen erstellt und die Tabelle beendet.
Mein aktueller \expense
Befehl ist
\newcommand{\expense}[5]{%
\edef\allexpenses{\allexpenses%
\writeexpense{#1}{#2}{#3}{#4}{#5}%
}%
}
TeX gibt jedoch aufgrund des \writeexpense
darin enthaltenen Befehls Fehler aus. Wie verhindere ich, dass dieser Befehl erweitert wird? Ich vermute, die Antwort hat etwas mit der korrekten Verwendung eines \noexpand
Befehls zu tun, aber ich kann es nicht herausfinden.
Antwort1
Alternative, @
kostenlose Lösung:
\usepackage{etoolbox}
\appto\allexpenses{\writeexpense{#1}{#2}{#3}{#4}{#5}}
Es gibt auch ein oder zweiPaket-freie Lösungen, aber sie erfinden das \appto
Rad praktisch neu. Das Problem ist, dass \edef
seinen Inhalt rekursiv erweitert und Sie nur den Anfangsbuchstaben \allexpenses
erweitern möchten.einmalTatsächlich ist es nicht \noexpand
das \unexpanded
, was Sie wollen:
\edef\allexpenses{%
\expandafter\unexpanded\expandafter{\allexpenses}%
\unexpanded{\writeexpense{#1}{#2}{#3}{#4}{#5}}%
}
Dies führt dazu \allexpenses
, dass einmal in den Inhalt expandiert wird und dieser Inhalt dann vor weiterer Expansion geschützt wird. Die erste Zeile ist äquivalent zu \expandonce\allexpenses
, wobei \expandonce
auch in definiert ist etoolbox
. Die eTeX
-freie Lösung besteht darin, hierfür ein Token-Register zu verwenden:
\toks0=\expandafter{\allexpenses \writeexpense{#1}{#2}{#3}{#4}{#5}}
\edef\allexpenses{\the\toks0}
Token-Register waren das Original \expandonce
, aber da ihre Zuweisung nicht vollständig erweiterbar ist, sind sie nicht immer dort geeignet, wo dieses eTeX-basierte Makro vorhanden ist.
Antwort2
Verwendung \g@addto@macro\allexpenses{\writeexpense{#1}{#2}{#3}{#4}{#5}}
in einer Paketdatei oder zwischen\makeatletter
\makeatother