> 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/53-what-is-a-tex-token.md).

# "TeX 토큰"이란 무엇인가?

## TeX 토큰과 관련 개념에 대한 연재의 동기

TeX 토큰과 관련 개념에 대한 연재 글을 만들기 위해 사용한 동기와 방법론을 이 글에서 다룬다 [새로운 연재 글 시리즈: TeX 토큰과 관련 개념—그런데 왜(그리고 어떻게)?](https://www.overleaf.com/blog/521-a-new-series-of-articles-tex-tokens-and-related-concepts-but-why-and-how) 그 글에서 언급했듯이, 이 연재 전반에서 우리는 Knuth의 원래 TeX 프로그램을 맞춤 빌드하여 얻은 통찰에 기반해 논의와 설명을 전개한다. 즉, 그것을 사용해 핵심 TeX 개념을 간단히 설명하고 따라가기 쉬운 해설을 제공하는 일련의 글을 만든다.

## 서론: 우리의 목표는 무엇인가?

이 글에서는 입력 파일의 문자에서 TeX 토큰의 실제 생성에 이르는 처리 과정을 추적하여 TeX 토큰이 정확히 무엇인지 알아본다. 실제로는 꽤 복잡하므로, 기술적 정확성을 유지하면서도 따라가기 쉽고 이해하기 쉽도록 과정을 핵심만 남겨 단순화했다.

먼저 몇 가지 중요한 TeX 내부 개념을 소개하겠다: *원시 명령*, *명령 코드* 및 *명령 수정자*거기서부터, 매우 간단한 매크로 예제를 사용해 TeX가 해당 명령을 정확히 어떻게 처리하는지 살펴본다 `\def` 그리고 TeX가 그 명령을 나타내기 위해 생성하는 결과 토큰을 살펴본다.

마지막으로 TeX가 문자를 나타내는 토큰을 어떻게 생성하는지, 그리고 한 문자의 `\catcode` 가 실제로 문자 토큰에 영구적으로 붙게 되는지 살펴본다. TeX 관련 서적에서 자주 언급되는 내용이지만, 여기서는 그것이 정확히 어떻게 이루어지는지 본다.

다음 그림은 우리가 요약할 여정을 보여 준다. 입력 텍스트에서 TeX 토큰까지:

![TeX 입력에서 TeX 토큰까지의 여정.](/files/5ba19149e5a98b040392af00d085a4f9b7bc4452)

## 하지만 먼저: 프리미티브와 명령 코드

모든 TeX 엔진(Knuthian TeX, pdfTeX, XeTeX, LuaTeX)은 여러 내장 명령, 이른바 *원시 명령*—TeX의 프로그래밍 가능성을 떠받치는 기본 구성 블록 명령들이다. 이들은 “프리미티브”라고 불리는데, 사용자 정의 매크로와 달리 다른 명령들로 구성된 것이 아니며 더 단순한 지시로 더 이상 축소될 수도 없기 때문이다. Knuth의 TeX에는 약 320개의 프리미티브가 있다. 다만 pdfTeX, XeTeX, LuaTeX 같은 다른 TeX 엔진들은 Knuth의 원래 프로그램에 새 명령을 추가했으므로, Knuth의 TeX 소프트웨어에는 없는 프리미티브도 포함하게 된다.

내부적으로 TeX는 모든 명령에 숫자형 *명령 코드* 을 부여한다. 사용자 정의 매크로이든 내장 프리미티브이든 상관없다. 이 명령 코드는 TeX 사용자가 접근할 수 있는 것이 아니라, 단지 TeX 처리의 내부 메커니즘의 일부일 뿐이다. 그러나 나중에 TeX 토큰을 논의할 때 알아두면 유용하다.

관련 기능을 가진 명령들의 집합은 같은 명령 코드를 공유한다. 예를 들어, `\def`, `\gdef`, `\edef` 및 `\xdef` 4개의 매크로 정의 프리미티브는 모두 매크로를 정의하는 데 사용되며 Knuth의 TeX에서는 명령 코드 97을 공유한다. 분명히 이 4개의 매크로 정의 명령은 각각 약간 다른 방식으로 매크로를 만들기 때문에, 처리 중에 TeX는 이들을 구분할 방법이 필요하다.

명령 코드 하나만으로는(예: 97) 어떤 매크로 생성 명령을 말하는지 알 수 없다. 따라서 예상하듯이, 각 TeX 명령에는 추가 정보가 부여되는데, 이를 *명령 수정자* 명령 수정자라고 한다(아래 예시 참조).

### 명령 수정자: 두 가지 유형

명령 수정자는 두 범주로 나뉘며, 여기서는 이를 “유형 1”과 “유형 2”라고 부르겠다. TeX는 이런 용어를 쓰지 않지만, 여기서는 그렇게 부르는 것이 편리하다:

* **유형 1**: 필요할 경우 TeX가 같은 명령 코드를 공유하는 명령들을 구분하는 데 사용할 수 있는 단순한 정수 값.
* **유형 2**: TeX의 메모리에서 해당 명령에 대한 정보를 찾아보러 가야 할 위치를 알려 주는 숫자 위치인 정수 값이다. 예를 들어, 이는 사용자 정의 명령(매크로)에 적용되며, 명령 수정자는 TeX에게 매크로 정의가 메모리의 어디에 저장되어 있는지 알려 준다.

#### 유형 1 명령 수정자(예시)

앞서 언급했듯이, Knuth의 TeX에서 매크로를 정의하는 네 개의 프리미티브 명령은: `\def`, `\gdef`, `\edef`, `\xdef` 모두 명령 코드 97을 공유한다. 이들은 다음 표에 나열된 명령 수정자를 통해 구분된다:

| 명령      | 명령\n코드 | 명령\n수정자 |
| ------- | ------ | ------- |
| `\def`  | 97     | 0       |
| `\gdef` | 97     | 1       |
| `\edef` | 97     | 2       |
| `\xdef` | 97     | 3       |

두 번째 예로, Knuth는 다음 명령들을 `\openout`, `\\write`, `\closeout`, `\special`, `\immediate` 및 `\setlanguage` TeX에 새 프리미티브를 추가하는 방법을 보여 주기 위한 순수한 “확장”으로 구현하기로 했다. 이 경우, 그 명령들은 사실 “유사한 기능”을 공유하는 것은 아니고, 단지 TeX 확장 방법을 설명하기 위해 Knuth가 함께 묶어 둔 것이다. 이 6개의 명령은 “확장”으로 분류되며 명령 코드 값 59와 함께 묶이지만, 각 명령은 다른 것들과 구별되도록 적절한 명령 수정자를 가진다:

| 명령             | 명령\n코드 | 명령\n수정자 |
| -------------- | ------ | ------- |
| `\openout`     | 59     | 0       |
| `\\write`      | 59     | 1       |
| `\closeout`    | 59     | 2       |
| `\special`     | 59     | 3       |
| `\immediate`   | 59     | 4       |
| `\setlanguage` | 59     | 5       |

#### 유형 2 명령 수정자(간단한 설명)

모든 명령 수정자가 정수이긴 하지만, 유형 2 수정자는 조금 더 설명이 필요하다. 이 명령 수정자들은 TeX에서 “포인터”라고 불리는데, 이는 TeX가 그 명령에 대한 추가 정보를 찾을 수 있는 메모리 위치를 가리키기 때문이다. 다소 모호하게 들릴 수 있지만, TeX가 이러한 포인터를 사용해 정보를 찾는 방식은 매우 다양하며, 더 자세한 설명은 이 글의 핵심 목적에서 벗어나게 된다. 한 가지 예가 도움이 된다: 매크로. 매크로 명령이 정의되면 TeX는 그 치환 텍스트를 어딘가 메모리에 저장해야 한다. 아래에서 보겠지만, 사용자 정의 매크로는 111에서 114 사이의 명령 코드를 가지며, 명령 수정자는 메모리 안의 포인터로서 TeX에게 그 치환 텍스트(매크로 정의)가 저장된 위치를 알려 준다.

### 명령 코드: 확장 가능 및 확장 불가능

Knuth의 TeX 소스 코드에서 명령 코드는 0에서 120까지 다양하다. 이 범위 안의 일부 코드는 순수하게 전문적인 내부 용도로만 쓰이며, 사용자에게 접근 가능한 명령에는 할당되지 않는다는 점에 유의하자. pdfTeX, XeTeX, LuaTeX 같은 다른 TeX 엔진들은 Knuth의 원래 집합에 새 명령을 추가했으며, 더 많은 프리미티브와 그에 대응하는 명령 코드를 포함하게 된다. 그러나 여기서 설명한 원리는 Knuth의 소스 코드에서 파생된 모든 TeX 기반 엔진의 핵심이다.

명령 코드의 집합은 두 가지 주요 집합으로 나뉜다:

* *확장 불가능한 명령*: 명령 코드가 100 이하이다;
* *확장 가능한 명령*: 명령 코드가 100보다 크고 최대 120까지이다. 101에서 120까지의 범위에는 사용자 정의 매크로와 다음과 같은 명령이 포함된다. `\csname`, `\\expandafter` 및 `\the`.

확장 불가능한 명령은 보통 내부 매개변수에 값을 할당하거나, 직접 조판 가능한 재료를 생성한다. 확장 가능한 명령은 보통 TeX의 현재 처리 흐름에 토큰의 흐름을 “주입”하거나 토큰 처리 순서를 바꾼다.

앞서 언급했듯이, 모든 매크로(사용자 정의 명령)는 111에서 114 사이의 명령 코드를 부여받는다. 서로 다른 값은 매크로가 다음 중 무엇으로 정의되었는지를 반영한다. `\long`, `\outer`둘 다, 또는 둘 다 아님. 예시는 다음과 같다:

| 매크로 유형            | 예제                             | 설명                  |
| ----------------- | ------------------------------ | ------------------- |
| long 아님, outer 아님 | `\def\ohyeah{....}`            | `\ohyeah` 명령 코드=111 |
| long, outer 아님    | `\long\def\ohyeah{....}`       | `\ohyeah` 명령 코드=112 |
| long 아님, outer    | `\outer\def\ohyeah{....}`      | `\ohyeah` 명령 코드=113 |
| long outer        | `\long\outer\def\ohyeah{....}` | `\ohyeah` 명령 코드=114 |

명령 수정자에 대해 다시 상기하자면, 매크로가 정의되면 TeX는 그 매크로의 정의를 메모리의 어떤 위치에 저장한다. 그 위치(포인터)는 매크로 명령의 명령 수정자가 되며, 매크로가 어떤 방식으로 정의되었는지에 따라 111에서 114 사이의 명령과 함께 저장된다. 사용자 정의 매크로에 실제로 붙은 이름은 크게 중요하지 않다. 입력 처리가 끝나면 그것들은 모두 111\~114 사이의 명령 코드가 부여되고, 궁극적으로는 TeX가 입력에서 읽는 모든 명령이, 프리미티브이든 사용자 정의 매크로이든, 결국 다음이라 불리는 숫자 표현으로 변환된다. *토큰*.

## 입력 텍스트에서 TeX 토큰까지의 여정

이 절에서는 매우 간단한 매크로 예제를 사용해 TeX가 다음 명령을 정확히 어떻게 처리하는지 살펴본다. `\def` 다음을 나타내는 토큰을 만들기 위해 `\def` 명령을 처리하는지. TeX의 세부 처리 과정은 매우 복잡할 수 있으므로, 복잡성을 더하고 여정에서 주의를 흐트러뜨릴 수 있는 매크로 매개변수나 구분자는 사용하지 않는다.

TeX 입력 파일에 다음 줄이 들어 있다고 가정하자:

```latex
\def\ohyeah{Overleaf is cool!}
```

TeX가 이 입력 줄을 처리하기 시작하면 각 문자의 `\catcode` 를 확인하고 첫 번째 문자가 `\` (의 첫 번째 문자)임을 본다. `\def`그것은 내부 표에서 찾아보아 `\` 가 `\catcode` 0을 가지고 있음을 감지하는데, 이는 그것이 *제어 시퀀스*의 시작을 알린다는 뜻이다. 물론 어떤 문자든 재정의하여 `\catcode` 0을 가지게 할 수 있지만, 여기서는 일반적인 plain TeX 또는 LaTeX의 정의를 사용한다고 가정하겠다.

엄밀히 말하면, 용어 *제어 시퀀스* 에는 두 개의 하위 범주가 있다: *제어 단어* 및 *제어 기호*:

* *제어 단어*: `\catcode` letter(11)인 문자들의 연속;
* *제어 기호*: `\catcode` 는 *작동하지* letter(11)인 단일 문자.

이 시점에서 `\` 문자는 자기 일을 마쳤고 이제 역할이 끝났다. TeX는 이스케이프 문자를 감지하면, 이후의 모든 문자를 읽기 시작하여 제어 단어 또는 제어 기호를 찾으려 한다.

초기 `\`뒤에, TeX는 곧바로 `d`를 감지한다. 즉, `\catcode` 가 11인 문자로서 TeX에게 그것이 *제어 단어*의 첫 글자를 찾았음을 알려 준다. *작동하지* 가 `\catcode` 그 뒤의 문자들을 계속 스캔하다가 마침내 `\`letter(11)가 아닌 문자를 발견할 때까지 진행한다. 초기 `\catcode` 이후의 모든 문자 중

TeX가 기꺼이 스캔을 이어 가다가 초기 `\` 의 `\ohyeah` 에 이르는데, 그 문자 역시 `\catcode` 0을 가진다. TeX는 자신이 너무 멀리 스캔했음을 알아차리고, 정중하게 그 `\` 를 텍스트 스트림으로 되돌려 놓아 이후 텍스트를 더 스캔할 때 다음에 보게 될 문자가 되게 한다. 이 시점에서 TeX는 문자열(`def`)를 확인했으며, 그것이 세 개의 문자로 이루어진 제어 단어의 텍스트를 구성한다고 알고 있다. 각 문자는 `\catcode` 11 (`d`, `e` 및 `f`)를 가진다. 이제 TeX가 해야 할 일은 `def` 가 무엇을 의미하는지, 즉 무엇을 해야 하는지 알아내는 것이다. 짐작했겠지만, TeX는 `def` 에 대한 명령 코드와 명령 식별자를 찾아 이 명령에 대해 무엇을 할지 파악해야 한다.

## 이를 해시로 만들기

제어 단어(`def`)를 감지하면, TeX가 가장 먼저 하는 일은 문자들의 문자열(`def` 우리 예제의 경우)를 해싱 함수라고 불리는 것을 사용해 정수로 “변환”하는 것이다. 세부사항을 너무 걱정할 필요는 없고, 개략만 알면 충분하다. 본질적으로 TeX는 방금 감지한 제어 단어의 모든 문자를 살펴보고, 각 문자의 ASCII 코드 값(XeTeX/LuaTeX의 경우 Unicode 값)을 사용해 해시 값이라고 불리는 숫자를 계산한다. 그것은 단순한 정수일 뿐이다.

이 해시 계산 과정의 일부로 TeX는 새로 감지한 제어 단어의 문자 문자열이 이미 자신에게 알려진 것인지도 확인한다. 프리미티브이든 사용자 정의 매크로이든 모든 명령의 사람이 읽을 수 있는 텍스트는 내부 저장 영역인 *문자열 풀*에 저장된다. TeX가 이렇게 해야 하는 이유는 어떤 명령의 사람이 읽을 수 있는 이름을 출력해야 할 수도 있기 때문이다. 예를 들어 TeX가 오류를 보고하면서 문제를 일으킨 명령의 이름을 제시해야 할 때 그렇다. 예를 들어, 우리의 매크로 `\def\ohyeah{Overleaf is cool!}` 는 다음이라는 새 명령을 정의하고 있다. `\ohyeah` 그리고 TeX는(나중 단계에서) `ohyeah` (*없이* 초기 `\` 문자)뿐 아니라, 나중에 오류 보고(또는 다른 작업)에 사용할 필요가 생길 경우를 대비해 텍스트 문자열(사람이 읽을 수 있는 형식)도 저장해야 한다.

TeX의 문자열 처리 과정에 대해 더 자세한 설명이 필요하다면, 나는 내 [개인 블로그 사이트](http://www.readytext.co.uk/?p=3590).

에 이것에 대해 글을 썼다. `def` 결과적으로 명령을 나타내는 문자들의 문자열 `d`, `e` 및 `f` 는 1218이라는 숫자 값으로 바뀐다(이것이 TeX가 실제로 계산한 값이다). 이 시점에서 개별 문자 *토큰*는 더 이상 이야기의 주인공이 아니다. 입력에서 읽혔고 자기 역할을 다했기 때문이다. 이제부터는 정수와 *—곧 토큰이 정확히 무엇인지 보게 될 것이다! 내부적으로 TeX는 이러한 해시 값 숫자를* 이라고 부르지만, 소스 코드에서는 그 용어가 다음이라는 변수명으로 줄어든다. `curcs`TeX의 소스 코드는 매우 짧고, 종종 다소 암호 같은 변수명들로 가득하다.

그렇다면 TeX는 *실제로 무엇을 할까* 이 새로 만들어진 1218이라는 정수값으로? TeX는 원래 문자열 `def`가 이제 1218이라는 정수로 표현되는데, 그것이 사실은 매크로를 정의하라는 지시를 가리킨다는 것을 어떻게 알아낼까? 답은 TeX가 일종의 내부 “서류 캐비닛”을 가지고 있어서, 현재 알고 있는 모든 명령의 현재 의미와 값을 저장한다는 것이다. 그 명령이 사용자 정의 매크로이든 내장 프리미티브이든 상관없다. TeX가 굳이 `def` 를 해시 값 1218로 변환한 이유(이제 다음이라는 변수에 저장됨)는 `curcs`을 찾아보기 위해서이다. 물론 TeX는 입력에서 감지하는 모든 제어 단어에 대해 이 해시 계산 과정을 반복한다. 물론 서로 다른 제어 단어는 해싱 함수에서 서로 다른 정수 값을 내놓는다. 그것이 바로 핵심이다. *의미를* 의 `def`TeX의 내부 “서류 캐비닛”은

등가표 *라고 불리며* 다음 절의 주제이다.

### 등가표 살펴보기

정리해 보면, 지금까지 배운 내용을 살펴보자:

* `\` 는 제어 시퀀스의 시작을 알린다(즉, *제어 기호* 또는 *제어 단어*).
* 첫 번째 문자 뒤의 `\` 가 `\catcode` 11(letter)이면 그것은 *제어 단어*.
* 수직 *제어 단어* TeX는 이후의 모든 입력 문자들 중 `\catcode` 11을 가지는 것들을 검사하며, 처음으로 그렇지 않은 문자를 찾는 즉시 스캔을 멈춘다. *작동하지* 가 `\catcode` 11이라는
* 뒤에 오는 입력 문자 문자열은 `\`를 사용자 가 입력한 것으로 간주한다. 즉, TeX에게 “무언가를 하라”고 요청하는 명령이다. `\catcode` 이 “무언가를 하라”는 과정을 시작하기 위해 TeX는 제어 단어 안의 문자 문자열을 정수로 변환한다. 이는 정수를 출력하는 이른바 해싱 함수를 사용해서 수행된다. *제어 단어* 해싱 함수에서 계산된 정수)를
* 라고 부르지만, TeX는 그것에 더 짧은 이름인
* 를 붙인다. *—곧 토큰이 정확히 무엇인지 보게 될 것이다! 내부적으로 TeX는 이러한 해시 값 숫자를*현재 제어 시퀀스 `curcs`.
* 우리 예제에서 제어 단어 `def` 는 1218이라는 값으로 변환되며, 이것은 다음이라는 변수에 저장된다. `curcs`: 즉, `curcs=1218`.

이제 TeX는 새로 감지한 *—곧 토큰이 정확히 무엇인지 보게 될 것이다! 내부적으로 TeX는 이러한 해시 값 숫자를* 가 실제로 무엇을 의미하는지 알아내야 한다. TeX는 그것으로 무엇을 할까?

#### 그룹화에 대한 메모: 정보를 저장하고 복원할 필요성

여기서는 TeX가 정보를 저장하고 복원할 수 있다는 점, 즉 어떤 형태의 내장 “기억”을 가지고 있다는 점을 다시 떠올리기 위해 잠시 옆길로 새 보겠다.

가장 단순한 매크로라도 한 번 작성해 본 사람이라면 TeX의 그룹화 메커니즘을 알고 있어야 한다. 예를 들어 `\def` 를 사용해 그룹 안에서 매크로를 만들 수 있다. 만약 `\global` 접두사를 `\def`로 생성된 매크로에 그룹 안에서 정의된 것을 적용하지 않으면, 그 매크로의 값이나 의미는 그 그룹(및 그 하위 그룹) 안에서만 유지되고, 그룹이 끝나면 정의는 사라진다. 예를 들어, 다음과 같이 그룹 안에서 간단한 매크로를 정의했다고 하자:

```latex
{\def\foo{Hello}}
```

그리고 `\foo` 를

```latex
{\def\foo{Hello}}% \foo는 그룹 안에서 정의됨(\global를 사용하지 않음에 유의)
\foo %<--- 더 이상 정의되지 않음, 이제는 undefined
```

그러면 사랑받는 오류 메시지를 보게 된다: `정의되지 않은 제어 시퀀스`. `\foo` 는 자신이 정의된 그룹(및 그 하위 그룹) 안에서만 의미를 가진다. 게다가 그룹 안에서 매크로를 다시 정의하면, 새 값은 그룹이 끝날 때 사라질 수 있고, 대신 그룹 밖에 존재하던 이전 의미가 복원된다.

```latex
\def\foo{Goodbye}
\foo\par% Goodbye를 출력
{\def\foo{Hello}% 그룹 내부에서 다시 정의:
{2단계 그룹 내부: \foo\par}}% 2단계 그룹 내부에서 사용: \foo는 Hello를 출력
그룹 밖에서는 이전 값이 복원됨: \foo\par% Goodbye를 출력
```

이 간단한 예시들의 목적은 TeX에 어떤 종류의 “저장 메커니즘” 또는 명령의 “의미”를 저장하고/복원하는 “기억”이 있다는 점을 가리키는 데 있다. 물론 그렇다. 이전 절에서 이것을 암시했다. 그 “저장 메커니즘” 또는 “서류 캐비닛”은 다음이라고 불리는 큰 내부 표이다. *라고 불리며*그 안에 TeX는 현재 알고 있는 모든 명령—내장 프리미티브와 사용자 정의 매크로—의 현재 의미나 값을 저장한다.

### 등가표: 비유를 통해

등가표를 설명하기 위해 비유를 들어 보자. 우리는 각 서랍이 고유한 정수로 라벨링된 수천 개의 작은 서랍이 있는 서류 캐비닛이라는 개념을 계속 사용할 것이다. 처리의 이 시점에서 TeX는 사실상 이렇게 말한다:

“좋아, 방금 계산해서 다음이라는 변수에 저장한 1218이라는 정수값이 있다. `curcs`이제 그게 무엇을 의미하는지 알아봐야겠다. 그러려면 서류 캐비닛의 1218번 서랍을 열어 안에 뭐라고 적혀 있는지 확인하면 된다.”

TeX는 1218을 사용해 정확한 서랍을 찾고, 거기서 TeX 소스 코드에서 사용되는 이름을 가진 세 가지 정보가 적힌 작은 메모를 발견한다:

* **`eq_level:`** 이 항목이 정의된 그룹화 수준(수준 1 = 전역적으로 정의됨). 앞서 그룹화의 효과를 보았다. 등가표 안에 바로 그 그룹화 수준 정보가 저장된다;
* **`eq_type:`** 이 항목의 명령 코드;
* **`equiv:`** 이 항목의 현재 “값”이다. 앞서 언급한 명령 수정자 같은 단순한 정수일 수도 있고, 메모리의 어떤 영역을 가리키는 포인터일 수도 있다. 예를 들어 매크로 정의를 나타내는 토큰들의 모음이 저장된 메모리 위치가 이에 해당한다.

따라서, 1218이라는 해시 값(다음이라는 변수에 저장된)은 사실상 `curcs`이 *키* 로 사용되어, 우리가 원래 문자 문자열 `\def`.

로 입력한 명령의 현재 의미와 값을 담고 있는 서랍에 접근하게 된다. `eq_type` 은 TeX 프로그램 소스 코드 안에서 다음이라는 변수를 사용해 저장된다. `curcmd` 그리고 `equiv` 의 값은 다음이라는 변수에 저장된다. `curchr`.

### 등가표는 def에 대해 무엇이라고 말하는가?

앞서 언급했듯이, 어떤 명령에 대해 계산된 해시 값은 다음이라는 변수에 저장된다. `curcs`; 따라서 `def` 우리는 `curcs=1218`에 대해서는 다음과 같다. 등가표의 1218 위치를 보면 TeX는 다음 정보를 찾게 된다:

* `curcmd`=97. 이것은 `\def`;
* `curchr`의 명령 코드이다. `\def`.

`\def` =0. 이것은 `eq_level=1` 로, `\def` 의 의미가 전역적으로 정의되어 있으며 더 낮은 그룹화 수준에 국한되지 않음을 나타낸다. 내부적으로 `eq_level` 의 값은 TeX의 그룹화 메커니즘에서 매우 중요한 역할을 하지만, 여기서는 더 다루지 않겠다.

다음 그림은 지금까지 설명한 내용을 요약한다:

![TeX 입력에서 TeX 토큰까지의 여정.](/files/5ba19149e5a98b040392af00d085a4f9b7bc4452)

## 명령에 대한 TeX 토큰

위의 설명을 하나씩 따라오고 나면, 제어 시퀀스에 대한 TeX 토큰의 실제 계산은 사실 매우 단순하다는 것을 알 수 있다. TeX는 해시 함수에서 얻은 `curcs` (1218) 값을 사용해 다음이라고 부르는 단순한 정수를 만든다. *토큰*토큰 `curcs` 를 생성하는 계산은 다음과 같다:

```c
curtok = 4095 + curcs
```

TeX는 현재 토큰(가장 최근에 계산된 값)을 다음이라는 변수에 저장한다. `curtok`.

따라서 결론적으로, 다음을 나타내는 TeX 토큰은 `\def` 명령의 일반 형식은 `4095 + 1218 = 5313`입니다. 그리고 명령 시퀀스를 나타내는 TeX 토큰은 이로써 끝이다. 해시 테이블 값에 4095를 더해 계산한 단순한 정수일 뿐이다.

## 문자를 위한 TeX 토큰

TeX가 문자를 나타내는 토큰을 만들어야 할 때는 다음과 같이 마찬가지로 간단한 계산을 사용한다:

```c
curtok = 256*catcode + (문자의 ASCII 값)
```

LuaTeX 같은 유니코드 인식 엔진에서는 약간 다른 계산이 사용된다는 점에 유의하자.

예를 들어, `\catcode` 10과 ASCII 값 32를 가진 공백 문자를 나타내는 TeX 토큰은 다음과 같다:

```c
256*10 + 32 = 2592
```

### 문자를 포함하는 토큰 리스트

예를 들어 다음과 같이 간단한 토큰 리스트를 만들면,

```latex
\toks100={Hello}
```

TeX는 다음 토큰 목록을 만들고 나중에 사용할 수 있도록 메모리에 저장한다:

* H→ 256 × 11 + 72 = 2888
* e→ 256 × 11 + 101 = 2917
* l→ 256 × 11 +108 = 2924
* l→ 256 × 11 +108 = 2924
* o→256 × 11 + 111 = 2927

TeX의 메모리 깊숙한 곳에서 토큰 레지스터 100은 “Hello”의 저장 위치에 대한 접근을 제공하며, 이것은 5개의 토큰 값 2888, 2917, 2924, 2924, 2927로 저장된다. 이 토큰들은 각 문자의 ASCII 코드와 문자의 `\catcode`가 토큰으로 바뀌는 시점(토큰화되는 시점)의 값을 결합한다. 문자가 문자 토큰으로 변환되면, 그 문자의 `\catcode` 값은 영구적이 되며 토큰 안에 저장되어, 사용자가 예를 들어 `\the\toks100`.

라고 말할 때 나중에 사용할 수 있게 된다. `앞서 언급했듯이, 문자 토큰은 다음으로 계산된다.` 256\*catcode + (ASCII 값) `반면 제어 시퀀스 토큰은 다음으로 계산된다.` 여기서 `curcs` 는 TeX가 입력에서 감지한 제어 단어(사용자가 입력한 명령의 텍스트 문자열)의 해시 값이다. 문자 토큰은 항상 4095보다 작다는 점에 주목할 만하다. 따라서 TeX는 특정 토큰이 제어 시퀀스(명령)인지 문자인지를 쉽게 판별한 뒤, 그 토큰에 인코딩된 제어 시퀀스나 문자와 `\catcode` 쌍이 무엇인지 알아낼 수 있다.


---

# 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/53-what-is-a-tex-token.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.
