> 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/20-how-tex-macros-actually-work-part-2.md).

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

[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)

## 소개: 그림으로 보는 이야기

1부에서 언급했듯이, TeX는 당신의 `.tex` 파일을 읽어야 하며, 그 읽기 과정은 더 정확히는 *스캐닝*. 전통적으로 TeX의 입력 처리(스캐닝)는 TeX가 입력을 관찰하는 “눈”을 가지고 있는 것으로 비유되므로, 아래 그림들에서는 그 오랜 비유를 따르겠습니다.

### 그림 1: 눈이 준비되었습니다

TeX가 어떤 `.tex` 파일에서 입력을 얻었고 이제 우리의 문자 문자열을 처리하려고 한다고 가정합니다 `안녕하세요 세계 \jobname` 텍스트 단락 안에 포함되어 있습니다. TeX는 각 문자를 차례로 확인하고 그 범주 코드(category code)를 살펴봅니다.

![텍스트 한 줄을 스캔할 준비가 된 TeX의 눈](/files/bded3a70df51cfad4165be5f6d594e39de61a810)

### 그림 2: 범주 코드 처리

다음 그림에서는 개략적으로(자세한 내용은 아래 참조) TeX가 서로 다른 여러 범주 코드에 어떻게 반응하는지 볼 수 있습니다. 범주 코드는 총 16개지만, 단순화를 위해 여기서는 11, 10, 0의 세 가지만 보여 줍니다. 다른 문자 코드는 표를 구성하거나, 수학을 조판하거나, 매크로 매개변수를 인식하는 등 TeX의 조판 과정에서 중요해집니다.

![여러 서로 다른 범주 코드에 반응하는 TeX](/files/7c1707c8c8d8fa0b59e2f0a1df200455bb3a4f52)

#### 그림 2에 대한 설명

여기서는 TeX가 텍스트 단락의 일부를 이루는 문자들을 읽는(스캐닝하는) 상황을 살펴봅니다. TeX는 각 문자를 검사하고, 범주 코드를 확인한 뒤, 범주 코드와 TeX의 “모드”(현재 수행 중인 작업을 바탕으로 한 상태)에 따라 적절한 동작을 취합니다.

* **(초록색 눈)** TeX는 그 문자들 각각이 범주 코드 11(“문자”)을 갖고 있음을 확인한 뒤, 자신이 만들고 있는 단락의 일부로 조판하도록 그 문자들을 넘깁니다. 하지만 TeX는 문자 코드만을 넘기거나 사용하지 않고, 대신 숫자 쌍(문자 코드, 범주 코드)을 사용해 다음과 같은 합성 정수 값을 계산합니다. 이를 *문자 토큰* (아래 참조). 그 문자 토큰이 생성되면 TeX의 내부 조판 과정/알고리즘으로 들어갑니다.
* **(파란색 눈)** TeX는 범주 코드 10(“스페이서”)을 가진 공백 문자(ASCII 32)를 봅니다—앞서 논의했듯, TeX가 그것을 읽기 전에 공백(ASCII 32)이나 어떤 문자든 범주 코드가 다른 값으로 바뀌었을 가능성도 충분히 있습니다.

TeX가 범주 코드 10(“스페이서”)을 가진 문자를 실제로 처리하는 방식은 TeX가 그것을 언제/어디서 보느냐, 즉 TeX의 현재 “모드”에 따라 달라집니다. 예를 들어, TeX가 단순히 그것들을 건너뛰는 경우도 있습니다. 여기서는 TeX가 단락 텍스트를 처리하는 중 범주 코드 10(우연히도 공백, ASCII 32)인 문자를 감지했음을 알게 되며, 결국 이를 이른바 interword glue로 변환합니다. 이는 늘어나거나 줄어들 수 있는 일종의 유동적인 공백입니다.

* **(빨간색 눈)** 여기서 TeX는 매우 중요한 범주 코드 0(이스케이프 문자)을 가진 문자를 관찰했습니다.

이스케이프 문자—*어떤* 범주 코드 0을 가진 문자—는 TeX에게 특별한 읽기 모드로 전환하여 뒤따르는 문자들을 주의 깊게 스캔(읽기)하라고 알려줍니다. 왜냐하면 그것들이 다음의 이름을 식별하기 *명령을 사용합니다*, 조판할 텍스트가 아닙니다. TeX 문헌에서는 “command”라는 용어가 또한 *제어 시퀀스*라고도 불리는 것을 볼 수 있습니다. 이스케이프 문자를 본 후 TeX는 그 뒤에 오는 문자의 범주 코드를 확인합니다 *바로 뒤에*; 이는 TeX가 두 종류의 명령을 인식하기 때문입니다:

* 다문자 명령이라고 불리는 *제어 단어*: 이스케이프 문자 바로 뒤에 오는 문자는 범주 코드 11을 가집니다. 이후에 나오는 범주 코드 11의 모든 문자들은 명령 이름의 일부로 간주됩니다. TeX는 명령 이름의 일부를 이루는 문자를 찾다가, 어떤 문자가 *작동하지* 범주 코드 11을 갖지 않을 때—예: 범주 코드 10의 공백 문자와 같은 경우.
* 단일 문자 명령이라고 불리는 *제어 기호*: 이스케이프 문자 바로 뒤에 오는 문자 *작동하지* 범주 코드 11을 가집니다.

이스케이프 문자는 TeX가 평소의 스캐닝 동작에서 “벗어나” 다음 몇 개의 문자에 대해 다른 접근 방식을 취하도록 유발하는 것으로 생각할 수 있습니다—이는 TeX가 **명령을 찾기 위한 스캔 시작**.

### 그림 3: 범주 코드 11(“문자”) 처리

이 시리즈의 1부에서 TeX가 입력에서 읽는 각 문자는 두 개의 정수로 설명된다고 언급했습니다:

* 문자 코드: 한 문자의 수치 표현을 정의하는 정수;
* 범주 코드: TeX가 입력에 나타날 수 있는 모든 문자에 부여하는 0에서 15 사이의 값.

TeX는 다음 처리 단계인 문자 토큰 생성에서 이 두 정보를 사용합니다.

그림 3은 범주 코드 11(문자)을 가진 이러한 입력 문자들에 대해 TeX가 무엇을 하는지 보여 주기 위해 그림 2를 확장한 것입니다. 즉, TeX는 *문자 토큰*—TeX가 해당 문자의 범주 코드와 문자 코드를 조합하여 계산하는 정수값입니다.

**참고**: 이 예에서는 범주 코드 11을 가진 문자만 다루고 있지만, TeX는 다른 범주 코드를 가진 입력 문자들에 대해서도 토큰 값을 생성한다는 점을 알아 두어야 합니다—단, 범주 코드 0은 절대로 토큰으로 바뀌지 않습니다. 이스케이프 문자는 단지 특별 처리를 시작하는 “스위치”처럼 작동할 뿐입니다.

![범주 코드 11을 가진 문자들을 처리하는 TeX](/files/c68f5ac43794c051a47f88df8329abb414e1e6f8)

아래의 그림 5에서는 TeX가 범주 코드 0(이스케이프 문자)을 가진 문자를 보았을 때 무엇을 하는지 보여 줍니다.

#### 그림 3에 대한 설명: 범주 코드 11(“문자”) 처리

여기서는 **초록색** 동작: TeX가 범주 코드 11(“문자”)을 가진 문자들을 보았을 때 무슨 일이 일어나는지. TeX가 문자를 읽고 그 범주 코드(여기서는 11)를 결정한 뒤, TeX가 다음으로 하는 일은 *결합하다* 이 숫자 쌍을 문자 토큰이라 불리는 단일 정수로 합치는 것입니다. 이 토큰들(정수)은 TeX의 내부 조판 알고리즘/처리의 다음 단계로 전달됩니다. 앞서 언급했듯, TeX는 다른 범주 코드(즉, 11이 아닌 코드)를 가진 문자에 대해서도 문자 토큰을 생성하지만, 여기서는 범주 코드 11을 예로 사용하고 있습니다.

각 문자 토큰(정수)은 입력 문자를 그 문자에 부여된 범주 코드와 영구적으로 결합합니다 **TeX가 그것을 스캔(읽기)했을 당시의**: 이 사실은 TeX/LaTeX 매크로의 동작을 이해하는 데 매우 중요합니다. 물론 추가 처리 과정에서 TeX는 때때로 어떤 (문자 코드, 범주 코드) 쌍으로 그 토큰이 만들어졌는지 알아내기 위해 문자 토큰을 분해해야 합니다. 그러나 일단 문자가 TeX의 입력(스캐닝) 과정에 의해 읽히면, TeX가 계산한 문자 토큰 값으로 인해 그 문자는 *영구적으로* 자신에게 부여된 범주 코드와 결합됩니다 *읽혔을 당시*.

**문자 토큰 계산**

TeX 엔진은 문자 토큰을 계산하기 위해 간단한 공식을 사용합니다, $$T$$, 범주 코드를 가진 문자로부터 $$C$$ 그리고 문자 코드 $$A$$:

$$T = \text{constant} \times C + A$$

pdfTeX와 같은 8비트 엔진은 다음을 사용합니다:

$$T = 256\times C + A$$

XeTeX나 LuaTeX 같은 유니코드 대응 엔진은 다른 공식을 사용해야 합니다. 유니코드에서는 문자 코드가 예전 8비트 ASCII 인코딩 세계의 최대값인 255보다 훨씬 클 수 있기 때문입니다. 예를 들어 XeTeX는 다음을 사용합니다:

$$T= 2^{21}\times C + A \hskip5mm \text{(where } A \text{ is a Unicode character code value)}$$

다시 한번 말하지만, 범주 코드 0을 가진 문자는 문자 토큰으로 변환되지 않는다는 점을 주목할 가치가 있습니다. 범주 코드 0은 TeX의 입력 필터링에서 매우 특별한 위치를 차지하며, 다음 몇 개의 문자를 스캔하는 특수 모드로 TeX를 전환시키는 순수한 “스위치”로만 사용됩니다. 이 부분은 그림 5에서 다룹니다.

### 그림 4: 범주 코드 10(“스페이서”) 처리

범주 코드 10(“스페이서”)을 가진 문자에 대한 TeX의 처리는 입력 안에서 범주 코드 10의 문자를 감지했을 때 TeX가 현재 무엇을 작업 중인지에 따라 달라집니다. 이 예에서는 TeX가 일반적인 단락 처리를 수행하고 있으며, 범주 코드 10을 가진 공백 문자는 interword glue로 변환됩니다.

![범주 코드 10을 가진 문자들을 처리하는 TeX](/files/9147ec5f9e3e008e3de922c4c32794cc536ca385)

TeX의 공백 처리 방식은 꽤 특이하게 보일 수 있지만, 이에 대한 좋은 개요는 ...의 1장과 2장에서 찾을 수 있습니다 [TeX by Topic](http://www.eijkhout.net/texbytopic/texbytopic.html) Victor Eijkhout의 ...—당신은 [무료 PDF 사본을 다운로드할 수 있습니다](https://bitbucket.org/VictorEijkhout/tex-by-topic) 그의 웹사이트를 통해.

예를 들어 TeX가 범주 코드 10의 문자를 볼 때, TeX는 다음과 같이 할 때가 있습니다:

* 그것들을 모두 건너뛰기(무시하기)—예: TeX가 수직 모드에 있을 때;
* 여러 스페이서를 하나의 스페이서로 변환하기—단락을 처리할 때와 같이 추가 공백을 건너뛰면서;
* 그것들을 흡수하기—예: 명령 이름 뒤의 한 칸 공백을 흡수하기;

또한, TeX가 때때로 *생성하기도* 공백을—줄 끝 문자를 공백으로 변환함으로써. 공백 문자(범주 코드 10을 가진 모든 문자)의 동작/처리는 TeX의 “특이한 점” 중 하나입니다. TeX의 이 측면에 익숙해지려면 시간과 연습이 필요합니다.

### 그림 5a: 범주 코드 0(“이스케이프 문자”) 처리

이 그림에서 TeX는 `\` 범주 코드 0을 가진 문자, 즉 “이스케이프 문자”—여기서는 TeX가 이스케이프 문자를 처리하고 명령 이름을 식별하는 과정을 보여 주기 위해 추가 그림 시퀀스를 사용하겠습니다.

![범주 코드 0을 가진 문자들을 처리하는 TeX](/files/b570ade9e9295adf98cd70862a9985308bbad804)

### 그림 5b: 명령 이름 찾기

이 그림에서는 빨간 점선 상자 부분(**명령을 찾기 위한 스캔 시작**) TeX가 이스케이프 문자를 본 뒤 무엇을 하는지 살펴봅니다.

![명령 이름을 찾는 TeX](/files/26ba40361e1bf21f9438aa7d61a47f425af1331e)

**그림 5b에 대한 설명**

* 인식되고 나면 이스케이프 문자는 제 역할을 다한 것입니다. 즉, 스위치처럼 작동하고 더 이상의 처리에는 참여하지 않습니다—구체적으로 말하면, 그것은 **작동하지** 문자 토큰으로 변환됩니다.
* 편의를 위해 앞서 언급한 몇 가지 세부 사항을 반복하겠습니다. 이스케이프 문자를 본 후 TeX는 그 뒤에 오는 문자의 범주 코드를 확인합니다 *바로 뒤에*; 이는 TeX가 두 종류의 명령을 인식하기 때문입니다:
* * 다문자 명령이라고 불리는 *제어 단어*: 이스케이프 문자 바로 뒤에 오는 문자는 범주 코드 11을 가집니다. 이후에 나오는 범주 코드 11의 모든 문자들은 명령 이름을 형성하는 것으로 간주됩니다(*제어 단어*). TeX는 명령 이름의 일부를 이루는 문자를 찾다가, 어떤 문자를 감지하면 멈춥니다 *작동하지* 범주 코드 11을 갖지 않을 때—예: 범주 코드 10의 공백 문자와 같은 경우.
  * 단일 문자 명령이라고 불리는 *제어 기호*: 이스케이프 문자 바로 뒤에 오는 문자 *작동하지* 범주 코드 11을 가집니다.
* 이 예에서, 그 뒤의 첫 번째 문자는 `\` 은(는) `j` (범주 코드 11)로, TeX에게 범주 코드 11의 문자들로 이루어진 (잠재적으로) 다문자열 명령을 찾으라고 알려 줍니다.
* TeX는 범주 코드 11을 가진 더 많은 문자를 계속 확인합니다. 다른 범주 코드, 예를 들어 범주 코드 10의 공백을 가진 문자를 감지하는 즉시 TeX는 명령 이름의 끝에 도달했음을 압니다. 다시 강조하면, 여기서는 공백 문자(범주 코드 10)가 명령의 끝을 “종결”했지만, 그것은 범주 코드 11을 갖지 않는 어떤 문자라도 될 수 있었습니다 **하지 않았다** 범주 코드 11을 가집니다.

## 3부

3부에서는 그림 5b에서 이어서, 이 이야기의 이 부분—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/20-how-tex-macros-actually-work-part-2.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.
