本文将会介绍笔者在完成毕业设计(论文)中遇到的一些坑以及发现的可以提高效率的方法。笔者将会以提问+回答的方式来行文。本文面向具有一定 LaTeX 经验的用户,如果您第一次听说/接触 LaTeX,不妨移步文章末尾,在末尾处提供了许多优秀/经典的 LaTeX 入门教材。
广告时间:如果碰巧你也是工大的学生,在做毕业设计(论文)的时候不妨试试增强版的 hithesis
LaTeX 应该怎么读?
LaTeX, which is pronounced «Lah-tech» or «Lay-tech» (to rhyme with «blech» or «Bertolt Brecht»), is a document preparation system for high-quality typesetting.
LaTeX 如何拼写?
- LaTeX
- latex
- LaTex
- ...
有什么趁手的编辑器吗?
- VSCode
- LaTeX Workshop
为什么我插入的表格/图片没有乖乖呆在我插入的地方呢?
导致这个问题的原因是 LaTeX 的浮动体以及其复杂的布局算法。
解决方案是:
- 忘记在 word 中的
如下图
、如上表
的说法,而是使用\label
与\ref
的方式来引用表格/图片。 - 不去管它们,布局在哪儿就是哪儿,拥抱 LaTeX 的浮动体布局算法。
为什么我编译输出的 PDF 的目录是的空的/不正确?
你可能需要多编译几次。
常见的编译方案如:
1 | xelatex main.tex |
在 hithesis 中,编译方案为:
1 | xelatex main.tex |
为什么我输入了 xelatex .\main.tex
却报错了?
如果你使用 Windows 系统在编译时却遇到如下的报错:
1 | PS C:\Users\Username\Desktop\hithesis> xelatex.exe .\main.tex |
这是因为 tex 无法识别参数中的 .\
,命令修改为 xelatex main.tex
或者 xelatex main
即可。
如何插入三线表
1 | \begin{table}[htbp] |
表格内容如何自动换行?
1 | \begin{tabularx}{\textwidth}{lp{3cm}} % 第一列左对齐,第二列占据 3 cm |
如何在论文中插入代码块?
插入代码块一般有两个模块可以使用:lstlisting 与 minted。
lstlisting
可以直接使用,但是功能较为简陋。minted
依赖于 Python 以及 Python Pygments, 可以直接使用pip install pygments
进行安装,并且需要将pygmentize.exe
加入环境变量PATH
中。 由于 minted 会直接调用外部命令pygments
, 因此在编译的时候需要添加-escape-shell
参数 (注意这里-escape-shell
中只有一个-
而不是一般常见的--
)。 另外 Minted 的功能更加全面,例如添加行号、支持过长的行自动换行、高亮制定行以及设置行号的起始值等(具体可参考文档texdoc minted
)。
使用 lstlisting
宏包
1 | \begin{lstlisting} |
使用 minted
宏包
1 | \begin{minted}[breaklines,linenos,highlightlines={3-4,6-7},firstnumber=1]{python} |
如何在论文中插入算法伪代码?
笔者暂时未找到合适的伪代码宏包,可临时使用流程图代替(关于如何插入流程图请见后文)。
如何在论文中插入并排图片?
在插入并排图片的时候笔者遇到的最大的坑就是 LaTeX 中的换行机制。 在 LaTeX 中,想要另起一行有多种方式(如:在 tex
文件中增加一个空行;输入 \
等)。因此如果需要插入 M
行 N
列的图片,只需要在第 N
个图片插入完成后,增加一个空行即可实现多行图片排列。
笔者在这里坑了好久,究其原因还是因为经常写 Python
,在 Python
语言的规范中,函数与函数之间最好有空行,笔者就直接把这个规范迁移到了 tex
文件中,因此导致了结果不符合预期的情况。
下面给出两个例子
1 | % 插入两行两列的图片,带子标题 |
如何在论文中插入矢量图(如:流程图、系统架构图、UML图等)?
正牌做法应该是使用 Tikz
来进行图像的绘制。
但是笔者暂时没有充足的时间对其进行学习,因此采用了一种较为取巧的方法,下面对这种方法进行详细介绍。
ProcessOn 是一个在线协作绘图平台,为用户提供最强大、易用的作图工具!支持在线创作流程图、思维导图、组织结构图、网络拓扑图、BPMN、UML图、UI界面原型设计等。ProcessOn 在线画图比较舒服,也可以对节点进行批量对齐,和 draw.io 类似,创作结束之后可以导出为各种格式(如 SVG/PNG 等)。 该平台免费用户可以创建的文件数量有所限制,可以通过邀请好友、分享自己的作品等来扩充容量。
InkScape 是一款开源矢量图形编辑软件,与Illustrator、Freehand、CorelDraw、Xara X 等其他软件相似。
具体步如下:
- 在 ProcessOn 上绘制出所需的图(所见即所得,简单高效)
- 在 ProcessOn 上导出为 svg 格式
- 使用 InkScape 中打开导出的 svg 文件
- 调整 InkScape 文档属性(CTRL+SHIFT+D),选择缩放到页面内容
- 在 InkScape 中将该 svg 文件另存为 PDF 格式
- 使用 LaTeX 的 includegraphics` 命令来导入对应的图(矢量图)
如果学校没有提供校徽/Logo的矢量图应该怎么办?
由于笔者所在的学校官方并没有提供 LaTeX 模版,笔者经过一番搜索也没有找到学校 Logo 的矢量图,再加之实在是没有时间重新绘制,因此只好出此下策,具体方法如下:
- 首先在学校的官方网站中找到 Logo 的图片资源(一般是 PNG 文件),尽可能找清晰度较高的。
- 下载之后使用 Photoshop 把不需要的背景删掉,得到一个透明底纯黑色 Logo 的 PNG 图像。
- 使用 TeXLive 自带的工具
bitmap2eps.exe
对处理后的图片进行转换。 - 在图像文件上点击右键,打开方式,选择
bitmap2eps.exe
,运行结束后会在被转换的 PNG 文件的同一目录中生成 eps 文件。 - 然后就可以在 tex 文件中使用
\includegraphics[]{}
命令来引入该 eps 文件了。
eps 是用 PostScript 语言描述的一种 ASCII 图形文件格式,在 PostScript 图形打印机上能打印出高品质的图形图像,最高能表示32位图形图像。
在一些教程中提到:不要再使用 eps 文件(笔者暂时还没有弄清楚为什么,因为教程里也没有说明原因,猜测可能是 eps 技术已经过时了的缘故?),而推荐使用 PDF 来插入矢量图。 但由于 hithesis 中本身学校的 Logo 与毕业设计(论文)的标题都使用了 eps 文件,这里也继承这种做法。
报错 ! Missing $ inserted.
检查是否输入了下划线。
变量名中有下划线,LaTeX 不能正确显示怎么办?
默认情况下,LaTeX 会将下划线解释为数学模式,笔者提供两种解决方案。
方案一(推荐)
1 | get\_all\_token |
方案二(慎用)
1 | \usepackage{underscore} |
方案二请慎用,笔者因为使用了方案二导致 hithesis 编译不通过,卡了好久。不得不吐槽 LaTeX 的错误报告机制简直就是一坨屎,报错乱七八糟完全找不到问题出在什么文件的哪个地方。(恶心得我想吐,呕!)
遇到了奇怪的问题,应该遵循什么样的流程来解决?
- 查看终端错误日志查看编译器的输出日志,由于 LaTeX workshop 的默认配置中添加了 `` 参数,导致编译器在第一次出错之后不会立即停止,这样得到的报错信息会非常混乱(不得不吐槽 TeX 的报错信息,非常难看(不容易定位关键信息))。因此尽可能在外部终端中手动编译。
- 阅读文档(Read the Fucking Manual)texdoc [package name]大部分的情况下,遇到报错可能是你没有仔细阅读对应的文档,导致对某些包的使用方式错误。
- 求助身边的师兄/姐
- LaTeX 工作室 - 问答社区
- Stack Exchange
如何加快编译速度?
笔者暂时的做法是在逐章节编译,即在编写某一个具体章节的时候在 main.tex
中将对其他章节的引用全部注释掉。
LaTeX 与 Word 以及 LaTeX (Beamer) 与 PPT 以及 LaTeX 与 Markdown 有些哪些区别呢?
用一句话来概括大概就是:
所见即所得与所见即所想这两种思想的区别
- Word 与 PPT 的缺点
- Word 与 PPT 对数学公式的支持并不好(不容易编辑与修改)
- PPT 在制作的时候没有良好的交叉引用与设置目录的功能(说白了就是对结构化的支持非常差)
- Markdown 的优点
- 简易(同时也是缺点)
- 支持一定程度的结构化(同时也是缺点)
- 插入图片非常方便
- 插入代码非常方便
- 某些编辑器的功能可以扩展(例如添加绘制流程图的功能)
LaTeX 有那些缺点呢?
- LaTeX 的语法有点啰嗦(功能强大和语法简洁的互斥性),语法不如 Markdown 简洁(例如:插入代码,在 Markdown 中只需要使用三个反引号标记代码段的边界即可;LaTeX 中通常需要比较复杂的设置(如果你使用的是 Minted 并且想要高亮具体范围的行的话)
- 插入图片比较麻烦,相比于成熟的 Markdown 编辑器可以直接从剪切板自动插入图片,LaTeX 需要将图片首先保存到硬盘,接着使用特殊的语法(
\includegraphics
)引用该图片,并且通常情况下需要手动调整图片尺寸。 - 不支持动图(主要在 Beamer 中,对标 PPT)
- 想自定义模版的显示效果比较麻烦(不像 PPT 那样可以直接修改,并且所见即所得)
- 编译慢
- 报错非常用户不友好(看得人眼瞎)
- 不同的宏包有兼容性问题
如何判断当前场景是否适合使用 LaTeX?
- 适合使用 LaTeX 的场景
- 涉及大量数学公式(公式和)
- 大量参考文献需要进行引用
- 对排版的格式有严格要求(如:期刊、会议等论文投稿,毕业设计论文等)
- 涉及大量交叉引用
- 适合使用 Beamer 的场景
- 教学(尤其是理论教学,如数学课)
- Slides 中有大量数学公式(击中 PPT 对数学公式支持差的软肋)
- Slides 中图片较少
- 在教学结束后希望可以根据 Slides 生成讲义分发给听众
- 教学(尤其是理论教学,如数学课)
- 适合使用 PPT 的场景
- 为客户做汇报(如:科技公司发布会)
- PPT 中需要展示动图/视频等
- 没有特别需要页面间交叉引用的场景
- 适合使用 Word 的场景
- 学校/公司明确要求使用 Word
- 适合使用 Markdown 的场景
- 整理思路(草稿)
- 技术文档
总之,要在不同的场景选择最合适的工具。
笔者遇到了哪些还未解决的问题?
- Beamer 包与 hyperref 包的冲突在 Beamer 中,如果想要引用的 URL 中存在 Hashtag 部分,那么在编译的时候会报错。 如果手动将 URL 中用于标记 hashtag 的井号(
#
)进行 URL 编码,则可以通过编译,但是%
会被二次编码成为%2523
,导致原本想要引用的 URL 不能正确打开。(场景:引用 GitHub 仓库中某段指定行号的代码块)如:https://github.com/WangYihang/hithesis/blob/master/main.tex#L11-L13 - minted 自动换行
当使用 Beamer (不确定其他文档类是否存在相同的问题)的时候并且某一行代码过于长(大约超过两倍 \textwidth)以至于需要进行两次以上换行才可以正常显示的时候,minted 会错误地只进行一次换行。
LaTeX 有哪些高质量的学习资料?
- 视频教程
视频教程
推荐 LaTeX 工作室 的教程。
https://www.bilibili.com/video/BV1s7411U7Pr
https://www.bilibili.com/video/BV1r4411o7KJ
书籍/文字资料
- 复旦大学 - 现代 LaTeX 入门讲座 - 曾祥东.pdf
- 漫谈 LaTeX 排版常见概念误区.pdf
- 清华大学未来通信兴趣团队 - 如何使用 LaTeX 排版论文.pdf
- 上海交通大学致远学院 LaTeX 资料.zip
- 武汉大学 - LaTeX 入门教程.zip
- 西北农林科技大学 - LaTeX 科技排版 - 耿楠.zip
- 一份不太简短的 LaTeX2e 介绍 - Tobias Oetiker.pdf
- Beamer Appearance Cheat Sheet.pdf
- Combining LaTeX with Python.pdf
- FontAwesome5 Icons.pdf
- Fun with Beamer.pdf
- India Tex users Group - LaTeX Tutorials.pdf
- LaTeX 流程图.zip
- LaTeX 入门 - 简版 - 刘海洋 - 只有一章多一点.pdf
- LaTeX 入门 - 刘海洋.pdf
- LaTeX Notes 雷太赫排版系统简介 - 包太雷.pdf
- Tips and Tricks with Beamer for Economists.pdf