使用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 Workshop 和 LaTeX 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 默认模板中的文章可以分为 book 和 report,前者一般用来撰写书籍或者大型论文,后者一般是短文。其中 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.tex 和 ustcsetup.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 日期表示你参考的时间,不可以省略。title 和 author 有就写提供的,没有一般写 XXX Official Document 和 XXX,XXX 是项目或者软件名称。

  • 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 联系我。