# LaTeX 简介

课上抄的

LaTeX 是:

  1. 一个以排版文章以及数学公式为目标的计算机程序
  2. 充当了文档设计者和排版者
  3. 与 Word 等所见即所得的方式有着巨大区别
  4. 强制使用者声明文档的逻辑结构,避免版式错误

LaTeX 与 Word 区别

  1. Word 所遵循的思想是“所见即所得”,输出的文档效果与屏幕上显示一致, LateX 所遵循的思想是“所想即所得”,它有非常强大的功能,但入门学习要难于 Word,用 LaTeX 编写页面与最终得到的 pdf 有着较大的区别
  2. 从美学观点来看,由于 LaTeX 强大的排版功能,尤其是强大的数学公式编辑功能,使得 LaTeX 排版出来的文档美观性一般强于 Word,这点在科技文档中尤为明显。此外,在编辑一份含大量公式的文档时,LaTeX 的稳定性高于 Word。
  3. 完成一篇篇幅较长,含有很多插图,表格和公式的论文后,一旦论文需要修改,Word 在排版上会发生巨大的工作量,而 LaTeX 的工作量则要小得多。
  4. 大部分国内外杂志,要求寄去的文章按 LateX 格式排版,国内越来越多的学校开始鼓励毕业论文采用 LaTeX 编写。

# 编译器、IDE 及 参考书

重度使用推荐 TeX Live 和 TeXStudio。轻度使用可以使用在线编辑器 Overleaf。

参考书推荐:一份不太简短的LaTeX教程.pdf

另外推荐我编写的:LaTeX常见语法,去掉了该文中复杂的部分,推荐快速入门。

配置环境可见 配置 LaTeX 开发环境

在 tex 代码的开头使用如下注释可指定 xelatex 进行编译。

% !TEX program  = xelatex

# Hello, world

\documentclass{article} % 源文件第一行必须是介个
\begin{document}
	hello, LaTeX
\end{document}

更多 documentclass 可以自己查询。

在接下来的学习中,可以使用 Bing/Google 到的模板。

# 你好,LaTeX

原生 LaTeX 不支持中文。需要引入包。课程使用的是 CJK。但是在我的 TeXstudio 编译不过??????

引入包的格式是在 begin{document} 后使用 \usepackage[option]{packagename}

\documentclass{article}
\usepackage{CJK}
\begin{document}
	\begin{CJK}{GBK}{song}
	hello, LaTeX
	你好
	\end{CJK}
\end{document}

于是我采用了另一个 ctex 包。ctex 用法可见官方文档 (opens new window)

\documentclass{article}
\usepackage[UTF8]{ctex}
\begin{document}
	 \youyuan 你好,\LaTeX\end{document}

自带的六种字体见下表:

命令 字体
\songti 宋体
\heiti 黑体
\fangsong 仿宋
\kaishu 楷书
\lishu 隶书
\youyuan 幼圆

字号 \zihao、字距 \ziju 等特殊格式请查阅 ctex 官方文档。

# 文档基本符号

# 空格、回车

转义的字词后,空格不起作用,除了使用 \space,还可以使用"\ "(不含引号,最常用)、\,\;\:
MathJax 的写法:\space\;"\\ "(不含引号)。

换行使用 \endline\\ ,也可以使用两个回车。一个回车没有用。(MathJax 中得 \\

连续换行使用 \\ \\ 会编译不过,需要使用一个 ~ 以占位:\\~\\

# 注释

  1. 单行注释:直接加入 % 即可;
  2. 多行注释:
\usepackage{verbatim}
\begin{comment} ... \end{comment}

# 特殊符号

  • \LaTeX 即能打出 LaTeX\rm\LaTeX 的官方图标。
  • ~ 在 LaTeX 为空白符,如果想要显示这个字符,请使用\textasciitilde(非数学环境中)或 \sim(数学环境中)
  • % 注释
  • _ 为下标,如果想要显示这个字符,请使用 \_ 进行转义。如果你有很多的 _ 需要打,可以使用 \usepackage{underscore} (opens new window),在非数学模式下使用 _ 时就无需转义啦。

# 文档格式

# 文字格式

  • 粗体:\textbf{}
  • 斜体:\emph{}
  • 下划线:\underline{}(这是唯一一个数学公式外能用的数学公式功能)。

可以进行叠加: \textbf{\emph{\underline{Hello}}}

下划线处理大段文字时,不能自动换行(大概是数学公式并不需要换行)。

需要引入 ulem 宏包,并将 \underline 改为 \ulem
如果中文包使用的是 CJK,需要将引入的宏包改为 CJKulem

# 段落格式

分页:\newpage\clearpage

使用 \noindent 以去掉首行缩进,使用 \indent 以加入首行缩进。

左对齐:\begin{flushleft}(默认,所以不常用)
右对齐:\begin{flushright}
居中:\begin{center}

# 章节格式

  • 通用:\part{}\paragraph{}\subparagraph{}
  • \section{}\subsection{}\subsubsection{} 关联编号(即 1.1.1)。
  • book 类中,\section 以上还有一级更高的 :\chapter{}
  • \section*{} 不参与自动编号。

# 页面间距格式

\usepackage{geometry}
\geometry{left=5.0cm, right=2.0cm, top=2.0cm, bottom=2.0cm} % 全局设置

# 分栏

此部分源码及 PDF 见:https://github.com/lyh543/UESTC_LaTeX_Template/blob/master/Course_Thesis_others/心理学漫谈

\begin{multicols}{2} % 双栏控制
\section{第一段}
这里是正文。\lipsum[1]

\section{第二段}
这里是正文 \lipsum[2]
\end{multicols}

# 文档信息及标题

  • \title{}:标题。
  • \author{}:作者信息,以及邮件信息等等。如需换行,可在大括号中使用换行。
  • \date{2017\\December}:日期

以上命令可放全局变量位置或文档正文位置。

然后在正文里调用一句 \maketitle 产生标题及以上信息。

# 引用参考文献

LaTeX 的引用原理是给每个文献写一个好记的名字,然后引用的时候直接引用名字。
编译的时候自动对文献进行标号,并将引用处和文献根据名字绑定,然后标号。最后名字是不会呈现在文档里的。好评。

了解了原理以后,基本也是无脑抄板子。不需要额外的库。

\documentclass{article} % 源文件第一行必须是介个
\usepackage[UTF8]{ctex}
\begin{document}

xxx说的对。\cite{Zhang10}

yyy说的也对。\cite{Li10}

\begin{thebibliography}{}
	
	\bibitem{Li10}
	L. Ming, Y. Shucheng, R. Kui, and L. Wenjing, Securing Personal Health Records in Cloud Computing: Patient-Centric and Fine-Grained
	Data Access Control in Multi-owner Settings, in: Processing of SecureComm 2010, LNICST 50, pp. 89-106, 2010.
	
	\bibitem{Zhang10}
	R. Zhang, and L. Liu, Security Models and Requirements for Healthcare Application Clouds, in: Processing of  Cloud 2010, pp. 268-275, 2010.
\end{thebibliography}

\end{document} 

引用参考文献 示例

# 摘要和关键字

摘要可以用自带的,但是关键字需要自己写。

\begin{abstract}
	This is an example of abstract.
	
	\textbf{Keywords}: Abstract, Exmaple
\end{abstract}

如果你正在中文环境上写英文文章,你就会遇到啼笑皆非的情况和我一样:英文摘要上方写着大大的汉字“摘要”!

遇到这种情况,你只需要在摘要前加一行代码:

\renewcommand{\abstractname}{Your Abstract Name}

就可以把你的摘要标题变为 Your Abstract Name 了。

# 数学公式

正式学 LaTeX 之前我就开始写数学公式了,所有内容我就放在另外一篇博客了。

# 表格

创建表格,除了自己编辑,还可以使用生成工具,如:

https://tablesgenerator.com/ https://github.com/krlmlr/Excel2LaTeX

# 创建表格

使用 \begin{tabular} \end{tabular}& \\ 即可创建表格。

和数学矩阵一样,在 \begin{tabular} 后加入 {clcr} 即可说明每一列的对齐方式(c 居中,l 左对齐、r 右对齐)。

\begin{tabular}{cl}
1 & 2 \\
3 & 4
\end{tabular}

表格

# 给表格加边框

可以看到,如不加说明,LaTeX 表格是不带边框的。

如果要对一整行添加水平边框,在行间(或第一行前,最后一行后,下同)使用 \hline 命令即可。

注意最后一行加边框时,最后一行必须换行 \\

如需部分列添加水平边框(如想在第 i 列到第 j 列加入边框),将 \hline 换为 \cline{i-j} 的形式即可。
如果只有一列,则需使用 \cline{i-i}
如果需要添加多个间断的水平边框,连续使用多个命令(如 \cline{1-2}\cline{4-4} 即可。

对于竖直边框,在表格 \beginclr 部分加入 | 即可,如 \begin{tabular}{|c|l|rr|}

如果需要间断的数值边框,书上说的 \vline,但是貌似不可用,会歪的。

\begin{tabular}{|c|lr|}
	\hline
	ab & cd & ef \\
	\cline{1-1}\cline{3-3}
	cd & ef & ab \\
	\cline{1-2}
	ef & ab & cd \\
	\hline
\end{tabular}

边框 示例

# 合并单元格

这一段会比较硬核,于是再分三个小段讲。

# 合并水平单元格

这是最简单的。格式为 \multicolumn{2}{|c|}{ef}

  1. 第一个 {2} 为要合并的水平单元格数量;
  2. 第二个 {|c|} 表示该单元格的对齐方式和列边框(会覆盖掉上面的列边框设置);
  3. 第三个 {ef} 为文本格式。

注意合并单元格以后,该行的 & 数较其他行会少一些。

测试的时候不要把每一行的同两列都合并了,不然合并了还是没效果。(逃

# 合并竖直单元格

合并竖直单元格还需要调宏包 \usepackage{multirow}

调用格式为(在合并的第一行写) \multirow{2}{*}{ab}

{2}{ab} 和上述的意思相近,注意这里的 {*} 是需要无脑抄的参数,没有会报错。

另外,\cline\hline 设置不会被覆盖,需要自己调整(要不就会出现单元格被穿过去的情况)。

# 同时合并行和列

虽然理论实现非常简单,就是上述两个语句的嵌套,但是因为细节太多太多,这才是最硬核的部分。

  1. 仍然需要在合并的第一行调用。
  2. 必须 \multicolumn 在外,\multirow 在内,如 \multicolumn{2}{c|}{ \multirow{2}{*}{gh} }。不然会报错。
  3. 合并的后面几行需要写 \multicolumn,数量和列对齐格式和第一行的 \multicolumn 相同,内容留空 {}

最后是以上几个例子的综合实例。

\begin{tabular}{|c|c|c|c|}
	\hline
	\multirow{2}{*}{ab} & \multicolumn{2}{|c|}{ef} & cd\\
	\cline{2-4}
	& ef & \multicolumn{2}{c|}{\multirow{2}{*}{gh}} \\
	\cline{1-2}
	ef & gh & \multicolumn{2}{c|}{} \\
	\hline
	1 & 2 & 3 & 4 \\
	\hline
\end{tabular}

合并单元格 示例

# 美观地插入表格

上面是“如何创建一个表格”,这一部分是“如何将表格美观的插入文档”。

如下是无脑抄板子:

\begin{table}[!hbp]  % 有关[!hbp],详见:插入浮动体
	\centering       % 表格居中
	\begin{tabular}{|c|c|c|c|c|}

	\hline
	lable 1-1 & label 1-2 & label 1-3 & label 1 -4 & label 1-5 \\
	\hline
	label 2-1 & label 2-2 & label 3-3 & label 4-4 & label 5-5 \\
	\hline
	\end{tabular}

	\caption{表格标题} % 表格标题
\end{table} 

有关 [!hbp] 等,详见:插入浮动体

# 对表格进行缩放 防止超宽

遇到超宽的表格,我们可以使用 \begin{adjustbox}...\end{adjustbox} 对其进行缩放。

\documentclass{article}
\usepackage{adjustbox}

\begin{document}
\begin{table}[h!]
	\centering
	\begin{adjustbox}{max width=\textwidth}
	\begin{tabular}{*{14}{|c}|}%%{|c|c|c|c|c|c|c|c|c|c|c|c|c|c|}
		\hline
		One & Two &Three & Four & Five & Six & Seven & Eight & Nine & Ten & Eleven &
		Twelve & Thirteen & Fourteen\\
		\hline
		\hline
		$1.111$ & $2.222$ & $3.333$ & $4.444$ & $5.555$ & $6.666$ & $7.777$ &
		$8.888$ & $9.999$ & $0.000$ & $1.111$ & $2.222$ & $3.333$ & $4.444$\\
		\hline
	\end{tabular}
	\end{adjustbox}
	\caption{Test Table}
	\label{tab:label_test}
\end{table}

\end{document}

adjustbox 效果

# 标准三线表格

\begin{table}[!htbp]
    \caption{标准三线表格}\label{tab:001} \centering
    \begin{tabular}{ccccc}
        \toprule[1.5pt]
        $D$(in) & $P_u$(lbs) & $u_u$(in) & $\beta$ & $G_f$(psi.in)\\
        \midrule[1pt]
        5 & 269.8 & 0.000674 & 1.79 & 0.04089\\
        10 & 421.0 & 0.001035 & 3.59 & 0.04089\\
        20 & 640.2 & 0.001565 & 7.18 & 0.04089\\
        \bottomrule[1.5pt]
    \end{tabular}
\end{table}

标准三线表格

另外,[Table Generator] 也支持标准三线表格,只需将 Default Table Style 改为 Booktabs Table Style

# tabular* 表格

tabular* 在兼容 tabular 的语法上,又增加了功能。

一是必须指定表格的总宽度,二是可以将所有列在设定的表格宽度中均匀展开(即让表格横向均匀展开,不留横向空位)。

不需要新的宏包。

\begin{tabular*}{10cm}{lll}
	\hline
	Start & End  & Character Block Name \\
	\hline
	3400  & 4DB5 & CJK Unified Ideographs Extension A \\
	4E00  & 9FFF & CJK Unified Ideographs \\
	\hline
\end{tabular*}

这是没有横向展开的。把第一行的 {lll} 改为 {@{\extracolsep{\fill}}lll} 即可横向展开。下面是两个对比图。

不使用 extracolsep 使用 extracolsep

# tabularx 表格

tabularx 也可以实现对表格总宽度的设定。

\begin{tabularx}{8cm}{llX}  
    \hline
    Start & End  & Character Block Name \\
    \hline
    3400  & 4DB5 & CJK Unified Ideographs Extension A \\
    4E00  & 9FFF & CJK Unified Ideographs \\
    \hline
\end{tabularx}

tabularx

# 文档内容元素

这部分的内容,Markdown 也有,但是 LaTeX 可以调各种参数,功能强大。相对应的,命令也会比较长。

Markdown 真香

# 水平横线

Markdown 里的预览:


LaTeX 版本:

\rule[raise-height]{width}{thickness}
\rule[4pt]{18cm}{0.5pt} % 参考配置

# 分条目命令

# 无标号

Markdown 里的预览:

  • a
  • b

LaTeX 版本:

\begin{itemize}
	\item[*] a
	\item[*] b
\end{itemize}

[*] 可以不要(即默认使用黑点),或者换成其他的符号 + - 等。

# 数字标号

Markdown 里的预览:

  1. a
  2. b

LaTeX 版本:

\usepackage{enumerate}
\begin{enumerate}[1.]
	\item a
	\item b
\end{enumerate}

也可以使用其他的标号,修改 [1.] 部分即可。

# 文字描述

\begin{description}
	\item[研究生课程:] 数据挖掘等;
	\item[本科课程:] 高等代数等;
	\item[自学课程:] Stanford:编程方法。
\end{description}

文字描述

# 插入图片

\includegraphics{file.pdf}    %    按图片原尺寸插入图片 file.pdf

插入的图片可以是 pdfpng 等格式。对于矢量图,不能插入 svg,推荐打印成 pdf 后剪裁成图片,就可以插入了。

# 美观的插入图片

依旧是抄板子。

\begin{figure}[H]
	\centering
	\includegraphics[width=0.7\textwidth]{图片文件}
	\caption{标题名称}
	\label{fig1}
\end{figure}

# 插入子图

可自行排列。由于情况较复杂,可见 https://blog.csdn.net/a6822342/article/details/80533135

# 插入浮动体

表格的 \table 和图片的 \figure 等都算是浮动体,他们有类似的语法体系。

下面以插入图片为例:

\begin{figure}[H]
	\centering               % 居中
	\includegraphics[width=0.7\textwidth]{图片文件}
	\caption{标题名称}
	\label{fig1}
\end{figure}

关于 [!hbp] 的解释如下(默认为 [tbp]):

  • ! 严格按照说明放置,即使看起来不好。(请谨慎的使用)
  • h (here) 浮动体尽量放在代码对应的位置上。这主要用于小浮动体
  • t (top) 尽量放在页面顶部
  • b (bottom) 尽量放在页面底部
  • p (page) 放在一专门页面,仅含一个浮动体
  • H (Here) 使得浮动体严格地放在代码对应的位置上
    • 需要 \usepackage{float}
    • H 的好处是照片不会和下面的文字错位,但坏处是如果页面放不下,图片会放在在下一页开头,但当前页会有大量空白。
  • 上述字母的顺序不重要(LaTeXLaTeX 用固定的算法摆放浮动体,中括号的内容仅决定 LaTeXLaTeX 是否跳过该方法。参考 (opens new window)

如果把 \caption{标题名称} 写在 \includegraphics 之前,则得到的图片的标题在图片的上面。

\label{fig1} 是这个图片的标签,在别的地方那个引用这个图片的话,用 \ref{fig1} 就可以了。(注意:\label 必须放在 \caption 命令的后面,如果放在其他的地方,则插图的计数器就会出错)

# 插入代码

LaTeX 支持的语言 (opens new window)

\begin{lstlisting}[caption={一段C代码}, label={lst:code-example}, captionpos=t, language=c]
#include <stdio.h>
int main (int argc, char *argv[]){
  printf("Hello world!");
}
\end{lstlisting}

# 使用 LaTeX 制作幻灯片

什么是 beamer?

beamer 是 LaTeX 的一个文档类,和 article、 book 一样;beamer 主要是写幻灯片用的,目前表现最好的书写幻灯片的宏包之一;采用 LaTeX 命令来组织幻灯片,用 frame 命令生成单页幻灯片(Slide)。

# Hello, World!

先跑一下,看下什么效果。

如果编译不过,请参照文末解决。

\documentclass[red]{beamer}
\usepackage[UTF8]{ctex}
\usetheme{Warsaw}
\begin{document}
	%%------------------------------------------
	\title{beamer~测试}
	\author{XXX}
	\institute{lyh543}
	\date{\today}
	
	\frame{\titlepage}
	%%------------------------------------------
	\begin{frame}
		\frametitle{test}
		Hello, world!
	\end{frame}
	%%------------------------------------------
\end{document}

需要说明的几点:

  1. \usetheme{} 显然是用来换主题的。可供选择的有:MadridWarsawCambridgeUS
  2. \begin{frame} \end{frame} 是 beamer 里面重要的概念,每一个 frame 定义了一张 Page。

# bug 及可能的解决方法

# 无法编译/更新宏包

这里仅列举 beamer 编译不成功的例子,其他宏包是类似的。

使用 beamer 编译不能成功, 可能是使用的 beamer, pgf, xcolor 宏包需要更新,更新地址为:
当然也可以使用 LaTeX 发行版提供的宏包管理工具

beamer 更新地址: http://sourceforge.net/projects/latex-beamer/
pgf 更新地址: http://sourceforge.net/projects/pgf/
xcolor 更新地址: http://www.ctan.org/tex-archive/macros/latex/contrib/xcolor/

具体更新步骤如下:

(1) 下载: 下载最新的 beamer, pgf, xcolor 包;
(2) 安装: 找到 TeX 的安装目录 texmf, 放到下面的地方即可: texmf/tex/latex/beamer, texmf/tex/latex/pgf, texmf/tex/latex/xcolor
这里有一个细节要注意一下: 如果 texmf/tex/latex/ 目录下原来有 beamer, pgf 等文件夹, 宜先删除原有的旧文件夹, 再粘贴新文件。(直接覆盖的话,可能会因为文件名不同,使旧文件没有被删除。)