> 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/23-how-does-latex-typeset-headers-and-footers.md).

# LaTeXは見出しとフッターをどのように組版するのでしょうか？

## LaTeXは見出しとフッターをどのように組版するのでしょうか？

### はじめに

見出しとフッターの変更方法を知りたい場合は、 [ヘルプページをご覧ください](/latex/ja/shu-shi-she-ding/02-headers-and-footers.md) この記事は、TeXエンジンとLaTeXが見出しとフッターを生成するために使う低レベルの仕組みを説明することに焦点を当てているためです。

* **注（更新）**：この記事では、2022年6月以前に使用されていたLaTeXの基本的なマーク機構を取り上げます。この時点で、LaTeXのマーク処理に関する、より汎用的で新しい実装が導入されました。 [LaTeXの新しいマーク機構の概要](https://www.latex-project.org/help/documentation/ltmarks-doc.pdf) をご覧ください。後方互換性のため、LaTeXは従来のマーク機構も引き続きサポートしています。TeXエンジンの動作について述べている記事の内容は、LaTeXのこれらの変更の影響を受けません。
* **注**：これらの議論では「LaTeX」「TeX」「TeXエンジン」という用語が通して使われるため、その意味を理解しておくと役立ちます。Overleafの記事 [名前に込められた意味：TeXのさまざまな流派へのガイド](/latex/ja/xiang-xi-ji-shi/55-what-s-in-a-name-a-guide-to-the-many-flavours-of-tex.md) で詳しく説明しています。

有用な背景や文脈を提供するため、まずはTeXベースの組版に関係するいくつかの低レベル領域の概観から始めます。これには、一時的な（内部）内容の保存、改ページ、組版構成が含まれます。議論は、本文のほかにいくつかの見出しとフッターを含む組版済みページを考えることで、簡潔化・単純化されています。図版（フロート）や脚注などのページ要素は扱いません。これらは、 *挿入*と呼ばれる複雑なTeX機構に関係しており、この記事の範囲をはるかに超えるからです。

まずは *ノード*という基本概念から始めましょう。これは、TeXエンジンが一時的な（内部）内容を保存するために使う基本構成要素です。

### 内容の保存に関するいくつかの注意点：TeXノード

基盤となるTeXエンジンは、段落、表、数式などの組版材料を生成するためにLaTeXコードを処理するとき、その内容を一時的に、LaTeXコードを処理しているTeXエンジンのメモリ内に保存する必要があります。組版済みの内容を保存するために、TeXエンジンは以下の連なりを使用します。 *ノード*ノードと呼ばれるものの [連結データ構造に関するWikipedia記事](https://en.wikipedia.org/wiki/Linked_data_structure)).

![TeXエンジンが連結ノードを使って内容を保存する仕組みの模式図](/files/5e2d36dc554cf05a8b190b88a4afecfcef06be47)

TeXベースの組版の基本要素、たとえば文字、グルー、ボックス、ペナルティ、カーニング、そして [*マーク*](#why-were-here-understanding-mark-nodes) などを挙げればきりがありませんが、それらを表すためにTeXエンジンはさまざまな *種類の* ノードを使います。ボックス用のノードのように、文字ノードのようなより単純なノード型より多くのデータを保存する必要があるものもあります。そのため、ノードによって大きさが異なり、メモリに保存するために必要なバイト数も多くなります。TeXについて読むと、 *文字ノード*, *グルーノード*, [*マークノード*](#why-were-here-understanding-mark-nodes) などの用語に出会うことがあります。これらは、TeXの組版要素を表すデータを保存するために割り当てられたメモリのかたまりに付けられた名前にすぎないと、今なら分かるはずです。

#### ここで扱うこと：マークノードを理解する

多くのノード型のうち、ここで説明する必要があるのは *マークノード* で、これは `\mark` コマンドを定義しようとする次の例で示されます：

```latex
\mark{保存する内容}
```

その `\mark` コマンドによって作成されます。このコマンドは、直接組版結果を生成するわけではありません。その引数 `*保存する内容*` は後で使うためにメモリに保存され、 *マークノード* が作成されて、 *保存する内容*のメモリ上の位置を格納します。後で見るように、 `\mark` コマンドは *特に* 見出しとフッターの生成を助けるために作られました。

によって作成されたマークノードは、 `\mark` コマンドによってページ内容に「埋め込まれ」、TeXエンジンが組版済みページ（本文）に見出しとフッターを追加する準備が整った、ページ構成の最終段階で利用されます。通常、 `*保存する内容*` にはページ番号や章・節のタイトルや番号など、見出しとフッターの構成要素となる情報が含まれます。

#### ε-TeXは \marks コマンドを追加する

[ε-TeXの第2版](https://texdoc.org/serve/e-TeX/0)は、Knuthの元のTeXに対する拡張であり、1998年に公開され、既存機能の強化とともに新しい機能も提供します。現在では、ε-TeXの強化機能のほとんどは、pdfTeX、LuaTeX、XeTeXといった主流のTeXエンジンに取り込まれています。TeXエンジンの [**`-etex`** コマンドラインオプション](/latex/ja/sononotopikku/44-tex-engine-command-line-options-for-pdftex-xetex-and-luatex.md) を参照してください。これはε-TeX拡張の使用を有効にします。

KnuthのオリジナルのTeXソフトウェアには、マークノードの「クラス」、つまり「種類」を1つだけ作成する \mark コマンドがあります。文書内に多数の \mark コマンドを含めることはできますが、それらはすべて同じ「種類」または「クラス」のマークノードを作成します。これらをグループ化したり分類したりする組み込みの仕組みはありませんでした。この制限は、pdfTeX、LuaTeX、XeTeXでサポートされている ε-TeX の拡張機能である \marks コマンドによって取り除かれました：

```latex
\marks n {保存する内容}
```

ここで `n` は整数（`0` <= `n` < `32768`）で、マークノードの *クラス*.

注：

* \marks 0 `を書くことは` （すなわち `n`=`0`）は、TeX本来の `\mark` コマンド
* を使うのと同義です。[ε-TeXは、各クラス（](#pre-output-checks-looking-for-mark-nodes)）のマークごとにマーク変数も導入しました（`n`後述 `\firstmarks n`, `\topmarks n` と `\botmarks n`）。選択したクラスのマーク変数を、特定の組版作業のためのマークデータを提供するのに使うことができます。
* LuaTeXは `n` を `65535`の最大値を拡大し、 $$2^{16}$$ マーククラス

### TeXがマークを使う理由

理解するために、 *なぜ* （そしてどのように）TeXエンジンが `\mark` （または `\marks`）コマンドを使って見出しとフッターを生成するのかを考えるには、ページの構成、つまり改ページを見つけて完成したページをPDFファイルに送り出す際のTeXエンジン機構の「癖」をいくつか理解する必要があります。実際には、これらのページ構成処理は複雑ですが、基本原理や概念は単純化して説明でき、マークの理解に役立つ十分な背景を与えられます。

TeXエンジンが段落、表、数式などの個々の内容項目の組版を終えると、内部ルーチン（ `build_page(...)`という関数）を呼び出し、それら新しく組版された項目を、メモリ上で現在構築中のページに追加しようとします。その新しい材料が構築中のページに追加されると、TeXは、その新たに追加された内容によって現在のページが「十分に埋まった」状態になったかどうかも確認します。ページがいっぱいなら、TeXは *改ページ*を作成でき、そのページ分の内容を最終処理（「パッケージ化」）に回し、その後PDFファイルへ出力します。

ページの最終的なパッケージ化（構成）段階の重要な機能の1つに、 *出力ルーチン* と呼ばれるものがあります。これは実質的には、ページの内容をPDFファイルへ送る準備ができるようにパッケージ化するために使われる、ユーザー定義のコマンド列です。「パッケージ化」作業の一例は見出しとフッターを追加することですが、出力ルーチンの使い方にはさまざまあります。たとえば、 [TUGboatのこの記事](https://tug.org/TUGboat/tb11-1/tb27salomon.pdf)を参照してください。出力ルーチンはTeXのかなり複雑な領域なので、ここでは詳しくは説明しません。ここでは、ページ構成の最終段階ではユーザー定義のコマンド列（まとめて *出力ルーチン*).

と呼びます）を使うことだけ覚えておいてください。では、TeXが長い段落を組版し、それを個々の組版行の連なりに分割する場合に何が起こるかを考えてみましょう。TeXは、その新たに組版された段落を行ごとに現在構築中のページへ追加したいと思いますが、もしかすると *いくつかの* その行のうちの一部だけ *が現在のページに収まるかもしれません。「ページ」とは、ここでは本文領域（ページ本文）を指しており、* 後で（出力ルーチンによって）追加される見出しやフッターのような他のページ要素は含みません。

段落の数行が現在のページに追加されたあと、ページが「十分に埋まった」状態になり、TeXが改ページを作る時点になることがあります。しかし、段落の *part* 一部しか *現在のページに載っていないため、「段落の余り」が残ります。この余りは後で使うために保存され、* 次の *ページ* 用に準備されます。次の図はこの考え方を示しています。段落の一部は *現在のページに載っていないため、「段落の余り」が残ります。この余りは後で使うために保存され、* 現在の

![ページ](/files/1c16344f6486b8df9f6edcc2afa6eb2800945aa6)

この段落の例は、TeXエンジンが、 *完全には*現在のページに収まらない内容の断片をしばしば処理（組版）することを示しています。なぜなら、その内容は改ページが必要になる点を超えているからです。TeXエンジンは、入力してから組版することで行分割を見つけること、つまり *段落全体* を対象にすることを思い出してください。そして、いくつかのアプリケーションとは異なり、段落を行ごとに組版する方式は採りません。言い換えると、TeXは、現在のページに収まるかどうかに関わらず *全体の* 段落を組版します（収まるかどうかは後で判断されます）。ちなみに、「まず全文を組版してから現在のページに追加する」という原則は、他の種類のTeX内容にも当てはまります。たとえば表は、.texファイルから完全に読み込まれ、現在のページに追加しようとする前に全文が組版されます。

段落例について言えば、その段落の完全なテキストは、 *そのテキスト内のコマンドも含めて*、完全に処理されています。つまり、TeXの組版処理はあなたの `.tex` ファイル内のある位置まで到達しているということです。変数値や保存されたパラメータ設定など、TeXエンジンの「現在の内部状態」は、その時点までに処理された材料、コマンドを含めて反映します。つまり、段落の終わりまでです。

段落全体は組版されたものの、その一部は現在のページに収まりきらず、「段落の余り」が *現在のページに載っていないため、「段落の余り」が残ります。この余りは後で使うために保存され、* ページ *用に保存されます。「段落の余り」を生み出したLaTeXコード（テキスト＋コマンド）の中で、TeXエンジンは* いくつでも

内部的に保存されているTeXエンジンの値や変数を変更するコマンドやマクロを呼び出せたはずです。つまり、TeXの「現在の状態」に変更を加えたということです。次の図は、TeXベースの組版のいくつかの側面に影響を及ぼす、非常に重要なTeXの「癖」を示しています。図の右側を見ると、メモリ内に現在保存されているすべての内容を構成するノードの表現があり、薄い灰色の領域には *ページ* ページ *現在のページに載っていないため、「段落の余り」が残ります。この余りは後で使うために保存され、* を形成するノードが含まれ、濃い灰色の領域は

![次のページを待っている内容も示しつつ、TeXが改ページを見つけるノードの位置を示す模式図](/files/ee90e8345b244c7eab4ea3fbc26de8a6e50b09f8)

TeXが「十分に埋まった」ページ（本文）を得ると、その内容を *出力ルーチン* へ渡すことを思い出してください。これはユーザー定義のコマンド列です。ほかにもいろいろありますが、出力ルーチンはページ本文に見出しとフッターを追加し、PDFファイルへ送り出す準備ができるようにページを仕上げます。

上の図は、TeXが、たとえば `\baselineskip` のような組版行の間のグルーの位置で改ページを行うことを選び、出力ルーチン—組み込みコマンドとユーザー定義マクロの列—を使って現在のページのパッケージ化を始める準備ができている場合を表しています。 *しかし*、現在のページを構成する内容（メモリ内に保存されている）に加えて、TeXはすでに *追加の材料*をあなたの `.tex` ファイルから *改ページを越えて* と *用に保存されます。「段落の余り」を生み出したLaTeXコード（テキスト＋コマンド）の中で、TeXエンジンは* 重要なページ関連の値や変数を変更するコマンドを含んでいた可能性があり、それがTeXの「現在の内部状態」に影響します。これには内部パラメータの値や、マクロによって保存されたデータが含まれます。

TeXが現在のページのパッケージ化を始めるとき、その「現在の内部状態」は *、* 改ページ位置までに組版されたすべてによって定まるわけではありません。TeXはすでに *その点を通り過ぎており* 、さらに追加の材料を処理しているからです。改ページが起こるファイル内の位置と、TeXが実際に `.tex` ファイルで到達している位置を考えると、保存データや変数値を含むTeXの対応する2つの内部状態は、かなり異なっている可能性があります。TeXの組版状態は通常、改ページが起こる位置より先に進んでいます。つまり、TeXの組版活動は *同期していません* 。これは出力ルーチンを通じて組版済みページを出力する処理とは同期していないということです。

#### 仮想例：誤った見出しの出し方

次の図は、仮想的なコマンド `\myheader` と `\myfooter` を示しています。これらは、見出しとフッターの望ましいテキストを保存するために使われます。たとえば、次のような基本定義を用います。

```latex
\newtoks\headertoks% 見出しテキスト用の新しいトークンリスト変数
\newtoks\footertoks% フッターテキスト用の新しいトークンリスト変数
% 保存された見出しまたはフッターのデータが
% どこからでも参照できるように、
% 出力ルーチンのコマンドも含めて
\newcommand{\myheader}[1]{\global\headertoks={#1}}
\newcommand{\myfooter}[1]{\global\footertoks={#1}}
```

で、 `\headertoks` と `\footertoks` は、見出しとフッターのテキストを保存するために使われるトークンリストです。

さらに、この仮想例には、現在の `\myheader` と `\myfooter`の現在値から見出しとフッターのテキストを取得する出力ルーチンもあります。図に示すように、現在のページへ向かう内容の中では、 `\myheader` と `\myfooter` が適切な（正しい）値を設定します。しかし、 `\myheader` や `\myfooter` が改ページをまたぐ段落の中で呼び出されることはあり得ます。TeXはその段落全体を処理しなければならないため、 `\myheader` と `\myfooter` が再び呼び出されて、"TeXの内部状態"に保存された見出し／フッターのテキストがリセットされ、現在のページには正しくない値が生じます。出力ルーチンが見出しとフッターを生成すると、それらには次のページ向けのテキストが含まれてしまいます。

![出力ルーチンがTeXマクロだけを使って見出しとフッターのテキストを取得すると、誤った見出しとフッターが生成されることを示す図](/files/a99f2cf181195f26013c036dc8bfa3892409b492)

#### TeXの非同期動作：救いの \mark コマンド

TeXの組版（内容構成）活動は *同期していません* 。これは、出力ルーチンに含まれるコマンドを通じて組版済みページを出力する最終処理と同期していないということです。ページを出力する時点では、TeXの実際の内部状態は、そのページの改ページ位置で持っていたかもしれない状態より先に進んでいます。そこは、現在出力中のページで最後の内容片を組版した場所です。

『 [The TeXbook](https://www.amazon.co.uk/TeXbook-Donald-Knuth/dp/0201134489)』で、TeXの創始者Donald Knuthはこの状況を次のように述べています。

> … TeXの出力ルーチンは、ページ構成活動の後ろを追っている

このような同期していない関係のため、 *マーク機構*という形の「特別な仕組み」を `\mark` （または `\marks n`）コマンドを通して適用し、見出しとフッターに実際に出力されるページに関連した内容を確実に含める必要があります。 `\mark` コマンドは、ページ内容の中にマークノードを埋め込み、そのホストページの見出しとフッターに使える内容のメモリ位置を保存します。

よく知られた評価の高い書籍 [TeX by Topic](https://www.eijkhout.net/tex/tex-by-topic.html) の著者は、 `\mark` 機構

> を次のように説明しています。

その `\mark` … 出力ルーチンが、現在切り離されたページの内容、とくにその先頭と末尾に関する情報を得るための主要な機構。

![ページ本文の内容に埋め込まれたマークデータ（ノード）の模式図](/files/c0894e8cca1261567c6d04314d259cecd36a8c58)

### 出力前チェック：マークノードを探す

TeXエンジンが改ページ位置を決定したあと、内部ルーチン（ `fire_up()`と呼ばれる）を呼び出します。これは、出力ルーチンがページ構成を完了し、完成したページをPDFファイルに書き込む前に、かなり多くの前処理を行います。それらの前処理の重要な一部は、3つの *グローバルマーク変数*: `\botmark`, `\topmark` と `\firstmark` これらは、ヘッダーとフッターを作成するためのデータを提供するのに使われます。もちろん、1ページには複数のマークノードを含めることができますが、それらは次のように機能する3つのマーク変数を生成するためにフィルタされます。

* **`\botmark`** は、現在のページ区切りで有効なマークです。つまり、次の上で最後に見られたマーク *ページ* ページ
* **`\topmark`** は～の値です `\botmark` の *前の* ページ
* **`\firstmark`** は、次の上で最初のマークです *ページ* ページです。つまり、～の間で最初のマークです `\topmark` と `\botmark`

次の模式図は、3つのグローバルなマーク変数の値を決定するために、組版済みページ内容を前処理する基本原理を示しています `\botmark`, `\topmark` と `\firstmark`:

![\botmark、\topmark、\firstmark という3つのグローバルなマーク変数の値を決定するために用いられる基本原理の模式図](/files/92ce311dfb7c9b7a7b832dcf92f1bb8fd939f822)

次の節では、上で述べた説明の一部を用いて、LaTeX がヘッダーとフッターをどのように組版するかを概説します。

### LaTeX のクラス: ページスタイルとヘッダー/フッター

次のように書くと `\documentclass{*class*}` ここで `*class*` には例えば `article`, `book`, `report` または `letter`とすると、LaTeX は次の名前のファイルを読み込みます `*class*.cls`。たとえば、 `book.cls`, `article.cls` などです。これらの `.cls` ファイルには、すべての文書クラスに共通して存在し、提供されると期待されるさまざまなコマンドや機能の、クラス固有の変種を実装するための LaTeX コードが含まれています。つまり、すべての文書クラスで共有される振る舞いです。例としては、クラス固有のページレイアウト余白や、次のようなコマンドのクラス固有版が挙げられます。 `\section`, `\subsection` などです。

のもう1つの重要な要素は `.cls` ファイルには、標準のページスタイルをクラス固有に実装したものが含まれており、特定のクラスとページスタイルを使って作成される文書のヘッダーとフッターを定義します。たとえば、

* **`book.cls`** と **`article.cls`** それぞれ、次のページスタイルの実装を含んでいます `headings` と `myheadings`
* **`letter.cls`** には、次のページスタイルの定義が含まれています `headings`, `empty`, `plain` と、次の1つです `firstpage`
* **`report.cls`** には、次のページスタイルの定義が含まれています `headings` と `myheadings`

ページスタイルの実装は、しばしば `twoside` のオプションに依存します `\documentclass`—文書が片面印刷か両面印刷か—に応じて、左ページ（偶数ページ）と右ページ（奇数ページ）に対してヘッダーとフッターが適切に定義されるようにします。

文書クラスは、次の既定定義に依存することがあります `plain` または `empty` LaTeX の別の場所で提供されるページスタイルの—つまり `.cls` 使用中のファイルの外部にあるものです。

#### ページスタイルについてさらに

次を使ってページのスタイルを変更すると `\pagestyle{*somestyle*}` または `\thispagestyle{*somestyle*}` LaTeX は、次の名前の内部コマンドがあることを想定します `ps@*somestyle*`—通常は文書クラスによって提供されます `.cls` ファイル、または次のようなパッケージ `fancyhdr`。ちなみに、「内部コマンド」とは、LaTeX のソースコードの一部であり、名前に次の記号を含むコマンドを指します `@` 記号。通常は、その [カテゴリコード](/latex/ja/sononotopikku/43-table-of-tex-category-codes.md)).

の定義は `\ps@*somestyle*` そのページスタイルの機能/振る舞いを実装する役割を担っており、次の定義を提供することが含まれます。

* ページ組版の最終段階で使われるコマンド（ヘッダーとフッターを追加するためのもの。 [この記事の後半を参照](#commands-for-the-output-routine)):
  * `\@oddhead`
  * `\@oddfoot`
  * `\@evenhead`
  * `\@evenfoot`
* 節に関連するマークデータを挿入するコマンド。これは、節タイトル、番号などを含む文書のヘッダーとフッターを生成する際に使われます。たとえば、 `headings` ページスタイル（ `book.cls`内）では、次のマーク生成コマンドが定義されています。
  * `\chaptermark`
  * `\sectionmark`

ここでは [マーク生成コマンドをさらに見ていきます](#mark-commands-and-mark-data)。たとえば `\chaptermark`、あくまで例としてですが、次のように書くと `\chapter{chapter title}` その `\chaptermark` コマンドも実行され、後続のページヘッダー生成のために章に関連するマークデータが挿入されます。

#### ページスタイルに基づくヘッダー/フッターコマンドの解剖

この節では、ヘッダーとフッターを作成するために使われる中心的な LaTeX コマンド/処理のいくつかを、この記事の前半で示した説明や概念を踏まえて探ります。

**LaTeX におけるヘッダーとフッターの「モデル」**

LaTeX の（既定の）ヘッダーとフッターの内容は、文書の節の2層階層に基づいています。つまり、複数の「下位レベル」の節を含む「上位レベル」の節です。book クラスと article クラスでは、これは次のようになります。

* `**book**` **クラス**：「上位レベル」の節は次によって生成されます `\chapter` コマンドで、「下位レベル」の節は次によって生成されます `\section`。これは、多くの節を含む章を反映しています。
* `**article**` **クラス** （両面文書を想定）：「上位レベル」の節は次を使って生成されます `\section` コマンドで、「下位レベル」のものは次によって生成されます `\subsection`。これは、同じ節内に複数の小節が現れることを反映しています。

LaTeX は、節分けコマンドを通じてヘッダーとフッターの「モデル」を適用し、（次のコマンドを介して）マークノードを「挿入」します `\mark` コマンド）を使って、作成中の文書の節に関連するデータを保存します。たとえば、次のように書くたびに `\section{*some section title*}` 次の内容を含むマークノードが作成されます。それは `*some section title*` と節番号を反映したデータです。

LaTeX は、次の形式のデータを含むマークの仕組みを使います `{left}{right}`。最終的には次を介して生成されます `\mark` コマンド

```latex
\mark{{left}{right}}
```

ユーザーを低レベルの詳細から保護するよう設計されたマクロの層に包み込まれており、その詳細は本記事の後続の節で扱います。

#### bookクラスを探る

その `book.cls` ファイルが読み込まれると、その最後の処理の1つとして実行されるのは `\pagestyle{headings}` これは既定のページスタイルを `headings`ので、そのページスタイルを詳しく見ていきましょう。

前述の [とおり](#more-on-page-styles)、…の機能／属性は `headings` ページスタイルは、…によって実装される `book` クラスでは、（内部の）コマンド `\ps@headings` ファイルに含まれる `book.cls`。の正確な定義は `\ps@headings` 文書が片面印刷か両面印刷かによって異なります（ `book` クラス）。

**「マークコマンド」と「マークデータ」**

両面文書では、 `book` クラスでは、…の定義は `\ps@headings` 2つの「マークコマンド」を作成（定義）します： `\chaptermark` と `\sectionmark` これは、次の形式の「マークデータ」を生成します `{left}{right}`。これはヘッダーとフッターで使用します。これらのマークコマンドは、文書の節の階層に基づく、LaTeXのヘッダー／フッターのモデルを反映しています：

* 「上位レベル」の節コマンド（ここでは、 `\chapter`）は、左ページ（偶数ページ）のヘッダー用の「マークデータ」を提供するために使われます。新しい章を始めるときに、次のように書くと `\chapter{*chapter title*}`, `\chaptermark` が呼び出され、その新しい章を反映した「マークデータ」が作成されます。そこには `*chapter title*` の章タイトルと章番号が含まれます。
* 「下位レベル」の節コマンド（ここでは、 `\section`）は、右ページ（奇数ページ）用の「マークデータ」を提供するために使われます。次のように書くと `\section{*section title*}` その `\sectionmark` コマンドが呼び出され、その新しい節を反映した「マークデータ」が作成されます。そこには `*section title*` の節タイトルと節番号が含まれます。前の `\chapter` によって提供されたマークデータは、その後の \section コマンドの影響を受けません。

**\markboth と \markright**

LaTeXの節固有のマークコマンド、たとえば `\chaptermark` と `\sectionmark`、はさらに次の2つのコマンドを使います： `\markboth` と `\markright` これらが、ヘッダーとフッターの実際のマークデータを提供します。 `\markboth` や `\markright` には、ヘッダーやフッターのテキストを大文字化するなど、スタイル指定コマンドを含めることができます。

次を使って作成された文書では `book` クラスの既定値（両面印刷、 `headings` ページスタイル）では、マーク生成コマンドは次のように動作します：

* `\chaptermark` は次を使ってマークデータを生成します `\markboth`
* `\sectionmark` はマークデータを生成します `\markright`

`\markboth` と `\markright` はマクロであり、最終的にはプリミティブ（組み込みの低レベル） `\mark` コマンドを使って、節コマンド内で生成されたマークを実際に挿入します。

`\markboth` の形を取ります

* **`\markboth{left}{right}`**：次を使ってマーク（ノード）を挿入します `\mark{{left}{right}}` その結果、ブレースで囲まれた値のペアを含むマークノードが生成されます `{left}{right}`.

`\markright` の形を取ります

* **`\markright{newright}`**：次を使ってマーク（ノード）を挿入します `\mark{{currentleft}{newright}}`；つまり、現在の `右` を `newright` しかし、現在の `左` （すなわち `currentleft`）は変更されず、その結果、ブレースで囲まれた値のペアを含むマークノードが生成されます `{currentleft}{newright}`.

…の動作は `\markboth` と `\markright` 各章の中に複数の節を含む文書のような、2層の節階層をサポートします。

（両面） `book` 文書クラス（headingsページスタイルを使用）：

* `\chaptermark` 次を使います `\markboth` を設定するために：
  * ある `{left}` CHAPTER . を大文字で組版するフィールド。
  * 空欄の {right} フィールド（`{}`)
* `\sectionmark` 次を使います `\markright` を設定するために `{right}` マークフィールドを組版します。これも大文字です。

なぜそうなるのかを理解するには `\sectionmark` 次を使います `\markright` 、新しい各 `\section` コマンドが次のことを行うとわかります：

* この…のデータを含む新しいマークを挿入する `\section` （たとえば、そのタイトルと番号）。
* しかし *、* 現在の…のマークデータ値に影響を与える `\chapter` その特定の `\section` コマンドが現れる

このため、 `\section` コマンドは…を呼び出します `\sectionmark` これは次を使います `\markright` を使って…を作成します `\section`に関連するマークを作成します。これは `{right}` マークデータフィールドを更新しますが、現在の `{left}` マークデータフィールドの値には影響しません。これは現在の `\chapter`.

注：LaTeXのソースコードには次の注意書きがあります：

> マークコマンドは、左マーク内で「番号付けされる」右マークではかなりうまく機能します。たとえば、左マークは \chapter コマンドで変更され、右マークは \section コマンドで変更されます。ただし、同じページ上に 2 つの \markboth が現れると、やや異常な結果になります。

**出力ルーチン用のコマンド**

その `\ps@headings` コマンドは次のコマンドの定義を実装します

* `\@oddhead`
* `\@oddfoot`
* `\@evenhead`
* `\@evenfoot`

これらは、ページ組版の最終段階でヘッダーとフッターを追加するために出力ルーチンで使われます。たとえば、 `book.cls` を設定します `\@oddfoot` と `\@evenfoot` の値に `\@empty`、これは次のように定義されています `\def\@empty{}`。したがって `\ps@headings` 左ページと右ページのフッターが空になります：

```latex
\let\@oddfoot\@empty
\let\@evenfoot\@empty
```

ヘッダーは次のように定義されています：

```latex
\def\@evenhead{\thepage\hfil\slshape\leftmark}%
\def\@oddhead{{\slshape\rightmark}\hfil\thepage}%
```

ここで

* `\leftmark` を取り出します `{left}` の値を `{left}{right}` マークペアから
* `\rightmark` を取り出します `{right}` の値を `{left}{right}` マークペアから
* \thepage は現在のページ番号を出力します

要するに、これらの `\@evenhead` と `\@oddhead` の実装は次の結果を生みます：

* `\@evenhead`：ページ番号はヘッダーの左側に表示され、 `\leftmark`は、フォントコマンド `\slshape`でスタイル指定され、ヘッダーの右側に出力されます。その間の空白は、非常に柔軟な `\hfil` グルーによって与えられます。
* `\@oddhead`： `\rightmark`は、フォントコマンド `\slshape`の内容はヘッダーの左側に表示され、現在のページ番号はヘッダーの右側に出力されます。ここでも、その間の空白は `\hfil` グルーによって与えられます。

しかし、重要な疑問が残ります： *どの* `{left}{right}` マークペアが…によって使われるのか `\leftmark` と `\rightmark`：言い換えると、どこからマークデータの値を取得するのでしょうか？

前述の [とおり](#filtering) しかし [以下で説明します](#explainfiltering)。ページ組版の最終段階では、文書ページに含まれるすべてのマークが「フィルタリング」され、3つのグローバルマーク変数の値を設定するために使われます： `\botmark`, `\topmark` と `\firstmark`。 [LaTeXのマークの構造により](#latexs-model-of-headers-and-footers)、その3つのマーク変数のそれぞれは最終的に `{left}{right}` ある値のペアの `{left}` と `{right}` を含むことになります。そして、実際の `{left}{right}` マークペア（フィールド）を提供するのはこれらです `\leftmark` と `\rightmark`:

* `\leftmark` を取り出します `左` の値を `{left}{right}` によって提供されるマークペア（フィールド）から `\botmark`
* `\rightmark` を取り出します `右` の値を `{left}{right}` によって提供されるマークペアから `\firstmark`

注 `\markboth` と `\markright` には、ヘッダーとフッターのテキストを大文字化するなど、スタイル指定コマンドを含めることができます。

### 低レベルのLaTeXコマンドを用いた例

次の例では、本記事で述べた低レベル（内部）の LaTeX コマンド（@ 記号を含むもの）を再定義することで、ページスタイルやヘッダー／フッターを変更する方法を示します。ヘッダーとフッターの変更にこの方法を推奨しているわけではありませんが、必要な人（たとえばパッケージ作者）には利用できます。ヘッダーとフッターを変更するための推奨される方法は、 [`fancyhdr` パッケージ](https://ctan.org/pkg/fancyhdr?lang=en)、これは別の [Overleafヘルプ記事で解説されています](/latex/ja/shu-shi-she-ding/02-headers-and-footers.md).

#### 最小限のページスタイルを定義する

次の例では、非常に最小限の新しいページスタイル `demostyle` を定義します。これは静的テキストを使ってヘッダーとフッターを定義し、節コマンド（`\chapter`, `\section` など）にヘッダーとフッターの内容を設定させません。

この例は、まず次の文字のカテゴリコードを変更することから始まります `@` 。これにより、マクロ名の中で使えるようになります。 `\ps@demostyle` コマンドは、ヘッダーとフッターを生成するために（出力ルーチンで）使われるコマンドを再定義することで、この最小限のページスタイルを実装します： `\@oddhead`, `\@oddfoot`, `\@evenhead` と `\@evenfoot`。なお、 `twoside` オプションは、私たちの `\documentclass` 宣言で使用されています。これは `article` クラスを使います。

```latex
\documentclass[twoside]{article}
\catcode`@=11
\newcommand{\ps@demostyle}{%
\renewcommand\@oddfoot{\hfil The odd-page footer\hfil}%
\renewcommand\@evenfoot{\hfil The even-page footer\hfil}%
\renewcommand\@evenhead{\thepage\hfil The even-page header}%
\renewcommand\@oddhead{The odd-page header\hfil\thepage}}
\catcode`@=12
\title{Demonstrating a page style}
\author{Overleaf}
\date{August 2022}
\begin{document}
\pagestyle{demostyle}
\maketitle
\newpage
\section{はじめに}
\newpage
\section{More material}
\end{document}
```

[この例をOverleafで開く](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Creating+a+new+page+style\&snip=%5Cdocumentclass%5Btwoside%5D%7Barticle%7D%0A%5Ccatcode%60%40%3D11%0A%5Cnewcommand%7B%5Cps%40demostyle%7D%7B%25%0A%5Crenewcommand%5C%40oddfoot%7B%5Chfil+The+odd-page+footer%5Chfil%7D%25%0A%5Crenewcommand%5C%40evenfoot%7B%5Chfil+The+even-page+footer%5Chfil%7D%25%0A%5Crenewcommand%5C%40evenhead%7B%5Cthepage%5Chfil+The+even-page+header%7D%25%0A%5Crenewcommand%5C%40oddhead%7BThe+odd-page+header%5Chfil%5Cthepage%7D%7D%0A%5Ccatcode%60%40%3D12%0A%5Ctitle%7BDemonstrating+a+page+style%7D%0A%5Cauthor%7BOverleaf%7D%0A%5Cdate%7BAugust+2022%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bdemostyle%7D%0A%5Cmaketitle%0A%5Cnewpage%0A%5Csection%7BIntroduction%7D%0A%5Cnewpage%0A%5Csection%7BMore+material%7D%0A%5Cend%7Bdocument%7D)

#### bookクラスのヘッダーを変更する

次の例では、次を再定義することでbookクラスのヘッダーを変更します `\@oddhead` と `\@evenhead` そうすることで、左ページと右ページのヘッダーに現在のページ番号と章タイトルが入るようにします。2つ目の `\chapter` コマンドが、オプションの短い章タイトル `[The short title]` を使ってヘッダーテキストを提供し、長いタイトルではなくなります。

`\section` コマンドはヘッダー内容に影響しません。なぜなら、私たちのヘッダー再定義は `\leftmark` だけを使っており、これは現在の章の詳細を取得するからです。現在の節の詳細にアクセスするには `\rightmark` の定義で `\@oddhead` や `\evenhead`.

```latex
\documentclass{book}
% NB: category code of '@' temporarily changed to 11
% to enable its use in command names
\catcode `@=11
% Let \@oddfoot and \evenfoot be equivalent to \@empty
% to make them blank (empty)
\let\@oddfoot\empty\let\evenfoot\empty
% Redefine \@oddhead and \@evenhead
\renewcommand{\@oddhead}{\leftmark\hfil\thepage}
\renewcommand{\@evenhead}{\thepage\hfil\leftmark}
\catcode `@=12
% 扱いやすい小さなページサイズを使用
\usepackage[paperheight=16cm,paperwidth=12cm,textwidth=10cm]{geometry}
\title{Memoirs of a \TeX{} user}
\author{Overleaf}
\begin{document}
\frontmatter
\maketitle
これはローマ数字を使う前付けです。
\mainmatter
\chapter{Where do I start?}
第1章：短い章。
\newpage
\section{In the beginning...}
1つの節。
\chapter[The short title]{A chapter with a very long title, making it unsuitable for headers}
\newpage
\section{Another section}
内容はほとんどありません。
\newpage
\section{What, another section?}
こちらも内容はほとんどありません。
\end{document}
```

[この例をOverleafで開く](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Changing+headers+for+the+book+class\&snip=%5Cdocumentclass%7Bbook%7D%0A%25+NB%3A+category+code+of+%27%40%27+temporarily+changed+to+11%0A%25+to+enable+its+use+in+command+names%0A%5Ccatcode+%60%40%3D11%0A%25+Let+%5C%40oddfoot+and+%5Cevenfoot+be+equivalent+to+%5C%40empty%0A%25+to+make+them+blank+%28empty%29%0A%5Clet%5C%40oddfoot%5Cempty%5Clet%5Cevenfoot%5Cempty%0A%25+Redefine+%5C%40oddhead+and+%5C%40evenhead%0A%5Crenewcommand%7B%5C%40oddhead%7D%7B%5Cleftmark%5Chfil%5Cthepage%7D%0A%5Crenewcommand%7B%5C%40evenhead%7D%7B%5Cthepage%5Chfil%5Cleftmark%7D%0A%5Ccatcode+%60%40%3D12%0A%25+Use+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D10cm%5D%7Bgeometry%7D%0A%5Ctitle%7BMemoirs+of+a+%5CTeX%7B%7D+user%7D%0A%5Cauthor%7BOverleaf%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cfrontmatter%0A%5Cmaketitle%0AThis+is+frontmatter+which+uses+Roman+numerals.%0A%5Cmainmatter%0A%5Cchapter%7BWhere+do+I+start%3F%7D%0AChapter+1%3A+A+short+chapter.%0A%5Cnewpage%0A%5Csection%7BIn+the+beginning...%7D%0AA+section.%0A%5Cchapter%5BThe+short+title%5D%7BA+chapter+with+a+very+long+title%2C+making+it+unsuitable+for+headers%7D%0A%5Cnewpage%0A%5Csection%7BAnother+section%7D%0AWith+little+content.%0A%5Cnewpage%0A%5Csection%7BWhat%2C+another+section%3F%7D%0AAlso+with+little+content.%0A%5Cend%7Bdocument%7D)

#### ε-TeXの拡張マークコマンドを使う

その `book` クラスでは次の定義を使用します `\@evenhead` と `\@oddhead` ヘッダーを生成するために：

```latex
\def\@evenhead{\thepage\hfil\slshape\leftmark}
\def\@oddhead{{\slshape\rightmark}\hfil\thepage}
```

ここでコマンド `\leftmark` と `\rightmark` は次のように定義されています

```latex
\def\leftmark{\expandafter\@leftmark\botmark\@empty\@empty}
\def\rightmark{\expandafter\@rightmark\firstmark\@empty\@empty}
```

ε-TeXの拡張コマンドと、ε-TeXのマーククラス0と元のTeXコマンドとの等価性を利用して、次のことができます：

* を書き換える `\leftmark` を置き換えるために `\botmark` をε-TeXの `\botmarks0` に相当するものにし、
* を書き換える `\rightmark` を置き換えるために `\firstmark` をε-TeXの `\firstmarks0` に相当するもの

これらの再定義により

```latex
\renewcommand{\leftmark}{\expandafter\@leftmark\botmarks0\relax\@empty\@empty}
\renewcommand{\rightmark}{\expandafter\@rightmark\firstmarks0\relax\@empty\@empty}
```

次の使用に注意してください `\relax` は、TeXがさらに数字を探すのを終わらせるためのものです。代わりに `\relax` 空白を終端記号として使うこともできます。

次の例では、元の定義と同一の出力が生成されます `\leftmark` と `\rightmark`.

```latex
\documentclass{book}
% \leftmark と \rightmark を次のものを使うように再定義
% それぞれ \botmarks0 と \firstmarks0
% NB: category code of '@' temporarily changed to 11
% to enable its use in command names
\catcode `@=11
\renewcommand{\leftmark}{\expandafter\@leftmark\botmarks0\relax\@empty\@empty}
\renewcommand{\rightmark}{\expandafter\@rightmark\firstmarks0\relax\@empty\@empty}
\catcode `@=12
% 扱いやすい小さなページサイズを使用
\usepackage[paperheight=16cm,paperwidth=12cm,textwidth=10cm]{geometry}
\title{Memoirs of a \TeX{} user}
\author{Overleaf}
\begin{document}
\frontmatter
\maketitle
これはローマ数字を使う前付けです。
\mainmatter
\chapter{Where do I start?}
第1章：短い章。
\newpage
\section{In the beginning...}
1つの節。
\newpage
別の節。
\end{document}
```

[この例をOverleafで開く](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Using+%CE%B5-TeX%E2%80%99s+extended+marks+command\&snip=%5Cdocumentclass%7Bbook%7D%0A%25+Redefine+%5Cleftmark+and+%5Crightmark+to+use+%0A%25+%5Cbotmarks0+and+%5Cfirstmarks0+respectively%0A%25+NB%3A+category+code+of+%27%40%27+temporarily+changed+to+11%0A%25+to+enable+its+use+in+command+names%0A%5Ccatcode+%60%40%3D11%0A%5Crenewcommand%7B%5Cleftmark%7D%7B%5Cexpandafter%5C%40leftmark%5Cbotmarks0%5Crelax%5C%40empty%5C%40empty%7D%0A%5Crenewcommand%7B%5Crightmark%7D%7B%5Cexpandafter%5C%40rightmark%5Cfirstmarks0%5Crelax%5C%40empty%5C%40empty%7D%0A%5Ccatcode+%60%40%3D12%0A%25+Use+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D10cm%5D%7Bgeometry%7D%0A%5Ctitle%7BMemoirs+of+a+%5CTeX%7B%7D+user%7D%0A%5Cauthor%7BOverleaf%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cfrontmatter%0A%5Cmaketitle%0AThis+is+frontmatter+which+uses+Roman+numerals.%0A%5Cmainmatter%0A%5Cchapter%7BWhere+do+I+start%3F%7D%0AChapter+1%3A+A+short+chapter.%0A%5Cnewpage%0A%5Csection%7BIn+the+beginning...%7D%0AA+section.%0A%5Cnewpage%0AAnother+section.%0A%5Cend%7Bdocument%7D)

**ε-TeXに関する注記**

前述の [前述したように](#etex)、ε-TeXは次を導入します `\marks` コマンドを定義しようとする次の例で示されます：

```latex
\marks n {保存する内容}
```

これは元の…を拡張する `\mark` KnuthのTeXエンジンの機能であり、主要な3つのTeXエンジン（pdfTeX、LuaTeX、XeTeX）すべてで利用できます。

ε-TeXの実装では、新しいグローバルマーク変数も導入されます `\firstmarks n`, `\botmarks n` と `\topmarks n`：各クラスごとに1つ `n`。これらのクラスベースのマーク変数は [上で説明した仕組みによって決まります](#pre-output-checks-looking-for-mark-nodes)、そしてどれもヘッダーとフッターの生成に使えます。

次のいずれの $$2^{15}$$ = 32768 個のマーククラス（0 から 32767 まで）を、次の再定義の中で使えます `\leftmark` または `\rightmark`。これは、選んだマーククラスに適切なマークデータを（挿入して）用意してあることが前提です `n`、次を通じて `\marks n{{left}{right}}`.

LuaTeXでは次が提供されることに注意してください $$2^{16}$$ = 65536 個のマーククラスがあり、 `n` 0 から 65535 までです。

**マーククラス10を使う例**

この例では、マーククラス10（ランダムに選択）を使って文書ヘッダーを作成する方法を示します。サンプル文書は6ページを組版し、そのページには [本記事末尾の動作例](#a-worked-example-to-show-how-tex-engines-determine-values-for-botmark-topmark-and-firstmark)が示すマークの並びが含まれています。その例を調べると、TeXエンジンがなぜ特定のマークを $$\alpha$$, $$\beta$$, $$\gamma$$ と $$\delta$$を各ヘッダーに使うように選んだのかがわかります。

まず、便利なマクロ `\domark`を定義します。これは `\marks 10` を使って、LaTeXの `{left}{right}` 規約に従うマークデータを挿入します：

```latex
\newcommand{\domark}[2]{\marks 10{{#1}{#2}}}
```

クラス10のマークは、次を再定義することでLaTeXのヘッダー／フッター機構から利用可能になります `\leftmark` と `\rightmark`—少し追加情報を加えて：

```latex
\renewcommand{\leftmark}{\expandafter\@leftmark\botmarks10 \@empty\@empty{} (via \texttt{\string\botmarks10})}
\renewcommand{\rightmark}{\expandafter\@rightmark\firstmarks10 \@empty\@empty{} (via \texttt{\string\firstmarks10})}
```

いくつかの（クラス10の）マークを挿入すると、TeXエンジン（ここではpdfTeX）が親切にクラス10のグローバルマーク変数を作成します—`\botmarks10`, `\topmarks10` と `\firstsmarks10` どの `\leftmark` と `\rightmark` これらを使ってヘッダーを生成します。

```latex
\documentclass{book}
% クラス10のマークを使う短いコマンド
% そしてLaTeXのマーク構造 {left}{right} に従う
\newcommand{\domark}[2]{\marks 10{{#1}{#2}}}
% \leftmark と \rightmark を次のものを使うように再定義
% それぞれ \botmarks10 と \firstmarks10
\catcode`@=11
\renewcommand{\leftmark}{\expandafter\@leftmark\botmarks10 \@empty\@empty{} (via \texttt{\string\botmarks10})}
\renewcommand{\rightmark}{\expandafter\@rightmark\firstmarks10 \@empty\@empty{} (via \texttt{\string\firstmarks10})}
\catcode`@=12
\title{Demonstrating \(\varepsilon\)-\TeX’s enhanced marks}
\author{Overleaf}
\date{August 2022}
\begin{document}

1ページ目：マークは追加されないため、すべてのマーク変数は初期状態のままです：空（NULL）。

\newpage
2ページ目：このページには次を通じて $\alpha$ マークが追加されます

\verb|\domark{$\alpha$-left}{$\alpha$-right}|\domark{$\alpha$-left}{$\alpha$-right}

\newpage
3ページ目：このページには新しいマークは追加されません。

\newpage
4ページ目：このページには次を通じて $\beta$ マークの後に $\gamma$ マークが追加されます

\verb|\domark{$\beta$-left}{$\beta$-right}|

\verb|\domark{$\gamma$-left}{$\gamma$-right}|.
\domark{$\beta$-left}{$\beta$-right}
\domark{$\gamma$-left}{$\gamma$-right}

\newpage
5ページ目：このページには次を通じて $\delta$ マークが追加されます

\verb|\domark{$\delta$-left}{$\delta$-right}|
\domark{$\delta$-left}{$\delta$-right}

\newpage
6ページ目：このページにはマークは追加されません。
\end{document}
```

[この例をOverleafで開く](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Using+e-TeX+global+marks+variables\&snip=%5Cdocumentclass%7Bbook%7D%0A%25+A+short+command+to+use+marks+with+class+10%0A%25+and+following+LaTeX%27s+mark+structure+%7Bleft%7D%7Bright%7D%0A%5Cnewcommand%7B%5Cdomark%7D%5B2%5D%7B%5Cmarks+10%7B%7B%231%7D%7B%232%7D%7D%7D%0A%25+Redefine+%5Cleftmark+and+%5Crightmark+to+use+%0A%25+%5Cbotmarks10+and+%5Cfirstmarks10+respectively%0A%5Ccatcode%60%40%3D11%0A%5Crenewcommand%7B%5Cleftmark%7D%7B%5Cexpandafter%5C%40leftmark%5Cbotmarks10+%5C%40empty%5C%40empty%7B%7D+%28via+%5Ctexttt%7B%5Cstring%5Cbotmarks10%7D%29%7D%0A%5Crenewcommand%7B%5Crightmark%7D%7B%5Cexpandafter%5C%40rightmark%5Cfirstmarks10+%5C%40empty%5C%40empty%7B%7D+%28via+%5Ctexttt%7B%5Cstring%5Cfirstmarks10%7D%29%7D%0A%5Ccatcode%60%40%3D12%0A%5Ctitle%7BDemonstrating+%5C%28%5Cvarepsilon%5C%29-%5CTeX%E2%80%99s+enhanced+marks%7D%0A%5Cauthor%7BOverleaf%7D%0A%5Cdate%7BAugust+2022%7D%0A%5Cbegin%7Bdocument%7D%0A%0APage+1%3A+No+marks+added+so+all+mark+variables+remain+in+their+initialized+state%3A+empty+%28NULL%29.%0A%0A%5Cnewpage%0APage+2%3A+%24%5Calpha%24-mark+added+to+this+page+via%0A%0A%5Cverb%7C%5Cdomark%7B%24%5Calpha%24-left%7D%7B%24%5Calpha%24-right%7D%7C%5Cdomark%7B%24%5Calpha%24-left%7D%7B%24%5Calpha%24-right%7D%0A%0A%5Cnewpage%0APage+3%3A+No+new+marks+added+to+this+page.%0A%0A%5Cnewpage%0APage+4%3A+%24%5Cbeta%24-mark+followed+by+%24%5Cgamma%24-mark+added+to+this+page+via%0A%0A%5Cverb%7C%5Cdomark%7B%24%5Cbeta%24-left%7D%7B%24%5Cbeta%24-right%7D%7C%0A%0A%5Cverb%7C%5Cdomark%7B%24%5Cgamma%24-left%7D%7B%24%5Cgamma%24-right%7D%7C.%0A%5Cdomark%7B%24%5Cbeta%24-left%7D%7B%24%5Cbeta%24-right%7D%0A%5Cdomark%7B%24%5Cgamma%24-left%7D%7B%24%5Cgamma%24-right%7D%0A%0A%5Cnewpage%0APage+5%3A+%24%5Cdelta%24-mark+added+to+this+page+via%0A%0A%5Cverb%7C%5Cdomark%7B%24%5Cdelta%24-left%7D%7B%24%5Cdelta%24-right%7D%7C%0A%5Cdomark%7B%24%5Cdelta%24-left%7D%7B%24%5Cdelta%24-right%7D%0A%0A%5Cnewpage%0APage+6%3A+No+marks+added+to+this+page.%0A%5Cend%7Bdocument%7D)

次の図は、この例で生成されるヘッダーを示しています：

![ε-TeXの拡張マークコマンドを使用したLaTeXコードの出力を示す図](/files/1334e63a7ef00ad6d3f72d639a7c207d566310ac)

* **注**：1ページ目のヘッダーは、クラス10の3つのマーク変数すべてが`\botmarks10`, `\topmarks10` と `\firstsmarks10`—空である時点で作成されます。最終的な結果として `\rightmark` （1ページ目では）最後のヘッダー断片だけを挿入します： `（\texttt{\string\firstmarks10} 経由）`。上の図に示されているとおりです。

## TeX エンジンが \botmark、\topmark、\firstmark の値をどのように決定するかを示す具体例

![Db.gif](/files/0f51de0932b822f0383b85614ddabca3fd19d8bd)![Db.gif](/files/0f51de0932b822f0383b85614ddabca3fd19d8bd) Knuth による二重の危険標識の使用を再現するのがふさわしいように思われる（画像提供： [このウェブサイト](http://www.truetex.com/db.htm)）というのは、内容がやや低レベルで「内部をのぞき見る」ものだからです——とはいえ、もう少し詳しく理解したい勇敢な読者の興味を引ければと願っています。

以下の議論は、258ページの最後の例に密接に基づいています [The TeXbook](https://www.amazon.co.uk/TeXbook-Donald-Knuth/dp/0201134489)。ここでは、『The TeXbook』を入手できない方のために、その例を編集し、組み直しました：

![『The TeXbook』258ページの例を編集し、再組版した版](/files/3415b1680f39c8aa6481bbc57c60dd2226381bd0)

この図に示した表は Knuth が提供したものを再掲したものですが、元のものと同様、その導出方法の説明はありません。ここでは、それを補って、次の値がどのようにして得られたのかを示す追加の詳細を示します： `\botmark`, `\topmark` と `\firstmark` はどのように決定されたのか——これらの詳細を得るには、TeX エンジンのソースコードを調べる必要がありました！

値を設定する過程 `\botmark`, `\topmark` と `\firstmark` は、次の図と後続の説明に示す 3 つの短い擬似コード断片で要約できます：

1. 内容前チェック
2. 内容ループ
3. 内容後チェック

注：

* ステップ1「内容前チェック」とステップ3「内容後チェック」のテストは、各ページにつき1回実行されます。
* ステップ2「内容ループ」では、TeX がページ内容を走査して mark ノードを探し、それを使って図のように mark 変数の値を設定します。

![TeX エンジンで使われる3つのグローバルな mark 変数の値を設定するためのコードの擬似コード版を示す画像](/files/fc4466bb748d6c8c58423e534547bc320a7bfcef)

TeX が適切なページ区切りを見つけるたびに、そのページの内容を最終処理に送り、文書内の各ページに対してこれら3つの mark 処理ステップを実行します。1、2、3 とラベル付けされた処理ステップは、この節の最後の図で参照されています。

なお：

* 最初のページが処理される前には、3つすべてのグローバル mark 変数は `\botmark`, `\topmark` と `\firstmark` 空（NULL）に初期化されています。
* の最終値は `\botmark`, `\topmark` と `\firstmark` の最後に決定された *前の* ページの値は、処理対象の *ページ* ページ（現在処理中のページ）の入力値になります。

次のコード断片は ***擬似コード*** 実際の TeX エンジンのソースコードから導出（要約）したものです。目的は、関係する主要な原理を示すのに役立つ簡潔なコード要約を提供することです。

**ステップ1：内容前チェック** TeX が現在のページの実際の内容を調べる前に、現在の `\botmark` 値、つまり次の結果として得られる *前の* ページの値が空（NULL）かどうかを確認します：

```latex
if(\botmark != NULL)
{
   \topmark = \botmark;
   \firstmark= NULL;
}
```

このテストでは、もし `\botmark` （〜ページからの *前の* ページ）からのものが *、* 空なら：

* `\topmark` のために *ページ* ページは次の値に設定されます： *前の* そのページの `\botmark` 値
* `\firstmark`、そして *ページ* ページ（処理中のページ）は空（NULL）に設定されます：このページは、〜がないものとして開始します `\mark` ノード。

このテストは *1回* 処理される各ページごとに実行されることに注意してください。

**ステップ2：内容ループ** 次に、TeX はページ内容をループで走査し、そのループには次を探す処理が含まれます： `\mark` ノード：

```latex
if(type(node)==mark_node)
{
   if(\firstmark==NULL)
   {
      \firstmark=node(text);
   }
   \botmark= node(text);
}
```

このテストは、現在のページ内にある（含まれる）すべての mark ノードに適用されます。前のテスト（上のステップ1）によって `\firstmark` が空に設定されている可能性があるため、現在のページで最初に見つかった mark が `\firstmark` と `\botmark`。 *それ以降の* `\mark` このループの実行中に検出されるノードは、〜の値を変更しません `\firstmark`、なぜならもはや空（NULL）ではないからです。しかし `\botmark` は更新されます——それが `\botmark`の目的、つまり最後に見つかった `\mark` ノードを保持するためです。

**ステップ3：内容後チェック** TeX はページ内容を一通り走査し終えると、次の最終テストを適用します。これも各ページにつき1回実行されます：

```latex
if((\topmark != NULL)&&(\firstmark==NULL))
{
	\firstmark= \topmark;
}
```

* もし `\topmark` が空（NULL）でなければ、ステップ1から `\botmark` 前のページの〜は空（NULL）ではなかったことがわかります。
* もし `\firstmark` がまだ空なら、私たちはまだ何も見つけていないので `\mark` ノードは見つかっていません。なぜならステップ2のテストが発動しなかったためです。その結果、 `\firstmark` は次の値に設定されます： `\topmark` これは、の値でもあります `\botmark` 前のページからのものです。

この例の6ページすべてに対してこれら3つのステップを順次適用すると、 `\botmark`, `\topmark` と `\firstmark` の値は、以下の図に示す遷移を用いて導出されます。ここで：

* 水色の角丸長方形は、各ページの最終的な mark 変数の値を表します
* 薄灰色の角丸四角形は、処理中に生じる中間値を表します
* ラベル付きの矢印は、上の図のステップ1、2、3に従った mark 変数値の変化を表します。あるいは、どのステップでも値が変更されていないこと、つまり「変更なし」を表します。

次の図は、3つの擬似コード断片がどのようにして次の最終値を生成するかを示しています： `\botmark`, `\topmark` と `\firstmark` 『The TeXbook』258ページの表に掲載されているものです。

![『The TeXbook』258ページの例に添える遷移図。グローバル mark 変数に値が割り当てられる際の内部遷移を示します](/files/f66c8bf16743a2ae8558002e94a86850488d0d42)


---

# 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/23-how-does-latex-typeset-headers-and-footers.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.
