> 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/more-topics/19-how-tex-macros-actually-work-part-1.md).

# TeX 매크로는 실제로 어떻게 작동하는가: 1부

[1부](/latex/ko/more-topics/19-how-tex-macros-actually-work-part-1.md) [2부](/latex/ko/more-topics/20-how-tex-macros-actually-work-part-2.md) [3부](/latex/ko/more-topics/21-how-tex-macros-actually-work-part-3.md) [4부](/latex/ko/more-topics/22-how-tex-macros-actually-work-part-4.md) [5부](/latex/ko/more-topics/23-how-tex-macros-actually-work-part-5.md) [6부](/latex/ko/more-topics/24-how-tex-macros-actually-work-part-6.md)

## 서론: 이 시리즈의 목표

이 글 시리즈의 야심 찬 목표는 다음을 설명하는 것이다: *어떻게* TeX 매크로(예: LaTeX 명령)가 실제로 어떻게 작동하는지—가장 근본적인 수준에서, 실제 TeX 엔진 소프트웨어 내부에서—를 설명하려는 것이다. …에 의존하는 대신 *오로지* TeX의 다양한 기능, 경계 사례 및 동작을 보여 주도록 설계된 예제 매크로 모음에만 의존하는 대신, TeX 자체 내부를 들여다보며 *어떻게* 및 *왜일까요* 그 매크로 프로그래밍 방식이 왜 그런 식으로 작동하는지 살펴볼 것이다.

우리의 목표를 이루려면 먼저 꽤 낮은 수준의 주제부터 논의해야 하며, 처음에는 그것들이 문서를 조판하는 작업과는 다소 동떨어져 보일 수도 있다. 하지만 더 깊이 파고들고 나면, 결국 더 나은 이해를 쌓을 수 있는 기반을 얻게 될 것이고, 이는 결국 많은 시간을 절약해 주며 어쩌면 답답함도 줄여 줄 것이다.

### TeX 프로그래밍 언어: 이런 느낌, 아시나요?

TeX 프로그래밍 언어를 다소 난해하다고 묘사하는 것은 지나치게 가혹한 일은 아니다. 적어도 오늘날 널리 쓰이는 대부분의 주류 프로그래밍 언어의 기준으로 보면 그렇다. 특히 비범한 매크로를 작성하고 싶다면 TeX/LaTeX를 더 배우는 여정을 시작하면서 카테고리 코드, 토큰/토큰화, 그리고 명령이나 매크로의 “확장” 같은 개념을 금세 마주치게 된다. 이런 개념의 홍수는 꽤 낯설어서, 당황스럽게 느껴지고 때로는 TeX/LaTeX의 거의 뚫을 수 없는 오류 메시지들이 성공으로 가는 길을 제대로 도와주지 못해 약간 답답함을 느끼게 할 수도 있다.

## 그렇다면 어디서 시작할까? 카테고리 코드부터다.

TeX 엔진은 다음과 같은 소프트웨어 범주에 속한다 [컴파일러](https://en.wikipedia.org/wiki/Compiler): 즉, 다음으로 작성된 파일을 입력으로 받는 프로그램 *소스* 언어를 받아 *컴파일하여* (변환하여) 다음으로 작성된 출력 파일로 만든다 *대상* 언어이다. 더 구체적으로 말하면, TeX는 *문서 컴파일러*. TeX 엔진(컴파일러)의 경우 입력 파일은 TeX 조판 언어로 작성되며, 대상은 다음과 같은 다른 “언어”로 작성된 출력 파일이다 [DVI](https://en.wikipedia.org/wiki/Device_independent_file_format) 또는 PDF이다. 다만 여기서 “언어”라는 개념은 조금 느슨하게 쓰고 있다.

TeX 파일을 작성하는 데 쓰인 소스, 즉 입력 “언어”를 좀 더 자세히 살펴보자. 하나의 `.tex` 파일은 결국 문자(줄바꿈 문자 포함)의 하나의 긴 연속이다. 조판될 텍스트가 `\`, `}`, `$`, `[` 그리고 거의 무한에 가까운 다양한 조합으로 나타날 수 있는 온갖 문자들이 섞여 있다. TeX/LaTeX를 사용하지 않는 사람은 전형적인 `.tex` 파일을 보고 눈에 보이는 파일 구조가 거의 없거나 아예 없는 꽤 혼란스러운 문자들의 뒤섞임으로 여겨도 무방하다. LaTeX 매크로 패키지는 .tex 입력 파일에 어느 정도의 기본 구조를 “부여”하는 데 분명 일정 부분 기여한다. 그러나 `\begin{document}` 및 `\end{document}` 그 안에 무엇을 넣을지는 문서 작성자에게 달려 있다. 만약 다음을 살펴보면 `.tex` Knuth의 원래 Plain TeX 매크로 패키지를 사용해 작성된 파일들에서는 문서 구조가 거의 완전히 없다는 것을 알 수 있다.

따라서 일반적으로 TeX 입력 파일은 꽤 비구조적으로 보일 수 있다. 즉, 조판될 내용이 그 조판을 안내하는 지시(명령)와 뒤섞여 있는, 겉보기에는 임의적인 혼합물처럼 보인다. TeX가 전형적인 `.tex` 입력 파일을 어떻게 이해하여, 들어오는 뒤죽박죽한 문자들을 조판 엔진이 실행할 수 있는 지시와 조판할 내용으로 걸러낼 수 있을까?

### 뒤죽박죽한 문자들 걸러내기: 카테고리 코드에 인사하세요

TeX에 대해 전혀 모르는 사람이라면, 하나의 `.tex` 파일을 보고 다음과 같은 특정 문자를 알아볼 수 있다 `$` 그리고 그것이 통화 기호임을 알거나, 또는 `&` 를 보고 앰퍼샌드로 식별할 수 있다. 그 관찰자는 각 문자에 대해 *의미를* 해당 문자가 인간 의사소통에서 수행하는 역할에 기반한 의미를 추론한다. 또한 다음과 같은 문자를 보고 `하나의`, `e`, `또는` 와 같은 문자는 모음으로 분류된다는 것을 알며, 반면 `b`, `c` 또는 `d` 와 같은 문자는 자음으로 분류된다는 것을 안다. 인간으로서 우리는 일종의 내장된 조회표(기억 속)를 가지고 있어서, 우리가 보는 각 문자에 의미를 부여한다. 즉, 우리가 의사소통할 수 있는 언어에서 그 문자가 수행하는 역할에 기반한 의미다.

하나의 `.tex` 파일을 처리하려면 TeX 소프트웨어도 입력 안의 모든 문자를 살펴봐야 하며, 또한 각 문자에 *의미를* 그것이 “보는” 문자 하나하나마다 의미를 부여해야 한다. 그러나 TeX는 입력 파일에 저장된 정수(문자 코드)들의 연속으로 이루어진 텍스트를 처리하는 소프트웨어 기반의 기계일 뿐이다. 기계로서 TeX는 자신이 “보고 있는” 문자의 의미를 어떻게 판별하고, 이어서 그것을 어떻게 처리해야 하는지를 알려 주는 관련 데이터로 프로그래밍되어 있어야 한다. TeX는 이를 어떻게 달성할까?

답은 TeX에서만 나오는 개념 중 하나인 *카테고리 코드,* 이다. 이는 0부터 15까지 총 16개가 있다. TeX의 관점에서, TeX가 어떤 `.tex` 파일 안에서 보게 될 것으로 기대하는 모든 문자는 이른바 *범주 코드* 미리 할당되어 있다. TeX 소프트웨어 내부에는 카테 *현재* 입력 .tex 파일에서 TeX가 볼 수 있을지도 모르는 각 문자에 할당된 값을 나열하는 일종의 “조회표”가 있다. TeX의 카테고리 코드는 각 문자를 *의미를* TeX가 검사(스캔)해야 하는 입력 흐름 안의 개별 문자마다 부여하는 것으로 생각하면 된다.

문서를 조판하려면 TeX 엔진은 모든 문자를 읽어야(스캔해야) 하지만 TeX가 즉시 관심을 두는 것은 실제 문자(문자 코드)가 아니다. 문자의 *범주 코드* 카테고리 코드는 입력을 스캔할 때 더 중요하다. 문자의 *현재* 카테고리 코드는 다음을 결정한다 *현재의 의미* 그 문자의 *TeX가 그것을 읽어 들일 때의*: 그 카테고리 코드는 TeX가 각 문자를 어떻게 취급/처리할지를 결정한다. 우리가 왜 “현재 카테고리 코드”와 “현재 의미”라고 말하는지는 설명할 것이다. TeX가 들어오는 뒤죽박죽한 문자들을 걸러내어 조판될 문자(내용)와 처리되어야 할 지시를 이루는 문자들을 구분할 수 있는 것은 바로 카테고리 코드 덕분이다—*명령* 즉 TeX가 실행해야 하는 것들이다.

다음 표는 이 16개의 카테고리 코드를 나열한다. 각 코드가 의미하는 바와, 보통 각 범주에 할당되는 문자 예시를 함께 제시한다.

| **범주 코드** | **설명**                            | **표준 LATEX/TEX**                  |
| --------- | --------------------------------- | --------------------------------- |
| 0         | 이스케이프 문자—TEX가 명령을 찾기 시작하도록 알림     | `\`                               |
| 1         | 그룹 시작                             | {                                 |
| 2         | 그룹 종료                             | }                                 |
| 3         | 수학 전환—수학 모드로 들어가거나 나옴             | $                                 |
| 4         | 정렬 탭                              | &                                 |
| 5         | 줄 끝                               | ASCII 코드 13 (`\r`)                |
| 6         | 매크로 매개변수                          | #                                 |
| 7         | 위첨자—수학 조판용: `$y=x^2$` $$y=x^2$$   | ˆ                                 |
| 8         | 아래첨자—수학 조판용: `$y=x_2$` $$y=x\_2$$ | \_                                |
| 9         | 무시되는 문자                           | ASCII 0 `<null>`                  |
| 10        | 공백                                | ASCII 코드 32(공백)와 9(탭 문자)          |
| 11        | 문자                                | A...Z, a...z, (그리고 수천 개의 유니코드 문자) |
| 12        | 기타                                | 0...9에 더해 ,.;?" 및 기타 여러 문자        |
| 13        | 활성 문자                             | ˜와 같은 단일 문자 매크로를 만들기 위한 특수 범주 코드  |
| 14        | 주석 문자—줄 끝까지 뒤따르는 모든 내용을 무시        | %                                 |
| 15        | 잘못된 문자, .tex 입력 파일에 나타날 수 없음      | ASCII 코드 127 (`DEL`)              |

카테고리 코드를 사용하는 것은 TeX가 들어오는 문자 흐름을 걸러내고 입력을 이해하여 다음을 판별하는 핵심 메커니즘이다:

* 조판될 텍스트를 구성하는 문자들;
* 수학으로 조판되어야 할 내용을 구분하는 것;
* 처리되거나 실행될 명령 이름인 문자 시퀀스;
* … 그리고 많은 다른 조판 작업들.

처음에는 각 문자의 카테고리 코드(의미)가 어떤 종류의 고정된 할당처럼, 즉 바꿀 수 없고 TeX 소프트웨어의 내부 기초에 영구적으로 새겨진 것처럼 생각할 수도 있지만, 사실은 그렇지 않다. 앞서 언급했듯이 TeX는 어떤 카테고리 코드가 *현재* 각 문자에 할당되어 있는지를 저장하는 내부 조회표를 유지한다. 우리는 의도적으로 *현재 할당된* 이라고 말하는데, 이는 아직 읽히지 않은 어떤 문자든 그 카테고리 코드를 원시(내장) 명령인 `\catcode`를 사용해 변경할 수 있기 때문이다. 이는 상당한 유연성을 제공하는데, 원하면 나중에 입력에서 읽히는 어떤 문자의 처리 방식이나 의미를 완전히 바꿀 수 있어 정교한 조판 응용에 엄청난 여지를 준다.

LaTeX를 사용해 “일을 끝내는 것”에 주로 관심이 있다면, 아마도 카테고리 코드를 직접 접해 본 적은 없고, 아마 오류 메시지를 통해서만 보았을 가능성이 높다. 하지만 안심해도 된다. 카테고리 코드는 TeX 엔진 동작의 핵심 구성 요소로서, LaTeX(및 LaTeX 패키지)가 실제로 문서를 조판하는 일을 수행하게 해 준다.

TeX 엔진이 시작될 때(“[부트스트랩](https://en.wikipedia.org/wiki/Bootstrapping)”) 기본적으로 문자와 카테고리 코드의 할당 집합을 사용한다. 하지만 `\catcode` 명령을 통해 그 기본값은 핵심 LaTeX 코드(매크로) 및/또는 로드한 LaTeX 패키지, 아니면 직접 작성한 TeX 코드나 매크로에 의해 변경될 수 있다. 그러나 시간이 지나고 전통/관행을 거치면서 특정 카테고리 코드에 할당된 몇몇 문자는 “표준”으로 받아들여지게 되었고, 문서를 이식 가능하고 동료나 다른 사용자와 쉽게 공유할 수 있게 하려면 이러한 표준을 따르는 것이 확실히 바람직하다. 예를 들어, `\` 문자는 TeX/LaTeX 명령의 시작을 나타내기 위해 카테고리 코드 0이 할당된다— [위 표](#tbl-0).

### 입력을 읽기(스캔)

TeX가 입력 파일에서 다음 문자를 읽어(스캔해) 올 때 가장 먼저 하는 일은 그 문자의 카테고리 코드를 살펴보는 것이다. 그러니 TeX가 전형적인 입력 줄을 읽을 때 어떤 일이 일어나는지 좀 더 자세히 보자.

다음 텍스트를 포함한 .tex 파일이 있다고 가정해 보자 `Hello World \jobname` 가 문단 어딘가에 들어 있다고 하자. 만약 `.tex` 파일을 사용해 살펴보면 [헥스 편집기](https://en.wikipedia.org/wiki/Hex_editor)를 사용하면 문자 시퀀스가 `Hello World \jobname` 우리의 `.tex` 파일 안에서는 단지 정수들의 연속, 즉 *문자 코드*에 불과하며, 아래 스크린샷에는 16진수 시퀀스로 표시되어 있다:

`48, 65, 6C, 6C, 6F, 20, 57, 6F, 72, 6C, 64, 20, 5C, 6A, 6F, 62, 6E, 61, 6D, 65, 20`

![TeX 파일의 16진수 문자 코드](/files/d408f9a4448235f9f4f133b740160978cd4c420c)

16진수(16진법)에서 10진수(10진법)로 변환하면 문자 코드의 시퀀스는 다음과 같다:

![TeX 파일의 10진수 문자 코드](/files/434fbb45afdb34fa53bf875dfec74855a41c6274)

또한 TeX에서는 각 문자에 대응하는 카테고리 코드가 있다는 것도 알고 있다. 따라서 [위 표](#tbl-0) 다음과 같은 기본 카테고리 코드 할당도 (아마) 사용되고 있음을 알 수 있다:

![TeX 카테고리 코드](/files/e68e3bdeba3cafffba945f88a0746d57954c6cf7)

따라서 TeX에게 입력 파일의 각 문자는 다음과 같은 *두* 숫자 값—즉 문자 코드와 카테고리 코드—으로 표현된다:

![문자 코드와 대응하는 TeX 카테고리 코드](/files/ed4479443a60344b1a4d5e02d2650c945249d093)

이 시점에서 우리는 TeX가 파일을 처리하는 아주 첫 번째 단계, 즉 개별 문자를 스캔하는 단계만을 고려하고 있다. 그렇다면 TeX는 이러한 문자 코드와 카테고리 코드의 쌍을 실제로 어떻게 다루는가? TeX가 개별 문자를 스캔하고 그에 대응하는 카테고리 코드를 찾아낸 뒤, 이 정보를 정확히 어떻게 사용하여 들어오는 문자를 “걸러내는”가?

## 2부

2부에서는 TeX가 입력을 읽는 방식을 더 자세히 살펴볼 것이다. TeX의 “눈”이 되어 입력을 문자 단위로 바라보는 것처럼 말이다.

[1부](/latex/ko/more-topics/19-how-tex-macros-actually-work-part-1.md) [2부](/latex/ko/more-topics/20-how-tex-macros-actually-work-part-2.md) [3부](/latex/ko/more-topics/21-how-tex-macros-actually-work-part-3.md) [4부](/latex/ko/more-topics/22-how-tex-macros-actually-work-part-4.md) [5부](/latex/ko/more-topics/23-how-tex-macros-actually-work-part-5.md) [6부](/latex/ko/more-topics/24-how-tex-macros-actually-work-part-6.md)


---

# 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/more-topics/19-how-tex-macros-actually-work-part-1.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.
