> 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/05-an-introduction-to-endlinechar-how-tex-reads-lines-from-text-files.md).

# \endlinechar 소개: TeX가 텍스트 파일에서 줄을 읽는 방법

인간은 텍스트 파일을 줄 단위로 보고 편집하는 것을 선호합니다. 한 줄의 텍스트가 충분히 길다고 생각하면 그 줄의 끝을 알리기 위해(텍스트 편집기에서) “return”을 누릅니다. 내부적으로 텍스트 편집기는 이를 추가하라는 지시로 해석합니다 [줄바꿈 문자](https://en.wikipedia.org/wiki/Newline) 당신이 줄을 끊기로 결정한 지점에.

하지만 그렇게 단순하기만 하면 좋겠지만, 문제는 운영 체제마다 무엇이 줄바꿈 문자를 구성하는지에 대한 개념이 서로 다르다는 점입니다. 설상가상으로 Windows는 파일이 이른바 [*바이너리 모드* 또는 *텍스트 모드*](https://docs.microsoft.com/en-us/cpp/c-runtime-library/text-and-binary-mode-file-i-o?view=vs-2017). 그 결과 호스트 운영 체제에 따라 텍스트 파일의 각 줄은 이른바 다음과 같은 문자 조합으로 끝날 수 있습니다 *캐리지 리턴* (ASCII/유니코드 문자 13) 그리고 *라인 피드* (ASCII/유니코드 문자 10): 다음으로 표기됩니다 `\r` 및 `\n` 각각입니다.

분명히, 시스템에 독립적이려면 TeX는 읽고 처리해야 하는 텍스트 파일 내에서 줄을 끝내는 데 사용되는 서로 다른 문자들로 인해 생기는 변동성을 다룰 방법이 필요합니다.

### TeX의 입력 버퍼

LuaTeX와 XeTeX를 포함한 TeX 엔진이 입력 파일을 읽는 방식은 전체 텍스트 파일을 메모리에 한꺼번에 읽어들이는 것이 아니라 한 번에 한 줄씩 읽는다는 사실에 놀랄 수도 있고 아닐 수도 있습니다. TeX 엔진이 처리하는 대부분의 텍스트 파일은 현대 기기에서 사용 가능한 메모리에 비하면 매우 작지만, 파일의 각 줄은 개별적으로 읽혀 작은 내부 버퍼에 저장됩니다. 물론 TeX가 한 줄을 읽고 저장하는 과정에는 몇 가지 추가적인 요소가 있습니다.

## “나는 내 방식대로 할 거야”—TeX의 \endlinechar 명령

TeX가 입력 파일에서 텍스트 한 줄을 더 읽을 때는 두 가지 “정리 작업”을 수행합니다:

* 줄 끝에서 발견되는 종료 줄바꿈 문자(\r 또는 \n)를 제거합니다. 즉, 텍스트 파일이 처음 디스크에 저장될 때 추가된 모든 줄 끝 문자를 제거합니다;
* 또한 줄 끝에서 발견되는 모든 뒤따르는 공백 문자도 제거합니다.

이 두 과정은 TeX가 실제로 줄 자체에 들어 있는 문자를 스캔하기 전에 일어납니다. 다음 처리 단계(스캔)를 준비하기 위한 일종의 “정리 작업”이라고 생각하면 됩니다. 따라서 줄을 읽는 과정의 이 초기 단계에서 TeX는 플랫폼에 종속된 모든 줄 끝 문자(그리고 뒤따르는 공백)를 제거한 상태입니다. 그렇다면 TeX는 그 줄이 어디서 끝나는지 어떻게 알(감지) 수 있을까요? TeX에는 또 하나의 “비밀 카드”가 있습니다: `\endlinechar` 명령을 사용해.

플랫폼에 따라 달라지는 줄바꿈 문자 문제를 피하기 위해 TeX는 다음 개념을 도입합니다: `\endlinechar`, 즉 TeX가 파일에서 방금 읽은 텍스트 줄의 맨 끝에 자체 줄 끝 문자를 삽입하는 데 사용하는 사용자 정의 가능한 매개변수입니다. 다시 말해, 이는 TeX가 실제로 문자를 스캔하기 시작하기 전에 일어나며, 줄에 들어 있는 실제 문자를 읽기(스캔) 시작할 준비를 하기 전 TeX의 “정리 작업”의 마지막 단계입니다.

TeX는 저장된 값을 사용하여 `\endlinechar` 자체 줄 끝 종료 문자를 추가합니다. 단, `\endlinechar` 가 적절하게 정의되어 있을 때에만 가능합니다. Knuth의 TeX에서는 그 값이 >-1 및 < 256이어야 한다는 뜻입니다. 일반적으로, `\endlinechar` 에는 13이라는 값이 할당됩니다. 이는 캐리지 리턴 문자로, 보통 다음으로 표기됩니다 `\r` 프로그래밍 문헌에서.

하지만 다음과 같이 작성하면 `\endlinechar=-1` 입력 어딘가에 두면 *다음번에* TeX가 파일에서 텍스트 한 줄을 읽을 때 *작동하지* 줄 끝에 추가 종료 문자를 더 이상 추가하지 않습니다. 따라서 입력은 당신이 다음을 다시 설정할 때까지 하나의 길고 연속적인 텍스트 문자열로 취급됩니다 `\endlinechar` 을 적절한 값으로—일반적으로 13으로(`\r`):

```latex
\endlinechar=13
```

TeX의 16개 카테고리 코드 중 하나(값 5)는 보통 다음이 삽입하는 “줄 끝” 문자를 식별하는 데 예약되어 있습니다 `\endlinechar` 삽입합니다. 이는 값이 `\endlinechar` 적절한 값으로 설정되어 있을 때에만 삽입됩니다.

## 줄 끝 처리 요약

이러한 세부 사항은 꽤 저수준이지만, 텍스트 줄 읽기를 다루는 매크로 작성에 대해 알아보고 싶은 사람이라면 흥미로울 것입니다.

1. TeX가 파일에서 한 줄을 읽을 때 먼저 모든 줄 끝 문자(`\r` 및 `\n`)를 파일이 저장될 때 텍스트 편집기가 추가한 것입니다. 또한:

* TeX는 줄 끝의 모든 뒤따르는 공백 문자도 제거합니다;
* TeX *작동하지* 뒤따르는 탭 문자(ASCII 문자 코드 9)를 제거합니다.

**덧붙임**: LuaTeX의 소스 코드 파일 중 하나, 즉 이 공백 제거를 수행하는 코드가 들어 있는 파일에는 다음과 같은 주석이 있습니다:

> (파일 `luatex.c`) “David Fuchs는 당시 일부 시스템, 예를 들어 IBM VM/CMS와 OS/360에서 고정 레코드 "줄"에 공백 패딩이 있었음을 고려할 때 TeX 문서의 이 \[공백] 제거는 이식성을 보장하기 위해 수행되었다고 언급합니다.”

3. (1)단계 후 TeX는 그 값이 \endlinechar에 저장된 추가 문자를 더합니다(삽입합니다. 단, 이것이 적절히 정의되어 있어야 합니다: >-1 및 < 256).
4. \endlinechar는 일반적으로 13이라는 값으로 설정됩니다(`\r`), 이는 (2)단계에서 추가되는 문자가 보통 문자 13(`\r`)—하지만 물론 매크로 프로그래밍을 통해 특별한 효과를 얻기 위해 \endlinechar를 다른 값으로 설정할 수 있습니다.
5. 입력 스캔 루틴이 다음 문자를 감지하면 `\r` (문자 코드 13)이 내부 버퍼의 끝에 있으면, TeX는 평소처럼 그것을 어떻게 처리할지 결정하기 위해 카테고리 코드를 확인합니다.
6. 문자 13 *보통* 는 카테고리 코드 값 5(“줄 끝”)를 가집니다. 물론 카테고리 코드가 변경되지 않았다면 그렇습니다. 일부 매크로는 정교한 처리를 위해 줄 끝 문자를 활성 상태로 만듭니다.
7. TeX의 내부 상태(실제로 무엇을 하고 있는지)에 따라 TeX는 줄 끝 문자(보통 `\r`, 카테고리 코드 5)를 공백 문자로 바꿀 수 있습니다. 이것이 줄 끝 문자가 공백이 되는 방식입니다.
8. 또한 TeX는 카테고리 코드 5를 가진 문자를 사용해 빈 줄을 읽었고 다음을 생성해야 할 때를 감지합니다 `\par` 토큰.

다음 그림은 (1)과 (2)단계, 즉 줄바꿈 문자와 뒤따르는 공백 문자를 제거하고 다음을 삽입하는 과정을 시각적으로 요약합니다 `\endlinechar` 입력을 스캔할 준비가 된 상태로.

![TeX가 \endlinechar를 사용하는 방법](/files/641d9095ec12e42f771d765670f772140eba2577)


---

# 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/05-an-introduction-to-endlinechar-how-tex-reads-lines-from-text-files.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.
