基于LaTex撰写论文

957 阅读11分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第2天,点击查看活动详情

前言

临近毕业,又到了写毕业论文的时候了。作为一个预备役的程序员,相比word我更多地喜欢使用markdown之类的标记语言进行文章的写作(就比如这篇文章),但是对于毕业论文这种比较正式规范的文档,再使用markdown就有些吃不消了。

今天这篇文章就是记录我这两天学习LaTex的一些笔记,整理下来作为一份程序员的LaTex快速上手指南。注意很多地方没有使用官方的专有名词,而是基于个人理解给出的命名,如有需要可前往官方文档自行查询。

我是@Laffery,一个前端新手,如果你觉得这篇文章写得不错,或者是对你有帮助,欢迎点赞/收藏/关注。

本地环境搭建

我目前看到的比较好的在线LaTex网站有Overleaf,不过感觉没有本地的快,感兴趣的同学可以去看看。

  1. MacTex

笔者是Mac环境,所以下载MacTex作为LaTex的编译器。你可以去官网下载【链接在这里】,也可以使用brew在命令行下载(推荐)。

brew install mactex
  1. VSCode

安装LaTex Workshop插件

image.png

打开设置配置latex-workshop.latex.recipe.defaultlastUsed,这样就可以一直以最近使用的构建选项进行构建。

image.png

新建一个index.tex文件,先随便写点东西吧

%index.tex
\documentclass{article}
\begin{document}
    hello \LaTeX
\end{document}

可以看到在左边的LaTex面板上有Build LaTex project选项,选择xelatex进行构建。

image.png

构建完成后点击分屏预览pdf文档。默认自动构建是开启的,所以你可以在左边自由地编辑,右边(几乎)会实时渲染。

image.png

  1. 使用LaTex毕业论文模板

效率起见,很多同学不会直接从零开始,而是会选择一些模板,笔者极为推荐使用高校LaTex模板撰写,提高效率,毕竟不是学术工作者的话,以后再接触LaTex的次数就会少很多。

这里放上一些高校的毕业论文LaTex模板供大家参考(按名称长短排序)。

LaTex语法

首先我们看看刚刚随便写的代码。

第一行是一段注释,我们get到第一个知识点,LaTex使用%表示注释
第二行 \documentclass{article} 声明了文档的类型,它决定了文档的整体样式。一般我们使用 article 就好。
第三行\begin{document}声明了文档的开始,同理第五行\end{document}声明了文档的结束。
第四行是正文部分,在文档开头和结尾声明之间,你可以写任何你想写的内容,和HTML很像的采用缩进,这样会让文档的结构更加清晰。

到这里我们可以发现,LaTex的语法很像HTML(当然了都是标记语言),也许可以将这段转换成下面这样也许能帮助你理解:

<!-- index.tex -->
<!DOCTYPE article>
<document>
  hello <LaTex />
</document>

编写序言 preamble

序言 preamble 在正文部分之前(\begin{document}之前),可以在这里对文档的元数据进行定义。

  1. 定义文档的类型(\documentclass)、文档的字体字号、纸张类型

下面这段代码,方括号内是可选参数,顺序可以不分先后。 定义了文档字体大小为12pt,默认大小为10pt; 定义了纸张类型为a4paper,也即A4纸,这个主要影响文档的页面尺寸及边距大小; 定义了文档类型为 article ,也可以定义类型为 reportbook 等。

\documentclass[12pt, a4paper]{article}
\begin{document}
  %--snippets--

有些场景下还有两栏布局的需求,可以在\documentclass方括号内添加twocolumn选项。

\begin{...}后面我们会经常看到,它就像HTML里面标签的开始,声明一个环境,可以是document,也可以是table、figure等。

  1. 定义标题、作者、时间戳

使用 \title{} 定义文档的标题(不是定义文件名哈~); 使用 \author{} 定义文档的作者(也就是我~); 使用 \date{} 定义的时间戳,\today 则表示当前时间,在构建时自动更新,当然你也可以手动输入日期。

%标题
\title{基于LaTex撰写毕业论文}
%作者
\author{Laffery}
%日期
\date{\today}

%--beginning--%
\begin{document}
  \maketitle
  %--snippets--

细心的小伙伴发现我们在正文多了一行\maketitle,其作用就是让我们定义的这些元数据显示出来,现在文档看起来像这样:

image.png

不对啊,我们的标题明明是基于LaTex撰写毕业论文,怎么只显示了LaTex呢?

刚写代码的时候大家可能都有这种经历:中文路径识别不了,或者代码里的中文变成乱码。

这里我们需要为文档声明编码类型,一般我们使用UTF-8,在序言里这样声明:

\usepackage[UTF8]{ctex}

它声明了使用ctex包,并声明文档编码类型为UTF8

image.png

编写正文

文本元素类型

先简单介绍下一些文本类型。在HTML中有块级元素和行级元素的概念,而LaTex的文本也有类似的概念,我大致归纳为三种:

  • 行间文本:类似行级元素,占一整行
  • 行内文本:类似块级元素,有多长占多长
  • 浮动文本:脱离文档流,最终排版效果的位置不一定与源文档中的位置对应(可以理解成CSS里的float)
排版选项placemant options

对于浮动文本,可以使用排版选项对其位置进行规范。 (),导致排版与预期不符。还有其它的选项,参考这里作了一点翻译搬运过来。

  • h - here: 如果页面上有足够的空间,则将图放在图环境所在的文本中
  • t - top: 将图放在页面顶部
  • b - bottom: 将图放在页面底部
  • p - page: 将其放在仅包含浮动元素的页面上,如图或表
  • !: 忽略特定的LaTex浮动排版参数,具体看上面的链接👆

常用的文本标签

装了插件后的编辑器会有自动补全提示,以下是正文中一些常用的标签(姑且这么叫吧,对标HTML),可以了解一下,写的时候才会心中有数。

描述LaTexHTML效果(LaTex)
黑体/粗体\textbf{...}<b>...</b>image.png
斜体\textit{...}<i>...</i>image.png
下划线\underline{...}<u>...</u>image.png

换行&换页

和Markdown或者HTML一样,这类文档有个特点就是文档内部的换行是不起作用的,需要用显式的换行符 使用双斜杠\\\newline表示换行,或者直接间隔一行。

line1% 换行不起作用
line2

line1 \\
line2

line1
\newline
line2

line1

line2

image.png

LaTex写文档又有页的概念,如果你的文档想要另起一页,比如前一页是目录,后一页是正文,又不想正文和目录在同一页,可以使用\newpage

插入图片

LaTex原生不支持插入图片,要引入相关的包,并声明图片文件夹路径

\usepackage{graphicx}
\graphicspath{./assets}

在正文中这样使用,其中filename为图片的文件名,可以不包含扩展名,常用的图片格式基本都支持。方括号里定义图片的尺寸,这里图片尺寸为正文宽度的0.3倍。

\includegraphics[width=0.3\textwidth]{filename}

logo

当然论文里的图片一般都要有题注,可以在正文里这样写

\begin{figure}[h]
  \centering %图片居中
  \includegraphics[width=0.3\textwidth]{logo}    
  \caption{稀土掘金}
\end{figure}

可以看到图片下方产生了题注,图片的编号是自动生成的。

image.png

这时插入的图片就是一个浮动文本,使用[h]属性让图片在当前位置渲染。

使用引用 reference

在正文中引用一个标签(图、表、公式等),可以使用\label{}为它们打上标签(索引依据,最好保证唯一性),并用\ref{}

\begin{figure}[h]
  % 图片同上
  \label{fig:juejin}
\end{figure}

如图 ~\ref{fig:juejin} 所示

~加不加的区别在于多或少一个空格

with ~ no ~

另外需要注意,\label放在最后面,否则有可能导致应用的序号不显示。

使用列表

  1. 基础使用
\begin{itemize}
  \item hello \LaTeX
  \item hello \LaTeX
\end{itemize}

\begin{enumerate}
  \item hello \LaTeX
  \item hello \LaTeX
\end{itemize}

同样使用\begin{...}\end{...}包裹一个列表,注意缩进。itemize表示类型为无序列表,enumerate表示类型为有序列表,它们的列表项都用\item表示,其中有序列表的序号为自动生成,效果如下。

image.png

  1. 自定义列表序号

使用 \item[label] 自定义序号,并且效果与列表是否是有序列表无关的,如:

\begin{enumerate}
  \item[a.] hello \LaTeX
  \item[b.] hello \LaTeX
\end{itemize}

image.png

  1. 嵌套使用

不管是有序列表还是无需列表,可以随意互相嵌套,只需要将子列表作为父列表\item的一部分

\begin{enumerate}
  \item hello \LaTeX
    \begin{itemize}
      \item hello \LaTeX
      \item hello \LaTeX 
    \end{itemize}
  \item hello \LaTex
\end{enumerate}

image.png

使用表格

  1. 基础使用

使用\begin{tabular}\end{tabular}包裹一个列表。{c c c}表示表格有多少列( c 即column),这样就算某一行少写一列也可以正常渲染(多写则报错);而行是可以自由扩充的。

\begin{tabular}{c c c}
  1 & 2 & 3 \\
  4 & 5 & 6 \\
  7 & 8 & 9
\end{tabular}

image.png

  1. 添加边框

可以在c之间用竖杠|(区分中英文输入法下的竖杠,中文为空白较多),表示在相应的列之间加上边框。
可以在行之间用\hline声明一条横边框。

\begin{tabular}{| c | c | c |}
  \hline
  1 & 2 & 3 \\
  \hline
  4 & 5 & 6 \\
  \hline
  7 & 8 & 9 \\
  \hline
\end{tabular}

image.png

  1. 使用题注

在论文写作中我们一般要对图表作题注。和\begin{figure}类似的,可以用\begin{table}\end{table}包裹一个表格,使之带题注。

\begin{table}
  \centering
  %-- tabluar同上
  \caption{九宫格}
\end{table}

image.png

使用公式

讲道理LaTex的公式功能实在太强大,而且笔者毕业论文对公式的编写需求不多,这里就不详细介绍所有公式的语法(那得写到啥时候去),仅介绍一些基本的用法。

你可以直接在文档的任何位置使用$...$来表示行内公式,也可以用$$...$$表示行间公式,如高中物理的匀加速度位移公式

$x = \frac{1}{2} {at^2} + {v_0}t$

image.png

  • +-*/加减乘除不必多说
  • \frac{分子}{分母}表示分式
  • \times 叉乘号
  • ^_分别表示上标下标
为公式生成编号

当文档中的公式数量多起来,就需要用编号来管理,和题注类似。但是这时候用上面简单的写法就不顶用了,需要用到专门的声明公式的标签equation,意为方程式。

\begin{equotion}\label{xxx}
  x = \frac{1}{2} {at^2} + {v_0}t
\end{equotion}

现在公式是行间公式,居中对齐,并且编号是自动生成的。

image.png

使用算法流程表

作为计算机类的学生,写论文当然少不了写算法流程。首先声明使用包algorithm2e(我看很多文章说用algorithm的,这个包比较老,我这里的环境已经不支持了),然后开始写算法流程,具体怎么写就看你咯。

\begin{algorithm}\label{algo:algorithm}
  \caption{算法示例}
  \small
  \While{condition a} {
    do sth\;
    \eIf{condition b}{
      handler a\;
    }{
      handler b\;
    }
  }
\end{algorithm}

image.png

使用代码片段

毕业论文中一般不推荐插入大量的代码片段,但如果确实需要,可以使用包listings,不过感觉效果不是很好,对某些语言(比如TypeScript)高亮支持也不是很好,如无必要,实无必要。

\begin{lstlisting}[language=C++]
  #include <iostream>

  int main() {
    return 0;
  }
\end{lstlisting}

image.png

使用参考文献

论文中往往要引用参考文献,一般在文献末尾使用\begin{thebiblography}开启一段参考文献:

\begin{thebibliography}{99}  
  \bibitem{ref1} 参考文献1
  \bibitem{ref2} 参考文献2
  \bibitem{ref3} 参考文献3
\end{thebibliography}

\bibitem即文献条目,花括号里为文献的索引。

image.png

在正文中,使用\cite{ref1}即可引用索引为ref1的文献。当然你也可以使用其它相关的包,比如bibtex等。

使用页眉页脚

这种比较定制化的内容,我就不详细介绍了,找到一篇基于fancyhdr进行配置的文章,或者其它的文章,大家可以自行搜索查询。

小结

本文主要介绍了使用LaTex撰写论文需要知道的一些基础知识,方便大家快速上手,在使用模版撰写论文的时候心中有数。

最后,这篇文章涉及到的tex片段的完整文档,我上传到gist上,有需要可以自取。

我是@Laffery,一个前端新手,如果你觉得这篇文章写得不错,或者是对你有帮助,欢迎点赞/收藏/关注。