표준 클래스

LaTeX의 표준 클래스——article, report, book, letter, 그리고 오래된 slides——가운데 앞의 세 가지는 따로따로 작성된 것이 아닙니다. classes.dtx라는 하나의 소스에서 옵션만 바꿔 생성한 세 가지 출력입니다. TeX Live 2024에 들어 있는 report.clsbook.cls는 둘 다 750행이 채 안 되는데, 두 파일의 diff에 나타나는 줄은 겨우 67행입니다. 보고서와 책을 갈라놓는 것이 그 67행 전부라는 뜻입니다. 이 페이지는 그 67행을 읽어 갑니다. 어느 클래스가 장을 가지는지, 어느 쪽이 단면이고 양면인지, \frontmatter가 실제로 무엇을 전환하는지, 기본 옵션이 어디서 갈라지는지를 모두 실제 출력으로 확인하면서 살펴봅니다.

article, report, book은 같은 소스에서 나왔습니다

세 클래스는 같은 도면에서 찍혀 나옵니다. article.cls를 열면 첫머리에 “classes.dtx (with options: article)”라고 적혀 있고, report.clsbook.cls에도 옵션 이름만 다른 같은 줄이 있습니다. 그래서 차이를 알고 싶다면 해설서를 읽는 것보다 diff를 돌리는 편이 빠릅니다. article.clsreport.cls의 차분은 232행, report.clsbook.cls의 차분은 67행입니다. 이 두 숫자가 곧 거리입니다. article에서 report로 가는 도약은 계층이 통째로 하나 늘어나는 일이지만, report에서 book으로 가는 변화는 훨씬 작습니다. 아래 절들은 그 차분에 실제로 실려 있는 항목만 다룹니다.

shell
# the header that gives the game away, and the two distances
head -8 "$(kpsewhich book.cls)" | grep classes.dtx
#   %% classes.dtx  (with options: `book')

diff "$(kpsewhich article.cls)" "$(kpsewhich report.cls)" | grep -c '^[<>]'   # 232
diff "$(kpsewhich report.cls)"  "$(kpsewhich book.cls)"   | grep -c '^[<>]'   # 67

\chapter가 있느냐 없느냐, 그리고 번호가 어떻게 달라지는가

\chapter를 가진 것은 reportbook 둘뿐이고 article에는 없습니다. article에서 \chapter{...}라고 쓰면 오류는 “이 클래스에는 장이 없다”고 말해 주지 않고 그저 ! Undefined control sequence.라고만 합니다. LaTeX에게는 존재하지 않는 명령과 오타가 같은 사건이기 때문입니다. 그러나 더 중요한 것은 이 하나의 차이가 번호 매기기를 네 군데에서 동시에 바꾼다는 점입니다. report.clsbook.cls에는 \newcounter{section}[chapter]라고 선언되어 있어 절 번호가 장마다 초기화되고 2.1 형태가 됩니다. 그림, 표, 수식, 각주 번호도 마찬가지로 장마다 초기화됩니다(\@addtoreset{equation}{chapter} 등). 그리고 secnumdepth의 기본값은 article에서 3, reportbook에서 2입니다.

같은 본문을 두 클래스로 조판해 보면 secnumdepth 차이가 곧바로 눈에 보입니다. \section, \subsection, \subsubsection을 하나씩 주면 article은 “1 / 1.1 / 1.1.1”로 세 단계 모두에 번호를 붙이고, report는 “0.1 / 0.1.1 / (번호 없음)”이 됩니다. reportbook에서는 \subsubsection에 기본적으로 번호가 붙지 않습니다. “소소절에 번호가 나오지 않는다”는 증상의 원인은 거의 이것이며, 프리앰블에 \setcounter{secnumdepth}{3}을 쓰면 해결됩니다. “0.1”도 놓칠 수 없습니다. reportbook에서 \chapter 없이 \section부터 시작하면 장 카운터가 0인 채로 남아 절 번호가 0.1, 0.2가 됩니다. 장이 없는 문서라면, 그것은 애초에 article을 골랐어야 했다는 신호입니다.

latex
% same body, two classes: article numbers three levels, report only two
\documentclass{article}   % -> 1 Sec / 1.1 Sub / 1.1.1 Subsub
%\documentclass{report}   % -> 0.1 Sec / 0.1.1 Sub / Subsub (unnumbered)
\begin{document}
\section{Sec}\subsection{Sub}\subsubsection{Subsub}
\end{document}

% in report/book, restore the third level with:
%   \setcounter{secnumdepth}{3}

이참에 널리 믿어지는 오해를 하나 정리해 둡니다. \part는 장 번호를 초기화하지 않습니다. report.cls에도 book.cls에도 \newcounter{chapter}라고만 적혀 있고, part에 묶는 선택 인수가 없습니다. 실제로 제1부에 두 개의 장을 두고 제2부를 시작하면 다음 장은 제1장이 아니라 제3장이 됩니다(두 클래스 모두 동일). 부마다 번호를 다시 매기고 싶다면 프리앰블에서 \counterwithin{chapter}{part} 같은 선언을 직접 해야 합니다. 다만 \part의 겉모습은 클래스마다 다릅니다. article에서는 본문 흐름 안에 놓이는 제목이지만, reportbook에서는 페이지를 넘겨 가운데에 크게 조판된 독립 페이지가 됩니다.

report와 book의 차이 — 같은 원고가 5쪽이 되고 9쪽이 됩니다

두 클래스의 갈림길은 기본 옵션 단 한 줄입니다. report.cls\ExecuteOptions{letterpaper,10pt,oneside,onecolumn,final,openany}, book.cls...,twoside,onecolumn,final,openright}입니다. 그다음은 모두 결과일 뿐입니다. openright는 장을 오른쪽(홀수) 페이지에서 시작하게 하므로 필요할 때마다 왼쪽에 백지가 들어갑니다. 실제로 2부 3장짜리 같은 원고를 각각 조판하면 report는 5쪽, book은 9쪽이 됩니다. 늘어난 네 쪽 가운데 몇 쪽은 내용이 전혀 없는 백지입니다. 인쇄해 제본할 문서라면 올바른 동작이지만, 화면으로 읽는 PDF에서는 방해가 될 뿐입니다. 실무에서 book을 고르고 oneside를 명시하는 조합이 흔한 이유가 여기에 있습니다.

차분에는 더 뜻밖의 항목도 들어 있습니다. book에는 abstract 환경이 없습니다. articlereport는 초록을 조판하는 환경을 정의하지만, book.cls는 그 블록을 통째로 갖지 않고 \abstractname도 정의하지 않습니다. report로 통과하던 원고를 book으로 바꾸면 ! LaTeX Error: Environment abstract undefined.에서 멈춥니다. 책에는 초록을 붙이지 않는다는 편집상의 판단이 클래스 파일 안에 굳어 있는 것입니다. 기본 페이지 스타일도 다릅니다. reportplain(아래 가운데에 쪽 번호만), bookheadings(장·절 이름이 담긴 기둥). 게다가 book은 자체 판면 설정 파일 bk10.clo를 읽어 들입니다. articlereport가 쓰는 size10.clo와 비교하면 판면 폭은 345pt에서 4.5in(약 325pt)로 좁아지고, 높이는 43행에서 41행으로 줄며, 여백은 안쪽 0.5in・바깥쪽 1.5in의 비대칭이 됩니다. report에서 book으로 옮기면 면 배치뿐 아니라 글자가 들어가는 상자 자체가 바뀝니다.

클래스\chapter기본 옵션기본 페이지 스타일판면 파일
article없음. 최상위는 \sectiononeside, notitlepage, secnumdepth=3plainsize10.clo
report있음oneside, openany, titlepage, secnumdepth=2plainsize10.clo
book있음. \frontmatter 안에서는 번호 없음twoside, openright, titlepage, secnumdepth=2headingsbk10.clo(판면이 다름)
letter없음. letter 환경이 단위oneside, letterpaper, 10ptfirstpage / plainsize10.clo
slides없음. slide 환경이 단위letterpaper, final전용sfonts.def / slides.def

\frontmatter / \mainmatter / \backmatter는 무엇을 전환하는가

이 셋은 book 전용이며, 각각 두 가지 일을 동시에 합니다. \frontmatter는 쪽 번호를 로마 숫자(i, ii, …)로 바꾸는 동시에 \if@mainmatter를 거짓으로 만들어 장에 번호 매기기를 멈춥니다. \mainmatter는 쪽 번호를 아라비아 숫자로 되돌려 1부터 다시 세고 장 번호를 되살립니다. \backmatter는 쪽 번호는 그대로 두고 장 번호만 다시 끕니다. 여기서 값어치를 하는 것이 두 번째 작용입니다. 앞부분의 장은 번호가 붙지 않지만 목차에는 실립니다. 그래서 \chapter*\addcontentsline을 손으로 덧붙이는 익숙한 우회책이 book에서는 필요 없습니다. 실제로 조판해 보면 .toc 파일에 \contentsline {chapter}{Preface}{i}처럼 번호 없는 줄이, 본문 장에는 \numberline {1}이 붙은 줄이 나란히 놓입니다.

latex
\documentclass[11pt,a4paper]{book}
\begin{document}
\frontmatter                 % roman page numbers, chapters unnumbered
\chapter{Preface}            % -> toc: \contentsline {chapter}{Preface}{i}
\tableofcontents

\mainmatter                  % arabic, restarts at 1, chapters numbered again
\chapter{Beginning}          % -> toc: ... {\numberline {1}Beginning}{1}
\section{Apparatus}          % numbered 1.1

\backmatter                  % page numbers continue, chapters unnumbered
\chapter{Index}
\end{document}

\documentclass 옵션 목록과 클래스마다 다른 기본값

slides를 제외한 표준 클래스는 \documentclass[...]{...}의 대괄호에서 공통 옵션군을 받습니다. 대부분은 문서 전체에 적용되는 스위치이지만, 중요한 것은 같은 옵션 이름이라도 클래스마다 기본값이 다르다는 점입니다. 위 표의 “기본 옵션” 열이 바로 그것이며, 각 값은 클래스 파일의 \ExecuteOptions{...} 줄에 그대로 적혀 있습니다.

  • 10pt / 11pt / 12pt — 본문 기준 글자 크기. 세 클래스 모두 기본값은 10pt입니다.
  • 용지 크기letterpaper(기본), a4paper, a5paper, b5paper, legalpaper, executivepaper. 기본값이 미국 레터이므로 A4 권역에서는 매번 a4paper를 씁니다.
  • twoside / oneside — 양면 / 단면 레이아웃. booktwoside가 기본입니다.
  • openright / openany — 장을 오른쪽 페이지에서 시작할지 임의 페이지에서 시작할지. bookopenright, reportopenany입니다. article은 이 둘을 아예 선언하지 않습니다. 써도 오류가 나지 않고 LaTeX Warning: Unused global option(s):로 로그에 가라앉을 뿐입니다(이 비대칭의 이유는 “Class options & authoring”에서 다룹니다).
  • titlepage / notitlepage — 제목을 독립 페이지로 둘지 여부. reportbooktitlepage, articlenotitlepage입니다.
  • twocolumn / onecolumn — 본문을 2단으로 조판할지 1단으로 할지. 세 클래스 모두 onecolumn이 기본입니다.
  • fleqn — 별행 수식을 왼쪽 정렬합니다(기본은 가운데). leqno — 식 번호를 왼쪽에 둡니다(기본은 오른쪽). 둘 다 .clo 파일을 읽어 들이는 방식으로 구현되어 있습니다.
  • landscape — 용지를 가로 방향으로. draft — 넘친 행(overfull box)에 검은 선을 표시합니다(기본은 final). openbib — 참고문헌을 “open” 형식으로 조판합니다.

letter 클래스 — 명령 체계가 통째로 다릅니다

letter는 다른 세 클래스와 혈연이 없습니다. classes.dtx가 아닌 자체 소스에서 나왔고, \section\maketitle도 제목 페이지도 없는 대신 편지를 위한 어휘를 가지고 있습니다. 발신자 정보——\address{...}(자신의 주소), \signature{...}, \name{...}, \location{...}, \telephone{...}——는 프리앰블에 두고 파일 안의 모든 편지가 공유합니다. 편지 한 통은 letter 환경 하나이며, 그 인수가 수신자 주소입니다. 본문은 \opening{...}으로 시작해 \closing{...}으로 끝내고, 필요하면 \cc{...}(참조), \encl{...}(동봉물), \ps(추신)를 이어 씁니다. 주소 안의 줄바꿈은 \\입니다.

latex
\documentclass{letter}
\address{1 Computing Way \\ London}   % sender, shared by every letter
\signature{Ada Lovelace}
\makelabels                          % appends a sheet of mailing labels

\begin{document}
\begin{letter}{Charles Babbage \\ 2 Engine Road}  % recipient = argument
\opening{Dear Mr.\ Babbage,}
Thank you for the notes on the Analytical Engine.
\closing{Yours sincerely,}
\cc{The Royal Society}
\encl{Two diagrams}
\end{letter}

\begin{letter}{Mary Somerville \\ 3 Science Lane}
\opening{Dear Mrs.\ Somerville,}
A second letter, same sender, same file.
\closing{Yours sincerely,}
\end{letter}
\end{document}

이 클래스가 어느 시대를 위해 설계되었는지를 한 줄이 웅변합니다. 프리앰블에 \makelabels라고 쓰면 PDF 끝에 수신인 라벨 시트가 한 페이지 붙습니다. 위 예제를 그대로 조판하면 편지 두 통이 두 쪽, 그 뒤에 수신자 두 명의 주소를 늘어놓은 라벨 면이 붙어 모두 세 쪽이 됩니다. 라벨 용지에 인쇄해 떼어 봉투에 붙이는——한때는 그것이 일상 업무였습니다. 뒤집어 말하면 letter가 진짜 잘하는 일은 한 발신자가 여러 수신자에게 보내는 일괄 발송입니다. 수신자 수만큼 letter 환경을 늘어놓으면 그만입니다. 독일어권의 DIN 5008처럼 서식 요건이 구체적이라면 KOMA-Script의 scrlttr2 같은 전용 클래스로 옮기세요.

slides 클래스는 무엇이었나 — beamer 이전의 슬라이드

다섯 번째 표준 클래스 slides는 지금도 TeX Live에 들어 있습니다(2024년판 기준 v2.4b, 2022년 갱신). 그러나 이것은 “옛날 beamer”가 아닙니다. LaTeX가 함께 배포하는 manifest.txtslides.dtx를 “Slides class, etc based on SLiTeX”라고 설명하며, 이름 그대로 SLiTeX——TeX으로 OHP용 투명 필름을 만들기 위한, 한때 독립되어 있던 프로그램——의 후예입니다. 그래서 어휘가 다릅니다. slide 환경이 한 장, note 환경이 발표자용 메모, 그리고 overlay 환경은 문자 그대로 위에 겹쳐 놓는 또 한 장의 투명 필름이었습니다. 조판해 보면 번호가 그것을 말해 줍니다. 슬라이드는 “1”, 그 위에 겹치는 overlay는 “1-a”, 대응하는 노트는 “1-1”입니다. \onlyslides{...}\onlynotes{...}를 쓰면 같은 원고에서 슬라이드만 또는 노트만 인쇄할 수 있습니다.

실무적 판단은 단순합니다. 새로 슬라이드를 만든다면 slides가 아니라 beamer를 쓰세요. 옛 클래스에는 테마도, 현대적 의미의 단계 오버레이도, PDF 내비게이션도 없습니다. 애초에 출구가 프로젝터가 아니라 인쇄로 설계되었습니다. slides를 읽어 볼 값어치가 있는 것은 오래된 원고를 물려받았을 때, 그리고 beamer가 frame을 “논리적인 한 화면”으로 다루는 설계의 유래를 알고 싶을 때뿐입니다.

어느 클래스를 고를까 — 제출 조건에서 거꾸로

클래스 선택은 취향이 아니라 제출 조건에서 거꾸로 계산합니다. 장이 필요 없으면 article, 장으로 구성된 기술 보고서면 report, 제본해 펼침면을 고려하는 원고면 book, 통신문이면 letter입니다. 지정 템플릿이 배포되었다면 그 템플릿의 클래스가 이미 본문 구조와 여백, 제목 처리를 정해 놓은 것이므로 표준 클래스로 되돌리면 안 됩니다.

  • 화면으로만 읽는 PDFoneside를 명시합니다. book을 골랐더라도 \documentclass[oneside]{book}으로 하면 백지 페이지가 사라집니다.
  • 인쇄해 제본twosideopenright를 의도적으로 고르고, 제본을 위한 안쪽 여백을 확인합니다.
  • 판면을 세밀하게 다듬고 싶다 — 표준 클래스는 손댈 곳이 적으므로 KOMA-Script(scrartcl / scrreprt / scrbook)나 memoir로 옮깁니다.
  • 일본어 본문이 중심 — 표준 클래스는 일본어 조판을 전제로 하지 않습니다. pLaTeX / upLaTeX라면 jsclasses(jsarticle / jsbook), LuaLaTeX라면 ltjsclasses, 더 새로운 선택지로 jlreq에서 시작합니다.
  • 슬라이드slides가 아니라 beamer.

중간에 클래스를 바꿨다면 무엇을 확인할까

\documentclass의 한 단어를 고쳐 쓰는 일은 겉모양을 조금 바꾸는 작업이 아니라 문서 구조를 바꾸는 작업입니다. 지금까지 본 대로 장의 유무, 번호의 깊이, abstract의 유무, 판면 치수, 백지 페이지 삽입이 한꺼번에 움직입니다. 바꾼 뒤에는 컴파일이 통과한 것만으로 안심하지 말고 다음 다섯 가지를 눈으로 확인하세요.

확인 항목무슨 일이 일어나는가고치는 법
\chapterarticle로 옮기면 ! Undefined control sequence.로 멈춤장을 \section으로 낮추거나 report / book을 유지
abstractbook으로 옮기면 ! LaTeX Error: Environment abstract undefined.초록을 빼거나 \chapter*{Abstract} 같은 것으로 대체
secnumdeptharticle에서 옮겨 오면 \subsubsection 번호가 사라짐\setcounter{secnumdepth}{3}을 덧붙임
openrightbook으로 하면 장 앞에 백지가 삽입되어 총 쪽수가 늘어남화면용이면 oneside, 인쇄용이면 그대로
titlepage\maketitle이 독립 페이지가 되거나 본문과 같은 페이지에 놓임titlepage / notitlepage를 명시