LaTeX 的表格排版总是痛苦的,特别是你碰见了表格单元是由一段一段的文字构成的时候,表格排版会痛不欲生。在这种条件下,我要介绍 tabularx 包来帮助我们实现表格内自动换行与自动计算列宽,它能帮助我们缓解痛苦,愉快工作。
在一切开始之前
- tabularx 有用吗?tabular 不够好吗?
首先,tabularx 与 tabular 不是替代关系。并且没有一定要使用 tabularx 的理由,它只是提供了自己的改进功能,帮助我们在某些情况下更快的编写表格。
- 什么时候 tabularx 更好用?
当你需要计算相对于总宽度的列宽时,tabularx 更加好用。请注意,如果你的列宽很短且不包含换行符,则使用 tabularx 不会获得任何好处。你可以使用常规 p 或 wl 说明符的 tabular 来固定列的宽度。
- 有类似的例子吗?
- 表格内有大段的文字时
- 表格有几个相等宽度的列,并且内部需要换行
- 已经不想去计算表格宽度的时候
可恶的表格与可爱的表格

上面的表格构成简单,简单编写后就很好看。无论内容是否简练,至少文字清晰。但下面这个表格就不行了。

表格内容多,格式复杂。最重要的是在要求表格为文字宽度后,内容根本看不清楚。
对于 tabular 教程,知乎有一篇不错。学会 tabular 可以更快地掌握 tabularx。当然,不会 tabular 不影响你继续看下去。(保姆级LaTeX教程|插入表格)
在开始之前,我先推荐赶时间的同学们用下面这个网站自动化生成表格吧,使用 tabular 完成简单的表格是够用的。(Tables Generator)
少说废话,我们开始吧!
tabularx 使用
从一个简单的例子开始吧。
1
2
3
4
5
6
7
8
9
10
11
|
\begin{tabularx}{0.8\textwidth} {
| >{\raggedright\arraybackslash}X
| >{\centering\arraybackslash}X
| >{\raggedleft\arraybackslash}X
| }
\hline
abc & edf & ghi\\
\hline
edf & abc & ghi\\
\hline
\end{tabularx}
|
结果如下图。

和 tabular 表格一样,整个表格环境从\begin{tabularx}开始,于\end{tabularx}结束。与 tabular 不同,第二个参数由大括号包裹,设置整个表格的宽度。在本例中,宽度为 0.8 的文字宽度;当然,这个文字宽度肯定不是 abc egf ghi 的宽度,\textwidth是整个页面中一行满满的文字的宽度,而 0.8 自然代表只有 80% 的宽度啦,你还可以是0.5\textwidth或者干脆占满宽度\textwidth(可别傻乎乎的写个1\textwidth,但也许也行?)。
那么,后面的 | >{\raggedright\arraybackslash}X是什么呢?让我们进入 tabularx 的关键 X 吧!
X
如果你学会了 tabular,你一定知道{|l|c|r|}是什么意思。不会也没关系,我教你啊。
我们用 | 产生表格中的竖线,而l是要求这一列左对齐,c 是居中对齐,r 是右对齐。那么,{|l|c|r|}表示,表格有三列,从左到右依次是:左对齐、居中对齐、右对齐。同时,表格最外围的竖线和表内的竖线都要手动用 | 产生,如果写成了 {l|c|r} 的话,表格最外面的边框是不存在的!
tabularx兼容以上写法,同时定义了一个新的字母—— 大写的 X。使用 X 指定的列,将会自动换行并向左对齐。那么,向右对齐呢?居中对齐呢?
我们知道\raggedrigh和\centering分别对应了向左对齐(参差不齐的右边即左对齐)、居中对齐。但在 tabularx 中不能直接使用,他们会破坏换行符\\。为此,tabularx 定义了 \arraybackslash 来解决这个问题。使用方法就是直接加在后面,比如 >{\raggedright\arraybackslash}X 就是进行左对齐,>和{}不能少!
**每一个 tabularx 表格至少要有一个 X 列!**虽然兼容 l,c,r 写法,但纯 l,c,r 组成的 tabularx 表格会出错的!
单元格与横线
每一个单元格使用&分开,空格不是必须的。abc&def和 abc & def 的效果一致。换行使用 \\ 完成,但每一行之间的横线不会自动生成,使用\hline手动生成吧!
如果要希望横线只占满几个格子,请使用\cline{begin-end}代替\hline。比如\cline{2-3}将只在从左向右数第 2、3 格下产生横线。
标题与表格居中
tabularx 表格是可以嵌入 tabular 表格中的!没想到吧😀。这波是齐心努力,做大做强。
位于内部的表格最好用{}包裹起来。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
\begin{table}[]
\centering
\caption{0.8 textwidth}\label{tab:dummy-1}
{
\begin{tabularx}{0.8\textwidth} {
| >{\raggedright\arraybackslash}X
| >{\centering\arraybackslash}X
| >{\raggedleft\arraybackslash}X
|}
\hline
abc & edf & ghi \\
\hline
edf & abc & ghi \\
\hline
\end{tabularx}
}
\end{table}
|
利用 tabular 实现标题与表格居中,内部的表格绘制由 tabularx 完成。
下面的图或许可以帮助你更好的理解上文
代码如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
%%%%%% 错误示范 %%%%%%%
\begin{tabularx}{0.8\textwidth} {|c|c|c|}
\hline
abc&edf & ghi \\
\cline{2-3}
edf & abc & ghi \\
\hline
\end{tabularx}
%%%%%%% 错误示范结束 %%%%%%%%
\begin{table}[!ht]
\centering
\caption{0.8 textwidth}\label{tab:dummy-1}
{
\begin{tabularx}{0.8\textwidth} {|X|X|X|}
\hline
abc & edf & ghi \\
\cline{2-3}
edf & abc & ghi \\
\hline
\end{tabularx}
}
\end{table}
%%%%%%%%%%%%%%%%%%%%%%
\begin{table}[!ht]
\centering
\caption{0.5 textwidth}\label{tab:dummy-1}
{
\begin{tabularx}{0.5\textwidth} {
| >{\raggedright\arraybackslash}X
| >{\centering\arraybackslash}X
| >{\raggedleft\arraybackslash}X
|}
\hline
abc & edf & ghi \\
\hline
edf & abc & ghi \\
\hline
\end{tabularx}
}
\end{table}
%%%%%%%%%%%%%%%%%%%%%
\begin{table}[!ht]
\centering
\caption{1 textwidth}\label{tab:dummy-1}
{
\begin{tabularx}{\textwidth} {
| >{\raggedright\arraybackslash}X
| >{\centering\arraybackslash}X
| >{\raggedleft\arraybackslash}X
|}
\hline
abc & edf & ghi \\
\hline
edf & abc & ghi \\
\hline
\end{tabularx}
}
\end{table}
|
高级技巧
X 列的不同宽度
通常,单个表中的所有 X 列都设置为相同的宽度,但是可以让 tabularx 将它们设置为不同的宽度。下面是文档中的例子。
{
>{\hsize=.5\hsize\linewidth=\hsize}X
>{\hsize=1.5\hsize\linewidth=\hsize}X
}
指定两列,第二列的宽度是第一列的三倍。但是,如果你想进行这种神奇地操作,则应遵循以下两条规则。
- 确保所有 X 列的宽度之和保持不变。(在上面的示例中,新宽度加起来仍然是默认宽度的两倍,即等于两个标准宽度相同 X 列)
- 不要使用跨越任何 X 列的 \multicolumn
看看效果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
\begin{table}[]
\centering
\caption{测试}\label{tab:dummy-1}
{
\begin{tabularx}{\textwidth} {
| >{\raggedright\arraybackslash}X
| >{\centering\arraybackslash}X
| >{\raggedleft\arraybackslash}X
|}
\hline
指企业在工商行政管理部门登记的注册资金。其中由三项原则:1. 资本确定原则:企业设立时,必须明确规定企业的资本总额和投资者认缴的数额2. 资本充实原则:资本金的筹集应及时、足额3. 资本维持原则:在持续经营期间应保持资本金的完整性,不得随意增加、减少资本 & edf & ghi \\
\hline
edf & abc & ghi \\
\hline
\end{tabularx}
}
\end{table}
|
已知问题
tabularx 在搜索最佳列宽时必须多次生成表格,因此速度要慢得多。此外,表格地多次膨胀可能会破坏某些 TEX 结构。
参考
- https://ctan.mirror.globo.tech/macros/latex/required/tools/tabularx.pdf
- https://zhuanlan.zhihu.com/p/406538024
- https://www.overleaf.com/learn/latex/Tables
- https://latex.org/forum/viewtopic.php?t=5998
- https://tex.stackexchange.com/questions/468363/when-should-the-tabularx-environment-be-used-or-not