머리글, 바닥글과 페이지 번호

페이지 위쪽의 머리글과 아래쪽의 쪽 번호는 같은 질문에 답하기 위해 존재합니다. 지금 나는 이 책의 어디쯤 있는가. 이 장치는 인쇄술보다 오래되었습니다. 중세의 필사가들은 사본 윗여백에 줄을 하나 더 긋고 그 자리에 표제를 적어 두었고, 덕분에 책장을 넘기는 독자가 자기 위치를 놓치지 않을 수 있었습니다. LaTeX 은 이 일을 페이지 스타일 이라는 장치에 맡깁니다. \pagestyle 로 고르는 네 가지 내장 스타일이 있고, 그것으로 모자라면 표준 패키지 fancyhdr 로 넘어가는 순서입니다. 이 페이지에서는 같은 길을 따라가며, 장의 첫 페이지에서만 머리글이 사라지는 이유, \leftmark\rightmark 로 장 제목을 머리글에 끌어오는 방법, 그리고 \pagenumbering 으로 앞부분은 로마 숫자, 본문은 아라비아 숫자로 매기는 방법까지 살펴봅니다.

\pagestyle 로 고르는 네 가지 페이지 스타일

순수한 LaTeX 에서 머리글과 바닥글은 한 자리씩 설정하는 것이 아니라, 페이지 스타일 이라는 이름 붙은 묶음을 통째로 바꾸는 방식입니다. 프리앰블에 \pagestyle{headings} 를 쓰면 그 지점부터 문서 끝까지 적용되고, 본문의 \thispagestyle{empty} 는 지금 페이지 한 장만 덮어씁니다. 표준으로 준비된 스타일은 정확히 네 가지입니다.

스타일무엇이 나오는가
empty머리글도 바닥글도 비어 있고 쪽 번호도 없음
plain머리글은 비어 있고 바닥글 가운데에 쪽 번호만. article / report 의 기본값
headings바닥글은 비어 있고 머리글에 장·절 제목과 쪽 번호. book 의 기본값
myheadingsheadings 와 같은 배치지만 자동 갱신이 멈추고, 문자열은 \markboth / \markright 로 직접 넘김

어느 것이 이미 적용되어 있는지는 문서 클래스가 정합니다. articlereportplain 으로 시작해 바닥글 가운데의 쪽 번호밖에 없고, bookheadings 로 시작해 위쪽에 장·절 제목이 흘러갑니다. 이 차이는 변덕이 아닙니다. 열 쪽짜리 논문은 매 페이지마다 현재 위치를 알릴 필요가 없지만, 400쪽짜리 책에서는 머리글이야말로 독자가 색인에서 본문으로 되돌아 뛰는 발판이 되기 때문입니다.

headings 가 머리글에 무엇을 넣는지도 클래스가 정합니다. 양면 book 에서는 짝수(왼쪽) 페이지에 장 제목, 홀수(오른쪽) 페이지에 절 제목이 들어가고, 쪽 번호는 언제나 바깥쪽(책배 쪽)에 놓입니다. myheadings 를 고르면 자동 갱신이 멈추고, 대신 \markboth{왼쪽 페이지}{오른쪽 페이지}(양면)나 \markright{오른쪽 페이지} 로 문자열을 직접 넘기게 됩니다. 내장 스타일이 휘어지는 폭은 여기까지입니다. “왼쪽에 문서 제목, 오른쪽에 쪽 번호” 정도의 평범한 배치조차 만들 수 없습니다. 그 앞은 fancyhdr 의 몫입니다.

장의 첫 페이지에서만 머리글이 사라지는 이유

답은 \chapter 의 정의 안에 있습니다. book.cls 에서 \chapter 는 쪽을 넘긴 바로 다음 줄에 \thispagestyle{plain} 을 실행합니다. 그래서 장이 시작되는 페이지는 무엇을 설정했든 plain——머리글 없이 바닥글 가운데의 쪽 번호만——으로 바뀝니다. \part\maketitle 도 똑같이 합니다. \pagestyle{empty} 로 선언했는데 표제지와 각 장 첫 페이지에만 쪽 번호가 남는 현상의 정체가 이것입니다.

고치는 방법은 목적에 따라 갈립니다. 번호까지 없애고 싶다면 \chapter{…} 바로 뒤\thispagestyle{empty} 를 씁니다. 프리앰블에 써 두어도 소용없습니다. \chapter 가 실행되는 순간 설정을 덮어쓰기 때문입니다. 반대로 장 첫 페이지도 책의 나머지와 같은 체재로 맞추고 싶다면 plain 이라는 스타일 자체를 다시 만듭니다. fancyhdr\fancypagestyle{plain}{…} 이 그 명령으로, 한 번 정의해 두면 \chapterplain 을 부르러 와도 클래스의 설계가 아니라 직접 만든 설계가 돌아옵니다.

latex
% Fix 1: drop the page number too, on this chapter page only.
% This must come AFTER \chapter, never in the preamble.
\chapter{Introduction}
\thispagestyle{empty}

% Fix 2: redefine plain, so every chapter opening follows your design.
\fancypagestyle{plain}{%
  \fancyhf{}%
  \fancyfoot[C]{\thepage}%
  \renewcommand{\headrulewidth}{0pt}%
}

\pagestyle{fancy} — fancyhdr 가 여는 여섯 개의 슬롯

fancyhdr 를 불러오고 \pagestyle{fancy} 를 선언하면 머리글과 바닥글에 각각 왼쪽(L)·가운데(C)·오른쪽(R) 세 자리, 모두 여섯 개의 슬롯이 열려 원하는 것을 채울 수 있게 됩니다. 만든 사람은 Pieter van Oostrum 이고, 패키지 안의 저작권 표시는 1994년부터 이어집니다. 이름이 잘려 있는 데에는 사연이 있습니다. 첫 버전의 이름은 fancyheadings.sty 였는데, 그때만 해도 현역이던 MS-DOS 는 파일 이름을 여덟 글자까지만 보관해서 디스크에는 fancyhea.sty 로 들어갔습니다. 그러자 \usepackage{fancyhea} 라고 쓰는 사람이 나타났고, 그런 문서는 유닉스에서 컴파일되지 않았습니다. 저자는 이 상황이 몹시 거슬려서 여덟 글자에 들어맞는 이름, fancyhdr 로 패키지를 바꿔 불렀습니다.

실무의 정석은 먼저 \fancyhf{} 로 여섯 슬롯을 비운 뒤 필요한 자리만 채우는 것입니다. 이 청소를 건너뛰면 클래스가 넣어 둔 머리글이 아래에 그대로 남아 같은 문구가 두 번 나올 수 있습니다. 채울 때는 머리글이 \fancyhead[L]{…} / [C] / [R], 바닥글이 \fancyfoot[L]{…} / [C] / [R] 입니다. 위치를 나타내는 문자는 이어 쓸 수 있어서 \fancyhead[LO,RE]{…} 처럼 여러 슬롯을 한 번에 지정할 수 있습니다.

latex
\usepackage{fancyhdr}
\pagestyle{fancy}
\fancyhf{}                       % clear all six slots first
\fancyhead[L]{Document title}    % header, left
\fancyhead[R]{\thepage}          % header, right: the page number
\fancyfoot[C]{\today}            % footer, centre

양면(twoside) 문서에서는 위치에 짝수 페이지(E)·홀수 페이지(O) 를 조합합니다. [LE,RO] 는 “짝수 페이지에서는 왼쪽, 홀수 페이지에서는 오른쪽”, 곧 펼침면 바깥쪽 책배 모서리이자 쪽 번호가 오래도록 자리 잡아 온 곳입니다. EO 도 붙이지 않은 [L] 은 양쪽 페이지에 같은 내용을 둡니다. 머리글 아래와 바닥글 위에 그어지는 선은 \headrulewidth\footrulewidth 이고, 기본값은 각각 0.4pt0pt(선 없음)입니다. 이 둘은 길이가 아니라 매크로여서 \setlength 가 아니라 \renewcommand 로 바꿉니다. 거의 누구나 한 번은 걸려 넘어지는 지점입니다.

latex
\renewcommand{\headrulewidth}{0.4pt}  % header rule; this is the default
\renewcommand{\footrulewidth}{0pt}    % no footer rule; also the default

머리글에 장 제목 넣기 — \leftmark\rightmark

\fancyhead[L]{\leftmark} 라고 쓰면 그 페이지의 장 제목이 머리글에 들어갑니다. book / report 에서는 \leftmark 가 현재 장을, \rightmark 가 현재 절을 담고 있으며, \chapter\section 이 처리될 때마다 내용이 갈립니다. article 에는 장이 없어서 한 단계씩 내려갑니다. 양면에서는 \leftmark 가 절, \rightmark 가 소절을 맡고, 기본값인 단면에서는 \rightmark 가 절을 맡습니다.

이 장치의 바탕에는 TeX 의 \mark 원시 명령이 있습니다. TeX 은 한 페이지를 조판할 때마다 그 페이지에 나타난 마크 중 첫 번째(\firstmark)와 마지막(\botmark)을 따로 간직합니다. LaTeX 커널은 여기서 \leftmark\botmark 의 왼쪽 절반으로, \rightmark\firstmark 의 오른쪽 절반으로 정의합니다. 좌우가 “마지막/첫 번째”로 어긋나 있는 이유는 사전의 머리글을 떠올리면 납득됩니다. 페이지 맨 위의 안내 단어는 그 페이지에 실제로 실린 첫 항목과 마지막 항목을 가리켜야만 쓸모가 있기 때문입니다. 이 설계는 실무에서도 얼굴을 내밉니다. 절이 페이지 중간에서 시작하면 \rightmark 는 그 페이지의 첫 마크를 집어 오므로, 머리글에는 윗부분을 채운 절이 아니라 아래쪽에서 막 시작한 절 의 이름이 나옵니다. 규격대로의 동작이지 버그가 아닙니다.

또 하나의 단골 걸림돌은 대문자화입니다. 표준 클래스의 \chaptermark / \sectionmark 는 제목을 \MakeUppercase 에 통과시킨 뒤 마크에 넘기므로, \leftmark 안에는 처음부터 “CHAPTER 1. INTRODUCTION” 같은 전부 대문자인 문자열이 들어 있습니다. 원래 대소문자로 되돌리려면 fancyhdr\nouppercase 로 감쌉니다. \MakeUppercase\uppercase 가 아무 일도 하지 않는 환경에서 인수를 조판하는 명령입니다. 다만 이 취소는 내부 전체에 걸리므로, 같은 슬롯에 일부러 넣은 대문자도 함께 풀립니다. 머리글 문자열을 온전히 손에 쥐고 싶다면 \markboth / \markright 를 직접 부르거나 \chaptermark 를 다시 정의합니다.

latex
% Chapter title on the left, page number on the right.
% \nouppercase undoes the \MakeUppercase applied by the class.
\fancyhead[L]{\nouppercase{\leftmark}}
\fancyhead[R]{\thepage}

% Or set the running-head text by hand, with no automatic updating.
\pagestyle{myheadings}
\markboth{Left-hand page text}{Right-hand page text}

Package fancyhdr Warning: \headheight is too small 해결하기

이 경고는 머리글을 담는 상자가 그 안에 넣은 내용보다 낮다는 뜻입니다. \headheight 를 경고가 알려 주는 값까지 넓히면 사라집니다. 표준 클래스는 \headheight12pt 로 잡아 두는데, 0.4pt 짜리 선과 그 위의 행간만 얹혀도 곧바로 넘칩니다. fancyhdr 를 넣고 처음 컴파일할 때 이 경고가 대뜸 뜨는 이유입니다. 메시지가 필요한 높이까지 알려 주므로 Make it at least … 뒤의 숫자를 그대로 쓰면 됩니다.

넓히는 방법은 두 가지입니다. \setlength{\headheight}{15pt} 로 직접 지정하거나, geometryheadheight= 옵션으로 넘기는 것입니다. 어느 쪽이든 경고는 사라지지만, 프리앰블에 이미 geometry 가 있다면 값을 그쪽에 모아 두는 편이 안전합니다. \headheight 는 본문 높이나 \topmargin 과 같은 계산식 안에 있어서, 나중에 한쪽만 바꾸면 본문의 세로 위치가 밀릴 수 있기 때문입니다. geometry 를 쓰지 않는다면 \setlength 뒤에 \addtolength{\topmargin}{-3pt} 같은 줄을 더해 합계를 맞추는 것이 정석이며, 경고 메시지가 권하는 것도 바로 이 조정입니다.

latex
% Either one of these is enough.
\setlength{\headheight}{15pt}   % enlarge the header box directly
\addtolength{\topmargin}{-3pt} % ... and keep the vertical totals unchanged

% Or let geometry do the arithmetic for the whole page.
\usepackage[headheight=15pt]{geometry}

쪽 번호를 i, ii, iii 에서 1, 2, 3 으로 바꾸기(\pagenumbering)

\pagenumbering{roman} 이라고 쓰면 이후 쪽 번호가 i, ii, iii… 이 되고, \pagenumbering{arabic} 으로 다시 1, 2, 3… 이 됩니다. 핵심은 이 명령이 서식만 바꾸는 것이 아니라 쪽 카운터를 1로 되돌린다 는 점입니다. LaTeX 의 정의는 글자 그대로 \global\c@page \@ne 로 시작합니다. 덕분에 “앞부분은 로마 숫자로 i부터, 본문은 아라비아 숫자로 1부터”라는 책의 정석이 소스 두 줄로 끝납니다.

인수출력
arabic아라비아 숫자: 1, 2, 3 …(기본값)
roman소문자 로마 숫자: i, ii, iii …(앞부분의 정석)
Roman대문자 로마 숫자: I, II, III …
alph소문자 영문자: a, b, c …. 27쪽에서 ! LaTeX Error: Counter too large. 로 멈춤
Alph대문자 영문자: A, B, C …. 마찬가지로 26쪽에서 바닥남

book 클래스를 쓰고 있다면 그 두 줄은 이미 쓰여 있습니다. \frontmatter 의 정의에는 \pagenumbering{roman} 이, \mainmatter 의 정의에는 \pagenumbering{arabic} 이 들어 있어서, 직접 또 쓰면 같은 전환을 두 번 하는 셈입니다(해롭지는 않지만 군더더기입니다). articlereport 에는 \frontmatter 가 없으므로 그곳에서는 \pagenumbering 을 손으로 부릅니다. 임의의 숫자부터 시작하려면 \setcounter{page}{7}, 지금 몇 쪽인지 꺼내려면 \thepage 를 씁니다. 알아 두면 좋은 함정도 하나 있습니다. alphAlph 는 26쪽분의 글자밖에 없어서, 27쪽에 이르는 순간 ! LaTeX Error: Counter too large. 로 컴파일이 멈춥니다.

latex
% book: \frontmatter and \mainmatter already switch the numbering.
\frontmatter    % includes \pagenumbering{roman}
\tableofcontents
\mainmatter     % includes \pagenumbering{arabic}

% article / report: no \frontmatter, so do it by hand.
\pagenumbering{roman}    % i, ii, iii ... and the counter is reset to 1
\tableofcontents
\clearpage
\pagenumbering{arabic}   % 1, 2, 3 ... counting starts over
\setcounter{page}{7}     % or force any starting number

양면 서적 머리글을 처음부터 끝까지

지금까지의 부품을 하나의 프리앰블로 모으면 전통적인 서적 배치가 됩니다. 쪽 번호는 펼침면 바깥쪽, 장 제목은 짝수 페이지 안쪽, 절 제목은 홀수 페이지 안쪽, 그리고 머리글 아래에는 가는 선. 장이 시작되는 페이지만은 \chapterplain 을 밀어붙이므로, \fancypagestyle{plain} 을 다시 정의해 그곳도 같은 설계 안으로 끌어들입니다.

document.tex
\documentclass[twoside]{book}
\usepackage[headheight=15pt]{geometry}
\usepackage{fancyhdr}

\pagestyle{fancy}
\fancyhf{}                               % clear all six slots first
\fancyhead[LE,RO]{\thepage}              % page number on the outer edge
\fancyhead[RE]{\nouppercase{\leftmark}}  % even page, inner edge: chapter
\fancyhead[LO]{\nouppercase{\rightmark}} % odd page, inner edge: section
\renewcommand{\headrulewidth}{0.4pt}     % thin rule under the header
\renewcommand{\footrulewidth}{0pt}       % no rule above the footer

\fancypagestyle{plain}{%                 % chapter openings, same design
  \fancyhf{}%
  \fancyfoot[C]{\thepage}%
  \renewcommand{\headrulewidth}{0pt}%
}

\begin{document}
\chapter{Introduction}
\section{Background}
Body text goes here. From the next page on, the running head shows
the chapter, the section and the page number.
\end{document}

마지막으로 판단의 기준입니다. 단면의 짧은 문서에 바닥글의 쪽 번호만 있으면 충분하다면 \pagestyle{plain} 그대로 두고 아무것도 더하지 않습니다. 장·절 제목을 머리글에 내는 것이 전부라면 \pagestyle{headings} 로 충분합니다. 위치와 서체를 직접 정하고 싶어지는 순간에 fancyhdr 로 옮깁니다. 필요해진 층만 그때그때 들이는 구성이 결국 가장 오래 버팁니다. 그리고 잊기 쉬운 원칙이 하나 더 있습니다. 머리글은 독자가 현재 위치를 알기 위한 장치입니다. 그래서 그 자리에는 문서 제목보다 “지금 읽고 있는 장·절”이 대개 더 많은 일을 합니다.