|
| 1 | +--- |
| 2 | +layout: "lesson" |
| 3 | +lang: "zh-hant" |
| 4 | +title: "表格" |
| 5 | +description: "本課展示了如何在 LaTeX 中建立表格,如何影響單元格的對齊,如何新增表格線條,以及如何合併單元格。" |
| 6 | +toc-anchor-text: "LaTeX 表格" |
| 7 | +toc-description: "表格的基礎知識。" |
| 8 | +--- |
| 9 | + |
| 10 | +# 表格 |
| 11 | + |
| 12 | +<span |
| 13 | + class="summary">本課展示了如何在 LaTeX 中建立表格,如何影響單元格的對齊,如何新增表格線條,以及如何合併單元格。</span> |
| 14 | + |
| 15 | +LaTeX 中的表格使用`tabular`環境來建立。本課假設你已載入`array`宏包,它為LaTeX表格新增了更多功能。這個宏包之所以不是 LaTeX 核心的一部分,僅僅是出於歷史原因。因此,請在導言區新增以下內容,我們就可以開始了: |
| 16 | + |
| 17 | +```latex |
| 18 | +\usepackage{array} |
| 19 | +``` |
| 20 | +{: .noedit :} |
| 21 | + |
| 22 | +要排版`tabular`環境,我們需要告訴 LaTeX 需要多少列以及它們應該如何對齊。這是通過一個必需的參數(通常被稱為表格導言)來完成的,在這個參數中,你使用單字母名稱(稱為導言標記)來指定列。可用的列類型有: |
| 23 | + |
| 24 | +<!-- don't line wrap this table, markdown seems to not support this --> |
| 25 | + |
| 26 | +| 類型 | 描述 | |
| 27 | +| --------------- | :---------------------------------------------------------------------------------------- | |
| 28 | +| `l` | 左對齊列 | |
| 29 | +| `c` | 居中對齊列 | |
| 30 | +| `r` | 右對齊列 | |
| 31 | +| `p{寬度}` | 固定寬度為`寬度`的列;文字將自動換行並完全對齊 | |
| 32 | +| `m{寬度}` | 與`p`類似,但相對於行的其餘部分垂直居中 | |
| 33 | +| `b{寬度}` | 與`p`類似,但底部對齊 | |
| 34 | +| `w{對齊}{寬度}` | 以固定`寬度`列印內容,如果內容過大則靜默溢位。你可以使用`l`、`c`或`r`來選擇水平對齊方式。 | |
| 35 | +| `W{對齊}{寬度}` | 與`w`類似,但如果內容過寬,這將發出溢位框警告。 | |
| 36 | + |
| 37 | +此外,還有一些其他可用的導言標記,它們不定義列但可能也很有用: |
| 38 | + |
| 39 | +<!-- don't line wrap this table, markdown seems to not support this --> |
| 40 | + |
| 41 | +| 類型 | 描述 | |
| 42 | +| ----------------- | :----------------------------------------------------------------------- | |
| 43 | +| `*{數量}{字元串}` | 在導言中重複`字元串` `數量`次。通過這種方式,你可以定義多個相同的列。 | |
| 44 | +| `>{聲明}` | 在每個單元格內容之前將`聲明`放在下一列中(這對於設定不同的字型等很有用) | |
| 45 | +| `<{聲明}` | 在前一列的每個單元格內容之後放置`聲明` | |
| 46 | +| <span>` | `</span> | 新增垂直線 | |
| 47 | +| `@{聲明}` | 用`聲明`替換列之間的空格 | |
| 48 | +| `!{聲明}` | 在現有空格的中心新增`聲明` | |
| 49 | + |
| 50 | +這兩個表格列出了 LaTeX 和`array`宏包提供的所有可用列類型。一些來自不同宏包的其他列類型在本課的[更多細節](more-08)中介紹。 |
| 51 | + |
| 52 | +列`l`、`c`和`r`的寬度將是其最寬單元格的自然寬度。每個列都必須聲明,因此如果你想要三個居中對齊的列,你需要在表格導言中使用`ccc`。空格會被忽略,所以`c c c`是一樣的。 |
| 53 | + |
| 54 | +在表格主體中,列使用`&`分隔,新行使用`\\`開始。 |
| 55 | + |
| 56 | +我們已經有了建立第一個表格所需的一切。在下面的程式碼中,`&`和`\\`是對齊的。這在 LaTeX 中不是必需的,但有助於閱讀原始碼。 |
| 57 | + |
| 58 | +```latex |
| 59 | +% !TEX program=lualatex |
| 60 | +
|
| 61 | +\documentclass{ctexart} |
| 62 | +\usepackage{array} |
| 63 | +
|
| 64 | +\begin{document} |
| 65 | +\begin{tabular}{lll} |
| 66 | + 動物 & 食物 & 大小 \\ |
| 67 | + 狗 & 肉 & 中等 \\ |
| 68 | + 馬 & 乾草 & 大 \\ |
| 69 | + 青蛙 & 蒼蠅 & 小 \\ |
| 70 | +\end{tabular} |
| 71 | +\end{document} |
| 72 | +``` |
| 73 | + |
| 74 | +如果表格列包含大量文字,僅使用`l`、`c`和`r`會出現問題。看看下面的例子會發生什麼: |
| 75 | + |
| 76 | +```latex |
| 77 | +% !TEX program=lualatex |
| 78 | +
|
| 79 | +\documentclass{ctexart} |
| 80 | +\usepackage{array} |
| 81 | +
|
| 82 | +\begin{document} |
| 83 | +\begin{tabular}{cl} |
| 84 | + 動物 & 描述 \\ |
| 85 | + 狗 & 狗是犬屬的成員,屬於狼形犬科,是最廣泛分佈的陸地食肉動物。 \\ |
| 86 | + 貓 & 貓是一種小型食肉目家養動物。它是貓科中唯一的家養物種,通常被稱為家貓,以區別於該科的野生成員。 \\ |
| 87 | +\end{tabular} |
| 88 | +\end{document} |
| 89 | +``` |
| 90 | + |
| 91 | +問題在於`l`類型列會以其自然寬度排版其內容,即使有頁面邊界也不會換行。要解決這個問題,你可以使用`p`列。這會將其內容作為段落排版,並指定寬度作為參數。將上面的結果與以下內容進行比較: |
| 92 | + |
| 93 | +```latex |
| 94 | +% !TEX program=lualatex |
| 95 | +
|
| 96 | +\documentclass{ctexart} |
| 97 | +\usepackage{array} |
| 98 | +
|
| 99 | +\begin{document} |
| 100 | +\begin{tabular}{cp{9cm}} |
| 101 | + 動物 & 描述 \\ |
| 102 | + 狗 & 狗是犬屬的成員,屬於狼形犬科,是最廣泛分佈的陸地食肉動物。 \\ |
| 103 | + 貓 & 貓是一種小型食肉目家養動物。它是貓科中唯一的家養物種,通常被稱為家貓,以區別於該科的野生成員。 \\ |
| 104 | +\end{tabular} |
| 105 | +\end{document} |
| 106 | +``` |
| 107 | + |
| 108 | +如果你的表格有許多相同類型的列,在導言中輸入那麼多列定義會很麻煩。你可以使用`*{num}{string}`來簡化,它會重複`string` `num`次。所以`*{6}{c}`等同於`cccccc`。為了證明它確實有效,這裡是本課的第一個表格,使用新學到的語法: |
| 109 | + |
| 110 | +```latex |
| 111 | +% !TEX program=lualatex |
| 112 | +
|
| 113 | +\documentclass{ctexart} |
| 114 | +\usepackage{array} |
| 115 | +
|
| 116 | +\begin{document} |
| 117 | +\begin{tabular}{*{3}{l}} |
| 118 | + 動物 & 食物 & 大小 \\ |
| 119 | + 狗 & 肉 & 中等 \\ |
| 120 | + 馬 & 乾草 & 大 \\ |
| 121 | + 青蛙 & 蒼蠅 & 小 \\ |
| 122 | +\end{tabular} |
| 123 | +\end{document} |
| 124 | +``` |
| 125 | + |
| 126 | +## 新增線條 |
| 127 | + |
| 128 | +在介紹線條之前,先提一個建議:線條在表格中應該謹慎使用,通常垂直線看起來不夠專業。事實上,對於專業的表格,你不應該使用任何標準線條;相反,你應該熟悉`booktabs`宏包的功能,這就是為什麼我們先在這裡介紹它。為了完整性,標準線條在[更多資訊](more-08)頁面中展示。 |
| 129 | + |
| 130 | +`booktabs`提供了四種不同類型的線條。每個這些命令都必須作為行中的第一個內容使用,或緊跟在另一個線條之後。 |
| 131 | +三個線條命令是:`\toprule`、`\midrule`和`\bottomrule`。從它們的名稱就可以清楚地知道它們的使用位置: |
| 132 | + |
| 133 | +```latex |
| 134 | +% !TEX program=lualatex |
| 135 | +
|
| 136 | +\documentclass{ctexart} |
| 137 | +\usepackage{array} |
| 138 | +\usepackage{booktabs} |
| 139 | +
|
| 140 | +\begin{document} |
| 141 | +\begin{tabular}{lll} |
| 142 | + \toprule |
| 143 | + 動物 & 食物 & 大小 \\ |
| 144 | + \midrule |
| 145 | + 狗 & 肉 & 中等 \\ |
| 146 | + 馬 & 乾草 & 大 \\ |
| 147 | + 青蛙 & 蒼蠅 & 小 \\ |
| 148 | + \bottomrule |
| 149 | +\end{tabular} |
| 150 | +\end{document} |
| 151 | +``` |
| 152 | + |
| 153 | +`booktabs`提供的第四個線條命令是`\cmidrule`。它可以用來繪製一條不跨越整個表格寬度的線條,而是隻跨越指定的列範圍。列範圍作為數字範圍輸入:`{`_數字_`-`_數字_`}`。即使你只想為單個列繪製線條,也需要將其指定為範圍(兩個數字相同)。 |
| 154 | + |
| 155 | +```latex |
| 156 | +% !TEX program=lualatex |
| 157 | +
|
| 158 | +\documentclass{ctexart} |
| 159 | +\usepackage{array} |
| 160 | +\usepackage{booktabs} |
| 161 | +
|
| 162 | +\begin{document} |
| 163 | +\begin{tabular}{lll} |
| 164 | + \toprule |
| 165 | + 動物 & 食物 & 大小 \\ |
| 166 | + \midrule |
| 167 | + 狗 & 肉 & 中等 \\ |
| 168 | + \cmidrule{1-2} |
| 169 | + 馬 & 乾草 & 大 \\ |
| 170 | + \cmidrule{1-1} |
| 171 | + \cmidrule{3-3} |
| 172 | + 青蛙 & 蒼蠅 & 小 \\ |
| 173 | + \bottomrule |
| 174 | +\end{tabular} |
| 175 | +\end{document} |
| 176 | +``` |
| 177 | + |
| 178 | +你可以使用`\cmidrule`的短版本,在任一端新增一個可選參數,括號中的`r`和`l`分別表示規則在 **右** 和 **左** 端縮短: |
| 179 | + |
| 180 | +```latex |
| 181 | +% !TEX program=lualatex |
| 182 | +
|
| 183 | +\documentclass{ctexart} |
| 184 | +\usepackage{array} |
| 185 | +\usepackage{booktabs} |
| 186 | +
|
| 187 | +\begin{document} |
| 188 | +\begin{tabular}{lll} |
| 189 | + \toprule |
| 190 | + 動物 & 食物 & 大小 \\ |
| 191 | + \midrule |
| 192 | + 狗 & 肉 & 中等 \\ |
| 193 | + \cmidrule{1-2} |
| 194 | + 馬 & 乾草 & 大 \\ |
| 195 | + \cmidrule(r){1-1} |
| 196 | + \cmidrule(rl){2-2} |
| 197 | + \cmidrule(l){3-3} |
| 198 | + 青蛙 & 蒼蠅 & 小 \\ |
| 199 | + \bottomrule |
| 200 | +\end{tabular} |
| 201 | +\end{document} |
| 202 | +``` |
| 203 | + |
| 204 | +你可能已經猜到,`r`和`l`分別表示規則在**右**和**左**端縮短。 |
| 205 | + |
| 206 | +有時,線條會將兩行分隔得太開,但為了更清楚地表達含義,你仍需要通過某種方式將它們分開,這時使用`\addlinespace`來插入一個小分隔。 |
| 207 | + |
| 208 | +```latex |
| 209 | +% !TEX program=lualatex |
| 210 | +
|
| 211 | +\documentclass{ctexart} |
| 212 | +\usepackage{array} |
| 213 | +\usepackage{booktabs} |
| 214 | +
|
| 215 | +\begin{document} |
| 216 | +\begin{tabular}{cp{9cm}} |
| 217 | + \toprule |
| 218 | + 動物 & 描述 \\ |
| 219 | + \midrule |
| 220 | + 狗 & 狗是犬屬的成員,屬於狼形犬科,是最廣泛分佈的陸地食肉動物。 \\ |
| 221 | + \addlinespace |
| 222 | + 貓 & 貓是一種小型食肉目家養動物。它是貓科中唯一的家養物種,通常被稱為家貓,以區別於該科的野生成員。 \\ |
| 223 | + \bottomrule |
| 224 | +\end{tabular} |
| 225 | +\end{document} |
| 226 | +``` |
| 227 | + |
| 228 | +## 合併單元格 |
| 229 | + |
| 230 | +在 LaTeX 中,你可以使用`\multicolumn`命令來水平合併單元格。它必須作為單元格中的第一個內容使用。`\multicolumn`需要三個參數: |
| 231 | + |
| 232 | +1. 應該合併的單元格數量 |
| 233 | +2. 合併單元格的對齊方式 |
| 234 | +3. 合併單元格的內容 |
| 235 | + |
| 236 | +對齊方式可以包含任何在`tabular`導言中合法的內容,但**只能包含單個列類型**。 |
| 237 | + |
| 238 | +```latex |
| 239 | +% !TEX program=lualatex |
| 240 | +
|
| 241 | +\documentclass{ctexart} |
| 242 | +\usepackage{array} |
| 243 | +\usepackage{booktabs} |
| 244 | +
|
| 245 | +\begin{document} |
| 246 | +\begin{tabular}{lll} |
| 247 | + \toprule |
| 248 | + 動物 & 食物 & 大小 \\ |
| 249 | + \midrule |
| 250 | + 狗 & 肉 & 中等 \\ |
| 251 | + 馬 & 乾草 & 大 \\ |
| 252 | + 青蛙 & 蒼蠅 & 小 \\ |
| 253 | + fuath & \multicolumn{2}{c}{未知} \\ |
| 254 | + \bottomrule |
| 255 | +\end{tabular} |
| 256 | +\end{document} |
| 257 | +``` |
| 258 | + |
| 259 | +你還可以使用`\multicolumn`在一個單元格上,以防止應用表格導言中為當前列定義的任何內容。以下內容使用這種方法來居中表格的標題行: |
| 260 | + |
| 261 | +```latex |
| 262 | +% !TEX program=lualatex |
| 263 | +
|
| 264 | +\documentclass{ctexart} |
| 265 | +\usepackage{array} |
| 266 | +\usepackage{booktabs} |
| 267 | +
|
| 268 | +\begin{document} |
| 269 | +\begin{tabular}{lll} |
| 270 | + \toprule |
| 271 | + \multicolumn{1}{c}{動物} & \multicolumn{1}{c}{食物} & \multicolumn{1}{c}{大小} \\ |
| 272 | + \midrule |
| 273 | + 狗 & 肉 & 中等 \\ |
| 274 | + 馬 & 乾草 & 大 \\ |
| 275 | + 青蛙 & 蒼蠅 & 小 \\ |
| 276 | + fuath & \multicolumn{2}{c}{未知} \\ |
| 277 | + \bottomrule |
| 278 | +\end{tabular} |
| 279 | +\end{document} |
| 280 | +``` |
| 281 | + |
| 282 | +垂直合併單元格在 LaTeX 中不受支援。通常,只需留空單元格即可讓讀者正確的理解,而無需明確地使單元格跨越多行。 |
| 283 | + |
| 284 | +```latex |
| 285 | +% !TEX program=lualatex |
| 286 | +
|
| 287 | +\documentclass{ctexart} |
| 288 | +\usepackage{array} |
| 289 | +\usepackage{booktabs} |
| 290 | +
|
| 291 | +\begin{document} |
| 292 | +\begin{tabular}{lll} |
| 293 | + \toprule |
| 294 | + 組 & 動物 & 大小 \\ |
| 295 | + \midrule |
| 296 | + 草食動物 & 馬 & 大 \\ |
| 297 | + & 鹿 & 中等 \\ |
| 298 | + & 兔子 & 小 \\ |
| 299 | + \addlinespace |
| 300 | + 肉食動物 & 狗 & 中等 \\ |
| 301 | + & 貓 & 小 \\ |
| 302 | + & 獅子 & 大 \\ |
| 303 | + \addlinespace |
| 304 | + 雜食動物 & 烏鴉 & 小 \\ |
| 305 | + & 熊 & 大 \\ |
| 306 | + & 豬 & 中等 \\ |
| 307 | + \bottomrule |
| 308 | +\end{tabular} |
| 309 | +\end{document} |
| 310 | +``` |
| 311 | + |
| 312 | +## 練習 |
| 313 | + |
| 314 | +使用簡單的表格示例開始嘗試表格。嘗試使用`l`、`c`和`r`列類型進行不同的對齊。如果你在表格行中缺少項目會發生什麼?如果你在表格行中新增太多項目會發生什麼?嘗試使用`\multicolumn`命令跨越多列。 |
0 commit comments