LaTeX의 문제에는 !로 시작하는 줄이 또렷이 나오는 것과, 아무 말 없이 조용히 어긋나는 것이 있습니다. 시간을 잡아먹는 쪽은 대개 후자입니다. 몇 번을 컴파일해도 ??로 남는 참조, 두 쪽 뒤로 밀려난 그림, 원본에 letterpaper라고 썼는데 A4로 나오는 PDF, 내 환경에서는 되는데 공저자 환경에서만 실패하는 원고. 이 자주 묻는 질문 페이지는 그런 여러 구조에 걸친 질문만 모아, 실행 중에 실제로 무슨 일이 일어나는지로 답합니다. 오류 메시지 하나로 결론이 나는 문제는 각각 전용 페이지가 있으니 마지막의 색인에서 찾아가세요.
왜 두 번 컴파일해야 하는가
LaTeX이 원고를 앞에서 뒤로 딱 한 번만 읽고 앞을 내다보지 못하기 때문입니다. 1쪽의 \ref{sec:first}를 조판하는 시점에는 그 \label이 몇 번이 될지 아직 정해지지 않았습니다. 그래서 \label은 번호를 .aux 파일에 써 두고, \ref는 직전 실행이 남긴 .aux를 읽습니다. TeX Live 2024에서 실측하면 첫 실행은 LaTeX Warning: Reference 'sec:first' on page 1 undefined on input line 4.와 LaTeX Warning: There were undefined references.를 출력하고, PDF에는 실제로 “See Section ?? on page ??.”가 찍힙니다. 그때의 .aux에는 \newlabel{sec:first}{{1}{1}{}{}{}}가 들어 있고, 두 번째 실행이 이를 읽어 “See Section 1 on page 1.”이 됩니다. 즉 ??는 고장이 아니라 아직 1회차라는 표시입니다.
$ pdflatex ref.tex # run 1
LaTeX Warning: Reference 'sec:first' on page 1 undefined on input line 4.
LaTeX Warning: There were undefined references.
LaTeX Warning: Label(s) may have changed. Rerun to get cross-references right.
$ pdftotext ref.pdf -
See Section ?? on page ??.
$ pdflatex ref.tex # run 2 — no warnings
$ pdftotext ref.pdf -
See Section 1 on page 1.실행 끝에 나오는 LaTeX Warning: Label(s) may have changed. Rerun to get cross-references right.는 방금 쓴 .aux가 읽어 들인 것과 달라졌으니 한 번 더 돌려 달라는 LaTeX 자신의 신고입니다. 중요한 것은 두 번이 하한이지 규칙이 아니라는 점입니다. 숫자 한 자리가 늘어 줄이 다시 흐르면 쪽 번호가 바뀌고, 그 결과 .aux가 또 바뀝니다. 목차, 그림 목차, hyperref 책갈피가 얽히면 세 번, 네 번도 흔합니다. latexmk는 바로 이 때문에 존재하며 .aux가 안정될 때까지 반복합니다. 그러니 횟수를 손으로 세지 말고 맡기십시오. 반대로 ??가 보이면 먼저 두 번 컴파일한 뒤에 의심하세요. 두 번을 견디고도 남는다면 \label의 철자가 틀렸거나 아예 없거나, 낡은 .aux가 걸린 것입니다(.aux를 지우면 1회차로 돌아갑니다).
참고문헌 목록이 나오지 않고 인용이 [?]로 남을 때
문헌 처리는 LaTeX 바깥의 별도 프로그램이 맡고, 한 바퀴를 도는 데 네 개의 명령이 필요하기 때문입니다. bibtex는 .tex를 읽지 않습니다. LaTeX이 .aux에 써 둔 \citation과 \bibdata를 읽고, .bib에서 해당 항목을 골라 .bbl을 만듭니다. TeX Live 2024에서 실측하면 단계가 또렷합니다. 첫 pdflatex는 LaTeX Warning: Citation 'knuth1984' on page 1 undefined를 출력하고 PDF에는 “As shown by [?].”만 남으며 참고문헌 목록은 아예 없습니다. bibtex를 실행하면 읽어 들인 곳을 The top-level auxiliary file: doc.aux, The style file: plain.bst, Database file #1: refs.bib로 보고합니다. 두 번째 pdflatex에서 References 목록은 나오지만 본문의 인용은 여전히 [?]입니다. 세 번째에 이르러서야 [1]이 됩니다.
pdflatex doc # writes \citation and \bibdata into doc.aux; text shows [?]
bibtex doc # reads doc.aux + refs.bib, writes doc.bbl
pdflatex doc # pulls in doc.bbl: the list appears, the mark is still [?]
pdflatex doc # now the \bibitem labels are in doc.aux: the mark becomes [1]
latexmk -pdf doc # does all four, and repeats until nothing changes세 번째 실행이 필요한 이유도 같은 .aux 왕복으로 설명됩니다. 두 번째 실행이 읽어 들인 .bbl의 \bibitem이 “이 키는 [1]”이라는 대응을 .aux에 써 넣는 시점은 바로 그 두 번째 실행의 도중이며, 본문의 \cite는 이미 그전에 조판을 마쳤습니다. 그래서 그 대응표는 다음 실행부터 쓸 수 있고, 세 번째 pdflatex, 명령으로는 네 번째가 필요해집니다. biblatex와 biber도 모양은 같아서 bibtex 자리에 biber가 들어가 .bcf를 읽습니다. 실무에서는 latexmk에 맡기고 횟수를 잊는 편이 낫습니다. 그래도 목록이 비어 있다면 원인은 대개 셋 중 하나입니다. \bibliography{refs}에 .bib 확장자를 붙였다, 본문에 \cite가 하나도 없다(\nocite{*}를 넣으면 전부 나옵니다), 키의 철자가 틀렸다. 마지막 경우는 .blg 로그에 Warning--I didn't find a database entry for "..."로 나타납니다.
그림이 원하는 자리에 오지 않고 다른 쪽으로 밀릴 때
figure 환경은 플로트(부동체)여서, 놓을 자리가 날 때까지 LaTeX이 붙들고 있기 때문입니다. 많은 사람이 걸려 넘어지는 지점이 \newpage와 \clearpage의 차이입니다. \newpage는 “지금 쪽을 여기서 끝낸다”일 뿐 대기 중인 플로트를 내보내지 않습니다. \clearpage는 대기 중인 플로트를 모두 출력한 뒤에 쪽을 끝냅니다. 같은 원고에서 이 명령 하나만 바꾼 두 판을 TeX Live 2024로 조판하고 pdftotext로 쪽마다 내용을 보면 차이가 분명합니다.
\section{Alpha}
... a page of text ...
\begin{figure}[t]
\centering \rule{10cm}{16cm}
\caption{First figure}
\end{figure}
\newpage % <- only this line differs between the two builds
%\clearpage
\section{Beta}
\begin{figure}[t]
\centering \rule{6cm}{5cm}
\caption{Second figure}
\end{figure}
Text of Beta.\newpage 판은 4쪽이 되었습니다. p.1은 Alpha의 본문, p.2는 “Beta” 제목과 본문, p.3에 그림 1, p.4에 그림 2. Alpha 절에 속한 그림 1이 다음 절의 제목을 건너뛰어 뒤로 나온 것입니다. \clearpage 판은 3쪽으로, p.1은 Alpha의 본문, p.2는 그림 1만, p.3에 그림 2와 “Beta” 제목과 본문이 놓입니다. 그림이 절의 경계를 넘지 않고 분량도 한 쪽 줄었습니다. 즉 “그림이 엉뚱한 장에 섞여 들어간다”는 현상은 대개 구조가 바뀌는 자리에 \newpage를 쓴 탓입니다. 장·절의 경계에는 \clearpage(양면 인쇄라면 \cleardoublepage)를 쓰세요. 그리고 위치 지정은 [h] 하나가 아니라 [htbp]로 씁니다. [h]는 “여기 들어가면 여기, 아니면 나중에”라는 뜻이고, \textheight보다 높은 플로트는 본문 쪽에 결코 함께 놓이지 않습니다. 플로트의 세밀한 제어는 “플로트와 배치” 페이지가 맡습니다.
이미지가 아예 나오지 않거나 빈 상자만 보일 때
증상이 “아무것도 안 나온다”면 형식과 출력 경로의 불일치를, “빈 상자만 나온다”면 draft를 먼저 의심합니다. pdflatex가 직접 읽는 것은 PDF·PNG·JPEG이며 EPS는 전혀 읽지 못합니다(epstopdf로 변환하거나 epstopdf 패키지에 맡깁니다). 반면 platex → dvipdfmx의 DVI 경로는 EPS도 다룹니다. 파일을 찾지 못할 때의 메시지는 ! LaTeX Error: File 'fig.eps' not found.이고, 원인은 거의 언제나 확장자 누락, 잘못된 경로, 또는 끝의 슬래시를 빠뜨린 \graphicspath{{figures/}}입니다. 또 하나의 고전인 ! LaTeX Error: Cannot determine size of graphic in xxx.png (no BoundingBox).는 graphicx에 드라이버 지정이 전달되지 않았을 때 나옵니다. Cloud LaTeX의 FAQ도 이 메시지 하나를 독립 항목으로 싣고 있습니다.
빈 상자 쪽은 원인을 알고 나면 허탈할 만큼 단순합니다. \documentclass[draft]{article}로 이미지를 넣어 TeX Live 2024에서 조판하고 pdftotext로 확인하니, 그림이 있어야 할 자리에 파일 이름 문자열이 나왔습니다. draft가 하는 일이 정확히 그것입니다. 이미지 그리기를 건너뛰고 같은 치수의 상자와 이름만 남깁니다. 클래스 옵션에 draft를 써 놓은 것을 잊은 채 “이미지가 깨졌다”고 고민하는 일은 가장 흔한 사고 가운데 하나입니다. 제출본에서는 반드시 draft를 빼세요. 속도만 원한다면 \usepackage[draft]{graphicx}로 그림에만 한정할 수 있습니다. 이 절의 원인을 모두 지우고도 그림이 없다면, 사실은 “안 나온” 것이 아니라 “다른 쪽으로 흘러간” 것일 수 있습니다. 앞 절로 돌아가세요.
내 환경에서는 되는데 공저자 환경에서는 실패할 때
두 대의 환경이 어긋나는 원인은 실제로 셋으로 좁혀집니다. TeX Live의 연도, 설치된 패키지의 판, 그리고 개인 트리에 넣어 둔 자작 파일입니다. 앞의 둘은 한 줄만 더하면 눈에 보입니다. \documentclass 앞에 \listfiles를 쓰고 조판하면 .log 끝에 *File List* 블록이 나오고, 파일마다 한 줄씩 날짜와 판이 늘어섭니다. TeX Live 2024에서는 amsmath.sty 2023/05/13 v2.17o AMS math features, graphicx.sty 2021/09/16 v1.2d Enhanced LaTeX Graphics 같은 항목입니다. 공저자에게 같은 블록을 받아 비교하면 범인은 대개 한 줄에서 드러납니다. 엔진 자체의 연도는 pdflatex --version이 pdfTeX 3.141592653-2.6-1.40.26 (TeX Live 2024)로 답합니다.
% put this on the very first line of the source
\listfiles
$ pdflatex doc.tex && sed -n '/File List/,/^ \*\*\*/p' doc.log
*File List*
article.cls 2023/05/17 v1.4n Standard LaTeX document class
amsmath.sty 2023/05/13 v2.17o AMS math features
graphicx.sty 2021/09/16 v1.2d Enhanced LaTeX Graphics (DPC,SPQR)
$ kpsewhich -var-value=TEXMFHOME # macOS, TeX Live 2024
/Users/you/Library/texmf
$ pdflatex --version | head -1
pdfTeX 3.141592653-2.6-1.40.26 (TeX Live 2024)세 번째 원인인 개인 트리가 가장 찾기 어렵습니다. macOS의 TeX Live 2024에서 kpsewhich -var-value=TEXMFHOME를 실행하면 /Users/you/Library/texmf가 돌아옵니다. TeX Live 2024에 딸린 texmf.cnf가 TEXMFHOME = ~/Library/texmf로 설정하기 때문이며, Windows와 Linux의 기본값은 ~/texmf입니다. 그곳에 둔 .sty, .bst, 자체 글꼴은 자기 기기에서만 보이므로, 원고를 받은 쪽에서는 ! LaTeX Error: File 'mystyle.sty' not found.가 납니다. 대책은 단순합니다. 자작 파일은 원고 폴더에 두고 함께 전달하십시오. TeX Live의 연도 차이까지 지우고 싶다면 Docker 이미지 등으로 환경 자체를 고정하는 편이 확실합니다. 공동 작업의 방식은 “공동 집필과 변경 관리” 페이지가, 환경 고정은 “Docker / CI” 페이지가 맡습니다.
letterpaper라고 썼는데 PDF가 A4로 나올 때
클래스 옵션이 바꾸는 것은 판면(본문 치수와 여백)이지 PDF의 용지 자체가 아니기 때문입니다. TeX Live 2024에서 \documentclass[letterpaper]{article}을 그대로 조판하고 pdfinfo로 확인하면 Page size: 595.276 x 841.89 pts (A4)가 돌아옵니다. 이유는 pdfTeX의 시작 설정에 있습니다. 포맷에 새겨지는 pdftexconfig.tex가 \pdfpageheight = 297 true mm와 \pdfpagewidth = 210 true mm를 설정하는데, 이는 PDF의 미디어 박스를 정하는 원시 명령입니다. 클래스 옵션은 이 층에 손이 닿지 않습니다. 같은 문서에 \usepackage[letterpaper]{geometry}를 더하면 612 x 792 pts (letter)로 바뀝니다. geometry가 판면과 용지 치수를 함께 돌보기 때문입니다.
$ pdflatex letter.tex && pdfinfo letter.pdf | grep "Page size"
Page size: 595.276 x 841.89 pts (A4) # \documentclass[letterpaper]{article}
# fix 1 — geometry sets the type area AND the sheet
% \usepackage[letterpaper]{geometry}
Page size: 612 x 792 pts (letter)
# fix 2 — set the pdfTeX primitives before \documentclass
% \pdfpagewidth=8.5truein \pdfpageheight=11truein
Page size: 612 x 792 pts (letter)대처법은 셋이고 상황이 고릅니다. 가장 무난한 것은 geometry이며, 여백 지정까지 한곳에 모을 수 있습니다. 프리앰블을 늘리기 싫다면 \documentclass 앞에 \pdfpagewidth=8.5truein \pdfpageheight=11truein를 쓰면 마찬가지로 612 x 792 pts (letter)가 됩니다(실측). DVI 경로에서는 PDF를 실제로 만드는 쪽이 dvipdfmx이므로 dvipdfmx -p letter처럼 변환 단계에서 지정합니다. 여기에 true를 붙이는 이유도 알아 두면 쓸모가 있습니다. \mag로 전체를 확대·축소할 때 true가 붙은 치수만 그 영향을 받지 않기 때문입니다. 용지에 관한 자세한 내용은 “PDF 생성” 페이지가 맡습니다.
일본어가 나오지 않거나 깨질 때
거의 틀림없이 엔진이나 문자 인코딩을 잘못 고른 것입니다. pdflatex는 일본어를 전혀 조판하지 못합니다. 실제로 쓰이는 경로는 둘입니다. uplatex(+ jsarticle나 jlreq 클래스)에서 dvipdfmx로 넘기는 경로, 그리고 lualatex + luatexja. 소스는 UTF-8로 저장합니다. 놓치기 쉬운 점은 같은 “일본어 지원”이라도 platex와 uplatex가 다루는 문자 범위가 다르다는 것입니다. TeX Live 2024에서 髙(U+9AD9)이 든 한 줄을 platex에 넣으면 ! LaTeX Error: Unicode character ^^e9^^ab^^99 (U+9AD9) not set up for use with LaTeX.로 멈추지만, uplatex는 같은 줄을 경고 없이 통과시킵니다. 따라서 인명이나 이체자에서만 실패한다면 글꼴이 아니라 엔진을 의심하세요.
글자는 나오는데 두부(□)나 엉뚱한 서체로 보인다면 일본어 글꼴 설정 문제입니다. dvipdfmx 경로에서는 kanji-config-updmap으로 임베드할 일본어 글꼴을 고르고, LuaTeX-ja에서는 \setmainjfont 등으로 지정합니다. 또 원고를 받은 쪽에서만 깨진다면 인코딩과 줄바꿈을 의심하세요. UTF-8이 아닌 형식(Shift_JIS나 EUC-JP)으로 저장된 파일이 섞여 있으면 platex는 -kanji= 설정에 따라 해석을 달리합니다. 일본어 조판 방식 자체는 “일본어 조판 방법” 페이지가, 문자 인코딩과 줄바꿈은 “인코딩과 줄바꿈” 페이지가 맡습니다.
글꼴이 임베드되지 않았다는 지적을 받을 때
추측이 아니라 pdffonts로 확인합니다. TeX Live 2024에서 만든 평범한 pdfLaTeX 출력에 실행하면 emb, sub, uni 열이 나오고 KJJYRX+CMR10 Type 1 Builtin yes yes yes 같은 행이 보입니다. emb가 yes이고 글꼴 이름 앞에 여섯 글자짜리 서브셋 접두사가 붙습니다. 이 둘이 갖춰지면 임베드된 것입니다. 반대로 emb가 no인 행이 있으면 학회 투고 시스템이나 PDF/A 검사는 반드시 거기서 멈춥니다. 원인은 대체로 셋입니다. Type 3 비트맵 글꼴(대응하는 Type1이 없어 METAFONT 비트맵이 쓰인 경우), PDF 표준 14서체(Helvetica 등을 실체 없이 참조), 그리고 dvipdfmx의 맵이 임베드 불가 글꼴을 가리키는 경우입니다.
$ pdffonts document.pdf
name type encoding emb sub uni object ID
-------------------------- ---------- --------- --- --- --- ---------
KJJYRX+CMR10 Type 1 Builtin yes yes yes 4 0
# "yes" under emb, plus the six-letter subset prefix, means embedded.
# Any line with "no" under emb will fail a PDF/A or journal check.어떤 오류 메시지를 어느 페이지가 답하는가
여기까지의 질문에는 공통의 오류 메시지가 없었지만, !로 시작하는 줄이 나왔다면 이야기가 다릅니다. 메시지 자체가 갈 곳을 정합니다. 이 사이트의 errors 구역은 메시지 하나에 페이지 하나로 정리되어 있고, ! Missing $ inserted., ! Undefined control sequence., ! LaTeX Error: Missing \begin{document}., Runaway argument?, ! LaTeX Error: Option clash for package ..., Overfull \hbox가 각각 전용 해설을 가지고 있습니다. 아래 표는 TeX Live 2024에서 실제로 재현한 문구와, 그 한 줄이 무엇을 말하는지의 대응입니다. 읽는 요령은 하나뿐입니다. 맨 위의 오류부터 고칠 것. TeX의 오류는 연쇄하므로 아래쪽은 대개 첫 건의 여진입니다.
| 메시지 | 대개의 원인 |
|---|---|
! Missing $ inserted. | _나 ^처럼 수식에서만 쓰는 기호를 본문에 썼습니다 |
! Undefined control sequence. | 명령 이름의 철자가 틀렸거나, 그것을 정의하는 패키지를 불러오지 않았습니다 |
! LaTeX Error: Missing \begin{document}. | 프리앰블에 인쇄되는 문자가 있습니다. 흘러든 한 글자나 BOM이 대표적입니다 |
Runaway argument? | 닫지 않은 }, 또는 인수 중간의 빈 줄. 이어서 ! File ended while scanning use of ...가 나옵니다 |
! LaTeX Error: Option clash for package | 같은 패키지를 다른 옵션으로 두 번 불러왔습니다. 클래스가 먼저 불러온 경우도 많습니다 |
Overfull \hbox | 줄을 나눌 수 없어 판면을 넘쳤습니다. 오류가 아니라 경고이며 PDF는 생성됩니다 |
LaTeX Warning: There were undefined references. | 아직 1회차입니다. 다시 조판하면 사라집니다. 그래도 남으면 \label 쪽 문제입니다 |