ヘッダー・フッター・ページ番号

ページ上端の柱(ヘッダー)と下端のページ番号は、同じひとつの問いに答えるためにあります——いま自分は本のどのあたりにいるのか。この装置は印刷より古く、中世の写本ではすでに、上の余白にわざわざ一行分の罫を引いて標題を書き入れ、冊子をめくる読者が自分の居場所を見失わないようにしていました。LaTeX はその仕事を ページスタイル という仕組みに任せます。\pagestyle で選ぶ 4 つの組み込みスタイルがあり、それで足りなくなったら定番パッケージ fancyhdr に移る、という順序です。このページでは同じ道筋をたどって、章の 1 ページ目だけヘッダーが消える理由、\leftmark\rightmark で章タイトルを柱に引き込む方法、そして \pagenumbering で前付けをローマ数字・本文をアラビア数字にする方法までを見ていきます。

\pagestyle で選ぶ 4 つのページスタイル

素の LaTeX では、ヘッダーとフッターを 1 か所ずつ設定するのではなく、ページスタイル という名前のついた組を丸ごと切り替えます。プリアンブルに \pagestyle{headings} と書けばそこから文書の終わりまで効き、そのページ 1 枚だけ変えたいときは本文中の \thispagestyle{empty} が現在ページだけを上書きします。標準で用意されているのはちょうど 4 つです。

スタイル出るもの
emptyヘッダーもフッターも空。ページ番号も出ない
plainヘッダーは空、フッター中央にページ番号だけ。articlereport の既定
headingsフッターは空。ヘッダーに章・節の見出しとページ番号。book の既定
myheadingsheadings と同じ配置。ただし自動更新は止まり、文字列は \markboth\markright で自分が与える

どれが最初から効いているかはドキュメントクラスが決めます。articlereportplain で始まり、下中央のページ番号以外なにも出ません。bookheadings で始まり、章と節の見出しが上を流れていきます。この差は気まぐれではありません。10 ページの論文は毎ページ現在地を告げる必要がありませんが、400 ページの本では柱こそが、索引から本文へ跳び戻るための足がかりになるからです。

headings が柱に何を入れるかも、やはりクラスが決めています。両面の book では偶数(左)ページに章タイトル、奇数(右)ページに節タイトルが入り、ページ番号はつねに外側(小口側)です。myheadings を選ぶと自動更新が止まり、代わりに \markboth{左ページ用}{右ページ用}(両面)や \markright{右ページ用} で文字列を自分が渡すことになります。ただし組み込みスタイルが曲がるのはここまでで、「左に文書名・右にページ番号」という程度のありふれた配置すら作れません。その先は fancyhdr の担当です。

章の 1 ページ目だけヘッダーが消えるのはなぜか

答えは \chapter の定義そのものに書かれています。book.cls\chapter は、改ページした直後の 2 行目で \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 が開く 6 つのスロット

fancyhdr を読み込んで \pagestyle{fancy} を宣言すると、ヘッダーとフッターにそれぞれ左(L)・中央(C)・右(R)の 3 か所、合わせて 6 つのスロットが開き、好きなものを流し込めるようになります。作者は Pieter van Oostrum、パッケージの著作権表示は 1994 年から続いています。名前が切り詰められているのには経緯があります。最初のバージョンは fancyheadings.sty という名前でしたが、当時まだ現役だった MS-DOS はファイル名を 8 文字しか保持できず、ディスク上では fancyhea.sty になってしまいました。やがて \usepackage{fancyhea} と書く人が現れ、その文書は Unix ではコンパイルできなくなります。作者はこれに嫌気がさして、8 文字に収まる名前——fancyhdr——へ改名したのです。

実務の定石は、まず \fancyhf{} で 6 スロットを空にしてから、必要な場所だけ埋めることです。この掃除を飛ばすと、クラスが入れていた柱が下に残り、同じ文字列が二重に出ることがあります。埋めるときはヘッダーが \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(罫線なし)。この 2 つは長さではなくマクロなので、\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} と書けば、そのページの章タイトルがヘッダーに入ります。bookreport では \leftmark が現在の章、\rightmark が現在の節を保持していて、\chapter\section が処理されるたびに中身が入れ替わります。article には章がないので役が一段ずれ、両面では \leftmark が節・\rightmark が小節、既定の片面では \rightmark が節を受け持ちます。

この仕掛けの土台は TeX の \mark 命令です。TeX は 1 ページを組み上げるたびに、そのページに現れた mark のうち 最初のもの(\firstmark)と最後のもの(\botmark を別々に取り分けます。LaTeX の kernel は、そこから \leftmark\botmark の左側、\rightmark\firstmark の右側として定義しています。左右で「最後/最初」と非対称なのは辞書の柱を思えば腑に落ちます——ページの上端に載せる見出し語は、そのページに実際に載っている最初と最後の項目でなければ役に立たないからです。この設計は実務にも顔を出します。節がページの途中から始まると、\rightmark は最初の mark を拾うので、そのページの柱には上半分の節ではなく 下半分で始まったばかりの節 の名前が出ます。仕様どおりの動作で、バグではありません。

もうひとつの定番のつまずきが大文字化です。標準クラスの \chaptermark\sectionmark は見出しを \MakeUppercase に通してから mark に渡すので、\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 から」という書籍の定番は、ソース 2 行で済みます。

引数出力
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 クラスを使っているなら、その 2 行はすでに書かれています。\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 に移る。必要になった層だけをその都度導入する構成が、結局いちばん壊れにくく残ります。そしてもうひとつ、忘れやすい原則があります。柱は読者が現在地を知るための道具です。だから上に載せるものは、文書のタイトルよりも「いま読んでいる章・節」のほうが、たいていよく働きます。