使用VS Code和LaTeX撰写学位论文
2023-06-10

为什么使用LaTeX撰写学位论文

一般来说,撰写学位论文的软件有两类,一类是 Microsoft Word 或者 WPS 等富文本编辑器,另一类是 LaTeX 系列的纯文本撰写再编译的排版程序。Word 的优势在于所见即所得,调整字体,插入表格等操作可以随着操作立即在屏幕上显示出来,图形化界面排版也很方便。但是,Word 在处理几万字的,格式要求严格的学位论文时,对于绝大部分同学是非常挑战耐心的事情,如果 Word 掌握的不够,可能就会发生长文档排号前面后面乱了,插入图片文字乱了的窘境。而 LaTeX 作为一种专门为了科学文献排版而设计实现的排版工具,排版论文时有无可比拟的优势,纯文本撰写,编译直接产生符合需求的 pdf 论文,是非常惬意的过程。必须承认,相比于 Word,LaTeX 是一种更符合程序员思维的工具,具有一定的学习曲线,需要专门花时间学习。但是,以撰写学位论文为目的,学习的内容并不多,而且掌握之后撰写论文就基本没有排版需求,只需要关注论文内容即可。

下面首先阐述 LaTeX 撰写环境的配置,然后叙述用 LaTeX 撰写论文的基本方法。

环境配置

环境配置主要是安装 LaTeX 编译工具和配置一个舒适的撰写环境。

安装 TeXLive 发行版

LaTeX 是基于 TeX 的一种排版系统,LaTeX 和 TeX 的发展历史,详见维基百科。一个不太准确的理解,可以把 LaTeX 看成一种专门为了排版设计的“编程语言”,只不过他的编译结果不是机器码,而是 dvi 或者 pdf 格式的格式化文档。我们为了使用 LaTeX 编译论文,首先需要安装一个编译工具,而 TeXLive 是包含 “编译器” 在内的一整套编译工具,可以理解为 g++ 之于 C++ 或者 OpenJDK 之于 Java。

Windows和 Linux 操作系统上,建议安装 TeXLive,TeXLive 的安装镜像可以从国内的镜像站下载,如华为镜像站中科大镜像站。以下图中华为镜像站截图为例,直接下载 texlive.iso即可。
image.png

下载完成后,开始安装,挂载 texlive.iso,然后双击install-tl-windwos.bat开始安装。
image.png
弹出如下图的安装界面后,可以选择直接安装,如果非常不想安装在C盘,可以改换安装目录,但是注意安装路径不要包含空格和中文字符。
image.png
安装过程比较漫长,可能长达20分钟-1小时。

安装完成后,开始菜单可以看到 TexLive 2020 或者 TexLive 2021 文件夹,打开其中的 TeXworks editor 编辑器。
image.png

image.png

用一个简短的小文档测试一下安装是否正常完成。打开 TeXworks editor 编辑器之后,我们输入以下内容,然后将其保存在一个空目录 test 中,将其命名为 test.tex,保存完成后,将 TeXworks editor 左上角的绿色箭头右边的编译工具选成 XeLaTeX,再点击绿色箭头编译,应该会在左侧弹出编译好的文档。

\documentclass{article}

\usepackage[UTF8]{ctex}

\begin{document}

你好,\LaTeX!

\end{document}

image.png

至此,编译成功,TeXLive 安装完毕。

安装和配置 VS Code

VS Code 不是必须的,上文中的 TeXworks editor 也可以完成论文撰写,但是 VS Code 界面美观,还能配合插件进行自动补全,字数统计等额外的功能,可以大幅度提升撰写体验。(其他一些专门的 LaTeX 撰写工具,也非常易用,如 Tex Maker, TeX Studios 等,作者自己比较喜欢 VS Code的界面 :)

首先从官网下载并安装 (VS Code)[https://code.visualstudio.com/download]

然后打开 VS Code 插件安装两个插件,分别是 LaTeX WorkshopLaTeX Utilities,其中前者是必须的,用于支持在 VS Code 中编译 LaTeX 文档,后者是可选的,提供了一些额外功能,比如字数统计。

image.png

由于中科大的模板提供了默认配置,因此如果只用来撰写学位论文,并不需要以下配置。在此提供几种常见的配置,可以用于撰写其他文章时参考。

同时,建议编译配置每个项目用自己的,而非全局配置,如果需要修改配置,尽量修改当前项目中的 .vscode/settings.json。可以发现,从 Github 下载的官方模板的编译配置,就在该文件中。

  • pdflatex
"latex-workshop.latex.tools": [
        {
            "name": "pdflatex",
            "command": "pdflatex",
            "args": [
                "-shell-escape",
                "-synctex=1",
                "-interaction=nonstopmode",
                "-file-line-error",
                "%DOCFILE%"
            ],
            "env": {}
        }
    ],
    "latex-workshop.latex.recipes": [
        {
            "name": "pdflatex",
            "tools": [
                "pdflatex"
            ]
        }
    ]
  • xelatex
"latex-workshop.latex.tools": [
        {
            "name": "xelatex",
            "command": "xelatex",
            "args": [
                "-shell-escape",
                "-synctex=1",
                "-interaction=nonstopmode",
                "-file-line-error",
                "%DOCFILE%"
            ],
            "env": {}
        }
    ],
    "latex-workshop.latex.recipes": [
        {
            "name": "xelatex",
            "tools": [
                "xelatex"
            ]
        }
    ]
  • xelatex->bibtex->xelatex->xelatex
"latex-workshop.latex.tools": [
        {
            "name": "xelatex",
            "command": "xelatex",
            "args": [
                "-shell-escape",
                "-synctex=1",
                "-interaction=nonstopmode",
                "-file-line-error",
                "%DOCFILE%"
            ],
            "env": {}
        },
        {
            "name": "bibtex",
            "command": "bibtex",
            "args": [
                "%DOCFILE%"
            ],
            "env": {}
        }
    ],
    "latex-workshop.latex.recipes": [
        {
            "name": "xelatex ➞ bibtex ➞ xelatex × 2",
            "tools": [
                "xelatex",
                "bibtex",
                "xelatex",
                "xelatex"
            ]
        }
    ],
  • pdflatex->bibtex->pdflatex->pdflatex
"latex-workshop.latex.tools": [
        {
            "name": "pdflatex",
            "command": "pdflatex",
            "args": [
                "-shell-escape",
                "-synctex=1",
                "-interaction=nonstopmode",
                "-file-line-error",
                "%DOCFILE%"
            ],
            "env": {}
        },
        {
            "name": "bibtex",
            "command": "bibtex",
            "args": [
                "%DOCFILE%"
            ],
            "env": {}
        }
    ],
    "latex-workshop.latex.recipes": [
        {
            "name": "pdflatex ➞ bibtex ➞ pdflatex × 2",
            "tools": [
                "pdflatex",
                "bibtex",
                "pdflatex",
                "pdflatex"
            ]
        }
    ],

论文结构

一般来说,LaTeX 中样式和内容是分离的,LaTeX 模板负责样式,文章作者负责内容,除了 LaTeX 官方维护的模板,一般学术会议,期刊或者学校等组织也会设计实现自己的模板。本文先概述 LaTeX 中基于默认模板的文章组织结构,然后结合中科大学位论文模板阐述学位论文的组织结构。

LaTeX 文章的基本结构

LaTeX 默认模板中的文章可以分为 bookreport,前者一般用来撰写书籍或者大型论文,后者一般是短文。其中 book 类的文章结构包含 chapter section subsection subsubsection等四级主要结构,再往下细分可以用 paragraph 等结构,但一般用不到。而 report 类的文章作为短文,没有 chapter,以 section 作为最高等级。

学位论文模板一般是在 book 类的基础上定制的,下面先看一下基于 book 类文章的基本结构。

\documentclass{book}

\usepackage[heading=true]{ctex}

\begin{document}

\chapter{绪论}

本章主要讲述以下内容。

\section{研究背景}

随着深度学习的发展。

\section{研究现状}

当前,对于训练过程的通信瓶颈问题。

\section{研究内容}

本文包含多方面的研究内容。

\subsection{研究内容一}

研究内容一主要包含深度神经网络的相关内容。

\subsection{研究内容二}

\section{论文组织结构}

本文第一章为绪论。

\end{document}

编译出来的效果如下:

image.png

可以看到,\chapter{绪论} 编译成了 第一章 绪论\section{研究背景} 编译成了 1.1 研究背景,其余内容也是按照 tex 文件中的描述编译成了对应的形式。从文本描述 \chapter{绪论} 到 pdf 中的 第一章 绪论,是LaTeX 配合对应的模板类和宏包完成了纯文本描述到带样式 pdf 的转变。如果这里我们想要的章节是 一、绪论 的形式,应该修改样式描述或者更换模板,而不用修改正文内容,这就是所谓的样式和内容分离的特性。

显然,当前的配置,是不符合学位论文撰写的要求的。以中科大为例,《中国科学技术大学研究生学位论文撰写手册》规定了严格的论文格式要求,如果用 Word 撰写,就要自己按照要求完成排版工作,而如果使用 LaTeX 撰写,那么只需要下载对应的中科大学位论文模板,就可以不用再关心排版格式的问题了。

科大论文模板的组织结构

科大模板的默认编译工具是 latexmk, 因此需要确保存储路径中不含有空格。

我们从科大学位论文模板 github 仓库 https://github.com/ustctug/ustcthesis 下载模板。

模板的组织结构如图所示:

image.png

把该文件夹作为项目用VS Code打开,然后打开 main.tex,使用 ctrl + alt + B 或者点击 VS Code 右上角绿色箭头编译文档,如果编译成功,使用 ctrl + alt + V 快捷键可以在 VS Code 内打开预览。

image.png

切换到 ustcthesis-doc.tex 编译,可以查看模板的文档。

image.png

两个文件都编译成功后,我们就可以用 VS Code 撰写学位论文了。开始前,请记住以下快捷键,它们对于提升效率非常有用。

  • ctrl + alt + B 编译文档
  • ctrl + alt + V 查看文档
  • 在 tex 文件中任意位置点击鼠标左键,光标在该处闪烁后,按下 ctrl + alt + J 可以跳转到此处tex文件对应的pdf中的位置
  • 按住 ctrl 后在 pdf 文件中任意位置点击鼠标左键,可以跳转到此处 pdf 文件对应的 tex 代码。

学位论文撰写

修改配置

模板的配置主要在 main.texustcsetup.tex 两个文件中。修改前强烈建议阅读上文中编译得到的 ustcthsis-doc.pdf,下面只叙述软件学院工程硕士如何调整和调整效果,不阐述理由。

下面的配置,只适合于软件学院工程硕士学位论文

先调整 main.tex 中的文档类参数,主要指定学位,学位类型,输出类型等。以软件学院工程硕士为例,输出双面打印的论文,main.tex 中应当修改为:

\documentclass[degree=master, degree-type=professional]{ustcthesis}

然后调整 ustcsetup.tex 中的配置项目:

  • 修改中英文论文题目
  • 修改中英文作者姓名
  • 修改中英文作者
  • 修改论文类型
  • (可选)添加企业导师

修改完成后 ustcsetup.tex 如下,其中中文题目中的双斜线\用于指定断行位置:

\ustcsetup{
  title              = {一种大型企业员工信息管理系统\\的设计与实现},
  title*             = {Design and Implementation of a Staff Information Management System in Large Enterprises},
  author             = {张三},
  author*            = {Zhang San},
  speciality         = {软件工程},
  speciality*        = {Software Engineering},
  supervisor         = {XXX~教授},
  supervisor*        = {Prof. XXX},
  advisor            = {XXX~高级工程师},
  advisor*           = {XXX~Senior Engineer},
  % date               = {2017-05-01},  % 默认为今日
  professional-type  = {专业学位类型},
  professional-type* = {Professional degree type},
  % secret-level       = {秘密},     % 绝密|机密|秘密,注释本行则不保密
  % secret-level*      = {Secret},  % Top secret|Highly secret|Secret
  % secret-year        = {10},      % 保密年限
  %
  % 数学字体
  % math-style         = GB,  % 可选:GB, TeX, ISO
  math-font          = xits,  % 可选:stix, xits, libertinus
}

编译效果如下:

image.png

调整章节

模板中,摘要,正文章节和致谢均单独成一个文件,存储在 chapters/ 文件夹中,然后在 main.tex 中通过 \input{} 命令导入,可以按照自己的安排替换章节文件并修改导入命令,作者自己改成了如下:

image.png

需要注意,除了摘要,致谢,已发表论文等章节有特殊的环境外,其他章节,最外层均为 \chapter。此外,每个chapters 文件夹中的 tex 文件,第一行均应通过特殊注释通过相对路径指明项目主文档,即:

% !TeX root = ../main.tex

有了这行注释,才能在任意文件中通过 Ctrl + Alt + B 或者右上角绿色小箭头编译文档,否则要退回 main.tex 才能编译。

参考文献

参考文献引用使用 bibtex,只需要从谷歌学术,百度学术,知网,acm,ieee 官网等导出 bibtex 粘贴到 bib/ustc.bib 文件中,然后在正文中用 /cite{} 引用即可,这里补充两个作者遇到的小问题的解决方案:

  • 网页引用

应当尽量少引用网页内容,但是工程性质的论文,几乎很难避免引用官方文档等网页,网页引用格式如下

@misc{weave-net,
  title        = {Weave Net},
  year         = {2020},
  author       = {WeaveWorks},
  howpublished = {\url{https://www.weave.works/oss/net/} Accessed March 4, 2021}
}

其中 year 一般是网页的发布时间或者修改时间,可以省略,而 howpublished 中的 Accessed 日期表示你参考的时间,不可以省略。titleauthor 有就写提供的,没有一般写 XXX Official DocumentXXXXXX 是项目或者软件名称。

  • bib 文件中 & 引发的错误

bib文件中的项目中含有 & 符号时,有时会编译报错,作者的解决方案比较low,直接将其替换成 and,应该有其他优雅的方案。

插图

图片统一存储在 figures 文件夹,使用以下代码引用图片:

\begin{figure}[htb]
    \centering
    \includegraphics[width=\textwidth]{servering-performance.png}
    \caption{优化前后的平均延时与吞吐量}
    \label{fig:servering-perf}
\end{figure}

由于 ustcsetup.tex 设置了默认图片存储路径 \graphicspath{{figures/}}, 因此使用 \includegraphics{} 时可以直接写图片名称,不用完整路径,而且 VS Code 可以自动补全。

表格

LaTeX 中撰写表格是相对痛苦的一个过程,但是幸运的是目前有一些非常好用的表格生成器,这里推荐一个 https://www.tablesgenerator.com/ ,这个网页工具非常强大,几乎满足所有需求。它甚至支持长表格续表等。

该工具的功能请自行探索,这里补充一个容易忽略的功能,就是它可以从 tex 代码反向导入后再修改,这是一个非常好用的功能,尤其是修改论文的时候。

image.png

公式

公式分为行内公式和单独成行的公式,行内公式用两个美元符号包裹,如 $k_1 = 1$,而行间公式,是要求具有编号的,因此我们使用 equation 环境:

\begin{equation}
    \label{eq:t-process}
    t_p = t_{in} + t_{cal} + t_{out}
\end{equation}

会被编译为:

image.png

一个VS Code的小技巧,编辑完公式后,鼠标指向 \begin{equation} 附近,可以直接看到公式预览:

image.png

算法与代码

必须明确,论文正文中要绝对避免出现大段的代码,这是非常不恰当的行为。

对于算法,应当尽量使用 algorithm 环境基于伪代码展示,而不是大段的 Java 或者 Cpp 代码。

如果需要插入少量代码或者附录中插入较长代码,可以使用 listings 环境。在 ustcsetup.tex 环境中加入 listings 包并做一些基本设置:

\usepackage{listings}
\lstset{
    basicstyle=\ttfamily
}

然后在正文或者附录中插入代码。

\begin{lstlisting}{language=Go}
package main

import "fmt"

func main() {
    fmt.Println("Hello World!")
}

\end{lstlisting}

image.png

listings 有非常多的配置选项用于定制代码显示,自行百度即可。

补充说明

浮动体标签

图片,表格,算法,公式等浮动体,我们一般在其中插入 \label{} 标记,然后正文中用 \ref{} 引用,对章节也可以引用,如下所示:

% 插入一个公式并引用
通过式子 \ref{eq:t-process} 分析,我们可以得出结论:
```latex
\begin{equation}
    \label{eq:t-process}
    t_p = t_{in} + t_{cal} + t_{out}
\end{equation}

image.png

需要注意,一篇学位论文中,标签会非常的多,为了便于区分不同的浮动体,建议用以下方式命名标签:

  • 图片:fig:xxx
  • 表格:tab:xxx
  • 算法:alg:xxx
  • 公式:eq:xxx
  • 章节:
    • ch:xxx
    • sec:xxx
    • subsec:xxx

这种命名方式比较清晰明了,自动补全时便于查找。

参考文档

  • 在 LaTeX 中插入公式等的教程,可以参考 http://www.mohu.org/info/lshort-cn.pdf
  • TexLive 在本地安装了文档,如果想查看宏包的文档,打开命令行执行以下命令即可打开对应的文档:
    	texdoc.exe <包名>
    

    以 listings 为例,执行以下命令,即可打开文档:

    	texdoc.exe listings
    

    image.png

常见问题及解决方案

  • 新手容易遇到一个错误是正文中有下划线 _,下划线在非公式环境中出现时,需要转义 \_
  • latexmk 编译时,如果修改了非 tex 文件中的内容,可能不会编译,这时可以清除编译产生的文件后再编译,点击下图中的 Clean up auxiiary files 即可。

image.png

希望本文对正在撰写论文的同学有所帮助。有其他疑问或者发现文中错误,可以评论指出或者邮件 <域名中最长字符串>@aliyun.com 联系我。