패키지를 만드는 일을 하고 있습니다 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
는 에도 정의되어 있습니다 . -free 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