KTUG 한국 텍 사용자 그룹

Menu

KTUG :: Q&A 마당

\@ifundefined 는 TeX 에서 \csname foo\endcsname 를 expand할 때는 만약 \foo 가 존재하지 않으면 일단 \foo 라는 것을 만들고 \relax 의 alias 로 만든다는 메커니즘을 이용해서

\expandafter\ifx\csname foo\endcsname\relax

이렇게 하면, 만약 \foo 가 \relax 랑 다르면 당연히 DEFINED 되어 있는 것이고, \relax 랑 같으면 UNDEFINED 이거나 있어봤자 \relax 랑 같은 상태인 것으로 판단하는 것은 대충 이해가 됩니다. 그런데 여기서

1. \ifx 가 control sequence 토큰을 비교할 때, foo 와 relax 라는 name 을 찾아서 각각의 정의를 비교하는데 아마도 토큰 리스트로서의 비교이겠죠?

2. 그런데 만약 정의되지 않은 cs 가 주어지면 \ifx 가 cs 를 찾아볼 때 name space 에서 찾을 때 없는 상태이므로 @undefined 라는 정의되지 않은 cs 와 비교할 때만 같은 토큰으로서 인정하는 것 같은데 맞나요?

3. 이런 식으로 이해하면 ltdirchk.dtx 에 나오는 

63: \ifx\@@input\@undefined\let\@@input\input\fi

이 줄에서 \@undefined 는 그냥 없는 cs 로 이해가 됩니다만 103 줄에서

103: \let\@currdir\@undefined

\@undefined 는 그냥 정의되지 않은 cs 인데 (name space 에도 없을 텐데) 어떻게 이것을 \@currdir 이라는 cs 에 \let equal 로 똑같이 옮기는 것인지 모르겠습니다.

이렇게 한 다음

\meaning\@currdir

해보면 undefined 라고 나옵니다. 그럼 저 줄은 뭘 하는 건가요?
 

KTUG 한국 텍 사용자 그룹