LaTeX 入门 · 第1篇 认识 LaTeX 与基本语法
0. 先搞清楚一件事:LaTeX 是怎么工作的
写 Word 时,敲一个字,屏幕上立刻显示一个字。LaTeX 不是这样,它的工作方式分三步:

用纯文本写一个 .tex 源文件(内容是带标记的文字),再用编译引擎(pdflatex / xelatex)把它编译成 .pdf。编译过程中还会产生一些辅助文件(.aux、.log 等),服务于编译本身;最终交付阅读的只有那个 PDF。
这张图是后面所有操作的框架。
1. TeX 与 LaTeX 是什么
TeX 是高德纳(Donald E. Knuth)从 1977 年开始开发的排版系统,特别擅长处理数学公式和结构复杂的长篇文档。(一个有趣的小细节:TeX 的版本号是圆周率 3.14159265——每修一个 bug 版本号就往圆周率后推一位,作者的数学品味可见一斑。)
LaTeX 是 Leslie Lamport 在 TeX 之上做的一层封装。可以粗略地理解为:LaTeX 把 TeX 难记的底层命令,包装成了一套更易用的命令集。作者写 LaTeX 命令描述文档结构,底层的 TeX 引擎负责真正的排版。
1.1 核心理念:内容与格式分离
这是 LaTeX 和 Word 最根本的区别,用一张图说清楚:

- Word:直接选中文字,用工具栏调字体、字号、颜色,屏幕上看到的就是最终效果——这叫「所见即所得」(WYSIWYG)。代价是格式和内容混在一起,改样式要满文档地手动调。
- LaTeX:只声明结构——「这是一级标题」「这是正文」「这是公式」——具体的字体、间距、编号、页面布局全部交给文档类统一处理。源代码只关心「写什么」,不关心「长什么样」。
类比:LaTeX 之于 Word,就像 HTML + CSS 之于 Dreamweaver。
.tex源文件是 HTML(结构和语义),文档类和宏包是 CSS(样式)。不会在 HTML 里写死每个字的颜色,同理也不该在 LaTeX 里手动调每个标题的字号。
这种分离带来的好处是:一旦样式设定好,全文统一;要换风格(比如从论文模板换成幻灯片),只需换文档类,内容几乎不用动。
2. 第一段 LaTeX 代码
最简单的 LaTeX 源文件:
\documentclass{article}
\begin{document}
``Hello, world!'' from \LaTeX.
\end{document}保存为 helloworld.tex,用 pdflatex 编译,得到:

即使暂时看不懂每个符号,也能注意到两件事:
- 左双引号是 两个反引号 连写,右双引号是 两个直引号 连写。
- LaTeX 里 没有直引号,要打出 “Hello” 这样的左右双引号,必须用 反引号 + 直引号 的组合。
- 例子(用四反引号围栏保证原样显示):
``Hello''渲染后就是左右弯引号 "Hello"。
\LaTeX输出了排版规范的「LaTeX」标志——这就是一个命令。
2.1 中文文档
如果文档包含中文,把 \documentclass{article} 换成 ctexart,并用 xelatex 编译:
\documentclass{ctexart}
\begin{document}
你好,\LaTeX{} 世界!
\end{document}用 xelatex 编译后的效果:

编译器要选对:纯英文文档用
pdflatex即可;含中文的文档用xelatex,并配合ctexart/ctexbook/ctexrep文档类(第 5 篇会详细讲中文处理)。注意\LaTeX后面那个{}——它不是装饰,下一节会解释为什么需要它。
3. LaTeX 的语法:命令、环境、注释
这一节是本篇的重点,掌握了它,后续所有篇章的代码都能看懂结构。
先看这张「源码解剖图」,把一段典型 LaTeX 代码的每个组成部分用颜色区分出来:

下面逐个讲解。
3.1 命令:以反斜杠开头
LaTeX 命令都以 \(反斜杠)开头,后面跟命令名。命令名区分大小写:\LaTeX 是正确的,写成 \Latex 或 \LaTex 都会报错。
命令可以带参数:
- 必选参数用花括号
{ }包裹,如\documentclass{article}里的{article}; - 可选参数用方括号
[ ]包裹,如\documentclass[11pt]{article}里的[11pt]。
3.2 空格吞噬:新手第一个坑
看这个例子:
Shall we call ourselves \TeX users?Shall we call ourselves \TeX{} users?Shall we call ourselves \TeX\ users?渲染效果:

问题出在第一行:\TeX 是一个命令,LaTeX 会把它后面的空格「吃掉」(当作命令名结束的标志),结果「TeX」和「users」粘在了一起。
解决办法有两种:
\TeX{}:空花括号强行结束命令,后面的空格保留;\TeX\:反斜杠加空格,显式插入一个空格。
经验法则:任何以命令结尾、后面紧跟普通文字的地方,都要留意空格。用
{}是最安全的写法,这也是前面\LaTeX{}里那个空花括号的用途。
3.3 特殊字符:10 个需要转义的符号
LaTeX 里有 10 个保留字符,它们有特殊含义,不能直接打出来。要输出它们本身,需要用反斜杠「转义」:
LaTeX has 10 reserved characters:\# \$ \% \& \_ \{ \} \textasciitilde{} \textasciicircum{} \textbackslash{}
In practice:Price: \$100, discount 30\%, item \#42.Underscore in code: my\_variable.渲染效果:

| 想要输出 | 写法 | 说明 |
|---|---|---|
$ | \$ | 数学公式定界符 |
% | \% | 注释符 |
& | \& | 表格对齐符 |
# | \# | 宏参数符 |
_ | \_ | 数学下标 |
{ } | \{ \} | 参数分组符 |
~ | \textasciitilde{} 或 \~{} | 不可断空格 |
^ | \textasciicircum{} 或 \^{} | 数学上标 |
\ | \textbackslash{} | 命令引导符 |
\、^、~不能简单用\转义(因为\后面跟它们本身有别的含义),要用上表中的命令形式。
3.4 环境:成对出现的 begin / end
有些排版效果需要作用于一段内容,这时用环境:
\begin{environment name}[optional arguments]{mandatory arguments}...内容...\end{environment name}\begin 和 \end 必须成对出现,且环境名一致。环境可以嵌套。后面会大量用到的列表、公式、图片环境,都是这种结构。
3.5 注释:百分号之后的内容
% 之后到行尾的内容是注释,编译时会被忽略。这和编程语言里的注释一样,用来给源代码写说明:
\documentclass{article} % 指定文档类型为普通文章\usepackage{geometry} % 加载页面设置宏包4. 一份 LaTeX 文档的骨架
把前面的内容拼起来,一份完整的 LaTeX 文档长这样:

一份文档被 \begin{document} 和 \end{document} 分成两个区域:
- 导言区(Preamble):从
\documentclass到\begin{document}之间。这里写的是设置——指定文档类、加载宏包、定义标题作者等。导言区的内容不会直接出现在 PDF 里。 - 正文区(Document body):
\begin{document}到\end{document}之间。这里写的是真正会出现在 PDF 里的内容。
\end{document} 之后的所有内容都会被忽略,可以在文档末尾随意写备忘。
常见困惑:为什么
\section{...}没出现在 PDF 里?——多半是写在了导言区(\begin{document}之前)。
5. 文档类与常用选项
\documentclass{...} 是每个文档的第一条命令,决定整个文档的基本样式。完整语法是:
\documentclass[options]{class-name}5.1 常用文档类
| 文档类 | 适用场景 |
|---|---|
article | 短篇文章、报告、论文(最常用) |
report | 较长的报告,含章节 |
book | 书籍,含章节、前言、附录,默认双面排版 |
proc | 会议论文集 |
slides | 幻灯片(现已多用 Beamer 替代) |
minimal | 最小文档,常用于测试(MWE) |
中文文档对应地把它们换成 ctexart / ctexrep / ctexbook。
5.2 常用选项
options 是逗号分隔的键值,用来微调文档类的默认行为。比如:
\documentclass[11pt,twoside,a4paper]{article}这条命令把文档设为 11 磅字号、双面排版、A4 纸张。完整选项表:
| 选项 | 含义 | 默认值 |
|---|---|---|
10pt / 11pt / 12pt | 基础字号 | 10pt |
a4paper / letterpaper / a5paper 等 | 纸张大小 | letterpaper(美制) |
twoside / oneside | 单面/双面排版(双面会区分奇偶页边距) | article/report 用 oneside,book 用 twoside |
onecolumn / twocolumn | 单栏/双栏 | onecolumn |
landscape | 横向纸张 | 纵向 |
titlepage / notitlepage | 标题是否单独成页 | article 为 notitlepage,report/book 为 titlepage |
fleqn | 公式左对齐(默认居中) | 居中 |
leqno | 公式编号在左侧(默认右侧) | 右侧 |
draft / final | 草稿模式(会标出排版溢出的行)/ 正式模式 | final |
实际效果对比,下面这个文档用了 11pt, twoside, a4paper:
\documentclass[11pt,twoside,a4paper]{article}\usepackage[margin=2.5cm]{geometry}\title{Document Class Options Demo}\author{Author Name}\date{\today}\begin{document}\maketitle\section{What Changed?}This document uses three options...\end{document}渲染效果(注意字号比默认的 10pt 大):

而 draft 选项会在 Overfull \hbox 的右端添加黑色标记,帮助定位水平溢出问题:
\documentclass[draft]{article}\begin{document}This is a normal line of text.ThisIsAnExtremelyLongWordThatCannotBeBrokenAutomaticallyByLaTeX.\end{document}
注意:如果内容溢出过多,标记本身可能落在页面范围之外,因此在 PDF 中看不到。在 LaTeX 标准
article类中,draft选项会自动执行\setlength\overfullrule{5pt}——也就是为溢出的行添加宽度为 5pt 的黑色标记。如果你觉得默认 5pt 不够明显,可以手动改大,比如\overfullrule=10pt。但加宽标记不能解决标记跑到页面外的问题,测试内容仍然不能溢出太多。
实用建议:正式投稿前用
final;写作过程中临时打开draft,能快速发现哪些行超出了页边距。
6. 宏包:扩展 LaTeX 的能力
LaTeX 本身只提供基础功能。要排公式表、插图片、设页面、做幻灯片……都靠加载宏包(package)。加载命令是:
\usepackage[options]{package-name}多个无选项的宏包可以写在一行:
\usepackage{tabularx, makecell, multirow}\usepackage 必须写在导言区(\begin{document} 之前)。后面几乎每一篇都会加载新的宏包。
6.1 texdoc:随时查阅宏包文档
安装了 TeX Live 后,系统里其实自带了几乎所有常用宏包的官方文档。在终端输入:
texdoc ctex就会弹出 ctex 宏包的使用手册 PDF。把 ctex 换成任何宏包名都行,比如 texdoc geometry、texdoc amsmath、texdoc hyperref。
这是学 LaTeX 最被低估的技能。遇到不会用的宏包,第一反应应该是
texdoc 包名,比搜索引擎更快更准。
7. 让 LaTeX 自动生成目录
写长文档时,目录几乎必不可少。LaTeX 生成目录只需一条命令:
\tableofcontents把它放在正文里希望目录出现的位置(通常是 \maketitle 之后)。LaTeX 会自动扫描全文的 \section、\subsection 等命令,生成带页码的目录:
\documentclass{article}
\usepackage[margin=2.5cm]{geometry}
\title{Generating a Table of Contents}\author{Author Name}\date{\today}
\begin{document}\maketitle
\tableofcontents
\section{Introduction}This is the introduction section.
\subsection{Background}Some background information here.
\subsection{Motivation}Why we study this topic.
\section{Methodology}How we approach the problem.
\subsection{Data Collection}Details about data.
\section{Results}The final results of our study.
\end{document}
目录必须编译两次。 第一次编译时,LaTeX 把各级标题和页码写进辅助文件
.aux/.toc;第二次编译时才读这些信息生成目录。所以第一次编译出来的目录页码是空的或旧的——再编译一次就好了。这也是前面第 0 节那张流程图里「辅助文件」的作用:它们在多次编译之间传递信息。
VS Code + LaTeX Workshop 默认配置下,latexmk 会自动处理多次编译。但在命令行手动编译时,目录相关的内容都要编译两遍。
8. 编译出错了怎么办
学 LaTeX 必然会碰到编译报错——这是常态。关键是学会读错误信息。
8.1 一个典型的报错
下面这段代码用了一个不存在的命令 \nonexistentcommand:
\documentclass{article}\begin{document}This line uses a command that does not exist: \nonexistentcommand here.\end{document}编译时 LaTeX 会停下来,打印类似这样的信息:
! Undefined control sequence.l.4 ...nd that does not exist: \nonexistentcommand here.读报错信息抓三个要点:
- 错误类型:
! Undefined control sequence——「未定义的命令」,说明用了一个 LaTeX 不认识的命令(多半是拼写错误,或忘了加载某个宏包)。 - 行号:
l.4——第 4 行。 - 上下文:下面两行展示了出错位置,第一个换行处就是 LaTeX 卡住的地方。
8.2 命令行里的交互提示
在命令行直接编译时,遇到错误 LaTeX 会停在 ? 提示符等待输入:
- 按 回车:忽略这个错误,继续编译(可能连锁报更多错);
- 输入
x然后回车:放弃编译,退出; - 按
Ctrl + C:强制中断。
排查问题时,建议先输入
x退出,修好源代码再重新编译,而不是一路回车硬编译——那样会产生一堆连锁错误,反而看不清真正的问题在哪。
8.3 在 VS Code 里看错误
LaTeX Workshop 会把错误信息收集到「问题」面板和编译日志里,并标红出错的行。比起命令行,定位更直观。
8.4 常见错误 Top 5
| 报错信息 | 原因 | 排查方向 |
|---|---|---|
! Undefined control sequence | 用了未定义的命令 | 检查拼写;检查是否忘了 \usepackage |
! Missing $ inserted | 在正文里用了数学符号(如 _ ^) | 数学符号要放在 \( \) 或 \[ \] 里 |
! LaTeX Error: File 'xxx' not found | 引用了不存在的文件(图片、bib 等) | 检查路径和文件名,注意大小写 |
! Missing \begin{document} | 导言区写了正文内容 | 把内容移到 \begin{document} 之后 |
! LaTeX Error: Environment xxx undefined | 用了未定义的环境 | 检查环境名拼写;检查是否忘了加载宏包 |
一条总原则:错误信息里的第一个 ! 通常就是真正的病因,后面的连锁错误修好第一个后往往自动消失。
9. 小结
本篇覆盖了看懂任何 LaTeX 代码的全部基础:
- TeX / LaTeX 的关系:LaTeX 是 TeX 的封装,核心思想是内容与格式分离;
- 工作流程:写
.tex源文件 → 编译 → 得到.pdf; - 语法三件套:命令(
\name)、环境(\begin..\end)、注释(%),外加参数({ }必选、[ ]可选); - 文档骨架:导言区写设置,正文区写内容,以
\begin{document}为界; - 文档类与选项:
\documentclass[options]{class}决定基本样式; - 宏包:
\usepackage扩展功能,配合texdoc查文档; - 目录:
\tableofcontents一行搞定,但要编译两次; - 错误处理:抓「错误类型 + 行号 + 上下文」,先修第一个
!。
下一篇开始真正动手写内容——文字、段落、标题、章节、列表,搭起一篇完整文档的骨架。
本系列基于《一份(不太)简短的 LaTeX2e 介绍》(lshort-zh-cn)整理,辅以实战讲解和渲染示例。
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!













