課程 八

表格

本課展示了如何在 LaTeX 中建立表格,如何影響單元格的對齊,如何新增表格線條,以及如何合併單元格。

LaTeX 中的表格使用tabular環境來建立。本課假設你已載入array宏包,它為LaTeX表格新增了更多功能。這個宏包之所以不是 LaTeX 核心的一部分,僅僅是出於歷史原因。因此,請在導言區新增以下內容,我們就可以開始了:

\usepackage{array}

要排版tabular環境,我們需要告訴 LaTeX 需要多少列以及它們應該如何對齊。這是通過一個必需的參數(通常被稱為表格導言)來完成的,在這個參數中,你使用單字母名稱(稱為導言標記)來指定列。可用的列類型有:

類型描述
l左對齊列
c居中對齊列
r右對齊列
p{寬度}固定寬度為寬度的列;文字將自動換行並完全對齊
m{寬度}p類似,但相對於行的其餘部分垂直居中
b{寬度}p類似,但底部對齊
w{對齊}{寬度}以固定寬度列印內容,如果內容過大則靜默溢位。你可以使用lcr來選擇水平對齊方式。
W{對齊}{寬度}w類似,但如果內容過寬,這將發出溢位框警告。

此外,還有一些其他可用的導言標記,它們不定義列但可能也很有用:

類型描述
*{數量}{字元串}在導言中重複字元串 數量次。通過這種方式,你可以定義多個相同的列。
>{聲明}在每個單元格內容之前將聲明放在下一列中(這對於設定不同的字型等很有用)
<{聲明}在前一列的每個單元格內容之後放置聲明
| 新增垂直線
@{聲明}聲明替換列之間的空格
!{聲明}在現有空格的中心新增聲明

這兩個表格列出了 LaTeX 和array宏包提供的所有可用列類型。一些來自不同宏包的其他列類型在本課的更多細節中介紹。

lcr的寬度將是其最寬單元格的自然寬度。每個列都必須聲明,因此如果你想要三個居中對齊的列,你需要在表格導言中使用ccc。空格會被忽略,所以c c c是一樣的。

在表格主體中,列使用&分隔,新行使用\\開始。

我們已經有了建立第一個表格所需的一切。在下面的程式碼中,&\\是對齊的。這在 LaTeX 中不是必需的,但有助於閱讀原始碼。

% !TEX program=lualatex

\documentclass{ctexart}
\usepackage{array}

\begin{document}
\begin{tabular}{lll}
  動物  & 食物  & 大小   \\
  狗    & 肉    & 中等   \\
  馬    & 乾草  & 大     \\
  青蛙  & 蒼蠅  & 小     \\
\end{tabular}
\end{document}

如果表格列包含大量文字,僅使用lcr會出現問題。看看下面的例子會發生什麼:

% !TEX program=lualatex

\documentclass{ctexart}
\usepackage{array}

\begin{document}
\begin{tabular}{cl}
  動物 & 描述 \\
  狗   & 狗是犬屬的成員,屬於狼形犬科,是最廣泛分佈的陸地食肉動物。 \\
  貓   & 貓是一種小型食肉目家養動物。它是貓科中唯一的家養物種,通常被稱為家貓,以區別於該科的野生成員。 \\
\end{tabular}
\end{document}

問題在於l類型列會以其自然寬度排版其內容,即使有頁面邊界也不會換行。要解決這個問題,你可以使用p列。這會將其內容作為段落排版,並指定寬度作為參數。將上面的結果與以下內容進行比較:

% !TEX program=lualatex

\documentclass{ctexart}
\usepackage{array}

\begin{document}
\begin{tabular}{cp{9cm}}
  動物 & 描述 \\
  狗   & 狗是犬屬的成員,屬於狼形犬科,是最廣泛分佈的陸地食肉動物。 \\
  貓   & 貓是一種小型食肉目家養動物。它是貓科中唯一的家養物種,通常被稱為家貓,以區別於該科的野生成員。 \\
\end{tabular}
\end{document}

如果你的表格有許多相同類型的列,在導言中輸入那麼多列定義會很麻煩。你可以使用*{num}{string}來簡化,它會重複string num次。所以*{6}{c}等同於cccccc。為了證明它確實有效,這裡是本課的第一個表格,使用新學到的語法:

% !TEX program=lualatex

\documentclass{ctexart}
\usepackage{array}

\begin{document}
\begin{tabular}{*{3}{l}}
  動物  & 食物  & 大小   \\
  狗    & 肉    & 中等   \\
  馬    & 乾草  & 大     \\
  青蛙  & 蒼蠅  & 小     \\
\end{tabular}
\end{document}

新增線條

在介紹線條之前,先提一個建議:線條在表格中應該謹慎使用,通常垂直線看起來不夠專業。事實上,對於專業的表格,你不應該使用任何標準線條;相反,你應該熟悉booktabs宏包的功能,這就是為什麼我們先在這裡介紹它。為了完整性,標準線條在更多資訊頁面中展示。

booktabs提供了四種不同類型的線條。每個這些命令都必須作為行中的第一個內容使用,或緊跟在另一個線條之後。 三個線條命令是:\toprule\midrule\bottomrule。從它們的名稱就可以清楚地知道它們的使用位置:

% !TEX program=lualatex

\documentclass{ctexart}
\usepackage{array}
\usepackage{booktabs}

\begin{document}
\begin{tabular}{lll}
  \toprule
  動物  & 食物  & 大小   \\
  \midrule
  狗    & 肉    & 中等   \\
  馬    & 乾草  & 大     \\
  青蛙  & 蒼蠅  & 小     \\
  \bottomrule
\end{tabular}
\end{document}

booktabs提供的第四個線條命令是\cmidrule。它可以用來繪製一條不跨越整個表格寬度的線條,而是隻跨越指定的列範圍。列範圍作為數字範圍輸入:{數字-數字}。即使你只想為單個列繪製線條,也需要將其指定為範圍(兩個數字相同)。

% !TEX program=lualatex

\documentclass{ctexart}
\usepackage{array}
\usepackage{booktabs}

\begin{document}
\begin{tabular}{lll}
  \toprule
  動物  & 食物  & 大小   \\
  \midrule
  狗    & 肉    & 中等   \\
  \cmidrule{1-2}
  馬    & 乾草  & 大     \\
  \cmidrule{1-1}
  \cmidrule{3-3}
  青蛙  & 蒼蠅  & 小     \\
  \bottomrule
\end{tabular}
\end{document}

你可以使用\cmidrule的短版本,在任一端新增一個可選參數,括號中的rl分別表示規則在 端縮短:

% !TEX program=lualatex

\documentclass{ctexart}
\usepackage{array}
\usepackage{booktabs}

\begin{document}
\begin{tabular}{lll}
  \toprule
  動物  & 食物  & 大小   \\
  \midrule
  狗    & 肉    & 中等   \\
  \cmidrule{1-2}
  馬    & 乾草  & 大     \\
  \cmidrule(r){1-1}
  \cmidrule(rl){2-2}
  \cmidrule(l){3-3}
  青蛙  & 蒼蠅  & 小     \\
  \bottomrule
\end{tabular}
\end{document}

你可能已經猜到,rl分別表示規則在端縮短。

有時,線條會將兩行分隔得太開,但為了更清楚地表達含義,你仍需要通過某種方式將它們分開,這時使用\addlinespace來插入一個小分隔。

% !TEX program=lualatex

\documentclass{ctexart}
\usepackage{array}
\usepackage{booktabs}

\begin{document}
\begin{tabular}{cp{9cm}}
  \toprule
  動物 & 描述 \\
  \midrule
  狗   & 狗是犬屬的成員,屬於狼形犬科,是最廣泛分佈的陸地食肉動物。 \\
  \addlinespace
  貓   & 貓是一種小型食肉目家養動物。它是貓科中唯一的家養物種,通常被稱為家貓,以區別於該科的野生成員。 \\
  \bottomrule
\end{tabular}
\end{document}

合併單元格

在 LaTeX 中,你可以使用\multicolumn命令來水平合併單元格。它必須作為單元格中的第一個內容使用。\multicolumn需要三個參數:

  1. 應該合併的單元格數量
  2. 合併單元格的對齊方式
  3. 合併單元格的內容

對齊方式可以包含任何在tabular導言中合法的內容,但只能包含單個列類型

% !TEX program=lualatex

\documentclass{ctexart}
\usepackage{array}
\usepackage{booktabs}

\begin{document}
\begin{tabular}{lll}
  \toprule
  動物  & 食物  & 大小   \\
  \midrule
  狗    & 肉    & 中等   \\
  馬    & 乾草  & 大     \\
  青蛙  & 蒼蠅  & 小     \\
  fuath  & \multicolumn{2}{c}{未知} \\
  \bottomrule
\end{tabular}
\end{document}

你還可以使用\multicolumn在一個單元格上,以防止應用表格導言中為當前列定義的任何內容。以下內容使用這種方法來居中表格的標題行:

% !TEX program=lualatex

\documentclass{ctexart}
\usepackage{array}
\usepackage{booktabs}

\begin{document}
\begin{tabular}{lll}
  \toprule
  \multicolumn{1}{c}{動物} & \multicolumn{1}{c}{食物} & \multicolumn{1}{c}{大小} \\
  \midrule
  狗    & 肉    & 中等   \\
  馬    & 乾草  & 大     \\
  青蛙  & 蒼蠅  & 小     \\
  fuath  & \multicolumn{2}{c}{未知} \\
  \bottomrule
\end{tabular}
\end{document}

垂直合併單元格在 LaTeX 中不受支援。通常,只需留空單元格即可讓讀者正確的理解,而無需明確地使單元格跨越多行。

% !TEX program=lualatex

\documentclass{ctexart}
\usepackage{array}
\usepackage{booktabs}

\begin{document}
\begin{tabular}{lll}
  \toprule
  組    & 動物  & 大小   \\
  \midrule
  草食動物 & 馬    & 大     \\
          & 鹿    & 中等   \\
          & 兔子  & 小     \\
  \addlinespace
  肉食動物 & 狗    & 中等   \\
          & 貓    & 小     \\
          & 獅子  & 大     \\
  \addlinespace
  雜食動物 & 烏鴉  & 小     \\
          & 熊    & 大     \\
          & 豬    & 中等   \\
  \bottomrule
\end{tabular}
\end{document}

練習

使用簡單的表格示例開始嘗試表格。嘗試使用lcr列類型進行不同的對齊。如果你在表格行中缺少項目會發生什麼?如果你在表格行中新增太多項目會發生什麼?嘗試使用\multicolumn命令跨越多列。