Latex学习笔记

今天主要总结了latex的一些基本配置和使用latex进行科技论文写作的基本要素(书写文档,插入表格,插入图片,插入数学公式)

latex文档

latex是文档书写的利器。

latex文档结构

首先来看一个简单的例子:

#导言区
\documentclass[12pt ,a4paper]{article}
\usepackage{xeCJK}%使用 xeCJK 宏包
\usepackage{fontspec}
\usepackage{titlesec}
%中文断行
\XeTeXlinebreaklocale "zh"
\XeTeXlinebreakskip = 0pt plus 1pt minus 0.1pt
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
#正文区
\begin{document}
\title{金属材料高温氧化过程中的应力研究}
\author{陶兆君}
\date{\today}
\maketitle
\section{介绍}
\section{正文}
\end{document}

一般论文都用 article 文档类,这里设置正文12pt 的字号,使用 A4 纸。以\开头的表示LATEX中的命令。\usepackage{} 命令表示使用宏
包,比如 xeCJK 宏包可以支持中文字体,titlesec宏包用于更改大标题的样式。每种宏包都提供各自的命令。\usepackage{} 命令就相当于 C 语言中的 include 命令,而宏包就相当于头文件。
我们一般在导言区配置我们需要的各种设置,而在正文区正式开始写文章。

中文

实现中文字体的方法有很多种,而我一般使用的,就是上个例子中用的xeCJK宏包。需要注意的是,要使用这个宏包的话,编译器要用xelax。

中文字体

中文字体也有很多种,什么宋体,黑体等等,如何在他们之间快速切换呢?请看代码:

\setCJKfamilyfont{zhsong}{SimSun} %宋体
\setCJKfamilyfont{zhhei}{SimHei} % 黑体
\setCJKfamilyfont{zhfs}{FangSong} %仿宋
\setCJKfamilyfont{zhkai}{KaiTi} %楷体
\newcommand*{\song}{\CJKfamily{zhsong}} % 宋体
\newcommand*{\hei}{\CJKfamily{zhhei}} % 黑体
\newcommand*{\kai}{\CJKfamily{zhkai}} % 楷书
\newcommand*{\fangsong}{\CJKfamily{zhfs}} % 仿宋

前面4行第二个花括号里的必须是电脑中安装的字体名称,也可以直接写中文,比如 SimSun 就用宋体代替,SimHei就用黑体代替。第一个花括号内的是自定的名称,要与后面4行相对应。\newcommand是定
义一个新的命令,以后在文中如果想使用这些字体,那么就这样:

{\hei 这是一段黑体的文字,}{\song 这是一段楷体的文字,}{\fangsong 这是仿宋,}{\kai 这是楷体。}

这样就实现了对应文字用对应字体。看效果可以点这里

中文字号

中文习惯用几号几号来表示字的大小,而英文习惯用磅数来表示字号的大小,他们如何转换呢?我们通过自定义命令来实现

\newcommand{\erhao}{\fontsize{22pt}{\baselineskip}\selectfont}%二号
\newcommand{\xiaoer}{\fontsize{18pt}{\baselineskip}\selectfont}%小二
\newcommand{\sanhao}{\fontsize{16pt}{\baselineskip}\selectfont}%三号
\newcommand{\xiaosan}{\fontsize{15pt}{\baselineskip}\selectfont}%小三
\newcommand{\sihao}{\fontsize{14pt}{\baselineskip}\selectfont}%四号
\newcommand{\xiaosi}{\fontsize{12pt}{\baselineskip}\selectfont}%小四
\newcommand{\wuhao}{\fontsize{10.5pt}{\baselineskip}\selectfont}%五号
\newcommand{\xiaowu}{\fontsize{9pt}{\baselineskip}\selectfont}%小五

同样要使用这些字号,我们可以这样:

{\erhao 这是二号字,}{\sanhao 这是三号字,}{\wuhao 这是五号字。}

效果可以看这里

中文重定义

LATEX的一大特点就是在你自定义完模版后可以实现自动的排版。比如插入一个表格,表
头是这样的:“表 1.1:标题”。在插入表格时实际只需要输入“标题”,“表 1.1:”是LATEX自己加上去的。由于LATEX默认是英文,所以如果不加设置的话,实际的效果是:“table1.1:标
题”。这对中文论文来说显然是不行的。还有很多类似的地方需要重新设置。在导言区中加入
如下代码:

\renewcommand{\contentsname}{目录}
\renewcommand{\listfigurename}{插图目录}
\renewcommand{\listtablename}{表格目录}
\renewcommand{\refname}{参考文献}
\renewcommand{\abstractname}{摘\ 要}
\renewcommand{\indexname}{索引}
\renewcommand{\tablename}{表}
\renewcommand{\figurename}{图}
\newtheorem{theorem}{定理}
\newtheorem{definition}{定义}
\newtheorem{property}{问题}
\newtheorem{proposition}{猜测}
\newtheorem{lemma}{引理}
\newtheorem{corollary}{推论}

这样就对中文进行了重定义。

关于宏包

如果大家在编译时遇到错误:

! Undefined control sequence.

那么多半是哪个宏包没有加进去,简答的做法,当然就是先把所有常用的宏包都加进去。我们在导言区加入如下代码:

\usepackage{fancyhdr}%页眉页脚
\usepackage{xeCJK} %中文支持
\usepackage{fontspec}%字体
\usepackage{titlesec}%标题格式
\usepackage[top=2.5cm,bottom=2.5cm, left=2cm, right=2cm]{geometry}%页边距
\usepackage{amsmath} %数学公式
\usepackage{amssymb}
\usepackage{amscd}
\usepackage{listings}%插入代码
\usepackage{xcolor} %字体颜色
\usepackage{graphicx} %插入图片
\usepackage{subfig} %子图
\usepackage{tabularx}%插入表格
\usepackage{indentfirst} %首行缩进
\usepackage{array}
\usepackage{longtable}%长表格
\usepackage{multirow}%使用多栏宏包
\usepackage{wrapfig}%文字环绕
\usepackage{booktabs}
\usepackage{extarrows}
\usepackage{ulem}
\usepackage{txfonts}
\usepackage{bm}
\usepackage{cite}%参考文献
\usepackage[super,square,comma, sort&compress]{natbib}
\usepackage{setspace}%设定行距
\usepackage[colorlinks , linkcolor=black ,anchorcolor=black , citecolor=black ,
CJKbookmarks=True]{hyperref}

对于中文文章,格式要求首行缩进两个中文字符,所以首先添加 indentfirst 宏包,并且
在导言区加入以下代码:

\setlength{\parindent}{2.45em}

这样就实现了缩进两个中文字符。

表格

书写科技论文当然离开不了表格,那么LATEX中如何书写表格呢?

\begin{table}[htp] %浮动表格环境
\centering %表格居中放置 
\caption{这里是表头}
\label{tab1} %用于引用
\begin{tabular}{c|c|c|c|c}%表格环境
\toprule[1.4pt] %1.4pt 的上划线
&x1&x2&x3&x4\\\hline %\hline表示画一条横线
A&3&4&2&1\\\hline
B&2&5&4&3\\\hline
C&5&4&3&1\\\hline
D&3&3&2&4\\
\bottomrule[1.4pt]%1.4pt 的下划线
\end{tabular}
\end{table}

这样就得到一个最基本的表格:



通常来说\begin{tabular}就是一个表格环境,但是这个表格是紧接着前面的文字的,并且其后的文字也会紧跟在后面,无法像表1一样单独占据一个空行的位置。代码第一行\begin{table}表示浮动表格的环境,[htp]是可选参数,也可以不加。h(here) 表示这个浮动体放在当前位置,b(bottom) 表示放在一页的底部,t(top) 表示放在一页的最顶上,p表示放在一个浮动页(单独一页)。三个参数都加表示让LA TEX来自动判断并选择最合适的情况。通常
LATEX都会自己判断并选择最合适的情况,如果自己想强制放在某个位置,可以加!,比如[!h] 表示强制放在当前位置。tarbular 环境后的 {c|c|c|c|c},其中一共有5个c 表示表格有五列,|表示画竖线,c表示居中。c也可以换成别的,比如r(居右),f(居左)。
对于表格的每一行,使用&将列隔开,使用\换行到下一行。\hline 表示画一条横线。对于表格最上和最下的横线,加粗可能会更好看,所以可以用\toprule[1.4pt]将最上的横线设为1.4pt的宽度。对最下的横线使用 \bottomrule[1.4pt]。

表格自定义

当然如果需要更漂亮的表格,那么就需要自定义了:

列宽

有时表格看起来有点窄,如果宽点应该会更好看,那么如何实现呢?这个很好实现,只需要将表格的第一行的每一列设置一个宽度就可以了,其实就是将上面代码中的 &x1&x2&x3&x4改为:

\makebox[3em]{}&\makebox[6em]{x1}&\makebox[6em]{x2}&\makebox[6em]{x3}&\makebox[6em]{x4}\\\ hline

其中\makebox[宽度]{文本} 表示生成一个 [宽度] 的盒子,这样第一列的宽度就是3em,第二列到第五列的宽度都设为了6em。em是长度单位,表示当前字体的字符"M" 的宽度。也可以用 cm、mm、pt 等等。

行宽

有了列宽,自然想到有时我们需要调整行宽,这就需要盒子:
\parbox[c][3em][c]6em{文本} 表示生成一个竖直长度为3em,水平长度为 6em 的盒子。c 表示本文居中放置,也可以使用 r(right),l(left)。

跨行跨列表格

现在想实现一个如图所示的表格。可以看出,出行方式其实占了两行,而出行目的其实占了三列。


要使用跨行跨列表格,首先要添加multirow宏包,在导言区加上\usepackage{multirow}.
对于跨行,可以使用\multirow命令,该命令格式为

\multirow{要合并的行数}{该栏文本的宽度}{文本}

如果想让LATEX自行决定文本的宽度,就在“该栏文本宽度”这个参数里使用*.
对于跨列,可以使用 \multicolumn 命令,格式为

\multicolumn{要合并的列数}{对齐方式}{文本}

其中对齐方式可以选择 c(居中),r(居右),l(居左)。
综合跨行跨列的操作,我们可以得到上图中表格的代码为

\begin{table}[h]
\begin{center}
\caption{跨行跨列表格}
\begin{tabular}{cccc}
\toprule[1.4pt]
\multirow{2}{*}{出行方式} & \multicolumn{3}{c}{出行目的} \\ \cline{2-4}
& 工作商务出行 & 非工作出行 & 上学出行 \\\hline
公交车 & 28.16 & 6.35 & 3.18 \\\hline
出租车 & 38 & 8.57 & 4.3 \\\hline
社会小车 & 49 & 11 & 5.5 \\\hline
各出行所占比例 & 25.10\% & 71.30\% & 3.60\% \\
\bottomrule[1.4pt]
\end{tabular}
\label{tab5}
\end{center}
\end{table}

表格总结

从上面的例子可以看出,LATEX中处理表格还是比较麻烦的,如果需要处理表格,也可以先用其他软件处理(excel等),再转换成LATEX,我也用过emacs的org-mode,org-mode里处理表格就像markdown一样直观,而且有各种tab快捷键,还可以直接导出LATEX格式。

图片

首先要说明一点,LATEX中插入图片是一件比较头疼的事情,在这一点上比不过Word。
尽管如此,在掌握熟练以后还是能比较轻松地实现图片的插入的。

最简单的例子

插入图片需要在导言段加入:

\usepackage{graphicx} %插入图片

最简单的插入图片的代码为:

\begin{figure}[htp] %图片浮动环境,类似表格中的 table [htp] 参数和表格的类似
\centering %图片居中
\includegraphics[scale=0.1]{picture.jpg}%插入图片,设置图片的高度,图片的文件名
\caption{}%图片的标题
\label{} %引用
\end{figure}

[htp]这个参数和表格中的一样,就不赘述了。\includegraphics{}命令用于插入图片,[]中是可选参数,不加默认为图片原始大小。[height=10cm] 表示图片的高度为 10cm,[width=5cm]表示图片的宽度为5cm。在只加这一个参数的情况下会保持图片的比例不变。如果是[height=10cm,width=5cm],则插入图片的高度为 10cm,宽度 5cm,比例可能就改变了。另一种方法是 [scale=2],表示图片是原始大小的 2 倍。{} 中是图片的位置,如果图片在当前路径下输入图片的文件名就行。

复杂点的情况

并排摆放,共享标题

这里演示将两张图片并排摆放,并且共享标题。使用如下代码:

\begin{figure}[h]
\centering
\includegraphics[height=7cm]{picture1.jpg}
\includegraphics[height=7cm]{picture2.jpg}
\caption{并排摆放,共享标题}
\label{pic : fig1}
\end{figure}

效果为:


并排摆放,各有标题

如果想实现两个图片各有各的标题,那就需要使用minipage。
minipage的使用格式为:

\begin{minipage}[aligned]{width}...\end{minipage}

其中 aligned 为对齐方式,c、t、b分别表示中线、顶行、低行与当前基线对齐。如果不加这个可选参数则默认是c。参数 width 表示 minipage 的宽度。
我们先来看效果:



实现他的代码为:

\begin{figure}[h]
\begin{minipage}{0.5\textwidth}
\centering
\includegraphics[width=\textwidth]{picture1.jpg}
\caption{扩散 5 小时}
\end{minipage}
\begin{minipage}{0.5\textwidth}
\centering
\includegraphics[width=\textwidth]{picture2.jpg}
\caption{扩散 7 小时}
\end{minipage}
\end{figure}

其中,\textwidth表示当前页面的宽度。

并排摆放,共享标题,各有子标题

如果想要两幅并排的图片共享标题,并各有子标题,可以使用subfig宏包提供的\subfloat命令。效果如下图所示。



可以直接使用 \subfloat命令实现这个功能,但是如果图片的标题超出了图片的宽度,就会出现折行,所以最好的办法是在 \subfloat 命令里面嵌套一个 minipage,因为 minipage 是有宽度的。代码如下:

\begin{figure}[htbp]
\subfloat[扩散五小时]{
\begin{minipage}{0.5\textwidth}
\centering
\label{pic : figh_5}
\includegraphics[width=\textwidth]{picture1.jpg}
\end{minipage}
}
\subfloat[扩散七小时]{
\begin{minipage}{0.5\textwidth}
\centering
\includegraphics[width=\textwidth]{picture2.jpg}
\label{pic : figh_7}
\end{minipage}
}
\caption{PM2.5浓度随扩散时间的变化}
\end{figure}

关于画图片的软件

LATEX可以支持很多种的图片格式,有矢量图格式,也有位图格式。个人建议最好使用矢量图(某些特殊情况除外),因为矢量图在放大缩小后不会变得模糊,最清晰,而且也可以让读者复制图片中的文字。
这里再说说我用的制图软件,画示意图我一般用的是GeoGebra,流程图用的是 Dia,矢量绘图软件用的是Inkscape。他们都是开源免费的软件,GeoGebra还有网页版,可以直接在浏览器里编辑图片,画流程图的话,网页版的draw.iocacoo也不错。

数学公式

终于到了最激动人心也是LATEX最擅长的一部分了!

一些简单的数学公式

输入行间公式,比如这样 $f(x) = xsin x^3$ ,使用$...$。输入行内公式,比如
$$f(x) = xsin x^3$$
使用 $$...$$. 如果想要让公式编号,则使用 equation 环境:

\begin{equation}...\end{equation}

一些希腊字母的输入如图:


一些小帽子的输入如图:

如果使用的是 texmaker编辑器,很多数学公式可以直接从工具栏里面找到,也没有必要去背这些东西。Windows用户可以下载安装MathType,这个软件可以用鼠标点击输入数学公式,然后导出LATEX的代码,也很方便。Linux 用户可以下载安装 EqualX,也有类似功能。还可以使用在线LATEX公式编辑器,在线编辑公式,也很方便。

稍微高级的应用

输入数学公式有的时候没有看起来那么简单,可能会对数学公式有一些要求,也可能会遇到许多的问题。

括号

括号很简单,但是要做到美观还是需要注意一些的。比如这个

显然就不美观,括号太小。可以让LATEX自动调整括号的大小:
使用代码为:

\left(\frac{a}{b}\right)

效果为:

对小括号和中括号,左括号分别是 \left(和 \right[,但是对大括号,左括号就变为 \left{。注意其中的区别,大括号多了一个\。
对于中括号和大括号代码如下

\left[\frac{a}{b}\right]
\left\{\frac{a}{b}\right\}

显示效果如下:

经常需要使用大括号,比如下面这种情况:

实现的代码为:

\begin{equation} \label{eq1}
f(x)=\left \{
\begin{aligned}
&x=\cos(t) \\
&y=\sin(t) \\
&z=\frac{x}{y}
\end{aligned}
\right .
\end{equation}

其中&表示对齐的位置。还可以使用array环境,和tabular完全类似:

实现的代码为:

\begin{equation}
F=\left \{
\begin{array}{rcl}
A&& {0< S_L}\\
B&& {S_L \leq 0 < S_M}\\
C&& {S_M \leq 0 < S_R}\\
D&& {S_R \leq 0}
\end{array} 
\right .
\end{equation}

还有 cases 环境:

实现的代码为:

\begin{equation}
f(x)=
\begin{cases}
0& x=0\\
1& x!=0
\end{cases}
\end{equation}

注意,cases 环境不需要自己输入大括号,但是前两种情况需要自己输入大括号。显然,上面的公式只有左大括号,而没有右大括号,这个时候也不能直接忽略右大括号,因为左和右是配对的,所以上面的公式中在 \left{左大括号的最后需要 \right. 与之配对。注意,right后面有一个点。

长公式

有时我们的公式非常长,这就需要将公式分成多行,我们一般使用multline环境:

\begin{multline}
c(x,y,z)=\sin{x}\sin{y}\sin{z}\frac{Q}{4\pi\sqrt{(D_y+D_{y'}−D_{my})(D_z+D_{z'}−D_{mz})}}\times\exp\left[−\frac{u}{4x}\left(\frac{y^2}{D_y+D_{y'}−D{my}}+\frac{z^2}{D_z+D_{z'}−D_{mz}}\right) \right]
\end{multline}

效果如下:

多行公式

有的时候经常需要输入多行公式,这又分好几种情况:

每个子公式都有编号

这里使用align环境,看起来和连续使用两个equation环境一样,但是连续使用两个equation换进会使得这两个公式之间的距离过大。如果不想编号,在align后面加上*就行了。代码如下:

\begin{align}
& f(x)=x^3 \label{eq: rel1} \\
& g(x)=\sin{x} \label{eq: rel2}
\end{align}

只有一个编号在中间位置

比如让两个公式共用一个公式编号,代码为:

\begin{equation}\label{eq:12}
\begin{split}
& f(x)=x^3 \\
& g(x)=\sin{x}
\end{split}
\end{equation}

小结

这里总结了LATEX的一些基本用法,当然在文献写作过程中还有一些技巧是必不可少的(比如参考文献管理,章节管理等),这要不断使用LATEX,慢慢地我们就可以掌握这些技巧,最后再给大家推荐在线LATEX编辑器:sharelatexOverleaf,他们提供了丰富的LATEX模板,不管是写CV还是写论文,直接在上面找一个喜欢的模板,然后开始写作吧。

推荐阅读更多精彩内容