本文是在笔者为班级同学编写的指南的基础上修改而来的。
前言
LaTeX 是目前主流的计算机排版系统之一。目前社区维护了一份合工大毕业论文的 LaTeX 模板(以下简称“模板”):https://github.com/HFUTTUG/HFUT_Thesis 考虑到大部分同学对 Word 都谈不上精通,使用 LaTeX 排版毕设论文,可以让你摆脱绝大多数格式问题的烦恼。
请记住,LaTeX 是可以速成的:其实这就是一种标记语言(在大多数情况下),而且模板已经帮我们做了最复杂的那部分工作,我们只需要往里面填入内容就可以了。从零基础到可以使用模板,我估计只需要半天时间。
编写环境
有两种办法:
- 用 OverLeaf,一个在线的 LaTeX 编辑网站,支持多人协作,免费版支持两人协作。
- 在本地装一个 LaTeX 发行版,然后用 VSCode 搭配 LaTeX Workshop 扩展来编写。你可以看 https://www.cnblogs.com/eslzzyl/p/17358405.html 这篇博客来安装。
考虑到大部分计算机专业的科研人员均能使用 LaTeX,前者可能是更好的选择。你可以把工作空间共享给你的指导老师,这样 Ta 就可以审阅了。后文将仅针对前者进行介绍。
使用模板
相信读者能够熟练地把 GitHub 仓库下载到本地——无论你使用 git clone
还是 Download Zip 功能。把 https://github.com/HFUTTUG/HFUT_Thesis 这个仓库下载到本地。
然后,把这玩意打包(.zip
)上传到 OverLeaf:https://cn.overleaf.com/project 就在左上角的“创建新项目-上传项目”。上传后,OverLeaf 会自动创建一个工作空间,然后你可以看到编辑界面。
OverLeaf 的模板库里是有这个模板的,但是我看更新时间比较早了,感觉似乎不是最新的,保险起见我们不用。
模板在本地编译时是很方便的,只需要 make
一下就行了。但在 OverLeaf 中可能需要一些额外设置。点击左上角的“菜单”,找到“设置”部分,将编译器改为 XeLaTeX,TeX Live 版本选择最新,主文档选择 main.tex
。其他根据你的偏好即可。改好之后点击“重新编译”按钮进行编译,确保不会报错。
这个模板的源文件是按章节分类存放的。所有章节的源文件都在 chapters
目录中。有关你的题目、学号、导师等信息则在 hfutsetup.tex
中设置。你可以在 main.tex
中修改引入的章节。
hfutthesis-doc.tex
是模板的使用说明。你可以在本地根据 README 的说明来编译它。在 OverLeaf 中,你可能得修改“主文档”这个设置来编译它;你也可以从模板的 Release 页中下载到编译好的使用说明:https://github.com/HFUTTUG/HFUT_Thesis/releases/download/v1.0.4/hfutthesis-doc.pdf
基础
本文不会详细介绍 LaTeX 的基础知识。你可以通过以下资源快速入门。在使用时遇到的问题可以通过上网搜索或询问大语言模型来解决。
- 传说中的
lshort
——《一份(不太)简短的 LaTeX 2ε 介绍》:https://texdoc.org/serve/lshort-zh-cn.pdf 此为经典入门教程 - 刘海洋老师的一个入门讲座:https://www.bilibili.com/video/BV1s7411U7Pr 刘老师在北大有过一个 LaTeX 讲座,令我印象深刻,但我已经找不到了,这个应该也差不多
- 刘海洋老师的书《LaTeX 入门》,不过这书有点厚了,还是看前两个吧 ╰(°▽°)╯
实际上需要学习的东西很少,我概括成以下内容:
概念
LaTeX 是一种编译式的排版系统:输入源文件(.tex
格式),输出 PDF。
实际上还可以输出更复杂的格式,但那些我们不管。
你应该在 .tex
文件中编写的你的文档内容。
正文
在 \begin{document}
和 \end{document}
之间的部分就是你的正文。这里面的文字在编译后会呈现在 PDF 文档中。
检查模板的 main.tex
文件的正文部分,你会看到形如 \maketitle
、\tableofcontents
之类的东西,它们是定义好的宏。你当然熟悉 C/C++ 中宏的概念。其实就是文本替换。
你可能会发现模板的正文(main.tex
)中有形如 \input{chapters/abstract.tex}
之类的东西。这种 \input
命令和宏差不多,它们会把自己用引用的 .tex
文件的内容替换掉。这样,你在那些 .tex
文件中编写的内容就进入文档了。\input
允许你将一整个文档拆分为若干个 .tex
文件。例如模板就按章进行了拆分。
大纲
较长的文档必须正确使用大纲来组织内容并生成目录(对 Word 来说同样如此)。LaTeX 中有一组大纲命令,在正文中,一个大纲命令A之后、文档结束之前或下一个大纲命令B之前的正文属于大纲A的内容。在模板中,常用的大纲有三级:
\chapter
命令:章,对应一级标题 1\section
命令:节,对应二级标题 1.1\subsection
命令:小节,对应三级标题 1.1.1
在生成目录时,以上三个级别的大纲标题将自动编入目录。在 LaTeX 中,目录的生成是完全自动化的,几乎不需要任何干预。
如果你在一个小节中还想进一步分割大纲,那么你可以使用 \subsubsection
。但根据模板的设置,这个级别不会给编号,也不会进入目录。
你可能会想到什么。但是,确实没有
\subsubsubsection
这种东西。否则这样下去没完没了了。ƪ(˘⌣˘)ʃ
列表
无序列表
- 这是
- 一个
- 无序
- 列表
使用以下命令来构建无序列表:
\begin{itemize}
\item 这是
\item 一个
\item 无序
\item 列表
\end{itemize}
有序列表
- 这是
- 一个
- 有序
- 列表
使用以下命令来构建无序列表:
\begin{enumerate}
\item 这是
\item 一个
\item 无序
\item 列表
\end{enumerate}
列表项的编号是自动的,你无需关系具体的编号取值。
顺便一提,列表是可以嵌套使用的,无序有序均可。但没什么用就是了。
图
LaTeX 的插图功能由 graphicx
宏包提供。宏包和库差不多,都是别人写好的一些代码,供我们直接使用的。使用 \usepackage{graphicx}
来引入这个宏包。这与其他语言的 #include
、using
、import
有些类似。不过模板已经帮我们引用好了。
使用以下的代码段来插图:
\begin{figure}[htb] % h表示优先在当前代码位置插入,t表示优先在某页的顶部插入,b表示优先在底部插入。三者优先级递减。
\centering % 水平居中放置
\includegraphics[width=\textwidth]{/path/to/your/figure} % 引入图片。[]中的内容表示图片与文本同宽。你可以在\textwidth前面加一个小数如0.7来调整图片的宽度。
\caption{在这里填入题注} % 题注。caption写在includegraphics的后面,因此题注就排版在图片的下方。如果你把caption往前提,那么就在上方。就这么简单。
\label{fig:your-label} % 这个是供你在文档的其他地方引用这个图的
\end{figure}
figure
环境是浮动(float)的,这表示该环境的内容不会严格在代码出现的位置插入,而是会根据上下文调整到合适的位置。一般 LaTeX 会帮我们处理好的。当然,也有强制禁止浮动体浮动的方法,如果需要,你可以上网搜到。
表
和图类似,也是一个浮动的东西。需要使用 tabular
或 tabularx
环境,嵌套在一个 table
浮动环境中。后文有一个生成表格的辅助工具。
交叉引用
注意到在插入图和表时,我们使用了 \label{}
命令,为图/表分配了一个引用名。在正文的其他位置,使用 \ref{引用名}
来引用你的图/表:
如图\ref{fig:your-label}所示
如表\ref{tab:your-label}所示
章节编号也是一样的。在大纲命令之后使用 \label
:
\section{国内外研究现状}
\label{aaaa}
% 其他正文
正如\ref{aaaa}节所介绍的那样,……
参考文献
最好搭配某种文献管理软件来使用,例如 Zotero。
LaTeX 使用一种称为 BibTeX 的工具来管理参考文献(当然也有其他的,但这个是最主流的)。你需要提供一个 .bib
文件,其中存放了你所有可能会引用的参考文献,将其存放在 bib
目录中。然后,你要在 main.tex
中找到这一行:
\bibliography{bib/xxx} % 参考文献使用 BibTeX 编译
将其改为你的 .bib
文件的目录。将文件名修改为你的文件。扩展名不是必须的。
绝大多数学术聚合网站(如谷歌学术、百度学术)和学术出版物网站(如IEEE Xplore)都会提供 BibTeX 格式的引用,因为 BibTeX 已经成为一种标准。你只需要找到对应的引用按钮,点击,然后引用信息就复制到你的剪贴板。将信息粘贴到 .bib
文件中即可。
在文档中,使用 \cite{}
命令(而不是 \ref{}
!)来引用一个参考文献。每个参考文献都有一个引用名,这名字在 .bib
文件中定义。如果你自己编写 .bib
文件,那么这个名字是你自己取的;如果你使用文献管理软件导出 .bib
文件,那么它们可能遵循某种特定的命名模式,如“第一作者的姓氏_标题首词_年份”,例如 vaswani_attention_2017
。
当你打出
\cite{}
命令时,OverLeaf 会帮助你补全引用名,很方便。
当你在文档中引用某个文献时,LaTeX 会自动为参考文献编号,并在文末的参考文献表中插入这个文献,还会自动建立编号到参考文献表项的超链接。在模板中,将会按照文献首次出现的顺序进行编号。一切都是自动化的,你只需要通过名字引用就可以了。关键是你要把名字和文献对应起来。
数学公式
网上应该有很多教程。
一些使用心得
关于图
当我们向 LaTeX 文档中插入图片时,总是希望图片是矢量的,这样在放大文档查看时,图片仍然可以保持清晰。我使用 PowerPoint 绘制论文中的图,那么有两种导出矢量图的方法:
SVG
在 PPT 中选中该图的所有形状,右键,点击“另存为图片”,在格式中选择 svg。但是我在尝试导出时总遇到导出图片不完整的问题,所以我放弃了。
注意,在引入 SVG 图片时,需要先引入 svg
宏包:
\usepackage{svg} % 建议放置在 hfutsetup.tex 中
然后使用 \includesvg{}
命令替代原有的 \includegraphics{}
命令。
大部分在线绘图工具应该都支持导出为 svg 格式。
你可能不知道,PDF也是一种矢量图格式。LaTeX 的 graphicx
宏包可以直接导入 PDF 格式,就像你导入 JPEG 或者 PNG 一样。
在 PPT 中点击“文件-导出-导出为 PDF”,在弹出的文件对话框中点击“更多...”按钮,在这里,你可以设置导出的页。仅导出自己希望导出的那一页即可。然后使用一些工具处理导出的 PDF,然后上传到 OverLeaf。
- PDF 裁剪工具:https://deftpdf.com/zh/crop-pdf 你可以将 PDF 中多余的白边裁剪掉。
- PDF 拆分工具:https://www.ilovepdf.com/zh-cn/split_pdf#split,range 如果你导出的 PDF 有不止一页,使用此工具来拆分。
LaTeX 中绘图的终极解决方案是 PGF/TikZ。这是一个极致复杂、极致强大的绘图宏包,但 PPT 对我们来说足够了。
关于表
有个工具 https://tableconvert.com/zh-cn/latex-generator 你可以先在 Excel 中输入数据,然后复制到这个工具里,就能得到 LaTeX 代码。
如果你的表太宽,导致超出了页面的宽度,你可能需要根据这个网页的指导来调整你的表格。https://tex.stackexchange.com/questions/332902/my-table-doesnt-fit-what-are-my-options/
关于代码
行内引用代码时,应该使用等宽字体。你可以使用 \verb||
来插入等宽字体。
关于公式
有个工具 https://latex.vimsky.com/
有个通过 OCR 技术扫描数学公式然后转 LaTeX 的工具:https://github.com/lukas-blecher/LaTeX-OCR
关于模板本身的问题
在使用模板的过程中,我也遇到了一些问题,这里集中记录一下。
bibtex 会议论文格式的问题
可参见:https://github.com/HFUTTUG/HFUT_Thesis/issues/62
当前版本的模板在引用会议论文时,参考文献表中会出现额外的[A]
标记。如果有审核老师认为此格式不正确,你可以从此处下载到修改过的bibtex样式表,然后替换掉模板包中的同名文件。感谢工大 LaTeX 交流群(904943223)的群友。
原创性和授权使用声明页中填入信息
这个页需要插入自己和指导老师的签名,以及签名时间。目前模板是不支持在该页插入内容的。有两种办法:
-
编译出 PDF,然后用 PDF 编辑工具来插入签名和时间。例如 https://www.ilovepdf.com/zh-cn/edit-pdf 这个工具。
-
直接修改模板(
hfutthesis.cls
)中这一页的代码,在里面插入内容。搜索“原创性和授权使用声明”,找到对应的位置,然后在自己对应的学位(bachelor
或其他)的代码中添加内容。以学士为例,进行以下修改(修改的原文已经被注释):\ifhfut@degree@bachelor {\centering\sffamily\fontsize{18bp}{18bp}\selectfont \textbf{毕业设计(论文)独创性声明}\par}% \vskip 1.0cm% \hfut@originality@bachelor\par \vskip 0.9cm% % 毕业设计(论文)作者签名:\hfill% 毕业设计(论文)作者签名:\includegraphics[width=0.15\textwidth]{student-signature.jpg}\hfill% % 签字日期:\hspace{3\ccwd}年\hspace{2\ccwd}月\hspace{2\ccwd}日\par 签字日期:2024年5月28日\par \vskip 2.33cm% {\centering\sffamily\fontsize{18bp}{18bp}\selectfont \textbf{毕业设计(论文)版权使用授权书}\par}% \vskip 1.0cm% \hfut@authorization@bachelor\par \vskip 1.0cm% \begin{tabular}{@{}p{6.5cm}p{6.5cm}@{}}% % 学位论文作者签名:& 指导教师签名:\\ 学位论文作者签名:\includegraphics[width=0.15\textwidth]{student-signature.jpg} & 指导教师签名:\includegraphics[width=0.15\textwidth]{teacher-signature.jpg}\\ % 签名日期:\hspace{3\ccwd}年\hspace{2\ccwd}月\hspace{2\ccwd}日 & 签名日期:\hspace{3\ccwd}年\hspace{2\ccwd}月\hspace{2\ccwd}日 签名日期:2024年5月28日 & 签名日期:2024年5月28日 \end{tabular}\par
注意有两处作者签名,一处指导教师签名。
插图清单和表格清单中的间距问题
可参见:https://github.com/HFUTTUG/HFUT_Thesis/issues/63
当前版本的模板会在插图清单和表格清单中不同章之间插入额外的间距,这是 CTeX 宏集的默认行为,但学校发布的《规范》中却没有这个间距,我在论文答辩时也有老师指出了这个问题。
解决方法:修改模板包中 hfutsetup.tex
文件,在该文件的任意位置插入以下代码段
\ctexset {
chapter/lofskip = 0pt,
chapter/lotskip = 0pt,
}
然后重新编译。
字体并非 Windows 标准字体
可参见:https://github.com/HFUTTUG/HFUT_Thesis/issues/57 以及 hfutthesis-doc.pdf
的“字体设置”小节。
在 OverLeaf 上编译的论文字体会和 Windows 下的中易字体(宋体、黑体、楷体、仿宋)有微小的不同。英文字体和 Times New Roman 也有微小的不同,等宽英文字体和 Courier 也有微小的不同。将 fontset
设为 windows
后编译报错,因为 OverLeaf 没有对应的字体。
解决方法:有两种办法
- 从任意一台 Windows 电脑中拷贝出上述 5 种字体(位置:
C:\Windows\Fonts
)上传到 OverLeaf,然后在论文模板中修改字体。 - 在本地安装 Tex Live,然后编译。如果 Tex Live 是安装在 Windows 系统中的,那就没有额外的问题;如果是安装在其他系统(包括 WSL)中的,那么需要从 Windows 电脑中拷贝上述字体到对应的系统中并安装这些字体。