매크로를 확장하지 않고 매크로에 명령을 추가하는 방법

매크로를 확장하지 않고 매크로에 명령을 추가하는 방법

패키지를 만드는 일을 하고 있습니다 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

관련 정보