跳转至

LaTeX 使用

约 5638 个字 794 行代码 5 张图片 预计阅读时间 29 分钟

介绍

  • TeX 是高德纳 (Donald E. Knuth) 为排版文字和数学公式而开发的软件

  • LaTeX 是一种使用 TeX 程序作为排版引擎的格式(format),可以粗略地将它理解成是对 TeX 的一层封装;与汉字 “拉泰赫” 或 “雷泰赫” 的发音相近

  • 优缺点:

    • 优点:专注于内容本身,排版(typesetting)效果好,数学公式排版强大,跨平台开源...
    • 缺点:学习成本高,不容易排错,不容易定制样式,不所见即所得...
  • TeX 发行版:TeX Live / MacTeX(macOS 下定制的 TeX Live 版本)

  • TeX 编辑器:TeXstudio(Windows)、TeXShop(MacTeX 自带)、Texifier(macOS;有破解版)


参考资料


LaTeX 编辑器


使用

工具

texdoc texlive-en          # 查看 TeX Live 指南
texdoc texlive-zh
texdoc package/class       # 查看宏包、文档类帮助文档
texdoc symbols             # 查看符号表
texdoc texcount            # 查看 texcount 文档
cargo install tex-fmt   # 安装

tex-fmt main.tex        # 格式化并覆写
--check                 # 检查是否被正确格式化
--print                 # 输出到 STDOUT
--keep                  # 不自动换行
--stdin                 # 从 STDIN 读入,输出到 STDOUT


% tex-fmt: skip        # 跳过该行

% tex-fmt: off         # 不格式化该段内容
...
% tex-fmt: on
# macOS 安装
brew install perl
brew install cpanm

cpanm YAML::Tiny
cpanm File::HomeDir


# 使用
latexindent main.tex              # 基本用法(默认缩进是制表符)
latexindent -l latexindent.yaml -w -s main.tex
# 参数
-l             # 导入 yaml 配置文件
-w             # 写入到文件中
-s             # 备份

# latexindent.yaml 内容
defaultIndent: "  "       # 设置缩进为两个空格
  • texcount:统计(Tex Live 自带)
texcount -man             # 查看 manual
texcount -help-options    # 查看命令选项

texcount main.tex
  • latexdiff:LaTeX 实现审阅效果(Tex Live 自带)
    • 使用:latexdiff old.tex new.tex > diff.tex,编译 diff.tex
    • 若 tex 多个文件嵌套,会复杂许多
# Ubuntu 安装
sudo apt install latexdiff

# macOS 安装
brew install latexdiff

BibTeX 相关

GitHub - njzjz/tushuguan: A template to create a BibTeX Library


格式化 bib 文件
npm install -g bibtex-tidy  # 安装

bibtex-tidy refs.bib        # 基本使用

# 常用参数
bibtex-tidy refs.bib \
    --sort=-year,title \
    --sort-fields \
    --omit=abstract,keywords,file,urldate,langid,copyright,publisher,shorttitle \
    --blank-lines \
    --duplicates \
    --escape \
    --strip-comments \
    --trailing-commas \
    --no-wrap \
    --remove-empty-fields \
    --remove-dupe-fields \
    --tidy-comments

# bib 中一些不需要的条目
sed -i '/abstract = {/d' xxx.bib
sed -i '/doi = {/d' xxx.bib
sed -i '/keywords = {/d' xxx.bib

doi 转 bib 格式
# doi
julia> using DOI2BibTeX
julia> doi = "10.1103/PhysRevLett.45.494"
julia> doi2bib(doi)

# arxiv
julia> arxiv = "arxiv:1710.10324"
julia> arxiv2bib(arxiv)

# wenxian 安装与使用
pip install -U pipx
pipx run wenxian from 10.1063/5.0155600

ris 转 bib 格式

ris:Zotero 格式


编译

  • pdflatex 表示使用 pdfTeX 作为引擎、使用 LaTeX 格式来编译文档(还有 xelatex、lualatex 等)。这些命令行命令通常称为 “编译方式”;编译方式写成图标的形式

image.png


  • 英文文档:用 pdflatex、xelatex、lualatex 编译;中文文档:用 xelatex、lualatex 编译编译
  • ctexart 文档类需使用 xelatex 编译
  • Overleaf 默认使用 pdflatex 编译
# 语法
xelatex [OPTION]... [TEXNAME[.tex]] [COMMANDS]
# .tex 扩展名可以省略
xelatex file.tex  # xelatex file

xelatex -shell-escape file.tex

xelatex -shell-escape -synctex=1 %.tex

# 常用参数
-output-directory   # 输出目录
-shell-escape       # 开启 shell 转义,允许使用依赖于外部工具的宏包(如 minted 宏包实现代码高亮)
-synctex            # 启用 SyncTEX 程序,编辑器可以使用 SyncTEX 的输出来实现源代码和 PDF 之间的相互跳转

# 命令
# 设置 graphicx 包为 draft 模式来加快编译速度
'\PassOptionsToPackage{draft}{graphicx}\input{main}'

  • 含参考文献的文档编译:LaTeX 参考文献输出
    • BibTeX 后端:xe-bib-xe-xe 编译顺序
    • biber 后端 + biblatex 宏包:使用 latexmkxe-biber-xe-xe 编译顺序
# 可以略去扩展名
xelatex main.tex
bibtex main.aux
xelatex main.tex
xelatex main.tex

latexmk --xelatex main.tex


latexmk

latexmk [options] main.tex  # .tex 后缀名可省略

# 常用参数
-outdir                     # 输出目录
-time                       # 显示执行时间统计信息
-file-line-error            #  显示详细的错误位置
-halt-on-error              # 遇到错误时停止执行
-interaction=nonstopmode    # 不暂停,一直运行到结束
-pvc                        # 预览文档并持续更新
-silent                     # 安静模式

latex -c                    # 删除辅助文件
latex -C                    # 删除辅助文件 + PDF

.latexmkrc :latexmk 配置文件;通常包含以下内容:

  • 构建引擎的选择:如 pdfLaTeX、XeLaTeX 或 LuaLaTeX
  • 构建参数:设置构建过程中的各种参数,如输出文件类型、编译次数、文件清理选项等
  • 自定义构建规则:包括设置文件依赖关系、指定额外的编译步骤等
  • 输出文件命名规则:定义输出文件的命名规则,以确保生成的文件按照特定的方式命名
  • 文件监控选项:配置 latexmk 以在文件更改时自动重新构建文档,以提高工作效率
  • 示例:
# Set timezone.
$ENV{'TZ'}='Asia/Shanghai';

# Ensure './texmf//' is in '$TEXINPUTS'.
ensure_path( 'TEXINPUTS', './texmf//' );

# PDF generate method
#   - 1 pdfLaTeX
#   - 3 LaTeX + DVIPDFMx
#   - 4 LuaLaTeX
#   - 5 XeLaTeX
$pdf_mode = 5;

# Add common patterns for tex engines.
set_tex_cmds( '-synctex=1 %O %S' );

# Always try to embed fonts, ignoring licensing flags, etc.
$xdvipdfmx = 'xdvipdfmx -E -o %D %O %S';

# Files to clean.
$clean_ext = 'bbl glo gls hd loa run.xml thm xdv synctex.gz';

语法

  • 注释:以 % 开头

  • 命令:以 \ 开头,区分大小写;\command[...]{...}:必选参数放在 {...} 中,可选参数放在 [...],多个参数以逗号分隔

  • 有些命令会对后续内容产生影响,可以用 {} 限定作用范围,如 {\bf bold}

  • 环境:常用环境:列表与枚举、图片、表格、定理等

  • 特殊符号需转义,如 \%\$

\begin{env}
   ...
\end{env}
  • 相关术语与概念:引擎、格式、编译命令

文档类和宏包

文档类

  • 文档类:英文排版:article、report、book;中文排版 ctexart、ctexrep、ctexbook;幻灯片:beamer
  • 可选参数:为文档类指定选项,以全局地规定一些排版的参数,如字号、纸张大小、单双面等;三个标准文档类可指定的选项如下
\documentclass[options]{classname}
\documentclass[12pt,twoside,a4paper]{article}

image.png


宏包

  • 宏包:在使用 LaTeX 时,时常需要依赖一些扩展来增强或补充 LaTeX 的功能,比如排版复杂的表格、插入图片、增加颜色甚至超链接等
  • 可一次性调用多个宏包,逗号隔开,这种用法一般不要指定选项
\usepackage[options]{packagename}

文件类型

  • LaTeX 模板相关文件格式:.sty.clsbstbib
  • LaTeX 编译过程中生成相当多的辅助文件和日志,一些功能如交叉引用、参考文献、目录、索引等,需要先通过编译生成辅助文件,然后再次编译时读入辅助文件得到正确的结果,所以复杂的 LaTeX 源代码可能要编译多次
.sty        # 宏包文件;宏包名称与文件名一致
.cls        # 文档类文件;文档类名称与文件名一致
.bst        # BibTeX 用到的参考文献格式模板
.bib        # BibTeX 参考文献数据库文件
.log        # 排版引擎生成的日志文件,供排查错误使用
.aux        # 主辅助文件,记录交叉引用、目录、参考文献的引用等
.toc        # 目录记录文件
.lof        # 图形目录记录文件
.lot        # 表格目录记录文件
.bbl        # BibTeX 生成的参考文献记录文件
.blg        # BibTeX 生成的日志文件
.idx        # 供 makeindex 处理的索引记录文件
.ind        # makeindex 处理 .idx 生成的用于排版的格式化索引文件
.ilg        # makeindex 生成的日志文件
.out        # hyperref 宏包生成的 pdf 书签记录文件

文件结构

文件结构

\documentclass{article}  % 指明文档类型

% 导言区:设置文档样式
\usepackage{...}         % 调用宏包
\newcommand{...}         % 自定义命令

\begin{document}
% 正文
    ...
\end{document}
% 后续忽略

中文排版

  • 使用 ctexart ctexrep ctexbook 等 ctex 文档类(源代码需保存为 UTF-8 编码)
  • 引入 ctex 宏包
\documentclass{ctexart}   % 方式 1

\documentclass{article}   % 方式 2
\usepackage{ctex}

  • 中文文档简略测试
% 用 XeLaTeX 或 LuaLaTeX 编译
\documentclass{ctexart}
\begin{document}
\TeX{} 你好!
\end{document}

文档部件

  • 标题:\title\author\date\maketitle
  • 摘要:abstract 环境
  • 目录:\tableofcontents
  • 章节:\chapter\section\subsection
  • 文献:\bibliography

注:abstract 环境只在 article 和 report 文档类有,report 文档类会单独成页,article 文档类会在标题下方


文档划分

  • 分文件编译:\include\input
  • 两者区别在于 \include 命令将会插入 \clearpage 再读取文件(即另起一页)
\input{filename.tex}
\include{filename}

字符

  • 空格:空格键和 Tab 键输入的空白字符视为“空格”。连续的若干个空白字符视为一个空格。一行开头的空格忽略不计。

  • 换行:行末的换行符视为一个空格;但连续两个换行符,也就是空行,会将文字分段。多个空行被视为一个空行。也可以在行末使用 \par 命令分段。

  • 中文的标点符号(绝大多数为非 ASCII 字符)使用中文输入法输入即可,一般不需要过多留意;而输入西文标点符号时,有不少地方需要留意

    • 西文排版中经常会出现连字(ligatures),常见的有 ff/fi/fl/ffi/ffl
    • 单引号 ' 和 ' 分别用 ` 和 ' 输入;双引号 “和” 分别用 `` 和 '' 输入
    • 三种长度的横线:连字号 - 用来组成复合词;短破折号 -- 用来连接数字表示范围;长破折号 --- 用来连接单词,语义上类似中文的破折号
    • 英文省略号用 \ldots
  • 拉丁文扩展与重音

% 加一对花括号的写法相当于提供了空的参数
% 否则它们可能会将后面的字符作为参数,形成重音效果
\# \$ \% \& \{ \} \_
\^{}  \~{}  \textbackslash

dif{}f{}icult  f{}ind          % 连字
``Please press the `x' key.''  % 单引号、双引号
\ldots  \ldots{}               % 省略号

% 三种长度的横线
daughter-in-law, X-rated \\
pages 13--67 \\
yes---or no?

% 特殊字符
Å  \AA % 埃

断行和换页

  • 单词间距:西文排版中,断行的位置优先选取在两个单词之间,即“空格”;文字在单词间的“空格”处断行时,“空格”生成的间距随之舍去。可使用字符 ~ 输入一个不会断行的空格,通常用在英文人名、图表名称等上下文环境

  • 断行:\\ 可在表格、公式等地方用于换行,而 \newline 只用于文本段落中

  • 换页:\newpageclearpage

  • 命令 \newline\newpage 会在断行/断页位置填充适当的间距,但 \linebreak\pagebreak 不能,使用这些命令强行断行/断页可能会制造出糟糕的排版效果,并导致 LaTeX 报 Underfull \hbox 等警告

  • 手动断词:对于绝大多数单词,LaTeX 能够找到合适的断词位置,在断开的行尾加上连字符 -。手动使用 \- 命令指定断词的位置

% 不会断行的空格
Fig.~2a \\
Donald~E. Knuth

\\[length]         % 断行
\newline

\newpage           % 换页
\clearpage

\linebreak[n]      % 数字 n 代表适合/不适合的程度;0-4,缺省为 4
\nolinebreak[n]
\pagebreak[n]
\nopagebreak[n]

章节和目录

  • 命令 \chapter 只在 report 和 book 文档类有定义
  • article 文档类带编号的层级为 \section\subsection\subsubsection 三级
  • report 和 book 文档类带编号的层级为 \chapter\section\subsection 三级
  • article 文档类的 section 标题默认左对齐,ctexart 文档类的 section 标题默认居中,article 文档类 + ctex 宏包的 section 标题是左对齐的
  • 正确生成目录项,一般需要编译两次源代码
\chapter
\section
\subsection
\subsubsection

% 定制章节标题的样式
\usepackge{titlesec}

\tableofcontents

\renewcommand{\contentsname}{目录}

% 定制目录的样式
\usepackge{titletoc}

标题页

  • \title\author 必需(不用 \title 会报错;不用 \author 会警告),\date 若省略或 \date{\today} 会生成当天日期,\date{} 不显示日期

  • \title\author 等命令内可以使用 \thanks 命令生成标题页的脚注,用 \and 隔开多个人名

  • \title\author\date 可放在导言区或正文

  • article 文档类的标题默认不单独成页,book 和 report 文档类默认单独成页;可在 \documentclass 命令调用文档类时指定 titlepagenotitlepage 选项以修改默认的行为

  • titlepage 环境,生成不带页眉页脚的一页;生成自定义的标题页以替代 \maketitle 命令

\title{}           % 标题
\author{}          % 作者
\date{}            % 日期
\date{\today}      % 当天日期
\date{}            % 不显示日期

\maketitle         % 生成标题页

引用与参考文献

  • 参考文献由文献数据库(即 .bib 文件,条目会包含 key,用于引用)生成
  • 注意特殊符号、公式等常常需要人工检查
  • 需多次编译,推荐 latexmk

  • 传统方法:BibTeX 后端(gbt7714 宏包)

\usepackage[sort&compress]{gbt7714}
\bibliographystyle{<style>}  % 指定样式;gbt7714-numerical
\renewcommand{\bibname}{参考文献}

\cite{key1, key2}            % 引用文献
\nocite{}                    % 列出未引用的文献
\nocite{*}                   % 列出所有未被引用的文献

\bibliography{bibfile}       % 打印参考文献列表
  • 现代方法:biber 后端 + biblatex 宏包(国家标准:biblatex-gb7714-2015 宏包)

  • biblatex 宏包:支持以 key=value 形式指定选项,包括参考文献样式 style、参考文献著录排序的规则 sorting

    • biblatex 使用的参考文献样式分为著录样式(bibliography style)和引用样式(citation style),分别以 .bbx.cbx 为扩展名。参考文献的样式在调用宏包时使用 style 选项指定,或者使用 bibstyle 或 citestyle 分别指定
% 参考文献相关设置
\usepackage[
    backend       = biber,
    style         = gb7714-2015,
    defernumbers  = true,
    sorting       = ymdnt,          % Year in descending order
    sorting       = ynt,            % Year in ascending order
    maxbibnames   = 3,              % No. of listed names
    citestyle     = numeric-comp,
    isbn          = false,          % controls whether the fields isbn/issn/isrn are printed
    block         = par,
    doi           = false,          % do not show doi
    url           = false,
    eprint        = false,
    giveninits    = false,
    gbnamefmt     = lowercase,      % 姓名大小写由输入信息确定
    gbpub         = false,          % 禁用出版信息缺失处理
]{biblatex}
\renewcommand*{\bibfont}{\small}
\setlength{\bibitemsep}{0pt}        % 文献条目间距
\addbibresource{refs.bib}           % 导入参考文献数据库;需添加 bib 后缀


\cite{key1, key2}   % 默认引用参考文献条目
\upcite             % 右上角引用格式
\nocite             % 列出未引用的参考文献

\citeauthor  \citeyear  \textcite   \footcite
\supercite   \parencite

% 打印参考文献列表
\printbibliography
\printbibliography[heading=bibintoc]
  • natbib 宏包:可以生成用人名——年份的引用方式
% 连续引用多篇文献时,会生成形如 (3–7) 的引用
\usepackage[numbers,sort&compress]{natbib}

\citep{}
\citet{}

列表

  • 无序列表,有序列表
\begin{itemize}
    ...
\end{itemize}

图片

\usepackage{graphicx}
% 指定图片目录
\graphicspath{{figures/}}
% 指定图片扩展名
\DeclareGraphicsExtensions{.pdf,.eps,.png,.jpg,.jpeg}

表格

% tabular 环境
\begin{tabular}{...}
    ...
\end{tabular}
  • 三线表:booktabs 宏包
\usepackage{booktabs}

% 三线表
\begin{tabular}{ccc}
\toprule        % 表格头部粗线
姓名 & 学号 & 性别 \\
\midrule        % 表格中横线
1 & 2 & 3 \\
4 & 5 & 6 \\
\bottomrule     % 表格底部粗线
\end{tabular}
  • 斜线表:diagbox 宏包
\usepackage{diagbox}

\begin{tabular}{|c|c|c|}
\hline
% 斜线表头
\diagbox{Header1}{Header2} & Column 1 & Column 2 \\
\hline
Row 1                      & Data 1   & Data 2   \\
\hline
Row 2                      & Data 3   & Data 4   \\
\hline
\end{tabular}
  • 长表格:longtable 宏包(支持跨页)
\usepackage{longtable}

\begin{longtable}{...}
    ...
\end{longtable}
\usepackage{multirow}                   % \multirow 需调用此宏包

\multicolumn{num}{alignment}{content}   % 水平合并单元格
% num 要合并的单元格数量
% alignment 对齐方式
% content 单元格中的内容

\multirow{num}{width}{content}          % 垂直合并单元格
% width 单元格宽度,可使用 * 以自动调整宽度

\multicolumn{1}{c}{}                    % 单独控制表格 cell 的对齐方式

% 定义新的列类型
% p 可改成 m
% \centering 可改成 \raggedleft \raggedright
\newcolumntype{C}{>{\centering\arraybackslash}p{3cm}}

% 调整 LaTeX 中默认的表格行距
\usepackage{array}
\renewcommand{\arraystretch}{1.3}

\usepackage{makecell}     % 在单元格内换行

浮动体

  • 图片和表格有时会很大,在插入的位置不一定放得下,因此需要浮动调整;两类浮动体环境 figure 和 table
  • 避免在文中使用「下图」、「上图」的说法,而是使用图表的编号,如:图 ~\ref{fig:fig1}
  • h 当前位置 (here),t 顶部 (top),b 底部 (bottom),p 单独成页 (p)。LaTeX 的默认参数是 tbp
  • !h 表示忽略一些限制,H 表示强制(强烈不建议)
  • 图标题一般在下方,表标题一般在上方,即 \caption{...} 应放在 \begin{tabular}
  • \label 需写在 \caption 后面,否则交叉引用会出现问题
  • 可通过修改 \figurename\tablename 的内容来修改标题的前缀,标题样式的定制功能由 caption 宏包提供
\label{name}     % 添加标签:图片、表格、公式、章节等
\label{eq:name}  % 有意义的标签
% 浮动表格
\begin{table}[!htbp]
   ...
\end{table}

% 浮动图片
\begin{figure}[!htbp]
   ...
\end{figure}

% 生成浮动表格、图片的目录
\listoftables
\listoffigures

% 修改标题的前缀
\renewcommand{\tablename}{newname}
\renewcommand{\figurename}{newname}

页面设置

页边距:geometry 宏包

通过 geometry 宏包设置的纸张大小是输出 PDF 文件的真实大小,而在文档类选项中设置的参数实际上只影响输出区域。

LaTeX 默认将页面内容在垂直方向分散对齐。

% geometry-settings 多以 key = value 的形式组织
% 方式 1
\usepackage{geometry}
\geometry{geometry-settings}
% 方式 2
\usepackage[geometry-settings]{geometry}

% Microsoft Word 习惯的页面设定:A4 纸张,上下边距 1 英寸,左右边距 1.25英寸
% 方式 1
\geometry{a4paper,left=1.25in,right=1.25in,top=1in,bottom=1in}
% 方式 2
\geometry{a4paper,hmargin=1.25in,vmargin=1in}

% 书籍等双面文档,习惯上奇数页右边、偶数页左边留出较大的页边距,而靠近书脊一侧的奇数页左边、偶数页右边页边距较小
\geometry{inner=1in,outer=1.25in}

\raggedbottom  % 页面在垂直方向向顶部对齐
\flushbottom   % 页面在垂直方向分散对齐

页眉页脚:fancyhdr 宏包,\pagestyle,将页眉页脚分为左中右三个部分,页眉页脚处的横线粗细可以定义,默认页眉为 0.4pt、页脚为 0pt

页码:\pagenumbering 命令,有 arabic,[Rr]oman,[Aa]lph 五种页码形式

% 页眉页脚设置
\usepackage{fancyhdr}
\pagestyle{fancy}
    \fancyhf{}  % 清空页眉页脚的设置
    \fancyhead[position]{}  % 设置页眉
    \fancyfoot[position]{}  % 设置页脚
    \lhead{}  % 分别设置页眉左中右内容
    \chead{}
    \rhead{}
    \lfoot{}  % 分别设置页脚左中右内容
    \cfoot{\thepage}
    \rfoot{}
\renewcommand{\headrulewidth}{0.4pt}  % 修改页眉横线宽度
\renewcommand{\footrulewidth}{0pt}    % 去掉页脚横线

公式

参考: - 通用 LaTeX 数学公式语法手册 - UinIO.com 电子技术实验室 - LaTeX 公式排版超级备忘录 - 各类场景全覆盖 - LaTeX Math Wikibook


amsmath 允许用户在导言区用 \DeclareMathOperator 定义自己的算符,其中带星号的命令定义带上下限的算符

\usepackage{amsmath, amssymb, amsfonts}  % 常用数学宏包

\DeclareMathOperator{\diff}{d\!} % 定义微分运算符

数学模式

math mode - Differences between \stackrel and \stackbin - TeX - LaTeX Stack Exchange

  • 空格不起作用;不能有空行
  • 取消公式编号:在环境名后加 *
$...$                       % 行内(inline)公式
\(...\)

% 行间(display 独显)公式
\[                          % 无编号
    ...
\]
$$                          % 不要用(为什么?)
    ...
$$

\begin{equation*}           % 无编号
    ...
\end{equation*}

\begin{equation}            % 有编号
    ...
\end{equation}

\quad                       % 插入空格
\qquad
\hspace
\,                          % 相当于 3/18 \quad

% 常用数学字体命令
\mathrm{}
\mathit{}
\mathtt{}
\mathsf{}
\mathbf{}
\mathcal{}
\mathbb{}

\frac{}{}                   % 分式
\tfrac{}{}                  % \frac 行内公式等价于 \tfrac
\dfrac{}{}                  % 行间公式等价于 \dfrac

\binom{}{}                  % 二项式系数
\tbinom{}{}                 % 小型
\dbinom{}{}                 % 大型

^{}                         % 上下标
_{}

'                           % 导数
\prime

\overline{}                 % 上、下划线
\underline{}

\overbrace{}                % 上、下大括号
\underbrace{}

\sqrt{}                     % 根式
\sqrt[n]{}

\sum                        % 求和;针对于行内行间公式取不同的尺寸, 上下限位置也可能不同
\int                        % 积分
\oint                       % 环路积分
\iint                       % 双重积分

\mathcal{}                  % 花体字;傅里叶变换 F、拉普拉斯变换 L和梅林变换 M,函数的阶 O

\operatorname{}             % 正体字

\underset{}{}               % 在数学符号的下/上方添加标记或符号
\overset{}{}
\stackrel{}{}               % 相比 \underset 是过时的

%% 在数学模式中插入普通文本
% \rm{} \mathrm{} \text{} 之间的区别
\rm{}                       % 过时命令;将文本的字体改为罗马体
\mathrm{}                   % 在数学模式中将文本设置为直立的罗马体
\text{}                     % 来自 amsmath 宏包,在数学模式中插入正常文本;能自动调整字体大小和样式
\mbox{}

括号与定界符

(...)                     % 基本括号
[...]
{...}

|...|                     % 绝对值、范数
\vert...\vert
\Vert...\Vert

\langle...\rangle         % Dirac 符号
|...\rangle

\left(...\right)          % 自动调节括号大小
\big  \Big  \bigg  \Bigg  % 手动调节括号大小,1.5 2 2.5 3 倍;声明左中右,在命令后添加 l、m 或 r,如 \bigl

% 自带定界符的矩阵环境
pmatrix                   % 圆括号
bmatrix                   % 方括号
Bmatrix                   % 花括号
vmatrix                   % 绝对值
Vmatrix                   % 带范数

符号与数学字体

  • 符号

    • 最常用的额外字体包:amssymb
  • 数学字体

    • 「Times New Roman」:newtxmath 宏包
    • 不要用 times 和 mathptmx 宏包
    • 加粗:使用 bm 宏包的 \bm 命令(\mathbf 只有直立的字母)
  • 新方案:unicode-math 宏包


多行公式

alignaligned 的区别:后者允许在数学环境内嵌套使用(如 equation);gathergathered 同理

multline         % 多行公式,不对齐,只给一个公式编号
gather           % 多个公式,可添加多个公式编号
align            % 多个公式对齐,只能对齐公式内部的一个部分
flalign          % 多个公式对齐,可对齐公式内的多个部分
split            % 分割公式

字体

  • 宏包:fontspec
% 字体样式
\textbf{bold} \textit{italic} \texttt{typewriter}
\textsf{sans serif} \textsc{Small Caps} \textsl{slanted}

% 字号
{\tiny tiny} {\scriptsize scriptsize} {\footnotesize footnotesize}
{\small small} {\normalsize normalsize} {\large large}
{\Large Large} {\LARGE LARGE} {\huge huge} {\Huge Huge}
# 查看已安装中英文字体 zh/en
fc-list :lang=zh

中英文字体设置

% 中文字体设置
\usepackage{xeCJK}
\setCJKmainfont{Source Han Sans SC}
\setCJKmainfont{Smiley Sans}

% 英文字体设置
\usepackage{fontspec}
\setmainfont{Times New Roman}  % 新罗马字体
\setmainfont{Tex Gyre Termes}  % 会报没有该字体的错
\setmainfont{PingFang SC}      % 苹方字体
\setmainfont{libertinus}       %

% 检查字体是否存在;不存在则使用默认字体
\usepackage{fontspec}
\IfFontExistsTF{Times New Roman}{
  \setmainfont{Times New Roman}
}{
  \typeout{Times New Roman font not found. Using default font.}
}
\usepackage{newcomputermodern}  % 会报错

\usepackage{libertine}
% 数学模式下使用 Linux Libertine
\usepackage[libertine]{newtxmath}

衬线字体(Serif)与非衬线字体 (Sans-Serif) 的区别:笔画开始和结束处有额外的装饰元素,称为衬线;非衬线字体没有衬线装饰,笔画末端简洁平直。

常见衬线字体:Times New Roman,宋体,仿宋(带“宋”字体),楷体 常见非衬线字体:Arial,黑体(带“黑”字体),幼圆


代码字体相关后缀

Mono 后缀:等宽字体(Monospaced Font) LF 后缀:连字(Ligature Font)(给常用的一些字符组合做特殊处理,让它们看起来更连贯,如“不等于”的渲染) - 默认带连字支持:JetBrains Mono、Cascadia Code 和 FiraCode 等 - 不带连字支持:Consolas、Monaco、Menlo 和 Hack

NL 不带连字

Nerd Font 自带图标字体 Nerd Font Mono:带 Mono 的 NF,其图标宽度和字母宽度一致。 NF 不带 Mono 的图标本身在排版上也是和字母严格等宽的,只是看起来大一点

代码字体主要是非衬线的,Fira Code 和 Cascadia Code 是衬线字体

WOFF2(Web Open Font Format 2)是一种专为网页上使用而设计的字体格式。

写代码用哪种字体看起来最舒适?

TerminalVector 字体


常用宏包

  • 常用宏包简介:见 lshort-zh-cn.pdf 文件中附录 B.3 的内容

image.png

  • hyperref 宏包:超链接、引用,由于它经常与其他宏包冲突,一般把它放在导言区的最后
\usepackage{hyperref}
\hypersetup{
    pdftitle=...,            % PDF 标题
    pdfauthor=...,           % PDF 作者
    pdfsubject=...,          % PDF 主题
    pdfborder={0 0 0},       %
    bookmarks=true,          % 显示书签
    bookmarksopen=true,      % 书签展开
    bookmarksnumbered=true,  % 书签编号
    hidelinks=true,          % 隐藏链接方框
    colorlinks=true,         %
    urlcolor=...,            % 外部链接颜色
    linkcolor=...,           % 内部链接颜色
    citecolor=...,           % 文献引用颜色
    filecolor=...,           %
}
  • xcolor 宏包:调用颜色
\usepackage{xcolor}

% 自定义颜色
\definecolor{colorname}{RGB}{34,34,250}

% 文本颜色
{\color{colorname}{text}}
\textcolor{red!70}{百分之70红色}
  • hologo 宏包:可以输出许多 \(\TeX\) 家族标志
\usepackage{hologo}

% 大写 H 表示符号的首字母也大写
\hologo{XeLaTeX} \Hologo{BibTeX}
\providecommand{\XeTeX}{\hologo{XeTeX}}
\providecommand{\BibLaTeX}{\textsc{Bib}\LaTeX}

% LaTeX 标志
\TeX  \LaTeX \LaTeXe
  • comment 宏包:用于将其中的文本视为注释,从而使这些文本不会在生成的文档中显示(有时会导致编译出错
\usepackage{comment}

\begin{comment}
    ...
\end{comment}
  • lipsum、zhlipsum 宏包:生成随机的英文、中文文本,主要用途是填充文档以便测试文档的版面布局
\usepackage{lipsum}
\usepackage{zhlipsum}

\lipsum        % 插入默认的第一段到第七段的 Lorem Ipsum 文本
\lipsum[2-4]   % 第 2-4 段
\usepackage{tcolorbox}

% 接受一串 key-value 的参数列表
\begin{tcolorbox}[
title=..., % 盒子标题
colframe=...,
colback=...,
...
]
    \tcblower  % 增加了一条虚线,将盒子内容分成了上下两部分
    ...
\end{tcolorbox}

% 另一种写法
\usepackage[most]{tcolorbox}
\begin{tcolorbox}[
    boxrule=0pt,
    rightrule=0pt,
    % toprule=0pt,
    % bottomrule=0pt,
    frame hidden,
    % sharp corners,  % rounded corners 圆角
    enhanced,
    borderline west={1pt}{0pt}{red}
  ]
% 文字、公式和符号
amsmath       % AMS数学公式扩展
mathtools     % 数学公式扩展宏包,提供了公式编号定制和更多的符号、矩阵等
amsfonts      % AMS 扩展符号的基础字体支持
amssymb       % 在 amsfonts 基础上将 AMS 扩展符号定义成命令
bm            % 提供将数学符号加粗的命令 \bm
unicode-math  % 使用 Unicode 数学字体
siunitx       % 以国际单位规范排版物理量的单位
mhchem        % 排版化学式和方程式

% 排版元素
ulem          % 提供排版可断行下划线的命令 \uline 以及其它装饰文字的命令
multicol      % 提供将内容自由分栏的 multicols 环境
multitoc      % 生成多栏排版的目录
minitoc       % 为章节生成独立的小目录
verbatim      % 对原始的 verbatim 环境的改善。提供了命令 \verbatiminput 调用源文件
fancyvrb      % 提供了代码排版环境 Verbatim 以及对版式的自定义
listings      % 提供了排版关键字高亮的代码环境 lstlisting 以及对版式的自定义。类似宏包有 minted 等
algorithmic   % 一个简单的实现算法排版的宏包。如果要生成浮动体的话,需要搭配 algorithm 宏包使用
algorithm2e   % 较为复杂的、可定制的算法排版宏包。类似宏包有 algorithmicx 等
amsthm        % 定制定理环境。类似宏包 theorem、ntheorem、thmtools 等

% 图表和浮动体
array         % 对表格列格式的扩展
booktabs      % 排版三线表
tabularx      % 提供 tabularx 环境排版定宽表格,支持自动计算宽度的 X 列格式
diagbox       % 排版斜线表头
longtable     % 提供排版跨页长表格的 longtable 环境
graphicx      % 支持插图
caption       % 控制浮动体标题的格式。类似宏包有 keyfloat 等
subcaption    % 提供子图表和子标题的排版。类似宏包有 subfigure 和subfig 等
float         % 为浮动体提供不浮动的 H 模式;提供自定义浮动体结构的功能

% 修改版式
geometry      % 修改页面尺寸、页边距、页眉页脚等参数
fancyhdr      % 修改页眉页脚格式,令页眉页脚可以左对齐、居中、右对齐
titlesec      % 修改章节标题 \chapter、\section 等的格式
titletoc      % 修改目录中各条目的格式。类似宏包有 tocloft 等
tocbibind     % 支持将目录、参考文献、索引本身写入目录项

抄录

  • 抄录:指将键盘输入的字符(包括保留字符和空格)不经过 TeX 解释,直接输出到文档;默认字体是等宽字体
  • 命令:\verb 后用两个同样的符号将抄录内容括住(不能是星号)
  • 环境:verbatim
  • \verb 以及 verbatim 环境很脆弱,不能隐式地用于自定义环境,也一般不能用作命令的参数。
    • 宏包 verbatim 提供了更多的抄录支持
    • 宏包 fancyvrb 提供 \SaveVerb, \UseVerb 命令,以及便于实现居中的 BVerbatim 环境(置于 center 环境内即可)
    • 宏包 shortverb 支持以一对符号代替 \verb 命令
% 抄录命令
\verb|\date \author \title|

% 抄录环境
\begin{verbatim}
    ...
\end{verbatim}

代码

一般使用 listings 或者 minted 宏包

% 代码展示设置
\usepackage{listings}
% \lstset{...}
\lstset{tabsize=4, keepspaces=true,
    xleftmargin=2em,xrightmargin=0em, aboveskip=1em,
    %backgroundcolor=\color{gray!20},  % 定义背景颜色
    frame=none,                       % 表示不要边框
    extendedchars=false,              % 解决代码跨页时,章节标题,页眉等汉字不显示的问题
    numberstyle=\ttfamily,
    basicstyle=\ttfamily,
    keywordstyle=\color{blue}\bfseries,
    breakindent=10pt,
    identifierstyle=,                 % nothing happens
    commentstyle=\color{green}\small,  % 注释的设置
    morecomment=[l][\color{green}]{\#},
    numbers=left,stepnumber=1,numberstyle=\scriptsize,
    showstringspaces=false,
    showspaces=false,
    flexiblecolumns=true,
    breaklines=true, breakautoindent=true,breakindent=4em,
    escapeinside={/*@}{@*/},
}

排除错误

  • 常见的 LaTeX 错误信息:见 lshort-zh-cn.pdf 文件中附录 B.1 的内容
! Undefined control sequences.
# 使用了未定义的命令。拼写错误是原因之一;
# 也有可能是没有调用某个宏包,但用了该宏包定义的命令。

! LaTeX Error: Can be used only in preamble.
# 由于将必须用于导言区的命令在 \begin{document} 之后使用而产生。

其他

  • 文本上下标
% 不需要额外的宏包
\newcommand{\tsub}[1]{\textsubscript{#1}}
\newcommand{\tsuper}[1]{\textsuperscript{#1}}

\documentclass[options]{...} % 这里其中options可以有 Font size、Paper size、Page Formats、sides与openany等.

\pagenumbering 默认参数是阿拉伯数字

arabic: 阿拉伯数字;roman: 小写罗马数字;Roman: 大写罗马数字;alpha: 小写英文字母;Alpha: 大写英文字母

假设在前言部分采用罗马数字,在剩余的正文部分用阿拉伯数字,则在前言部分使用命令 \pagestyle{roman},随后在新的章节后面采用 \chapter{…}\pagenumbering{arabic},还可以在后面接 \setcounter{page}{number} 来设定起始页码.

\pagenumbering{arabic}\setcounter{page}{2}
% 附录部分的标题和编号设置
% 会报该命令弃用的错
\CTEXsetup[name={附录},number={\Alph{section}}]{appendix}

30$\,^{\circ}$ 三角形     % 角度

37$\,^{\circ}\mathrm{C}$ % 摄氏度

LaTeX 默认在 \chapter\section 等章节标题命令之后的第一段不缩进(和 Typst 一样);ctex 宏包和文档类默认按照中文习惯保持标题后第一段的首行缩进

\textgreat  \textless  % 大于号,小于号

% 弹性长度
12pt plus 2pt minus 3pt % 表示基础长度为 12pt,可以伸展到 14pt,也可以收缩到 9pt

\\[6pt]  \\*[6pt]  % 在段落内的两行之间增加垂直间距

进阶

自定义命令

  • 自定义命令使用 \name{arg1}{arg2} 来调用

  • LaTeX 不允许使用 \newcommand 定义一个与现有命令重名的命令。如果需要修改命令定义的话,使用 \renewcommand 命令,其语法与 \newcommand 相同。

  • 带星号的命令称为短命令,其中参数不能有换段或空行,否则编译报错,但是短命令有利排错

  • 在命令中如果包含数学命令,那么这条命令只能⽤于⽂本模式,不能⽤于数学模式(因为在数学模式中会被多加了⼀层 $ $ 导致报错)。所以,在定义数学命令时,使⽤ \ensuremath{code} 来定义,这样的命令在数学模式中时 code 本⾝,在⽂本模式中时 $ code $

% 定义新命令
\newcommand{name}[num]{def}
\newcommand*{name}[num]{def}

% name - 带反斜线,必须符合命名规则
% num - 命令参数数量,最多 9 个,默认为 0,即不带任何参数
% def - 命令具体定义,涉及到参数时使用 `#n` 表示第 n 个参数。

% 修改已有命令
\renewcommand{name}[num]{def}
\renewcommand*{name}[num]{def}

% 命令未定义时,相当于 \newcommand;命令已定义时,沿用已有定义
\providecommand{name}[num]{def}

% 在常宏包和类文件的开发中
% \DeclareRobustCommand 与 name 间可以不用花括号
\DeclareRobustCommand{name}[num]{def}


% https://github.com/0382/util/blob/main/latex/physics.tex
% 摄氏度
\newcommand{\celsius}{\mathrm{^o\! C}}

% 量子力学 bra ket 符号
\newcommand{\bra}[1]{\langle{#1}|}
\newcommand{\ket}[1]{|{#1}\rangle}
\newcommand{\braket}[2]{\langle{#1}|{#2}\rangle}

% 尖括号平均值
\newcommand{\anglemean}[1]{\langle{#1}\rangle}

% 实数虚数
\renewcommand{\Re}[1]{\mathfrak{Re}(#1)}
\renewcommand{\Im}[1]{\mathfrak{Im}(#1)}

% 三种矩阵简写
\newcommand{\pmat}[1]{\begin{pmatrix}#1\end{pmatrix}}
\newcommand{\bmat}[1]{\begin{bmatrix}#1\end{bmatrix}}
\newcommand{\Bmat}[1]{\begin{Bmatrix}#1\end{Bmatrix}}

% 绝对值和范数
\newcommand{\abs}[1]{\vert #1 \vert}
\newcommand{\norm}[1]{\Vert #1 \Vert}

自定义宏包/文档类

参考:


自定义宏包

  • 自定义宏包/文档类门槛较高

  • 若定义了很多新的环境和命令,文档的导言区将变得很长,这种情况下,可以建立一个新的 LaTeX 宏包来存放所有定义的命令和环境,然后在文档中使用 \usepackage 命令来调用自定义的宏包

  • 自定义宏包的基本工作就是将原本在文档导言区里很长的内容拷贝到 .sty 文件中

  • 在宏包中调用其它宏包:LaTeX 允许在自己编写的宏包中调用其它宏包

% 该命令应该放在自定义 .sty 宏包中的最前面
\ProvidesPackage{package}  % package 需要和宏包的文件名一致

自定义文档类

  • .cls 作扩展名,可以像调用宏包那样调用一个基本的文档类
\ProvidesClass{class}

\RequireClass[...]{class}

\LoadClass[...]{class}

\RequirePackage[...]{package}  % 与 \usepackage 用法一致;在 .cls 文件中推荐使用

LaTeX 可定制的一些命令和参数

  • 标题名称/前后缀:可以用 \renewcommand 来修改
    • 使用 ctex 宏包或文档类时,表中的标题会修改为中文标题
  • 长度:可用 \setlength 来修改

image.png

image.png


模板


问题

\documentclass{article}[draft]

subdividing - biblatex: reference both by chapter and at the end of the book - TeX - LaTeX Stack Exchange

% 此方法使用 ctexart 文档类会报错
\documentclass{article}
\usepackage{ctex}
\usepackage[
    backend        = biber,
    bibencoding    = utf8,
    refsegment     = section,  % chapter
    style          = gb7714-2015,
    firstinits     = true,
    isbn           = false,
    doi            = false,
    url            = false,
    clearlang      = true,
    defernumbers   = true,
]{biblatex}
\addbibresource{biblatex-examples.bib}

\title{分节生成参考文献}

\begin{document}

\maketitle

\tableofcontents

\section{第一节}

第一节文献引用 \cite{wilde}
\printbibliography[segment=\therefsegment,heading=subbibliography]

\section{第二节}

第二节文献引用 \cite{cicero}
\printbibliography[segment=\therefsegment,heading=subbibliography]

\printbibliography

\end{document}
  • 不同期刊的文献格式转换?(具体的期刊不行;可用不同期刊的 LaTeX 的模板)

% 使参考文献字符居中
\titleformat{\section}{\centering\Large\bfseries}{\thesection}{1em}{}

% 添加 "附录" 字符
% 该操作并不能使目录中也添加 "附录" 字符
\titleformat{\section}{\centering\Large\bfseries}{附录~\Alph{section}}{1em}{}

% 使 section 标题左对齐
\titleformat{\section}{\raggedright\Large\bfseries}{\thesection}{1em}{}