一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第2天,点击查看活动详情。
前言
临近毕业,又到了写毕业论文的时候了。作为一个预备役的程序员,相比word我更多地喜欢使用markdown之类的标记语言进行文章的写作(就比如这篇文章),但是对于毕业论文这种比较正式规范的文档,再使用markdown就有些吃不消了。
今天这篇文章就是记录我这两天学习LaTex的一些笔记,整理下来作为一份程序员的LaTex快速上手指南。注意很多地方没有使用官方的专有名词,而是基于个人理解给出的命名,如有需要可前往官方文档自行查询。
我是@Laffery,一个前端新手,如果你觉得这篇文章写得不错,或者是对你有帮助,欢迎点赞/收藏/关注。
本地环境搭建
我目前看到的比较好的在线LaTex网站有Overleaf,不过感觉没有本地的快,感兴趣的同学可以去看看。
- MacTex
笔者是Mac环境,所以下载MacTex作为LaTex的编译器。你可以去官网下载【链接在这里】,也可以使用brew在命令行下载(推荐)。
brew install mactex
- VSCode
安装LaTex Workshop插件
打开设置配置latex-workshop.latex.recipe.default为lastUsed,这样就可以一直以最近使用的构建选项进行构建。
新建一个index.tex文件,先随便写点东西吧
%index.tex
\documentclass{article}
\begin{document}
hello \LaTeX
\end{document}
可以看到在左边的LaTex面板上有Build LaTex project选项,选择xelatex进行构建。
构建完成后点击分屏预览pdf文档。默认自动构建是开启的,所以你可以在左边自由地编辑,右边(几乎)会实时渲染。
- 使用LaTex毕业论文模板
效率起见,很多同学不会直接从零开始,而是会选择一些模板,笔者极为推荐使用高校LaTex模板撰写,提高效率,毕竟不是学术工作者的话,以后再接触LaTex的次数就会少很多。
这里放上一些高校的毕业论文LaTex模板供大家参考(按名称长短排序)。
- 清华大学 tuna/thuthesis
- 浙江大学 TheNetAdmin/zjuthesis
- 上海交通大学 sjtug/SJTUThesis
- 中国科学技术大学 ustctug/ustcthesis
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}之前),可以在这里对文档的元数据进行定义。
- 定义文档的类型(
\documentclass)、文档的字体字号、纸张类型
下面这段代码,方括号内是可选参数,顺序可以不分先后。
定义了文档字体大小为12pt,默认大小为10pt;
定义了纸张类型为a4paper,也即A4纸,这个主要影响文档的页面尺寸及边距大小;
定义了文档类型为 article ,也可以定义类型为 report、 book 等。
\documentclass[12pt, a4paper]{article}
\begin{document}
%--snippets--
有些场景下还有两栏布局的需求,可以在\documentclass方括号内添加twocolumn选项。
\begin{...}后面我们会经常看到,它就像HTML里面标签的开始,声明一个环境,可以是document,也可以是table、figure等。
- 定义标题、作者、时间戳
使用 \title{} 定义文档的标题(不是定义文件名哈~);
使用 \author{} 定义文档的作者(也就是我~);
使用 \date{} 定义的时间戳,\today 则表示当前时间,在构建时自动更新,当然你也可以手动输入日期。
%标题
\title{基于LaTex撰写毕业论文}
%作者
\author{Laffery}
%日期
\date{\today}
%--beginning--%
\begin{document}
\maketitle
%--snippets--
细心的小伙伴发现我们在正文多了一行\maketitle,其作用就是让我们定义的这些元数据显示出来,现在文档看起来像这样:
不对啊,我们的标题明明是基于LaTex撰写毕业论文,怎么只显示了LaTex呢?
刚写代码的时候大家可能都有这种经历:中文路径识别不了,或者代码里的中文变成乱码。
这里我们需要为文档声明编码类型,一般我们使用UTF-8,在序言里这样声明:
\usepackage[UTF8]{ctex}
它声明了使用ctex包,并声明文档编码类型为UTF8。
编写正文
文本元素类型
先简单介绍下一些文本类型。在HTML中有块级元素和行级元素的概念,而LaTex的文本也有类似的概念,我大致归纳为三种:
- 行间文本:类似行级元素,占一整行
- 行内文本:类似块级元素,有多长占多长
- 浮动文本:脱离文档流,最终排版效果的位置不一定与源文档中的位置对应(可以理解成CSS里的float)
排版选项placemant options
对于浮动文本,可以使用排版选项对其位置进行规范。 (),导致排版与预期不符。还有其它的选项,参考这里作了一点翻译搬运过来。
h- here: 如果页面上有足够的空间,则将图放在图环境所在的文本中t- top: 将图放在页面顶部b- bottom: 将图放在页面底部p- page: 将其放在仅包含浮动元素的页面上,如图或表!: 忽略特定的LaTex浮动排版参数,具体看上面的链接👆
常用的文本标签
装了插件后的编辑器会有自动补全提示,以下是正文中一些常用的标签(姑且这么叫吧,对标HTML),可以了解一下,写的时候才会心中有数。
| 描述 | LaTex | HTML | 效果(LaTex) |
|---|---|---|---|
| 黑体/粗体 | \textbf{...} | <b>...</b> | |
| 斜体 | \textit{...} | <i>...</i> | |
| 下划线 | \underline{...} | <u>...</u> |
换行&换页
和Markdown或者HTML一样,这类文档有个特点就是文档内部的换行是不起作用的,需要用显式的换行符
使用双斜杠\\、\newline表示换行,或者直接间隔一行。
line1% 换行不起作用
line2
line1 \\
line2
line1
\newline
line2
line1
line2
LaTex写文档又有页的概念,如果你的文档想要另起一页,比如前一页是目录,后一页是正文,又不想正文和目录在同一页,可以使用\newpage。
插入图片
LaTex原生不支持插入图片,要引入相关的包,并声明图片文件夹路径
\usepackage{graphicx}
\graphicspath{./assets}
在正文中这样使用,其中filename为图片的文件名,可以不包含扩展名,常用的图片格式基本都支持。方括号里定义图片的尺寸,这里图片尺寸为正文宽度的0.3倍。
\includegraphics[width=0.3\textwidth]{filename}
当然论文里的图片一般都要有题注,可以在正文里这样写
\begin{figure}[h]
\centering %图片居中
\includegraphics[width=0.3\textwidth]{logo}
\caption{稀土掘金}
\end{figure}
可以看到图片下方产生了题注,图片的编号是自动生成的。
这时插入的图片就是一个浮动文本,使用[h]属性让图片在当前位置渲染。
使用引用 reference
在正文中引用一个标签(图、表、公式等),可以使用\label{}为它们打上标签(索引依据,最好保证唯一性),并用\ref{}
\begin{figure}[h]
% 图片同上
\label{fig:juejin}
\end{figure}
如图 ~\ref{fig:juejin} 所示
~加不加的区别在于多或少一个空格
另外需要注意,\label放在最后面,否则有可能导致应用的序号不显示。
使用列表
- 基础使用
\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表示,其中有序列表的序号为自动生成,效果如下。
- 自定义列表序号
使用 \item[label] 自定义序号,并且效果与列表是否是有序列表无关的,如:
\begin{enumerate}
\item[a.] hello \LaTeX
\item[b.] hello \LaTeX
\end{itemize}
- 嵌套使用
不管是有序列表还是无需列表,可以随意互相嵌套,只需要将子列表作为父列表\item的一部分
\begin{enumerate}
\item hello \LaTeX
\begin{itemize}
\item hello \LaTeX
\item hello \LaTeX
\end{itemize}
\item hello \LaTex
\end{enumerate}
使用表格
- 基础使用
使用\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}
- 添加边框
可以在c之间用竖杠|(区分中英文输入法下的竖杠,中文为|空白较多),表示在相应的列之间加上边框。
可以在行之间用\hline声明一条横边框。
\begin{tabular}{| c | c | c |}
\hline
1 & 2 & 3 \\
\hline
4 & 5 & 6 \\
\hline
7 & 8 & 9 \\
\hline
\end{tabular}
- 使用题注
在论文写作中我们一般要对图表作题注。和\begin{figure}类似的,可以用\begin{table}和\end{table}包裹一个表格,使之带题注。
\begin{table}
\centering
%-- tabluar同上
\caption{九宫格}
\end{table}
使用公式
讲道理LaTex的公式功能实在太强大,而且笔者毕业论文对公式的编写需求不多,这里就不详细介绍所有公式的语法(那得写到啥时候去),仅介绍一些基本的用法。
你可以直接在文档的任何位置使用$...$来表示行内公式,也可以用$$...$$表示行间公式,如高中物理的匀加速度位移公式
$x = \frac{1}{2} {at^2} + {v_0}t$
+-*/加减乘除不必多说\frac{分子}{分母}表示分式\times叉乘号^_分别表示上标下标
为公式生成编号
当文档中的公式数量多起来,就需要用编号来管理,和题注类似。但是这时候用上面简单的写法就不顶用了,需要用到专门的声明公式的标签equation,意为方程式。
\begin{equotion}\label{xxx}
x = \frac{1}{2} {at^2} + {v_0}t
\end{equotion}
现在公式是行间公式,居中对齐,并且编号是自动生成的。
使用算法流程表
作为计算机类的学生,写论文当然少不了写算法流程。首先声明使用包algorithm2e(我看很多文章说用algorithm的,这个包比较老,我这里的环境已经不支持了),然后开始写算法流程,具体怎么写就看你咯。
\begin{algorithm}\label{algo:algorithm}
\caption{算法示例}
\small
\While{condition a} {
do sth\;
\eIf{condition b}{
handler a\;
}{
handler b\;
}
}
\end{algorithm}
使用代码片段
毕业论文中一般不推荐插入大量的代码片段,但如果确实需要,可以使用包listings,不过感觉效果不是很好,对某些语言(比如TypeScript)高亮支持也不是很好,如无必要,实无必要。
\begin{lstlisting}[language=C++]
#include <iostream>
int main() {
return 0;
}
\end{lstlisting}
使用参考文献
论文中往往要引用参考文献,一般在文献末尾使用\begin{thebiblography}开启一段参考文献:
\begin{thebibliography}{99}
\bibitem{ref1} 参考文献1
\bibitem{ref2} 参考文献2
\bibitem{ref3} 参考文献3
\end{thebibliography}
\bibitem即文献条目,花括号里为文献的索引。
在正文中,使用\cite{ref1}即可引用索引为ref1的文献。当然你也可以使用其它相关的包,比如bibtex等。
使用页眉页脚
这种比较定制化的内容,我就不详细介绍了,找到一篇基于fancyhdr进行配置的文章,或者其它的文章,大家可以自行搜索查询。
小结
本文主要介绍了使用LaTex撰写论文需要知道的一些基础知识,方便大家快速上手,在使用模版撰写论文的时候心中有数。
最后,这篇文章涉及到的tex片段的完整文档,我上传到gist上,有需要可以自取。
我是@Laffery,一个前端新手,如果你觉得这篇文章写得不错,或者是对你有帮助,欢迎点赞/收藏/关注。