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

# LaTeX는 머리말과 꼬리말을 어떻게 조판하나요?

## LaTeX는 머리말과 꼬리글을 어떻게 조판하나요?

### 소개

머리말과 꼬리글을 변경하는 방법 안내를 찾고 계시다면 [도움말 페이지를 방문해 주세요](/latex/ko/formatting/02-headers-and-footers.md) 이 글은 TeX 엔진과 LaTeX가 머리말과 꼬리글을 생성하는 데 사용하는 저수준 메커니즘을 설명하는 데 중점을 두기 때문입니다.

* **참고(업데이트)**: 이 글은 2022년 6월 이전에 사용되던 LaTeX의 핵심 mark 메커니즘을 다룹니다. 당시 LaTeX의 mark 처리에 더 다재다능한 새 구현이 도입되었습니다. 자세한 내용은 [LaTeX의 새로운 mark 메커니즘 개요](https://www.latex-project.org/help/documentation/ltmarks-doc.pdf) 를 참조하세요. 하위 호환성 이유로 LaTeX는 기존 mark 메커니즘도 계속 지원합니다. TeX 엔진의 동작을 논의하는 본문은 이러한 LaTeX 변경의 영향을 받지 않습니다.
* **참고**: 여기서 “LaTeX”, “TeX” 및 “TeX 엔진”이라는 용어가 이 논의 전반에 사용되므로 그 의미를 이해하는 것이 도움이 됩니다—Overleaf의 글 [이름에 담긴 것: TeX의 여러 변형에 대한 안내](/latex/ko/in-depth-articles/55-what-s-in-a-name-a-guide-to-the-many-flavours-of-tex.md) 에서 자세한 정보를 확인하세요.

유용한 배경/맥락을 제공하기 위해, 먼저 TeX 기반 조판의 관련 저수준 영역 몇 가지를 개괄하겠습니다. 여기에는 임시(내부) 내용 저장, 페이지 분할, 구성이 포함됩니다. 논의는 본문 텍스트와 일부 머리말과 꼬리글을 포함하는 조판된 페이지를 기준으로 정리/단순화했습니다. 그림(float)과 각주 같은 페이지 항목은 이들이 insertion *insertions*는 이 글의 범위를 한참 벗어나므로 다루지 않습니다.

우리는 기본 개념인 *노드*: TeX 엔진이 임시(내부) 내용 저장에 사용하는 기본 구성 요소입니다.

### 내용 저장에 대한 몇 가지 설명: TeX 노드

기반이 되는 TeX 엔진이 문단, 표, 수식 등 조판 재료를 만들기 위해 LaTeX 코드를 처리할 때, 해당 LaTeX 코드를 처리하는 데 사용 중인 TeX 엔진의 메모리 안에 그 내용을 임시로 저장해야 합니다. 조판된 내용을 저장하기 위해 TeX 엔진은 이른바 *노드*를 사용합니다. 이는 컴퓨터(장치) 메모리의 크기가 가변적인 “조각”들이 서로 연결되어 목록을 이루는 것이라고 생각할 수 있습니다(이 링크드 데이터 구조에 관한 위키백과 글을 보세요 [Wikipedia의 연결 데이터 구조 문서](https://en.wikipedia.org/wiki/Linked_data_structure)).

![연결된 노드를 사용해 TeX 엔진이 내용을 저장하는 방식의 개략도](/files/46021307ffe4844477a46e522de9731e6751db74)

문자, glue, 박스, 패널티, kern 및 [*mark*](#why-were-here-understanding-mark-nodes) (몇 가지만 들자면)—TeX 엔진은 서로 다른 *유형* 노드 종류를 사용합니다. 박스용 노드처럼 일부 노드는 문자 노드 같은 더 단순한 노드 유형보다 더 많은 데이터를 저장해야 하므로, 어떤 노드는 다른 노드보다 더 크며 메모리에 저장하는 데 더 많은 바이트가 필요합니다. TeX를 읽다 보면 다음과 같은 용어를 접할 수 있습니다. *문자 노드*, *glue 노드*, [*mark 노드*](#why-were-here-understanding-mark-nodes) 등: 이제 이것들이 TeX 조판 요소를 나타내는 데이터를 저장하도록 할당된 메모리 조각에 붙은 이름일 뿐임을 알 수 있습니다.

#### 우리가 여기서 다루는 이유: mark 노드 이해하기

많은 노드 유형 가운데 우리가 논의해야 할 것은 *mark 노드* 이며 다음 명령에 의해 만들어집니다 `\mark` 명령:

```latex
\mark{저장할 내용}
```

다음 `\mark` 명령은 조판 결과물을 직접 만들어 내지 않습니다. 그 인수 `*저장할 내용*` 은 나중에 사용할 수 있도록 메모리에 저장되며 *mark 노드* 는 다음의 메모리 위치를 담기 위해 생성됩니다 *저장할 내용*. 곧 보게 되겠지만, `\mark` 명령은 만들어졌습니다 *특히* 머리말과 꼬리글을 만드는 데 도움을 주기 위해.

다음에 의해 생성된 mark 노드들은 `\mark` 명령은 TeX 엔진이 조판된 페이지(본문)에 머리말과 꼬리글을 추가할 준비가 되었을 때, 페이지 구성의 마지막 단계에서 사용할 수 있도록 페이지 내용에 “삽입”됩니다. 일반적으로, `*저장할 내용*` 에는 페이지 번호와 장/절의 제목/번호 같은 내용이 들어가며, 이는 머리말과 꼬리글의 구성 요소입니다.

#### ε-TeX는 \marks 명령을 추가합니다

[ε-TeX 버전 2](https://texdoc.org/serve/e-TeX/0)Knuth의 원래 TeX를 확장한 이 버전은 1998년에 발표되었으며, 기존 기능 개선과 함께 새로운 기능도 제공합니다. 오늘날 ε-TeX의 개선 사항 대부분은 주류 TeX 엔진인 pdfTeX, LuaTeX, XeTeX에 통합되었습니다—참조 [**`-etex`** TeX 엔진의 명령줄 옵션](/latex/ko/more-topics/44-tex-engine-command-line-options-for-pdftex-xetex-and-luatex.md) 은 ε-TeX 확장 기능의 사용을 가능하게 합니다.

Knuth의 원래 TeX 소프트웨어는 하나의 “class”, 즉 하나의 “type”의 mark 노드만 만드는 \mark 명령을 제공합니다. 문서에는 여러 \mark 명령이 들어갈 수 있지만, 모두 같은 “type” 또는 “class”의 mark 노드를 만들 뿐입니다. 이를 묶거나 분류하는 내장 메커니즘은 없습니다. 이러한 제한은 ε-TeX의 개선 사항인 \marks 명령으로 해소되었으며, 이는 pdfTeX, LuaTeX, XeTeX에서 지원됩니다:

```latex
\marks n {저장할 내용}
```

여기서 `n` 는 정수(`0` <= `n` < `32768`)이며 mark 노드의 *class*.

참고:

* 작성하는 `\marks 0` (즉, `n`=`0`)는 TeX의 원래 `\mark` 명령을 사용합니다
* ε-TeX는 또한 mark 변수([뒤에서 설명](#pre-output-checks-looking-for-mark-nodes))를 각 mark의 class(`n`)마다 도입했습니다: `\firstmarks n`, `\topmarks n` 및 `\botmarks n`. 선택된 mark 변수 class는 특정 조판 작업을 위한 mark 데이터를 제공하는 데 사용할 수 있습니다.
* LuaTeX는 다음의 최대값을 늘렸습니다 `n` 을 `65535`이를 통해 $$2^{16}$$ mark class

### TeX가 mark를 사용하는 이유

이해하려면 *왜일까요* (그리고 어떻게) TeX 엔진이 `\mark` (또는 `\marks`) 명령을 사용해 머리말과 꼬리글을 생성하는지 알아보려면, 페이지를 구성하는 TeX 엔진 메커니즘의 몇 가지 “특이점”을 이해해야 합니다. 즉, 페이지 분할 지점을 찾고 완성된 페이지를 PDF 파일로 내보내는 과정입니다. 실제로 이러한 페이지 구성 과정은 복잡하지만, mark를 이해하는 데 도움이 되도록 핵심 원리/개념을 충분히 설명할 수 있을 정도로 단순화할 수 있습니다.

TeX 엔진이 문단, 표, 수식 같은 개별 콘텐츠 항목의 조판을 마칠 때마다 내부 루틴( `build_page(...)",`를 호출하는데, 이 루틴은 새로 조판된 항목들을 메모리에서 현재 구성 중인 페이지에 추가하려고 합니다. 새 सामग्री가 만들어지는 페이지에 추가되면 TeX는 그 새로 추가된 내용으로 인해 현재 페이지가 “적절히 가득 찼는지”도 검사합니다. 페이지가 가득 차면 TeX는 *페이지 분할*—해당 페이지 분량의 내용을 최종 처리(“패키징”)를 위해 보내고, 이어서 PDF 파일로 출력합니다.

페이지 패키징(구성)의 최종 단계에서 중요한 기능 하나는 다음과 같은 *출력 루틴* 입니다. 이는 실제로 PDF 파일로 보낼 수 있도록 페이지 내용을 묶어 두는 데 사용하는 사용자 정의 명령 시퀀스입니다. “패키징”의 한 예는 머리말과 꼬리글을 추가하는 것이지만, 출력 루틴을 사용하는 방법은 매우 다양합니다—예를 들어, [TUGboat의 이 글](https://tug.org/TUGboat/tb11-1/tb27salomon.pdf). 출력 루틴은 TeX의 꽤 복잡한 영역이므로 여기서는 자세히 다루지 않겠습니다. 지금은 페이지 구성의 마지막 단계에서 사용자 정의 명령 시퀀스(통틀어 *출력 루틴*).

하지만 TeX가 긴 문단의 조판을 완료하고 이를 개별 조판 줄들의 연속으로 나눌 때 어떤 일이 생길지 생각해 봅시다. TeX는 새로 조판된 그 문단을 줄 단위로 현재 만들어지는 페이지에 추가하려고 하겠지만, 아마도 일부 *몇 가지* 만 현재 페이지에 들어갈 수 있습니다. 여기서 “페이지”는 본문 영역(page body)을 가리키며, *작동하지* 나중에(출력 루틴에 의해) 추가되는 머리말과 꼬리글 같은 다른 페이지 요소는 포함하지 않습니다.

여러 문단 줄이 현재 페이지에 추가된 뒤에는 페이지가 “적절히 가득 차게” 되어 TeX가 페이지 분할을 할 때가 올 수 있습니다. 그러나 일부 “남은” 내용이 생기는데, 왜냐하면 오직 *부분* 만 문단의 일부만 현재 페이지에 들어갔기 때문입니다. 이 “초과 문단 내용”은 나중을 위해 저장되며, 다음 *다음* 페이지를 만들 준비를 합니다. 다음 그림은 이 개념을 보여 줍니다. 문단의 일부는 *현재* 페이지에 있고, 일부는 *다음* 페이지를 위해 보류됩니다.

![페이지 분할을 걸쳐 있는 문단의 개략도](/files/a962f6962076d2946392add874c60751d3e7269f)

이 문단 예시는 TeX 엔진이 종종, *전체로는*, 현재 페이지에 맞지 않는 콘텐츠 조각을 처리(조판)한다는 점을 보여 줍니다. 왜냐하면 그 내용이 페이지 분할이 필요해지는 지점을 넘어가기 때문입니다. TeX 엔진은 줄바꿈을 입력한 뒤 조판하는 방식으로 찾아낸다는 점을 기억하세요 *전체 문단을* 그리고 일부 애플리케이션과 달리 문단을 줄 단위로 조판하지 않습니다. 다시 말해, TeX는 *전체* 문단이 현재 페이지에 들어가든 말든 문단 전체를 조판합니다(이는 나중에 결정됩니다). 덧붙여, “완전히 조판한 뒤 현재 페이지에 추가”라는 원리는 .tex 파일에서 완전히 읽어 들여 현재 페이지에 추가하기 전에 전체를 조판하는 표를 포함한 다른 TeX 콘텐츠 유형에도 그대로 적용됩니다.

문단 예시에서, 그 문단의 전체 텍스트, *그 텍스트 안의 명령까지 포함한*는 완전히 처리되었습니다. 즉, TeX의 조판이 여러분의 `.tex` 파일의 특정 위치에 도달했다는 뜻입니다. 변수 값이나 저장된 매개변수 설정 같은 TeX 엔진의 “현재 내부 상태”는 문단 끝인 현재 위치까지 처리된 내용, 명령을 포함한 그 내용을 반영합니다.

완전한 문단이 조판되었지만, 그 일부는 현재 페이지에 들어갈 수 없어 “초과 문단 내용”이 다음을 위해 저장됩니다. *다음* 페이지. “초과 문단 내용”을 만들어 낸 LaTeX 코드(텍스트와 명령) 안에서 TeX 엔진은 *여러* 명령과 매크로를 호출했을 수 있으며, 이들은 TeX 엔진 내부에 저장된 값과 변수들을 바꿨을 것입니다. 즉, TeX의 “현재 상태”를 변경한 것입니다.

다음 도표는 TeX의 매우 중요한 “특이점” 하나를 보여 주며, 이는 TeX 기반 조판의 여러 측면에 영향을 줍니다. 도표의 오른쪽을 보면 현재 메모리에 저장된 모든 내용을 이루는 노드들의 표현이 보입니다. 연한 회색 영역에는 *현재* 페이지를 이루는 노드들이 있고, 진한 회색 영역은 다음을 위해 예정된 조판 내용입니다. *다음* 페이지. 이 상황은 우리의 문단 예시를 반영합니다. 진한 회색 영역은 “초과 문단 내용”을 나타내며, 현재 페이지에 맞지 않아서 보류된 텍스트 줄들입니다.

![TeX가 페이지 분할을 찾는 노드 위치의 개략도, 다음 페이지를 위해 보류된 내용도 함께 표시](/files/9e48d610a0462f53ecaaf809bd93319be10e2146)

TeX가 “적절히 가득 찬” 페이지(본문)를 만들면 그 내용을 다음에 보내게 된다는 점을 기억하세요 *출력 루틴* 이는 사용자 정의 명령 시퀀스입니다. 출력 루틴은 무엇보다도 페이지 본문에 머리말과 꼬리글을 추가하여, 페이지를 PDF 파일로 내보낼 준비가 되도록 마무리합니다.

위의 그림은 TeX가 특정 노드, 예를 들어 `\baselineskip` 조판된 줄 사이의 glue에서 페이지 분할을 하기로 선택한 상황을 나타내며, 내장 명령과 사용자 정의 매크로로 이루어진 출력 루틴을 사용해 현재 페이지 패키징을 시작할 준비가 된 상태입니다. *그러나*현재 페이지를 이루는 내용(메모리에 저장된 것) 외에도 TeX는 이미 처리하여 메모리에 저장한 *추가 내용*여러분의 `.tex` 파일에서 온 것입니다. 그 추가 내용은 *페이지 분할 지점 너머까지 이어지며* 및 *여러* 중요한 페이지 관련 값이나 변수를 바꾸는 명령들을 포함했을 수 있으며, 이는 내부 매개변수 값이나 매크로에 저장된 데이터까지 포함하는 TeX의 “현재 내부 상태”에 영향을 줍니다.

TeX가 현재 페이지의 패키징을 시작할 때, 그 “현재 내부 상태”는 *작동하지* TeX가 이미 *그 지점을 지나* 여러분의 파일에서 페이지 분할이 일어나는 위치와 TeX가 실제로 도달한 위치를 생각해 보면 `.tex` 파일에서 저장된 데이터와 변수 값을 포함한 TeX의 두 대응 내부 상태는 매우 다를 수 있습니다. TeX 조판의 현재 상태는 보통 페이지 분할이 일어나는 지점보다 앞서 있습니다. 즉, TeX의 조판 활동은 *동기화되어 있지 않습니다* 조판된 페이지를 출력 루틴을 통해 내보내는 과정과.

#### 가상 예시: 잘못된 머리말을 얻게 되는 방법

다음 도표는 가상의 명령들인 `\myheader` 및 `\myfooter` 을 보여 주며, 원하는 머리말과 꼬리글 텍스트를 저장하는 데 사용됩니다. 예를 들어 다음과 같은 기본 정의를 사용합니다.

```latex
\newtoks\headertoks% 머리말 텍스트를 위한 새 토큰 목록 변수
\newtoks\footertoks% 꼬리글 텍스트를 위한 새 토큰 목록 변수
% 저장된 머리말 또는 꼬리글 데이터가
% 어디서나 접근 가능하도록 \global을 사용합니다. 여기에는 다음의 명령도 포함됩니다.
% 출력 루틴
\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/0fafe4c1edea019ddb25aebd2ad82afde96ba70b)

#### TeX의 비동기적 동작: \mark 명령이 구원투수

TeX의 조판(내용 구성) 활동은 *동기화되어 있지 않습니다* 출력 루틴에 포함된 명령을 통해 조판된 페이지를 내보내는 최종 과정과는 말입니다. 페이지를 출력할 때가 되면, TeX의 실제 내부 상태는 현재 출력 중인 페이지의 마지막 내용을 조판했던 페이지 분할 지점에서의 상태보다 앞서 있습니다.

In [The TeXbook](https://www.amazon.co.uk/TeXbook-Donald-Knuth/dp/0201134489), TeX의 창시자 Donald Knuth는 이 상황을 이렇게 설명합니다

> ... TeX의 출력 루틴은 페이지 구성 활동보다 뒤처진다

이러한 비동기 관계 때문에 *marks 메커니즘*, 다음을 통해 적용되는 `\mark` (또는 `\marks n`) 명령과 같은 “특수 기능”이 필요하며, 이는 머리말과 꼬리글에 실제로 출력되는 페이지와 관련된 내용을 담도록 보장합니다. `\mark` 명령은 mark 노드를 페이지 내용에 삽입하여, 해당 페이지의 머리말과 꼬리글에 사용할 수 있는 내용의 메모리 위치를 저장합니다.

널리 알려지고 권위 있는 책의 저자는 [TeX by Topic](https://www.eijkhout.net/tex/tex-by-topic.html) 에서 `\mark` 메커니즘을 다음과 같이 설명합니다

> ... 출력 루틴이 현재 분할된 페이지의 내용, 특히 그 상단과 하단에 대한 정보를 얻는 주요 메커니즘

다음 `\mark` 명령은 TeX의 페이지 분할과 출력 루틴 알고리즘의 비동기적 특성을 우회하도록 설계된 메커니즘입니다.

![페이지 본문 내용에 삽입된 mark 데이터(노드)의 개략도](/files/bffda7915c53cf63ea4a0830a7933e29e791076c)

### 출력 전 점검: mark 노드 찾기

TeX 엔진이 페이지 분할 위치를 결정한 뒤에는 내부 루틴( `fire_up()`)를 호출합니다. 이 루틴은 출력 루틴이 페이지 구성을 완료하고 완성된 페이지를 PDF 파일에 기록하기 전에 많은 사전 처리를 수행합니다. 이러한 사전 처리의 중요한 부분은 세 개의 *전역 mark 변수*: `\botmark`, `\topmark` 및 `\firstmark` 값을 설정하는 것입니다. 이는 머리말과 꼬리글을 구성하는 데 필요한 데이터를 제공하는 데 사용됩니다. 물론 한 페이지에는 여러 mark 노드가 있을 수 있지만, 이것들은 다음과 같이 작동하는 세 개의 mark 변수를 만들기 위해 걸러집니다:

* **`\botmark`** 는 현재 페이지 분할에서 유효한 mark입니다. 즉, *현재* 페이지에
* **`\topmark`** 는 다음의 값입니다 `\botmark` 에서 *이전* 페이지에
* **`\firstmark`** 는 다음의 첫 번째 mark입니다 *현재* 페이지의 첫 번째 mark—다음 사이의 첫 번째 mark `\topmark` 및 `\botmark`

다음 개략도는 조판된 페이지 내용을 사전 처리하여 세 개의 전역 mark 변수의 값을 결정하는 기본 원리를 보여 줍니다 `\botmark`, `\topmark` 및 `\firstmark`:

![전역 mark 변수 \botmark, \topmark 및 \firstmark의 값을 결정하는 데 사용되는 기본 원리의 개략도](/files/6d0cc88e4fcadab2b923229d59f68726a676b916)

다음 섹션에서는 위에서 제공한 설명 일부를 사용해 LaTeX가 머리말과 꼬리글을 어떻게 조판하는지 개괄합니다.

### LaTeX 클래스: 페이지 스타일과 머리말/꼬리글

다음을 작성하면 `\documentclass{*class*}` 여기서 `*class*` 일 수 있습니다 `article`, `book`, `report` 또는 `letter`, LaTeX는 다음 이름의 파일을 불러옵니다 `*class*.cls`; 예를 들면 `book.cls`, `article.cls` 등입니다. 이러한 `.cls` 파일에는 모든 문서 클래스에 공통으로 존재하고 제공될 것으로 기대되는 여러 명령과 기능의 클래스별 변형을 구현하는 LaTeX 코드가 들어 있습니다. 즉, 모든 문서 클래스가 공유하는 동작입니다. 예로는 클래스별 페이지 레이아웃 여백과 함께 다음과 같은 명령의 클래스별 버전이 포함될 수 있습니다 `\\section`, `\subsection` 등입니다.

다른 중요한 요소는 `.cls` 파일에 있는 표준 페이지 스타일의 클래스별 구현입니다. 이는 특정 클래스와 페이지 스타일을 사용해 생성된 문서의 머리말과 꼬리글을 정의합니다. 예를 들면:

* **`book.cls`** 및 **`article.cls`** 에는 다음 페이지 스타일의 구현이 각각 들어 있습니다 `headings` 및 `myheadings`
* **`letter.cls`** 에는 다음 페이지 스타일에 대한 정의가 들어 있습니다 `headings`, `empty`, `plain` 그리고 다음이라는 `firstpage`
* **`report.cls`** 에는 다음 페이지 스타일에 대한 정의가 들어 있습니다 `headings` 및 `myheadings`

페이지 스타일의 구현은 종종 다음에 의존합니다 `twoside` 옵션 `\documentclass`—문서가 단면인지 양면인지 여부—에 따라 머리말과 꼬리글이 왼쪽 면(짝수) 페이지와 오른쪽 면(홀수) 페이지에 맞게 정의됩니다.

문서 클래스는 LaTeX의 다른 곳에서 제공되는 페이지 스타일—즉, 다음 밖에 있는 `plain` 또는 `empty` 페이지 스타일의 기본 정의에 의존할 수 있습니다 `.cls` 사용 중인 파일입니다.

#### 페이지 스타일 더 알아보기

다음을 사용해 페이지 스타일을 바꾸면 `\pagestyle{*somestyle*}` 또는 `\thispagestyle{*somestyle*}` LaTeX는 다음 이름의 내부 명령을 찾을 것으로 기대합니다 `ps@*somestyle*`—대개 문서 클래스가 제공하는 `.cls` 파일 또는 다음과 같은 패키지에서 제공됩니다 `fancyhdr`. 덧붙여, “내부 명령”이란 LaTeX 소스 코드의 일부이며 이름에 `@` 기호가 들어 있어, 보통은 쉽게 사용되지 않도록 하는 명령을 뜻합니다(그 [범주 코드](/latex/ko/more-topics/43-table-of-tex-category-codes.md)).

정의는 `\ps@*somestyle*` 가 해당 페이지 스타일의 기능/동작을 구현하는 역할을 하며, 다음 항목의 정의를 제공합니다:

* 페이지 구성의 마지막 단계에서 사용되는 명령(머리말과 꼬리글을 추가하기 위해, 이 글의 뒤를 참조) [나중에 글에서](#commands-for-the-output-routine)):
  * `\@oddhead`
  * `\@oddfoot`
  * `\@evenhead`
  * `\@evenfoot`
* 절 관련 mark 데이터를 삽입하는 명령으로, 절 제목, 번호 등을 포함하는 문서 머리말과 꼬리글을 생성하는 데 사용됩니다. 예를 들면 `headings` 페이지 스타일(다음 안의 `book.cls`)은 다음 mark 생성 명령을 정의합니다:
  * `\chaptermark`
  * `\sectionmark`

우리는 [mark 생성 명령을 더 살펴볼 것입니다](#mark-commands-and-mark-data)예를 들어 `\chaptermark`하지만 예시로만 들자면: 다음을 작성하면 `\chapter{chapter title}` 다음 `\chaptermark` 명령도 실행되어 이후 페이지 머리말 생성에 사용할 장 관련 mark 데이터가 삽입됩니다.

#### 페이지 스타일을 기반으로 한 머리말과 꼬리글 명령의 구조

이 섹션에서는 이 글 앞부분에서 제시한 설명이나 개념을 바탕으로 머리말과 꼬리글을 만드는 데 사용되는 핵심 LaTeX 명령/과정 몇 가지를 살펴봅니다.

**LaTeX의 머리말과 꼬리글 “모델”**

LaTeX의(기본) 머리말과 꼬리글 내용은 문서 섹션의 2단계 계층 구조를 기반으로 합니다. 즉, 여러 “하위 수준” 섹션을 포함하는 “상위 수준” 섹션입니다. book 클래스와 article 클래스에서는 이것이 다음과 같이 대응됩니다.

* `**book**` **class**: “상위 수준” 섹션은 다음에 의해 만들어집니다 `\chapter` 명령, “하위 수준” 섹션은 다음을 통해 만들어집니다 `\\section`많은 섹션을 포함하는 장을 반영합니다.
* `**article**` **class** (양면 문서를 가정): “상위 수준” 섹션은 다음을 사용해 만들어집니다 `\\section` 명령, “하위 수준” 섹션은 다음을 통해 만들어집니다 `\subsection`같은 섹션 안에 여러 하위 섹션이 나타나는 것을 반영합니다.

LaTeX는 섹션 명령을 통해 머리말과 꼬리글의 “모델”을 적용하며, 이를 통해 mark 노드가 (다음을 통해) `\mark` 명령) 문서의 생성 중인 섹션과 관련된 데이터를 저장하도록 “삽입”합니다. 예를 들어, 다음을 쓸 때마다 `\section{*some section title*}` mark 노드가 생성되며, 여기에는 다음을 반영하는 데이터가 들어 있습니다 `*some section title*` 및 섹션 번호.

LaTeX는 다음 형식의 데이터를 담는 mark 시스템을 사용합니다 `{left}{right}`최종적으로 다음을 통해 생성됩니다 `\mark` 명령

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

이는 사용자를 저수준 세부 사항으로부터 보호하도록 설계된 여러 겹의 매크로 안에 둘러싸여 있으며, 이러한 세부 사항은 이 글의 다음 섹션에서 살펴봅니다.

#### book 클래스 살펴보기

다음을 `book.cls` 파일이 불러와지면, 마지막 작업 중 하나로 실행되는 것은 `\pagestyle{headings}` 이며 기본 페이지 스타일을 다음으로 설정합니다 `headings`, 그래서 해당 페이지 스타일을 더 자세히 살펴보겠습니다.

앞서 [언급했듯이](#more-on-page-styles), 다음의 기능/속성은 `headings` 페이지 스타일은 다음에 의해 구현되며 `book` 클래스에 의해 (내부) 명령으로 정의됩니다 `\ps@headings` 이 파일에 포함되어 있습니다 `book.cls`. 다음의 정확한 정의는 `\ps@headings` 문서가 단면인지 양면인지(다음의 기본값인지)에 따라 달라집니다 `book` 클래스).

**“Mark 명령”과 “mark 데이터”**

다음이 생성한 양면 문서의 경우 `book` 클래스의 정의는 `\ps@headings` 두 개의 “mark 명령”을 만듭니다(정의합니다): `\chaptermark` 및 `\sectionmark` 이는 다음 형식의 “mark 데이터”를 생성합니다 `{left}{right}`머리말과 꼬리글에서 사용됩니다. 이러한 mark 명령은 문서 섹션의 계층 구조에 기반한 LaTeX의 머리말과 꼬리글 모델을 반영합니다:

* “상위 수준” 섹션 명령(여기서는 `\chapter`)는 왼쪽 면(짝수 번호) 페이지 머리말에 대한 “mark 데이터”를 제공합니다. 새 장을 시작할 때 다음을 작성하면 `\chapter{*chapter title*}`, `\chaptermark` 가 호출되어 그 새 장을 반영하는 “mark 데이터”를 생성합니다. 여기에는 `*chapter title*` 그리고 번호.
* “하위 수준” 섹션 명령(여기서는, `\\section`)은 오른쪽 면(홀수 페이지)에 대한 “마크 데이터”를 제공하는 데 사용됩니다. 다음을 작성하면 `\section{*section title*}` 다음 `\sectionmark` 명령이 호출되어 새 섹션을 반영하는 “마크 데이터”를 생성합니다—여기에는 그 섹션의 `*섹션 제목*` 및 번호가 포함됩니다. 이전 `\chapter` 는 이후의 \section 명령에 의해 영향을 받지 않습니다.

**\markboth 및 \markright**

LaTeX의 섹션별 마크 명령, 예를 들어 `\chaptermark` 및 `\sectionmark`, 는 다음과 같은 두 개의 추가 명령을 사용합니다. `\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` 각 장 안에 여러 섹션이 있는 문서처럼 두 단계 섹션 계층을 지원합니다.

예를 들어 (양면) `book` 문서 클래스(헤딩 페이지 스타일 사용):

* `\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` 간격(glue)의 사용이다.
* `\@oddhead`: 다음의 내용은 `\rightmark`, 글꼴 명령 `\slshape`, 가 머리말의 왼쪽에 나타나고 현재 페이지 번호는 머리말의 오른쪽에 출력됩니다—이때도 중간의 여백은 다음이 제공합니다 `\hfil` 간격(glue)의 사용이다.

그러나 핵심 질문이 남습니다: *어떤* `{left}{right}` 마크 쌍이 다음에 의해 사용되는가 `\leftmark` 및 `\rightmark`: 즉, 그들은 마크 데이터 값을 어디서 얻는가?

앞서 [언급했듯이](#filtering) 하지만 [아래에서 설명됩니다](#explainfiltering), 최종 페이지 조판 단계에서 문서 페이지에 포함된 모든 마크는 “필터링”되어 세 개의 전역 마크 변수의 값을 설정하는 데 사용됩니다: `\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/ko/formatting/02-headers-and-footers.md).

#### 최소한의 페이지 스타일 정의

다음 예제는 매우 최소한의 새 페이지 스타일을 정의합니다. 이름은 `demostyle` 이는 정적 텍스트를 사용하여 머리말과 꼬리말을 정의하며 섹션 명령(`\chapter`, `\\section` 등)에 의존하여 머리말과 꼬리말 내용을 설정하지 않습니다.

예제는 다음의 카테고리 코드를 변경하는 것으로 시작합니다 `@` 문자를 11로 바꿔 매크로 이름 안에서 사용할 수 있게 합니다.  `\ps@demostyle` 명령은 머리말과 꼬리말을 생성하는 데 사용되는(출력 루틴에서) 명령을 다시 정의하여 우리의 최소 페이지 스타일을 구현합니다: `\@oddhead`, `\@oddfoot`, `\@evenhead` 및 `\@evenfoot`. 다음을 주목하세요 `twoside` 옵션은 우리의 `\documentclass` 선언에서 사용되며, 이는 다음을 사용합니다 `article` 클래스입니다.

```latex
\documentclass[twoside]{article}
\catcode`@=11
\newcommand{\ps@demostyle}{%
\renewcommand\@oddfoot{\hfil 홀수 페이지 꼬리말\hfil}%
\renewcommand\@evenfoot{\hfil 짝수 페이지 꼬리말\hfil}%
\renewcommand\@evenhead{\thepage\hfil 짝수 페이지 머리말}%
\renewcommand\@oddhead{홀수 페이지 머리말\hfil\thepage}}
\catcode`@=12
\title{페이지 스타일 시연}
\author{Overleaf}
\date{2022년 8월}
\begin{document}
\pagestyle{demostyle}
\maketitle
\newpage
\section{Introduction}
\newpage
\section{추가 자료}
\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` 그래서 왼쪽 및 오른쪽 면 페이지 머리말에 현재 페이지 번호와 장 제목이 들어가게 합니다. 두 번째 `\chapter` 명령이 선택적 짧은 형식의 장 제목을 사용한다는 점에 주목하세요 `[짧은 제목]` 이제 긴 제목 대신 머리말 텍스트를 제공합니다.

`\\section` 명령은 머리말 내용에 영향을 주지 않습니다. 왜냐하면 우리의 머리말 재정의는 오직 `\leftmark` 만 사용해 현재 장의 세부 정보를 얻기 때문입니다. 현재 섹션의 세부 정보를 얻으려면 다음을 사용해야 합니다 `\rightmark` 다음의 정의에서 `\@oddhead` 및/또는 `\evenhead`.

```latex
\documentclass{book}
% 주: '@'의 카테고리 코드를 일시적으로 11로 변경
% 명령 이름에서 사용할 수 있게 하기 위해
\catcode `@=11
% \@oddfoot와 \evenfoot을 \@empty와 같게 함
% 이들을 빈 값(공백)으로 만들기 위해
\let\@oddfoot\empty\let\evenfoot\empty
% \@oddhead와 \@evenhead를 다시 정의
\renewcommand{\@oddhead}{\leftmark\hfil\thepage}
\renewcommand{\@evenhead}{\thepage\hfil\leftmark}
\catcode `@=12
% 편리하게 작은 페이지 크기를 사용
\usepackage[paperheight=16cm,paperwidth=12cm,textwidth=10cm]{geometry}
\title{\TeX{} 사용자의 회고}
\author{Overleaf}
\begin{document}
\frontmatter
\maketitle
이것은 로마 숫자를 사용하는 서문 부분입니다.
\mainmatter
\chapter{어디서 시작하죠?}
제1장: 짧은 장.
\newpage
\section{처음에...}
한 섹션.
\chapter[짧은 제목]{머리말에 적합하지 않을 정도로 매우 긴 제목을 가진 장}
\newpage
\section{또 다른 절}
내용이 거의 없습니다.
\newpage
\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
% 주: '@'의 카테고리 코드를 일시적으로 11로 변경
% 명령 이름에서 사용할 수 있게 하기 위해
\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{\TeX{} 사용자의 회고}
\author{Overleaf}
\begin{document}
\frontmatter
\maketitle
이것은 로마 숫자를 사용하는 서문 부분입니다.
\mainmatter
\chapter{어디서 시작하죠?}
제1장: 짧은 장.
\newpage
\section{처음에...}
한 섹션.
\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 엔진의 기능을 확장한 것이며, 세 가지 주류 TeX 엔진인 pdfTeX, LuaTeX, XeTeX 모두에서 사용할 수 있습니다.

ε-TeX 구현은 또한 새로운 전역 마크 변수를 도입합니다 `\firstmarks n`, `\botmarks n` 및 `\topmarks n`: 각 클래스마다 하나씩 `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{} (\texttt{\string\botmarks10}를 통해)}
\renewcommand{\rightmark}{\expandafter\@rightmark\firstmarks10 \@empty\@empty{} (\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{} (\texttt{\string\botmarks10}를 통해)}
\renewcommand{\rightmark}{\expandafter\@rightmark\firstmarks10 \@empty\@empty{} (\texttt{\string\firstmarks10}를 통해)}
\catcode`@=12
\title{\(\varepsilon\)-\TeX의 향상된 마크 시연}
\author{Overleaf}
\date{2022년 8월}
\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/600ff92c5477ffac308486ea54879fafaed92157)

* **참고**: 1페이지의 머리말은 클래스 10의 세 마크 변수가 모두—`\botmarks10`, `\topmarks10` 및 `\firstsmarks10`—비어 있을 때 생성됩니다. 그 결과 `\rightmark` (1페이지의 경우) 마지막 머리말 조각만 삽입합니다: `(\texttt{\string\firstmarks10}를 통해)`, 위 그래픽에 표시된 것처럼.

## TeX 엔진이 \botmark, \topmark 및 \firstmark의 값을 어떻게 결정하는지 보여주는 작업 예제

![Db.gif](/files/74fb9893faaeb4f010f2534288587e6e416af200)![Db.gif](/files/74fb9893faaeb4f010f2534288587e6e416af200) Knuth가 사용한 이중 위험 굴절 기호를 재현하는 것이 적절해 보입니다(이미지 제공 [이 웹사이트](http://www.truetex.com/db.htm)) 왜냐하면 이 내용은 다소 저수준이며 “내부를 들여다보는” 내용이기 때문입니다—하지만 좀 더 자세한 내용을 알고 싶어 하는 용감한 독자들에게 흥미로울 수 있기를 바랍니다.

다음 논의는 [The TeXbook](https://www.amazon.co.uk/TeXbook-Donald-Knuth/dp/0201134489). 여기서는 The TeXbook에 접근할 수 없는 분들을 위해 그 예제를 편집하고 다시 조판했습니다:

![TeXbook 258쪽의 예제를 편집하고 다시 조판한 버전](/files/634d9fc04db6c5fadebe70d2b06dc4baf2802084)

이 그래픽에 제시된 표는 Knuth가 제공한 것을 재현한 것이지만, 원본과 마찬가지로 그것이 어떻게 도출되었는지에 대한 설명은 없습니다. 여기서는 이를 다루어 다음 값들이 어떻게 결정되었는지 보여주는 추가 세부 정보를 제공하겠습니다 `\botmark`, `\topmark` 및 `\firstmark` 가 결정되었습니다—이 세부 정보를 얻으려면 TeX 엔진의 소스 코드를 살펴봐야 했습니다!

다음 값들을 설정하는 과정은 `\botmark`, `\topmark` 및 `\firstmark` 다음 도표와 뒤따르는 설명에 보인 것처럼 3개의 짧은 의사코드 조각으로 요약할 수 있습니다:

1. 내용 전 검사
2. 내용 루프
3. 내용 후 검사

참고:

* 1단계 “내용 전 검사”와 3단계 “내용 후 검사”의 검사는 페이지마다 한 번씩 수행됩니다.
* 2단계 “내용 루프”에서는 TeX가 페이지 내용을 훑으며 마크 노드를 찾고, 이를 사용해 표시된 대로 마크 변수 값을 설정합니다.

![TeX 엔진이 사용하는 세 개의 전역 마크 변수 값을 설정하는 데 사용되는 코드의 의사코드 버전을 보여주는 이미지](/files/360b62230a5ffbc95b23b217196b7278b0ade303)

TeX가 적절한 페이지 나눔을 찾을 때마다 해당 페이지의 내용을 최종 처리로 보내며, 문서의 모든 페이지에 대해 이 (세 가지) 마크 처리 단계를 수행합니다. 1, 2, 3으로 표시된 처리 단계는 이 절의 마지막 도표에서 참조됩니다.

다음에 유의하자:

* 첫 번째 페이지가 처리되기 전에, 세 개의 전역 마크 변수는 모두 `\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` 노드가 없습니다.

이 테스트는 *한 번 수행된다는 점에 유의하세요* 처리 중인 각 페이지에 대해.

**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는 다음의 최종 검사를 적용하며, 이 검사 역시 페이지당 한 번 수행된다:

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

* 만약 `\topmark` 비어 있지 않다면(NULL이 아니라면) 우리는 1단계에서 `\botmark` 이전 페이지의 것은 비어 있지 않았다(NULL이 아니었다).
* 만약 `\firstmark` 여전히 비어 있다면 우리는 어떤 `\mark` 노드도 본 적이 없는데, 이는 2단계의 검사가 트리거되지 않았기 때문이다; 따라서, `\firstmark` 는 `\topmark` 의 값으로 설정되며, 이는 또한 `\botmark` 이전 페이지의 값이기도 하다.

예제의 6개 페이지 전체에 이 세 단계를 순차적으로 적용한 후, `\botmark`, `\topmark` 및 `\firstmark` 의 값은 아래 다이어그램에 표시된 전이를 사용하여 도출되며, 여기서:

* 연한 파란색 둥근 사각형은 각 페이지의 최종 mark 변수 값이다
* 연한 회색 둥근 사각형은 처리 중에 발생하는 중간 값을 나타낸다
* 라벨이 붙은 화살표는 위 다이어그램의 1, 2 또는 3단계에 따른 marker 변수 값의 변화를 나타내며—또는 어떤 단계에서도 값이 변경되지 않았음을 나타낸다; 라벨은 “변화 없음”이다.

다음 다이어그램은 세 개의 의사코드 조각이 `\botmark`, `\topmark` 및 `\firstmark` The TeXbook의 258쪽에 있는 표에 나열된.

![The TeXbook 258쪽의 예제를 보조하는 전이 다이어그램으로, 전역 mark 변수에 값이 할당될 때의 내부 전이를 보여준다](/files/49b49326830de0fa3d2597b48382a8aea623c105)


---

# 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/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.
