KTUGFaq

KTUG FAQ

"\long, \outer, \global, \gdef"에 댓글 더하기

로그인:
비밀번호:
가입
You display the wonderful traits of charm and courtesy.
FrontPage › LittleTree/ReadingTeXbook/2006-03
Mar 20, 2006
\long, \outer, \global, \gdef
Submitted by 작은나무 @ 03-20 [04:56 pm]

저는 TeX 디자이너나 TeXnician이 되고자 하는 마음은 눈꼽 만큼도 없지만, 가끔 plain.tex, lplain.tex과 같은 봐서는 안 될 파일들을 열어봅니다. 사실 저 같은 TeX 초보자들은 그 같은 파일들은 열어 볼 필요도 없고, 열 이유도 없지만, 그저 호기심에 열어봅니다. 하지만, 간단한 명령어(control sequence) 하나로 여러 다양한 기능을 하는 것을 보면, 그 원리가 궁금해지는 것도 사실입니다. 그래서 한 번 읽어는 보는데... 어렵습니다. 특히, 매크로 정의 할때 쓰이는 \def 앞에는 뭐가 그리도 많이 붙는지..., 예를들면, \long, \global, \outer 더구나 매크로 정의할때도 \def 외에 뭐가 그리도 많은지, \edef, \gdef, \xdef, \chardef, \csname, \let, ... 이 외에도 \expandafter, \noexpand ... 쩝. 그래서 하나씩 알아보기로 굳게 맘먹었습니다. \def는 대충 아니까...

205~206쪽: \def를 이용해서 매크로 정의를 할때, 실수로 괄호 '{'나 '}'를 빼먹거나 더해서, 여닫는 괄호가 매치가 안될 경우가 있습니다. 이 경우 그러한 \def로 정의된 명령어를 전개할 때, TeX이 충직해서 언제 이 놈의 정의가 어디서 끝나는지 몰라서 계속 처리한다면, 아마도 TeX은 입렵 파일의 끝을 보거나 아니면, 그 전에 TeX이 계속 입력되는 토큰을 받아들여 메모리가 부족해서 컴퓨터가 먹통이 될지도 모릅니다. :( 단순한 타이핑 에러로 그러한 사태까지 가면 안되죠. 단지 '{'나 '}' 하나 빼먹을 뿐인데요. 다행히 TeX은 그다지 충직한 편이 못되고 여우같은 면이 있어서, 이런 경우에 대비해서 나름대로의 규칙을 가지고 있습니다. 그 규칙은 \def의 argument에는 \par 토큰을 사용할 수 없다는 것입니다. 명시적으로 여러분이 "나 \par를 arguement에서도 사용하겠으니, 군소리 말고 하라는대로 하라"라고 말하지 않는 이상 말입니다. 그래서 TeX은 매크로를 전개해 나가다가 \par를 만나면, "runaway argument"라고 말하고, 하던 일을 그만둡니다. 똑똑합니다. :)

하지만, 매크로를 만들다보면, argement에 \par 토큰을 사용할 일이 있답니다. 그 경우 어쩌나요? 그때 사용하는 것이 바로 \def앞에 붙여주는 \long입니다. 마치 TeX한테 "네가 앞으로 전개할 명령어의 argument가 길 수도 있으니까, 게의치 말고, 그냥하라"라는 뜻인것 같습니다. (이것으로 하나 해치웠습니다. 위에서 언급한 정복해야 할 control sequence 목록에서 두 줄로 찍찍그어 \long은 지우세요. :) )

위에서 설명한 '\par-금지 법칙' 만으로는 좀 모자란 감이 있습니다. 오로지 계속 전개해 나가다가 \par이 나와야만 멈추니까 말입니다. 더 빨리 TeX으로 하여금 "너가 잘못된 명령어를 전개하고 있다"라고 알려주어야 할때가 있습니다. 주로 TeX이 하이 스피드로 토큰들을 처리해야 하는 경우가 그 때입니다. 이 경우에 TeX은 \par가 나올때 까지도 못기다립니다. 따라서 잘못된 명령어는 아니지만, 빠른 스피드를 요하는 곳에서는 이 명령어를 사용하지 말라는 의미로 \long 처럼 \def 앞에 붙이는 것으로 '\outer'가 있습니다. 즉 특정한 상황에서 TeX이 \outer가 앞에 붙은 명령어를 전개하려 한다면, TeX은 전개해 보지도 않고, 하던 일을 멈추고 불평을 해댑니다. 그렇다면, TeX이 매우 빠르게 처리해야하는 경우, 즉 \outer가 붙은 명령어가 쓰이면 안되는 경우가 어떤 경우 일까요?
  • argument 안에서
  • 어떤 매크로 정의의 parameter text 또는 replacement text 안에서
  • 표나 배열할때 사용하는 alignment의 preamble 안에서
  • 조건에 의해서 실행이 안될 수도 있는 조건문에서 (if... then ... else...)
만약 위와 같은 환경안에서 \outer가 붙은 명령어를 사용한다면 TeX은 "runaway" 상황이거나, "incomplete" 조건문이라고 불평하며, 하던 일을 관둡니다.

마지막 \global이 남았습니다. 컴퓨터 프로그래밍 관점으로 보면, 전역변수 설정하는 것이네요. 특정 그룹 안에서 정의된 매크로는 그 그룹안에서만 효력이 있고, 그 그룹 밖에서는 그 효력을 읽는데, 그룹 밖에서도 그 의미를 유지하려면 \def 앞에 \global 이라고 붙여주면 됩니다. 그리고 \gdef는 \global\def와 동일한 의미입니다. 지금까지 알아본 \long, \outer, \global은 모두 \def 앞에 붙는 접두사 같은데, 그 순서는 아무렇게나 와도 되고, 또한 같은 접두사가 하나 이상이 와도 됩니다. 예를들어,


\long\outer\global\long\def

위의 선언은 \outer\long\gdef와 같은 의미입니다.
이름:

서명하지 않기
 

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