문서 구조, 제목 및 목차

\section 이 실제로 하는 일은 글자를 크게 만드는 것이 아닙니다. 제목의 단계를 나타내는 정수 하나를 선언하는 일입니다. LaTeX 의 제목은 \part 부터 \subparagraph 까지 일곱 단계이고, 각 단계에 −1 부터 5 까지의 수가 붙습니다. 그 뒤에 이어지는 두 물음——이 제목에 번호를 붙일 것인가(secnumdepth), 목차에 실을 것인가(tocdepth)——는 모두 그 정수와의 크기 비교일 뿐입니다. 계층을 정하는 순간 번호와 목차도 거의 정해지는 셈입니다. 이 페이지에서는 일곱 단계의 쓰임, 별표 형식, \tableofcontents 가 두 번째 컴파일을 요구하는 이유, 그리고 \appendixbook 의 세 부분 구성을 차례로 살펴봅니다.

제목의 일곱 단계와 level 값

위에서부터 \part, \chapter, \section, \subsection, \subsubsection, \paragraph, \subparagraph 의 일곱 단계입니다. 여기서 말하는 “level 값”은 비유가 아닙니다. 표준 클래스의 소스를 열어 보면 \section\@startsection{section}{1}{…} 으로 정의되어 있고, 두 번째 인수 1 이 곧 level 값입니다. \subsection2, \subsubsection3, \paragraph4, \subparagraph5 입니다. 번호를 출력할지 결정하는 커널 코드는 \ifnum #2>\c@secnumdepth 라는 한 줄이고, #2 가 바로 그 숫자입니다. 제목은 글자를 굵게 만드는 장식이 아니라 독자에게 논의의 현재 위치를 알려 주는 표지이며, 동시에 문서 전체의 번호 체계를 정하는 선언이기도 합니다.

명령level 값구분사용 가능한 클래스
\part−1 (book/report), 0 (article)모든 클래스
\chapter0book / report 만
\section1모든 클래스
\subsection2소절모든 클래스
\subsubsection3하위 소절모든 클래스(book/report 에서는 기본적으로 번호 없음)
\paragraph4단락 제목(본문이 같은 줄에 이어짐)모든 클래스(기본적으로 번호 없음)
\subparagraph5하위 단락 제목(본문이 같은 줄에 이어짐)모든 클래스(기본적으로 번호 없음)

표의 아래 두 줄만 다르게 동작하는 이유는, 시각적 설계 전체가 부호 하나로 접혀 있기 때문입니다. \@startsection 의 다섯 번째 인수는 “제목 뒤에 둘 여백”인데, \section 에서는 2.3ex 로 양수이고 \paragraph\subparagraph 에서는 -1em 으로 음수 입니다. 커널은 이 부호를 보고, 양수면 제목 뒤에서 줄을 바꾸고, 음수면 줄을 바꾸지 않은 채 그 절댓값만큼 가로 여백을 두고 본문을 이어 갑니다. 그래서 \paragraph{요점} 은 “요점 여기서부터 본문이 이어집니다” 처럼 본문으로 흘러드는 행내 제목(run-in heading) 이 됩니다. 단락 앞에 짧은 이름표를 붙일 때 쓰는 도구이며, 독립된 줄의 제목을 원한다면 \subsubsection 에서 멈추는 것이 맞습니다.

latex
\documentclass{report}   % \chapter is available here
\begin{document}
\chapter{Introduction}
\section{Background}
\subsection{Related work}
\paragraph{Key point}The body text continues on this same line.
\end{document}

\chapter 가 book 과 report 에만 있는 이유

article 클래스에는 \chapter 가 없습니다. 아예 정의되어 있지 않아서 article 본문에 쓰면 ! Undefined control sequence. 로 멈춥니다. 패키지가 모자란 것이 아니라, 장이라는 단위 자체가 이 클래스의 설계에 없습니다. 그래서 article 의 최상위 제목은 보통 \section 이고, 장 구성이 필요하면 report(장과 초록이 있음)나 book(장이 있고 기본이 양면이며 앞부분·뒷부분이 있음)으로 옮깁니다. \part 는 모든 클래스에서 쓸 수 있지만 위치가 다릅니다. article 에서는 level 0, bookreport 에서는 \chapter 위의 level −1 입니다.

단계를 건너뛰면 번호에 그 흔적이 남습니다. report 에서 \chapter 바로 뒤에 \subsection 을 두면 제목 번호가 1.0.1 이 됩니다. 가운데의 0 은 한 번도 올라가지 않은 절 카운터입니다. LaTeX 은 빈자리를 알아서 메워 주지 않고, 건너뛴 단계의 값을 그대로 찍습니다. 반대로 reportbook 에서 \chapter 를 한 번도 쓰지 않은 채 \section 을 시작하면 0.1 부터 시작합니다. 번호에 낯선 0 이 보이면 먼저 건너뛴 단계를 의심하는 것이 빠릅니다.

번호 없애기: 별표 형식과 secnumdepth

문서 전체에서 어느 깊이까지 번호를 붙일지는 secnumdepth 카운터 하나가 결정합니다. 값은 “번호를 받는 최하위 level 값”이며, TeX Live 2024 에 들어 있는 표준 클래스에서는 article 이 3, bookreport 가 2 입니다. 그래서 article 은 하위 소절(level 3)까지 번호를 붙이고 book 은 소절(level 2)에서 멈춥니다. book 에서 하위 소절에도 번호를 붙이려면 프리앰블에 \setcounter{secnumdepth}{3} 을 씁니다. 반대로 \setcounter{secnumdepth}{0} 이면 절 이하의 번호가 한꺼번에 사라지고, -2 로 하면 모든 제목에서 번호가 사라집니다.

한 곳에서만 번호를 지우고 싶다면 명령의 별표 형식 을 씁니다. \section*{Acknowledgements} 라고 쓰면 그 제목은 번호가 없고, 목차에도 들어가지 않습니다. 두 효과가 묶여 있는 이유는 별표 형식을 처리하는 커널 매크로가 목차 항목을 아예 쓰지 않기 때문입니다. “서론”, “감사의 글”, “결론” 처럼 번호가 어색한 제목에는 바로 그것이 원하는 동작이고, 목차에는 싣고 싶다면 제목 바로 뒤에 \addcontentsline{toc}{section}{Acknowledgements} 를 덧붙입니다. 별표 제목은 카운터도 올리지 않으므로 뒤따르는 번호가 밀릴 걱정이 없습니다.

또 하나 기억할 것은 선택 인수 입니다. \section[짧은 제목]{본문에 나오는 긴 제목} 이라고 쓰면 본문 제목에는 긴 쪽이, 목차와 쪽머리에는 대괄호 안의 짧은 쪽이 쓰입니다. 논문의 절 제목은 한 줄에 들어가지 않는 일이 흔하므로, 목차와 쪽머리의 모양을 지키는 실용적인 탈출구가 됩니다. 대괄호를 생략하면 긴 제목이 세 곳 모두에 쓰입니다.

latex
\setcounter{secnumdepth}{3}          % number subsubsections too
\section{Results and discussion}      % numbered, e.g. "3 Results and discussion"
\section*{Acknowledgements}           % no number, and no TOC entry
\addcontentsline{toc}{section}{Acknowledgements}   % put it back in the TOC
\section[Method]{A detailed formulation of the proposed method}

\tableofcontents 가 두 번째 컴파일을 요구하는 이유

목차는 \tableofcontents 를 놓기만 하면 나오지만, 그 명령을 쓴 회차의 컴파일에서는 나오지 않습니다. TeX 은 문서를 앞에서 뒤로 한 번만 읽으므로, 목차를 조판하는 시점에는 뒤에 어떤 제목이 오는지 알지 못합니다. 그래서 LaTeX 은 제목을 만날 때마다 \contentsline{section}{\numberline {1}First}{1}{} 같은 줄을 보조 파일 .toc 에 써 두고, 다음 실행의 첫머리에서 그것을 읽어 목차를 조판합니다. 최소 두 번의 컴파일이 필요한 이유입니다. 곤란한 점은 첫 실행이 로그에 No file document.toc. 한 줄만 남길 뿐 경고다운 경고를 내지 않는다 는 것입니다. 목차가 비었거나 낡은 채로 제출되는 사고가 여기서 생깁니다. latexmk 같은 빌드 도구는 필요한 횟수만큼 자동으로 반복하므로 이 문제를 구조적으로 없애 줍니다.

그림 목록과 표 목록도 같은 구조입니다. \listoffigures.lof 를, \listoftables.lot 를 거치며 역시 여러 번의 컴파일이 필요합니다. 자동으로 실리지 않는 항목을 손으로 넣는 것이 \addcontentsline{ext}{unit}{text} 로, 첫 인수 ext 는 대상 확장자(toc, lof, lot), 둘째 unit 은 항목 종류(section, chapter, figure 등), 셋째 text 는 실을 문자열입니다. 항목이 아닌 소재——예를 들어 제목 무리 사이의 여백——를 끼워 넣고 싶다면 \addtocontents{ext}{text} 를 씁니다. 이쪽은 내용을 그대로 보조 파일에 흘려 넣으므로 \vspace 같은 명령에는 \protect 를 붙입니다.

latex
\tableofcontents
\setcounter{tocdepth}{2}                       % list down to subsections

\section*{Introduction}                        % starred: never listed
\addcontentsline{toc}{section}{Introduction}   % list it by hand

\listoffigures                                % goes through the .lof file
\addtocontents{lof}{\protect\vspace{2ex}}      % extra space inside that list

tocdepthsecnumdepth 의 차이

목차에 실을 깊이는 tocdepth 가 정합니다. 값의 뜻은 secnumdepth 와 같은 level 값이고 기본값도 같아서 article 이 3, bookreport 가 2 입니다. 다만 둘은 독립적이라 번호는 절까지만 붙이고 목차에는 소절까지 싣는 설정이 흔히 쓰입니다. 결정적인 차이는 언제 작용하는가 입니다. secnumdepth 는 조판하는 그 자리에서 번호를 낼지 정하지만, tocdepth 는 다릅니다. LaTeX 은 깊이와 무관하게 모든 제목을 .toc 에 써 두고, tocdepth 는 그 파일을 되읽을 때 줄을 걸러낼 뿐입니다. 실제로 기본 article.toc 안에는 \paragraph 줄이 들어 있습니다——인쇄되지 않을 뿐입니다. 이 설계에는 실익이 있습니다. tocdepth 를 깊게 해도 .toc 를 다시 만들 필요가 없으므로 추가 컴파일은 한 번이면 충분합니다.

\appendix 와 book 의 세 부분 구성

부록이 시작되는 자리에서 \appendix 를 딱 한 번 씁니다. 제목을 만드는 명령이 아니라 번호 붙이기를 전환하는 스위치 입니다. article 에서는 절과 소절 카운터를 0 으로 되돌리고 \thesection 을 영문자 표시로 바꿉니다. bookreport 에서는 장과 절 카운터를 되돌리고 \thechapter 를 영문자로 바꾼 뒤, 장 제목 앞에 붙는 낱말을 Chapter 에서 Appendix 로 교체합니다. 그래서 \appendix 뒤에는 평소처럼 \chapter{기호 일람} 이라고만 써도 “Appendix A 기호 일람” 이 됩니다. 두 번 쓰거나 부록 제목마다 앞에 쓰면 그때마다 카운터가 초기화되므로, 놓는 것은 한 번뿐입니다.

book 클래스에는 책을 셋으로 나누는 명령이 더 있습니다. \frontmatter 는 앞부분(서문, 목차 등)을 열며, 쪽 번호를 소문자 로마 숫자로 바꾸고 1 부터 다시 세며 장 번호를 멈춥니다(장 제목은 목차에 실립니다). \mainmatter 는 본문을 시작하고, 쪽 번호를 아라비아 숫자로 되돌려 다시 1 부터 세며 장 번호를 되살립니다. \backmatter 는 뒷부분(참고문헌, 색인 등)을 표시하는데, 쪽 번호는 그대로 이어 가면서 장 번호만 다시 멈춥니다. 이 비대칭이 요점입니다. 쪽 번호를 되돌리는 것은 \frontmatter\mainmatter 둘뿐입니다.

latex
\documentclass{book}
\begin{document}
\frontmatter            % i, ii, ... and unnumbered chapters
\tableofcontents
\mainmatter             % 1, 2, ... and numbered chapters again
\chapter{Introduction}
\appendix               % chapters now read "Appendix A", "Appendix B"
\chapter{Notation}
\backmatter             % bibliography, index: page numbers keep running
\end{document}

덧붙이면, 이 제목 명령 일습을 설계한 사람은 Leslie Lamport 입니다. 그가 2013 년 ACM 튜링상을 받은 것은 그러나 LaTeX 때문이 아니라 분산 시스템 연구——논리 시계, 안전성과 활성, 복제 상태 기계 같은 개념——때문이었습니다. 전 세계 이공계 학생이 매일 치는 \section 은 수상 사유에 한 줄도 등장하지 않습니다.

번호나 목차가 이상할 때 보는 법

  • 번호에 0 이 섞인다(1.0.1 등) — 단계를 건너뛴 것입니다. report/book 에서 \chapter 바로 뒤에 \subsection 을 두지 않았는지, \chapter 없이 \section 을 시작하지 않았는지 확인합니다.
  • 목차가 비었거나 낡았다 — 지금 보이는 .toc 는 지난 실행이 쓴 것입니다. 두 번 컴파일합니다. 경고가 없으므로 latexmk 에 맡기는 편이 확실합니다.
  • \chapter 에서 ! Undefined control sequence. 가 난다 — 문서가 article 입니다. reportbook 으로 바꾸거나 \section 을 최상위로 씁니다.
  • 별표 제목이 목차에 없다 — 의도된 동작입니다. 제목 바로 뒤에 \addcontentsline{toc}{section}{…} 을 둡니다.
  • 소절이 목차에 없다tocdepth 가 얕을 뿐입니다. \setcounter{tocdepth}{2} 로 바꾸고 한 번만 더 컴파일하면 됩니다(.toc 를 다시 만들 필요는 없습니다).
  • 부록 번호가 기대와 다르다\appendix 는 제목이 아니라 스위치입니다. 첫 부록 제목 바로 앞에 한 번만 둡니다.