TeX 的表格陷阱

(La)TeX 常被视为高质量出版工具。 确实如此, 但并非用它们生成的文档必然具备较高的排版质量: 计算机工具始终遵守人的指令, 因此排版质量的最终决定者仍然是作者本身。

LaTeX 给人一种快速上手的感觉, 某些作者可能愿意简单地将自己的文档按照结构化的方式以 LaTeX 代码呈现, 剩下的排版细节留给宏包以及排版引擎。 (某种程度上讲这也是 LaTeX 的设计目标之一。)

Plain TeX 相对而言要求作者对排版细节知悉更多。 例如, 它要求用户手动添加 {\it 斜体修正\/} 。 这看起来毫无必要, 并且丝毫不 “智能”; LaTeX 的 \textit{斜体} 功能就自动在末尾添加了斜体修正。

下面考虑一个 TeX 中比较麻烦的问题: 表格排版。 理论上, 可以把表格内的数据分离出来, 只需套用所需的格式, 就可以排版表格。 但是实践中往往需要手动地调整表格的样式。 因此, 从表格的排版中常常可以看出作者对细节的关注程度。 为了充分展示问题, 我选择讨论一个带有竖线的表格。 带有竖线的表格在 TeX 里较难处理 (但它在 Microsoft Word 里出乎意料地容易), 虽然这种样式越来越不流行, 且不被推荐。 1

日常的 LaTeX 用户会这样排版她的表格:

\begin{tabular}{|c|c|c|}
\hline
State&Remainder&Answer\\
\hline \hline
Start&000000&000000\\ \hline
5& & \\ \hline
4& & \\ \hline
3& & \\ \hline
2& & \\ \hline
1& & \\ \hline
0& & \\ \hline
\end{tabular}

她得到的表格如下:

相当不错。 但放大了看, 可以看出有一些问题: 构成边框的竖线是断续的, 每经过一个横线的地方都有一个小的凹陷, 产生了很奇怪的视觉效果。

怎样修复? 从原理入手, 似乎只需要把每行的 \hline 弄得更长一些, 覆盖那些凹陷就可以了。 但是似乎又无从下手。

对于 LaTeX 用户, 解决各种问题方案往往是 “找一下有没有现成的宏包”。 真的有。 hhline 宏包提供了 \hhline, 比普通的 \hline 更强, 其中一个功能就是对付这种边界有竖线的表格。 在这里, 只需把 \hline 都改成 \hhline{|---|} 即可。

第二个问题: 如果我是作者, 我不希望表格的第一行和剩余部分在视觉上是分离的。 换言之, 我希望在第一行下方的双横线的两端, 也有竖线将边框连接起来。 这个问题乍一看又无从下手。 好在 hhline 宏包又解决了问题: 把双横线的 \hline \hline 改成 \hhline{|===|} 即可。

这是利用 hhline 宏包得到的排版效果:

非常神奇, 我根本不知道 \hhline 做了什么有趣的魔法。 不过问题解决了, 简单、 快速。

真正挑剔的读者, 比如 DEK, (我想) 恐怕对上面的结果还是不满意的。 观察一下表格中的 000000, 它到上方横线的距离远小于到下方横线的距离。 这种间距的设置给人一种单元格内的文字向上偏移的感觉。 如果单元格内恰好都是小写字母, 可能效果还不错, 但是在这里就有问题了。

实际上, 我见过一些出版物, 它们有明显的特征表明是用 LaTeX 排版的 (Computer Modern 字体、 风格类似的目录、 标题、 题注, 以及交叉引用等功能), 并且其中的表格就有这种字符向上偏移的问题。 现在看来, 恐怕作者也是按照类似的方式输入了她的表格, 并用 LaTeX 的默认设置把它排版出来。

“肯定也有一个宏包能解决这个问题,” 我打算这么说。 但是我懒得去查找解决方案了。 总之, LaTeX 的默认设置不能实现最佳的排版效果。

习惯了现代的 “智能” 软件的用户或许会有此疑问:

  • LaTeX 不是高质量排版工具吗? 为什么默认情况下会选择一种丑陋的样式?

这个问题很难回答。 我想 LaTeX 本身也希望在任何情况下, 默认设置都能生成美观的结果。 但是它不可能考虑到所有情况, 更不可能理解你的意图。 另一方面, 改变默认行为是非常危险的: 这会导致之前写好的文档重新排版时产生不同的结果。 (试想你用另一个软件打开 Word 文档的情况。) 好在, 当 LaTeX 产生令人不满的结果时, 往往还能找到解决方案。 很多 “智能” 的软件自负地认为它的设计是最好的, 不给用户更多调节的余地。

这里的讨论对 LaTeX 可能也有些不公平。 LaTeX 希望实现内容和格式的分离。 如果用户喜欢这种带框线的表格, 最好的办法是她创建一个新的 environment, 定义相应的样式, 在正文部分只保留内容。 不过这并不容易, 一旦离开了 “现成的宏包” 解决方案, LaTeX 就变得相当复杂。 有一个 booktab 可用于创建三线表, 很明显这个宏包的作者并不喜欢且不建议使用任何其他格式的表格。

Plain TeX 用户用 \halign 这个原始指令 (即最基本的 TeX 命令) 排版表格。 细心的作者会仔细调节相关的参数, 直到得到满意的效果。

有一些用户可能觉得三种排版结果根本看不出来有什么区别。 确实, 不是形状残缺、 字符错乱这种关键问题, 不影响阅读 (没有减少 “信息量”)。 是否值得较真取决于个人喜好。 TeX 的作者很明显对这些细节很感兴趣。


  1. 带有斜线的表格更难处理。 或者说, TeX 本身就不具备处理带斜线表格的能力。 令人意外的是 Microsoft Word 对此的支持也很不错。 ↩︎


分享