01_LaTeX的基本概念

LATEX 的基本概念

本文主体内容来自一份 (不太) 简短的 LATEX2ε 介绍

欢迎使用 LATEX!本文开头介绍了LATEX的来源,然后介绍了LATEX源代码的写法,编译LATEX源代码生成文档的方法,以及理解接下来的章节的一些必要知识。

概述

TEX

TEX 是高德纳 (Donald E.~Knuth) 为排版文字和数学公式而开发的软件。1977 年,正在编写《计算机程序设计艺术》的高德纳意识到每况愈下的排版质量将影响其著作的发行,为扭转这种状况,他着手开发 TEX,发掘当时刚刚用于出版工业的数字印刷设备的潜力。1982 年,高德纳发布 TEX 排版引擎,而后在 1989 年又为更好地支持 8-bit 字符和多语言排版而予以改进。TEX 以其卓越的稳定性、跨平台能力和几乎没有 bug 的特性而著称。它的版本号不断趋近于 π,当前为 3.141592653。

LATEX

LATEX 是一种使用 TEX 程序作为排版引擎的格式,可以粗略地将它理解成是对 TEX 的一层封装。 LATEX 最初的设计目标是分离内容与格式,以便作者能够专注于内容创作而非版式设计,并能以此得到高质量排版的作品。LATEX 起初由 Leslie Lamport 博士开发,目前由 LATEX 工作组进行维护。

LATEX 的优缺点

LATEX 的一些优点:

  • 具有专业的排版输出能力,产生的文档看上去就像“印刷品”一样。
  • 具有方便而强大的数学公式排版能力,无出其右者。
  • 绝大多数时候,用户只需专注于一些组织文档结构的基础命令,无需(或很少)操心文档的版面设计。
  • 很容易生成复杂的专业排版元素,如脚注、交叉引用、参考文献、目录等。
  • 强大的可扩展性。世界各地的人开发了数以千计的 LATEX 宏包用于补充和扩展 LATEX 的功能。
  • 能够促使用户写出结构良好的文档——而这也是 LATEX 存在的初衷。
  • LATEXTEX 及相关软件是跨平台、免费、开源的。

LATEX 的缺点:

  • 入门门槛高。
  • 不容易排查错误。LATEX 作为一个依靠编写代码工作的排版工具,其使用的宏语言比 C++ 或 Python 等语言在错误排查方面困难得多。它虽然能够提示错误,但不提供调试的机制,有时错误提示还很难理解。
  • 不容易定制样式。LATEX 提供了一个基本上良好的样式,为了让用户不去关注样式而专注于文档结构。但如果想要改进 LATEX 生成的文档样式则是十分困难的。
  • 相比“所见即所得”的模式有一些不便,为了查看生成文档的效果,用户总要不停地编译。

Hello, World!

\documentclass{article}
\begin{document}
``Hello world!'' from \LaTeX.
\end{document}

这里首先介绍如何编译使用这份源代码,在后续小节中再介绍源代码的细节。你可以将这份源代码保存为helloworld.tex,而后编译。具体来说:

  • 如果使用TeXworks 或TeXstudio 等编辑器,可以使用编辑器提供的“编译”或“排版”按钮。建议使用 pdfLaTeX 或 XeLaTeX 作为默认的编译方式。

  • 如果使用命令行方式进行编译,打开终端,在源代码所在的目录下输入:

    pdflatex helloworld
    

    或者

    xelatex helloworld
    

    如果编译成功,可以在helloworld.tex 所在目录看到生成的helloworld.pdf 以及一些其它文件。

    下面是排版中文的一个最简示例。编译的方式与上一份源代码相同,但需使用 XeLaTeX编译方式。

\documentclass{ctexart}
\begin{document}
“你好,世界!”来自\LaTeX{} 的问候。
\end{document}

LATEX 命令和代码结构

LATEX 的源代码为文本文件。这些文本除了文字本身,还包括各种命令,用在排版公式、划分文档结构、控制样式等等不同的地方。

LATEX 命令和环境

LATEX 中命令以反斜线 \ 开头,为以下两种形式之一:

  • 反斜线和后面的一串字母,如 \{LaTeX}。它们以任意非字母符号(空格、数字、标点等)为界限。

  • 反斜线和后面的单个非字母符号,如 \$

注意 LATEX 命令对大小写敏感,比如输入 \{LaTeX} 命令可生成错落有致的 LATEX 字母组合,但输入 \{Latex}\{LaTex} 什么都得不到,还会报错。

字母形式的 LATEX 命令忽略其后的所有连续空格。如果要人为引入空格,需要在命令后面加一对花括号阻止其忽略空格:
image-20250113150429995

一些 LATEX 命令可以接收一些参数,参数的内容会影响命令的效果。LATEX 的参数分为可选参数和必选参数。可选参数以方括号 [ 和 ] 包裹;必选参数一般以花括号 { 和 } 包裹。还有些命令可以带一个星号 *,带星号和不带星号的命令效果有一定差异。初次接触这些概念时,可以粗略地把星号看作一种特殊的可选参数。

LATEX 中还包括环境,用以令一些效果在局部生效,或是生成特殊的文档元素。LATEX 环境的用法为一对命令 \begin\end

\begin{<environment name>}[<optional arguments>]{<mandatory arguments>}
...
\end{<environment name>}

有些命令(如 \bfseries)会对其后所有内容产生作用。若要限制其作用范围,则需要使用分组LATEX 使用一对花括号{ } 作为分组,在分组中使用的命令被限制在分组内,不会影响到分组外的内容。上文提到的 LATEX 环境隐含了一个分组,在环境中的命令被包裹在分组内。

LATEX 源代码结构

LATEX 源代码以一个 \{documentclass} 命令作为开头,它指定了文档使用的文档类document 环境当中的内容是文档正文。
\documentclass\begin{document} 之间的位置称为导言区
在导言区中常会使用 \{usepackage} 命令调用宏包,还会进行文档的全局设置。

\documentclass{...}  % ... 为某文档类
% 导言区
\begin{document}
% 正文内容
\end{document}
% 此后内容会被忽略

LATEX 宏包和文档类

文档类

文档类规定了 LATEX 源代码所要生成的文档的性质——普通文章、书籍、演示文稿、个人简历等。LATEX 源代码的开头须用\documentclass指定文档类:
\documentclass[<options>]{<class-name>}
其中为文档类的名称,如 LATEX 提供的 articlereportbook,在其基础上派生的一些文档类,如支持中文排版的 ctexartctexrepctexbook,或者有其它功能的文档类,如 moderncvbeamer 等。LATEX 提供的基础文档类见下表,其中前三个习惯上称为“标准文档类”。

article 文章格式的文档类,广泛用于科技论文、报告、说明文档等。
report 长篇报告格式的文档类,具有章节结构,用于综述、长篇论文、简单的书籍等。
book 书籍文档类,包含章节结构和前言、正文、后记等结构。
proc 基于article 文档类的一个简单的学术文档模板。
slides 幻灯格式的文档类,使用无衬线字体。
minimal 一个极其精简的文档类,只设定了纸张大小和基本字号,用作代码测试的最小工作示例。

可选参数 为文档类指定选项,以全局地规定一些排版的参数,如字号、纸张大小、单双面等等。比如调用 article 文档类排版文章,指定纸张为 A4 大小,基本字号为 11pt,双面排版:
\documentclass[11pt,twoside,a4paper]{article}

LATEX 的三个标准文档类可指定的选项包括:

10pt, 11pt, 12pt 指定文档的基本字号。默认为 10pt
a4paper,letterpaper,... 指定纸张大小,默认为美式信纸(8.5in×11in大约相当于 21.6cm×28.0cm)。可指定选项还包括 a5paperb5paperexecutivepaperlegalpaper
twoside, oneside 指定单面/双面排版。双面排版时,奇偶页的页眉页脚、页边距不同。articlereport 默认为 onesidebook 默认为 twoside
onecolumn, twocolumn 指定单栏/双栏排版。默认为 onecolumn
openright, openany 指定新的一章 chapter 是在奇数页(右侧)开始,还是直接紧跟着上一页开始。report 默认为 openanybook 默认为 openright。对 article 无效。
landscape 指定横向排版。默认为纵向。
titlepage, notitlepage 指定标题命令 \maketitle 是否生成单独的标题页。article默认为 notitlepagereportbook 默认为 titlepage
fleqn 令行间公式左对齐。默认为居中对齐。
leqno 将公式编号放在左边。默认为右边。
draft, final 指定草稿/终稿模式。草稿模式下,断行不良(溢出)的地方会在行尾添加一个黑色方块;插图、超链接等功能也会受这一组选项影响,具体见后文。默认为 final

宏包

在使用 LATEX 时,时常需要依赖一些扩展来增强或补充 LATEX 的功能,比如排版复杂的表格、插入图片、增加颜色甚至超链接等等。这些扩展称为宏包。调用宏包的方法非常类似调用文档类的方法:
\usepackage[<options>]{<package-name>}

\usepackage可以一次性调用多个宏包,在 <package-name> 中用逗号隔开。这种用法一般不要指定选项

% 一次性调用三个排版表格常用的宏包
\usepackage{tabularx, makecell, multirow}

在使用宏包和文档类之前,一定要首先确认它们是否安装在你的计算机中,否则 \usepackage等命令会报错误。

宏包(包括前面所说的文档类)可能定义了许多命令和环境,或者修改了 LATEX 已有的命令和环境。它们的用法说明记在相应宏包和文档类的帮助文档。在 Windows 命令提示符或者 Linux 终端下输入命令可查阅相应文档:

texdoc <pkg-name>

其中 <pkg-name}> 是宏包或者文档类的名称。

LATEX 用到的文件一览

除了源代码文件 .tex 以外,我们在使用 LATEX 时还可能接触到各种格式的文件。本节简单介绍一下经常见到的文件。

每个宏包和文档类都是带特定扩展名的文件,除此之外也有一些文件出现于 LATEX 模板中:

.sty 宏包文件。宏包的名称与文件名一致。
.cls 文档类文件。文档类名称与文件名一致。
.bib 参考文献数据库文件。
.bst 用到的参考文献格式模板。

在编译过程中可能会生成相当多的辅助文件和日志。一些功能如交叉引用、参考文献、目录、索引等,需要先通过编译生成辅助文件,然后再次编译时读入辅助文件得到正确的结果,所以复杂的源代码可能要编译多次。

.log 排版引擎生成的日志文件,供排查错误使用。
.aux 生成的主辅助文件,记录交叉引用、目录、参考文献的引用等。
.toc 生成的目录记录文件。
.lof 生成的图片目录记录文件。
.lot 生成的表格目录记录文件。
.bbl BibTeX生成的参考文献记录文件。
.blg BibTeX生成的日志文件。
.idx 生成的供 makeindex 处理的索引记录文件。
.ind makeindex 处理 .idx 生成的用于排版的格式化索引文件。
.ilg makeindex 生成的日志文件。
.out hyperref 宏包生成的 PDF 书签记录文件。

文件的组织方式

当编写长篇文档时,例如当编写书籍、毕业论文时,单个源文件会使修改、校对变得十分困难。将源文件分割成若干个文件,例如将每章内容单独写在一个文件中,会大大简化修改和校对的工作。
LATEX 提供了命令 \include 用来在源代码里插入文件:

\include{<filename>}

为文件名(不带 .tex 扩展名),如果和要编译的主文件不在一个目录中,则要加上相对或绝对路径,例如:

\include{chapters/file} % 相对路径
\include{/home/Bob/file} % *nix(包含 Linux、macOS)绝对路径
\include{D:/file} % Windows 绝对路径,用正斜线

值得注意的是 \include 在读入之前会另起一页。有的时候我们并不需要这样,而是用\input 命令,它纯粹是把文件里的内容插入

\input{<filename>}

当导言区内容较多时,常常将其单独放置在一个 .tex 文件中,再用 \input 命令插入。复杂的图、表、代码等也会用类似的手段处理。

LATEX 还提供了一个 \includeonly 命令来组织文件,用于导言区,指定只载入某些文件。导言区使用了 \{includeonly 后,正文中不在其列表范围的 \include 命令不会起效:

\includeonly{<filename1>,<filename2>,...}

需要注意的是,使用 \include\input 命令载入的文件名最好不要加空格和特殊字符,也尽量避免使用中文名,否则很可能会出错。

最后介绍一个实用的工具宏包syntonly。加载这个宏包后,在导言区使用 \syntaxonly 命令,可令编译后不生成 DVI 或者 PDF 文档,只排查错误,编译速度会快不少:

\usepackage{syntonly}
\syntaxonly

如果想生成文档,则用 % 注释掉 \syntaxonly 命令即可。

LATEXTEX 相关的术语和概念

在本章的最后有必要澄清几个概念:

  • 引擎 全称为排版引擎,是编译源代码并生成文档的程序,如 pdfTeX、XeTeX等 。有时也称为编译器
  • 格式 是定义了一组命令的代码集。LATEX 就是最广泛应用的一个格式,高德纳本人还编写了一个简单的 plain TeX 格式,没有定义诸如 \documentclass\section 等命令。
  • 编译命令 是实际调用的、结合了引擎和格式的命令。如 xelatex 命令是结合 XeTeX引擎和 LATEX 格式的一个编译命令。

常见的引擎、格式和编译命令的关系总结于下表。

文档格式 plain TeX 格式 LaTeX 格式
TeX 引擎 DVI tex N/A
pdfTeX 引擎 DVI etex latex
PDF pdftex pdflatex
XeTeX 引擎 PDF xetex xelatex
LuaTeX 引擎 PDF luatex lualatex

latex 编译命令和 LATEX 格式往往容易混淆,在讨论关于 LATEX 的时候需要明确。

在此介绍一下几个编译命令的基本特点:

latex 虽然名为 latex 命令,底层调用的引擎其实是 pdfTeX。 该命令生成 dvi格式的文档, 用 dvipdfmx 命令可以将其转为 pdf
pdflatex 底层调用的引擎也是 pdfTeX,可以直接生成 pdf 格式的文档。
xelatex 底层调用的引擎是 XeTeX,支持 UTF-8 编码和对 TrueType/OpenType 字体的调用。 当前较为方便的中文排版解决方案基于 xelatex
lualatex 底层调用的引擎是 LuaTeX。这个引擎在pdfTeX 引擎基础上发展而来,除了支持 UTF-8 编码和对 TrueType/OpenType 字体的调用外,还支持通过 Lua 语言扩展 TEX 的功能。 lualatex 编译命令下的中文排版支持需要借助 luatexja宏包。

参考文献

[1] Partl H, Hyna I, Schlegl E. 一份 (不太) 简短的 LATEX2ε 介绍[J]. 2024. https://github.com/CTeX-org/lshort-zh-cn



  1. https://www.latex-project.org ↩︎

  2. 以单个字符作为命令的参数时,可以不加括号。例如,在数学环境下,\frac12\frac{1\}\{2} 的效果是一样的。 ↩︎

  3. 个别命令在分组内仍然会产生全局作用,例如\setcounter 等命令。 ↩︎

  4. 使用多个宏包时指定选项,相当于给每个宏包指定同样的选项。如果有某个宏包不能识别指定的选项,则会出错。 ↩︎

  5. LATEX 2020-10-01 版本之后允许添加扩展名。 ↩︎

posted @   Invinc-Z  阅读(120)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
点击右上角即可分享
微信分享提示