KTUGFaq

KTUG FAQ

로그인:
비밀번호:
가입
There is no fear in love; but perfect love casteth out fear.
FrontPage › 작은나무/2006-05
May 31, 2006
줄바꿈 파라미터 테스트
Submitted by 작은나무 @ 05-31 [06:04 pm]
줄바꿈 알고리즘에 소개된 여러가지 파라미터들을 테스트하기 위해서 작성함.
  • \parindent, \parfillskip, \hangindent, \hangafter, \prevgraf

@par.pdf (42.81 KB) @par.tar.gz (20.72 KB)


오늘... 투표했습니다. :) -- 작은나무 2006-05-31 18:07:55

May 29, 2006

May 27, 2006
곱셈표(구구단)
Submitted by 작은나무 @ 05-27 [09:09 am]
기존 LittleTree/ReadingTeXbook/2006-05 에 있던 내용인데, 줄바꿈 알고리즘과 관계없는 글을 여기로 옮깁니다

중첩된(nested) \loop ... \repeat 를 사용하지 않고, 꼬리재귀기법만을 사용한 구구단입니다. (\loop 자체도 알고보면 재귀기법을 이용해서 구현한 매크로 입니다.)
\newcount\rcnt\newcount\ccnt\newcount\tnum \newcount\mrow\newcount\mcol \mrow9 \mcol9 \def\rows{\global\advance\rcnt1 \global\ccnt0 \cols\ifnum\rcnt=\mrow\swor \fi\rs\rows} \def\swor#1\rows{\fi\crcr} \def\cols{\global\advance\ccnt1 \tnum\rcnt \multiply\tnum\ccnt \the\tnum \ifnum\ccnt=\mcol\sloc\fi\cs\cols} \def\sloc#1\cols{\fi} \def\rs{\cr}\def\cs{&} $$ \vbox{\halign{&\ \hfil#\hfil\strut\cr\rows}} $$
결과




출처: Syntactic Sugar, Kees van der Laan, TUG93. TUGboat 14, 3, 310--318.

감동코드
Submitted by 작은나무 @ 05-27 [09:08 am]
기존 LittleTree/ReadingTeXbook/2006-05 에 있던 내용인데, 줄바꿈 알고리즘과 관계없는 글을 여기로 옮깁니다

알파벳 모음을 굵은 글꼴로 바꾸는 매크로 입니다. "\fifo Audacious\ofif" 라고 하면, 그 결과로
를 출력하는 매크로입니다.

소스는 다음과 같습니다.
\def\fifo#1{\ifx\ofif#1\ofif\fi\process#1\fifo} \def\ofif#1\fifo{\fi} \def\loc#1#2{%locate #1 in #2 \def\locate##1#1##2\end{\ifx\empty##2% \empty\foundfalse\else\foundtrue\fi}% \locate#2.#1\end} \newif\iffound \def\process#1{\uppercase{\loc#1}{AEIOU}\iffound{\bf#1}\else#1\fi}
"\fifo...\ofif"를 구현한 아이디어도 그렇지만, 특히, "\locate"의 아이디어는 참으로 참신하며 아름답게 보이기까지 합니다. 문학, 음악, 미술 같은 예술 작품에서 느끼는 아름다움과 다를 바가 없어보입니다(적어도 작은나무에게는). 같은 맥락으로 크누스 할아버지도 어셈블리 코드를 보고 무한히 아름답다고 느낀 적이 있다고 한 글을 어디선가 본적이 있습니다.

프로그램의 소스도 행간의 의미를 이해하면, 문학 작품처럼 충분히 아름다울 수 있습니다. 알고 있었습니다만, 새삼 느끼게됩니다. :)

Tough exercise
Submitted by 작은나무 @ 05-27 [09:05 am]
기존 LittleTree/ReadingTeXbook/2006-05 에 있던 내용인데, 줄바꿈 알고리즘과 관계없는 글을 여기로 옮깁니다.

최근에 매우 흥미로운 페이퍼를 발견했습니다. 그래서 그것때문에 텍북읽기를 잠깐동안 중단했습니다. 중단할 충분한 이유가 있는 페이퍼입니다.

FIFO and LIFO sing the BLUes, Kees van der Laan, MAPS 92.2 (revision March 1996)

주로 리스트 처리에 대한 테크닉(TeXnique) 내용을 담고 있는 페이퍼입니다. 여기서의 리스트 처리 기법(테크닉)이라 함은 별것아닙니다. 우리가 이미 알고 있는 "꼬리재귀기법"이라고 생각하시면 됩니다. 꼬리재귀기법이 하는 일이 주어진 인자에서 그 인자를 구성하는 토큰들을 하나하나씩 처리하는 것이었습니다. 여기서 인자를 리스트라고 하고, 토큰 각각을 리스트 요소(list element)라고 생각하면 됩니다.

페이퍼의 제목에 나와있는 "FIFO"라 함은 "First In First Out"의 약자입니다. 우리말로 하자면, 먼저 들어온 놈을 먼저 내보낸다는 뜻입니다. 즉 어떤 매크로와 그의 인자로 리스트가 주어졌을때, 리스트의 요소들이 차례로 매크로에 적용된다는 것입니다. 예를들어, \foo abc\oof가 있을때, 만약 \foo가 FIFO의 꼬리재귀기법으로 구현된 매크로라면, 그 매크로의 뜻은 다음과 같습니다.
\foo a \foo b \foo c
다시 한 번 설명하자면, 매크로 \foo에 'abc'라는 리스트가 입력 스트림(stream)으로 들어오면 \foo는 들어오는 순서대로 처리하여 내보낸다는 의미입니다. 쉬운 내용일지도 모르는데, 작은나무가 너무 장황하게 설명하는 것은 아닌가 모르겠습니다. :(

그렇다면, 페이퍼 제목에 나와있는 다른 이상한 단어 "LIFO"는 무슨 뜻일까요? FIFO를 힌트삼아 생각해보세요. :) 그렇죠. 바로 "Last In First Out"의 약자입니다. LIFO를 적용하면 \foo abc\oof는 다음과 같이 됩니다.
\foo c \foo b \foo a
이제 어휘와 개념에 대한 기본지식은 모두 갖추었습니다. 본격적으로 시작하겠습니다. 작은나무가 이 페이퍼에 매료된 것은 기존의 알고있던 꼬리재귀기법이 너무도 엘레강스하고 효율적으로 구현되고 있기 때문입니다. 이 페이퍼에서 말하는 FIFO가 적용된 꼬리재귀기법은 다음과 같습니다.
\def\fifo#1{\ifx\ofif#1\ofif\fi \process#1\fifo} \def\ofif#1\fifo{\fi}
우리가 기존에 알고있던 꼬리재귀기법과 정확히 동일한 일을 합니다. 오히려 "\let\next=\foo"이런 식의 할당문(assignment statement)이 필요없습니다. 이 방법이 기존의 방법보다 간단하면서 효율적이라고 합니다. 그리고 이 \fifo의 응용으로 단어들을 처리하는 방법은 어떻게 하면 될까요? 이전에 작은나무가 작성한 TeX 매크로 작성 기법이라는 글을 보면, 꼬리재귀기법과 동일하고 스페이스만으로 구분했던 것을 알수 있습니다. 마찬가지로 여기서도 스페이스를 구분자(delimeter)로 사용하면 됩니다. 다음과 같습니다.
\def\fifow#1 {\ifx\wofif#1\wofif\fi \processw{#1}\ \fifow} \def\wofif#1\fifow{\fi}
기존의 방법보다 단순 명료합니다. 위 두개의 매크로에서 \process, \processw만 하고자 하는 일의 목적에 맞게 구현해 주면 됩니다. 쉽고 간단합니다. :))

그러면 위의 두개의 매크로를 가지고 텍북 67페이지의 연습문제11.5가 얼마나 쉽게 해결되는지 보겠습니다. 그 연습문제를 약간 간략화 하면, 다음과 같습니다. \demobox라는 매크로를 정하는데,
\demobox{Tough exercise}
라고 하면 다음과 같은 결과를 얻는 매크로입니다.




잘 살펴보시면, 우선 단어별로 처리하고, 그 다음에 각 단어의 글자마다 박스만 그려주면 되는 것입니다. 따라서 위의 두개의 매크로 \fifo...\ofif 와 \fifow...\wofif 가 사용되는 것입니다. 이제 \process와 \processw만 정의하면 해결되는데, 이또한 쉬워서 각 글자를 처리하는 \process가 할 일은 그 글자를 둘러싸는 박스를 그리는 일이고, \processw가 할 일은 주어진 인자에서 단어마다 \fifo#1\ofif를 호출하면 됩니다. 즉, 각 단어마다 박스를 그리는 매크로를 호출하면 되는 것입니다. !!!

소스는 다음과 같습니다. (DohyunKim님이 지적해주신 것과 제시해 주신 해결책으로 소스를 일부 수정하였습니다.)
\def\fifo#1{\ifx\ofif#1\ofif\fi \process#1\fifo} \def\ofif#1\fifo{\fi} \def\fifow#1 {\ifx\wofif#1\wofif\fi \processw{#1}\ \fifow} \def\wofif#1\fifow{\fi} \def\processw#1{\fifo#1\ofif} \def\process#1{\boxit#1} \def\boxit#1{\setbox0=\hbox{#1}% \hbox{\lower\dp0% \vbox{\offinterlineskip\hrule \hbox{\vrule\phantom#1\vrule}\hrule}% }% } \def\demobox#1{\leavevmode\fifow #1 \wofif \unskip{} } \demobox{Tough exercise}
문제를 원래의 문제에서 약간 간략화 하긴 했지만, Knuth가 제시한 원래 해답보다 많이 간단해 진것을 확인하실 수 있을 것입니다.

마지막으로 LIFO를 적용한 매크로 \lifo...\ofil는 어떻게 구현하면 될까요? 한 번 해보세요. 힌트: \fifo...\ofif 를 조금만 바꾸면 됩니다. \process를 언제 실행하느냐가 문제입니다.

\demobox{Tough exercise}abcde. 했을 때 trace해보면
\fifow #1 ->\ifx \wofif #1\wofif \fi \processw {#1}\ \fifow 
#1<-\wofif \unskip .~abcde.
\demobox의 인자 바깥의 것도 물고 들어갑니다. 이것이 의도한 바인지요? -- DohyunKim 2006-05-10 11:42:22

그럴리가 있겠습니까?

논문에 주어진 매크로로 \demobox를 만들려다보니 의도하지 않게, 그렇게 된것 같습니다. 한 수 가르침을 주십시요.

  1. \demobox를 어떻게 정의하면 바로잡을 수 있는가? (어디가 어떻게 잘못된 것인가?)
  2. 텍소스는 어떻게 디버깅하는가? (gdb를 이용하듯한 방법이 있는것인가?, 위에 trace는 어떤 방법으로 한 것인가?)

지적해 주셔서 감사합니다. 그리고 관심을 가지고 읽어주셔서 더욱 감사합니다. -- 작은나무 2006-05-10 14:08:31

아, \tracingmacros라는 프리미티브가 있군요. 두번째 질문은 없던걸로 해주세요. 혹은 텍 디버깅하는 애용하는 방법이 있으면 알려주시면 더욱 감사하겠습니다. :) -- 작은나무 2006-05-10 14:25:30

두번째 질문은 자답하셨고^^ (TeX by Topic에도 한 챕터가 할애돼 있습니다. 애용하는 방법은 따로 없고 대개 귀찮으니까 \tracingall 합니다.)

첫번째는 저도 좀 고민했는데 다음과 같이 하면 어떨까 합니다.
\def\demobox#1{\leavevmode\fifow #1 \wofif \unskip{} }
스페이스를 넣어주는 거죠. 그냥은 안 들어가니까 {}로 경계를 갈랐습니다. -- DohyunKim 2006-05-10 15:48:05

그런데 LIFO 숙제 어렵네요. 힌트를 좀만 더 주시죠... -.-;; -- DohyunKim 2006-05-10 15:50:18

인자를 두 개 취해서 #2 lifo 재귀처리하고 그 다음에 process#1하면 될까요? 힌트 주세요... 두번째 인자가 없으면.... ? -- Karnes 2006-05-10 16:07:00

스페이스를 딜리미터로 하면 되는구나. (당연하지. 이 바보야... 이 쉬운것을...쩝. 나는 왜이러지... :( 자책이었습니다.) 감사합니다. :)

역시 KTUG의 초절정 고수님들이라 조금씩 조금씩 정답에 접근해 가시는군요. 저는 이미 이 페이퍼를 봐서 저자가 제시하는 해법을 알아버려린 것이 후회됩니다.

네, 그렇습니다. 인자를 두 개를 취하는 형태로 하고, 즉 일단 다음과 같이 처리하고,
\def\lifo#1#2\ofil{
...
그러면, 자연스럽게 나오는 질문인 "#2가 없으면 어떻게 하나?" 이것은 플레인텍에서 제공하는 매크로 (혹은 우리들이 직접 만들수 있는) \empty를 사용하는 것입니다. 다음과 같이.
\def\lifo#1#2\ofil{\ifx\empty#2\empty\ofil\fi
  ...
이 다음에는 \lifo...\ofil를 호출하고, 마지막으로 \process#1를 처리하는 것입니다. 정답이 아닌 힌트를 달라고 하셨으니, 여기까지입니다. :) 저자가 제시하는 해답을 알려드릴 수도 있으나, 관심이 있으시면, 더 해보셔서 해답을 얻으시는 것도 재미있을 것 같습니다. 아니면, 이 페이퍼가 인터넷에 널려있으니 다운받아서 확인해 보실 수도 있겠습니다. :)

감사합니다. -- 작은나무 2006-05-10 16:41:23

Loop TeXnique의 진화
Submitted by 작은나무 @ 05-27 [09:03 am]
기존 LittleTree/ReadingTeXbook/2006-05 에 있던 내용인데, 줄바꿈 알고리즘과 관계없는 글을 여기로 옮깁니다.

다음의 세 가지 방법을 음미해 보시길......

  1. Knuth의 TeXnique
    \def\loop#l\repeat{\def\body{#l}\iterate} \def\iterate{\body\let\next=\iterate\else\let\next=\relax\fi\next}
  2. Kabelschacht의 TeXnique
    \def\loop#l\repeat{\def\body{#l}\iterate} \def\iterate{\body\expandafter\iterate\else\fi}
  3. Kees van der Laan의 TeXnique
    \def\loop#l\repeat{\def\body{#l}\iterate} \def\iterate{\body\else\etareti\fi\iterate} \def\etareti#1\iterate{\fi}

May 26, 2006
Inversions by Scott Kim
Submitted by 작은나무 @ 05-26 [12:51 am]
Progress님의 [http]한글 조형 연구를 보고, 문득 Scott Kim의 Inversion이 문득 생각나서 적어본다. Scott Kim은 과학 소설로 유명한 아이작 아시모프가 "알파벳의 에셔(Escher of the alphabet)"라고 칭한 인물이기도 하다.

아래 그림을 뒤집어서 한 번 읽어보라. 원본과 똑같다.

inversionsbyscottkim.gif


An inversion is a word or name written so it reads in more than one way. For instance, the word Inversions above is my name upside down. Douglas Hofstadter coined ambigram as the generic word for inversions. I drew my first inversion in 1975 in an art class, wrote a book called Inversions in 1981, and am now doing animated inversions.

"Teach and Learn"의 Inversion

teach4.gif


[http]Inversion: 위의 그림말고도 매우 기발하고 놀라운 inversion이 많다.

신기해라... 진짜 에셔라고 밖에 할 수 없네요. -- Progress 2006-05-26 10:57:18

The Advanced TeXbook 도착
Submitted by 작은나무 @ 05-25 [11:59 am]
한 2주전에 신청한 "The Advanced TeXbook"을 오늘 아마존으로 부터 받았다.

책이 참으로 맘에 든다. 내용도 그렇거니와 책 구성도 아주 맘에 든다. 그리고 저자가 의도적으로 그랬는지 모르겠는데, Knuth의 TeXbook과 포멧이 유사한 부분이 곳곳에 있다. 특히 각 장이 끝날 때마다 나오는 각종 인용구의 포멧은 똑같다. 마치 TeXbook Vol2.를 보는 듯한 착각에 빠질 정도다.

한동안 심심하지 않을 것 같다. :)

언제 시간나면 책표지라도 구경시켜주세요 :) -- hermian 2006-05-25 12:27:59

이 책의 colophon 시작부를 옮겨보면,
This book was typeset with TeX (of course), using Textures on the Macintosh
computer. The diagrams were done with Superpaint, a simple drawing program, 
also on the Macintosh. ......
-- 작은나무 2006-05-25 13:08:26

May 24, 2006
춤추는 링크 와 수도쿠 ???
Submitted by 작은나무 @ 05-24 [11:01 am]
할 일이 하나 생겼다. 그것도 아주 재미있는 일로. [http]Dancing Links

일단 요놈을 [http]Knuth's paper 읽어보자.

ChoF님 감사합니다.

May 23, 2006
만약 당신이 분노로 떨 수 있다면
Submitted by 작은나무 @ 05-23 [11:23 am]
ㅠ.ㅠ

@che.pdf (38.92 KB)

ShowMeTheSource 소스도 한번 올려주세요. PlainTeX로는 어캐 한글을 사용하는지 구경 좀하게요. textech1 소스도요. 오늘 볼 수 있겠네요. :) -- hermian 2006-05-23 12:37:38

소스는 안보시는게 정신 건강에 좋을 것입니다. 왜냐하면, 레이텍에 익숙하시다면 소스를 보시고 당연히 드는 생각이, "레이텍으로 하면 그냥 될 것을 왜 이렇게 한심한 짓을 할까?" 하실 것이 분명하기 때문입니다. :) 저는 평소에 문서 만들 일이 없어서 레이텍 사용에 익숙치 않아서 그냥 플레인텍을 사용합니다. 하지만, 최근에 레이텍을 배우려고 노력하고 있습니다.

플레인텍에서의 한글 사용이 궁금하시다면, 그냥 입력 파일 맨 처음에 "\input ucsplain" 이라고 하시면 끝입니다. 나머지는 다 같습니다. 그래도 정 소스를 보고 싶으시다면, 메일로 보내드리겠습니다. 제 개인 생각에는 비록 개인 블로그이지만, 추천하지 않는 플레인텍으로 작성된 한글 소스 파일을 올려서는 안될 것 같습니다. 디렉터님께서 별로 좋아하지 않으실 것 같습니다. :) -- 작은나무 2006-05-23 14:07:28

아아... KDE 새 버전이 말썽을 부려서 (Xft랑 안 붙어요 :( ) 승질부리고 있는 저를 왜... 소스는 공개하셔야 함다. ^^ -- Karnes 2006-05-23 14:35:18

왜 레이텍 놔두고 이런 짓을 하냐고 흉보지 마십시요. @che.tex (1.24 KB) -- 작은나무 2006-05-23 15:07:11

hermian님께서 요청하신 "TeX 매크로 작성기법" 소스입니다. @textech.zip (12.55 KB) -- 작은나무 2006-05-27 09:43:14

May 20, 2006
현욱
Submitted by 작은나무 @ 05-20 [12:53 pm]
이제 백일이 된지 얼마 안되는 아늘 녀석입니다. 아빠 얼굴을 보고 놀랬는지, 사진기를 보고 놀랬는지, 뭐에 놀랐는지는 모르겠습니다. :)

myson1.jpg

INTP
Submitted by 작은나무 @ 05-20 [12:17 pm]
몇년전에 회사에서 MBTI 성격테스트를 한적이 있었다. 작은나무는 INTP. 그때는 MBTI가 뭔지도 관심없었고, 그냥 회사에서 하라니까, 어쩔 수 없이 하긴 했는데... 아무튼 잊고지내다가 우연히 노스모크 위키페이지에 갔다가 INTP 형의 성격적 행동적 특징을 알 수 있었다. :) http://no-smok.net/nsmk/INTP

나는 내가 왜 그런 승질(?)을 갖고 있나 했더니, INTP형이 보이는 행동이 다음과 같다고 한다.
  • 어지러운 책상; 물건들을 모은다
  • 비계획적; 약속을 잊는다
  • 관심사가 이리 저리 바뀐다
  • 관심사가 바뀌어서 프로젝트를 끝맺지 못한다.
  • 의사결정에 애를 먹는다
틀린거 하나도 없다. 다시 생각해보니, 그때 테스트 받을 때, 강사님이 했던 말이 생각난다. 대충 이랬다. 많은 사람들이 MBTI의 여러가지 유형들 중에서 몇가지 특성을 동시에 가질 수 있는데, 나는 골수 INTP라고 했다. 나온 점수나 분포가 너무나 그 쪽으로 치우쳐있다는 것이다. :(

위의 행동 특성가운데 한가지 억울한게 있다. "약속을 잊는다" 그렇지 않다. 나는 약속을 잊지도 어기지도 않는다.

그리고 INTP 사람들이 유별나다 보니까, 쓸데 없는 짓을 다한다. 이런 웹페이지는 도대체 왜 만든거지? [http]intp.org 분명히 INTP가 아닌 다른 사람이 만들었을 것이다. 왜냐하면, INTP인 내 기준으로 보면, 만들기도 귀찮고, 쓸데 없어 보이기 때문이다.

저도 INTP입니다 (반갑습니다). 기억하기로는, 제 경우, 극도의 I성향을 보였고 N과 S는 비슷했던 것 같습니다. "어지러운 책상"은 P성향 때문일텐데요... 지난 공주모임때 제 책상이 공개된 적이 있었지요. 그 때 어지러운 책상 --- 치운다고 치운 것입니다. ^^ -- IsCho 2006-05-20 13:28:14

반갑습니다. :) 제가 아내에게 가장 많이 듣는 말은 "여보, 책상 좀 깨끗이 치우세요"라는 말입니다. 저는 아내에게 "사랑해요"라는 말을 가장 많이 하는데 말입니다. :) 참고로 제 아내의 유형은 ESTJ로, 저와 T(Thiking)만 같고, 다 다릅니다. 그렇게 성격이 서로 다른데, 어떻게 그런대로 서로 사랑하며 살아가고 있는지 모르겠습니다. :) ESTJ는 관리자형 타입이라고 하네요. 집안의 모든 중요한 결정은 제 아내가 한답니다. :( -- 작은나무 2006-05-20 21:06:37

어라? 이게뭐지?
Submitted by 작은나무 @ 05-20 [10:57 am]
달력의 오늘날짜를 눌렀더니, 이런게 생기네?

테스트, 테스트, 마이크 테스트입니다. 하나 둘 셋...

010101...

요즘 들어 새삼 느끼는 것인데, "위키" 참 괜찮은 것 같다. 만들기도 잘 만들었지만, 아이디어가 참 좋다. 도대체 누가 이런 멋진 생각을 했을까?