Google 上有很多搜索结果,包括 Tex SE 中的一个,但我都不太明白。请不要写类似这样的内容:
tabular* 调整相邻列文本之间的间距以获得给定的表格宽度,tabularx 保持此列间间距固定,而是调整“X”列内的文本宽度以达到相同目的。
有人能提供一个有意义的 MWE 吗?代码胜过文字。
答案1
查看以下 MWE:
\documentclass{article}
\usepackage{tabularx}
\begin{document}
\begin{tabular}{|l|c|r|}
\hline
foo & bar & fubar \\
fubar & toobar & foo \\
\hline
\end{tabular}
\vspace{1cm}
\begin{tabular*}{\textwidth}{@{\extracolsep{\fill}}|l|c|r|}
\hline
foo & bar & fubar \\
fubar & toobar & foo \\
\hline
\end{tabular*}
\vspace{1cm}
\begin{tabularx}{\textwidth}{|X|X|X|}
\hline
foo & bar & fubar \\
fubar & toobar & foo \\
\hline
\end{tabularx}
\end{document}
正如您所注意到的,在默认tabular
环境下,列的宽度与容纳其内容所需的宽度相同。
在该tabular*
版本中,LaTeX 会在列之间添加补充空间,以使表格达到指定的宽度(即\textwidth
)。但是,列的宽度并没有改变。您可以看到第二列的内容相对于两个垂直条没有居中。
如果设计目标是生成一个包含左对齐材料的等宽列的表格,则使用 可获得最佳效果tabularx
。新的X
列类型将使 LaTeX 自动计算列的宽度,以使表格的宽度达到指定的宽度。您可能想知道为什么我示例中的内容不居中。您能定义具有自动宽度计算的居中列,我只是想给出一个简单的示例,不需要太多开销。该包的文档非常好,因此您可以轻松调整我的示例以满足您的需求。
答案2
首先,我将展示 和 版本的同一个(诚然是人为的)表格的屏幕截图tabular
。第一列中的材料左对齐;五个数据列中的材料居中;居中方法的确切性质将在下面解释。顺便说一句,表格中没有垂直规则。水平规则由包的宏(、、和)生成。tabular*
tabularx
booktabs
\toprule
\cmidrule
\midrule
\bottomrule
tabular
对阵tabular*
tabular
和环境之间最显著的区别tabular*
在于,后者可以设置为占用预先指定的宽度。通常,但不一定,这个宽度将是\textwidth
,即文本块的宽度。(在上面的例子中,tabular*
和tabularx
环境的宽度设置为0.85\textwidth
。)实现目标宽度(在 的第一个参数中指定)是通过在 的第二个参数中tabular*
插入看起来并不那么明显的 [!] 指令来实现的。@{\extracolsep{\fill}}
tabular*
除此之外,
tabular
和tabular*
环境具有相同的功能。具体来说,它们“知道”相同的基本列类型:l
、、和。可以通过加载专用包(例如,和用于和列类型的包)以及加载包并利用该包的宏来设置其他列c
类型。r
p
dcolumn
siunitx
D
S
array
\newcolumntype
@{\extracolsep{\fill}}
环境中的指令的结果tabular*
是,列内容继续按其自然宽度排版;调整的是列间空白量。这可以通过仔细查看前两个表中的五个数据列来直观地验证:c
在两种情况下,它们的列类型都是。请注意,“BB”和“DD”列比“AA”、“CC”和“EE”列要宽。列宽不同可能无害,也可能有问题。如果有很多列,并且列宽相差很大,则可能会出现视觉上的不适。尽管列内容不同,但实现共同的列宽是使用 的一个非常好的理由tabularx
;有关此主题的更多信息,请参见下文。顺便说一句,
tabular*
基于的表格往往看起来可怕如果它们包含内部垂直规则。屏幕截图中显示的表格不包含外部或内部垂直规则。无论如何,省略所有垂直规则通常是一个好主意。
为什么要设定目标宽度?
- 另一个问题是:为什么要费心设置目标宽度?为什么不让表格占据其自然宽度(当然,假设它适合文本块)?使用自然宽度肯定会使表格看起来最紧凑;紧凑性通常是——但不总是...——这是可取的。如果文档中有很多表格,并且这些表格的自然宽度相差很大,则会出现设计问题。在这种情况下,文档很快就会呈现出参差不齐的外观。将所有表格设置为占用相同的宽度——例如
\textwidth
——可以避免这个问题。个人轶事:我曾经负责创建会议论文集——当然使用 LaTeX :-)——我与一位才华横溢的内部图书设计师合作,做出了所有布局决定。这本书最终包含大约 15 篇论文,几乎所有论文都包含相当多的表格。图书设计师很快说服我,如果所有表格共享一个共同的宽度,文档——在本例中是整本书——看起来会好得多。[这一切都发生在软件包tabularx
出现之前;当时,tabular*
这是镇上唯一的游戏。]
tabularx
并tabular*
进行比较
为了使用
tabularx
环境,tabularx
必须加载包。此包提供了一种名为 的新列类型X
,它是基本 LaTeXp
列类型的派生类型。与tabular*
环境一样,tabularx
环境采用两个参数:预期宽度和列规范集。值得注意的是,没有必要指定诸如 之类的东西@{\extracolsep{\fill}}
来实现整体目标宽度。相反,包会自动计算列的宽度X
以实现整体目标宽度。事实上,每个tabularx
环境必须X
如果要达到所需的整体宽度,则至少要有一列。默认情况下,
X
列以完全对齐或“段落”模式排版其内容。这可以通过使用\newcolumntype
指令进行更改;对于tabularx
屏幕截图表 3 中所示的环境,C
使用名为的列类型。由于X
和C
列(最终)都基于 LaTeX 的p
列类型,因此如果需要,将自动应用换行。重要的是,LaTeX 不会期望用户执行计算以得出每个p
列的合适宽度,而是自己执行所需的计算。重要的是,除非有人特意更改默认值,否则给定环境中的所有列
X
在构造上都具有相同的宽度。这通常(但并非总是)会产生非常令人愉悦的整体外观。我认为拥有相等的列宽通常是使用环境的一个很好的理由。C
tabularx
tabularx
tabular*
现在让我们比较一下和环境生成的表的外观tabularx
。首先要注意的是,它们并没有太大的不同;这其实并不奇怪,因为在这两种情况下,左侧列都是类型l
,五个数据列都居中。然而,还是有一些重要的区别,其中包括“BB”和“DD”列的“外观”;它们的列宽与“AA”、“CC”和“EE”列的列宽不同,tabular*
但在本例中没有tabularx
。我会告诉大家,我“操纵”了表结构,这样tabularx
示例中就会有两个问题,而示例没有tabular*
:(a)“BB”列的内容实际上比列类型计算的宽度要宽C
(请注意,由于内容是数字,因此无法换行),因此,“BB”标题是不居中覆盖列内容;(b) 在该案例中,“EE”列右侧有空格,tabularx
但根据构造,案例中没有空格tabular*
。在我看来,该tabular*
解决方案看起来更平衡。
总而言之,比较tabular*
和tabularx
解决方案不仅仅是简单地观察前者通过改变列间空白来工作,后者通过改变列宽来工作。实际上,这两种环境在某些情况下会产生相当相似的结果,而在其他情况下则会产生相当不同的结果。熟悉这两种方法并能够以两种方式排版给定的表格,然后决定哪种方法最有效,这是一个好主意。
\documentclass{article}
\usepackage{booktabs,tabularx,caption}
\captionsetup{skip=0.33\baselineskip}
\newcolumntype{C}{>{\centering\arraybackslash}X}
% The following macro gets used three times in the body of the document
\newcommand\tabbody{%
\toprule
Time of Day & \multicolumn{5}{c}{Event types} \\
\cmidrule{2-6}
& AA & BB & CC & DD & EE \\
\midrule
Morning & 1.45 & 2.5613444 & 3.67 & 4.78111 & 5.89 \\
Evening & 9.54 & 8.4322222 & 7.32 & 6.21111 & 5.10 \\
\bottomrule}
\begin{document}
\hrule % just to indicate width of text block
\begin{table}[h]
\centering
\caption{A \texttt{tabular} solution}
\begin{tabular}{@{}l*{5}{c}@{}}
\tabbody
\end{tabular}
\bigskip
\caption{A \texttt{tabular*} solution}
\begin{tabular*}{0.85\textwidth}{@{}l @{\extracolsep{\fill}} *{5}{c} @{}}
\tabbody
\end{tabular*}
\bigskip
\caption{A \texttt{tabularx} solution}
\begin{tabularx}{0.85\textwidth}{@{}l *{5}{C}@{}}
\tabbody
\end{tabularx}
\end{table}
\end{document}
答案3
普通 LaTeX 表格
每一列都有其空间,表格的总宽度是各列的总宽度(加上列间空间)。
***%
\begin{tabular}{p{2cm}p{2cm}p{2cm}}
a a a a a a a a a a a a a a a
& b b b b b b b b b b b b b b b
& c c c c c c c c c c c c c c c
\end{tabular}%
***
普通 LaTeX 表格*
每一列都占据其空间,但表格的外部有固定的宽度。
如果此宽度太小(3cm
),则后面的材料将覆盖列。
***%
\begin{tabular*}{3cm}{p{2cm}p{2cm}p{2cm}}
a a a a a a a a a a a a a a a
& b b b b b b b b b b b b b b b
& c c c c c c c c c c c c c c c
\end{tabular*}%
***
如果此宽度太宽(0.8\linewidth
),则多余的空间将位于表格的右侧。
***%
\begin{tabular*}{0.8\textwidth}{p{2cm}p{2cm}p{2cm}}
a a a a a a a a a a a a a a a
& b b b b b b b b b b b b b b b
& c c c c c c c c c c c c c c c
\end{tabular*}%
***
可以分配额外的空间之间列使用\extracolsep
,但列保持其宽度。
***%
\begin{tabular*}{0.8\textwidth}{@{\extracolsep{\fill} }p{2cm}p{2cm}p{2cm}}
a a a a a a a a a a a a a a a
& b b b b b b b b b b b b b b b
& c c c c c c c c c c c c c c c
\end{tabular*}%
***
来自同名包的 tabularx
表格向外具有固定宽度。固定宽度的列不需要的空间将均匀分配给类型的列X
。
\usepackage{tabularx}
...
***%
\begin{tabularx}{3cm}{XXX}
a a a a a a a a a a a a a a a
& b b b b b b b b b b b b b b b
& c c c c c c c c c c c c c c c
\end{tabularx}%
***
\usepackage{tabularx}
...
***%
\begin{tabularx}{0.8\textwidth}{XXX}
a a a a a a a a a a a a a a a
& b b b b b b b b b b b b b b b
& c c c c c c c c c c c c c c c
\end{tabularx}%
***