KTUGFaq

KTUG FAQ

"\edef, \xdef, \noexpand"에 댓글 더하기

로그인:
비밀번호:
가입
Nobody expects the Spanish Inquisition!
FrontPage › LittleTree/ReadingTeXbook/2006-03
Mar 22, 2006
\edef, \xdef, \noexpand
Submitted by 작은나무 @ 03-22 [09:39 am]

215~216쪽: \xdef를 먼저 시작합니다. 왠지 이름에서 강렬함을 느낄 수 있지 않나요? xdef??? \xdef는 \global\edef와 동일합니다. \global\def를 \gdef로 하는 것을 보면 \xdef보다는 \gedef가 되어야 할것 같은데, \xdef라고 하네요. 아마도 expanded의 x에서 따왔나봅니다. 어쨌든, \global의 뜻은 알고 있으니, \edef만 알면 \xdef도 자동 해결됩니다.

글쎄요... 한 번도 그런 경우를 경험해 보지 못해서 그런데, 저자가 말하기를 매크로를 정의하다보면, \def가 그렇듯이 단순히 replacement text를 글자 그대로 카피하는 것이 아니라, 현재 상황에 맞추어 replacement text에 들어있는 매크로를 그대로 다 전개시켜야 하는 경우가 있다고 합니다. (도대체 언제?) 이런 경우에 사용되는 명령어가 \edef, 이름하야 expanded definition 입니다. 형식은 \def와 똑같고, 즉

\def<control sequence><parameter text>{replacement text}

와 같은 형식이지만, 앞서 말했듯이 TeX은 무작정 replacement text에 있는 모든 전개할 수 있는 토큰들을 전개합니다. 예를들면 아래와 같은데,
\def\double#1{#1#1} \edef\a{\double{xy}} \edef\a{\double\a}
첫번째 \edef는 '\def\a{xyxy}'와 동일하고, 두번째는 '\def\a{xyxyxyxy}'와 동일합니다. 이 외에 다른 모든 종류의 전개도 마찬가지 인데, 조건문이 사용된 것을 예로들면,
\edef\b#1#2{\ifmmode#1\else#2\fi}
TeX이 위의 \edef와 만나는 순간 수학 모드에 있다면, 위는 '\def\b#1#2{#1}'과 동일하고, 아니면, '\def\b#1#2{#2}'과 동일합니다. 언제 \edef를 사용할지 모르겠으나, 일단 이해는 됩니다.

\edef나 \xdef는 replacement text에 더이상 전개할 토큰이 남아있지 않을때 까지 줄기차게 전개를 해나가는데, 이에 예외가 있죠. 늘 이 놈의 예외가 문제입니다. 문제는 이렇습니다. 참 별난 사람이 있어서 혹은 별난 상황이 되어서 \edef를 이용하면서도 replacement text안에 있는 어떤 매크로는 전개시키고 싶지 않다는 것입니다. 이때 사용하는 것이 \noexpand 입니다. 이름 그대로 입니다. 다음과 같은 상황을 예를 들어 봅시다. 매크로 \a를 정의하는데, \a는 전개된 \b, 전개되지 않는 \c, 전개된 \d라고 하고, \b와 \d는 파라미터가 없는 단순한 매크로 라고 합시다. 그러면 \a는 아래와 같은 두가지 방법으로 정의할 수 있습니다.
\edef\a{\b\noexpand\c\d} \toks0={\c} \edef\a{\b\the\toks0 \d}
두번째는 \the에 의해서 만들어지는 토큰 역시 \edef 안에서라도 더이상 전개되지 않는다고 합니다.
이름:

서명하지 않기
 

^
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2006-06-06 22:54:57
Processing time 4.2709 sec