Estou trabalhando na construção de um expenses
pacote. A intenção é poder escrever
\expense{someone}{something}{something a bit longer}{10}{GBP}
\expense{someone else }{something else}{something a bit longer}{11}{EUR}
\makeexpensetable
Para fazer isso, estou iniciando uma \allexpenses
macro interna
\def\allexpenses{}
Em seguida, cada \expense
comando acrescenta a ele um \writeexpense
comando definido como
\newcommand{\writeexpense}[5]{%
#1 & #2 & #4 \\ %
}
Para que eventualmente o \makeexpensetable
comando simplesmente inicie uma tabela, depois tenha uma \allexpenses
linha contendo todas as linhas e termine a tabela.
Meu \expense
comando atual é
\newcommand{\expense}[5]{%
\edef\allexpenses{\allexpenses%
\writeexpense{#1}{#2}{#3}{#4}{#5}%
}%
}
Porém, o TeX está gerando erros devido à presença do \writeexpense
comando dentro dele. Como faço para impedir que esse comando se expanda? Suponho que a resposta tenha algo a ver com o uso correto de um \noexpand
comando, mas não consigo descobrir.
Responder1
Solução alternativa e @
gratuita:
\usepackage{etoolbox}
\appto\allexpenses{\writeexpense{#1}{#2}{#3}{#4}{#5}}
Há também um ou doispacote-soluções gratuitas, mas que efetivamente reinventam a \appto
roda. O problema é que \edef
expande seu conteúdo recursivamente, e você quer apenas que o inicial \allexpenses
seja expandidouma vez. Na verdade, não é \noexpand
mas \unexpanded
você quer:
\edef\allexpenses{%
\expandafter\unexpanded\expandafter{\allexpenses}%
\unexpanded{\writeexpense{#1}{#2}{#3}{#4}{#5}}%
}
Isso faz com \allexpenses
que seja expandido uma vez em tudo o que contém e, em seguida, esses conteúdos sejam protegidos de futuras expansões. A primeira linha equivale a \expandonce\allexpenses
, onde \expandonce
também está definida em etoolbox
. A eTeX
solução -free é usar um registro de token para isso:
\toks0=\expandafter{\allexpenses \writeexpense{#1}{#2}{#3}{#4}{#5}}
\edef\allexpenses{\the\toks0}
Os registradores de token eram os originais \expandonce
, mas como sua atribuição não é totalmente expansível, eles nem sempre são adequados onde esta macro baseada em eTeX está.
Responder2
usar \g@addto@macro\allexpenses{\writeexpense{#1}{#2}{#3}{#4}{#5}}
em um arquivo de pacote ou entre\makeatletter
\makeatother