첫 문서 만들기

첫 LaTeX 문서로 동작하는 최소 형태는 단 한 줄입니다. \documentclass{article}\begin{document}Hi\end{document} — 이것을 pdflatex에 통과시키면 실제로 1쪽짜리 11,529바이트 PDF가 나옵니다. 첫 문서에서 막히는 사람 대부분은 이 한 줄이 무엇을 하는지 건너뛰고 긴 서식을 그대로 베꼈기 때문입니다. 이 페이지는 그 최소 문서에서 출발해 바깥으로 넓혀 갑니다. 프리앰블과 본문의 경계, 컴파일러 실행법, 난데없이 늘어나는 .aux.log의 정체, 왜 두 번 컴파일해야 하는지, 그리고 첫날 반드시 부딪히는 %$의 함정까지, 실제 터미널 출력과 함께 차례로 짚습니다.

컴파일되는 가장 작은 LaTeX 문서 (hello world)

필요한 명령은 셋뿐입니다. \documentclass{article}로 문서의 종류를 선언하고, \begin{document}로 본문을 열고, \end{document}로 닫습니다. 셋 중 하나만 빠져도 PDF는 나오지 않고, 셋만 있으면 그 사이가 비어 있어도 동작합니다. 아래의 읽기 좋은 형태를 hello.tex로 저장하십시오. 파일 인코딩은 UTF-8, 확장자는 .tex입니다.

latex
\documentclass{article}
\begin{document}
This is my first document.
\end{document}

\documentclass{article}article클래스입니다. 클래스는 문서 전체의 설계도로, 여백의 넓이, 제목의 크기와 앞뒤 여백, 장(章) 단위가 있는지 없는지를 한꺼번에 정합니다. 기본으로 들어 있는 것은 article(논문・짧은 보고서・기술 메모, \chapter 없음), report(장이 있는 긴 보고서), book(양면 인쇄를 전제로 한 서적), letter(편지)입니다. 한국어나 일본어로 쓴다면 jlreqjsarticle 계열을 고릅니다. 학회나 출판사가 자체 클래스 파일을 배포한다면 망설이지 말고 그것을 쓰십시오. 투고 규정을 둘러싼 논의가 통째로 사라집니다.

프리앰블과 본문: \begin{document}가 가르는 두 세계

\begin{document}보다 이 프리앰블, 가 본문입니다. 프리앰블은 “앞으로 어떻게 조판할지”를 정하는 자리이며, 여기 쓴 것은 종이에 나오지 않습니다. 본문은 반대로 쓴 것이 원칙적으로 그대로 나옵니다. 이 경계는 LaTeX의 변덕이 아니라 필연입니다. LaTeX은 첫 글자를 조판하기 전에 용지 크기, 행 폭, 사용할 글꼴, 읽어들일 패키지를 모두 확정해야 합니다. 그래서 \usepackage는 프리앰블에만 쓸 수 있습니다. 본문에 쓰면 ! LaTeX Error: Can be used only in preamble.로 멈춥니다.

반대 실수도 흔합니다. 프리앰블에 평범한 문장을 써 두면 ! LaTeX Error: Missing \begin{document}.가 나옵니다. \begin{document}를 분명히 썼는데 왜 이러나 싶지만, LaTeX의 말뜻은 “본문이 시작되지도 않았는데 글자가 왔다”, 곧 본문 시작 위치보다 앞에 글자가 있다는 지적입니다. 프리앰블에 남긴 메모는 %로 주석 처리하십시오.

컴파일해서 PDF 만들기 (pdflatexlatexmk)

터미널에서 pdflatex hello.tex이라고 치기만 하면 됩니다. 편집기나 Overleaf를 쓴다면 “컴파일” 단추가 똑같은 일을 합니다. 성공의 신호는 마지막 두 줄, Output written on hello.pdfTranscript written on hello.log입니다. 이 두 줄이 보이면 PDF는 만들어진 것입니다. 중간에 흘러가는 수많은 경로는 읽어들인 클래스 파일과 글꼴 목록으로, 정상 출력이므로 읽을 필요가 없습니다.

terminal
$ pdflatex hello.tex
This is pdfTeX, Version 3.141592653-2.6-1.40.26 (TeX Live 2024)
(./hello.tex
LaTeX2e <2023-11-01> patch level 1
(/usr/local/texlive/2024/texmf-dist/tex/latex/base/article.cls
Document Class: article 2023/05/17 v1.4n Standard LaTeX document class
...
Output written on hello.pdf (1 page, 31014 bytes).
Transcript written on hello.log.

오류로 멈추면 pdflatex?를 찍고 입력을 기다리기도 합니다. 당황해서 Enter를 연타하지 말고, x를 치고 Enter를 누르면 중단됩니다. 매번 이 대화를 하고 싶지 않다면 pdflatex -interaction=nonstopmode hello.tex을 쓰십시오. 오류가 있어도 멈추지 않고 끝까지 달려 로그에 전부 적습니다. 그리고 latexmk -pdf hello.tex을 일찍 익혀 두면 편합니다. 문서에 필요한 횟수만큼 알아서 다시 컴파일해 주므로, 다음 절의 “두 번” 문제를 신경 쓰지 않아도 됩니다.

늘어난 파일은 무엇인가: .aux .log .toc .out의 정체

한 번 컴파일했을 뿐인데 폴더에 파일이 넷 늘어납니다. 이상이 생긴 것이 아니라 LaTeX이 자기 앞으로 쪽지를 남긴 것입니다. 목차와 절 하나를 담은 문서를 pdflatex에 통과시키면 hello.tex 말고도 hello.aux(132바이트), hello.log(3,250바이트), hello.pdf(31,014바이트), hello.toc(59바이트)가 생깁니다. 그중 .aux가 이 장치의 심장입니다. 열어 보면 딱 세 줄이 들어 있습니다.

text
% hello.aux, written by the first run
\relax
\@writefile{toc}{\contentsline {section}{\numberline {1}Introduction}{1}{}\protected@file@percent }
\gdef \@abspage@last{1}

풀어 읽으면 “1번 절 Introduction은 1쪽에 있다”, “마지막 쪽은 1쪽”입니다. 곧 .aux번호와 쪽 위치를 적어 두는 공책이며, 다음 실행에서 다시 읽힙니다. .toc는 거기서 만들어진 목차 초안이고, .log는 처리 과정의 전체 기록이며, .outhyperref를 쓸 때 생기는 PDF 책갈피 정보입니다.

확장자내용지워도 되는가
.tex여러분이 쓴 원고. 유일한 원본절대 지우지 않습니다. 백업과 Git의 대상은 이것뿐입니다
.pdf완성된 출력물지워도 됩니다. 원고에서 몇 번이든 다시 만들 수 있습니다
.aux절 번호・그림 번호와 각 레이블이 가리키는 쪽지워도 되지만, 바로 다음 실행에서 참조가 ??로 나옵니다
.log읽어들인 파일, 경고, 오류의 전체 기록지워도 됩니다. 다만 오류를 쫓는 동안에는 가장 중요한 자료입니다
.toc지난 실행에서 써 둔 목차 항목과 쪽 번호지워도 됩니다. 다음 실행에서 목차가 비어 나올 뿐입니다
.outhyperref가 만드는 PDF 책갈피지워도 됩니다. hyperref를 쓰지 않으면 아예 생기지 않습니다

실무적 결론은 짧습니다. 버전 관리에 넣을 것은 .tex과 그림뿐이고, 보조 파일은 무시 목록에 넣습니다. 청소는 latexmk -c 한 방이면 끝납니다. 다만 습관적으로 지우지는 마십시오. 보조 파일은 일을 줄이려고 있는 것이니, 매번 지우는 것은 매번 일부러 먼 길을 도는 셈입니다. 원인을 모르는 문제가 계속될 때만 빗자루를 드십시오.

왜 두 번 컴파일하는가: ??와 Rerun 경고

첫 번째 실행에서는 아직 답을 모르기 때문입니다. “Section 1 참조”라고 썼을 때, LaTeX이 그 절의 번호와 쪽을 아는 것은 실제로 그 자리를 조판한 입니다. 그런데 참조는 대개 가리키는 대상보다 앞에 나옵니다. 그래서 첫 번째 실행은 아는 범위에서 조판하면서 답을 .aux에 적어 두고, 두 번째 실행이 그것을 읽어 구멍을 메웁니다. 목차도 마찬가지여서, \tableofcontents는 문서 앞머리에 있지만 그 내용은 끝까지 읽어야 알 수 있습니다. 아래가 실제 두 번의 기록입니다.

terminal
$ pdflatex ref.tex          # first run, from a clean directory
No file ref.aux.
No file ref.toc.
LaTeX Warning: Reference `sec:intro' on page 1 undefined on input line 5.
LaTeX Warning: There were undefined references.
LaTeX Warning: Label(s) may have changed. Rerun to get cross-references right.
Output written on ref.pdf (1 page, 33009 bytes).

# the PDF now reads:  "See Section ?? on page ??."

$ pdflatex ref.tex          # second run
Output written on ref.pdf (1 page, 34613 bytes).

# the PDF now reads:  "See Section 1 on page 1."

눈여겨볼 곳이 셋입니다. 첫 번째 실행은 No file ref.aux.라고 합니다. 아직 쪽지가 없다는 뜻입니다. 참조는 ??로 찍히고, LaTeX Warning: Label(s) may have changed. Rerun to get cross-references right.가 나옵니다. 여기서 “Rerun”이라는 단어가 그대로 지시이며, 한 번 더 돌리라는 뜻입니다. 두 번째 실행에서는 경고가 사라지고 ??1로 바뀝니다. 목차도 마찬가지로, 첫 번째에는 제목만 나오고 내용은 비어 있다가 두 번째에야 항목이 늘어섭니다. PDF에 ??가 보인다면 망가진 것이 아니라 “한 번 더”라는 신호입니다.

횟수 세는 것이 번거롭다면 latexmk에 맡기십시오. 깨끗한 디렉터리에서 latexmk -pdf ref.tex을 실행하면 Run number 1 of rule 'pdflatex', Run number 2 of rule 'pdflatex', 그리고 Latexmk: All targets (ref.pdf) are up-to-date가 표시되며 필요한 두 번을 정확히 실행하고 멈춥니다. 참고문헌(BibTeX/biber)이나 색인(makeindex)을 쓰면 필요한 횟수가 더 늘지만 그것도 latexmk가 처리합니다. VS Code의 LaTeX Workshop, TeXShop, Overleaf도 대개 뒤에서 latexmk를 부릅니다.

친 대로 나오지 않는 문자: % & _ # $

LaTeX에는 그대로 치면 다른 뜻이 되는 문자가 열 개 있습니다: # $ % & ~ _ ^ \ { }. 첫날 가장 많은 사람을 찌르는 것은 %이고, 찌르는 이유는 오류가 나지 않기 때문입니다. Only 50% of the sample survived.라고 쓰고 다음 줄에 The rest did not.를 이으면, PDF에는 “Only 50The rest did not.”라고 찍힙니다. %부터 줄 끝까지가 주석으로 버려지고, 사라진 줄 끝 때문에 다음 줄이 같은 단락에 그대로 이어지기 때문입니다. 오류가 나지 않으니 알아채기 어렵고, 백분율 표기는 논문에 수시로 등장합니다. 올바른 표기는 50\%입니다.

문자그대로 쓰면 어떻게 되는가문자로 출력하는 법
%줄 끝까지가 주석으로 조용히 사라집니다. 오류 없음\%
$수식 모드를 열고 닫습니다. 하나만 있으면 뒤가 전부 수식이 됩니다\$
&표와 정렬 환경의 열 구분자. 본문에서는 ! Misplaced alignment tab character &.\&
_수식의 아래 첨자. 본문에서는 ! Missing $ inserted.\_
^수식의 위 첨자. 본문에서는 _와 마찬가지로 ! Missing $ inserted.\textasciicircum{}
#매크로의 인수 기호. ! You can't use ... in horizontal mode.\#
~줄바꿈이 일어나지 않는 공백(Fig.~1처럼 씁니다). 문자로는 나오지 않습니다\textasciitilde{}
\명령의 시작. 뒤에 오는 문자열이 명령 이름으로 해석됩니다\textbackslash
{ }인수와 그룹의 경계. 출력에는 나타나지 않습니다\{\}

오류가 나지 않아서 더 성가신 버릇이 둘 더 있습니다. 첫째는 명령 뒤의 공백이 사라진다는 것입니다. \LaTeX is a macro package.라고 쓰면 “LATEXis a macro package.”처럼 붙어서 나옵니다. LaTeX이 명령 이름의 끝을 찾느라 뒤따르는 공백을 먹어 버리기 때문입니다. \LaTeX{} is처럼 빈 중괄호를 놓거나 \LaTeX\ is라고 쓰면 됩니다. 둘째는 따옴표로, "hello"라고 치면 앞뒤가 모두 닫는 따옴표(”hello”)가 됩니다. 여는 쪽은 백틱 두 개, 닫는 쪽은 어포스트로피 두 개여서 ``hello''라고 써야 맞습니다.

첫 오류 읽는 법: ! Missing $ inserted.

볼 것은 !로 시작하는 첫 줄과 그 바로 다음에 나오는 l.로 시작하는 줄뿐입니다. l.은 line의 약자로, 뒤의 숫자가 행 번호이고 그 행의 내용도 함께 찍히는데, TeX이 걸려 넘어진 자리에서 정확히 두 줄로 접혀 표시됩니다. 접힌 지점이 사건 현장입니다. 본문에 x_1을 썼을 때의 출력은 다음과 같습니다. TeX은 첫 오류 뒤에도 억지로 계속하므로, 뒤에 늘어선 오류는 대개 연쇄 반응입니다. 맨 위의 것만 고치고 다시 돌리십시오.

terminal
$ pdflatex e2.tex      # line 3 of the source reads: The value of x_1 is small.
! Missing $ inserted.
<inserted text>
                $
l.3 The value of x_
                   1 is small.

$ pdflatex e3.tex      # line 3 reads: Smith & Jones wrote it.
! Misplaced alignment tab character &.
l.3 Smith &
            Jones wrote it.

$ pdflatex sc.tex      # line 3 reads: Issue #42 and more.
! You can't use `macro parameter character #' in horizontal mode.
l.3 Issue #
           42 and more.

$ pdflatex e5.tex      # \begin{itemize} was never closed
! LaTeX Error: \begin{itemize} on input line 3 ended by \end{document}.

$ pdflatex e4.tex      # \end{document} is missing entirely
*** (job aborted, no legal \end found)
!  ==> Fatal error occurred, no output PDF file produced!

! Missing $ inserted.는 “수식에서만 쓰는 것이 본문에 나왔기에 TeX이 $를 대신 넣었다”는 뜻입니다. 원인은 거의 언제나 _^이며, $x_1$처럼 진짜 수식으로 만들거나 x\_1처럼 이스케이프하면 됩니다. ! LaTeX Error: \begin{itemize} on input line 3 ended by \end{document}.는 환경을 닫지 않은 경우로, 환경이 열린 행 번호를 알려 주기 때문에 그나마 친절한 축에 듭니다. 가장 무섭게 보이는 ! ==> Fatal error occurred, no output PDF file produced!는 대개 \end{document}를 빠뜨린 것뿐입니다. 그리고 ! Undefined control sequence.는 철자 오류(\sectoin)이거나 그 명령을 제공하는 패키지를 읽어들이지 않은 것입니다.

제목과 표제를 더해 보고서로 만들기

여기까지 왔다면 남은 일은 더하는 것뿐입니다. 프리앰블에 \title\author\date를 쓰고 본문 첫머리에서 \maketitle을 부르면 제목이 조판됩니다. \section\subsection으로 표제를 만들면 번호가 자동으로 붙고, \tableofcontents를 놓으면 목차도 자동 생성됩니다(앞에서 본 대로 목차는 두 번째 실행부터 나옵니다). \date{\today}는 컴파일한 날짜로 바뀌며, 번호를 붙이고 싶지 않은 표제에는 별표를 더해 \section*{...}이라고 씁니다.

latex
\documentclass{article}
\title{My First Report}
\author{Taro Yamada}
\date{\today}
\begin{document}
\maketitle
\tableofcontents

\section{Introduction}
Blank lines start new paragraphs. Line breaks in the source do not.

\section{Method}
\subsection{Setup}\label{sec:setup}
Only 50\% of the sample survived. See Section~\ref{sec:setup}.
\end{document}

이 예에는 본문을 쓸 때 가장 중요한 규칙도 넣어 두었습니다. 소스의 줄 바꿈은 무시되고, 빈 줄이 단락의 구분이 됩니다. 한 문장마다 줄을 바꾸든 빈 줄을 세 줄 넣든 출력은 같습니다. 최종적인 줄 바꿈 위치는 LaTeX이 단락 전체를 보고 정합니다. 정말로 단락을 나누고 싶을 때만 빈 줄을 넣으십시오.

패키지로 기능 더하기: \usepackage

모자란 기능은 패키지로 채웁니다. 프리앰블에 \usepackage{...} 한 줄을 더하면 끝입니다. 그림을 넣으려면 graphicx, 본격적인 수식이라면 amsmath, 여백을 바꾸려면 geometry, 링크와 PDF 책갈피라면 hyperref입니다. TeX Live 같은 배포판에는 수천 개의 패키지가 함께 들어 있고, 그 총본산이 CTAN(Comprehensive TeX Archive Network)입니다. 다만 처음부터 잔뜩 넣지는 마십시오. 넣는 이유를 설명할 수 있는 것만 남기십시오. 패키지끼리 충돌해 Option clash for package ... 같은 오류가 나면, 원인을 가려내는 수고는 실어 둔 개수에 비례해 늘어납니다.

latex
\documentclass[a4paper,11pt]{article}
\usepackage{graphicx}                  % include images
\usepackage{amsmath}                   % proper math environments
\usepackage[margin=25mm]{geometry}     % page margins
\usepackage{hyperref}                  % links and PDF bookmarks; load it last
\begin{document}
\section{Results}
Text, images and equations go here.
\end{document}

관례상 hyperref는 마지막에 읽어들입니다. 다른 패키지의 명령을 고쳐 쓰는 방식으로 동작하기 때문에, 먼저 읽으면 나중에 오는 패키지가 그 변경을 덮어써 버립니다. 여기까지의 내용——최소 문서, 프리앰블과 본문의 구분, 컴파일, 보조 파일, 두 번째 실행, 특수 문자, 그리고 첫 오류——이 첫날에 필요한 전부입니다. 이제부터는 쓰고 싶은 것을 쓰면서 필요한 기능을 하나씩 더해 가면 충분합니다.