LaTeX で \oddsidemargin を 0pt にすると、左余白はゼロになりません——きっちり 1 インチ になります。おかしな仕様に見えますが、これは TeX が DVI から受け継いだ約束事で、ページの基準点が紙の左上から縦横 1 インチ内側に置かれているからです。余白のパラメータはすべて、その点からの 増減 として測られます。この一点を知っているかどうかで、余白設定の見え方はまるで変わります。このページでは、その 1 インチの正体、標準クラスが実際に何ポイントの版面を組んでいるか、そして今日の答えである geometry パッケージで規定どおりの余白にきっちり合わせる方法を、すべて実測値で追います。
なぜ \oddsidemargin=0pt が 1 インチの余白になるのか
基準点が紙の角ではなく、そこから 1 インチ内側にあるからです。実測して確かめられます——article で \oddsidemargin と \topmargin をどちらも 0pt にし、本文の 1 文字目の絶対位置を pdfTeX に問い合わせると、左端から 72.26999pt、すなわち 1.00000 インチ ちょうどでした。だから実際の左余白は次の足し算で決まります。\hoffset は基準点そのものを動かすノブで、\oddsidemargin はそこからさらにずらす量です。\hoffset を 20pt にして測り直すと、左端はぴたりと 92.27pt(=72.27+20)に移動しました。
% How the page is actually built up (all measured, article, letterpaper)
% left margin = 1in + \hoffset + \oddsidemargin
% top of header = 1in + \voffset + \topmargin
% top of body = top of header + \headheight + \headsep
% first baseline = top of body + \topskip
% The classical way, by hand. Correct, but you own every consequence.
\setlength{\oddsidemargin}{0pt} % real left margin = 1in + 0pt = 1in
\setlength{\topmargin}{0pt} % header top at 1in; body starts 37pt lower
\setlength{\textwidth}{16cm} % the RIGHT margin is now whatever is left
\setlength{\textheight}{24cm} % likewise the bottom margin
% Measured with the two margins above: left edge 72.26999pt = 1.00000in,
% first baseline 119.27pt from the paper top = 1in + 0 + 12 + 25 + 10ついでに、この 1in の中身も見ておく価値があります。TeX の pt は アメリカの活字点(1 インチ = 72.27pt) で、DTP や PostScript の点(1 インチ = 72 点)とは別物です。TeX ではそちらを bp(big point)と呼び、実測すると 1bp = 1.00374pt。つまり 12pt と 12bp は約 0.37% 違います。一行分ではまず見えない差ですが、\textwidth の 345pt に同じ割合が乗れば 1.29pt、およそ 0.45mm。余白を mm 単位で規定された書類では、単位を取り違えると規定から外れることがあります。pdfTeX はこの 1 インチのオフセットを \pdfhorigin/\pdfvorigin として持っていて、どちらも既定は 72.26999pt です。
| パラメータ | 意味 |
|---|---|
\paperwidth / \paperheight | 用紙そのものの寸法。LaTeX 側の認識であって、PDF の物理ページサイズとは別(後述) |
\textwidth / \textheight | 本文(版面)の幅と高さ。article 10pt では 345.0pt × 550.0pt |
\oddsidemargin | 奇数ページ(片面では全ページ)の左余白を、基準点から測った増分。実際の余白は 1in を足した値 |
\evensidemargin | 両面(twoside)時、偶数ページの左余白の増分。book 10pt の既定は 89.0pt |
\topmargin | 基準点からヘッダ上端までの距離。本文の上端ではありません |
\headheight | ヘッダ(柱)を入れる箱の高さ。既定は 12.0pt |
\headsep | ヘッダ下端と本文上端の間隔。article の既定は 25.0pt |
\footskip | 本文最終行のベースラインからフッタのベースラインまでの距離。既定は 30.0pt |
\marginparwidth / \marginparsep | 傍注の幅と、本文との間隔。article 10pt では 65.0pt と 11.0pt |
\hoffset / \voffset | 基準点そのものを動かす。ふつうは 0pt のまま触りません |
手で合わせようとすると、この表がそのまま落とし穴の一覧になります。\textwidth を広げても右余白は自動では狭まらない(右余白は「用紙幅 − 左余白 − \textwidth」の残り物なので、勝手に変わってしまう)。\topmargin はヘッダの上端までの距離なので、本文を 1 インチ下げたいなら \headheight と \headsep を引き算しなければならない。実際 geometry に margin=1in を渡して測ると、\topmargin は −37.0pt、つまり −(12 + 25) になっていました。この引き算を毎回自分でやる理由はもうありません。
標準クラスの余白が広いのはなぜか——article と book の実測値
一行の文字数を読みやすい範囲に抑えるためです。article の 10pt は用紙の幅にかかわらず \textwidth を 345.0pt に固定していて、レターサイズ(614.295pt 幅)なら左右におよそ 134pt ずつ、A4(597.5pt 幅)でも同じ 345.0pt です。用紙が広くなっても行が長くならないのは、行長が読みやすさで決まるべきものだからです。文字サイズを上げると版面も少しずつ広がります——11pt で 360.0pt、12pt で 390.0pt。文字が大きくなれば同じ行長により少ない文字しか入らないので、そのぶん幅を足しているわけです。
| クラス(レターサイズ) | textwidth | textheight | oddsidemargin | evensidemargin |
|---|---|---|---|---|
article | 345.0pt | 550.0pt | 62.0pt | 62.0pt |
article, 11pt | 360.0pt | 541.4pt | 54.0pt | 55.0pt |
article, 12pt | 390.0pt | 548.5pt | 39.0pt | 40.0pt |
book | 345.0pt | 550.0pt | 35.0pt | 89.0pt |
book の行に、両面レイアウトの設計思想が丸ごと出ています。奇数ページの左(=綴じ側)は 1in + 35.0pt = 107.27pt、外側にあたる右は残りの 162.02pt。つまり LaTeX の book は 綴じ側より小口側を広く 取ります。製本のために内側を広げる、という一般則の逆に見えますが、これは外側の余白を傍注(\marginpar)の置き場として確保しているからで、\marginparwidth が 65.0pt もあるのはそのためです。偶数ページでは左右が入れ替わり、\evensidemargin の 89.0pt が使われます。傍注を使わない文書でこの版面をそのまま使うと、外側だけ間延びして見えます——そこが geometry の出番です。
geometry の使い方——用紙と余白を一行で
\usepackage[a4paper, margin=25mm]{geometry} の一行で、用紙も四辺の余白も決まります。オプションは \usepackage の角括弧に書いても、あとから \geometry{...} 命令で書いても同じで、プリアンブル内なら何度呼んでも構いません(同じキーを後から書けば上書きされます)。順序も無関係です。作者は Hideo Umeki、著作権表示は 1996 年から始まり、2018 年以降は David Carlisle が保守しています(TeX Live 2024 同梱は v5.9、2020 年 1 月)。四半世紀にわたって「余白といえばこれ」であり続けているのは、指定の仕方が人間の考え方の順序と一致しているからです——紙の端からいくつ、と言えばよい。
| オプション | 意味 |
|---|---|
a4paper / letterpaper / … | 用紙を名前で指定。A0〜A6・B0〜B6・b5paper・a5paper・legalpaper・executivepaper などが揃っています |
paperwidth= / paperheight= / papersize= | 任意サイズ。papersize={210mm,297mm} のようにまとめても書けます |
margin= | 四辺の余白を一括。margin={A,B} なら左右=A・上下=B |
left= / right= / top= / bottom= | 各辺を個別に。lmargin/rmargin/tmargin/bmargin は同義語 |
hmargin= / vmargin= | hmargin={左,右}、vmargin={上,下} の対で指定 |
inner= / outer= | 両面レイアウトでの綴じ側・小口側。left/right の別名です |
textwidth= / textheight= / total= | 余白ではなく版面の側から指定。total={幅,高さ} は本文ブロック全体の寸法で、width=/height= も同じ系統のキーです |
bindingoffset= | 綴じ代。内側(片面なら左)にこの長さを足します |
includehead / includefoot | ヘッダ(\headheight+\headsep)やフッタ(\footskip)を本文ブロックの高さに算入します |
landscape | 横向き。幅と高さを入れ替えます |
asymmetric | 両面でも奇数・偶数ページの左右を入れ替えません(傍注を常に同じ側に置きたいとき) |
showframe | 版面・ヘッダ・フッタの枠を実際に描きます。規定に合っているか目視で確かめるとき用 |
規定どおりの余白にきっちり合わせる
要求されている数値を、そのまま geometry のキーに書き写すのが最短です。実例で確かめましょう。「A4、綴じ側 30mm、小口側 20mm、綴じ代 5mm、両面」という指定を次のように書き、\oddsidemargin と \evensidemargin を測ったところ、それぞれ 27.31464pt と −15.36449pt になりました。1 インチを足すと、奇数ページの綴じ側は 99.5846pt = 35mm(30 + 5)、偶数ページの左(小口側)は 56.9055pt = 20mm ちょうど。左右が入れ替わっても綴じ側は常に 35mm、小口側は常に 20mm です。
\documentclass[twoside]{book}
\usepackage{geometry}
\geometry{
a4paper,
inner=30mm, % binding side
outer=20mm, % fore-edge
bindingoffset=5mm, % added to the inner side
includehead, % count the header into the block height
}
% Measured result: \oddsidemargin 27.31464pt, \evensidemargin -15.36449pt
% -> binding side 35mm, fore-edge 20mm, on both odd and even pages
\begin{document}
Body text goes into this block.
\end{document}確かめ方も覚えておくと安心です。プリアンブルに showframe を足せば版面・ヘッダ・フッタの枠が実際に描かれ、layout パッケージの \layout 命令は各パラメータを図解した一覧ページを吐きます。数値そのものを見たいなら \the\textwidth などを \typeout すればログに出ます。なお、余白と版面を同時に指定しすぎると Package geometry Warning: Over-specification in h-direction. という警告が出て、geometry がどれか一つを無視します。左右の余白と textwidth を三つとも書けば、辻褄が合うのは偶然だけです——指定するのは二つまで、残りは計算させる のが原則です。
用紙サイズを指定したのに PDF が A4 で出てくる
クラスオプションは LaTeX に用紙サイズを教えるだけで、PDF の物理ページサイズには触りません。両者は別の変数です。実測すると、\documentclass[a5paper]{article} では LaTeX 側の \paperwidth が 421.10078pt になる一方、pdfTeX 側の \pdfpagewidth は 597.50787pt のまま——A4 の幅です。[letterpaper] でも [b5paper] でも同じで、PDF の紙は TeX ディストリビューションの既定(TeX Live 2024 の初期設定では A4)に居座り続けます。結果として、レイアウトは A5 用に組まれているのに用紙は A4、という中途半端な PDF ができあがります。
geometry を読み込むと、この不整合は自動的に解消されます。実測でも、geometry に用紙を渡した四つのケースすべてで \pdfpagewidth/\pdfpageheight が \paperwidth/\paperheight と一致しました。用紙サイズはクラスオプションではなく geometry 側に書く ——覚えておく価値のある実務則です。
文書の途中で余白を変える——\newgeometry と \restoregeometry
本文中で \newgeometry{...} を呼べば、そこから新しい版面に切り替わります。用紙サイズ関連を除いてそれまでの指定をいったんリセットし、渡したオプションだけを適用する仕様なので、元の値の一部だけを上書きするつもりで書くと事故になります。実測では、A4・margin=1in の文書で \newgeometry{margin=1cm} を呼ぶと \textwidth が 452.9679pt から 540.60239pt(= 597.50787 − 2×28.4526)に変わり、\restoregeometry で 452.9679pt に戻りました。両方とも自動で \clearpage を挟むので、ページの途中では切り替わりません。同じレイアウトを何度も使い回すなら、\savegeometry{名前} で保存して \loadgeometry{名前} で呼び出せます。
\usepackage[a4paper, margin=1in]{geometry}
\savegeometry{normal} % remember this layout under a name
% ... in the body:
\newgeometry{margin=1cm} % wide pages start here (a \clearpage is inserted)
% a big landscape table, an appendix, a fold-out figure ...
\restoregeometry % back to the preamble layout (another \clearpage)
% \loadgeometry{normal} % or recall a saved one by name横向きのページを一枚だけ挟みたいなら、\newgeometry{landscape, ...} と組み合わせるか、用途特化の lscape/pdflscape パッケージの landscape 環境を使います(pdflscape は PDF ビューアの表示も回転させてくれるので、画面で読む文書ではこちらが便利です)。なお、変えたいのがページの形ではなく 見出しの体裁 やヘッダ・フッタの中身なら、それぞれ titlesec と fancyhdr の担当です。二段組も別ページで扱っています。