> For the complete documentation index, see [llms.txt](https://overleaf-pro.ayaka.space/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://overleaf-pro.ayaka.space/latex/ko/in-depth-articles/01-a-new-series-of-articles-tex-tokens-and-related-concepts-but-why-and-how.md).

# 새 시리즈 문서: TeX 토큰과 관련 개념—그런데 왜(그리고 어떻게)?

이 소개 아티클은 이 시리즈가 왜 쓰이게 되었는지, 내가 무엇을 이루고자 하는지, 그리고 TeX 엔진의 내부 동작을 관찰하여 TeX 토큰을 탐구하는 데 사용된 기법들에 대한 배경 정보를 제공하는 것을 목표로 합니다. 이 아티클 페이지는 또한 시리즈의 모든 아티클로 연결되는 링크를 담도록 설계되었으며, 새 아티클이 प्रकाशित될 때마다 해당 링크를 제공하도록 업데이트될 예정입니다.

### 아티클 링크

각 아티클에는 이 시리즈의 다른 아티클들로 연결되는 링크 모음이 포함됩니다.

* [“TeX 토큰”이란 무엇인가?](/latex/ko/in-depth-articles/53-what-is-a-tex-token.md)
* [“TeX 토큰 리스트”란 무엇인가?](/latex/ko/in-depth-articles/54-what-is-a-tex-token-list.md)

## 이 아티클 시리즈의 배경

이 시리즈의 아티클들을 쓰게 된 동기는 TeX에 관한 자료를 읽는 과정에서 생겼다. 그 자료들은 TeX의 많은 동작을 “토큰”, TeX의 “토큰화 과정”, “토큰 리스트”, 그리고 “매크로 확장”이나 “확장 가능한 명령”과 같은 관련 개념을 통해 설명하고 있었다. TeX 관련 설명에서 “TeX 토큰”이라는 표현을 접할 때마다 같은 질문이 떠올랐다: 정확히 무엇이, *는* TeX 토큰인가? 알아내야 했다.

첫 번째 아티클의 범위와 내용은, [“TeX 토큰”이란 무엇인가?](/latex/ko/in-depth-articles/53-what-is-a-tex-token.md)그 본성상 프로그래머들이 말하듯 꽤 “하드웨어에 가까운” 내용이며, “TeX 토큰”이 꽤 난해한 주제라고 분류될 수 있다는 데는 의심의 여지가 없다: 그런데 왜 굳이 다루는가? 결국에는, 혹은 어쩌면 믿음의 도약을 통해, 다른 사람들도 같은 주제에 대해 고민해 왔을 수 있고 몇 편의 아티클로 빈틈을 메울 여지가 있다고 보는 것이다. 내 목표는 여러분이 읽고 있을 다른 자료를 보완할 수 있는 유용한 배경 설명을 제공하고, TeX를 배우고 매크로와 프로그래밍을 탐구하는 과정에서 등장하는 몇 가지 핵심 개념을 더 잘 이해하는 데 도움이 되기를 바라는 것이다.

분명히, 블로그 아티클이라는 제약 안에서는 우리는 표면만 훑을 수 있을 뿐이다—모든 핵심 주제를 설명하려 하거나 가장 탁한 물속까지 뛰어드는 것은 단순히 현실적이지 않다. 불가피하게 나는 상당한 양의 세부 사항을 건너뛰고, 과도한 단순화와 비유를 한계까지 밀어붙이는 것 사이의 미세한 경계선을 걸어야 할 것이다.

“자신이 읽고 싶었을 아티클을 써라”는 유용한 지침이며, 이 시리즈를 쓰면서 내가 열심히 적용하려고 노력한 원칙이기도 하다.

## 질문을 던졌으니, 이제 무엇을 할까?

당면한 과제는 분명했다: TeX 토큰에 대해 어떻게 알아낼 것인가? 토큰, 토크나이제이션 등의 세부 사항은 TeX 엔진의 소프트웨어 코드 깊숙이 묻혀 있기 때문이다—물론 그런 세부 사항에 실제로 관심이 있다면 예외는 아니다.

이 질문들에 대한 답을 살펴보는 한 가지 방법은 TeX의 원래 소스 코드를 [`tex.web`](https://www.ctan.org/tex-archive/systems/knuth/dist/tex)—실행함으로써 [WEAVE](http://tug.org/texinfohtml/web2c.html#weave-invocation) TeX 문서를 추출하거나, 책 한 권을 구입하는 방법으로 [Computers & Typesetting, Volume B: TeX: The Program](https://www.amazon.co.uk/Computers-Typesetting-TEX-Program-v/dp/0201134373). 나는 인쇄된 책을 한 권 샀다! TeX의 소스 코드가 책 형태로 출판되어 있다는 것은 분명 매우 도움이 되며, 물론 책 전반에 걸쳐 유용한 설명도 많이 있다. 그러나 Knuth의 TeX는 Pascal로 작성되었고, 자연스럽게 Pascal 소스 코드는 Knuth의 리터러트 프로그래밍 방법론으로 문서화되어 있다—코드를 작고, 한입 크기의 조각들로 제시하는 방식이다. Knuth의 문서화 접근법이 TeX처럼 복잡한 소프트웨어에 얼마나 큰 도움이 되는지는 쉽게 이해할 수 있지만, 이 책을 읽으려면 상당한 양의 상호 참조와 페이지 이동이 필요하다.

유용하긴 했지만, 그 책만으로는 TeX가 “토큰”을 생성하는 동안 실제로 무슨 일이 일어나는지—내가 특히 관심을 가졌던 주제다—더 잘 이해하기에는 충분하지 않았다. 진정으로 알아내는 방법은 하나뿐이다: TeX 프로그램을 빌드하고, 작은 TeX 파일에 실행한 뒤, TeX이 입력을 스캔하고 읽는 동안 코드가 실제로 실행되는 모습을 말 그대로 지켜보는 것이다. 소스에서 TeX를 빌드하는 세부 과정은 다소 난해한데—Pascal을 C로 변환하는 일—다음 섹션에 간단한 설명이 있고, 더 자세한 내용을 다룬 개인 블로그 글 링크도 함께 있다.

XeTeX와 LuaTeX는 UTF-8 형식의 텍스트를 처리할 수 있고 유니코드 텍스트 인코딩을 지원하는 반면, Knuth의 TeX는 8비트 엔진이어서 입력 문자가 0에서 255 범위에 있다고 가정한다. 이것은 중요한 차이이긴 하지만, *실질적으로* TeX 토큰에 대한 논의에는 영향을 주지 않는다. 왜냐하면 우리는 모든 TeX 엔진에 공통적인 주제와 원리를 다루고 있기 때문이다: 그것들은 소프트웨어의 바로 핵심에 있다.

## TeX 토큰은 어떻게 공부할 수 있는가?

입력 텍스트에서 TeX 토큰으로 가는 경로를 하나씩 풀어내는 일은, 나에게 꽤 긴 여정이었다—솔직히 말하자면, 그 과정 내내 다양한 정도의 혼란이 거의 상시적인 동반자였다: TeX는 정말 복잡한 소프트웨어이기 때문이다.

몇 년 동안(2009년경부터) 나는 루아TeX의 최신 버전을 그 소스 코드에서 정기적으로 컴파일해 왔는데—이 과정은 LuaTeX의 소스 코드 배포 방식이 매우 훌륭하기 때문에 아주 간단하다. 그 경험을 바탕으로, 나는 Knuth의 원래 TeX를 그 소스 코드에서 빌드하는 방법을 더 잘 이해하고 싶어졌다—a *매우* 다른 제안이었다. TeX는 Knuth의 리터러트 프로그래밍 방법론을 사용해 작성되었기 때문이다. Windows에서, 하지만 오픈 소스 컴파일러와 도구 모음을 사용해 수행한 그 개인용 TeX 빌드는 TeX Live 배포판 바깥에서 진행된 독립 프로젝트였다. 또한 `tex.web` 을 C 프로그램으로 변환하는 데 필요한 툴체인을 구축해야 했고, 그런 다음 디버거에서 컴파일하고 실행하여 입력 문자를 처리할 때 TeX가 실제로 무엇을 하는지 볼 수 있게 해야 했다.

Knuth의 원래 TeX는 pdfTeX, XeTeX 또는 LuaTeX 대신 사용되었는데, 그 이유는 책 TeX: The Program에 인쇄된 소스 코드와 가장 가까운 TeX 버전이 필요했기 때문이다. 그 책은 1986년에 처음 출판되었고, 그 이후 TeX가 몇 차례 업데이트를 거쳤지만, 최신 TeX 버전(3.14159265, 2014년 1월 릴리스됨)은 분명 책에 포함된 소스 코드와 충분히 가깝다.

Knuth의 리터러트 프로그래밍 방법론을 반영하여, TeX의 소스 코드는 WEB이라는 텍스트 형식으로 배포된다. 이는 TeX 문서와 Pascal 소스 코드가 섞인 형태다. 기본 아이디어는 TANGLE과 WEAVE라는 두 유틸리티를 사용하여 WEB 파일을 처리하고, TeX 문서 또는 Pascal 소스 코드를 추출하는 것이다:

* [TANGLE](http://tug.org/texinfohtml/web2c.html#tangle-invocation) WEB 파일에서 Pascal 소스 코드를 추출한다
* [WEAVE](http://tug.org/texinfohtml/web2c.html#weave-invocation) WEB 파일에서 TeX 문서를 추출한다

그러나 Pascal 소스 코드를 추출하기 전에 Knuth의 `tex.web` 파일을 전처리하여 TeX의 Pascal 코드를 Web2C라는 과정을 통해 C 코드로 변환할 수 있게 하는 여러 변경 사항을 적용해야 한다. 이 전처리 단계는 *변경 파일을 적용하는 것*.

Knuth의 원본 코드 파일(tex.web)은 어떤 식으로도 직접 수정해서는 안 된다. 대신, 메인 `.ch`파일에 적용하고 싶은 변경 사항이 들어 있는 이른바 변경 파일(확장자 `.web` 예를 들어 `tex.web`)을 사용해 수정 사항을 적용한다. 변경 파일은 TIE라는 추가 유틸리티 프로그램을 사용하여 Knuth의 원본 소스 코드와 병합되어, 예를 들어 `mytex.web` 라는 파일을 만들고, 그 파일을 TANGLE로 처리하여 Pascal 코드를 `mytex.pas`로 추출한다. 적절한 Pascal 소스 파일을 확보하면 Web2C 과정의 마지막 단계들을 적용해 C 소스 코드 파일로 변환하고, 이를 컴파일하여 실행 가능한 TeX 프로그램을 만들 수 있다. 다소 복잡한 Web2C 변환 과정을 읽어보고 싶다면 이 저자의 [개인 블로그 사이트](http://www.readytext.co.uk/?p=2529).

그 결과물은 무료이면서 훌륭한 [Eclipse IDE for C/C++](http://www.eclipse.org/home/index.php) 를 사용해 TeX의 소스 코드(C)를 한 줄씩 실행하며 입력을 스캔할 때 어떤 일이 벌어지는지 볼 수 있는 TeX 프로그램이다. 이것은 결코 가장 재미있는 오락은 아닌데, C 코드는 기계 생성 코드이고 곳곳에서 따라가기가 극도로 어렵기 때문이다(TeX의 소스 코드는 GOTO와 전역 변수를 매우 넉넉하게 사용한다). 책 TeX: The Program은 여전히 C 소스 코드를 따라가는 데 없어서는 안 될 도움을 주는데, 비록 그 책에 TeX의 소스 코드가 아름답게 조판된 Pascal 코드로 담겨 있더라도 그렇다.

논의를 마무리하자면, Eclipse IDE를 통해 TeX가 실행되는 모습을 보여주는 예시 스크린샷이 있다. 실행은 함수 `getnext()`에서 일시 중지되어 있으며, 이는 TeX의 토큰 생성 과정의 핵심에 있다.

![Eclipse IDE를 통해 TeX가 실행되는 모습을 보여주는 스크린샷](/files/ad769520fb1285051a1370c73db6b74bcb1d19cf)

오픈 소스 Eclipse IDE for C/C++를 사용하여 TeX의 C 소스 코드를 한 단계씩 따라가는 모습.

## 결론 및 감사의 말

첫 번째 아티클을 쓰고 시리즈의 향후 블로그 게시물에 대한 아이디어를 정리하는 일은 확실히 꽤 많은 시간이 들었다. 이 시리즈의 아이디어를 지지해 주고 추가 배경 조사를 위해 필요한 시간을 할애할 수 있도록 허락해 준 Overleaf의 John Hammersley와 Mary Anne Baynes에게 깊이 감사드린다. 이 시리즈의 아티클들이 공통의 관심사인 주제들을 성공적으로 식별하고 다루며, 읽는 이들에게 가치 있게 여겨지기를 바란다.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://overleaf-pro.ayaka.space/latex/ko/in-depth-articles/01-a-new-series-of-articles-tex-tokens-and-related-concepts-but-why-and-how.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
