4  LaTeX 使用与调试技巧

4.1 总述

原本在写这一章之前,我还想写一个“Word技巧大全”之类的一章,后来想想自己的 Word 水平只是停留在写“通知”的水平,只知道格式刷大法,拿着格式刷一股脑往下刷来排版,就不来这里丢人现眼,只能从我熟悉的工具开始介绍。

相比于 Word、Markdown、R Markdown这类新式工具,LaTeX 像极了老派的气宗大师,以无招胜有招,招招困难,但是招招有效。在这里,我不打算介绍 LaTeX 的基本配置(网上这类资料实在太多太全了,各个宏包的手册也很全面),只介绍一些与高效写作相关的技巧及理念。

我习惯用 LaTeX 来写作,习惯了用 LaTeX,这个和我是一个程序员有关,也和我喜欢自己动手有关。

首先需要搞懂基本的语法,如何配置 LaTeX 环境、如何编译 LaTeX 环境,以及如果你需要调整自己的 LaTeX 模板,对于一些语法如 usagepackage 和 documentclass 是什么含义是基本需要弄懂的。以推荐入门书籍一节我会再详细说一下 LaTeX 入门资料。

使用 LaTeX,千万不要掉入一天到晚排版的怪圈,记得你的核心工作依然是内容,格式的话,选用一个基本的、最朴素的模板即可。如果你的书要出版,那么排版的工作将来应该交给更专业的人去做;如果你的书不出版只是给自己看,那么排版远没有你想象的那么重要。

选定一个模板,每次都用这个模板来工作。除此之外,就必须懂一些基本的 LaTeX 排版技能。

为了写得舒服,必须要对 LaTeX 文档进行一些简单的基础配置。下面就是一些 LaTeX 基础使用技巧的总结。

4.2 推荐入门书籍

用 LaTeX 和写程序一样,最好是能系统地入门,不推荐网上随便 Google 一些文章来学习,推荐正儿八经地通过看书来入门。作为首先中文的阅读者,首推这本入门教材:

《LaTeX入门》,刘海洋著(刘海洋 2013)

刘海洋. 2013. LaTeX入门. 北京: 电子工业出版社.
LaTeX3 PROJECT TEAM and others. 2006. LaTeX2ε for class and package writers》, 33. https://www.latex-project.org/help/documentation/clsguide.pdf.

对于 LaTeX 的基本使用过关后,如果还需要对 LaTeX 语法进行学习,那首先应该读一读 LaTeX2ε for class and package writers(LaTeX3 PROJECT TEAM and others 2006),搞懂一些基本概念,在需要使用各种宏包的时候,继续查阅宏包手册。

对于中文写作,LaTeX 的配置会特殊一点,这时候,推荐直接使用 CTeX 套装

在写作过程中,可能会碰到的一些字号问题需要查一查: 1. 字体参考:http://applied-r.com/latex-font-styles/ 2. 字体参考2:https://en.wikibooks.org/wiki/LaTeX/Fonts 3. 类似 cmr 这种 fontcode 缩写的含义:https://www.overleaf.com/learn/latex/Font_typefaces 4. TeX的字号缩写:https://texfaq.org/FAQ-ltxabbrv

4.3 配置技巧

简单说一下必须的配置及工具。

推荐版本:TeX Llive,跨平台,可以在线升级与更新

推荐编码器:Visual Studio Code,配合插件 LaTeX Workshop Visual Studio Code 因为是纯文本方式,经常会导致文本过长,一个屏幕显示不下(屏幕一分为二,一半显示LaTeX源码,一半显示pdf文件),这时可以使用Visual Studio Code 的横向屏幕滚动很方便,用 Shift + 鼠标滚轮 即可实现屏幕的横向翻滚,也可以通过菜单设置“查看”==>“自动换行”,来在显示的时候自动换行。

版本管理:Git,Windows下推荐使用 TortoiseGit,LaTeX 是纯文本方式,就像写代码一样,最适合也必须采用版本管理工具来提升工作效率,方便对 LaTeX 配置进行随意的试验与修改又方便回溯。

如果你不愿意在本地机器上进行配置,直接使用 overleaf 的在线 LaTeX 写作环境也是一个非常好的选择,并且非常适合于在线协同写作。

4.4 写作技巧

大家把这些基本入门书籍翻一翻,LaTeX 基本的使用就算过关了,我这里就不再啰嗦一些基础的 LaTeX 使用问题,直接在这里谈一下一些写作过程中,有助于写作的小技巧。

4.4.1 在正文里标出 TODO 清单

1) 使用自带的 TODO 命令

在写长篇内容的时候,总有一部分内容,是你想稍后再补充的,这个时候,很多人习惯在正文里用普通字体写上一段 TODO 字样。这样做,很简单,但是容易错过,在 LaTeX 里,可以用 TODO 功能来高亮这部分待办清单:

\documentclass{article}
\usepackage{todonotes}
\begin{document}
\todo{default to-do}This is text that needs some attention.\\\todo[inline]{Default inline to-do}
\todo[inline, color=green]{Green inline to-do}
\todo[inline, color=green!40]{Light green inline to-do}
\todo[inline, color=red]{Red inline to-do}
\todo[inline, color=red!40]{Light red inline to-do}
\end{document}

会输出如下字样:

TODO LIST

这样在你后续需要继续修订内容的时候,TODO 清单就会显得非常显眼。

2) 创建自己的命令

比如说,用下面的代码,创建自己的 myworries 命令,专门用来标明一些额外的信息:

\documentclass{article}
\usepackage{xcolor}
\newcommand\myworries[1]{\textcolor{red}{#1}}
\begin{document}
Here is some text.
\myworries{But I'm worried about the text}
\end{document}

后面你把 myworries 标注的内容全改好以后,就可以直接在 newcommand 下面加一行命令,把 myworries 命令不起作用,就不用一行一行去删内容了:

\newcommand\myworries[1]{\textcolor{red}{#1}}
\renewcommand\myworries[1]{}

3) 在旁边使用旁白

直接用旁白命令,也可以在你需要标注的内容旁边,醒目的标注上你需要后续的 TODO 内容:

\marginpar

4.4.2 拆成多个章节来写

对大部头的书籍来说,一本书的内容,应该拆成多个 LaTeX 文件,比如说,一章一个 LaTeX 文件,然后在一个总的 LaTeX 文件里把这些文件包含进来。

一般来说 LaTex 提供了两种包含子文件的方法:

\input

\include

一般编写书籍的时候使用 \include,并且一章一个文件,因为它会自动给每个被 include 的部分创建一个新页,而写论文的时候多用 \input。需要提一下,导言区只需要宿主文件有就可以了,被包含的文件会沿用它。

把源文件拆成若干文件处理,有以下好处:

  1. 可以在每个子文件中仅关注少量内容,便于集中精力进行撰写。
  2. 可以通过用“%”注释操作,将暂时不关注的 input 或 include 语句注释,以减少当前参与编译的内容,加快编译速度或是用“注释大法”缩小错误定位范围,以定位错误、分析错误和解决错误。

除了把源文件拆成若干文件以外,还有以下使用注意事项:

文件使用 UTF-8 编码: 所有 .tex、.bib、.sty、.cls 等纯文本文件源代码文件,请务必使用UTF-8编码。

使用独立的文件夹管理内容: 强烈每当开始一个新的排版任务,就建立一个独立文件夹来存储该任务相关的所有文件,比如图片存放到一个目录里。

文件名及其路径中不要使用空格和中文: 由于 LaTeX 发行版是开源免费软件,类似TeXStudio的编辑器IDE也是开源免费软件,一般在处理文件名及其路径名时,往往无法正确解析带有空格和非英文的名称。因此,强烈建议在文件名及其路径中不要使用空格和中文。

文件命名具备可解读性: 和写代码使用的变量名一样,建议各个文件名取名需要有一定的含义,起码让你自己一看就知道是什么含义,禁止使用类似“a.tex”、“b.tex”、“c.bib”、“d.png”等这不知所云的文件命名,“charpter01.tex” 就好多了,而 “chapter-01-begine.tex” 就更容易理解;同时,文件名也不宜过长,方便后续操作。

文件使用相对路径: 在使用这些文件时,一般需同时指定该文件的路径,需要强调的是最好不要使用绝对路径,只使用当前文件夹及其子文件夹中的文件。如果需要的文件在子文件夹中,则需要用“/”分割路径中的各级文件夹(禁止使用“\\”分割)。

4.4.3 每个章节单独引用参考文献

对长篇幅的技术书籍来说,如果只是在书最未尾放一个参考文献的章节,翻阅起来太不方便。这个时候,最好的方式,是在每一章后面放上一个参考文献的内容,可以通过下面两步来实现:

在引言区加入下面的代码:

\usepackage[square,numbers,sectionbib]{natbib}
\usepackage{chapterbib}

然后在每一章最后加入参考文献:

\bibliographystyle{plainnat}
\bibliography{../Bibliography}

4.4.4 类似“小知识”环境建立

很多书籍里都一些编外内容,比如说“小知识”、“插曲”等,通过不同排版风格标示出来,以显示趣味性。类似这种内容,可以使用定理环境,去掉编号即可:

\let\proof\relax
\let\endproof\relax
\usepackage{amsthm}
\newtheorem*{storyn}{小知识}

\begin{storyn}
小知识的内容
风格也可以自定义
\end{storyn}

4.4.5 参考文献的格式

通过设置 bibliographystyle 就可以达到上述目的,BibTeX 自身已具备排序的功能,而且可以选择自己想要的排序方式。BibTeX 已自带有 8 种样式,分别如下:

  1. plain:按字母的顺序排列,比较次序为作者、年度和标题。
  2. unsrt:样式同plain,只是按照引用的先后排序。
  3. alpha:用作者名首字母+年份后两位作标号,以字母顺序排序。
  4. abbrv:类似plain,将月份全拼改为缩写,更显紧凑。
  5. ieeetr:国际电气电子工程师协会期刊样式。
  6. acm:美国计算机学会期刊样式。
  7. siam:美国工业和应用数学学会期刊样式。
  8. apalike:美国心理学学会期刊样式。

比如,按照 cite 顺序自动排序文献编号,用

\bibliographystyle{unsrt}

这段代码。

如果需要在参考文献里显示网址等url,可以使用

\bibliographystyle{unsrturl}

或是

\bibliographystyle{plainurl}

,我不确定是不是所有的 bibliographystyle 都可以在后面加上url来进行参考文献url显示,这个需要大家自己试试。

4.4.6 引用图片

一般来说插入图片这样弄:

% 添加包
\usepackage{graphicx}

% 需要添加图片的地方
\begin{figure}[htp]
\centering % 图片居中
\includegraphics[width = 8.3cm]{figures/figure_1.png}
\caption{The caption of this figure.}
\label{fig:figure1label}
\end{figure}

% 在中文中需要引用图片的地方
如图 \ref{fig:figure1label} 所示

如果需要图片和文字页面同宽,可以使用下面的代码:

\begin{figure}[htp]
  \centering % 图片居中
  \includegraphics[width=1.0\textwidth]{video-compressor}
  \caption{视频压缩}
  \label{fig:video-compressor}
\end{figure}

可以用 scale 参数来直接按原始图像的尺寸来进行缩放:

\begin{figure}[htp]
  \centering % 图片居中
  \includegraphics[scale=0.8]{video-compressor}
  \caption{视频压缩}
  \label{fig:video-compressor}
\end{figure}

4.4.7 公式的使用

1) 用 label 来引用公式

\begin{equation} \label{test}
x^2 + y^2 = z^2
\end{equation}

2) LaTex多行公式显示一个编号

可以用 “\\” 插入每一行公式后面不编号,这样多行公式就可以只用一个编号:

\usepackage{amsmath}
\begin{equation} \label{coordinate-convertor}
\begin{aligned}
    x = rcos(\theta)\\
    y = rsin(\theta)
\end{aligned}
\end{equation}

如果这多行公式需要靠左对齐,可以在每一行公式的开头,用上符号“&”。

公式的引用可以用 或 ,前者会把公式标题用括号括起来,更美观,也符合一些style。

在等号处对齐,则只要把原来的 = 变成 &= 就可以,例如:

$$
\begin{aligned}
    x_square(t) &= \frac{4}{\pi} \sum_{k = 1}^{\infty} \frac{\sin((2k-1)2\pi ft)}{(2k-1)}    \\
    &= \frac{4}{\pi} ( \sin(2 \pi ft) + \frac{1}{3} \sin(6 \pi ft) + \frac{1}{5} \sin(10 \pi ft) + \cdots )
\end{aligned}
$$

“&=”代表在“=”处对齐, “”代表此行不参与自动编号,“”表示换行。

3) 强制求和号的上下限在“上下”而不是在“旁边”

在用 LaTex 的 _{}^{} 时,行内公式效果为:\sum_{2}^{3},行间公式效果正常:

\sum_{2}^{3}

在 equation 环境中,其效果都和行内公式里的效果一致!

如果想在任意环境下求和号上下限都在”上下”,可以在公式里多加一个

\limits

限制,比如说下面的代码:

\sum\limits_{2}^{3}x

的效果就会和行间公式一样,上下限在求和符合的上面和下面,效果:\sum\limits_{2}^{3}x

4.4.8 章节的交叉引用

在写篇幅很长的专业书籍时,前后章节的交叉引用将是必不可少的需要,人工处理这种交叉引用显然不现实,因为在技术写作的过程中,对章节的调整非常频繁,这个时候必须使用 LaTeX 的交叉引用功能。

如果我想生成如下面的一段章节引用:

对于时域的经典处理方法,我们会在第6章“音视频频域处理举例”进行详
细介绍。

那就必须:

  1. 使用 nameref 包,如果使用了 hyperref 包则可以不再显式引用 nameref:
%% 可以使用 hyperref 包来进行章节交叉索引
\usepackage{hyperref}
%% 或显式使用 nameref
\usepackage{nameref}
  1. 给需要引用的章节,打上标签:
\chapter{音视频频域处理举例} \label{chap:frequency-domain}
  1. 在需要引用的地方,可以根据需要,引用章节号或是章节名称:
对于频域的经典处理方法,我们会在第 \ref{chap:frequency-domain} 章“\nameref{chap:frequency-domain}”进行详细介绍。
  1. 甚至于如果你是进行英文写作,连 chapter 这几个字都可以省略不打:
对于频域的经典处理方法,我们会在 \autoref{chap:frequency-domain}“\nameref{chap:frequency-domain}”进行详细介绍。

上面的代码显示为:

对于频域的经典处理方法,我们会在 Chapter 6 “\nameref{chap:frequency-domain}”进行详细介绍。

4.4.9 对页码或章节的具体引用

在长篇著作的引用中,一般需要具体到第几页、或某一单某一节这样的表示方式,也可以很方便实现该表示,比如页码表示如下:

\cite[p.~17]{wulizhong2010yinpin}

4.5 制作封面

如果你的书需要出版,那需要专业的人来设计封面,毕竟美观、得体、版本都是其中重要的因素。出版的书籍,对封面的设计,有一套自己成熟的规则,这个完全可以交给专业人士打理。

如果你的书籍只是给自己看,或是给自己的团队使用,或是作为内部的参考资料,发布的方式也只是电子版本或是打印若干册作为案头参考资料,那为了打印方便以及辨识度高等理由,设计一个封面还是很有必要的,只是这个封面的要求并没有正式出版物那么高。

用 LaTeX 来制作封面,有许多技巧,你可以通过大量的绘图技巧完全交由 LaTeX 来生成封面图像。不过我这里,推荐一种最简单的方式,就是生成你封面的 png 图片,再转为 pdf 插入到你书籍的最开始页面。

  1. 找一个书籍封面的模板,填上书籍的相关信息,生成你书籍的封面图片。网上有很多免费的模板或是素材,只需要修改文字信息就可以生成相关的书籍封面;当然,你也可以请专业的美术人员帮你设计一个与内容更加贴近的主题封面。

  2. 生成书籍封面的 PNG 或是 JPG 图片。

  3. 把该图片转为 pdf 文件,比如最简单的方式就是使用程序 mogrify( imagemagick 自带的一部分)

mogrify -page A4 -format pdf bookcover.png
  1. 在源文件里,把这个 pdf 加入到你的书籍里:
\documentclass{article}
\usepackage{pdfpages}

\begin{document}
\includepdf{bookcover.pdf}
\end{document}

pdfpages 包有若干参数可以选用,可以根据自己的需要适当选取。

通过上述四个步骤,你就可以非常简单地给书籍添加上有特色、辨识度高的封面。

4.6 调试技巧

LaTeX 的本质是一组代码,需要进行编译,自然在代码不正确的情况下,会出现一大堆的编译错误,那如何进行高效的错误排查,也算是一门学问,本小节就来简单探讨一下 LaTeX 的调度技巧。

4.7 一些资源

Tufte-LaTeX:Tuft 风格的模板,即书的旁边有很多旁白,类似《具体数学》也是这种排版风格。

4.8 小结

本章对 LaTeX 的基本使用作了探讨,并分享了本人在 LaTeX 使用中的一些习惯性配置。