LaTeX 表格教程(tabularx 与自动换行、自动计算列宽)
LaTeX 的表格排版总是痛苦的,特别是你碰见了表格单元是由一段一段的文字构成的时候,表格排版会痛不欲生。在这种条件下,我要介绍 tabularx 包来帮助我们实现表格内自动换行与自动计算列宽,它能帮助我们缓解痛苦,愉快工作。
在一切开始之前
- tabularx 有用吗?tabular 不够好吗?
首先,tabularx 与 tabular 不是替代关系。并且没有一定要使用 tabularx 的理由,它只是提供了自己的改进功能,帮助我们在某些情况下更快的编写表格。
- 什么时候 tabularx 更好用?
当你需要计算相对于总宽度的列宽时,tabularx 更加好用。请注意,如果你的列宽很短且不包含换行符,则使用 tabularx 不会获得任何好处。你可以使用常规 p 或 wl 说明符的 tabular 来固定列的宽度。
- 有类似的例子吗?
- 表格内有大段的文字时
- 表格有几个相等宽度的列,并且内部需要换行
- 已经不想去计算表格宽度的时候
可恶的表格与可爱的表格
上面的表格构成简单,简单编写后就很好看。无论内容是否简练,至少文字清晰。但下面这个表格就不行了。
表格内容多,格式复杂。最重要的是在要求表格为文字宽度后,内容根本看不清楚。
对于 tabular 教程,知乎有一篇不错。学会 tabular 可以更快地掌握 tabularx。当然,不会 tabular 不影响你继续看下去。(保姆级LaTeX教程|插入表格)
在开始之前,我先推荐赶时间的同学们用下面这个网站自动化生成表格吧,使用 tabular 完成简单的表格是够用的。(Tables Generator)
少说废话,我们开始吧!
tabularx 使用
从一个简单的例子开始吧。
1 |
|
结果如下图。
和 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 |
|
利用 tabular 实现标题与表格居中,内部的表格绘制由 tabularx 完成。
下面的图或许可以帮助你更好的理解上文
代码如下
1 |
|
高级技巧
X 列的不同宽度
通常,单个表中的所有 X 列都设置为相同的宽度,但是可以让 tabularx 将它们设置为不同的宽度。下面是文档中的例子。
1 |
|
指定两列,第二列的宽度是第一列的三倍。但是,如果你想进行这种神奇地操作,则应遵循以下两条规则。
- 确保所有 X 列的宽度之和保持不变。(在上面的示例中,新宽度加起来仍然是默认宽度的两倍,即等于两个标准宽度相同 X 列)
- 不要使用跨越任何 X 列的
看看效果
1 |
|
已知问题
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