So hängen Sie Befehle an ein Makro an, ohne sie zu erweitern

So hängen Sie Befehle an ein Makro an, ohne sie zu erweitern

Ich arbeite an einem expensesPaket. 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 \allexpensesMakro

\def\allexpenses{}

Dann fügt jeder \expenseBefehl einen Befehl hinzu, der \writeexpensedefiniert ist als

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

So dass der \makeexpensetableBefehl letztendlich einfach eine Tabelle beginnt, dann eine \allexpensesZeile mit allen Zeilen erstellt und die Tabelle beendet.

Mein aktueller \expenseBefehl ist

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

TeX gibt jedoch aufgrund des \writeexpensedarin enthaltenen Befehls Fehler aus. Wie verhindere ich, dass dieser Befehl erweitert wird? Ich vermute, die Antwort hat etwas mit der korrekten Verwendung eines \noexpandBefehls 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 \apptoRad praktisch neu. Das Problem ist, dass \edefseinen Inhalt rekursiv erweitert und Sie nur den Anfangsbuchstaben \allexpenseserweitern möchten.einmalTatsächlich ist es nicht \noexpanddas \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 \expandonceauch 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

verwandte Informationen