在使用Latex的过程中,绘制一张漂亮的表格无疑是一大难题,常常不是bug就是不符合要求,一画表格就掉一撮头发,于是整理了这样一份Latex表格攻略。
文末附上一个超强工具,能光速搞定Latex表格。
内容可能有点多,先看目录,各取所需:
目录
超强工具分享
总体来说,要纯靠手敲代码生成一个latex表格,不仅难搞,还耗时,但是我遇到了一个在线生成latex语法表格的网站,真的大大提高了我的生产力。
https://www.tablesgenerator.com/
方法1:
可以从CSV文件导入,这意味着你可以在excel里做成表格,转csv格式然后导入到这个网站
方法2:
这个方法更简便,直接从excel或者wps里面粘贴过来就行,单表格内多行和多个合并都可以实现而且会在你合并行或者合并列的时候提醒你要引入对应的包。
基础画法
从一张基础的表格开始
简单表格代码
首先,绘制一张表格需要创建table 和 tabular 环境。
代码第一行\begin{table}表示浮动表格的环境,[htp]是可选参数,也可以不加。
name | mean |
---|---|
h | (here) 表示这个浮动体放在当前位置 |
b | (bottom) 表示放在一页的底部 |
t | (top) 表示放在一页的最顶上 |
p | 表示放在一个浮动页(单独一页) |
三个参数都加表示让Latex来自动判断并选择最合适的情况。通常Latex都会自己判断并选择最合适的情况,如果自己想强制放在某个位置,可以加!,比如[!h] 表示强制放在当前位置。
在table环境后添加上表格的标题\caption,\label为表格的标签,而后使用tabular环境,表格的内容就在tabular中。
在文章开头还需要加上宏包
\usepackage{array}
一个简单的表格绘制代码如下所示:
\begin{table}[!htp]
\centering
\caption{Start with a simple form} \label{one}
\begin{tabular}{l|c|r}
\hline
1 & 2 & 3 \\
\hline
01 & 02 & 03 \\
\hline
001 & 002 & 003 \\
\hline
\end{tabular}
\end{table}
表格属性及常用命令
例子里面的l|c|r这样的,那个地方叫做导言区,来约定表格的每列属性的:
name | mean |
---|---|
l | left-justified column |
c | centered column |
r | right-justified column |
b | bottom |
c | center (default) |
t | top |
p{'width'} | paragraph column with text vertically aligned at the top |
m{'width'} | paragraph column with text vertically aligned in the middle (requires array package) |
b{'width'} | paragraph column with text vertically aligned at the bottom (requires array package) |
| | vertical line |
|| | double vertical line |
另外还有一些常用的命令
name | mean |
---|---|
& | column separator |
\\ | start new row (additional space may be specified after \\ using square brackets, such as \\[6pt] |
\hline | horizontal line |
\newline | start a new line within a cell (in a paragraph column) |
\tabularnewline | start a new line within a cell (in a paragraph column) instead of \\ to avoid a Misplaced \noalign error in the tabular |
\cline{i-j} | partial horizontal line beginning in column i and ending in column j |
表格第一步变形
我们把上面所说的属性和常用指令加进最初的表格中,大家可以跟前面对比一下,一共修改了四处地方
\begin{table}[!htp]
\centering
\caption{The first improvement of the form} \label{two}
\begin{tabular}{l|c|r||p{1cm}|m{5cm}<{\centering}}
\hline
1 & 2 & 3 & 4 & 5\\
\hline
01 & 02 & 03 & 04 & Good morning, thanks for giving me this opportunity for this face to face interview\\
\cline{2-5}
001 & 002 & 003 & Good morning & 005 \\
\hline
\end{tabular}
\end{table}
- 多了
||
讲列的分割线变成两竖 p{1cm}
设置指定列1cm的列宽m{5cm}<{\centering}
设置指定列5cm的列宽,并让它居中放置\cline{2-5}
与\hline
不同,\cline{2-5}
为设置2-5列的横线
注意
使用m{'width'}b{'width'}
这两个指令时,需要加上array宏包。
\usepackage{array}
在这里我们会发现,使用p{'width'}
,m{'width'}
,b{'width'}
时,如果表格内的文字过长,它会自动换行。
调整行间距
方法1:
\renewcommand{\arraystretch}{1.5} %rows, default value is 1.0
举例如下:
\begin{table}[!htp]
\centering
\caption{1.5 times the line spacing} \label{three}
\renewcommand{\arraystretch}{1.5}
\begin{tabular}{l|c|r}
\hline
1 & 2 & 3 \\
\hline
01 & 02 & 03 \\
\hline
001 & 002 & 003 \\
\hline
\end{tabular}
\end{table}
方法2:
在导言区使用 \linespread
命令。
\linespread{2.0}
使用了这个命令以后,从此之后的行距都变成 2.0 倍了。
如果只想对一小部分做更改,可以用大括号把这一段括起来,如
{
\linespread{2.0} \selectfont
% 两倍行距的文字
}
% 一倍行距的文字
这样就不会对括号外的部分进行改变,字体、字号类命令也可以这么用,举例如下:
\begin{table}[!htp]
\centering
\caption{2.5 times the line spacing} \label{four}
{
\linespread{2.5} \selectfont
\begin{tabular}{l|c|r}
\hline
1 & 2 & 3 \\
\hline
01 & 02 & 03 \\
\hline
001 & 002 & 003 \\
\hline
\end{tabular}
}
\end{table}
方法3:使用setspace宏包
\usepackage{setspace}
\begin{document}
\begin{spacing}{2.0}
% 这里是两倍行距
\end{spacing}
% 这里是默认行距
\end{document}
举例如下:
\begin{table}[!htp]
\begin{spacing}{2.0}
\centering
\caption{2 times the line spacing} \label{five}
\begin{tabular}{l|c|r}
\hline
1 & 2 & 3 \\
\hline
01 & 02 & 03 \\
\hline
001 & 002 & 003 \\
\hline
\end{tabular}
\end{spacing}
\end{table}
调整列宽
调整表格总长
\begin{table}[!htp]
\centering
\caption{columns spacing} \label{six}
\begin{tabularx}{10cm}{lll}
\hline
1 & 2 & 3 \\
\hline
01 & 02 & 03 \\
\hline
001 & 002 & 003 \\
\hline
\end{tabularx}
\end{table}
这种方法不能够均分每一列的宽度,而是设置表格总长后,前两行剩下的都是第三行的,效果图如下:
调整所有列的宽度
\setlength{\tabcolsep}{15pt} %columns, default value is 6pt
默认的宽度是6pt,采用这句代码可以同时改变所有列的宽度,同样放个例子:
\begin{table}[!htp]
\centering
\caption{columns spacing} \label{six}
\setlength{\tabcolsep}{15pt}
\begin{tabular}{lll}
\hline
1 & 2 & 3 \\
\hline
01 & 02 & 03 \\
\hline
001 & 002 & 003 \\
\hline
\end{tabular}
\end{table}
调整中间某列的宽度
方法1:
第一种方法其实前面已经有描述过,即使用p{'width'}
,m{'width'}
,b{'width'}
可以改变单列的宽度,这里就不再赘述,忘记了的小伙伴可以跳转到前面‘表格第一步变形’这一部分看一下。
方法2:
加上宏包tabularx,将环境改成tabularx,效果如Table9所示:
\usepackage{tabularx}
\begin{table}[!htp]
\centering
\caption{columns spacing} \label{six}
\begin{tabularx}{10cm}{llX}
\hline
1 & 2 & 3 \\
\hline
01 & 02 & 03 \\
\hline
001 & 002 & 003 \\
\hline
\end{tabularx}
\end{table}
注意 \begin{tabularx}{10cm}{llX}
这个X必须写成大写X。为什么?因为这是 tabularx 环境的语法,而LaTeX代码里大小写是有分别的,所以一定要注意。
如果将 \begin{tabularx}{10cm}{llX}
的X换个位置,\begin{tabularx}{10cm}{lXl}
,那么就是改变中间那一列的列宽,即X就是代表我们所要改变的那一列,效果图如Table10所示。
表格进阶
合并行&列/合并单元格
一张表格往往不会像上面举例的表格那样简单,常常需要合并单元格(如Table11所示)。在latex里面,合并单元格分为合并行单元格和合并列单元格,两个需要用到不同的代码,分别是multirow
(行)和multicolumn
(列)。
首先都必须要先引入宏包\usepackage{multirow}
合并行
\multirow{NUMBER_OF_ROWS}{WIDTH}{CONTENT}
NUMBER_OF_ROWS代表该表格单元占据的行数,WIDTH代表表格的宽度,一般填 * 代表自动宽度,CONTENT则是表格单元里的内容。
\begin{table}[!htp]
\centering
\caption{multirow table} \label{six}
\begin{tabular}{lll}
\hline
\multirow{2}{*}{First} & 2 & 3\\
\cline{2-3}
& 02 & 03 \\
\hline
001 & 002 & 003 \\
\hline
\end{tabular}
\end{table}
主要是这一句代码\multirow{2}{*}{First} & 2 & 3\\
,使得内容为 12 的这一个表格单元占据了两行。注意的是,下一行的第一个位置,由于已经被 12 这个单元给占据了,因此第二行的代码是& 02 & 03 \\
,这里第一个位置没有写东西,如果写了东西会使得这一行超过3列,表格错位。
另外一个需要注意的地方是,由于合并的行,所以两行间的分割线需要改成\cline{xx-xx}
,只在需要的地方画线。
合并列
\multicolumn{NUMBER_OF_COLUMNS}{ALIGNMENT}{CONTENT}
NUMBER_OF_COLUMNS代表该表格单元占据的列数,ALIGNMENT代表表格内容的偏移(填l,c或者r),CONTENT则是表格单元里的内容。
\usepackage{multirow}
\begin{table}[!htp]
\centering
\caption{multicolumn table} \label{six}
\begin{tabular}{lll}
\hline
\multicolumn{2}{c|}{First} & 3\\
\hline
01 & 02 & 03 \\
\hline
001 & 002 & 003 \\
\hline
\end{tabular}
\end{table}
这里主要是这一句代码 \multicolumn{2}{c|}{First} & 3\\
,使得内容为 12 的这一个表格单元占据了两列。所以这一行接下来只能填一个元素3。注意这里的ALIGNMENT写的是c|
代表表格内容居中,表格右侧有竖线而左侧没有。
行列比较多需要合并的话,需要多加注意,下面我表格的实例看起来复杂,实际上也只是上面两个代码的多次运用。
\begin{table}[!h]
\centering
\caption{Merge Cells} \label{mult}
\newcommand{\minitab}[2][l]{\begin{tabular}{#1}#2\end{tabular}}
\begin{tabular}{c|c|cccccc}
\hline
\multicolumn{2}{c|}{station} & 1A & 2A & 3A & 1B & 2B & 3B \\
\hline
\multirow{4}{*}{Arrival Rate(Person/second)}
& T1 & a & a & a & a & a & a\\
\cline{2-8}
& T2 & a & a & a & a & a & a\\
\cline{2-8}
& T3 & a & a & a & a & a & a\\
\cline{2-8}
& T4 & a & a & a & a & a & a\\
\hline
\multicolumn{2}{c|}{Alight Rate} & a & a & a & a & a & a \\
\hline
\multicolumn{2}{c|}{Transfer Rate} & \multicolumn{6}{c}{$2A {\rightarrow} 2B:0.5$}\\
\hline
\end{tabular}
\end{table}
行列都需要合并
有时候表格的单元需要同时占据两行和两列,这是最复杂的。其实只需要把\multicolumn{NUMBER_OF_COLUMNS}{ALIGNMENT}{CONTENT}的CONTENT
写成\multirow{NUMBER_OF_ROWS}{WIDTH}{CONTENT}
就可以了。
\begin{table}[!htp]
\centering
\caption{multirowcolumn table} \label{six}
\begin{tabular}{lll}
\hline
\multicolumn{2}{c|}{\multirow{2}{*}{First}} & 3 \\
\multicolumn{2}{c|}{} & 03 \\
\hline
001 & 002 & 003 \\
\hline
\end{tabular}
\end{table}
最主要的语句\multicolumn{2}{c|}{\multirow{2}{*}{First}} & 3 \\
使得内容为First的表格单元占据了2行2列,所以当前这一行右边只能再写一个元素3了,然后注意的是下一行是\multicolumn{2}{c|}{} & 03 \\
用一个空的multicolumn
来代表前两个位置空置,然后填剩下的一个元素03
。
将表格旋转90°放置
这里需要加入宏包,并且将table环境换成
\begin{sidewaystable}[htp]
......
\end{sidewaystable}
同样放上一个例子:
\usepackage[figuresright]{rotating}
\begin{sidewaystable}[htp]
\caption{This is a caption}
\centering %表格整体居中
\footnotesize %设置字体
\begin{tabular}{l*{7}{L{1cm}}} %共7列,每一列列宽为1cm
\hline %横线
1111111 & 1222222 & 1333333 & 1444444 & 1555555 & 1666666 & 1777777\\
\hline
2111111 & 2222222 & 2333333 & 2444444 & 2555555 & 2666666 & 2777777\\
3111111 & 3222222 & 3333333 & 3444444 & 3555555 & 3666666 & 3777777\\
4111111 & 4222222 & 4333333 & 4444444 & 4555555 & 4666666 & 4777777\\
2111111 & 2222222 & 2333333 & 2444444 & 2555555 & 2666666 & 2777777\\
3111111 & 3222222 & 3333333 & 3444444 & 3555555 & 3666666 & 3777777\\
4111111 & 4222222 & 4333333 & 4444444 & 4555555 & 4666666 & 4777777\\
2111111 & 2222222 & 2333333 & 2444444 & 2555555 & 2666666 & 2777777\\
3111111 & 3222222 & 3333333 & 3444444 & 3555555 & 3666666 & 3777777\\
4111111 & 4222222 & 4333333 & 4444444 & 4555555 & 4666666 & 4777777\\
2111111 & 2222222 & 2333333 & 2444444 & 2555555 & 2666666 & 2777777\\
3111111 & 3222222 & 3333333 & 3444444 & 3555555 & 3666666 & 3777777\\
4111111 & 4222222 & 4333333 & 4444444 & 4555555 & 4666666 & 4777777\\
\hline
\end{tabular}
\end{sidewaystable}
上面这个例子是逆时针旋转90°的情况,如果如果要将表格顺时针旋转,只需改动宏包即可,将[figuresright]
改为[figuresleft]
即\usepackage[figuresright]{rotating}
表格内文字强制换行
首先要在导言区加入下面语句,这句加在宏包之后,或者table环境内都可以,建议加在宏包之后,这样整篇文章都适用,不需要逐个表格重复去定义。
\newcommand{\tabincell}[2]{\begin{tabular}{@{}#1@{}}#2\end{tabular}}
之后只要在需要强制换行的单元格前面加上\tabincell{c}{需换行内容}
,需换行内容里只需要直接加上\\
,就可以换行。
\newcommand{\tabincell}[2]{\begin{tabular}{@{}#1@{}}#2\end{tabular}}
\begin{table}[!htp]
\centering
\caption{tabincell} \label{six}
\begin{tabular}{lll}
\hline
1 & 2 & 3 \\
\hline
01 & 02 & 03 \\
\hline
\tabincell{c}{0\\0\\1} & 002 & 003 \\
\hline
\end{tabular}
\end{table}
添加脚注
添加脚注需要加宏包
\usepackage{threeparttable}
\begin{table}[!htp]
\centering
\caption{footnote} \label{six}
\begin{threeparttable}
\begin{tabular}{llllll}
\hline
1 & 2 & 3 & 4 & 5 & 6 \\
\hline
01 & 02 & 03 & 04 & 05 & 06\\
\hline
001 & 002 & 003 & 004 & 005 & 006\\
\hline
\end{tabular}
\begin{tablenotes}
\item[1] tablefootnote 1
\item[2] tablefootnote 2
\end{tablenotes}
\end{threeparttable}
\end{table}
在需要加脚注的地方写上
\begin{tablenotes}
\item[1] 脚注内容
\item[2] 脚注内容
\end{tablenotes}
这边需要注意一个细节,就是要加上这个
\begin{threeparttable}
...
\end{threeparttable}
不然会导致脚注不能与表格内容对齐,而是会突出一点(如Table20所示)。
斜线式表头
斜线式表头在日常中也经常需要用到,这时候我们需要用到宏包diagbox
\usepackage{diagbox}
\begin{table}[!htp]
\centering
\caption{diagbox} \label{six}
\begin{tabular}{l|lll}
\hline
\diagbox{Second}{Minute}{Time}& 1 & 2 & 3 \\
\hline
00 & 01 & 02 & 03 \\
\hline
000 & 001 & 002 & 003 \\
\hline
\end{tabular}
\end{table}
关键语句在 \diagbox{Second}{Minute}{Time}& 1 & 2 & 3 \\
将\diagbox{内容}{内容}{内容}
放在第一行第一列的位置即可。
表格涂色
对表格进行涂色,首先要加上宏包colortbl
\usepackage{colortbl}
其中\columncolor
、\rowcolor
、\cellcolor
命令可以分别设置列、行、单元格的颜色。三个命令同时使用时,它们的优先顺序为:单元格、行、列。
\begin{table}[!htp]
\centering
\caption{colorful table} \label{six}
\begin{tabular}{c>{\columncolor[rgb]{.9,.0,.0}}cc}
\rowcolor[gray]{.9}1 & 2 & 3\\
01& 02& 03\\
\cellcolor[rgb]{.7,.8,.9}001&
\cellcolor[rgb]{.7,.7,.9}002&
\cellcolor[rgb]{.7,.6,.9}003\\
\end{tabular}
\end{table}
其中对列加颜色是将原本\begin{tabular}{ccc}
的{ccc}
替换成{c>{\columncolor[rgb]{.9,.0,.0}}cc}
,c
依旧是原本居中的意思,在哪一列前面涂色就将{\columncolor[rgb]{.9,.0,.0}}
放在哪一列的前面,注意它只会将它后面那一列涂色,并不会对多列涂色,假如要对前两列涂色(如图Table16),则应写成:
\begin{table}[!htp]
\centering
\caption{colorful table} \label{six}
\begin{tabular}{>{\columncolor[rgb]{.9,.0,.0}}c|>{\columncolor[rgb]{.9,.0,.0}}cc}
\rowcolor[gray]{.9}1 & 2 & 3\\
01& 02& 03\\
\cellcolor[rgb]{.7,.8,.9}001&
\cellcolor[rgb]{.7,.7,.9}002&
\cellcolor[rgb]{.7,.6,.9}003\\
\end{tabular}
\end{table}
相同道理,对某行或某个单元格涂色就在相应的行/单元格加上相应语句\rowcolor
/\cellcolor
。
[gray]{x}
和[rgb]{r,g,b}
是两种不同的颜色写法。
[rgb]{r,g,b}
其中{r,g,b}
代表red、green和blue三种颜色的组合,取值范围为[0-1],[gray]{x}
中的x
的取值范围也为[0-1]。