여백과 판면

LaTeX에서 \oddsidemargin0pt로 두면 왼쪽 여백은 0이 되지 않고 정확히 1인치 가 됩니다. 설계가 잘못된 것처럼 보이지만, 이는 TeX이 DVI에서 물려받은 약속입니다. 페이지의 기준점이 종이 왼쪽 위에서 가로세로 1인치 안쪽에 놓여 있고, 모든 여백 매개변수는 그 점으로부터의 증감 으로 측정됩니다. 이 하나를 아느냐 모르느냐로 여백 설정이 전혀 다르게 보입니다. 이 페이지에서는 그 1인치의 정체, 표준 클래스가 실제로 어떤 판면을 조판하는지, 그리고 오늘의 답인 geometry 패키지로 요구된 여백 규정에 정확히 맞추는 방법을 모두 실측값으로 따라갑니다.

\oddsidemargin=0pt이 1인치 여백이 되는가

기준점이 종이의 모서리가 아니라 거기서 1인치 안쪽에 있기 때문입니다. 실측으로 확인할 수 있습니다. article에서 \oddsidemargin\topmargin을 모두 0pt로 두고 본문 첫 글자의 절대 위치를 pdfTeX에 물으면 왼쪽 가장자리에서 72.26999pt, 곧 정확히 1.00000인치 였습니다. 그래서 실제 왼쪽 여백은 다음 덧셈으로 정해집니다. \hoffset은 기준점 자체를 옮기는 손잡이이고, \oddsidemargin은 거기서 다시 밀어내는 양입니다. \hoffset20pt로 두고 다시 재니 왼쪽 끝이 정확히 92.27pt(= 72.27 + 20)로 이동했습니다.

latex
% 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의 pt1인치에 72.27개인 미국 활자 포인트 로, DTP나 PostScript의 1인치 72포인트와는 다릅니다. TeX은 후자를 bp(big point)라고 부르며, 실측하면 1bp = 1.00374pt입니다. 즉 12pt12bp는 약 0.37% 차이가 납니다. 한 줄 안에서는 보이지도 않지만, 같은 비율을 \textwidth의 345pt에 적용하면 1.29pt, 곧 0.45mm 남짓이 됩니다. 여백이 mm 단위로 규정된 서류에서는 단위를 잘못 고르면 규정을 벗어날 수 있습니다. pdfTeX은 이 1인치 오프셋을 \pdfhorigin\pdfvorigin으로 가지고 있으며, 둘 다 기본값은 72.26999pt입니다.

매개변수의미
\paperwidth / \paperheight용지 자체의 치수. LaTeX 쪽의 인식일 뿐 PDF의 물리적 페이지 크기와는 다릅니다(뒤에서 설명)
\textwidth / \textheight본문(판면)의 폭과 높이. 10pt article에서는 345.0pt × 550.0pt
\oddsidemargin홀수 페이지(단면에서는 모든 페이지) 왼쪽 여백의 기준점 기준 증분. 실제 여백은 1in을 더한 값
\evensidemargin양면(twoside)에서 짝수 페이지 왼쪽 여백의 증분. 10pt book의 기본값은 89.0pt
\topmargin기준점에서 머리글 위끝까지의 거리. 본문 위끝이 아닙니다
\headheight머리글(주두)을 담는 상자의 높이. 기본값 12.0pt
\headsep머리글 아래끝과 본문 위끝 사이 간격. article 기본값 25.0pt
\footskip본문 마지막 줄 베이스라인에서 바닥글 베이스라인까지의 거리. 기본값 30.0pt
\marginparwidth / \marginparsep방주의 폭과 본문과의 간격. 10pt article에서는 65.0pt와 11.0pt
\hoffset / \voffset기준점 자체를 움직입니다. 보통은 0pt 그대로 두고 건드리지 않습니다

손으로 맞추려 들면 이 표가 그대로 함정 목록이 됩니다. \textwidth를 넓혀도 오른쪽 여백은 저절로 좁아지지 않습니다(오른쪽 여백은 “용지 폭 − 왼쪽 여백 − \textwidth”의 나머지라서 모르는 사이에 바뀝니다). 그리고 \topmargin은 머리글 위끝까지의 거리이므로, 본문을 1인치까지 내리려면 \headheight\headsep을 직접 빼야 합니다. 실측하면 geometrymargin=1in을 넘겼을 때 \topmargin−37.0pt, 곧 정확히 −(12 + 25)였습니다. 이 뺄셈을 매번 직접 할 이유는 이제 없습니다.

표준 클래스의 여백이 넓은 이유 — articlebook 실측값

한 줄의 글자 수를 읽기 좋은 범위로 묶어 두기 위해서입니다. 10pt article은 용지 폭과 무관하게 \textwidth345.0pt로 고정합니다. 레터(폭 614.295pt)에서는 좌우로 약 134pt씩 남고, A4(폭 597.5pt)에서도 본문은 여전히 345.0pt입니다. 용지가 넓어져도 행이 길어지지 않는 것은 행 길이가 가독성으로 정해져야 하기 때문입니다. 글자를 키우면 판면도 조금씩 넓어집니다. 11pt에서 360.0pt, 12pt에서 390.0pt로, 글자가 커지면 같은 폭에 더 적은 글자만 들어가기 때문입니다.

클래스(레터 용지)textwidthtextheightoddsidemarginevensidemargin
article345.0pt550.0pt62.0pt62.0pt
article, 11pt360.0pt541.4pt54.0pt55.0pt
article, 12pt390.0pt548.5pt39.0pt40.0pt
book345.0pt550.0pt35.0pt89.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 동봉판은 2020년 1월의 v5.9). 사반세기 동안 여백의 표준 답으로 남아 있는 이유는 지정 방식이 사람의 사고 순서와 일치하기 때문입니다. 종이 가장자리에서 몇 밀리미터, 라고 말하면 됩니다.

옵션의미
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입니다.

document.tex
\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 쪽 \pdfpagewidth597.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{이름}으로 불러올 수 있습니다.

latex
\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/pdflscapelandscape 환경을 씁니다(pdflscape는 PDF 뷰어의 표시도 회전시켜 주므로 화면으로 읽는 문서에 편리합니다). 한편 바꾸려는 것이 페이지의 형태가 아니라 제목의 체재 나 머리글·바닥글의 내용이라면 각각 titlesecfancyhdr의 담당입니다. 다단 조판도 별도 페이지에서 다룹니다.