普通 LaTeX 表格

普通 LaTeX 表格

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*tabularxbooktabs\toprule\cmidrule\midrule\bottomrule

在此处输入图片描述

tabular对阵tabular*

  • tabular和环境之间最显著的区别tabular*在于,后者可以设置为占用预先指定的宽度。通常,但不一定,这个宽度将是\textwidth,即文本块的宽度。(在上面的例子中,tabular*tabularx环境的宽度设置为0.85\textwidth。)实现目标宽度(在 的第一个参数中指定)是通过在 的第二个参数中tabular*插入看起来并不那么明显的 [!] 指令来实现的。@{\extracolsep{\fill}}tabular*

  • 除此之外,tabulartabular*环境具有相同的功能。具体来说,它们“知道”相同的基本列类型:l、、和。可以通过加载专用包(例如,和用于和列类型的包)以及加载包并利用该包的宏来设置其他列c类型。rpdcolumnsiunitxDSarray\newcolumntype

  • @{\extracolsep{\fill}}环境中的指令的结果tabular*是,列内容继续按其自然宽度排版;调整的是列间空白量。这可以通过仔细查看前两个表中的五个数据列来直观地验证:c在两种情况下,它们的列类型都是。请注意,“BB”和“DD”列比“AA”、“CC”和“EE”列要宽。列宽不同可能无害,也可能有问题。如果有很多列,并且列宽相差很大,则可能会出现视觉上的不适。尽管列内容不同,但实现共同的列宽是使用 的一个非常好的理由tabularx;有关此主题的更多信息,请参见下文。

  • 顺便说一句,tabular*基于的表格往往看起来可怕如果它们包含内部垂直规则。屏幕截图中显示的表格不包含外部或内部垂直规则。无论如何,省略所有垂直规则通常是一个好主意。

为什么要设定目标宽度?

  • 另一个问题是:为什么要费心设置目标宽度?为什么不让表格占据其自然宽度(当然,假设它适合文本块)?使用自然宽度肯定会使表格看起来最紧凑;紧凑性通常是——但不总是...——这是可取的。如果文档中有很多表格,并且这些表格的自然宽度相差很大,则会出现设计问题。在这种情况下,文档很快就会呈现出参差不齐的外观。将所有表格设置为占用相同的宽度——例如\textwidth——可以避免这个问题。个人轶事:我曾经负责创建会议论文集——当然使用 LaTeX :-)——我与一位才华横溢的内部图书设计师合作,做出了所有布局决定。这本书最终包含大约 15 篇论文,几乎所有论文都包含相当多的表格。图书设计师很快说服我,如果所有表格共享一个共同的宽度,文档——在本例中是整本书——看起来会好得多。[这一切都发生在软件包tabularx出现之前;当时,tabular*这是镇上唯一的游戏。]

tabularxtabular*进行比较

  • 为了使用tabularx环境,tabularx必须加载包。此包提供了一种名为 的新列类型X,它是基本 LaTeXp列类型的派生类型。与tabular*环境一样,tabularx环境采用两个参数:预期宽度和列规范集。值得注意的是,没有必要指定诸如 之类的东西@{\extracolsep{\fill}}来实现整体目标宽度。相反,包会自动计算列的宽度X以实现整体目标宽度。事实上,每个tabularx环境必须X如果要达到所需的整体宽度,则至少要有一列。

  • 默认情况下,X列以完全对齐或“段落”模式排版其内容。这可以通过使用\newcolumntype指令进行更改;对于tabularx屏幕截图表 3 中所示的环境,C使用名为的列类型。由于XC列(最终)都基于 LaTeX 的p列类型,因此如果需要,将自动应用换行。重要的是,LaTeX 不会期望用户执行计算以得出每个p列的合适宽度,而是自己执行所需的计算。

  • 重要的是,除非有人特意更改默认值,否则给定环境中的所有列X在构造上都具有相同的宽度。这通常(但并非总是)会产生非常令人愉悦的整体外观。我认为拥有相等的列宽通常是使用环境的一个很好的理由。Ctabularxtabularx

  • 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}%
***

在此处输入图片描述

相关内容