01_LaTeX的基本概念
\(\LaTeX{}\) 的基本概念
本文主体内容来自一份 (不太) 简短的 LATEX2ε 介绍。
欢迎使用 \(\LaTeX{}\)!本文开头介绍了\(\LaTeX{}\)的来源,然后介绍了\(\LaTeX{}\)源代码的写法,编译\(\LaTeX{}\)源代码生成文档的方法,以及理解接下来的章节的一些必要知识。
概述
\(\TeX\)
\(\TeX{}\) 是高德纳 (Donald E.~Knuth) 为排版文字和数学公式而开发的软件。1977 年,正在编写《计算机程序设计艺术》的高德纳意识到每况愈下的排版质量将影响其著作的发行,为扭转这种状况,他着手开发 \(\TeX{}\),发掘当时刚刚用于出版工业的数字印刷设备的潜力。1982 年,高德纳发布 \(\TeX{}\) 排版引擎,而后在 1989 年又为更好地支持 8-bit 字符和多语言排版而予以改进。\(\TeX{}\) 以其卓越的稳定性、跨平台能力和几乎没有 bug 的特性而著称。它的版本号不断趋近于 \(\pi\),当前为 3.141592653。
\(\LaTeX{}\)
\(\LaTeX{}\) 是一种使用 $\TeX{} $ 程序作为排版引擎的格式,可以粗略地将它理解成是对 \(\TeX{}\) 的一层封装。 \(\LaTeX{}\) 最初的设计目标是分离内容与格式,以便作者能够专注于内容创作而非版式设计,并能以此得到高质量排版的作品。\(\LaTeX{}\) 起初由 Leslie Lamport 博士开发,目前由 \(\LaTeX{}\) 工作组[1]进行维护。
\(\LaTeX{}\) 的优缺点
\(\LaTeX{}\) 的一些优点:
- 具有专业的排版输出能力,产生的文档看上去就像“印刷品”一样。
- 具有方便而强大的数学公式排版能力,无出其右者。
- 绝大多数时候,用户只需专注于一些组织文档结构的基础命令,无需(或很少)操心文档的版面设计。
- 很容易生成复杂的专业排版元素,如脚注、交叉引用、参考文献、目录等。
- 强大的可扩展性。世界各地的人开发了数以千计的 \(\LaTeX{}\) 宏包用于补充和扩展 \(\LaTeX{}\) 的功能。
- 能够促使用户写出结构良好的文档——而这也是 \(\LaTeX{}\) 存在的初衷。
- \(\LaTeX{}\) 和 \(\TeX{}\) 及相关软件是跨平台、免费、开源的。
\(\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{}\) 命令忽略其后的所有连续空格。如果要人为引入空格,需要在命令后面加一对花括号阻止其忽略空格:

一些 \(\LaTeX{}\) 命令可以接收一些参数,参数的内容会影响命令的效果。\(\LaTeX{}\) 的参数分为可选参数和必选参数。可选参数以方括号 [ 和 ] 包裹;必选参数一般以花括号 { 和 } 包裹[2]。还有些命令可以带一个星号 *,带星号和不带星号的命令效果有一定差异。初次接触这些概念时,可以粗略地把星号看作一种特殊的可选参数。
\(\LaTeX{}\) 中还包括环境,用以令一些效果在局部生效,或是生成特殊的文档元素。\(\LaTeX{}\) 环境的用法为一对命令 \begin 和 \end:
\begin{<environment name>}[<optional arguments>]{<mandatory arguments>}
...
\end{<environment name>}
有些命令(如 \bfseries)会对其后所有内容产生作用。若要限制其作用范围,则需要使用分组。\(\LaTeX{}\) 使用一对花括号{ } 作为分组,在分组中使用的命令被限制在分组内,不会影响到分组外的内容[3]。上文提到的 \(\LaTeX{}\) 环境隐含了一个分组,在环境中的命令被包裹在分组内。
\(\LaTeX{}\) 源代码结构
\(\LaTeX{}\) 源代码以一个 \{documentclass} 命令作为开头,它指定了文档使用的文档类。document 环境当中的内容是文档正文。
在 \documentclass 和 \begin{document} 之间的位置称为导言区。
在导言区中常会使用 \{usepackage} 命令调用宏包,还会进行文档的全局设置。
\documentclass{...} % ... 为某文档类
% 导言区
\begin{document}
% 正文内容
\end{document}
% 此后内容会被忽略
\(\LaTeX{}\) 宏包和文档类
文档类
文档类规定了 \(\LaTeX{}\) 源代码所要生成的文档的性质——普通文章、书籍、演示文稿、个人简历等。\(\LaTeX{}\) 源代码的开头须用\documentclass指定文档类:
\documentclass[<options>]{<class-name>}
其中为文档类的名称,如 \(\LaTeX{}\) 提供的 article、report、book,在其基础上派生的一些文档类,如支持中文排版的 ctexart、ctexrep、ctexbook,或者有其它功能的文档类,如 moderncv、beamer 等。\(\LaTeX{}\) 提供的基础文档类见下表,其中前三个习惯上称为“标准文档类”。
| article | 文章格式的文档类,广泛用于科技论文、报告、说明文档等。 |
|---|---|
| report | 长篇报告格式的文档类,具有章节结构,用于综述、长篇论文、简单的书籍等。 |
| book | 书籍文档类,包含章节结构和前言、正文、后记等结构。 |
| proc | 基于article 文档类的一个简单的学术文档模板。 |
| slides | 幻灯格式的文档类,使用无衬线字体。 |
| minimal | 一个极其精简的文档类,只设定了纸张大小和基本字号,用作代码测试的最小工作示例。 |
可选参数 为文档类指定选项,以全局地规定一些排版的参数,如字号、纸张大小、单双面等等。比如调用 article 文档类排版文章,指定纸张为 A4 大小,基本字号为 11pt,双面排版:
\documentclass[11pt,twoside,a4paper]{article}
\(\LaTeX{}\) 的三个标准文档类可指定的选项包括:
| \(\texttt{10pt, 11pt, 12pt}\) | 指定文档的基本字号。默认为 \(\texttt{10pt}\)。 |
|---|---|
| \(\texttt{a4paper,letterpaper,...}\) | 指定纸张大小,默认为美式信纸(\(8.5\,\text{in}\times11\,\text{in}\)大约相当于 \(21.6\,\text{cm}\times28.0\,\text{cm}\))。可指定选项还包括 \(\texttt{a5paper}\),\(\texttt{b5paper}\),\(\texttt{executivepaper}\) 和 \(\texttt{legalpaper}\)。 |
| \(\texttt{twoside, oneside}\) | 指定单面/双面排版。双面排版时,奇偶页的页眉页脚、页边距不同。article 和 report 默认为 \(\texttt{oneside}\),book 默认为 \(\texttt{twoside}\)。 |
| \(\texttt{onecolumn, twocolumn}\) | 指定单栏/双栏排版。默认为 \(\texttt{onecolumn}\)。 |
| \(\texttt{openright, openany}\) | 指定新的一章 chapter 是在奇数页(右侧)开始,还是直接紧跟着上一页开始。report 默认为 \(\texttt{openany}\),book 默认为 \(\texttt{openright}\)。对 article 无效。 |
| \(\texttt{landscape}\) | 指定横向排版。默认为纵向。 |
| \(\texttt{titlepage, notitlepage}\) | 指定标题命令 \maketitle 是否生成单独的标题页。article默认为 \(\texttt{notitlepage}\),report 和 book 默认为 \(\texttt{titlepage}\)。 |
| \(\texttt{fleqn}\) | 令行间公式左对齐。默认为居中对齐。 |
| \(\texttt{leqno}\) | 将公式编号放在左边。默认为右边。 |
| \(\texttt{draft, final}\) | 指定草稿/终稿模式。草稿模式下,断行不良(溢出)的地方会在行尾添加一个黑色方块;插图、超链接等功能也会受这一组选项影响,具体见后文。默认为 \(\texttt{final}\)。 |
宏包
在使用 \(\LaTeX{}\) 时,时常需要依赖一些扩展来增强或补充 \(\LaTeX{}\) 的功能,比如排版复杂的表格、插入图片、增加颜色甚至超链接等等。这些扩展称为宏包。调用宏包的方法非常类似调用文档类的方法:
\usepackage[<options>]{<package-name>}
\usepackage可以一次性调用多个宏包,在 <package-name> 中用逗号隔开。这种用法一般不要指定选项[4]。
% 一次性调用三个排版表格常用的宏包
\usepackage{tabularx, makecell, multirow}
在使用宏包和文档类之前,一定要首先确认它们是否安装在你的计算机中,否则 \usepackage等命令会报错误。
宏包(包括前面所说的文档类)可能定义了许多命令和环境,或者修改了 \(\LaTeX{}\) 已有的命令和环境。它们的用法说明记在相应宏包和文档类的帮助文档。在 Windows 命令提示符或者 Linux 终端下输入命令可查阅相应文档:
texdoc <pkg-name>
其中 <pkg-name}> 是宏包或者文档类的名称。
\(\LaTeX{}\) 用到的文件一览
除了源代码文件 \(\texttt{.tex}\) 以外,我们在使用 \(\LaTeX{}\) 时还可能接触到各种格式的文件。本节简单介绍一下经常见到的文件。
每个宏包和文档类都是带特定扩展名的文件,除此之外也有一些文件出现于 \(\LaTeX{}\) 模板中:
| \(\texttt{.sty}\) | 宏包文件。宏包的名称与文件名一致。 |
|---|---|
| \(\texttt{.cls}\) | 文档类文件。文档类名称与文件名一致。 |
| \(\texttt{.bib}\) | 参考文献数据库文件。 |
| \(\texttt{.bst}\) | 用到的参考文献格式模板。 |
在编译过程中可能会生成相当多的辅助文件和日志。一些功能如交叉引用、参考文献、目录、索引等,需要先通过编译生成辅助文件,然后再次编译时读入辅助文件得到正确的结果,所以复杂的源代码可能要编译多次。
| \(\texttt{.log}\) | 排版引擎生成的日志文件,供排查错误使用。 |
|---|---|
| \(\texttt{.aux}\) | 生成的主辅助文件,记录交叉引用、目录、参考文献的引用等。 |
| \(\texttt{.toc}\) | 生成的目录记录文件。 |
| \(\texttt{.lof}\) | 生成的图片目录记录文件。 |
| \(\texttt{.lot}\) | 生成的表格目录记录文件。 |
| \(\texttt{.bbl}\) | BibTeX生成的参考文献记录文件。 |
| \(\texttt{.blg}\) | BibTeX生成的日志文件。 |
| \(\texttt{.idx}\) | 生成的供 makeindex 处理的索引记录文件。 |
| \(\texttt{.ind}\) | makeindex 处理 \(\texttt{.idx}\) 生成的用于排版的格式化索引文件。 |
| \(\texttt{.ilg}\) | makeindex 生成的日志文件。 |
| \(\texttt{.out}\) | hyperref 宏包生成的 PDF 书签记录文件。 |
文件的组织方式
当编写长篇文档时,例如当编写书籍、毕业论文时,单个源文件会使修改、校对变得十分困难。将源文件分割成若干个文件,例如将每章内容单独写在一个文件中,会大大简化修改和校对的工作。
\(\LaTeX{}\) 提供了命令 \include 用来在源代码里插入文件:
\include{<filename>}
为文件名(不带 \(\texttt{.tex}\) 扩展名)[5],如果和要编译的主文件不在一个目录中,则要加上相对或绝对路径,例如:
\include{chapters/file} % 相对路径
\include{/home/Bob/file} % *nix(包含 Linux、macOS)绝对路径
\include{D:/file} % Windows 绝对路径,用正斜线
值得注意的是 \include 在读入之前会另起一页。有的时候我们并不需要这样,而是用\input 命令,它纯粹是把文件里的内容插入:
\input{<filename>}
当导言区内容较多时,常常将其单独放置在一个 \(\texttt{.tex}\) 文件中,再用 \input 命令插入。复杂的图、表、代码等也会用类似的手段处理。
\(\LaTeX{}\) 还提供了一个 \includeonly 命令来组织文件,用于导言区,指定只载入某些文件。导言区使用了 \{includeonly 后,正文中不在其列表范围的 \include 命令不会起效:
\includeonly{<filename1>,<filename2>,...}
需要注意的是,使用 \include 和 \input 命令载入的文件名最好不要加空格和特殊字符,也尽量避免使用中文名,否则很可能会出错。
最后介绍一个实用的工具宏包syntonly。加载这个宏包后,在导言区使用 \syntaxonly 命令,可令编译后不生成 DVI 或者 PDF 文档,只排查错误,编译速度会快不少:
\usepackage{syntonly}
\syntaxonly
如果想生成文档,则用 % 注释掉 \syntaxonly 命令即可。
\(\LaTeX{}\) 和 \(\TeX{}\) 相关的术语和概念
在本章的最后有必要澄清几个概念:
- 引擎 全称为排版引擎,是编译源代码并生成文档的程序,如 pdfTeX、XeTeX等 。有时也称为编译器。
- 格式 是定义了一组命令的代码集。\(\LaTeX{}\) 就是最广泛应用的一个格式,高德纳本人还编写了一个简单的 plain TeX 格式,没有定义诸如
\documentclass和\section等命令。 - 编译命令 是实际调用的、结合了引擎和格式的命令。如 \(\texttt{xelatex}\) 命令是结合 XeTeX引擎和 \(\LaTeX{}\) 格式的一个编译命令。
常见的引擎、格式和编译命令的关系总结于下表。
| 文档格式 | plain TeX 格式 | LaTeX 格式 | |
|---|---|---|---|
| TeX 引擎 | \(\textrm{DVI}\) | \(\texttt{tex}\) | N/A |
| pdfTeX 引擎 | \(\textrm{DVI}\) | \(\texttt{etex}\) | \(\texttt{latex}\) |
| \(\textrm{PDF}\) | \(\texttt{pdftex}\) | \(\texttt{pdflatex}\) | |
| XeTeX 引擎 | \(\textrm{PDF}\) | \(\texttt{xetex}\) | \(\texttt{xelatex}\) |
| LuaTeX 引擎 | \(\textrm{PDF}\) | \(\texttt{luatex}\) | \(\texttt{lualatex}\) |
\(\texttt{latex}\) 编译命令和 \(\LaTeX{}\) 格式往往容易混淆,在讨论关于 \(\LaTeX{}\) 的时候需要明确。
在此介绍一下几个编译命令的基本特点:
| \(\texttt{latex}\) | 虽然名为 \(\texttt{latex}\) 命令,底层调用的引擎其实是 pdfTeX。 该命令生成 \(\texttt{dvi}\)格式的文档, 用 \(\texttt{dvipdfmx}\) 命令可以将其转为 \(\texttt{pdf}\)。 |
|---|---|
| \(\texttt{pdflatex}\) | 底层调用的引擎也是 pdfTeX,可以直接生成 \(\texttt{pdf}\) 格式的文档。 |
| \(\texttt{xelatex}\) | 底层调用的引擎是 XeTeX,支持 UTF-8 编码和对 TrueType/OpenType 字体的调用。 当前较为方便的中文排版解决方案基于 \(\texttt{xelatex}\)。 |
| \(\texttt{lualatex}\) | 底层调用的引擎是 LuaTeX。这个引擎在pdfTeX 引擎基础上发展而来,除了支持 UTF-8 编码和对 TrueType/OpenType 字体的调用外,还支持通过 Lua 语言扩展 \(\TeX{}\) 的功能。 \(\texttt{lualatex}\) 编译命令下的中文排版支持需要借助 luatexja宏包。 |
参考文献
[1] Partl H, Hyna I, Schlegl E. 一份 (不太) 简短的 LATEX2ε 介绍[J]. 2024. https://github.com/CTeX-org/lshort-zh-cn
01_LaTeX的基本概念的更多相关文章
- 如何一步一步用DDD设计一个电商网站(一)—— 先理解核心概念
一.前言 DDD(领域驱动设计)的一些介绍网上资料很多,这里就不继续描述了.自己使用领域驱动设计摸滚打爬也有2年多的时间,出于对知识的总结和分享,也是对自我理解的一个公开检验,介于博客园这个平 ...
- 【Machine Learning】机器学习及其基础概念简介
机器学习及其基础概念简介 作者:白宁超 2016年12月23日21:24:51 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...
- 【Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之集群概念介绍(一)
集群概念介绍(一)) 白宁超 2015年7月16日 概述:写下本文档的初衷和动力,来源于上篇的<oracle基本操作手册>.oracle基本操作手册是作者研一假期对oracle基础知识学习 ...
- 声音分贝的概念,dBSPL.dBm,dBu,dBV,dBFS
需要做个音频的PPM表,看着一堆的音频术语真是懵了,苦苦在网上扒了几天的文档,终于有了点收获,下面关于声音的分贝做个总结. 分贝 Decibel 分贝(dB)是一个对数单位(logarithmic u ...
- js面向对象学习 - 对象概念及创建对象
原文地址:js面向对象学习笔记 一.对象概念 对象是什么?对象是“无序属性的集合,其属性可以包括基本值,对象或者函数”.也就是一组名值对的无序集合. 对象的特性(不可直接访问),也就是属性包含两种,数 ...
- 【Linux大系】Linux的概念与体系
感谢原作者:Vamei 出处:http://www.cnblogs.com/vamei 我在这一系列文章中阐述Linux的基 本概念.Linux操作系统继承自UNIX.一个操作系统是一套控制和使用计算 ...
- KOTLIN开发语言文档(官方文档) -- 2.基本概念
网页链接:https://kotlinlang.org/docs/reference/basic-types.html 2. 基本概念 2.1. 基本类型 从可以在任何变量处理调用成员函数和属性 ...
- .NET面试题系列[5] - 垃圾回收:概念与策略
面试出现频率:经常出现,但通常不会问的十分深入.通常来说,看完我这篇文章就足够应付面试了.面试时主要考察垃圾回收的基本概念,标记-压缩算法,以及对于微软的垃圾回收模板的理解.知道什么时候需要继承IDi ...
- 《徐徐道来话Java》(1):泛型的基本概念
泛型是一种编程范式(Programming Paradigm),是为了效率和重用性产生的.由Alexander Stepanov(C++标准库主要设计师)和David Musser(伦斯勒理工学院CS ...
- 简述linux同步与异步、阻塞与非阻塞概念以及五种IO模型
1.概念剖析 相信很多从事linux后台开发工作的都接触过同步&异步.阻塞&非阻塞这样的概念,也相信都曾经产生过误解,比如认为同步就是阻塞.异步就是非阻塞,下面我们先剖析下这几个概念分 ...
随机推荐
- C++ set/multiset容器 学习总结
-------------------------------------set/multiset容器 set/multiset特性 set/multiset的特性是所有元素会根据元素的值自动进行排序 ...
- Web前端入门第 77 问:JavaScript 由程序触发绑定事件的几种方式
开发中经常会遇这样的需求:点击 A 元素的时候,需要触发 B 元素的事件,比如:点击一个 div 元素,然后触发 input:file 的 click 事件,用来选择文件上传. click 方法 以上 ...
- JDK 7 和 JDK 8 的区别
简介 容易记的 jdk8支持接口可以添加默认方法, default; jdk8支持lambda表达式 jdk7中hashmap解决冲突采用链表, 一旦hash碰撞过多, 可能会使得一个链表上存在多个节 ...
- Day13 备战CCF-CSP练习
Day 13 题目描述 题目分析 大模拟,用栈储存每一个多项式,最后根据导数的加法原则依次求导相加,注意取模. C++代码 #pragma GCC optimize(3, "Ofast&qu ...
- 统计的系统客观性与动态进化性•Freq频率与Bayes两大学派及争论•统计推断•Bayes学派及其基本观点与Bayes估计
统计的系统客观性: 统计数据及其活动不是片面的,而是系统客观反映客观现象. 周期的做"总体统计" + 随机/按需/周期做"抽样统计": 统计的动态进化性: 统计 ...
- SciTech-Mathematics-Probability+Statistics- Descriptive stats +完全搞懂percentile(百分位数) + quartile(四分位数) + median(中位数) + percentiles() in NumPy+Pandas+SciPy.stats
Descriptive Stats + percentiles in numpy and scipy.stats https://dev.to/sayemmh/descriptive-stats-pe ...
- AI 发展 && MCP
文章目录 一.AI 的发展历程 二.关键技术演进 2.1 架构演进 2.2 训练方法演进 2.3 应用领域扩展 三.重要里程碑产品/工具 3.1 开发框架 3.2 AI 应用 四.MCP 4.1 什么 ...
- Win10系统如何显示文件后缀名的问题
有一位电脑基地的小伙伴在Windows 10系统中,想要对文件扩展名(后缀名)进行修改,发现怎么修改都不行,其实,是因为原版win10系统默认是不显示后缀名的,那么我们要如何让win10系统显示全部文 ...
- Unity快速测试代码
1.可以使用Unity自带的 ContextMenu 属性 小齿轮进行代码测试 2.使用插件 EasyButton https://github.com/madsbangh/EasyButtons 3 ...
- es6划重点
es6划重点 1.作用域变量 1.1.let和var对比 1.变量不提升 2.不能重复定义 3.暂存死区 4.闭包新写法 2.const(常量) 3.解构 1.数组解构 2.对象解构 3.混合解构 4 ...