LaTeX/表格
表格是学术写作中常见的元素,常用于总结研究结果。因此,掌握 LaTeX 中表格构建技巧对于撰写高质量论文至关重要。经过足够多的练习,您就可以打印出任何类型的精美表格。
请记住,LaTeX 不是电子表格软件,因此最好使用专门的工具构建表格,然后将这些表格导出到文档中。基本表格并不复杂,但任何更高级的表格都需要大量的构建工作;在这种情况下,更高级的包会非常有用。然而,首先了解基础知识很重要。一旦您对基本的 LaTeX 表格感到满意,就可以尝试使用更高级的包或 您最喜欢的电子表格的导出选项。得益于 LaTeX 的模块化特性,整个过程可以以相当便捷的方式实现自动化。
LaTeX 内置支持排版表格,并提供两个环境:tabular 和 table。要排版行和列中的内容,需要使用 tabular 环境;可选的 table 环境是类似于 figure 的浮动体容器,可以将 tabular 环境包含在其中。
table 环境包含标题并定义表格的浮动体,即表格在文档中的位置以及是否要居中显示。 \caption
和 \label
命令可以像图片一样使用。有关 table 环境的更多信息,请参见 使用 table 浮动 部分。
在任何情况下,表格的实际内容都包含在 tabular 环境中。
tabular 环境可用于排版可选带水平线和垂直线的表格。LaTeX 会自动确定列的宽度。
环境的第一行具有以下形式
\begin{tabular}[pos]{table spec}
|
table spec 参数告诉 LaTeX 在每列中使用哪种对齐方式以及要插入哪些垂直线。
不需要指定列数,因为可以通过查看提供的参数数量来推断。也可以在这里添加列之间的垂直线。以下符号可用于描述表格列(其中一些符号需要加载 array 包)
l | 左对齐列 |
c | 居中列 |
r | 右对齐列 |
p{'width'} | 段落列,文本垂直对齐在顶部 |
m{'width'} | 段落列,文本垂直居中对齐(需要 array 包) |
b{'width'} | 段落列,文本垂直对齐在底部(需要 array 包) |
| | 垂直线 |
|| | 双垂直线 |
默认情况下,如果列中的文本宽度超过页面宽度,LaTeX 不会自动换行。使用 p{'width'},您可以定义一种特殊类型的列,该列将像普通段落一样换行。您可以使用 LaTeX 支持的任何单位传递宽度,例如 'pt' 和 'cm',或 命令长度,例如 \textwidth
。您可以在第 长度 章中找到列表。
可选参数 pos 可用于指定表格相对于周围文本基线的垂直位置。 在大多数情况下,您不需要此选项。 只有当表格不在自己的段落中时,它才会变得相关。 您可以使用以下字母
b | 底部 |
c | 居中(默认) |
t | 顶部 |
要为整列指定字体格式(例如粗体、斜体等),您可以在声明对齐方式之前添加 >{\format}
。 例如 \{tabular}{ >{\bfseries}l c >{\itshape}r }
将指示一个三列表格,第一列左对齐并以粗体字显示,第二列居中对齐并以正常字体显示,第三列右对齐并以斜体字显示。 为了使此方法有效,需要在前言中激活“array”包。
在第一行中,您已经指出了您想要的列数、它们的排列方式以及分隔它们的垂直线。 进入环境后,您必须介绍您想要的文本,在单元格之间分隔并引入新行。 您必须使用以下命令
&
|
列分隔符 |
\\
|
开始新行(可以在 \\ 后指定额外的空间,例如 \\[6pt]) |
\hline
|
水平线 |
\newline
|
在单元格内开始新行(在段落列中) |
\cline{i-j}
|
从第 i 列开始到第 j 列结束的局部水平线 |
注意,在这些命令之间插入的任何空格纯粹取决于个人喜好。 我个人在之间添加空格以使其更容易阅读。
此示例演示了如何在 LaTeX 中创建简单的表格。 它是一个三乘三的表格,但没有线条。
\begin{tabular}{ l c r }
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
\end{tabular}
|
|
通过添加一些垂直线来扩展它
\begin{tabular}{ l | c | r }
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
\end{tabular}
|
|
要将水平线添加到表格的最顶部和底部边缘
\begin{tabular}{ l | c | r }
\hline
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
\hline
\end{tabular}
|
|
最后,在所有行之间添加线条,以及居中(注意使用居中环境——当然,此结果在该网页的预览中并不明显)
\begin{center}
\begin{tabular}{ l | c | r }
\hline
1 & 2 & 3 \\ \hline
4 & 5 & 6 \\ \hline
7 & 8 & 9 \\
\hline
\end{tabular}
\end{center}
|
|
\begin{center}
\begin{tabular}{ | l | c | r }
\hline
1 & 2 & 3 \\ \hline
4 & 5 & 6 \\ \hline
7 & 8 & 9 \\
\hline
\end{tabular}
\end{center}
|
|
\begin{tabular}{|r|l|}
\hline
7C0 & hexadecimal \\
3700 & octal \\ \cline{2-2}
11111000000 & binary \\
\hline \hline
1984 & decimal \\
\hline
\end{tabular}
|
LaTeX 用于格式化表格的算法有一些缺点。 其中一个缺点是,它不会自动换行单元格中的文本,即使它超出了页面的宽度。 对于包含长度超过列所需宽度的文本的列,建议您使用 p 属性并指定所需的列宽度(尽管可能需要一些试错才能获得您想要的结果)。 有关更方便的方法,请查看 tabularx 包 或 tabulary 包。
不要使用 p,而是使用 m 属性使行与框的中间对齐,或使用 b 属性使行与框的底部对齐。
这是一个简单的示例。 以下代码创建了两个具有相同代码的表格; 唯一的区别是第二个表格的最后一列的定义宽度为 5 厘米,而第一个表格没有指定任何宽度。 编译此代码
\documentclass{article}
\usepackage[english]{babel}
\begin{document}
Without specifying width for last column:
\begin{center}
\begin{tabular}{| l | l | l | l |}
\hline
Day & Min Temp & Max Temp & Summary \\ \hline
Monday & 11C & 22C & A clear day with lots of sunshine.
However, the strong breeze will bring down the temperatures. \\ \hline
Tuesday & 9C & 19C & Cloudy with rain, across many northern regions. Clear spells
across most of Scotland and Northern Ireland,
but rain reaching the far northwest. \\ \hline
Wednesday & 10C & 21C & Rain will still linger for the morning.
Conditions will improve by early afternoon and continue
throughout the evening. \\
\hline
\end{tabular}
\end{center}
With width specified:
\begin{center}
\begin{tabular}{ | l | l | l | p{5cm} |}
\hline
Day & Min Temp & Max Temp & Summary \\ \hline
Monday & 11C & 22C & A clear day with lots of sunshine.
However, the strong breeze will bring down the temperatures. \\ \hline
Tuesday & 9C & 19C & Cloudy with rain, across many northern regions. Clear spells
across most of Scotland and Northern Ireland,
but rain reaching the far northwest. \\ \hline
Wednesday & 10C & 21C & Rain will still linger for the morning.
Conditions will improve by early afternoon and continue
throughout the evening. \\
\hline
\end{tabular}
\end{center}
\end{document}
|
您将获得以下输出
请注意,第一个表格已被裁剪,因为输出比页面宽度更宽。
有时在使用 p 说明符时,需要手动指定换行符,而不是依赖换行算法。 在这种情况下,最简单的方法是使用 \parbox
\begin{tabular}{cc}
boring cell content & \parbox[t]{5cm}{rather long par\\new par}
\end{tabular}
|
这里 t 参数控制文本在框内的放置位置。 其他允许的值是 c 用于居中和 b 用于底部。
要调整列之间的空间(LaTeX 默认情况下会选择非常紧密的列),可以更改列间距: \setlength{\tabcolsep}{5pt}
。 默认值为 6pt。
您还可以使用 hspace 引入水平空间,例如: \{tabular}{r@{\hspace{1in}}rr}
有关 hspace 长度 的不同选项。
重新定义 \arraystretch
命令来设置行之间的空间
\renewcommand{\arraystretch}{1.5}
|
默认值为 1.0。
调整规则间距的另一种方法是在 \hline
和 \cline{i-j}
命令之前或之后添加 \noalign{\smallskip}
。
\begin{tabular}{ | l | l | r | }
\hline\noalign{\smallskip}
\multicolumn{2}{c}{Item} \\
\cline{1-2}\noalign{\smallskip}
Animal & Description & Price (\$) \\
\noalign{\smallskip}\hline\noalign{\smallskip}
Gnat & per gram & 13.65 \\
& each & 0.01 \\
Gnu & stuffed & 92.50 \\
Emu & stuffed & 33.33 \\
Armadillo & frozen & 8.99 \\
\noalign{\smallskip}\hline
\end{tabular}
|
您也可以在行终止符之后使用胶水显式指定行后的跳过。
\begin{tabular}{ll}
\hline
Mineral & Color \\[1cm]
Ruby & red \\
Sapphire & blue \\
\hline
\end{tabular}
|
如果您在表格单元格中使用了一些 LaTeX 环境,例如 verbatim 或 enumerate
\begin{tabular}{c c}
\hline
\begin{verbatim}
code
\end{verbatim}
& description
\\ \hline
\end{tabular}
|
您可能会遇到类似以下的错误。
! LaTeX Error: Something's wrong--perhaps a missing \item.
要解决此问题,请将 列说明符 更改为 "段落" (p,m 或 b )。
\begin{tabular}{m{5cm} c}
|
可以使用 *{num}{str}
语法一次定义多个相同对齐的列。当您的表格具有许多列时,这特别有用。
这是一个表格,它有两边各一个列,中间有六个居中的列
\begin{tabular}{l*{6}{c}r}
Team & P & W & D & L & F & A & Pts \\
\hline
Manchester United & 6 & 4 & 0 & 2 & 10 & 5 & 12 \\
Celtic & 6 & 3 & 0 & 3 & 8 & 9 & 9 \\
Benfica & 6 & 2 & 1 & 3 & 7 & 8 & 7 \\
FC Copenhagen & 6 & 2 & 1 & 3 & 5 & 8 & 7 \\
\end{tabular}
|
可以使用 array 包修改列规范。这在表格环境的参数中完成,使用 >{\command}
表示在每个列元素之前执行的命令,使用 <{\command}
表示在每个列元素之后执行的命令。例如:要获得数学模式下的列,请输入:\{tabular}{>{$}c<{$}}
。另一个例子是改变字体:\{tabular}{>{\small}c}
用于以小字体打印该列。
当涉及 {
和 }
字符时,>
和 <
规范的参数必须正确平衡。这意味着 >{\bfseries}
是有效的,而 >{\textbf}
将无法工作,而 >{\textbf{}
是无效的。如果需要将表格的文本用作参数(例如,使用 \textbf
生成粗体文本),则应使用 \bgroup
和 \egroup
命令:>{\textbf\bgroup}c<{\egroup}
会产生预期效果。这仅适用于一些基本的 LaTeX 命令。对于其他命令,例如 \underline
用于对文本进行下划线,则需要使用 lrbox
将列文本临时存储在一个框中。首先,您必须使用 \newsavebox{\boxname}
定义这样一个框,然后您可以定义
>{\begin{lrbox}{\boxname} }%
l%
<{\end{lrbox}%
\underline{\unhbox\boxname} }%
}
|
这会将文本存储在一个框中,然后使用 \unhbox
将文本从框中取出(这会销毁该框,如果需要再次使用该框,则应使用 \unhcopy
而不是 \unhbox\boxname
)并将其传递给 \underline
。(对于 LaTeX2e,您可能希望使用 \usebox{\boxname}
而不是 \unhbox\boxname
。)
使用 \raisebox
而不是 \underline
完成的相同技巧可以强制表格中的所有行具有相同的高度,而不是当例如数学术语或上标出现在文本中时可能出现的自然变化高度。
以下是一个示例,展示了 p{...}
和 >{\centering}
的使用。
\begin{tabular}{>{\centering}p{3.5cm}>{\centering}p{3.5cm} }
Geometry & Algebra
\tabularnewline
\hline
Points & Addition
\tabularnewline
Spheres & Multiplication
\end{tabular}
|
请注意使用 \tabularnewline
而不是 \\
,以避免出现 Misplaced \noalign
错误。
可以使用 @{...}
或 !{...}
结构指定列分隔符。
它通常将一些文本作为其参数,并将其附加到列时,它将自动将该文本插入该列中的每个单元格,在该单元格的实际数据之前。 @{...}
命令会杀死列间空间,并用花括号之间的任何内容替换它。要保留初始空间,请使用 !{...}
。要添加空间,请使用 @{\hspace{''width''}}
。
诚然,这并不那么清楚,因此需要一些示例来澄清。有时,在科学表格中,希望数字对齐到小数点上。这可以通过以下操作来实现
\begin{tabular}{r@{.}l}
3 & 14159 \\
16 & 2 \\
123 & 456 \\
\end{tabular}
|
|
@ 表达式的抑制空间特性实际上使其非常适合操纵列之间的水平间距。给定一个基本表格,并改变列描述
\begin{tabular}{ |l|l| }
\hline
stuff & stuff \\ \hline
stuff & stuff \\
\hline
\end{tabular}
|
{|l|l|} | |
{|@{}l|l@{}|} | |
{|@{}l@{}|l@{}|} | |
{|@{}l@{}|@{}l@{}|} |
与其使用 @ 表达式来构建对齐到小数点(或等效符号)的小数列,不如使用 dcolumn 包,它提供了一个新的列说明符,用于浮点数据。有关更多信息,请参阅 dcolumn 包文档,但是使用 dcolumn 的一种简单方法如下。
\usepackage{dcolumn}
\ldots
\newcolumntype{d}[1]{D{.}{\cdot}{#1} }
%the argument for d specifies the maximum number of decimal places
\begin{tabular}{l r c d{1} }
Left&Right&Center&\mathrm{Decimal}\\
1&2&3&4\\
11&22&33&44\\
1.1&2.2&3.3&4.4\\
\end{tabular}
|
在新的列类型中,为小数位数提供负参数将允许无限小数位数,但这可能会导致列非常宽。不会应用舍入,因此要制表的數據应调整到指定的小数位数。请注意,对齐小数点的列在数学模式下排版,因此在上面的示例中,标题使用 \mathrm。另外,对齐小数点的列中的文本(例如标题)将在小数分隔符之前右对齐(假设文本中没有小数分隔符)。虽然这对非常短的文本或数字列标题可能没问题,但在上面的示例中看起来很笨拙。解决此问题的办法是使用下面描述的 \multicolumn
命令,指定单个列及其对齐方式。例如,要在上面的示例中将标题 *Decimal* 居中到其列上,表格本身的第一行将是 Left&Right&Center&\multicolumn{1}{c}{Decimal}\\
粗体文本和 dcolumn
[edit | edit source]为了引起对表格中特定条目的注意,使用粗体文本可能很不错。通常这很容易,但由于 dcolumn 需要 *看到* 小数点,因此做起来比较困难。此外,通常的粗体字符比其普通对应字符更宽,这意味着虽然小数点可能很好地对齐,但数字(对于小数点一侧超过 2-3 位的数字)将明显错位。然而,可以使用普通宽度粗体字符并定义新的粗体列类型,如下所示。[1]
\usepackage{dcolumn}
%here we're setting up a version of the math fonts with normal x-width
\DeclareMathVersion{nxbold}
\SetSymbolFont{operators}{nxbold}{OT1}{cmr} {b}{n}
\SetSymbolFont{letters} {nxbold}{OML}{cmm} {b}{it}
\SetSymbolFont{symbols} {nxbold}{OMS}{cmsy}{b}{n}
\begin{document}
\makeatletter
\newcolumntype{d}{D{.}{.}{-1} } %decimal column as before
%wide bold decimal column
\newcolumntype{B}[3]{>{\boldmath\DC@{#1}{#2}{#3} }c<{\DC@end} }
%normal width bold decimal column
\newcolumntype{Z}[3]{>{\mathversion{nxbold}\DC@{#1}{#2}{#3} }c<{\DC@end} }
\makeatother
\begin{tabular}{l l d}
Type &M & \multicolumn{1}{c}{N} \\
Normal & 1 & 22222.222 \\
Bold (standard)&10 & \multicolumn{1}{B{.}{.}{-1} }{22222.222}\\
Bold (nxbold)&100 & \multicolumn{1}{Z{.}{.}{-1} }{22222.222}\\
\end{tabular}
\end{document}
|
行规范
[edit | edit source]在每一行中,就像列一样,将同一个命令应用于每个单元格可能很方便。不幸的是,tabular 环境默认情况下无法做到这一点。我们需要 tabu,它提供了 \rowfont
选项。
\begin{tabu}{XX}
\rowfont{\bfseries\itshape\large} Header1 & Header2 \\
\hline
Cell2 & Cell2
\end{tabu}
|
跨越
[edit | edit source]为了完成本教程,我们快速了解一下如何生成稍微复杂一点的表格。不出所料,必要的命令必须嵌入到表格数据本身中。
跨越多个列的行
[edit | edit source]该命令如下所示:\multicolumn{num_cols}{alignment}{contents}
。 num_cols 是要合并的后续列的数量; alignment 是 l、 c、 r,或者为了使文本换行,指定宽度 p{5.0cm}
。 contents 只是您要包含在该单元格中的实际数据。一个简单的例子
\begin{tabular}{ |l|l| }
\hline
\multicolumn{2}{|c|}{Team sheet} \\
\hline
GK & Paul Robinson \\
LB & Lucas Radebe \\
DC & Michael Duberry \\
DC & Dominic Matteo \\
RB & Dider Domi \\
MC & David Batty \\
MC & Eirik Bakke \\
MC & Jody Morris \\
FW & Jamie McMaster \\
ST & Alan Smith \\
ST & Mark Viduka \\
\hline
\end{tabular}
|
跨越多行的列
[edit | edit source]您需要做的第一件事是将 \usepackage{multirow}
添加到序言中[2]。然后它将提供跨越多行的命令:\multirow{''num_rows''}{''width''}{''contents''}
。参数很容易推断出来(*
代表 *width* 表示内容的自然宽度)。
...
\usepackage{multirow}
...
\begin{tabular}{ |l|l|l| }
\hline
\multicolumn{3}{ |c| }{Team sheet} \\
\hline
Goalkeeper & GK & Paul Robinson \\ \hline
\multirow{4}{*}{Defenders} & LB & Lucas Radebe \\
& DC & Michael Duburry \\
& DC & Dominic Matteo \\
& RB & Didier Domi \\ \hline
\multirow{3}{*}{Midfielders} & MC & David Batty \\
& MC & Eirik Bakke \\
& MC & Jody Morris \\ \hline
Forward & FW & Jamie McMaster \\ \hline
\multirow{2}{*}{Strikers} & ST & Alan Smith \\
& ST & Mark Viduka \\
\hline
\end{tabular}
|
使用 \multirow
时要注意的主要事项是,必须在要跨越的每后续行中为每个相应的单元格插入一个空白条目。
如果单元格没有数据,则什么也不输入,但仍然需要“&”将其与下一列的数据隔开。敏锐的读者已经推断出,对于一个 列的表格,每行中必须始终有 个“&”符号(除非也使用了 \multicolumn
)。
同时跨越两个方向
[edit | edit source]这是一个非平凡的例子,说明如何同时跨越两个方向,并使单元格的边框正确绘制
\usepackage{multirow}
\begin{tabular}{cc|c|c|c|c|l}
\cline{3-6}
& & \multicolumn{4}{ c| }{Primes} \\ \cline{3-6}
& & 2 & 3 & 5 & 7 \\ \cline{1-6}
\multicolumn{1}{ |c }{\multirow{2}{*}{Powers} } &
\multicolumn{1}{ |c| }{504} & 3 & 2 & 0 & 1 & \\ \cline{2-6}
\multicolumn{1}{ |c }{} &
\multicolumn{1}{ |c| }{540} & 2 & 3 & 1 & 0 & \\ \cline{1-6}
\multicolumn{1}{ |c }{\multirow{2}{*}{Powers} } &
\multicolumn{1}{ |c| }{gcd} & 2 & 2 & 0 & 0 & min \\ \cline{2-6}
\multicolumn{1}{ |c }{} &
\multicolumn{1}{ |c| }{lcm} & 3 & 3 & 1 & 1 & max \\ \cline{1-6}
\end{tabular}
|
命令 \multicolumn{1}{
只是用于在单元格的左侧和右侧绘制垂直边框。即使与 \multirow{2}{*}{...}
组合使用,它仍然会绘制仅跨越第一行的垂直边框。为了弥补这一点,我们在后续由 multirow 跨越的行中添加了 \multicolumn{1}{
。请注意,我们不能只使用 \hline
来绘制水平线,因为我们不希望在线上跨越跨越多行的文本。相反,我们使用命令 \cline{2-6}
,并将包含文本“Powers”的第一列排除在外。
这是一个利用相同想法的另一个例子,用于制作熟悉的流行的“2x2”或双重二分法
\begin{tabular}{ r|c|c| }
\multicolumn{1}{r}{}
& \multicolumn{1}{c}{noninteractive}
& \multicolumn{1}{c}{interactive} \\
\cline{2-3}
massively multiple & Library & University \\
\cline{2-3}
one-to-one & Book & Tutor \\
\cline{2-3}
\end{tabular}
|
控制表格大小
[edit | edit source]调整表格大小
[edit | edit source]graphicx 包含命令 \resizebox{width}{height}{object}
,它可以与 tabular 一起使用来指定表格的高度和宽度。以下示例展示了如何将表格调整为 8cm 宽度,同时保持原始的宽高比。
\usepackage{graphicx}
% ...
\resizebox{8cm}{!} {
\begin{tabular}...
\end{tabular}
}
|
调整表格大小,包括标题
\begin{table}[h]
\resizebox{1.4\textwidth}{!}{\begin{minipage}{\textwidth}
\begin{tabular}{r|c|c|}
& \multicolumn{1}{c}{noninteractive}
& \multicolumn{1}{c}{interactive} \\
\cline{2-3}
massively multiple & Library & University \\
\cline{2-3}
one-to-one & Book & Tutor \\
\cline{2-3}
\end{tabular}
\caption[Table caption text]{Table taken from \cite[p.10]{refid} }
\label{table:name}
\end{minipage} }
\end{table}
|
或者,您可以使用 \scalebox{ratio}{object}
以相同的方式,但使用比例而不是固定尺寸
\usepackage{graphicx}
% ...
\scalebox{0.7}{
\begin{tabular}...
\end{tabular}
}
|
更改字体大小
[edit | edit source]只需在表格范围内添加所需的尺寸命令(此处为:\footnotesize
),就可以将表格全局切换到不同的字体大小,如果使用浮动,则可以在 \begin{table}
语句之后添加,否则需要添加一个组分隔符。
{\footnotesize
\begin{tabular}{| r | r || c | c | c |}
% ...
\end{tabular}
}
|
\begin{table}[h]\footnotesize
\caption{Performance at peak F-measure}
\begin{tabular}{| r | r || c | c | c |}
% ...
\end{tabular}
\end{table}
|
或者,你可以在导言区添加以下代码,更改文档中所有表格的默认字体
\let\oldtabular\tabular
\renewcommand{\tabular}{\footnotesize\oldtabular}
|
有关命名字体大小,请参见字体。表格标题字体大小不受影响。要控制标题字体大小,请参见标题样式.
还可以使用\renewcommand{\arraystretch}{0.8}
在\begin{tabular}
之前更改行之间的垂直间距。
颜色
[edit | edit source]表格中交替行颜色
[edit | edit source]当使用table选项加载xcolor包时,它提供了生成交替行颜色表格的必要命令。命令\rowcolors{<''starting row''>}{<''odd color''>}{<''even color''>}
必须在tabular环境开始之前指定。
\documentclass{article}
\usepackage[table]{xcolor}
\begin{document}
\begin{center}
\rowcolors{1}{green}{pink}
\begin{tabular}{lll}
odd & odd & odd \\
even & even & even\\
odd & odd & odd \\
even & even & even\\
\end{tabular}
\end{center}
\end{document}
|
命令\hiderowcolors
可用于从指定行到表格末尾停用突出显示。可以通过\showrowcolors
命令在表格内重新激活突出显示。如果在使用这些命令时遇到“misplaced \noalign errors”,则在表格中的某行的开头或结尾使用这些命令。
\hiderowcolors odd & odd & odd \\
|
或
odd & odd & odd \\ \showrowcolors
|
单个单元格的颜色
[edit | edit source]与上面一样,这使用了xcolor包。
% Include this somewhere in your document
\usepackage[table]{xcolor}
% Enter this in the cell you wish to color a light grey.
% NB: the word 'gray' here denotes the grayscale color scheme, not the color grey. '0.9' denotes how dark the grey is.
\cellcolor[gray]{0.9}
% The following will color the cell red.
\cellcolor{red}
|
宽度和拉伸
[edit | edit source]我们继续提供有关tabular*和tabularx的文档。
tabular*环境
[edit | edit source]这基本上是原始表格版本的轻微扩展,尽管它需要一个额外的参数(在列描述之前)来指定表格的首选宽度。
\begin{tabular*}{0.75\textwidth}{ | c | c | c | r | }
\hline
label 1 & label 2 & label 3 & label 4 \\
\hline
item 1 & item 2 & item 3 & item 4 \\
\hline
\end{tabular*}
|
但是,这可能看起来并不像预期的那样。列仍然保持其自然宽度(刚好足以容纳其内容),而行与指定的表格宽度一样宽。如果您不喜欢此默认设置,您还必须显式插入额外的列间距。LaTeX 具有橡胶长度,与其他长度不同,橡胶长度不是固定的。LaTeX 可以动态决定这些长度应该多长。因此,以下是一个示例。
\begin{tabular*}{0.75\textwidth}{@{\extracolsep{\fill} } | c | c | c | r | }
\hline
label 1 & label 2 & label 3 & label 4 \\
\hline
item 1 & item 2 & item 3 & item 4 \\
\hline
\end{tabular*}
|
您将注意到在列描述开头添加了@{...}
构造。其中包含\extracolsep
命令,该命令需要一个宽度。可以使用固定宽度。但是,通过使用橡胶长度,例如\fill
,列会自动均匀地间距。
tabularx包
[edit | edit source]此包提供了一个名为tabularx的表格环境,它类似于tabular*环境,除了它有一个新的列说明符X(大写)。使用此说明符指定的列将被拉伸以使表格宽度与指定的一样,从而大大简化表格的创建。
\usepackage{tabularx}
% ...
\begin{tabularx}{\textwidth}{ |X|X|X|X| }
\hline
label 1 & label 2 & label 3 & label 4 \\
\hline
item 1 & item 2 & item 3 & item 4 \\
\hline
\end{tabularx}
|
为框提供的內容与 p 列的內容相同,区别在于宽度是自动计算的。如果您使用 array 包,您也可以应用任何 >{\cmd}
或 <{\cmd}
命令来实现特定的行为(如 \centering
或 \raggedright\arraybackslash
),如前所述。
另一个选择是使用\newcolumntype
以不同的方式格式化选定的列。它定义了一个新的列说明符,例如 R(大写)。在此示例中,第二列和第四列以不同的方式调整 (\raggedleft
)
\usepackage{tabularx}
% ...
\newcolumntype{R}{>{\raggedleft\arraybackslash}X}%
\begin{tabularx}{\textwidth}{ |l|R|l|R| }
\hline
label 1 & label 2 & label 3 & label 4 \\
\hline
item 1 & item 2 & item 3 & item 4 \\
\hline
\end{tabularx}
|
使用 \multicolumn
的跨越多列的 tabularx 行。通过使用 X@{} 选项,中间两列充当一列。请注意,\multicolumn
宽度(在此示例中为 2)应等于所跨列的宽度(在此示例中为 1+1)。
\usepackage{tabularx}
% ...
\begin{tabularx}{1\textwidth}{ |>{\setlength\hsize{1\hsize}\centering}X|>{\setlength\hsize{1\hsize}\raggedleft}X@{} >{\setlength\hsize{1\hsize}\raggedright}X|>{\setlength\hsize{1\hsize}\centering}X| }
\hline
Label 1 & \multicolumn{2}{>{\centering\setlength\hsize{2\hsize} }X|}{Label 2} & Label 3\tabularnewline
\hline
123 & 123 & 456 & 123 \tabularnewline
\hline
123 & 123 & 456 & 123 \tabularnewline
\hline
\end{tabularx}
|
以类似于使用 \newcommand 创建带参数的新命令的方式,可以使用 \newcolumntype 创建带参数的新列类型,如下所示
\usepackage{tabularx}
\usepackage[table]{xcolor} %Used to color the last column
% ...
\newcolumntype{L}[1]{>{\hsize=#1\hsize\raggedright\arraybackslash}X}%
\newcolumntype{R}[1]{>{\hsize=#1\hsize\raggedleft\arraybackslash}X}%
\newcolumntype{C}[2]{>{\hsize=#1\hsize\columncolor{#2}\centering\arraybackslash}X}%
\begin{tabularx}{\textwidth}{ | L{1} | R{0.5} | R{0.5} | C{2}{gray} | }
\hline
label 1 & label 2 & label 3 & label 4 \\
\hline
item 1 & item 2 & item 3 & item 4 \\
\hline
\end{tabularx}
|
由于有 4 列,因此 \hsize 的总和 (1 + 0.5 + 0.5 + 2) 必须等于 4。tabularx 用于 \hsize 的默认值为 1。
tabulary 环境
[edit | edit source]tabulary 是一个修改过的 tabular*,允许为相等高度设置列宽度。tabulary 允许轻松便捷地编写平衡良好的表格。
tabularx 的问题是,如果您的单元格几乎为空,它会留下很多空白。此外,很难拥有不同的列大小。
tabulary 尝试平衡列宽,以便每列至少具有其自然宽度,而不超过最大长度。
\usepackage{tabulary}
...
\begin{center}
\begin{tabulary}{0.7\textwidth}{LCL}
Short sentences & \# & Long sentences \\
\hline
This is short. & 173 & This is much loooooooonger, because there are many more words. \\
This is not shorter. & 317 & This is still loooooooonger, because there are many more words. \\
\end{tabulary}
\end{center}
|
第一个参数是最大宽度。tabulary 将尝试不超过它,但如果内容不足,它不会拉伸到它,这与 tabularx 相反。
第二个参数是列配置。可能的值来自 tabular 环境,加上
L | 左对齐平衡列 |
C | 居中平衡列 |
R | 右对齐平衡列 |
J | 左右对齐平衡列 |
这些都是大写字母。
tabu 环境
[edit | edit source]它与 tabularx 非常相似。
注意:tabu 目前已损坏且无人维护
\begin{tabu} to \linewidth {llX[2]lllXl}
% ...
\end{tabu}
|
to \linewidth
指定目标宽度。X 参数可以有一个可选的跨度系数。
跨越多个页面的表格
[edit | edit source]LaTeX 原生支持长表格,通过 longtable 环境实现,它替代了 tabular 和 table 环境,或者更确切地说,将它们合并成一个环境。不幸的是,这个环境不支持拉伸 (X 列)。
tabu 包(不再维护)提供了 longtabu 环境。它拥有 tabu 的大部分功能,并增加了跨越多个页面的能力。
LaTeX 可以很好地处理长表格:您可以指定一个在每页上重复的页眉,一个仅在第一页上的页眉,以及页脚的相同内容。
\begin{longtabu} to \linewidth {lX[2]lXl}
\rowfont\bfseries H1 & H2 & H3 & H4 & H5 \\ \hline
\endhead
\\ \hline
\multicolumn{5}{r}{There is more to come} \\
\endfoot
\\ \hline
\endlastfoot
% Content ...
|
它使用的语法类似于 longtable,所以如果您想了解更多,可以参考它的文档。
或者,您可以尝试以下包之一:supertabular 或者 xtab,它是一个扩展的、改进版的 supertabular。
部分垂直线
[edit | edit source]在单个单元格中添加部分垂直线
\begin{tabular}{ l c r }
\hline
1 & 2 & 3 \\ \hline
4 & 5 & \multicolumn{1}{r|}{6} \\ \hline
7 & 8 & 9 \\ \hline
\end{tabular}
|
删除特定单元格中的部分垂直线
\begin{tabular}{ | l | c | r | }
\hline
1 & 2 & 3 \\ \hline
4 & 5 & \multicolumn{1}{r}{6} \\ \hline
7 & 8 & 9 \\ \hline
\end{tabular}
|
垂直居中的图像
[edit | edit source]将图像插入表格行会将其对齐到单元格顶部。使用 array 包可以解决这个问题。定义新的列类型将使图像垂直居中。
\newcolumntype{V}{>{\centering\arraybackslash} m{.4\linewidth} }
|
或者使用 parbox 来居中图像。
\parbox[c]{1em}{\includegraphics{image.png} }
|
raisebox 也能实现,并且允许使用第一个参数手动微调对齐方式。
\raisebox{-.5\height}{\includegraphics{image.png} }
|
表格中的脚注
[edit | edit source]tabular 环境不能正确处理脚注。 longtable 解决了这个问题。
专业的表格
[edit | edit source]许多专业排版的书籍和期刊都使用简单的表格,它们在行上下有适当的间距,而且几乎从不使用垂直线。许多 LaTeX 表格示例(包括这本维基教科书)展示了垂直线的使用(使用“|”)和双线的使用(使用 \hline\hline
或“||”),这些在专业出版物中被认为是不必要的,而且会分散注意力。 booktabs 包可以方便地为 LaTeX 表格提供这种专业性,它的 文档 也提供了关于构成“良好”表格的指南。
简而言之,该包使用 \toprule
表示最上面的规则(或线), \midrule
表示出现在表格中间的规则(例如标题下面的规则), \bottomrule
表示最下面的规则。这确保了规则的宽度和间距是可以接受的。此外, \cmidrule
可以用来表示跨越指定列的中间规则。以下示例对比了 booktabs 的使用和两种等效的正常 LaTeX 实现(第二个示例需要在序言中使用 \usepackage{array}
或 \usepackage{dcolumn}
,第三个示例需要在序言中使用 \usepackage{booktabs}
)。
正常的 LaTeX
[edit | edit source]
\begin{tabular}{lllllr}
\hline
\multicolumn{5}{c}{Item} \\
\cline{1-5}
Animal & Description & Price (\$) \\
\hline
Gnat & per gram & 13.65 \\
& each & 0.01 \\
Gnu & stuffed & 92.50 \\
Emu & stuffed & 33.33 \\
Armadillo & frozen & 8.99 \\
\hline
\end{tabular}
|
使用 array
[edit | edit source]
\usepackage{array}
%or \usepackage{dcolumn}
...
\begin{tabular}{llr}
\firsthline
\multicolumn{2}{c}{Item} \\
\cline{1-2}
Animal & Description & Price (\$) \\
\hline
Gnat & per gram & 13.65 \\
& each & 0.01 \\
Gnu & stuffed & 92.50 \\
Emu & stuffed & 33.33 \\
Armadillo & frozen & 8.99 \\
\lasthline
\end{tabular}
|
使用 booktabs
[edit | edit source]
\usepackage{booktabs}
\begin{tabular}{llr}
\toprule
\multicolumn{2}{c}{Item} \\
\cmidrule(r){1-2}
Animal & Description & Price (\$) & 2\\
\midrule
Gnu & stuffed & 92.50 & 2 \\
Emu & stuffed & 33.33 & 2 \\
Armadillo & frozen & 8.99 & 2 \\
\bottomrule
\end{tabular}
|
通常需要在表格下方(而不是页面底部)添加脚注,并在表格上方适当间距放置标题。这些可以通过 ctable 包来实现。它提供了一个简短的标题选项,可以插入到表格列表中,而不是实际的标题(实际标题可能很长,不适合表格列表)。 ctable 使用 booktabs 包。
横向表格
[edit | edit source]表格也可以使用 rotating 或 rotfloat 包将其放置在文档中的侧面。请参阅 旋转 章节。
带图例的表格
[edit | edit source]要向表格添加图例,可以使用 caption 包。使用 caption 包,除了正常的 \caption{...}
语句之外,还可以添加 \caption*{...}
语句。示例
\begin{table}
\begin{tabular}{| r | r || c | c | c |}
...
\end{tabular}
\caption{A normal caption}
\caption*{
A legend, even a table can be used
\begin{tabular}{l l}
item 1 & explanation 1 \\
\end{tabular}
}
\end{table}
|
正常的标题用于标签和引用。
eqparbox 包
[edit | edit source]在极少数情况下,可能需要将表格中的每一行都拉伸到其最长行的自然宽度,例如,当您有两门语言的相同文本并希望将其并排显示,并且希望行对齐时。tabular 环境有助于控制行的换行位置,但不能对齐文本,这会导致不整齐的右边缘。 eqparbox 包提供了 \eqmakebox
命令,它类似于 \makebox
,但它不是使用 width 参数,而是使用一个标签。在编译过程中,它会记录哪个带有特定标签的 \eqmakebox
包含最宽的文本,并可以将所有带有相同标签的 \eqmakebox
拉伸到该宽度。结合 array 包,可以定义一个列说明符,它可以对齐所有行中的文本:command
\newsavebox{\tstretchbox}
\newcolumntype{S}[1]{%
>{\begin{lrbox}{\tstretchbox} }%
l%
<{\end{lrbox}%
\eqmakebox[#1][s]{\unhcopy\tstretchbox} }%
}
|
请参阅 eqparbox 包的文档以了解更多详细信息。
paracol 包
[edit | edit source]LaTeX 提供的各种表格环境功能丰富;但是,它们缺乏自动将大型行分页的功能。paracol 包提供了行之间的自动分页,并且在某些情况下可以替换 tabular 环境。这种情况在需要翻译和定义的文档中很常见,这些文档也可能包含列表。
有关更多详细信息,请参阅 paracol 包的文档。
使用table浮动
[edit | edit source]在所见即所得 (WYSIWYG) 文档处理器中,将表格放在文本中间很常见。到目前为止,我们一直在这样做。然而,专业文档通常会将表格打印在专门的页面上,这样就不会打断文本的流畅性。从源代码的角度来看,我们无法知道当前文本将位于哪个页面,因此很难猜测哪个页面适合我们的表格。LaTeX 可以通过抽象表格、图片等对象来自动完成此任务,并为我们决定它们最适合放置的位置。这种抽象被称为 *浮动*。通常,浮动的对象将出现在源文件中其引入位置附近,但您也可以选择控制其位置。
要告诉 LaTeX 我们想将表格用作浮动对象,我们需要在 tabular 环境周围放置一个 table 环境,该环境能够浮动并添加标签和标题。
请理解:您 *不必* 使用浮动表格。如果您想将表格放置在源代码中,并且不需要任何标签,请不要使用 table!这是新手常犯的错误。 |
table 环境启动一种浮动类型,就像 figure 环境一样。实际上,两者有很多相似之处(定位、标题等)。有关浮动环境、标题等的更多信息,请参阅 浮动、图形和标题。
现在,环境名称可能看起来很混乱。让我们总结一下
- tabular 用于内容本身(列、行等)。
- table 用于表格在文档中的位置,以及标题和标签支持。
\begin{table}[position specifier]
\centering
\begin{tabular}{|l|}
... your table ...
\end{tabular}
\caption{This table shows some data}
\label{tab:myfirsttable}
\end{table}
|
在表格中,我们使用了一个标签,因此现在我们可以像其他任何引用一样引用它
\ref{tab:myfirsttable}
|
table 环境在您想要在文档开头或结尾处有一个表格列表时也很有用,使用以下命令
\listoftables
|
如果显示,标题现在将显示在表格列表中。
您可以设置可选参数 position specifier 来定义表格的位置,即它应该放置的位置。以下字符都是可能的放置位置。使用这些字符的序列定义您对 LaTeX 的 “愿望清单”。
h | 表格声明的位置 (**h**ere) |
t | 在页面的 **t**op |
b | 在页面的 **b**ottom |
p | 在一个专门的 **p**age of floats 上 |
! | 覆盖默认的浮动限制。例如,b 浮动的最大允许大小通常很小;如果您想要一个大的,您也需要这个 ! 参数。 |
默认值为 *tbp*,这意味着它默认情况下放置在页面的顶部。如果无法做到这一点,它将尽可能放置在底部,或者最后与其他浮动环境一起放置在额外的页面上。
您可以强制 LaTeX 使用一个给定的位置。例如,*[!h]* 强制 LaTeX 将其放置在您放置它的确切位置(除非它真的不可能,例如您将表格放置 *here*,而这个位置将是页面的最后一行)。再次正确理解它:它敦促 LaTeX 将表格放在特定位置,但如果 LaTeX 认为看起来不好,它将不会放置在那里。如果您真的想手动放置表格,请不要使用 table 环境。
水平居中表格与其他所有操作一样,使用 \centering
命令,在打开 table 环境后立即使用,或将其包含在 center 环境中。
使用电子表格和数据分析工具
[edit | edit source]对于复杂或动态表格,您可能希望使用电子表格。使用专门的软件构建表格并将其导出为 LaTeX 格式可能会节省大量时间。以下插件和库可用于一些流行的软件
- calc2latex:适用于 LibreOffice 和 OpenOffice.org Calc 电子表格,
- excel2latex:适用于 Microsoft Office Excel,
- matrix2latex:适用于 Python 和 MATLAB,
- pandas:pandas DataFrame 具有将其中包含的数据转换为 LaTeX 的方法,
- latex-tools:一个 Ruby 库,
- xtable:一个适用于 R 的库,
- org-mode:对于 Emacs 用户,org-mode 表格可以在 LaTeX 文档中内联使用,请参阅 [1] 获取教程。
- Emacs 对齐命令:对齐命令可以清理混乱的 LaTeX 表格。
- LATeX 在线表格生成器:一个用于在浏览器中创建简单表格的在线工具。LaTeX 格式在您输入时直接生成。
- 在线创建 LaTeX 表格:在线工具。
然而,将生成的源代码复制到您的文档中并不方便。为了获得最大的灵活性,将源代码生成到一个单独的文件中,您可以使用 \input
命令从您的主文档文件导入该文件。如果您的电子表格支持命令行,您可以使用一个 Makefile 例如,在一个命令中生成完整的文档(包括表格)。
有关详细信息,请参阅 模块化文档。
需要更多功能?
[edit | edit source]看看以下软件包之一
- hhline:对水平线做任何你想做的事
- array:让您在定义列的方式上更自由
- colortbl:使您的表格更丰富多彩
- threeparttable 使在表格及其标题中都添加脚注成为可能
- arydshln:创建虚线水平线和垂直线
- ctable:允许在表格下方添加脚注,并在上方正确间距标题(包含 booktabs 包)
- slashbox:创建二维表格,其中第一个单元格包含两个轴的描述。在 Tex Live 2011 或更高版本中不可用。
- diagbox:兼容slashbox,随 Tex Live 2011 或更高版本提供
- dcolumn:数字单元格的十进制对齐
- rccol:带有舍入的数字单元格的先进十进制对齐
- numprint:打印数字,以当前模式(文本或数学)打印,以便使用正确的字体,以及分隔符、指数和/或舍入到给定位数。tabular(*)、array、tabularx 和 longtable 环境支持使用 numprint 的所有功能
- spreadtab:允许使用公式的电子表格
- siunitx:表格条目的对齐
- pgfplotstable:加载、舍入、格式化和后处理数字表格,例如通过直接从 .csv(逗号分隔值)文件导入数据,而不是在 LaTeX 代码中手动编写整个表格。Excel、LibreOffice Calc 等程序可以将数据表导出为 .csv 文件。
参考文献
[edit | edit source]- ↑ D Carlisle. "Decimals in table don't align with dcolumn when bolded". Stackexchange.
- ↑ multirow 包 在 CTAN 上