Я работаю над созданием expenses
пакета. Цель — иметь возможность писать
\expense{someone}{something}{something a bit longer}{10}{GBP}
\expense{someone else }{something else}{something a bit longer}{11}{EUR}
\makeexpensetable
Для этого я запускаю внутренний \allexpenses
макрос
\def\allexpenses{}
Затем \expense
к каждой команде добавляется команда, \writeexpense
определяемая как
\newcommand{\writeexpense}[5]{%
#1 & #2 & #4 \\ %
}
Таким образом, в конечном итоге \makeexpensetable
команда просто начнет таблицу, затем будет \allexpenses
строка, содержащая все строки, и завершит таблицу.
Моя текущая \expense
команда:
\newcommand{\expense}[5]{%
\edef\allexpenses{\allexpenses%
\writeexpense{#1}{#2}{#3}{#4}{#5}%
}%
}
Однако TeX выдает ошибки из-за наличия команды \writeexpense
внутри. Как мне остановить расширение этой команды? Я предполагаю, что ответ как-то связан с правильным использованием команды \noexpand
, но я не могу понять, как это сделать.
решение1
Альтернативное, @
бесплатное решение:
\usepackage{etoolbox}
\appto\allexpenses{\writeexpense{#1}{#2}{#3}{#4}{#5}}
Есть также один или дваупаковка-бесплатные решения, но они фактически изобретают \appto
велосипед. Проблема в том, что он расширяет свое содержимое рекурсивно, а вы хотите , чтобы было расширено \edef
только начальное\allexpenses
один раз. На самом деле, это не \noexpand
то \unexpanded
, что вы хотите:
\edef\allexpenses{%
\expandafter\unexpanded\expandafter{\allexpenses}%
\unexpanded{\writeexpense{#1}{#2}{#3}{#4}{#5}}%
}
Это приводит к тому \allexpenses
, что он должен быть расширен один раз во все, что он содержит, а затем это содержимое должно быть защищено от дальнейшего расширения. Первая строка эквивалентна \expandonce\allexpenses
, где \expandonce
также определено в etoolbox
. eTeX
Решение без - заключается в использовании регистра токена для этого:
\toks0=\expandafter{\allexpenses \writeexpense{#1}{#2}{#3}{#4}{#5}}
\edef\allexpenses{\the\toks0}
Регистры токенов были оригинальными \expandonce
, но поскольку их назначение не полностью расширяемо, они не всегда подходят для использования в этом макросе на основе eTeX.
решение2
использовать \g@addto@macro\allexpenses{\writeexpense{#1}{#2}{#3}{#4}{#5}}
в файле пакета или между\makeatletter
\makeatother