目录
入门指南:基础模板、常用技巧与问题排查
在 AI 辅助写作逐渐普及之后,我们不必先记住大量命令,才能完成一份像样的文档。但如果完全不了解 的基本结构,就很难判断生成的代码是否合理,也不容易在编译出错时定位问题。对初学者而言,更实际的目标不是“背会 ”,而是先理解它能做什么、文档由哪些部分组成,以及遇到具体需求时应该去哪里查找解决方案。
本文首先帮助第一次接触 的读者建立一套基础而完整的认识,然后给出一份可以继续扩展的基础模板,并围绕模板中的文档类、宏包、公式、图表、交叉引用和参考文献逐项说明。后续章节则补充模板中没有直接展示的文本与数学语法、自定义命令、项目组织方式和常见问题排查方法。
若希望进行更系统的学习,推荐阅读《一份(不太)简短的 介绍》。它对文档结构、数学公式、图表和参考文献等主题都有较为完整的介绍。
先认识
不是所见即所得的文字处理器,而是一套运行在 TeX 引擎之上的文档准备与排版系统。我们在 .tex 源文件中写入正文、文档结构和排版命令,再通过 XeLaTeX、LuaLaTeX 等编译程序生成 PDF 文档。
除了排版完整文档, 也可以用于单独制作数学公式、示意图和其他排版元素。例如,可以使用 standalone 文档类,将一段公式或 TikZ 绘图编译为边界紧凑的独立 PDF,再借助 dvisvgm 或 Inkscape 转换为 SVG 等格式。若需要在 Markdown、HTML、LaTeX 和 Word 等文档格式之间进行转换,则可以使用 Pandoc。
尤其适合以下内容:
- 数学公式较多的作业、讲义、论文和书籍;
- 需要统一管理章节、编号、目录和交叉引用的长文档;
- 需要规范管理参考文献的学术写作;
- 需要绘制数学图形、物理示意图或科研图表的文档;
- 希望将内容与版式分离,以便长期维护和复用的项目。
的基本工作流程
一份典型的 文档需要经历以下过程:
文档通常包含文档类、导言区和正文三个主要部分。理解这一结构,还需要认识文档类、宏包、命令和环境四个基本概念:
| 概念 | 作用 | 示例 |
|---|---|---|
| 文档类 | 决定文档的基本类型和整体结构 | article、book、ctexart |
| 宏包 | 为文档增加额外功能 | amsmath、graphicx、hyperref |
| 命令 | 对内容执行排版或结构操作 | \section{}、\textbf{} |
| 环境 | 包围一段具有共同结构的内容 | equation、figure、table |
命令通常以反斜杠开头。必选参数写在花括号中,可选参数写在方括号中。例如,下面的命令将图片宽度设置为正文宽度的 80%:
\includegraphics[width=0.8\textwidth]{figure.pdf}
了解文档的基本构成后,可以在项目文件夹中创建源文件 main.tex,并写入以下最小示例:
\documentclass{article} % 文档类
% 导言区:加载宏包、设置格式、定义命令
\begin{document}
Hello, \LaTeX! % 正文
\end{document}
像 \LaTeX 这样的控制词会忽略紧随其后的普通空格。写成 \LaTeX{} 可以利用空组明确结束命令,从而在其后正常输入需要保留的空格。
保存文档后,需要将源文件编译为 PDF。为便于表述,本文会将 xelatex、lualatex 等程序统称为“编译命令”。更严格地说,它们是以不同 TeX 引擎运行 格式的命令行程序。
打开终端,将路径切换到源文件所在目录,然后运行:
xelatex main.tex
若未另行指定输出目录,编译成功后通常会在当前目录生成 main.pdf。此外还可能生成 .aux、.log、.out、.toc 等辅助文件,用于保存交叉引用、目录、PDF 书签和编译信息,通常不需要手动编辑。
选择 TeX 发行版或在线环境
的实际使用依赖编译引擎、宏包、字体和辅助工具。一般不需要逐个安装这些组件,而是安装一个完整的 TeX 发行版,或者使用在线编译环境。
| 使用环境 | 推荐方案 | 说明 |
|---|---|---|
| Windows | TeX Live 或 MiKTeX | TeX Live 提供较完整、统一的环境;MiKTeX 支持按需安装宏包 |
| macOS | MacTeX | 基于 TeX Live,并附带适用于 macOS 的图形界面工具 |
| Linux | TeX Live | 可以通过系统包管理器或官方安装程序安装 |
| 在线使用 | Overleaf | 在浏览器中编辑和编译,无须配置本地 TeX 环境 |
对于需要长期写作、使用较多数学和绘图宏包的用户,通常建议安装较完整的 TeX Live 或 MacTeX。精简安装虽然占用空间较小,但后续可能需要频繁补装宏包。
Windows
Windows 用户可以选择 TeX Live 或 MiKTeX。安装完成后,在命令提示符或 PowerShell 中运行:
xelatex --version
如果能够显示版本信息,说明 xelatex 已经可以被系统调用。
macOS
macOS 用户通常安装 MacTeX。安装完成后,可以在终端运行:
xelatex --version
MacTeX 基于 TeX Live,并附带 TeXShop 等适用于 macOS 的图形界面工具。
Linux
不同发行版的软件包名称有所不同。以 Debian 或 Ubuntu 为例,可以安装较完整的 TeX Live:
sudo apt update
sudo apt install texlive-full
texlive-full 包含大多数常用宏包,但占用空间较大。若只进行基础写作,也可以根据实际需要选择更精简的软件包组合。
选择编辑器与编译方式
TeX 发行版负责提供编译引擎、宏包和辅助工具,而编写 .tex 源文件通常需要文本编辑器或专用的 编辑器。许多编辑器还集成了编译、PDF 预览、错误定位和正反向搜索等功能。
常见的编辑器包括:
- TeXstudio:功能完整,适合初学者和传统桌面工作流;
- TeXworks:界面简洁,适合基础编辑和编译;
- Visual Studio Code:配合 LaTeX Workshop 扩展使用,适合同时进行写作、编程和版本管理;
- Overleaf:在线协作方便,不需要配置本地编译环境。
常见的 编译命令如下:
| 命令 | 特点 | 适用场景 |
|---|---|---|
pdflatex | 传统且稳定,但对 Unicode、中文和系统字体支持有限 | 纯英文文档或传统模板 |
xelatex | 直接支持 Unicode 和系统字体,中文配置方便 | 中文文档、多语言文档 |
lualatex | 支持 Unicode 和现代字体,扩展能力较强 | 中文文档、复杂排版和可编程排版 |
latex | 传统上生成 DVI 文件,而不是直接生成 PDF | DVI/PostScript 工作流 |
本文示例默认使用 xelatex。对于包含中文的普通文档,XeLaTeX 通常是较容易配置的选择。
无论使用哪一种编辑器,至少应确认以下设置:源文件采用 UTF-8 编码;项目使用正确的编译命令;编辑器能够调用已经安装的 TeX 发行版;编译后可以正常预览 PDF;必要时能够从源代码定位到 PDF,或从 PDF 反向定位到源代码。若使用了 fontspec 宏包或系统字体配置,却误用 pdfLaTeX 编译,通常会出现宏包报错、字体配置失败或中文无法正常显示等问题。
Visual Studio Code 的基础配置
若使用 Visual Studio Code,推荐安装 LaTeX Workshop 扩展,并在项目的 .vscode/settings.json 中加入以下基础配置:
{
"latex-workshop.latex.tools": [
{
"name": "xelatex",
"command": "xelatex",
"args": [
"-synctex=1",
"-interaction=nonstopmode",
"-file-line-error",
"%DOC%"
]
}
],
"latex-workshop.latex.recipes": [
{
"name": "xelatex",
"tools": [
"xelatex"
]
}
],
"latex-workshop.latex.recipe.default": "first",
"latex-workshop.latex.autoBuild.run": "onSave",
"latex-workshop.view.pdf.viewer": "tab",
"files.encoding": "utf8"
}
其中,-synctex=1 启用源代码与 PDF 之间的正向和反向定位;-interaction=nonstopmode 允许编译器在遇到错误时继续处理,以输出更完整的日志;-file-line-error 使错误信息包含源文件名和行号;%DOC% 表示当前正在编译的 .tex 文件。其余设置分别指定默认构建方案、保存时自动构建、在 Visual Studio Code 标签页中预览 PDF,以及使用 UTF-8 文件编码。
这条 recipe 每次只运行一次 xelatex,适合简单示例。目录、交叉引用或参考文献尚未更新时,需要再次编译,或者改用 latexmk 自动完成所需的多轮构建。
使用 latexmk 自动编译
部分文档需要多次运行 xelatex,或者还需要调用 BibTeX、Biber 等工具。此时可以使用 latexmk 自动判断所需的编译步骤:
latexmk -xelatex main.tex
latexmk 会检查辅助文件和依赖关系,并重复调用相应工具,直到交叉引用、目录和参考文献达到稳定状态,或者检测到无法继续处理的错误。清理普通辅助文件可以使用 latexmk -c;若还需要删除生成的 PDF,则可以使用 latexmk -C。
latexmk -c
latexmk -C
对于长期维护的项目,latexmk 通常比手动重复运行编译命令更方便。如果在 Windows 上使用 MiKTeX,并出现无法启动 latexmk 或缺少 Perl 的错误,可以暂时改用直接调用 xelatex 的构建方案,或者另行配置可用的 Perl 环境。
推荐的项目结构
简单项目可以只包含一个 .tex 文件:
latex-demo/
└── main.tex
稍复杂的项目建议将主文件、参考文献、图片、章节和编辑器配置分别存放:
latex-project/
├── main.tex
├── refs.bib
├── figures/
│ ├── diagram.pdf
│ └── plot.png
├── sections/
│ ├── introduction.tex
│ └── conclusion.tex
└── .vscode/
└── settings.json
其中,main.tex 是主文件,refs.bib 保存参考文献,figures/ 保存图片和绘图文件,sections/ 保存拆分后的章节,.vscode/settings.json 则保存项目级编辑器配置。在主文件中可以使用:
\input{sections/introduction}
将其他 .tex 文件的内容插入当前位置。
建立最小可用工作流
第一次配置 环境时,不必立即加入复杂字体、参考文献和绘图设置。更稳妥的做法是先确认终端能够运行 xelatex --version,编辑器能够以 UTF-8 编码保存 .tex 文件,并且下面的最小工作流可以正常完成:
编写 main.tex
↓
使用 xelatex 编译
↓
生成并查看 main.pdf
如果第一次编译失败,应先检查 TeX 发行版是否已经安装、编辑器是否选择了正确的构建方案、文件扩展名是否确实为 .tex、\begin{document} 与 \end{document} 是否完整,以及中文文档是否使用了 ctexart、ctexrep、ctexbook 或 ctex 宏包。在最小示例能够稳定编译之后,再逐步加入数学宏包、图片、参考文献、TikZ 绘图和自定义格式,会更容易定位后续问题。
一份可继续扩展的基础模板
下面这份模板适合包含中文、数学公式、图表、交叉引用和参考文献的普通文章。它保留了较常用的基础功能,但没有预先加载大量暂时用不到的宏包,便于在后续写作中继续扩展。
模板默认使用 xelatex 编译,并让 ctex 自动选择中文字体。这可以减少对本地特定字体的依赖,提高在不同计算机或在线环境中成功编译的概率。不过,不同系统实际选用的字体可能不同,因此最终版面未必完全一致。
主文件 main.tex
\documentclass[11pt,a4paper]{ctexart}
% 数学公式与符号
\usepackage{amsmath,amssymb,amsthm}
\usepackage{bm}
% 图片、表格与单位
\usepackage{graphicx}
\usepackage{booktabs}
\usepackage{siunitx}
% 超链接通常在大多数宏包之后加载
\usepackage[
colorlinks = true,
bookmarks = true,
linkcolor = blue,
citecolor = blue,
urlcolor = blue
]{hyperref}
% 正体微分符号
\newcommand{\dd}{\mathop{}\!\mathrm{d}}
\title{\LaTeX{} 基础模板}
\author{
Hua Chen\thanks{
Email: \href{mailto:hua@physchen.com}{hua@physchen.com}
}
}
\date{\today}
\begin{document}
\maketitle
\begin{abstract}
这里填写摘要。
\end{abstract}
\tableofcontents
\section{引言}
\label{sec:introduction}
这是正文。可以使用 \textbf{粗体}、\textit{斜体}
和行内原样文本 \verb|x = 1|。
文献引用写作~\cite{lamport1994}。
\section{一个公式示例}
\label{sec:equation-example}
爱因斯坦场方程为
\begin{equation}
R_{\mu\nu}
- \frac{1}{2}R g_{\mu\nu}
+ \Lambda g_{\mu\nu}
= \frac{8\pi G}{c^4}T_{\mu\nu}.
\label{eq:einstein}
\end{equation}
式~\eqref{eq:einstein} 中,
$g_{\mu\nu}$ 表示时空度规。
正体微分符号可以写作
\begin{equation}
\int_a^b f(x) \dd x.
\end{equation}
\section{一个表格示例}
\label{sec:table-example}
\begin{table}[htbp]
\centering
\caption{常用物理常量的示例数值}
\label{tab:constants}
\begin{tabular}{lll}
\toprule
物理量 & 符号 & 数值 \\
\midrule
真空光速
& $c$
& \qty{299792458}{\metre\per\second} \\
引力常数
& $G$
& \qty{6.67430e-11}
{\newton\metre\squared\per\kilogram\squared} \\
普朗克常数
& $h$
& \qty{6.62607015e-34}{\joule\second} \\
\bottomrule
\end{tabular}
\end{table}
表~\ref{tab:constants} 展示了表格、
单位排版和交叉引用的基本写法。
\bibliographystyle{unsrt}
\bibliography{refs}
\appendix
\section{附录}
\label{app:example}
这里填写附录内容。
\end{document}
文档类、编译器与字体
模板使用 \documentclass[11pt,a4paper]{ctexart}。其中,ctexart 是适用于中文文章的文档类,11pt 设置正文的基础字号,a4paper 将纸张尺寸设置为 A4。
ctexart 对应标准文档类 article。类似地,ctexrep 对应 report,适合较长报告和学位论文;ctexbook 对应 book,适合书籍和包含章结构的长文档。
| 中文文档类 | 对应的标准文档类 | 适用场景 |
|---|---|---|
ctexart | article | 短篇文章、作业、讲义和普通论文 |
ctexrep | report | 较长报告、学位论文 |
ctexbook | book | 书籍和包含章结构的长文档 |
模板主要面向 XeLaTeX 和 LuaLaTeX。pdfLaTeX 也可以在 ctex 的支持下排版中文,但它对 Unicode 字符和系统字体的直接支持不如 XeLaTeX、LuaLaTeX 灵活。若使用 fontspec 或手动设置系统字体,则必须使用 XeLaTeX 或 LuaLaTeX。
为了提高可移植性,基础模板让 ctex 自动选择字体。确实需要指定系统字体时,可以使用 fontset=none,再分别设置西文和中文字体:
\documentclass[
11pt,
a4paper,
fontset=none
]{ctexart}
\setmainfont{Palatino Linotype}
\setsansfont{Arial}
\setmonofont{Courier New}
\setCJKmainfont[
BoldFont = SimHei,
ItalicFont = KaiTi
]{SimSun}
以上示例只用于展示命令结构。字体名称需要根据操作系统中实际安装的字体调整,不应将其视为跨平台模板。这里将楷体指定为中文的 ItalicFont,表示在请求斜体字形时改用楷体;这是一种中文排版中的替代方案,并不意味着楷体是宋体的几何斜体。
如果字体不存在,可以改用当前系统已经安装的字体,删除 fontset=none 和手动字体设置以恢复 ctex 默认配置,或者使用 TeX 发行版通常附带的开放字体,例如 Fandol 字体。在在线编译环境中上传字体文件时,还需要确保具有相应的使用权限。如果文档需要在多台设备或持续集成环境中编译,字体应被视为项目依赖,而不是只在某一台电脑上“碰巧可用”的外观设置。
导言区与宏包
\documentclass 与 \begin{document} 之间的部分称为导言区,通常用于加载宏包、设置页面和字体、定义命令与环境,以及设置标题、作者和日期。
模板加载的宏包分别负责以下功能:
| 宏包 | 主要用途 |
|---|---|
amsmath | 提供公式环境、公式对齐和数学文本等功能 |
amssymb | 提供额外的数学符号 |
amsthm | 提供定理、定义、引理和证明环境的机制 |
bm | 加粗希腊字母和其他数学符号 |
graphicx | 插入和缩放图片 |
booktabs | 提供三线表命令 |
siunitx | 统一排版数值、单位和不确定度 |
hyperref | 创建超链接、PDF 书签和可点击的交叉引用 |
并不是每份文档都需要加载所有这些宏包。不使用定理环境时,可以删除 amsthm;不需要加粗数学符号时,可以删除 bm;不使用参考文献时,可以删除正文中的 \cite{}、\bibliographystyle{} 和 \bibliography{}。
宏包通常应集中放在导言区,并按照功能分组。这样在出现宏包冲突或编译错误时,更容易判断问题来自哪一部分。除非宏包文档另有要求,hyperref 一般放在大多数宏包之后加载。
标题、摘要、目录与章节结构
模板在导言区通过 \title{}、\author{} 和 \date{} 定义标题信息,并在正文开始后使用 \maketitle 生成标题:
\title{\LaTeX{} 基础模板}
\author{
Hua Chen\thanks{
Email: \href{mailto:hua@physchen.com}{hua@physchen.com}
}
}
\date{\today}
\begin{document}
\maketitle
\end{document}
\today 会根据当前语言和日期设置输出编译当天的日期。若需要固定日期,可以直接写成 \date{2026 年 7 月 14 日}。\thanks{} 则用于添加与作者信息关联的脚注,例如电子邮箱、单位说明或致谢信息。
摘要使用 abstract 环境,目录使用 \tableofcontents:
\begin{abstract}
这里填写摘要。
\end{abstract}
\tableofcontents
目录、章节编号和页码依赖辅助文件,通常需要至少编译两次才能完全更新。
常用的章节命令包括:
\section{一级标题}
\subsection{二级标题}
\subsubsection{三级标题}
不同文档类支持的最高层级不同。article 和 ctexart 没有 \chapter{};report、book、ctexrep 和 ctexbook 则支持章结构。
在源文件中留出一个空行即可开始新段落:
这是第一段。
这是第二段。
通常不应使用 \\ 代替段落,也不应通过堆叠空格、连续的 \\ 或大量手工空白命令来调整版面。
正文强调与原样文本
正文中常用的字体命令包括:
\textbf{粗体}
\textit{斜体}
\emph{强调}
\texttt{等宽字体}
\textsf{无衬线字体}
\textrm{衬线字体}
在一般写作中,表达语义上的强调时,通常优先使用 \emph{}。它会根据上下文选择合适的强调样式:在普通正文中通常表现为斜体,在已经是斜体的上下文中则可能恢复为正体。需要明确指定外观时,再使用 \textbf{} 或 \textit{}。
行内展示一小段原样文本时,可以使用 \verb:
\verb|x = 1|
\verb+x = 1+
\verb!x = 1!
\verb 后面的第一个字符会被用作定界符,因此定界符本身不能出现在需要展示的内容中。\verb 不能直接用于命令参数、章节标题、脚注和普通数学环境中。较长的代码块通常应使用 verbatim、listings 或 minted 等环境。
数学公式与数学符号
模板加载了 amsmath、amssymb、amsthm 和 bm。其中,amsmath 是数学文档中最常用的基础宏包之一。
行内公式可以使用 \(...\) 或 $...$:
\(E=mc^2\)
$E=mc^2$
在标准 文档中,两种写法都很常见。\(...\) 的定界范围更明确,而 $...$ 更简洁。
单个需要编号的行间公式通常使用 equation;不需要编号时,可以使用 equation* 或 \[...\]:
\begin{equation}
E = mc^2.
\label{eq:mass-energy}
\end{equation}
\[
E = mc^2.
\]
\begin{equation*}
E = mc^2.
\end{equation*}
在标准 文档中,应避免使用 Plain TeX 风格的 $$...$$。推荐使用 \[...\]、equation 或其他 amsmath 环境,以便正确处理间距、编号和文档级版式设置。
多行公式通常使用 align,并在需要对齐的位置放置 &:
\begin{align}
(a+b)^2 &= a^2 + 2ab + b^2, \\
(a-b)^2 &= a^2 - 2ab + b^2.
\end{align}
align 默认给每一行编号。若某一行不需要编号,可以在该行末尾使用 \notag 或 \nonumber;如果整组公式都不需要编号,可以在 \[...\] 中嵌套 aligned:
\[
\begin{aligned}
F &= ma, \\
p &= mv.
\end{aligned}
\]
单个公式通常使用 equation,不必为了一个对齐点使用 align。
公式也是句子的一部分。公式末尾是否使用逗号、句号或其他标点,应由整句话的语法结构决定。例如:
根据质能关系
\begin{equation}
E = mc^2,
\end{equation}
物体的静质量对应一定的静能量。
标点通常直接紧跟公式内容,不需要在标点前额外加入数学间距。
数学环境中常用的字体命令如下:
| 命令 | 典型用途 |
|---|---|
\mathrm{} | 数学模式中的罗马正体 |
\mathit{} | 数学斜体;普通变量通常无须显式指定 |
\mathbf{} | 将拉丁字母和数字排成加粗正体 |
\mathsf{} | 无衬线数学字体 |
\mathtt{} | 等宽数学字体 |
\mathcal{} | 大写拉丁字母的书法体 |
\mathbb{} | 黑板粗体,常用于数集 |
\mathbf{} 只适用于拉丁字母和数字,并会把字母排成正体,不适合作为本文的矢量记号。本文中的矢量、矩阵和张量统一使用 \boldsymbol{},它可以保留数学符号原有的字形,并适用于希腊字母;加载 bm 后,也可以使用功能更完整的 \bm{}。同一文档应始终遵守统一的符号约定。
模板还定义了正体微分符号:
\newcommand{\dd}{\mathop{}\!\mathrm{d}}
于是积分可以写成:
\int_a^b f(x) \dd x
在这个定义中,\mathop{} 创建一个空的数学运算符,使 TeX 在其左侧加入适当的运算符间距;\! 抵消空运算符右侧多出的细间距;\mathrm{d} 则输出正体字母 d。这样定义后,\dd 能够自动处理微分符号左侧的间距。
\dd 只负责输出微分符号及其左侧间距,积分变量仍需单独书写,因此通常写作:
\dd x
\dd t
\dd^4 x
而不是将变量作为 \dd 的参数写成 \dd{x}。若只将命令定义为 \newcommand{\dd}{\mathrm{d}},也能得到正体 d,但需要在积分中手动写成 \int f(x)\,\dd x。两种方案都可以采用,但应在全文中保持一致。
定理、定义与证明环境
模板加载了 amsthm,但加载宏包后,并不会自动出现名为 theorem、definition 或 lemma 的环境。需要在导言区通过 \newtheorem 创建具体环境:
\newtheorem{theorem}{定理}[section]
\newtheorem{lemma}[theorem]{引理}
\theoremstyle{definition}
\newtheorem{definition}[theorem]{定义}
\theoremstyle{remark}
\newtheorem*{remark}{注}
\newtheorem{theorem}{定理}[section] 创建名为 theorem 的环境,显示名称为“定理”,并按章节编号。例如,第 2 节中的第一个定理可能编号为“定理 2.1”。\newtheorem{lemma}[theorem]{引理} 则使引理与定理共用同一套计数器。
定义完成后,可以在正文中写:
\begin{theorem}
设函数 $f$ 在闭区间 $[a,b]$ 上连续,
则 $f$ 在该区间上有界。
\end{theorem}
\begin{proof}
这里填写证明。
\end{proof}
带星号的 \newtheorem*{remark}{注} 创建不编号的环境。amsthm 提供 plain、definition 和 remark 三种常用样式,分别适合定理与引理、定义与例题,以及注释与说明。不需要定理、定义和证明环境时,可以从基础模板中删除 amsthm。
数值与单位
模板使用 siunitx 统一处理数值和单位:
\usepackage{siunitx}
基本用法为:
\qty{299792458}{\metre\per\second}
其中,第一个参数是数值,第二个参数是单位。与手动写作相比,siunitx 可以统一处理数值与单位之间的间距、科学计数法、单位字体、复合单位、不确定度和表格中的数值对齐。
\qty{3.00e8}{\metre\per\second}
\qty{6.67430e-11}
{\newton\metre\squared\per\kilogram\squared}
\qty{9.81}{\metre\per\second\squared}
\num{6.02214076e23}
\unit{\joule\per\kelvin}
\qty{1.234(5)}{\metre}
\qty{} 同时排版数值和单位,\num{} 只排版数值,\unit{} 只排版单位。数值带不确定度时,可以使用类似 \qty{1.234(5)}{\metre} 的写法。具体输出形式还可以通过 \sisetup{} 在导言区统一设置。
在部分 Markdown 编辑器、MathJax 或 KaTeX 环境中,也可能支持:
\pu{3.00e8 m s-1}
在标准 LaTeX 文档中,\pu{} 由 mhchem 宏包提供:
\usepackage[version=4]{mhchem}
\pu{3.00e8 m s-1}
\ce{H2O}
\ce{2H2 + O2 -> 2H2O}
mhchem 同时提供化学式和化学方程式命令 \ce{}。Markdown、MathJax 或 KaTeX 是否能够使用 \pu{} 和 \ce{},取决于编辑器是否启用了相应扩展,不能仅根据标准 LaTeX 中的支持情况判断。若主要目标是规范排版物理量和单位,标准 LaTeX 文档通常优先使用 siunitx 的 \qty{}、\num{} 和 \unit{}。
图片与 TikZ
模板已经加载 graphicx,因此可以直接插入项目中的图片:
\begin{figure}[htbp]
\centering
\includegraphics[
width=0.8\textwidth
]{figures/example.pdf}
\caption{示例图片}
\label{fig:example}
\end{figure}
引用时写作:
图~\ref{fig:example}
常用尺寸参数包括 width=\textwidth、width=0.8\textwidth、height=5cm 和 scale=0.5。通常只指定宽度或高度中的一个,以保持图片原始宽高比;若同时指定宽度和高度,可能会使图片发生变形。
figure 是浮动环境。参数 [htbp] 表示允许 尝试将浮动体放在接近源代码位置、页顶、页底或单独的浮动页。这只是位置建议,不是强制定位命令。
\label{} 通常应写在 \caption{} 之后,因为图片或表格的编号通常由 \caption{} 更新:
\caption{示例图片}
\label{fig:example}
基础模板没有默认加载 TikZ。确实需要绘制数学图形或物理示意图时,可以在导言区加入:
\usepackage{tikz}
\usetikzlibrary{calc}
其他 TikZ 库应根据实际需要加载,不必一次加入大量暂时用不到的功能。
表格与 booktabs
tabular 环境负责表格本身的行列结构,外层的 table 环境则提供浮动、标题和交叉引用功能。模板加载 booktabs,从而可以使用 \toprule、\midrule 和 \bottomrule 绘制三线表。
\begin{table}[htbp]
\centering
\caption{参数取值}
\label{tab:parameters}
\begin{tabular}{ccc}
\toprule
参数 & 符号 & 数值 \\
\midrule
真空光速
& $c$
& \qty{2.99792458e8}{\metre\per\second} \\
引力常数
& $G$
& \qty{6.67430e-11}
{\newton\metre\squared\per\kilogram\squared} \\
\bottomrule
\end{tabular}
\end{table}
列格式 {ccc} 表示三列内容均居中。常见的列格式如下:
| 格式 | 含义 |
|---|---|
l | 左对齐 |
c | 居中 |
r | 右对齐 |
p{4cm} | 固定宽度并允许自动换行 |
科技文档中的表格通常不需要大量竖线。利用列对齐、适当留白和三线表结构,往往比完整网格更易读。
编号与交叉引用
模板通过 \label{} 为章节、公式和表格设置标签,再通过 \ref{} 或相应的专用命令进行引用:
\section{引言}
\label{sec:introduction}
\begin{equation}
E = mc^2
\label{eq:mass-energy}
\end{equation}
见第~\ref{sec:introduction}~节
和式~\eqref{eq:mass-energy}。
建议为标签使用统一前缀:
| 对象 | 推荐前缀 | 示例 |
|---|---|---|
| 公式 | eq: | eq:mass-energy |
| 图片 | fig: | fig:spacetime |
| 表格 | tab: | tab:constants |
| 章节 | sec: | sec:introduction |
| 附录 | app: | app:derivation |
| 定理 | thm: | thm:noether |
标签名称主要用于源代码管理,不会直接出现在输出文档中。标签应简洁、稳定,并能够说明对象含义。
目录、编号和交叉引用通常需要至少编译两次才能更新。如果 PDF 中出现 ??,应先重新编译,再检查 \label{} 与 \ref{} 的名称是否一致、是否存在重复标签、标签是否放在正确位置,以及辅助文件是否已正确更新。
波浪号 ~ 表示不可断行空格,因此 图~\ref{fig:example} 可以避免“图”和编号被分到两行。
超链接与 PDF 书签
模板通过以下方式加载 hyperref:
\usepackage[
colorlinks = true,
bookmarks = true,
linkcolor = blue,
citecolor = blue,
urlcolor = blue
]{hyperref}
colorlinks=true 使用彩色文本显示链接,而不是彩色边框;bookmarks=true 生成 PDF 书签;linkcolor、citecolor 和 urlcolor 分别设置内部交叉引用、文献引用和网址的颜色。
加载 hyperref 后,可以使用:
\href{https://physchen.com}{陈华的个人主页}
\href{mailto:hua@physchen.com}
{hua@physchen.com}
\url{https://physchen.com}
章节、公式、图表和参考文献的内部引用也会自动变成可点击链接。若不希望链接显示为彩色,可以使用:
\usepackage[hidelinks]{hyperref}
章节标题可以包含数学公式:
\section{质能方程:$E=mc^2$}
但是加载 hyperref 后,复杂数学命令未必能够直接写入 PDF 书签。此时可以分别提供排版标题和纯文本书签:
\section{
质能方程:
\texorpdfstring{$E=mc^2$}{E = mc^2}
}
\texorpdfstring{LaTeX 排版内容}{PDF 书签文本} 的第一个参数用于正文排版,第二个参数则用于 PDF 书签。
参考文献与编译流程
模板正文中使用了 \cite{lamport1994},因此还需要在 main.tex 所在目录创建 refs.bib,并写入对应的参考文献条目:
@book{lamport1994,
author = {Leslie Lamport},
title = {LaTeX: A Document Preparation System},
edition = {2},
publisher = {Addison-Wesley},
year = {1994}
}
模板文末使用:
\bibliographystyle{unsrt}
\bibliography{refs}
其中,unsrt 表示参考文献按照正文中的引用顺序排列;refs 对应当前目录下的 refs.bib,不需要写扩展名。
一个简单的期刊论文条目为:
@article{einstein1905,
author = {Albert Einstein},
title = {Zur Elektrodynamik bewegter K{\"o}rper},
journal = {Annalen der Physik},
year = {1905},
volume = {322},
number = {10},
pages = {891--921}
}
正文中可以写:
文献~\cite{einstein1905}
使用传统 BibTeX 工作流时,可以按照以下顺序编译:
xelatex main.tex
bibtex main
xelatex main.tex
xelatex main.tex
更方便的方式是使用:
latexmk -xelatex main.tex
latexmk 通常会根据辅助文件自动调用 BibTeX,并完成所需的多轮编译。
新文档也可以使用 biblatex 与 Biber。它们提供更灵活的参考文献管理能力,但配置方式和编译流程与传统 BibTeX 不同,不应将两套写法直接混用。
参考文献和附录的先后顺序应服从学校、期刊或出版社的格式要求。本文基础模板采用“正文—参考文献—附录”的顺序。
附录
模板使用 \appendix 将后续章节切换为附录,之后仍然使用普通章节命令:
\appendix
\section{补充推导}
\label{app:derivation}
对于 article 或 ctexart,附录通常使用字母编号,例如“A”“B”等;对于 book、report、ctexbook 或 ctexrep,则通常以章为单位组织附录。
\appendix 本身不是包围内容的环境,因此不需要对应的结束命令。
多行公式跨页
对于包含较长推导的文档,可以在导言区加入:
\allowdisplaybreaks
它允许 align、gather 等多行公式环境在必要时跨页。公式较少或推导较短的普通文章通常不需要默认启用。
若需要控制允许跨页的程度,可以写成:
\allowdisplaybreaks[1]
可选参数的取值范围为 1 到 4。数值越大, 越倾向于允许显示公式跨页;不提供可选参数时,相当于使用最高等级。
若希望在某个具体换行位置允许分页,可以将 \displaybreak 放在对应的 \\ 之前:
\begin{align}
A &= B + C
\displaybreak\\
D &= E + F.
\end{align}
\displaybreak 也可以接受 0 到 4 的可选参数,用于调节该位置允许分页的倾向。
模板的扩展原则
这份模板适合作为写作起点,而不是固定不变的最终配置。随着文档需求增加,可以逐步加入 TikZ 绘图、代码高亮、复杂表格、定理环境、biblatex 参考文献方案、页面布局设置,以及新的自定义命令和环境;不再需要的宏包也应及时删除。
较稳妥的扩展方式是每次只增加一项功能,添加宏包或设置后立即编译,确认当前文档仍能正常生成,再继续加入下一项配置。这样一旦出现宏包冲突或编译错误,更容易判断问题来自哪里。
文本排版补充
这一节补充基础模板中没有直接展示的常用文本结构和排版符号。
列表
无序列表使用 itemize,有序列表使用 enumerate,带有说明性标签的列表则可以使用 description:
\begin{itemize}
\item 第一项
\item 第二项
\end{itemize}
\begin{enumerate}
\item 第一步
\item 第二步
\end{enumerate}
\begin{description}
\item[位置] 描述物体所在的空间位置。
\item[速度] 描述位置随时间的变化率。
\item[加速度] 描述速度随时间的变化率。
\end{description}
列表可以嵌套,但层级不宜过深。若需要系统调整列表间距、编号格式和标签,可以使用 enumitem 宏包。
注释与特殊字符
百分号 % 后直到行末的内容都是注释:
这是正文。 % 这是注释
注释不会出现在最终文档中。百分号还会忽略当前源代码行末的换行,因此有时可以用于防止命令定义或分行书写产生不需要的空格。
以下字符在 中具有特殊含义:
# $ % & _ { } ~ ^ \
在文本模式中,常见输入方式如下:
| 字符 | 输入方式 | 字符 | 输入方式 |
|---|---|---|---|
# | \# | $ | \$ |
% | \% | & | \& |
_ | \_ | {、} | \{、\} |
~ | \textasciitilde{} | ^ | \textasciicircum{} |
\ | \textbackslash{} |
在数学环境中,_ 和 ^ 分别表示下标和上标,而不是普通字符。
空格与不可断行
会合并源文件中连续的普通空格。例如:
This is a sentence.
其输出效果通常与只输入一个空格相同。在源文件中换行一次,通常也只相当于一个普通空格;只有空行才表示新段落。
波浪号 ~ 表示不可断行空格,适合将名称与编号保持在同一行:
图~\ref{fig:example}
表~\ref{tab:example}
式~\eqref{eq:example}
文献~\cite{example}
第~1~章
若要显示可见的 ASCII 波浪号,应使用 \textasciitilde{},而不是直接输入 ~。反斜杠加普通空格 \ 可以显式插入一个普通词间空格,但在大多数正文中并不需要手动使用。
引号、短横线与省略号
传统英文单引号和双引号分别写作:
`single quotation'
``double quotation''
左侧使用反引号,右侧使用单引号。中文文档通常可以直接输入中文引号:
“中文双引号”
‘中文单引号’
需要自动处理多语言引号时,可以使用 csquotes 宏包。
英文排版中,不同数量的短横线具有不同含义:
| 输入 | 名称 | 典型用途 |
|---|---|---|
- | 连字符(hyphen) | well-known |
-- | 连接号(en dash) | 1--10 |
--- | 破折号(em dash) | text---text |
中文破折号通常直接输入“——”。英文正文中的省略号可以使用 \ldots,中文正文通常直接输入中文省略号“……”。数学环境中的省略号还包括 \cdots、\vdots 和 \ddots,分别适合不同的排列方向和数学语境。
常用数学语法补充
这一节补充基础模板中没有逐项展示的常用数学语法。
上下标、分数与根式
基本写法包括:
x^2
a_i
x_{i+1}
\frac{a+b}{c}
\sqrt{x}
\sqrt[n]{x}
分别表示 、、、、 和 。
当上下标包含多个字符时,必须使用花括号:
x^{n+1}
a_{ij}
例如,x^n+1 表示 ,而不是 ;a_ij 也不会得到完整的双字符下标。
\frac 会根据当前数学环境选择合适的大小。amsmath 还提供 \dfrac 和 \tfrac,分别强制使用展示样式和文本样式:
\dfrac{a}{b}
\tfrac{a}{b}
正文中通常优先使用 \frac。在行内公式中频繁使用 \dfrac 会增大行距。
定界符
当定界符需要随内部内容伸缩时,可以成对使用 \left 和 \right:
\left(\frac{x}{y}\right)
\left[\frac{x}{y}\right]
\left\{\frac{x}{y}\right\}
若只显示一侧,可以使用句点表示不可见的定界符:
\left.V(\phi)\right|_{\phi=\phi_{\min}}
自动调整后的括号有时会显得过大。需要手动控制尺寸时,可以使用:
\bigl(x+y\bigr)
\Bigl(\frac{x}{y}\Bigr)
\biggl(\sum_{i=1}^n a_i\biggr)
\Biggl(\int_0^\infty f(x)\,\mathrm{d}x\Biggr)
其中的 l 和 r 分别表示左、右定界符,有助于得到正确的数学间距。
绝对值和范数可以写成:
\lvert x\rvert
\lVert \bm{x}\rVert
相比直接使用键盘字符 |,\lvert、\rvert、\lVert 和 \rVert 能够提供更明确的定界符语义。
数学公式中的文本、标签与条件
数学环境中的普通文字或说明性短语应使用 \text{}:
x =
\begin{cases}
1, & \text{if } x > 0, \\
0, & \text{otherwise}.
\end{cases}
\text{} 由 amsmath 提供,会使用正文文本字体,并允许在数学公式中插入普通语言文字。
物理符号中的正体标签、缩写或约定名称常使用 \mathrm{}:
F_{\mathrm{b}}
=
\rho_{\mathrm{fluid}}
V_{\mathrm{disp}}g
这里的 b、fluid 和 disp 是物理量的标签,而不是彼此相乘的变量。一般而言,\text{} 用于普通语言文字,\mathrm{} 则用于数学符号中的正体字母或标签。
标准运算符与自定义运算符
具有固定数学含义的标准运算符应使用对应命令:
\sin x
\cos x
\tan x
\ln x
\exp x
\min f(x)
\max f(x)
\det A
不要直接写成 sin x 或 ln x,否则字母会被当作多个变量逐个排版,字体和间距都不正确。
只使用一次的自定义运算符可以写成:
\operatorname{rank} A
若某个运算符会反复使用,应在导言区通过 \DeclareMathOperator 定义,具体方法将在下一节介绍。
数学间距
会自动处理大部分数学间距。确有需要时,可以使用以下命令:
| 命令 | 效果 |
|---|---|
\, | 小间距 |
\: | 中等间距 |
\; | 较大间距 |
\quad | 一个较大的水平间距 |
\qquad | 两个 \quad |
\! | 负间距 |
常见例子包括:
\int f(x)\,\mathrm{d}x
a \quad \text{and} \quad b
应尽量避免为了视觉对齐而堆叠大量间距命令。若多个公式需要对齐,应优先使用 align、aligned、cases、matrix 等结构化环境。
自定义命令与项目扩展技巧
当某个符号、格式或结构会在文档中反复出现时,可以在导言区定义自定义命令。这样既能减少重复代码,也能使源文件表达更明确的语义。例如,如果全文都通过同一个命令表示向量,那么以后需要修改向量样式时,只需修改一处定义,而不必逐个修改正文。
\newcommand 的基本语法
最基本的语法为:
\newcommand{\命令名}{定义内容}
例如:
\newcommand{\RR}{\mathbb{R}}
正文中写 $x\in\RR$ 即可得到实数集符号。命令名应选择具有明确含义且不容易与已有命令冲突的形式。过短的命令虽然输入方便,但更容易覆盖文档类或宏包已经定义的命令。
定义无参数命令时,也可以显式写出参数个数为零:
\newcommand{\RR}[0]{\mathbb{R}}
不过 [0] 通常可以省略。
定义带参数的命令
命令最多可以接收九个参数,基本语法为:
\newcommand{\命令名}[参数个数]{定义内容}
参数在定义中依次用 #1、#2、#3 等表示。例如,可以定义向量和内积命令:
\newcommand{\vect}[1]{\bm{#1}}
\newcommand{\inner}[2]{
\left\langle #1,#2 \right\rangle
}
正文中写:
\vect{x}
\vect{p}
\vect{\alpha}
\inner{\psi}{\phi}
分别相当于:
\bm{x}
\bm{p}
\bm{\alpha}
\left\langle \psi,\phi \right\rangle
在 \inner{\psi}{\phi} 中,#1 对应 \psi,#2 对应 \phi。较长的命令定义可以分行书写,但需要注意源代码中的换行和缩进有时会产生空格。复杂命令应通过实际编译结果确认其输出。
定义带可选参数的命令
\newcommand 可以为第一个参数设置默认值:
\newcommand
{\命令名}
[参数个数]
[第一个参数的默认值]
{定义内容}
例如,可以定义带默认下标的范数:
\newcommand{\norm}[2][2]{
\left\lVert #2 \right\rVert_{#1}
}
正文中写 \norm{x},相当于:
\left\lVert x \right\rVert_2
写成 \norm[\infty]{x},则得到无穷范数。
需要注意的是,\newcommand 只能为第一个参数提供默认值。如果需要更复杂的参数接口,可以使用现代 LaTeX 提供的 \NewDocumentCommand;不过,对于普通文档中的多数需求,\newcommand 已经足够。
\renewcommand 与 \providecommand
如果命令已经存在,再使用 \newcommand 定义同名命令会报错。这种保护机制可以防止无意中覆盖已有命令。确实需要重新定义已有命令时,可以使用:
\renewcommand{\命令名}{新定义}
例如:
\renewcommand{\contentsname}{目录}
修改文档类或宏包提供的命令之前,应先确认原命令的用途和参数结构。随意覆盖底层命令可能导致难以定位的问题。
\providecommand 的语法与 \newcommand 相似:
\providecommand{\RR}{\mathbb{R}}
它只在命令尚未定义时创建命令;若命令已经存在,则保持原定义不变,也不会报错。因此,在编写可能被复制到不同项目中的通用片段时,\providecommand 有时比 \newcommand 更稳妥。
| 命令 | 命令不存在时 | 命令已经存在时 |
|---|---|---|
\newcommand | 创建命令 | 报错 |
\renewcommand | 报错 | 重新定义 |
\providecommand | 创建命令 | 保持原定义 |
常用数学符号命令
除了微分符号,还可以根据全文的符号约定定义其他高频命令:
\newcommand{\ee}{\mathrm{e}}
\newcommand{\ii}{\mathrm{i}}
\newcommand{\RR}{\mathbb{R}}
\newcommand{\CC}{\mathbb{C}}
\newcommand{\vect}[1]{\bm{#1}}
于是可以写:
\ee^{\ii kx}
x\in\RR
\vect{p}
自定义命令应尽量表达语义,而不只是保存某种外观。例如,\vect{p} 表示“向量 ”,比直接在全文反复书写 \bm{p} 更能体现符号用途。不过,如果某项内容只出现一两次,则未必值得单独定义命令。
使用 \DeclareMathOperator 定义运算符
反复使用的数学运算符不应通过普通文本或简单的 \mathrm{} 模拟。加载 amsmath 后,可以在导言区使用:
\DeclareMathOperator{\rank}{rank}
\DeclareMathOperator{\Tr}{Tr}
\DeclareMathOperator{\diag}{diag}
正文中可以写:
\rank A
\Tr(\rho)
\diag(a_1,\ldots,a_n)
\DeclareMathOperator 会自动使用正体字体,并按照数学运算符规则处理左右间距。
需要像 \lim 一样允许上下限出现在运算符正下方时,可以使用带星号的形式:
\DeclareMathOperator*{\argmin}{arg\,min}
\DeclareMathOperator*{\argmax}{arg\,max}
然后写:
\argmin_{x\in X} f(x)
在展示公式中,下标可以出现在运算符下方。
使用 mathtools 定义成对定界符
若文档中频繁使用绝对值、范数、期望值或内积,可以加载:
\usepackage{mathtools}
然后定义:
\DeclarePairedDelimiter{\abs}
{\lvert}{\rvert}
\DeclarePairedDelimiter{\norm}
{\lVert}{\rVert}
\DeclarePairedDelimiter{\avg}
{\langle}{\rangle}
正文中可以写:
\abs{x}
\norm{\vect{x}}
\avg{A}
带星号的形式会自动调整定界符大小:
\abs*{\frac{x}{y}}
也可以手动指定尺寸:
\abs[\Big]{\frac{x}{y}}
这种方式通常比直接将 \left 和 \right 写入普通 \newcommand 更灵活,因为它同时保留了固定尺寸、自动尺寸和手动尺寸三种选择。
使用 \newenvironment 定义环境
除了命令,还可以通过 \newenvironment 定义新的环境:
\newenvironment
{环境名}
{开始部分}
{结束部分}
例如,可以定义一个简单的重点提示环境:
\newenvironment{important}
{\begin{quote}\bfseries}
{\end{quote}}
正文中使用:
\begin{important}
这一结论只适用于惯性参考系。
\end{important}
环境开始时执行 \begin{quote}\bfseries,结束时执行 \end{quote}。如果需要带参数的环境,可以写成:
\newenvironment{namednote}[1]
{\begin{quote}
\textbf{#1}\par}
{\end{quote}}
正文中使用:
\begin{namednote}{注意}
这里填写提示内容。
\end{namednote}
复杂的提示框、颜色框和可分页环境通常更适合使用 tcolorbox、mdframed 等专用宏包,而不是完全依靠 \newenvironment 手工实现。
集中管理全局设置
许多宏包都提供了统一设置接口。与其在正文中反复指定格式,不如将全局规则集中放在导言区。
加载 siunitx 后,可以使用:
\sisetup{
per-mode = symbol,
exponent-product = \times,
uncertainty-mode = separate
}
统一设置全文的数值和单位格式。这样当期刊、学校或个人格式要求发生变化时,只需修改导言区的一处设置,而不必逐个修改正文中的数值。
hyperref 也可以先单独加载,再通过 \hypersetup 集中管理链接样式和 PDF 元数据:
\usepackage{hyperref}
\hypersetup{
colorlinks = true,
bookmarks = true,
linkcolor = blue,
citecolor = blue,
urlcolor = blue,
pdftitle = {文档标题},
pdfauthor = {Hua Chen}
}
如果项目中的图片统一存放在 figures/ 目录,还可以使用:
\graphicspath{{figures/}}
之后便可以将 \includegraphics{figures/example.pdf} 简化为 \includegraphics{example.pdf}。多个图片目录可以写成:
\graphicspath{
{figures/}
{images/}
{plots/}
}
每个路径都需要单独放在一组花括号中,并通常以 / 结尾。
使用 \input、\include 和 \includeonly
较长文档可以拆分为多个源文件。\input 会将目标文件的内容直接插入当前位置:
\input{sections/introduction}
通常不需要写 .tex 扩展名。\input 适合插入章节、表格、公式推导、TikZ 图形和重复使用的配置片段。
\include 更适合按章拆分长文档:
\include{chapters/introduction}
\include 通常会在前后分页,并为每个文件生成独立的辅助文件,因此不适合插入很短的局部内容。
使用 \includeonly 可以只编译指定章节,同时尽量保留其他章节的编号和交叉引用信息:
\includeonly{
chapters/introduction,
chapters/results
}
\includeonly 只控制通过 \include 引入的文件,不影响 \input。一般而言,局部内容和短文件使用 \input,书籍或论文的完整章使用 \include,需要选择性编译章时再配合 \includeonly。
设置编号方式和目录深度
加载 amsmath 后,可以让公式按章节编号:
\numberwithin{equation}{section}
公式编号将从 (1)、(2)、(3) 变为类似 (1.1)、(1.2)、(2.1) 的形式。
目录显示深度可以通过:
\setcounter{tocdepth}{2}
进行设置。对于 article 和 ctexart,常见层级为:
| 数值 | 层级 |
|---|---|
0 | section |
1 | subsection |
2 | subsubsection |
对于 book 和 report 类文档,层级编号会因为存在 chapter 而有所不同。
章节编号深度可以使用:
\setcounter{secnumdepth}{2}
这表示编号到 \subsubsection 层级。目录深度和编号深度是两个独立设置:前者控制哪些层级出现在目录中,后者控制哪些层级显示编号。
使用分组限制设置范围
花括号可以形成局部分组,使字体、字号或对齐设置只在特定范围内生效:
{
\small
这段文字使用较小字号。
}
{
\centering
局部居中的内容\par
}
分组结束后,设置会自动恢复。许多环境本身也会形成分组,因此在环境内部修改字体、颜色或长度时,设置通常不会影响环境外部。相比在后文手动恢复设置,利用分组限制作用范围通常更安全。
自定义命令的维护原则
自定义命令虽然方便,但过度使用也会降低源文件的可读性和可移植性。较稳妥的做法是优先定义具有明确语义、会在全文反复使用的命令,避免为了缩短少量输入而创建大量晦涩缩写。
命令名应尽量避免覆盖已有命令。自定义命令可以集中放在 main.tex 的导言区,也可以在项目扩大后拆分到单独文件:
\input{preamble/commands}
命令定义中不应加入不必要的固定空格。数学间距应尽量由符号语义和数学原子类型决定,而不是依赖大量手工空格。修改某个公共命令的参数或输出形式后,还应重新编译并检查全文,因为一个命令可能已经在许多位置被使用。
常见问题排查
从第一条关键错误开始
编译日志中可能同时出现大量错误,但后面的错误往往只是第一个错误引发的连锁反应。排查时应优先寻找第一条真正的错误信息,并检查花括号、数学定界符以及 \begin、\end 是否成对,命令是否拼写正确,所需宏包是否已经加载,是否直接输入了 %、_、& 等特殊字符,以及当前编译器是否符合文档类和字体配置要求。
一次只撤销或修改一个可疑位置,比同时改动多项设置更容易定位问题。
错误:
Undefined control sequence
通常表示 不认识某个命令。常见原因包括命令拼写错误、忘记加载提供该命令的宏包、自定义命令尚未定义、定义命令的文件没有被正确 \input,或者当前编译方式不支持所使用的命令。
例如,使用:
\qty{3}{\metre}
之前需要加载 siunitx;使用:
\bm{\alpha}
之前需要加载 bm。
若使用 \newcommand{\RR}{...} 时出现命令已经定义的错误,说明该命令已经由文档类、宏包或其他配置定义。应先确认原命令的用途,再考虑更换命令名称、使用 \renewcommand 明确覆盖,或者在通用片段中使用 \providecommand。不建议为了消除错误而盲目将所有 \newcommand 改成 \renewcommand。
目录、编号和参考文献没有更新
交叉引用、目录和参考文献列表依赖辅助文件,通常需要多轮编译。若引用显示为 ??,应先确认 \label{eq:example} 与 \ref{eq:example} 的名称完全一致,然后再次编译,或者直接使用:
latexmk -xelatex main.tex
目录内容保存在 .toc 文件中。新增、删除或修改章节标题后,通常也需要再次编译。如果目录或引用长期不更新,可以清理辅助文件后重新构建:
latexmk -c
latexmk -xelatex main.tex
也可以手动删除 .aux、.toc、.out 等辅助文件后重新编译。若同时删除 .bbl 文件,还需要重新运行 BibTeX 或 Biber;使用 latexmk 时通常可由其自动完成。
图片位置或文件路径异常
figure 和 table 是浮动环境, 会综合当前页剩余空间、浮动体尺寸和浮动规则决定实际位置。图片没有出现在源代码所在位置,并不一定表示排版错误。可以先检查图片是否过大、[htbp] 是否提供了足够的位置选择、当前页面是否有足够空间,以及是否连续放置了过多浮动体。
应避免一开始就使用大量强制定位命令破坏分页。确有严格定位需求时,可以研究 float 宏包提供的 [H] 参数,但它应谨慎使用。
如果编译器无法找到图片,应检查文件路径、文件名大小写、图片是否已经复制到项目目录、\graphicspath 是否设置正确,以及当前编译环境是否支持相应图片格式。例如:
\includegraphics{figures/example.pdf}
要求项目中实际存在:
figures/example.pdf
Windows 文件系统通常不严格区分大小写,但 Linux 和许多在线编译环境会区分。因此,Example.pdf 与 example.pdf 可能被视为两个不同文件。
字体与中文编译问题
如果出现与 fontspec 或字体名称有关的错误,应检查当前是否使用 XeLaTeX 或 LuaLaTeX、字体是否已经安装、字体名称是否与系统识别名称一致,以及在线编译环境中是否存在该字体。字体文件名不一定等于 fontspec 使用的字体族名称,必要时可以通过操作系统字体管理工具或 fc-list 等命令检查字体信息。
如果中文无法正常显示,可以依次检查源文件是否使用 UTF-8 编码,是否使用 ctexart、ctexrep、ctexbook 或加载了 ctex,是否使用 XeLaTeX 或 LuaLaTeX,手动指定的中文字体是否存在,以及编辑器是否实际调用了预期的编译命令。
对于初学者,最稳妥的中文文档开头通常是:
\documentclass{ctexart}
并使用:
xelatex main.tex
进行编译。
跨设备编译与旧结果问题
模板在另一台电脑上不能编译,通常是因为缺少字体、图片、.bib 文件、拆分后的 .tex 文件或宏包,也可能是编译器、TeX 发行版版本或文件名大小写不同。
一个可移植的项目至少应包含全部 .tex 源文件、图片和绘图资源、.bib 文件、项目级编辑器配置,以及对编译方式和额外字体依赖的说明。如果项目使用 Git,还应合理配置 .gitignore。通常可以忽略 .aux、.log、.out、.toc 等可重新生成的辅助文件,但不应忽略源文件、图片和参考文献数据库。
如果修改源文件后仍然显示旧结果,可能是编辑器没有保存文件、编译了另一个同名文件、主文件设置错误、PDF 预览没有刷新、辅助文件仍保留旧状态,或者编译在中途失败,旧 PDF 没有被覆盖。可以检查终端中的实际编译路径和日志,并尝试:
latexmk -C
latexmk -xelatex main.tex
需要注意,latexmk -C 会同时删除生成的 PDF,因此应确保源文件和资源文件已经妥善保存。
写在最后
第一次接触 ,不需要把本文所有命令都记下来。先形成以下习惯,已经足以应付大多数入门写作:
- 中文文档优先使用 XeLaTeX 或 LuaLaTeX;
- 从精简模板开始,只加载实际需要的宏包;
- 用结构命令表达章节、列表、图表和公式,不用空格硬调版面;
- 给公式、图片、表格和章节设置有规律的标签;
- 将公式视为句子的一部分,注意文字、正体符号和标点;
- 将重复出现的符号和格式定义为语义明确的命令;
- 遇到问题时先阅读第一条关键错误信息,再检查最近的改动;
- 不确定命令时可以借助 AI,但仍应通过编译结果和宏包文档进行验证。
这篇文章既是一份 入门说明,也是一篇日常速查笔记:忘记某个命令时可以迅速定位,需要新功能时也能判断应将其加入基础模板、正文结构还是项目级配置。
对于初学者,只要能够从基础模板出发,独立完成一份包含中文、公式、图表、交叉引用和参考文献的文档,就已经建立了继续学习和维护更复杂项目所需的基础。