Cómo agregar comandos a una macro sin expandirlos

Cómo agregar comandos a una macro sin expandirlos

Estoy trabajando en la construcción de un expensespaquete. La intención es poder escribir.

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

Para hacer esto, estoy iniciando una \allexpensesmacro interna.

\def\allexpenses{}

Luego, a cada \expensecomando se le agrega un \writeexpensecomando definido como

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

De modo que eventualmente el \makeexpensetablecomando simplemente comenzará una tabla, luego tendrá una \allexpenseslínea que contenga todas las filas y finalizará la tabla.

Mi \expensecomando actual es

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

Sin embargo, TeX arroja errores debido a la presencia del \writeexpensecomando en su interior. ¿Cómo evito que ese comando se expanda? Supongo que la respuesta tiene algo que ver con el uso correcto de un \noexpandcomando, pero no puedo entenderlo.

Respuesta1

Solución alternativa @gratuita:

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

También hay uno o dospaquete-Soluciones gratuitas, pero efectivamente reinventan la \apptorueda. El problema es que \edefexpande su contenido de forma recursiva, y solo quieres \allexpensesque se expanda el inicialuna vez. De hecho, no es \noexpandmás que \unexpandedlo que quieres:

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

Esto hace \allexpensesque se expanda una vez a lo que contiene y luego esos contenidos se protejan de una mayor expansión. La primera línea es equivalente a \expandonce\allexpenses, donde \expandoncetambién se define en etoolbox. La eTeXsolución gratuita es utilizar un registro de token para esto:

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

Los registros de tokens eran los originales \expandonce, pero como su asignación no es completamente ampliable, no siempre son adecuados donde se encuentra esta macro basada en eTeX.

Respuesta2

utilizar \g@addto@macro\allexpenses{\writeexpense{#1}{#2}{#3}{#4}{#5}}
en un archivo de paquete o entre\makeatletter \makeatother

información relacionada