最初の LaTeX 文書として動く最小形は、たった 1 行です。\documentclass{article}\begin{document}Hi\end{document} ——これを pdflatex に通すと、実際に 11,529 バイトの PDF が 1 ページ出てきます。最初の文書でつまずく人の多くは、この 1 行が何をしているかを飛ばして、いきなり長い雛形を写しているからです。このページでは、その最小の文書から始めて、プリアンブルと本文の境目、コンパイルの仕方、勝手に増える .aux や .log の正体、なぜ 2 回コンパイルが必要なのか、そして初日に必ずぶつかる % や $ の落とし穴までを、実際の端末出力とともに順に潰していきます。
動く最小の LaTeX 文書(hello world)
必要な命令は 3 つだけです。\documentclass{article} で文書の種類を宣言し、\begin{document} で本文を開き、\end{document} で閉じる。この 3 つのうち 1 つでも欠けると PDF は出ません。逆に言えば、この 3 つさえあれば中身は空でも動きます。まずは改行を入れた読みやすい形で hello.tex として保存してください。ファイルの文字コードは UTF-8、拡張子は .tex です。
\documentclass{article}
\begin{document}
This is my first document.
\end{document}\documentclass{article} の article が クラス です。クラスは文書全体の設計図で、余白の広さ、見出しの大きさと前後の空き、章立てがあるかどうか、といったものをまとめて決めます。標準で入っているのは article(論文・短いレポート・技術メモ。章 \chapter はありません)、report(章のある長めの報告書)、book(両面印刷を前提にした書籍)、letter(手紙)です。日本語で書くなら jlreq か jsarticle を選びます(日本語の設定は「TeX・LaTeX と日本語」で扱います)。学会や出版社が独自のクラスファイルを配っているなら、迷わずそれを使ってください。投稿規定の議論がまるごと消えます。
プリアンブルと本文 — \begin{document} が分ける二つの世界
\begin{document} より 前 がプリアンブル、後ろ が本文です。プリアンブルは「これからどう組むか」を決める場所で、ここに書いたものは紙に出ません。本文は逆に、書いたものが原則そのまま出ます。この境目は LaTeX の都合ではなく 必然 です。LaTeX は 1 文字目を組み始める前に、用紙の大きさ、行の幅、使うフォント、読み込むパッケージをすべて確定しておく必要があります。だから \usepackage はプリアンブルにしか書けません。本文に書くと ! LaTeX Error: Can be used only in preamble. で止まります。
逆の間違いもよく起きます。プリアンブルに普通の文章を書いてしまうと ! LaTeX Error: Missing \begin{document}. が出ます。「\begin{document} を書いたはずなのに」と戸惑うところですが、LaTeX の言い分は「本文が始まっていないのに文字が来た」であって、本文の開始位置より前に文字がある という指摘です。プリアンブルに残したメモは % でコメントアウトしてください。
コンパイルして PDF にする(pdflatex と latexmk)
端末で pdflatex hello.tex と打つだけです。エディタや Overleaf を使っているなら「コンパイル」ボタンが同じことをしています。成功したときの合図は最後の 2 行——Output written on hello.pdf と Transcript written on hello.log。この 2 行が出ていれば PDF はできています。途中に流れる大量のパスは、読み込まれたクラスファイルやフォントの一覧で、正常な出力です。読む必要はありません。
$ 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 を覚えておくと後で楽です。必要な回数だけ自動でコンパイルし直してくれる ので、次の節の「2 回問題」を意識せずに済みます。
増えたファイルは何なのか — .aux .log .toc .out とは
1 回コンパイルしただけで、フォルダにファイルが 4 つ増えます。これは異常ではなく、LaTeX が自分あての覚え書きを残している だけです。目次と節を 1 つ含む文書を pdflatex に通すと、hello.tex のほかに hello.aux(132 バイト)、hello.log(3,250 バイト)、hello.pdf(31,014 バイト)、hello.toc(59 バイト)ができます。中でも .aux が LaTeX の心臓部です。実際に開くと、この 3 行だけが入っています。
% 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 は処理の全記録、.out は hyperref を使ったときに増える PDF のしおり(ブックマーク)情報です。
| 拡張子 | 中身 | 消してよいか |
|---|---|---|
.tex | あなたが書いた原稿。唯一の原本 | 絶対に消さない。バックアップと Git の対象はこれだけ |
.pdf | 完成した出力 | 消してよい。原稿から何度でも作り直せます |
.aux | 節番号・図表番号・ラベルの参照先とページ | 消してよいが、直後の 1 回は参照が ?? になります |
.log | 読み込んだファイル、警告、エラーの全記録 | 消してよい。ただしエラー調査中は最重要の資料です |
.toc | 前回の実行で書き出した目次の項目とページ | 消してよい。次の実行で目次が空になるだけです |
.out | hyperref が作る PDF のしおり | 消してよい。hyperref を使っていなければ現れません |
実務上の結論は簡単です。バージョン管理に入れるのは .tex と画像だけ、補助ファイルは無視リストに入れます。掃除は latexmk -c が一発でやってくれます。ただし、原因不明の不具合が続くとき以外は消さないでください。補助ファイルは仕事を減らすためにあるので、毎回消すのは毎回わざと遠回りしているのと同じです。
なぜ 2 回コンパイルするのか — ?? と Rerun 警告
1 回目の実行では、まだ答えを知らないからです。 「Section 1 を参照」と書いたとき、LaTeX がその節の番号とページを知るのは、実際にそこを組んだ 後 です。しかし参照はたいてい節より前に出てきます。そこで 1 回目は分かる範囲で組みながら答えを .aux に書き出し、2 回目に読み返して穴を埋めます。目次も同じで、\tableofcontents は文書の先頭にありますが、中身が分かるのは最後まで読んだあとです。次が実際の 2 回分の記録です。
$ 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."見どころは 3 つです。1 回目は No file ref.aux. ——覚え書きがまだ無い。参照は ?? と印字され、LaTeX Warning: Label(s) may have changed. Rerun to get cross-references right. が出ます。この Rerun という単語がそのまま指示 で、もう一度走らせろという意味です。2 回目には警告が消え、?? が 1 に変わります。目次も 1 回目は見出しだけで中身が空、2 回目でようやく項目が並びます。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 と表示され、必要な 2 回をきっかり実行して止まります。参考文献(BibTeX/biber)や索引(makeindex)を使うと必要な回数はさらに増えますが、そこも latexmk が面倒を見ます。VS Code の LaTeX Workshop、TeXShop、Overleaf も、たいてい裏で latexmk を呼んでいます。
打ったとおりに出ない文字 — % & _ # $
LaTeX には、そのまま打つと別の意味になる文字が 10 個あります:# $ % & ~ _ ^ \ { }。初日にいちばんよく人を刺すのは % です。しかもこれは エラーになりません。 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”)になります。左は逆向きのバッククォート 2 個、右はアポストロフィ 2 個で、``hello'' と書くのが正解です。
最初のエラーの読み方 — ! Missing $ inserted. ほか
見るべきは ! で始まる最初の 1 行と、その次に出る l. で始まる行だけです。 l. は line の略で、そのあとの数字が行番号、その行の内容も一緒に印字され、TeX がつまずいた位置でちょうど 2 行に折り返して表示されます。折り返し点が犯行現場です。たとえば x_1 を本文に書いたときの出力は次のようになります。TeX は最初のエラーのあと無理に処理を続けるので、後ろに並ぶエラーはたいてい連鎖反応です。いちばん上だけ直して、もう一度走らせてください。
$ 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$ と数式にするか、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 を置けば目次も自動生成されます(前述のとおり、目次が出るのは 2 回目からです)。\date{\today} はコンパイルした日の日付に置き換わり、番号を付けたくない見出しは \section*{...} とアスタリスクを添えます。
\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}この例には、本文を書くうえでいちばん大事なルールも入れてあります。ソース中の改行は無視され、空行が段落の区切りになります。 1 文ごとに改行しても、3 行分の空行を入れても、出力は同じ。最終的な改行位置は LaTeX が段落全体を見て決めます。段落を分けたいときだけ空行を入れてください。
パッケージで機能を足す — \usepackage
足りない機能は パッケージ で補います。プリアンブルに \usepackage{...} を 1 行足すだけです。画像を貼るなら graphicx、本格的な数式なら amsmath、余白を変えるなら geometry、リンクと PDF のしおりなら hyperref。パッケージ本体は TeX Live などのディストリビューションに何千個も同梱されていて、その総本山が CTAN(Comprehensive TeX Archive Network)です。ただし 最初から詰め込まないこと。 使う理由を説明できるものだけを入れてください。パッケージ同士が衝突して Option clash for package ... のようなエラーになると、原因の切り分けは入っている数に比例して面倒になります。
\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 は最後に読み込みます。他のパッケージの命令を書き換えて動くため、先に読むと後から来たパッケージに上書きされてしまうからです。ここまでの内容——最小の文書、プリアンブルと本文、コンパイル、補助ファイル、2 回実行、特殊文字、そして最初のエラー——が、初日に必要なすべてです。あとは書きたいものを書きながら、必要になった機能を一つずつ足していけば十分です。