LaTeX 表格教程(tabularx 与自动换行、自动计算列宽)

LaTeX 的表格排版总是痛苦的,特别是你碰见了表格单元是由一段一段的文字构成的时候,表格排版会痛不欲生。在这种条件下,我要介绍 tabularx 包来帮助我们实现表格内自动换行与自动计算列宽,它能帮助我们缓解痛苦,愉快工作。

在一切开始之前

  1. tabularx 有用吗?tabular 不够好吗?

首先,tabularx 与 tabular 不是替代关系。并且没有一定要使用 tabularx 的理由,它只是提供了自己的改进功能,帮助我们在某些情况下更快的编写表格。

  1. 什么时候 tabularx 更好用?

当你需要计算相对于总宽度的列宽时,tabularx 更加好用。请注意,如果你的列宽很短且不包含换行符,则使用 tabularx 不会获得任何好处。你可以使用常规 p 或 wl 说明符的 tabular 来固定列的宽度。

  1. 有类似的例子吗?
  • 表格内有大段的文字时
  • 表格有几个相等宽度的列,并且内部需要换行
  • 已经不想去计算表格宽度的时候

可恶的表格与可爱的表格

可爱的表格(简单)

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

可恶的表格(复杂)

表格内容多,格式复杂。最重要的是在要求表格为文字宽度后,内容根本看不清楚。

对于 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&defabc & 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 将它们设置为不同的宽度。下面是文档中的例子。

1
2
3
4
{
>{\hsize=.5\hsize\linewidth=\hsize}X
>{\hsize=1.5\hsize\linewidth=\hsize}X
}

指定两列,第二列的宽度是第一列的三倍。但是,如果你想进行这种神奇地操作,则应遵循以下两条规则。

  • 确保所有 X 列的宽度之和保持不变。(在上面的示例中,新宽度加起来仍然是默认宽度的两倍,即等于两个标准宽度相同 X 列)
  • 不要使用跨越任何 X 列的

看看效果

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 结构。

参考

  1. https://ctan.mirror.globo.tech/macros/latex/required/tools/tabularx.pdf
  2. https://zhuanlan.zhihu.com/p/406538024
  3. https://www.overleaf.com/learn/latex/Tables
  4. https://latex.org/forum/viewtopic.php?t=5998
  5. https://tex.stackexchange.com/questions/468363/when-should-the-tabularx-environment-be-used-or-not

LaTeX 表格教程(tabularx 与自动换行、自动计算列宽)
https://blog.hydrogenroom.icu/post/a178f8a9.html
作者
Hydrogen
发布于
2022年12月11日
许可协议