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環境開始之前指定。
命令\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)
使用 \multicolumn 的跨越多列的 tabularx 行。透過使用 X@{} 選項,中間兩列充當一列。請注意,\multicolumn 寬度(在此示例中為 2)應等於所跨列的寬度(在此示例中為 1+1)。
以類似於使用 \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 上






