KTUGFaq

KTUG FAQ

"expandafter(2): 시간차 공격"에 댓글 더하기

로그인:
비밀번호:
가입
You have a will that can be influenced by all with whom you come in contact.
FrontPage › LittleTree/ReadingTeXbook/2006-03
Mar 25, 2006
expandafter(2): 시간차 공격
Submitted by 작은나무 @ 03-25 [03:14 pm]
213쪽: 명령어 \expandafter는 굉장히 재미있으면서도 보기보다는 그다지 어려운 명령어가 아니었습니다. 물론 TeXbook에 나와있는 예제는 쉽지만은 않아서 이 명령어의 의미를 알아차리기 그다지 쉽지만은 않았는데, 다행이 아주 쉽고 적절한 예제를 찾았습니다. 예제의 출처는 "Getting TeXnical: Insights into TeX Macro Writing Techniques", TUGboat, Volume 11 (1990), No.3 입니다. TeX 매크로 작성하는 기교(?)를 설명하는 paper인데, 약간 어려운 면이 있지만, 매우 재미있습니다. 관심있는 분은 한번 읽어보기를 꼭 권합니다.

이해를 돕기위해서, 배구에 비유를 해서 먼저 개념을 설명하면 :) 배구에 "시간차 공격" 이라는 공격 기술이 있죠? 세터가 배구 공을 토스를 하면 두 명의 공격수가 기다리고 있다가, 첫번째 공격수가 마치 스파이크를 할것 처럼 하다가 두번째 공격수가 실제로 스파이크 공격을 합니다. \expandafter는 바로 이 배구의 "시간차 전개"에 해당합니다. \expandafter가 세터에 해당하고 그 뒤에 따라 나오는 두개의 명령어(control sequence)가 두 명의 공격수에 해당합니다.

\expandafter는 첫번째 나오는 매크로를 전개시키는 것이 아니라 두번째 나오는 매크로를 전개 시키고, 그 전개된 결과를 첫번째 매크로가 이용합니다. 매우 재미있습니다.

그럼, 약속대로 간단하면서도 이해하기 쉬운 예를 들어보겠습니다.
\def\letters{xyz}
\def\lookatletters#1#2#3{First arg=#1, Second arg=#2, Third arg=#3 }
위와 같이 \lookatletter 매크로가 정의 되어 있을때,
\lookatletters\letters ? !
는 어떻게 전개될까요? \lookatletters 의 첫번째 인자가 \letter이고 두번째 인자는 ?, 세번째 인자는 ! 인데, \letter 매크로는 xyz로 전개 되기 때문에
 First arg=xyz, Second arg=?, Third arg=!
과 같이 전개됩니다. 이것은 누구나 알수 있습니다. 이제 \expandafter를 이용해서 시간차 공격에 들어갑니다.
\expandafter\lookatletters\letters ? !
는 어떻게 전개될까요? 먼저 \expandafter는 \letters를 먼저 전개 시킵니다. 그래서 위의 문장은 결국 다음과 같이 됩니다.
\lookatletters xyz ? !
그래서 최종 결과는
 First arg=x, Second arg=y, Third arg=z ? !
입니다. 재미있죠? 그리고 쉽습니다.
이름:

서명하지 않기
 

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