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

# \endlinechar入門：TeXがテキストファイルから行を読み取る仕組み

人間は、テキストファイルを1行ずつ表示・編集することを好みます。テキストの1行が十分に長いと考えたら、その行の終わりを示すために（テキストエディタで）「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)で開かれているかどうかによって改行文字の扱いが変わります。その結果、ホストOSによっては、テキストファイルの行は、次のような文字のさまざまな組み合わせで終端されることがあります。 *キャリッジリターン* （ASCII/Unicode の文字 13）と *ラインフィード* （ASCII/Unicode の文字 10）: で表され `\r` や `\n` にそれぞれ対応します。

明らかに、システムに依存しないためには、TeX には、読み取りおよび処理する必要のあるテキストファイル内で行を終端するために使われるさまざまな文字によって生じる曖昧さに対処する方法が必要です。

### TeX の入力バッファ

LuaTeX や XeTeX を含む TeX エンジンが、入力ファイルを1行ずつ読み込むことを知って驚くかもしれません。テキストファイル全体をメモリに読み込むわけではないのです。TeX エンジンが処理するほとんどのテキストファイルは、現代のデバイスで使えるメモリ量に比べればごく小さいものですが、ファイルの各行は個別に読み込まれ、小さな内部バッファに格納されます。とはいえもちろん、TeX における行の読み取りと格納の過程には、いくつかの追加のひねりがあります。

## 「やり方は自分流でいく」— TeX の \endlinechar コマンド

TeX が入力ファイルから次の1行を読み取るとき、2つの「整理作業」を行います:

* 行末にある終端の改行文字（\r または \n）を削除します。つまり、テキストファイルが最初にディスクへ保存されたときに付加されたすべての行末を取り除きます;
* また、行末にあるすべての後続スペース文字も削除します。

これら2つの処理は、TeX が実際に行そのものに含まれる文字の走査を開始する前に行われます。次の処理段階（スキャン）に備えた一種の「整理作業」と考えてください。つまり、行読み込み処理のこの初期段階で TeX は、プラットフォーム依存の行末（および末尾の空白）をすべて取り除いているのです。では、TeX はその行がどこで終わるのかをどうやって知る（検出する）のでしょうか。TeX にはもう1つ「切り札」があります。それが `\endlinechar` コマンド。

プラットフォーム依存の改行文字の問題を避けるため、TeX は次の概念を導入します。 `\endlinechar`、TeX がファイルから読み込んだばかりのテキスト行の末尾に、自身の行末文字を挿入するために使う、ユーザー定義可能なパラメータです。ここでも、これが文字の実際の走査を開始する前に起こる点に注意してください。つまり、行に含まれる実際の文字の読み取り（走査）を始める準備が整う前の、TeX の「整理作業」の最終段階です。

TeX は、次に格納された値を使って `\endlinechar` TeX 独自の行末終端文字を追加します。ただし、 `\endlinechar` が適切に定義されている場合に限ります。Knuth の TeX では、値が >-1 かつ < 256 でなければなりません。通常、 `\endlinechar` には 13 の値が割り当てられます。これはキャリッジリターン文字で、通常は `\r` とプログラミング文献では表記されます。

しかし、 `\endlinechar=-1` を入力のどこかに書くと、 *次に* TeX がファイルから1行のテキストを読み込むとき、 *実際の* 行末に追加の終端文字を付け加えなくなります。その結果、入力は、あなたが次の値にリセットするまで、1本の長い連続したテキスト文字列として扱われます。 `\endlinechar` を適切な値に。通常は 13（`\r`):

```latex
\endlinechar=13
```

TeX の16個のカテゴリコードのうちの1つ（値 5）は、「行末」文字を識別するために予約されています。これは通常、 `\endlinechar` を挿入する文字です。これは、 `\endlinechar` の値が適切に設定されている場合にのみ挿入されます。

## 行末処理の要約

これらの詳細はかなり低レベルですが、テキスト行の読み取りを扱うマクロの作成を探求したい人にとっては興味深いでしょう。

1. TeX がファイルから1行を読み取ると、まずすべての行末文字（`\r` や `\n`）を取り除きます。ファイルが保存されたときにテキストエディタによって追加されたものです。さらに:

* TeX は行末の後続スペース文字も取り除きます;
* TeX *終了しません* 末尾のタブ文字（ASCII 文字コード 9）を削除します。

**補足**：LuaTeX のソースコードファイルの1つで、スペースを取り除く処理のコードを含むものには、次の注記があります:

> （ファイル `luatex.c`）「David Fuchs は、この［スペース］削除は、当時のいくつかのシステム、たとえば IBM VM/CMS や OS/360 における固定長レコードの「行」でのスペースによるパディングを考慮し、TeX 文書の移植性を確保するために行われたと述べています。」

3. 手順 (1) の後、TeX は \endlinechar に格納された値を持つ追加の文字を（挿入して）加えます（ただし、\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/190f30bad5d536f223481aa673c6e91fe74e4f90)


---

# 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/ja/xiang-xi-ji-shi/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.
