LaTeX排版基础语法

基于xeLaTeX

作者: Duter2016 | 2020-08-09 | 阅读
「编辑」 「本文源码」

一、Latex简介

Latex是一种文件生成系统,它生成纯文本文件,后缀名为.tex。

基本框架为:

\documentclass[UTF8]{ctexart}  %使用中文版的article文档类型排版,并选择UTF8编码格式
\usepackage{amsmath}  %使用宏包,这里使用的是调用公式宏包,可以调用多个宏包
\begin{document}  %开始写文章
文章内容            %编辑文章
\end{document}  %结束写文章

我的通用基本框架:

\documentclass[UTF8,12pt,a4paper,space]{ctexart}
\usepackage{xeCJK}
\usepackage{amsmath}
\usepackage{amssymb} %花体样式
\allowdisplaybreaks[4] %[]参数可为1,2,3,4。数值越大,执行跨页强度越大
\usepackage{listings}
\usepackage{fontspec}
\setmainfont{SimSun}
\usepackage{graphicx}
\usepackage{subfigure}
\usepackage{color}
\usepackage{times}
\usepackage{geometry} %设置页边距的宏包
\geometry{left=1.7cm,right=1.7cm,top=1.5cm,bottom=1.5cm} %设置页边距
\usepackage{setspace}   %行间距
\setstretch{1.25} % 任意行距
\usepackage{multirow} % 表格多行特性
\usepackage{array} % 设定表格m{}等特性
\usepackage{tabularx} % 可动态调整表格条目宽度
\usepackage[table]{xcolor} % 为表格添加颜色
\usepackage{rotating} % 把表格旋转为垂直表格
\usepackage{enumerate} % 有序列表
\title{论文题目}
\author{名字}
\date{\today}

\begin{document}
\maketitle
文章内容            %编辑文章
\end{document}

二、基本语法元素

1.标准文档类型

语法为在导言区添加:
documentclass{文档类型}

参数:

大类参数 文档类型 特点 对应中文文档参数
article: 短文,评论,学术论文; 无左右页区分,无章设置。 对应中文类ctexart。
book: 著作,学位论文; 默认有左右页区分,章起右页。 对应中文类ctexbook。
report: 商业,科技,试验报告; 默认无左右页区分,章起新页。 对应中文类:ctexrep。
beamer: 论文陈述幻灯片; 提供多种主题式样,可方便更改幻灯片的整体风格。 ctexbeamer

2.常用宏包

语法为在导言区添加:
\usepackage{宏包}

参数:

amsmath 公式环境和数学命令
amssymb 数学符号生成命令
array 数组和表格制作
calc 四则运算
caption 插图和表格标题格式设置
fancyhdr 页眉页脚设置
fancyvrb 抄录格式设置
fontspec 字体选择
geometry 版面尺寸设置,设置页边距的宏包
graphicx 插图处理
hyperref 创建超文本链接和PDF书签
longtable 制作跨页表格
multicol 多栏排版
ntheorem 定理设置
paralist 多种列表环境
tabularx 自动设置表格列宽
titlesec 章节标题格式设置
titletoc 目录格式设置
color    颜色处理
xcolor   颜色处理
xeCJK 中日朝文字处理和字体选择
setspace 使用行间距宏包
indentfirst  首行缩进宏包
times     使得英文默认字体都是Times New Roman

3.简单的规则

(1)空格:Latex中空格不起作用。

(2)换行:用控制命令“\\”,或“ \newline”.

(3)分段:用控制命令“\par” 或空出一行。

(4)换页:用控制命令“\newpage”或“\clearpage”

(5)特殊控制字符:#,$, %, &, - ,{, }, ^, ~
要输出这些控制符用下列命令:
\#  \$   \%  \&  \-  \{  \}  \^{}  \~{}  \blackslash表示“ \”

支持空格

LaTeX默认是忽略文字之间的空格的(比如’你好 啊!’’你好啊!’是一样的效果),需要支持空格的话,你有三种方式:

你{ }好啊!
你\ 好啊!
\usepackage[space]{ctex}
\documentclass[space]{ctexart}

一般来说,最后两种方式是比较常见的(二者只能选择其一,后二者同时使用会冲突)。

4.西文字符转换表

\rm   罗马字体          \it     意大利字体

\bf   黑体              \sl     倾斜体

\sf   等线体            \sc     小体大写字母

\tt    打字机字体       \mit     数学斜体

5.字号转换命令表

点数(pt) 相应中文字号 控制命令
25 一号 \Huge
20 二号 \huge
17 三号 \LARGE
14 四号 \Large
12 小四号 \large
10 五号 \normalsize
9 小五号 \small
8 六号 \footnotesize
7 小六号 \scriptsize
5 七号 \tiny

6.页面控制命令

\textwidth=14.5cm
\textheight=21.5cm

系统默认:字号10pt=五号字;西文字体为罗马字体;textwidth=12.2cm,textheight=18.6cm。相当于美国标准信纸大小。

7.添加注释

在每一行的末尾加上%,然后就可以添加注释了,编译后注释的内容不会出现在文档中。如果文章内容中需要使用%的话,需要在%前面加上反斜杠\

8.对齐方式

一行对齐:

\leftline{左对齐} \centerline{居中} \rightline{右对齐}

多行或者段落对齐:

左对齐 \begin{flushleft}...\end{flushleft}
居中 \begin{center}...\end{center}
右对齐 \begin{flushright}...\end{flushright}

图片或者表格居中一般使用:

\centering

9.设置局部字体、颜色、大小、下划线

(1)设置局部字体

如设置局部楷体:

{\kaishu{莱斯利·兰伯特}}

(2)设置局部字体颜色

先引入宏包: \usepackage{color}

方式一: {\color{red} 文本}

方式二:使用组合red、green和blue的值合成的颜色

\textcolor[rgb]{r,g,b}{text}

其中{r,g,b}代表red、green和blue三种颜色的组合,取值范围为[0-1]

\textcolor[RGB]{R,G,B}{text}

其中{R,G,B}代表red、green和blue三种颜色的组合,取值范围为[0-255]

(3)设置局部字体大小

如设置小四号字体和三号字体:

{\large{小四号字体}}
{\LARGE{三号字体}}

(4)设置局部下划线

如下:

\underline{这是下划线文本}

10.

三、基本结构语法

1.标题、作者以及日期

设置作者名字、标题以及创作时间的基本结构是:

\title{杂谈勾股定理}  %大括号里填写标题
\author{张三}  %大括号里填写作者姓名
\date{\today}    %大括号里填写\today会自动生成当前的日期
\maketitle     %写了以上内容后一定要添加这个,制作标题,否则上面的内容无效。

将上述内容填充到我们的框架里:

\documentclass[UTF8,12pt,a4paper,space]{ctexart}
\title{杂谈勾股定理}
\author{张三}
\date{\today}
\begin{document}
\maketitle          %\maketitle须放在\begin{document}下面
文章内容            %编辑文章
\end{document}

也可以将姓名、标题、日期填到\begin{document}的下面,与\maketitle放在一起,效果一样,即:

\documentclass[UTF8,12pt,a4paper,space]{ctexart}
\begin{document}
\title{杂谈勾股定理}
\author{张三}
\date{\today}
\maketitle          %\maketitle须放在\begin{document}下面
文章内容            %编辑文章
\end{document}

2.添加摘要

给文章添加摘要部分:

\begin{abstract}
\small\centering 这是一篇关于勾股定理的小论文。
\end{abstract}

\small 是使用缩小字体,\centering是使内容居中。把摘要放在\begin{document}\end{document}之间。

3.添加目录

只需要在\begin{document}\end{document}之间添加\tableofcontents就可以:

\begin{document} 
\maketitle 
\tableofcontents
\end{document}

4.添加脚注

语法为:

被脚注词\footnote{脚注内容}

比如,这里给“LaTeX”添加一个脚注。脚注会显示在本页的左下角,并且以横线与正文隔开:

你好!LaTeX\footnote{LaTeX是一个与Word比肩,甚至更好的工具}。

5.添加级别标题

不同的文章类型标题级别不完全相同(比如,如果为book的话还有chapter级别)。

(1)添加“部分”标题

\part{部分标题}

(2)添加章节标题

\section{一级章节标题}
\subsection{二级章节标题}
\subsubsection{三级章节标题}

(3)添加段落标题

\paragraph{一级段落标题}  %仅对其后的一段生效,括号内可以不写内容
\subparagraph{二级段落标题} %仅对其后的一段生效,括号内可以不写内容

6.全局字体设置

(1)设置全局中文字体

在导言区用fontspec包来设置字体:

\usepackage{fontspec} 
\setmainfont{SimSun}

如何找到可用的中文字体呢?在系统的终端中,使用下面的命令: fc-list :lang=zh 这个命令会列出系统中所有支持中文的字体。

(2)设置全局英文字体

\usepackage{times} %使得英文默认字体都是Times New Roman

7.插入图片

现在导言区调用宏包:

\usepackage{graphicx}

然后,在需要插入图片的地方引用(图片要放在tex文件同目录下):

(1)按百分比缩放图片(scale是缩放尺寸):

\includegraphics[scale=0.6]{latex.png}

(2)按尺寸设置图片

/includegraphics[height=3in]{图片文件名}
 或者: 
/includegraphics[width=5in]{图片文件名}

其中的”高度”和”宽度”是指希望图片打印的高度和宽度, 必须给出单位, 可用厘米(cm)或英寸(in)。高度和宽度也可用上述格式同时给出, 这样可以改变原图的长宽比例。

(3)按文本宽度比例设置图片

/includegraphics[width=0.8/textwidth]{图片文件名}

设定图片宽度为文本宽度的0.8倍。

/includegraphics[width=/textwidth-2.0in]{图片文件名}

设定图片宽度比文本宽度少2 inches。

(4)图片旋转

用graphicx包的includegraphics宏命令插入图片时还可以使图片旋转, 方法是:

/includegraphics[height=高度][angle=60]{图片文件名}

将图片旋转60度。

(5)更复杂的浮动设置

如下:

\begin{figure}[h]  %h为当前位置,!htb为忽略美学标准,htbp为浮动图形
\centering         %图片居中
\includegraphics[scale=0.8]{latex.png}
\caption{该图显示了一个测试示例。}   %文档中显示的图片标题
\label{fig:test_demo}       %用于文内引用的标签
\end{figure}

(6)多图横排

现在导言区添加宏包:

\usepackage{subfigure}

然后,在需要插入图片的地方引用:

\begin{figure}[h]
\centering  %图片全局居中
\subfigure[name1]
{
\includegraphics[width=0.45\textwidth]{左图}
}
\subfigure[name2]
{
\includegraphics[width=0.45\textwidth]{右图}
}
\caption{Main name}
\label{Fig.main}
\end{figure}

(6)图片标签引用

语法: \ref{fig:test_demo}

在文中可以这样引用:“一幅图像或一段视频中,如图\ref{fig:test_demo}所示。”

8.代码片段

前提需要引入宏包\usepackage{listings},注意将language设置成目标语言类型。

\begin{lstlisting}[language={Python}]
#Layer3 - Convolution
with tf.variable_scope('layer3-conv2'):
        conv2_weights = tf.get_variable('weight',[5,5,6,16],initializer
            =tf.truncated_normal_initializer(stddev=0.1))
        conv2_biases = tf.get_variable('bias',[16],initializer
            =tf.constant_initializer(0.0))
        conv2 = tf.nn.conv2d(pool1,conv2_weights,
            strides=[1,1,1,1],padding='VALID')
        relu2 = tf.nn.relu(tf.nn.bias_add(conv2,conv2_biases))
\end{lstlisting}

9.无序列表

{itemize}命令对文本进行简单的排列,不是采用序号,而是实心圆点符号。这个命令需要和\item配合使用。作为演示,输入如下代码;编译后可以看出在每一段前都加上了实心圆点符号进行排列。

注意,这里的textbf作用为使字体加粗显示。

\begin{itemize}
\item \textbf{上图}:由与无线电传感器共同定位的相机拍摄的图像。
\item \textbf{中间}:仅从RF信号中提取的关键点置信度图。
\item \textbf{底部}:从关键点置信度图解析的RF信号。
\end{itemize}

如果我们不想使用实心圆点符号进行排列的话可以在\item[]的中括号里面指定需要的编号符号。例如我们使用-进行编号,改变代码如下;编译输出后可以看到编号的符号被换成来“-”。当然我们也可以采用其他的符号进行编号。

\begin{itemize}
	\item[-] \textbf{上图}:由与无线电传感器共同定位的相机拍摄的图像。
	\item[-] \textbf{中间}:仅从RF信号中提取的关键点置信度图。
	\item[-] \textbf{底部}:从关键点置信度图解析的RF信号。
\end{itemize}

10. 有序列表

{enumerate}产生带需要的编号,默认是采用数字1,2,3……进行排列,提前加载宏包\usepackage{enumerate}

如果你想用其他排列方式例如(1),(2)…的话需要先加载\usepackage{enumerate},然后再使用。分别输入如下代码使用默认和自定义的编号方式进行编号;编译输出后可以看到默认的使用1,2,3等数字进行编号,而使用(1)的依次使用(1),(2),(3)进行编号。

使用默认编号:

\begin{enumerate}
	\item a
	\item b
\end{enumerate}

使用希腊编码编号:

\begin{enumerate}[i)]
	\item a
	\item b
\end{enumerate}

四、页面排版

1.设置A4纸及字体大小

设置使用中文版的article文档类型排版,并选择UTF8编码格式,支持空格,A4纸张大小,全局字体为小四号:

\documentclass[UTF8,12pt,a4paper,space]{ctexart}

2.调整页边距

geometry 宏包可以方便地调整页边距。导言区引入宏包:

\usepackage{geometry}
\geometry{a4paper,scale=0.8}

上面命令设置了纸张为a4 纸,并且版心占页面长度的比例为80%;scale也可以改为ratio,表示版面边距占页面长度的比例。

该宏包还可以设置页面的上下左右边距,例如:

\usepackage{geometry}
\geometry{a4paper,left=1.7cm,right=1.7cm,top=1.5cm,bottom=1.5cm}

3.设置行间距

\linespread{1.3} % 一倍半行距,在导言区引入
\linespread{1.6} % 双倍行距,在导言区引入

\linspread不仅会改变正文行距,同时也把目录、脚注、图表标题等的行距给改了。如果只想改正文行距,可以使用setspace 宏包的行距命令:

\usepackage{setspace}   %在导言区引入宏包
...
\singlespacing % 单倍行距
\onehalfspacing % 一倍半行距
\doublespacing % 双倍行距
\setstretch{1.25} % 任意行距

\begin{doublespacing}
double \\ spacing
\end{doublespacing}

\begin{spacing}{2.0}%段落行距设置
文字文字文字文字文字文字文字
\end{spacing}

4.段落间距

\parindent: 段落缩进距离
\parskip: 段落间的距离

5.LaTeX的行距与Word行距之间的对应关系

怎么将LaTeX的行距设置得跟Word一样呢?

很简单,就是“乘以1.3除以1.2”,比如在Word中要求的是1.25倍行距,则在LaTeX中设置行距为: 1.25∗1.3/1.2=1.3541667

6.分页命令

\newpage   %分页命令。
\clearpage   %和 \newpage 类似,推荐使用这个。

推荐使用“clearpage”,因为当新加的一页内容较少时,有时“newpage”就无法实现分页效果,但“clearpage”可以。

五、数学公式

先引入宏包: \usepackage{amssymb}

1.行内公式

行内公式一般写法为$我是公式内容$,就是用美元符号夹住。

大家好,我是$a^2+b^2=c^2$行内公式。

2.单行公式

单行公式一般写法为$$我是公式内容$$,用双美元符号夹住。

强势写一波勾股定理$$3^2+4^2=5^2$$其中,吧啦吧啦!

3.在一行中插入多个公式

\begin{displaymath} 
S_{n+1} = S_{n} + S_{1},  
S_{n}=1=2^{n} 
\end{displaymath}

4.公式编号

\begin{equation}
1+2+3+\dots+(n-1)+n = \frac{n(n+1)}{2}
\end{equation}

注意:equation 环境中是是不允许跨页的,可以使用align环境。

5.多行公式

导言区要加上,amsmath宏包(要放在amssymb宏包前面,防止冲突)。

\usepackage{amsmath}
\usepackage{amssymb} %花体样式

(1) 如果想有编号,可以用gatheralign

(2) 如果不想有编号,可以gather*align*,或者在后面加上命令\notag

(3) 如果想一行公式分开写,用split

alignsplit的公式对其,用&

(4) 如果想选择判断,用cases

\documentclass{article}
 
\usepackage{ctex}
\usepackage{amsmath}
\usepackage{amssymb}%花体字符
 
 
\begin{document}
 
 
\begin{gather}%会产生编号
    a+b=b+a\\
    ab=ba
\end{gather}
 
\begin{gather*}%不会产生编号
a \times b=b \times a\\
ab=ba   
\end{gather*}
 
\begin{gather}%会编号
a+b=b+a \notag \\%\notag阻止编号
ab=ba   \notag %\notag阻止编号
\end{gather}
 
 
 
%align和align*环境(用&对齐)
\begin{align}
    x &= t + \cos t + 1\\
    y &= 2\sin t
\end{align}
 
 
%split环境(用&对齐)(一个公式分为多行排版)
\begin{equation}
    \begin{split}
    \cos 2x &= \cos^2 x - \sin^2 x\\
    &= 2\cos^2 x - 1
    \end{split}
\end{equation}
 
 
%case环境
%每行公式使用&分割成两部分
%通常表示值和后面的条件
\begin{equation}
    D(x) = \begin{cases}
    1, &\text{如果} x \in \mathbb{Q}\\%mathbb花体字符
    0, &\text{如果} x \in \mathbb{R}\setminus\mathbb{Q}   
           \end{cases}%\text是为了在数学公式中处理中文
\end{equation}
 
 
\end{document}

6.多行公式对齐

(1) align(多个公式)

这是最基本的对齐环境,其他多公式环境都不同程度地依赖它。

与表格环境一样,它采用”&“分割各个对齐单元,使用”\\“换行。 它的每行是一个公式,都会独立编号。 在排版过程中,它将&分出来的列又分成组,组间特定方式排版,具体方式在flalign环境中讨论。

\begin{align*}
 f(x) & = (x+a)(x+b) \\
      & = x + (a+b)x + ab
\end{align*}

它看起来是这样的:

f(x)=(x+a)(x+b)
    =x+(a+b)x+ab

(2) eqnarray

与align相同,只是在名字上更直接地表示它包含了多个公式。

(3) gather

它是最简单的多行公式环境,自己不提供任何对齐。其中的各行公式按照全局方式分别对齐。

7.公式分页

在LaTeX里公式默认不分页,出现某大公式(多行)位于当前页顶端,而使得上一页底部产生大片空白,或者上一页为了平衡页面布局,段落间距过大,但遇到长公式时必须分页。

导言区加入(要先声明用 amsmath宏包)(要放在amssymb宏包前面,防止冲突):

\usepackage{amsmath}
\usepackage{amssymb} %花体样式
\allowdisplaybreaks[4] %[]里的参数可为1,2,3,4。数值越大,执行跨页的强度越大

[4]表示强制换页等同于直接用\allowdisplaybreaks

另外,也可以不在导言区使用\allowdisplaybreaks,在你想换页的地方使用命令\displaybreak,它也带有选项[n] 意义与前面的相同,该命令最好放在换行符\\ 之前。我们也可以在多行公式的行之间使用\\* 来阻止此处换行。

与gather、align等一起使用,不可与array一起使用。

注意:2019年,有使用者反馈\allowdisplaybreaks与CTEX环境冲突!经测试冲突已经解决。

8.上下标

^{} %power 
_{} %下标

9.分式

\frac{m}{n} %n分之m

10.开方

\sqrt{} %开平方 
\sqrt[m]{n} %n开m次方

11.累计求和

\sum_{i=m}^{n} %从m到n求和

12.累计求积

\prod_{i=m}^{n} %从m到n求积

13.积分

\int_{i=m}^{n} %从m到n积分

14.向量

\vec a  %a向量 
\overrightarrow{AB} %A到B的向量

15.省略号

a+b+\cdots+z %a+b+…+z

16.矩阵

(1). 序言

  矩阵是一个强大的工具,许多东西都能够用矩阵来表示,下面来谈谈在latex中怎么输入一个矩阵

(2). 矩阵

(2.1) 复杂写法

  在latex中,我们可以使用array参数来输入一个矩阵。

    \begin{array}{ccc}
        1 & 0 & 0\\\\
        0 & 1 & 0\\\\
        0 & 0 & 1\\\\
    \end{array}

显示效果:

 1  0  0
 0  1  0
 0  0  1

  可以发现上面的矩阵好像少了点什么???和书上一对照,发现好像没有了()或者[]。实际上,在latex中,如果想给这种形式的矩阵加一个()或者[],并不能直接往代码里添加个()或者[],毕竟矩阵太大,这两个小家伙包不住它。
  通常来说,要使用像\left(\right)来表示。当然()也可以换成[],甚至是||,不过第三个代表的已经不是矩阵了,而是一个行列式。

    $$
    \left[
        \begin{array}{ccc}
            1 & 0 & 0\\\\
            0 & 1 & 0\\\\
            0 & 0 & 1\\\\
        \end{array}
    \right]
    $$
  • tip:{ccc}是指元素的对齐方法(居中),此外还有lr的参数可选,分别表示左和右
(2.2) 简化写法

  如果每次输入矩阵的时候都加上个\left(\right),确实会很烦。但其实latex中,有一些专门的参数可以生成矩阵,像pmatrix(带()的矩阵)、bmatrix(带[]的矩阵)、vmatrix(行列式)

    <!--带`()`的矩阵-->
    \begin{pmatrix}
        1 & 0 & 0\\\\
        0 & 1 & 0\\\\
        0 & 0 & 1\\\\
    \end{pmatrix}
    
    <!--带`[]`的矩阵-->
    \begin{bmatrix}
        1 & 0 & 0\\\\
        0 & 1 & 0\\\\
        0 & 0 & 1\\\\
    \end{bmatrix}
    
    <!--行列式-->
    \begin{vmatrix}
        1 & 0 & 0\\\\
        0 & 1 & 0\\\\
        0 & 0 & 1\\\\
    \end{vmatrix}
(2.3) 复杂矩阵

  有时我们需要输入一些比较复杂的矩阵或者只有字母的矩阵

    $$A = 
        \begin{pmatrix}
            a_{11} & a_{12} & \cdots & a_{1n}\\
            a_{21} & a_{22} & \cdots & a_{2n}\\
            \vdots & \vdots & \ddots & \vdots\\
            a_{n1} & a_{n2} & \cdots & a_{nn}\\
        \end{pmatrix}$$
  • tip:横排列的点 ⋯⋯\cdots 用$\cdots$表示,列排列的点 ⋮⋮\vdots 用$\vdots$表示,斜排列的点 ⋱⋱\ddots 用$\ddots$表示

(3). 表格

  既然提到了array的用法,就稍微介绍一些latex中的表格。

\begin{array}{|c|c|}
        \hline
        0 & 1 \\\\\hline
        1 & 0 \\\\\hline
\end{array}

显示效果:

0 1
1 0
  • tip:\hline表示水平线,而竖线可以使用|来表示

(4). 对齐

  从本质上来说,array是将一些事物对齐显示的阵列,所以也可以对齐其他数学对象。例如我们可以这样做:

\begin{array}{cc}
        (A)\quad 4 & \hspace{4cm}(B)\quad 3\\\\
        (B)\quad 2 & \hspace{4cm}(D)\quad 1
\end{array}
  • tip:\quad\hspace{}都是表示空格,但是空的个数不同

六、表格

LaTeX 提供了许多工具来创建和定制表格,在本系列中,我们将使用 tabulartabularx 环境来创建和定制表。

1.Table和Tabular的区别

\begin{table}[h!]
\centering
\begin{tabular}{||c c c c||} 
 \hline
 Col1 & Col2 & Col2 & Col3 \\ [0.5ex] 
 \hline\hline
 1 & 6 & 87837 & 787 \\ 
 2 & 7 & 78 & 5415 \\
 3 & 545 & 778 & 7507 \\
 4 & 545 & 18744 & 7560 \\
 5 & 88 & 788 & 6344 \\ [1ex] 
 \hline
\end{tabular}
\caption{Table to test captions and labels.}
\label{table:1}
\end{table}

Table和Tabular的区别

  • Tabular:仅指表格的那部分,不包括表格的文字说明等
  • Table:表格的所有元素

2.基础表格

要创建表,只需指定环境 \begin{tabular}{列选项}

\begin{tabular}{c|c}
    Release &Codename \\ \hline
    Fedora Core 1 &Yarrow \\ 
    Fedora Core 2 &Tettnang \\ 
    Fedora Core 3 &Heidelberg \\ 
    Fedora Core 4 &Stentz \\ 
\end{tabular}

在上面的示例中,花括号中的 “{c|c}” 表示文本在列中的位置。下表总结了位置参数及其说明。

参数 位置
c 将文本置于中间
l 将文本左对齐
r 将文本右对齐
p{宽度} 文本对齐单元格顶部
m{宽度} 文本对齐单元格中间
b{宽度} 文本对齐单元格底部

m{宽度}b{宽度} 都要求在最前面导言区引入数组包\usepackage{array},其中宽度可以使用的单位有cm、pt、in、em等。

使用上面的例子,让我们来详细讲解使用的要点,并描述你将在本系列中看到的更多选项:

选项 意义
& 定义每个单元格,这个符号仅用于第二列
\\ 这将终止该行并开始一个新行
| 指定表格中的垂直线(可选)
\hline 指定表格中的水平线(可选)
*{数量}{格式} 当你有许多列时,可以使用这个,并且是限制重复的有效方法
|| 指定表格中垂直双线

3.定制表格

学会了这些选项,让我们使用这些选项创建一个表。

\begin{tabular}{*{3}{|l|}}
\hline
    \textbf{Version} &\textbf{Code name} &\textbf{Year released} \\
\hline
    Fedora 6 &Zod &2006 \\ \hline
    Fedora 7 &Moonshine &2007 \\ \hline
    Fedora 8 &Werewolf &2007 \\
\hline
\end{tabular}

Customise Table

4.管理长文本

如果列中有很多文本,那么它的格式就不好处理,看起来也不好看。

下面的示例显示了文本的格式长度,我们将在导言区中使用 blindtext,以便生成示例文本。

假文的目的是生成大段没有实际含义的文字,常用来测试排版效果。对于西文,TEX 发行版中已经自带了几个宏包,包括 lipsum、kantlipsum 和 blindtext 等。

\begin{tabular}{|l|l|}
    \hline
    Summary &Description \\ \hline
    Test &\blindtext \\ \hline
\end{tabular}

正如你所看到的,文本超出了页面宽度;但是,有几个选项可以克服这个问题。

  • 指定列宽,例如 m{5cm}
  • 利用 tabularx 环境,这需要在导言区中引用 tabularx 宏包。

4.1使用列宽管理长文本

通过指定列宽,文本将被折行为如下示例所示的宽度。

\begin{tabular}{|l|m{14cm}|} 
    \hline
    Summary &Description \\ \hline
    Test &\blindtext \\ 
    \hline
\end{tabular}\vspace{3mm}
  • 使用vspace{3mm}指定表格与后面内容间的垂直间距。

4.2使用 tabularx 管理长文

Latex默认的tabular包一个恼人的问题是不能自动调节表格每一个条目的宽度,经常会导致某一个条目字数太多超出了页面margin。使用tabularx包可以动态调整表格条目宽度。

在我们利用表格之前,我们需要在导言区中加上它\usepackage{tabularx}tabularx 方法见以下示例:\begin{tabularx}{宽度}{列选项}

例如:\begin{tabularx}{10.5cm}{|X|X|X|} %表格总宽度为10.5cm,共3列,宽度均相同。每列宽度为10.5/3=3.5,是自动计算出来的。如果将上面表将的设置改为\begin{tabularx}{\linewidth}{|p{3cm}|X|X|},则表格的总宽度是行宽,第1列列宽为3cm,其他两列的列宽自动计算。

  • {\linewidth}指表格总宽度为行宽,{\textwidth}指表格总宽度为文本宽。
\begin{tabularx}{\textwidth}{|l|X|}
  \hline
  Summary & Tabularx Description\\
  \hline
  Text &\blindtext \\
  \hline
\end{tabularx}

请注意,我们需要处理长文本的列在花括号中指定了大写 XX是tabularx包默认的自动宽度布局方式,X表示可换行。除了X,还有c,l,r(居中,左,右),但c,l,r不可换行。效果区别如下,即,将上述“X”换成“L”的情况:

\begin{tabularx}{\textwidth}{|l|l|}
	\hline
	Summary & Tabularx Description\\
	\hline
	Text &\blindtext \\
	\hline
\end{tabularx}

tabularx_l不换行

4.3 Table位置的调整

\begin{table}[h!] 中的[h!]是表格的参数,用来调整表格位置,具体有参数有

参数 位置 官方解释
h 以浮动的方式放置在当前位置,大概是在原文本出现的位置,但不完全是 Place the float here, i.e., approximately at the same point it occurs in the source text (however, not exactly at the spot)
t 放置在页面顶部 Position at the top of the page.
b 放置在页面底部 Position at the bottom of the page.
p 只为浮动设置一个特殊页面 Put on a special page for floats only.
! 覆盖LaTex用于确认“良好”浮动的内部参数 Override internal parameters LaTeX uses for determining “good” float positions.
H 将浮动精确的放置在Latex代码中的位置,需要导入float包,与h!等价。表格呆在原位不能浮动。 Places the float at precisely the location in the LATEX code. Requires the float package. This is somewhat equivalent to h!

5.合并行合并列

有时需要合并行或列。本节描述了如何完成。要使用 multirowmulticolumn,请将 \usepackage{multirow} 添加到导言区。

5.1 合并行

multirow 采用以下参数 \multirow{行的数量}{宽度}{文本},让我们看看下面的示例。

\begin{tabular}{|l|l|}\hline
    Release &Codename \\ \hline
    Fedora Core 4 &Stentz \\ \hline
    \multirow{2}{*}{MultiRow} &Fedora 8 \\ 
    &Werewolf \\ \hline
\end{tabular}

在上面的示例中,指定了两行,* 告诉 LaTeX 自动管理单元格的大小,如果不确定{宽度}需要填什么,就将其替换为*

\begin{table}
	\begin{tabular}{c|lp{1.4in}lp{1.4in}}
		Name&Salary&Likes&Children&Desires\\\hline
		\multirow{3}{*}{Mark}&\multirow{3}{*}{$\$250,000$}&windsurfing&Amy&\multirow{3}{*}{own
			a cheese shop}\\
		~&~&jumping on&John&~\\
		~&~&a trampoline&Ray&~\\\hline
		\multirow{3}{*}{Carly}&$\multirow{3}{*}{\$80,000}$&heavy metal music&\multirow{3}{*}{Tyra}
		&tattoo a president\\
		~&~&Paris&~&\multirow{2}{*}{of the united states}\\
		~&~&dancing in the rain&~&~\\\hline
		\multirow{3}{*}{Carter}&$\multirow{3}{*}{\$25,000}$&candy&\multirow{3}{*}{None}&play the
		Ukelele\\
		~&~&fast cars that he cannot afford&~&\multirow{2}{*}{ travel the world}\\
		~&~&Ramen&~&~\\\hline
		\multirow{3}{*}{Sam}&$\multirow{3}{*}{\$50,000}$&paintingit&Kyle&\multirow{3}{*}{be in the
			circus}\\
		~&~&motorcycles&\multirow{2}{*}{Sam Jr.}&~\\
		~&~&Reddit&~&~
	\end{tabular}
\end{table}

  • \multirow{行数}{*}{文本}:当某个单元格需要占多行时,就使用该方式即可。例如,Mark需要占三行,则使用 \multirow{3}{*}{Mark}。对于第二行和第三行的第一个单元格,则填写~即可。
  • 注意:上述代码中表格填入了~,这个符号放在这里表示这个单元格什么都不填,但是一定要保留这个空位,不然会产生文字叠加与表格不对齐。

5.2 合并行横线贯穿问题

\begin{table}
	\centering
	\begin{tabular}{|c|c|c|c|}
		\hline
		\multirow{2}*{合并两行一列} & 二 & 三 & 四 \\
		~ & 2 & 3 & 4 \\
		\hline
	\end{tabular}
\end{table}

注意:这里并没有进行划线,如果直接在第1行和第2行之间插入一个\hline,这条划线会穿过第1个单元格。

\begin{table}
	\centering
	\begin{tabular}{|c|c|c|c|}
		\hline
		\multirow{2}*{合并两行一列} & 二 & 三 & 四 \\
		~ & 2 & 3 & 4 \\
		\hline
	\end{tabular}
\end{table}

解决方法是划一条从第2列开始到末尾的横线,使用命令\cline{start-end}

\begin{table}
	\centering
	\begin{tabular}{|c|c|c|c|}
		\hline
		\multirow{2}*{合并两行一列} & 二 & 三 & 四 \\
		\cline{2-4}
		~ & 2 & 3 & 4 \\
		\hline
	\end{tabular}
\end{table}

5.3 合并列

multicolumn 参数是 {multicolumn{列的数量}{单元格选项及位置}{文本},注意这里的第2个参数是{单元格选项及位置},与\multirow第2个参数不同,下面的示例演示合并列。

\begin{tabular}{|l|l|l|}\hline
    Release &Codename &Date \\ \hline
    Fedora Core 4 &Stentz &2005 \\ \hline
    \multicolumn{3}{|c|}{Mulit-Column} \\ \hline
\end{tabular}

6.使用颜色

可以为文本、单个单元格或整行指定颜色。此外,我们可以为每一行配置交替的颜色。

在给表添加颜色之前,我们需要在导言区引用 \usepackage[table]{xcolor}。我们还可以使用以下颜色参考 LaTeX Color 或在颜色前缀后面添加感叹号(从 0 到 100 的阴影)来定义颜色。例如,gray!30

\definecolor{darkblue}{rgb}{0.0, 0.0, 0.55}
\definecolor{darkgray}{rgb}{0.66, 0.66, 0.66}

下面的示例演示了一个具有各种颜色的表,\rowcolors 采用以下选项 \rowcolors{起始行颜色}{偶数行颜色}{奇数行颜色}

\rowcolors{2}{darkgray}{gray!20}
\begin{tabular}{c|c}
    Release &Codename \\ \hline
    Fedora  Core 1 &Yarrow \\
    Fedora Core 2 &Tettnang \\
    Fedora Core 3 &Heidelberg \\
    Fedora Core 4 &Stentz \\
\end{tabular}

除了上面的例子,\rowcolor 可以用来指定每一行的颜色,这个方法在有合并行时效果最好。以下示例显示将 \rowColors 与合并行一起使用的影响以及如何解决此问题。

你可以看到,在合并行中,只有第一行能显示颜色。想要解决这个问题,需要这样做:

\begin{tabular}{|l|l|}\hline
    \rowcolor{darkblue}\textsc{\color{white}Release}  &\textsc{\color{white}Codename} \\ \hline
    \rowcolor{gray!10}Fedora Core 4 &Stentz \\ \hline
    \rowcolor{gray!40}&Fedora 8 \\ 
    \rowcolor{gray!40}\multirow{-2}{*}{Multi-Row} &Werewolf \\ \hline
\end{tabular}

让我们讲解一下为解决合并行替换颜色问题而实施的更改。

  • 第一行从合并行上方开始
  • 行数从 2 更改为 -2,这意味着从上面的行开始读取
  • \rowcolor 是为每一行指定的,更重要的是,多行必须具有相同的颜色,这样才能获得所需的结果。

关于颜色的最后一个注意事项是,要更改列的颜色,需要创建新的列类型并定义颜色。下面的示例说明了如何定义新的列颜色。

\newcolumntype{g}{>{\columncolor{darkblue}}l}

我们把它分解一下:

  • \newcolumntype{g}:将字母 g 定义为新列
  • {>{\columncolor{darkblue}}l}:在这里我们选择我们想要的颜色,并且 l 告诉列左对齐,这可以用 cr 代替。
\begin{tabular}{g|l} 
    \textsc{Release}  &\textsc{Codename} \\ \hline
    Fedora Core 4 &Stentz \\ 
    &Fedora 8 \\ 
    \multirow{-2}{*}{Multi-Row} &Werewolf \\ 
\end{tabular}\

7.横向表

有时,你的表可能有许多列,纵向排列会很不好看。在导言区加入 rotating\usepackage{rotating},你将能够创建一个横向表。下面的例子说明了这一点。

对于横向表,我们将使用 sidewaystable 环境并在其中添加表格环境,我们还指定了其他选项。

  • \centering 可以将表格放置在页面中心
  • \caption{} 为表命名
  • \label{} 这使我们能够引用文档中的表
\begin{sidewaystable}
\centering
\caption{Sideways Table}
\label{sidetable}
\begin{tabular}{ll}
    \rowcolor{darkblue}\textsc{\color{white}Release}  &\textsc{\color{white}Codename} \\ 
    \rowcolor{gray!10}Fedora Core 4 &Stentz \\ 
    \rowcolor{gray!40} &Fedora 8 \\ 
    \rowcolor{gray!40}\multirow{-2}{*}{Multi-Row} &Werewolf \\ 
\end{tabular}\vspace{3mm}
\end{sidewaystable}

8.列表和表格

要将列表包含到表中,可以使用 tabularx,并将列表包含在指定的列中。另一个办法是使用表格格式,但必须指定列宽。

8.1用 tabularx 处理列表

\begin{tabularx}{\textwidth}{|l|X|} 
    \hline
    Fedora Version &Editions \\ \hline
    Fedora 32 &\begin{itemize}[noitemsep]
        \item CoreOS
        \item Silverblue
        \item IoT
    \end{itemize} \\
    \hline
\end{tabularx}\vspace{3mm}

8.2用 tabular 处理列表

\begin{tabular}{|l|m{6cm}|}\hline
        Fedora Version &amp;amp;amp;Editions \\\ \hline
    Fedora 32 &amp;amp;amp;\begin{itemize}[noitemsep]
        \item CoreOS
        \item Silverblue
        \item IoT
    \end{itemize} \\\ \hline
\end{tabular}

9.LaTeX 宏包

所需的宏包有如下这些:

\usepackage{fullpage}
\usepackage{blindtext}  % add demo text
\usepackage{array} % used for column positions
\usepackage{tabularx} % adds tabularx which is used for text wrapping
\usepackage{multirow} % multi-row and multi-colour support
\usepackage[table]{xcolor} % add colour to the columns 
\usepackage{rotating} % for landscape/sideways tables

10.额外的知识

这是一堂关于表的小课,有关表和 LaTex 的更多高级信息,请访问 LaTex Wiki

七、疑难解答

1.处理中文时ctex宏包xeCJK宏包的选择

(1)全中文的文档,尽量用 ctex 文档类,即ctexart、ctexrep、ctexbook、ctexbeamer 这些。

(2)二者区别的通俗理解就是:底层方法(直接使用 xeCJK 宏包)和高层方法(使用 CTEX 宏集调用底层 xeCJK)。ctex 包在检测到你使用 XeLaTeX 编译时,会调用更底层的 xeCJK。ctex 包若是一辆车,xeCJK 就是个轮子,轮子是车子的重要零件。

(3)另外,xeCJK 宏包只提供了两种中文字体宋体和楷体。采用 ctex 宏包或者 ctex 系列的文档类处理中文已经成为处理中文文档的主流。

CTEX宏集会根据用户使用的编译方式,在底层选择不同的中文支持方式,如下所示:

(pdf)LaTeX: CJK
XeLaTeX: xeCJK
LuaLaTeX: LuaTeX-ja
upLaTeX: 原生

因此,当我们没有使用ctex文档类时,而是使用的如下文档类语法时: \documentclass{article} 我们就需要使用如下中文支持并支持空格:

\usepackage[space]{ctex}

注意:

\documentclass{ctexart}\usepackage{ctex}不可同时使用,二者会冲突出错!但是,\documentclass{ctexart}\usepackage{xeCJK}可同时使用!

2.


版权声明:本文由 Duter2016 在 2020年08月09日发表。本文采用CC BY-NC-SA 4.0许可协议,非商业转载请注明出处,不得用于商业目的。
文章题目及链接:《LaTeX排版基础语法》




  相关文章:

「游客及非Github用户留言」:

「Github登录用户留言」:

TOP