KTUGFaq

KTUG FAQ

"\futurelet revisited"에 댓글 더하기

로그인:
비밀번호:
가입
You will receive a legacy which will place you above want.
FrontPage › LittleTree/ReadingTeXbook/2006-03
Mar 31, 2006
\futurelet revisited
Submitted by 작은나무 @ 03-31 [10:05 am]
207쪽: 앞에 \futurelet이라는 제목으로 글을 쓴 적이 있어서, 이번에 "\futurelet 다시보기" 로 제목을 붙였지만, 처음 글은 \futurelet을 도대체 어디에 사용해야 하는지 이해하지 못하겠다는 넋두리였기때문에, 사실은 지금이 진짜라고 하겠습니다. :)

TeXbook에 나와 있는 \futurelet이 사용된 예제는 아직 작은나무에게는 무리가 있어서, 좀 더 자세히 설명되고, 상대적으로 쉬운 TeXbyTopic에서 설명과 그 예제를 골라보았습니다. 그래서 이번만은 TeXbook 읽기가 아니라 TeXbyTopic 읽기로 해야겠습니다.

다음의 \let을 이용한 문장은 이미 아시다시피,
\let<control sequence><token1><token2><token3><token...>
<control sequence>가 <token1>의 의미를 갖게 되고, 남은 것을 다시 써보면, 다음과 같이 됩니다.
<token2><token3><token...>
즉, 위에서 <token1>이 사라진 것이지요.

하지만 \futurelet은 좀 다릅니다. 위에서 \let을 \futurelet으로 바꾸면, 다음과 같이 되는데,
\futurelet<control sequence><token1><token2><token3><token...>
이는 <control sequence>에 <token1>이 아닌 <token2>의 의미를 부여합니다. (\expandafter 와 약간 비슷한 뭔가가 느껴집니다. :) ) 그리고나서, \let의 경우는 그 의미상 <token1>이 사라진 반면, \futurelet에서는 <token2>가 사라지지 않습니다. 즉, 아래와 같이 됩니다.
<token1><token2><token3><token...>
위 상태가 되고나면, <token1>은 <token2>가 어떤 녀석인지 알게됩니다. 그래서 <token1>은 <token2>에 따라서 행동을 취하면 됩니다. 이제 \futurelet의 의미가 확실히 이해가 됩니다. 이놈을 어디다 쓰느냐가 문제인데... \futurelet이 쓰이는 대표적인 예가 바로 매크로의 파라미터가 옵셔널한 경우랍니다. 그렇다고 하니까, 그럴 것도 같은데, 아직 확 와닿지 않습니다. 좀 더 살펴보겠습니다.

다음과 같은 매크로 \Com이 있다고 합시다.
\Com{argument} 또는 \Com[optional]{argument}
\Com 이라는 명령어에 optional 이라는 파라미터가 있을 수도 있고, 없을 수도 있습니다. 즉 말 그대로 파라미터가 옵션이라는 뜻이죠. 위와 같은 \Com 매크로를 해결하기 위해서 \futurelet이 주로 쓰인다고 합니다. 그럼 \Com은 실제로 어떻게 정의 될까요? (이제 얼마 안남았습니다.)

\def\Com{\futurelet\testchar\MaybeOptArgCom} \def\MaybeOptArgCom{\ifx[\testchar \let\next\OptArgCom \else \let\next\NoOptArgCom \fi \next} \def\OptArgCom[#1]#2{ ... } \def\NoOptArgCom#1{ ... }
모든 것이 분명해지는 순간입니다. :)) 정말 기쁩니다. (TeXbook도 요로콤 알기쉽게 설명해주면, 얼마나 좋을까 하고 생각해 봅니다.)

결국 아래의 문장은
\Com[optional]{argument}
위의 \Com의 정의대로라면,
 \futurelet\testchar\MaybeOptArgCom[optional]{argument}
이 되는데, \futurelet의 정의에 따라 \testchar는 '['를 갖게 됩니다. 그래서 \MaybeOptArgCom은 이제 \testchar이 어떤 놈인지 알게되어 \testchar가 '['라면 \OptArgCom를 실행하면되고, 아니라면 \NoOptArgCom 를 전개하면 그만입니다.

대한독립만세! 입니다. :))

좋은 설명 감사합니다. 참고로 LaTeX에서는 다음과 같이 처리합니다.
\newcommand\Com[2][\@empty]{%
\ifx #1\@empty
...
 \else
...
 \fi
 }
그렇지만 작은나무님 덕분에 퓨처렛의 의미를 확실히 알았으니 너무나 큰 소득입니다. -- Progress 2006-03-31 10:39:02

even better!!! 그렇다면, "LaTeX 읽기"도 해야한단 말입니까? ;) -- 작은나무 2006-03-31 11:39:41
이름:

서명하지 않기
 

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