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

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

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

## 소개 및 개요

Part 4에서는 TeX 매크로의 몇 가지 기본적인 속성을 검토했으며, 이제 TeX 매크로의 내부 메커니즘인 전문화된 토큰 리스트를 자세히 살펴볼 다음 두 글을 준비했다. 이 마지막 두 글에서는 노드 리스트라고 불리는 도표를 사용하며, 이는 Knuth의 원래 TeX 소프트웨어를 특별히 수정한 버전으로 생성된 데이터에서 만든 것이다. 이러한 수정은 일반적으로 사용자가 접근할 수 없는 TeX 내부 데이터 구조에 접근하기 위해 설계되었다. TeX의 내부 매크로 처리 및 실행 루틴에 “연결함으로써”, TeX의 매크로 처리 동작을 더 자세하고 정확하게 논의할 수 있게 하는 그래픽 데이터를 출력할 수 있었다. Overleaf는 이러한 도표가 독자들이 TeX 매크로가 실제로 어떻게 동작하는지 더 잘 이해하는 데 도움이 되기를 바란다.

### 추가 배경 읽기

Overleaf는 이미 TeX 토큰과 TeX 토큰 리스트에 대한 추가 배경 정보를 제공하는 두 개의 토큰 관련 글을 게시했다. 이해의 빈틈을 메우고 이 시리즈의 Part 5와 6을 최대한 활용하는 데 도움이 필요하다면, 꼭 시간을 내어 살펴보길 바란다.

* [“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가 매크로 생성 명령(`\def`, `\edef`, `\gdef` 또는 `\xdef`)을 입력 스트림에서 감지하면, 다음 두 부분을 변환하는 프로세스를 시작한다 `<매개변수 텍스트><치환 텍스트>` 매크로 정의를 하나의 긴 토큰 리스트로 변환하는데, 그것은 매우 특별한 유형의 토큰 리스트이다.

매크로의 토큰 리스트는 TeX 내부에서 사용되는 다른 토큰 리스트와 약간 다르다. 왜냐하면 그것들은 TeX 내부 프로세스만이 만들거나 생성할 수 있는 “특수한” 토큰 값을 포함하기 때문이다. 그런 특수 토큰은 .tex 파일에 넣을 수 있는 어떤 명령으로도 직접 만들 수 없다. TeX는 아래에서 살펴보고 설명하듯, 매크로 호출을 처리하는 데 도움을 주기 위해 이러한 “특수한” 토큰 값을 만들고 사용한다.

### 토큰 리스트가 저장되는 방식에 대한 간단한 말: 노드

토큰(정수 값)들의 리스트를 저장하기 위해 TeX는 다음과 같은 데이터 구조를 사용한다 [연결 리스트](https://en.wikipedia.org/wiki/Linked_list)인데, TeX의 경우 이는 이른바 *노드*들의 리스트로 이루어진다. 노드는 데이터를 여러 항목 모아 저장하는 데 사용할 수 있는 작은 컴퓨터 메모리 묶음이라고 생각하면 된다. 매크로를 저장하기 위해 이러한 노드들은 사슬처럼 서로 이어지며, 각 노드(사슬의 한 고리)는 토큰 값과 리스트의 다음 노드에 대한 메모리 주소를 포함해 여러 정보 조각을 저장할 수 있다. 더 자세한 내용은 다음 글을 읽어볼 수 있다 [TeX 토큰 리스트란 무엇인가](/latex/ko/in-depth-articles/54-what-is-a-tex-token-list.md) 하지만 아래 도표는 토큰 리스트로 저장된 매크로의 핵심 특징을 요약한다:

![연결된 노드 리스트로 저장된 TeX 매크로 토큰 리스트의 도표](/files/fa4f9d6f71aa7dcd5dc448fa090c70645581be1b)

### 알아두기: 매크로 정의의 4가지 부분

Part 4에서 논의했듯이, 어떤 매크로의 구조도 다음과 같이 쓸 수 있다:

```
<TeX 매크로 원시 명령><매크로 이름><매개변수 텍스트>{<치환 텍스트>}
```

여기서:

* `<TeX 매크로 원시 명령>` = 다음 중 하나 `\def`, `\edef`, `\gdef` 또는 `\xdef`;
* `<매크로 이름>`= 다음과 같은 매크로의 이름 `\foo`;
* `<매개변수 텍스트>` “null”(없음)일 수 있거나, 구분자 토큰과 매크로 매개변수 토큰으로 이루어진 문자열일 수 있다;
* `<치환 텍스트>` 는 매크로의 실제 본문이다: 매크로를 호출했을 때 “실행”되는 부분.

**참고**: (Part 4에서도 관찰했듯이) 이 논의 전반에서 우리는 `<매크로 이름>` 뒤에는 카테고리 코드 10의 공백 문자가 따라와서 `<매크로 이름>`우리는 *하지는 않았다* 명시적으로 그 공백 문자를 본문/논의에서 보여주지는 않았지만, 그것이 있다고 가정한다. 엄밀히 말하면, 다음처럼 나타내야 한다:

```
<TeX 매크로 원시 명령><매크로 이름><공백><매개변수 텍스트>{<치환 텍스트>}
```

그러나 우리는 `<space>` 문자의 명시적 포함을 생략하고 그 존재를 암묵적으로 가정할 것이다.

**참고**: 문자들은 `{` 및 `}` *않는다* 매크로 토큰 리스트의 일부가 되지 않는다: 그 목적은 단지 TeX의 입력 스캐너(토큰을 생성하는)가 `<치환 텍스트>` 어디에서 시작하고 끝나는지 알려주는 것이다.

TeX가 매크로를 정의할 때, `<매개변수 텍스트><치환 텍스트>` 부분들은 하나의 길고 연속적인 토큰 리스트로 변환된다—그 리스트의 총 토큰 수는 매크로의 복잡도에 따라 달라진다. 우리가 보았듯이, 그 부분은 TeX가 실제 매크로와 함께 사용할 인자(값)를 이루는 토큰들을 골라내는 데 사용하는 “토큰 템플릿” 또는 “청사진” 역할을 한다. 즉, 다음에 주입할 토큰들이다 `<치환 텍스트>`.

이 아이디어를 확실히 하기 위해, 예제 매크로를 하나 사용하되 이후 도표가 너무 복잡해지지 않도록 짧게 유지해 보자:

```
\def\foo A#1\fake{123 #1}
```

우리 매크로에서, `\foo`

* `<매개변수 텍스트>` = `A#1\fake`
* `<치환 텍스트>` = `123 #1`

이 예제는 단순한 매크로이지만, 우리가 살펴봐야 할 모든 특징을 포함하고 있다.

지적했듯이, TeX는 `<매개변수 텍스트><치환 텍스트>` 을 아래 도표에서 볼 수 있는 하나의 긴 토큰 리스트로 변환한다. 우리의 예제에서는, `A#1\fake{123 #1}` 로 형성된 토큰들은 토큰 리스트(연결 리스트 형태의 노드들) 안에 저장된 연속적인 토큰 시퀀스로 변환되었다.

## 실제 매크로 토큰 리스트를 보여주는 그래픽

다음 도표는 매크로 `\def\foo A#1\fake{123 #1}` 가 어떻게 저장되는지를 보여주며, TeX 엔진 내부의 실제 데이터를 사용한다. 이는 다음을 이용해 만들었다 [Knuth의 TeX를 수정한 버전](/latex/ko/in-depth-articles/01-a-new-series-of-articles-tex-tokens-and-related-concepts-but-why-and-how.md#how-can-you-study-tex-tokens3f) 으로, 매크로 호출을 가로채고 TeX의 내부 데이터를 조사한 다음, 오픈 소스 그래픽 프로그램인 [Graphviz](https://www.graphviz.org/).

다음 그래픽을 [PDF 파일](https://assets.ctfassets.net/nrgyaltdicpt/N6gT757eXCxRV3FtdPPga/7ce120dc05ed05962bb911ff1124734b/annotatednodelist-plain.pdf) (675 KB) 또는 [SVG 파일](https://images.ctfassets.net/nrgyaltdicpt/4PkmtHDhO8KF892ZDWuLHP/2c9c8385c6948fd122b228c5c780a3a6/annotatednodelist-plain.svg) (1.8 MB)로 다운로드할 수 있다.

![주석이 달린 TeX 토큰 리스트의 도표](/files/922605b973e8e2e70f9580898ad97c5c90167303)

#### 노드 이해하기

위 도표에서 각 노드가 다음과 불리는 두 데이터 항목을 포함하는 것을 볼 수 있다 **다음 노드** 그리고 **현재 노드**. 이것들은 TeX 내부의 메모리 위치—다른 노드가 저장되는 위치—를 나타내는 정수값일 뿐이다.  **다음 노드** 및 **현재 노드** 의 값은 중요하지 않으며, 노드들이 리스트로 서로 연결될 수 있도록 위치(메모리 주소)를 저장할 뿐이다.

![다음 노드와 현재 노드의 의미](/files/9f8f48c3beb24c42e2b1b3c64f8ad0514d6b98fc)

#### 예제로 돌아가서

노드 도표에서, `A#1\fake{123 #1}` 로부터 형성된 토큰 리스트에는 이 글의 시작 부분에서 소개한 몇 가지 “특수 토큰”이 포함되어 있다. 또한 우리 매크로를 나타내는 노드 리스트는 “특수한 첫 번째 노드”로 시작한다. 이것들이 무엇이고 어떤 역할을 하는지 살펴보자.

매크로 토큰 리스트의 맨 첫 항목(그리고 일부 다른 토큰 리스트 유형들)에는 토큰 값을 저장하는 대신 매크로의 *참조 횟수* 라고 불리는 데이터 항목이 저장되며, TeX가 매크로의 사용을 추적하는 데 이를 사용한다.

![참조 횟수 노드는 토큰 리스트의 첫 번째 노드이다](/files/83e5a3476acaee1643d6bb5198747a4715ae7171)

의 첫 번째 토큰은 `<매개변수 텍스트>` 참조 횟수 바로 다음에 오는 노드에 저장된다: 그것은 문자 `복사된` 를 나타내는 토큰임을 볼 수 있다

$$\text{token value}=256\times \text{category code} + \text{character code}$$

카테고리 코드 11을 가진. `복사된` 문자의 경우

$$\text{token value}=256\times 11 + 65$$

그래서 노드에 보이듯 값 2881이 된다.

#### \foo에서 사용된 “명령” \fake

우리의 매크로 정의에서 `\def\foo A#1\fake{123 #1}` 구분자 중 하나는 *정의되지 않은* 명령을 `\fake` 이고, 이것은 토큰 리스트 안에 `<매개변수 텍스트>` 섹션의 일부로 저장된다. 보시다시피, 전체 매크로 토큰 리스트에서 `\fake` 값이 `19491`—Part 3에서 논의한 공식으로 TeX가 계산한 정수값이다. TeX가 `\foo` 를 실행하려고 할 때 `\fake` 토큰 값이 `<매개변수 텍스트>` 섹션의 끝에서 발견되기를 기대할 것이다. TeX는 *실행하려고 하지* \fake `\fake` 명령을 `<매개변수 텍스트>` \token 템플릿” 안에서 일종의 “구두점”을 제공하는 역할만 하기 때문이다.

![명령 토큰을 매크로 구분자로 사용하기](/files/35a55fee26c929cc855191de0bd6e3590bc36c45)

#### 토큰 리스트의 특수 토큰들

**“end match” 토큰**

매크로를 호출할 때 TeX의 첫 번째 작업은 사용자가 입력한 매크로를 스캔하고 사용자의 `<매개변수 텍스트>` 섹션에 있는 토큰들과 템플릿 `<매개변수 텍스트>` 메모리에 저장된(매크로가 정의될 때 생성된) 토큰들과 비교하는 것이다. 매크로의 전체 정의는 `<매개변수 텍스트><치환 텍스트>` 로 구성되어 하나의 긴 연속된 토큰 리스트로 저장되기 때문에, TeX는 그 토큰 리스트에서 `<매개변수 텍스트>` *종료됩니다* 가 어디에 있는지 알아야 하며 `<치환 텍스트>` *시작될 때*가 어디에 있는지도 알아야 한다. 이를 위해 TeX가 매크로를 정의할 때(토큰 리스트를 구축할 때) **end match** 라고 불리는 특수 종료 토큰을 삽입하며, 그것을 `<매개변수 텍스트>`로 알려져 있습니다.  **end match** 로부터 생성된 토큰 집합의 가장 마지막 토큰으로 넣는다. 이 토큰은 사용자 명령으로 생성될 수 없고 TeX 자체만 만들 수 있으므로, TeX는 `<매개변수 텍스트>`.

![TeX 토큰 리스트에서 end match 토큰 보이기](/files/8daa0c616a221ba608946caefcb77c06fa46fd23)

여기서, 우리는 **end match** 다음에 오는 첫 번째 토큰이 `1` 를 나타내는 토큰임을 볼 수 있다 `<치환 텍스트>` 숫자 `\foo` 는 `123 #1`—즉, 숫자 `1` (카테고리 코드 12를 가진)로 시작하기 때문이다.

Part 2와 3의 논의에서 알 수 있듯이, 문자 토큰은 다음을 사용하여 계산된다

$$\text{token value}=256\times \text{category code} + \text{character code}$$

숫자의 경우 `1` 카테고리 코드 12를 가진 경우

$$\text{token value}=256\times 12 + 49$$

그래서 노드에 보이듯 토큰 값 3121이 된다.

**“match parameter” 토큰**

TeX가 매크로 정의를 저장할 때, 모든 매개변수 토큰(`#1`, `#2`… `#9`)을 `<매개변수 텍스트>` 라고 불리는 것으로 변환한다 **match parameter** 토큰. 이 토큰들은 TeX에게 사용자의 매크로 호출 안에서 매크로의 인자에 해당하는 토큰들을 찾기 시작해야 함을 알려준다.

![TeX 토큰 리스트에서 match parameter 토큰 보이기](/files/506a4c9d94453990c990ead5ab5db8a7c70983b0)

### 토큰 리스트의 특수 토큰들

#### “output parameter” 토큰

TeX가 모든 처리를 마치고 실제로 매크로를 실행(확장)할 준비가 되면, **output parameter** 토큰들은 TeX에게 `<치환 텍스트>` 내부의 위치를 알려준다. 매크로가 호출될 때 사용자가 제공한 인자를 나타내는 토큰들을 어디에 넣어야 하는지 알려주는 것이다. 실질적으로는 “이 위치에 사용자 인자 n을 나타내는 토큰을 삽입하라. 여기서 n=1...9이다”라는 뜻이다.

... 안에서는 `<치환 텍스트>` 저장된 매크로 정의 토큰 리스트의 섹션에는 **output parameter** 각각의 `#1`, `#2`... `#9` 에 대응하는 토큰이 존재한다.

![TeX 토큰 리스트에서 output parameter 토큰 보이기](/files/659c488dcc33a156564771b217d9cc0417ab02d6)

우리의 `\foo` (`\def\foo A#1\fake{123 #1}`정의를 살펴보면 매크로 매개변수가 1개뿐이며 (`#1`에 있는 `<매개변수 텍스트>` (`A#1\fake`) 그리고 그 결과 매크로 매개변수 (`#1`)가 `<치환 텍스트>` (`123 #1`에 나타난다): 그 결과 단지 1개의 **output parameter** 를 나타내는 토큰 리스트에 토큰이 존재하게 된다 `<치환 텍스트>`.

노드 리스트에서 다음 사항에 주목하라 `\foo`의 `<치환 텍스트>`:

* 토큰 바로 앞의 **output parameter** 토큰은 공백 문자를 나타낸다(카테고리 코드 10, 문자 코드 32). 왜냐하면 `123` 와 매크로 매개변수 (`#1`) 사이에 공백이 있기 때문이다 `\foo`;
* 그 **output parameter** 는 리스트의 마지막 토큰이다: **다음 노드** 는 “null”(즉 “비어 있음”)이라는 특수 값을 가지며, 이것이 리스트를 끝내는 데 사용된다: **output parameter** 뒤에는 더 이상 노드가 없기 때문에 마지막 토큰이며, `<치환 텍스트>` 의 끝을 나타내고 따라서 매크로 정의의 끝을 의미한다.

## 6부

Part 6에서는 자세한 그래픽을 사용하여 매크로 확장의 정확한 의미와, 매크로 인자를 매크로의 내부에 넣기 전에 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/23-how-tex-macros-actually-work-part-5.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.
