Estoy trabajando en la construcción de un expenses
paquete. 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 \allexpenses
macro interna.
\def\allexpenses{}
Luego, a cada \expense
comando se le agrega un \writeexpense
comando definido como
\newcommand{\writeexpense}[5]{%
#1 & #2 & #4 \\ %
}
De modo que eventualmente el \makeexpensetable
comando simplemente comenzará una tabla, luego tendrá una \allexpenses
línea que contenga todas las filas y finalizará la tabla.
Mi \expense
comando actual es
\newcommand{\expense}[5]{%
\edef\allexpenses{\allexpenses%
\writeexpense{#1}{#2}{#3}{#4}{#5}%
}%
}
Sin embargo, TeX arroja errores debido a la presencia del \writeexpense
comando 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 \noexpand
comando, 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 \appto
rueda. El problema es que \edef
expande su contenido de forma recursiva, y solo quieres \allexpenses
que se expanda el inicialuna vez. De hecho, no es \noexpand
más que \unexpanded
lo que quieres:
\edef\allexpenses{%
\expandafter\unexpanded\expandafter{\allexpenses}%
\unexpanded{\writeexpense{#1}{#2}{#3}{#4}{#5}}%
}
Esto hace \allexpenses
que 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 \expandonce
también se define en etoolbox
. La eTeX
solució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