> For the complete documentation index, see [llms.txt](https://overleaf-pro.ayaka.space/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://overleaf-pro.ayaka.space/latex/zh-tw/shen-ru-wen-zhang/15-how-do-tex-engines-typeset-tables-2.md).

# TeX 引擎如何排版表格 2

## TeX 引擎如何排版表格 2

## TeX 引擎將表格稱為對齊

在 [TeX 原始碼的文件](https://www.overleaf.com/latex/examples/typeset-the-source-code-documentation-for-tex-e-tex-or-pdftex/qkgfgyspnhcv) Knuth 並未討論 TeX「排版表格」的能力；相反地，他描述的是 TeX 用來建構所謂的 *對齊*。TeX 的表格排版實際上是一個自動化的方塊對齊流程：安排方塊（表格儲存格、列與欄）以形成賞心悅目的矩形格線或陣列——不過，當然，畢竟是 TeX，這其中還有 *許多* 細節與微妙之處。

「對齊」這個詞也反映在所有 TeX 引擎內建的兩個表格排版指令名稱中：

* `\halign` （水平對齊），以及
* `\valign` （垂直對齊）。

在這個系列文章中，我們將探討這兩個指令，首先從其 `\halign` 以及 `\valign` 格式／結構的較正式概覽開始，以便為本系列後續更深入的文章打下基礎。

### TeX 的表格是方塊與間距

單一表格儲存格通常包含多種內容，例如文字行、數學式或圖形，這會產生一組寬度、高度或深度不同的排版素材儲存格。TeX 必須設法處理這些內容尺寸各異的儲存格，才能建構最終表格，使每一列具有特定高度、每一欄具有特定寬度。TeX 需要從這些可變尺寸的表格儲存格集合中推導出每一列高度與每一欄寬度的適當值。

然而，TeX 在將內容排版之前無法知道每個儲存格內容的真實尺寸；因此，TeX 會遍歷整個表格，逐一排版每個儲存格，以取得完成表格版面所需的尺寸資料。根據這些尺寸資料，TeX 可以決定每一列的正確高度與每一欄的寬度。TeX 也可能遇到空白儲存格，或使用者希望跨越多欄或多列的儲存格，這些都必須由 TeX 在計算時仔細納入。經過對這些零散的儲存格（方塊）尺寸資料進行「篩選」之後，TeX 才能確定一個 `\halign`，或是列高度，適用於 `\valign` 並在其表格版面演算法的最後階段使用這些數值。

在實務上、也就是在「底層」運作時，TeX 的表格排版包含幾個步驟。概略來說，TeX 會先排版表格的「草稿」或「不完整」版本，同時擷取並處理儲存格尺寸資料——以及任何 `\span` 在表格中使用的指令資料。 `\halign` 欄寬，或 `\valign` 列高，並完成整體版面——這些我們都會在本系列文章中探討。

## \halign 與 \valign：建構表格的兩種方式

所有 TeX 引擎都提供兩個 *內建的* 用於排版表格（對齊）的指令（原語）： `\halign` 以及 `\valign`，它們共享許多核心功能，但在某些根本層面上也有所不同。兩者之間的關鍵差異在於 `\halign` 以及 `\valign` 是它們建構各自表格的方式：逐列或逐欄：

* `\halign`：以逐列方式排版表格，建立個別的列，並垂直堆疊以產生表格的欄
* `\valign`：以逐欄方式排版表格，建立個別的欄，並水平堆疊以形成表格的列

### \halign

下圖描繪了由 `\halign`所建立的表格構造。表格是逐列排版，並將各列垂直堆疊。其結果之一是：

* 表格的欄來自表格列的垂直堆疊
* 頁面分頁可以發生在表格列之間
* 可以在列之間插入非表格內容（透過 `\nolign`，我們稍後會看）

![](/files/653eb480708cc29da3bd3c079bc7311c80d8d252)

### \valign

下圖描繪了由 `\valign`。表格是逐欄排版，並將各欄水平堆疊（並排）。其結果之一是：

* 表格的列來自表格欄的水平堆疊
* 可以在表格欄之間換行
* 可以在欄之間插入非表格內容（透過 `\noalign`，我們稍後會看）

![](/files/f1a0ce7cdd363ee9ab57321c71488ae1f21b348b)

### 範例

以下範例旨在凸顯逐列 *與*逐欄方法在 \halign 與 \valign 中的差異。

```latex
\documentclass{article}
\begin{document}
\pagestyle{empty}
% 緊貼的方塊邊框
\setlength{\fboxsep}{0pt}

這裡是一個 \verb|\valign| 表格：
\begingroup
% \hsize 控制 \valign
% 欄寬。我們也將
% \parindent 設為較小的值
\hsize=30pt
\parindent=10pt
\fbox{\valign{
#&#&#\cr % 前導碼：稍後會詳細說明（非常詳細！）
A&B&C\cr % 此 \valign 表格的第一個欄
D&E&F\cr
G&H&I\cr
}}
\endgroup

% 注意：基於稍後解釋的原因
% \halign 必須放在 \vbox 中
這裡是一個 \verb|\halign| 表格： \fbox{%
\vbox{\halign{
#&#&#\cr % 前導碼：稍後會詳細說明（非常詳細！）
A&B&C\cr % 此 \halign 表格的第一個列
D&E&F\cr
G&H&I\cr
}}}
\end{document}
```

[在 Overleaf 中開啟此範例](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Basic+table+example\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%25+Close-fitting+box+borders+%0A%5Csetlength%7B%5Cfboxsep%7D%7B0pt%7D%0A%0AHere+is+a+%5Cverb%7C%5Cvalign%7C+table%3A+%0A%5Cbegingroup%0A%25+%5Chsize+controls+the+%5Cvalign+%0A%25+column+widths.+We+also+set+%0A%25+%5Cparindent+to+a+smaller+value%0A%5Chsize%3D30pt+%0A%5Cparindent%3D10pt%0A%5Cfbox%7B%5Cvalign%7B%0A%23%26%23%26%23%5Ccr+%25+The+preamble%3A+covered+later+%28in+great+detail%21%29%0AA%26B%26C%5Ccr+%25+The+first+COLUMN+of+this+%5Cvalign+table%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%0A%5Cendgroup%0A%0A%25+Note%3A+for+reasons+explained+later%0A%25+the+%5Chalign+has+to+be+put+in+a+%5Cvbox%0AHere+is+an+%5Cverb%7C%5Chalign%7C+table%3A+%5Cfbox%7B%25%0A%5Cvbox%7B%5Chalign%7B%0A%23%26%23%26%23%5Ccr+%25+The+preamble%3A+covered+later+%28in+great+detail%21%29%0AA%26B%26C%5Ccr+%25+The+first+ROW+of+this+%5Chalign+table%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%7D%0A%5Cend%7Bdocument%7D)

此範例會產生以下輸出： ![](/files/7394ce6093607294c05d1209f33d9027df6867a1)

下圖顯示了上述程式碼所產生表格的註解版本。在本系列文章稍後，我們將討論諸如以下主題：

* 什麼是表格前導碼？
* 為什麼要設定 `，並在該` 以及 `\parindent` 用於 `\valign` 表格？

就目前而言，只要注意 `\halign` *與*. `\valign` 表格構造中的逐列與逐欄方法：

![](/files/295914f585912585430b97dbc9f1158a21e67b4e)

## \halign 與 \valign 的一般形式

一開始，我們會先回顧 `\halign` 以及 `\valign` 的基本性質與一般格式，但先不深入任何實質細節。 [如前所述](#intro)，我們採用稍微正式一些的方式來概述 `\halign` 以及 `\valign` 這些指令的形式／結構，為本系列後續文章打下基礎。

最一般的 `\halign` 以及 `\valign` 指令形式可寫為：

`\halign` $$\langle$$⁠`可選規格`⁠$$\rangle$$ { $$\langle$$⁠`前言區`⁠$$\rangle$$ $$\langle$$⁠`本體`⁠$$\rangle$$ }

`\valign` $$\langle$$⁠`可選規格`⁠$$\rangle$$ { $$\langle$$⁠`前言區`⁠$$\rangle$$ $$\langle$$⁠`本體`⁠$$\rangle$$ }

如你所見，兩者都 `\halign` 以及 `\valign` 由三個主要部分組成：

* [$$\langle$$⁠`可選規格`⁠$$\rangle$$](#optspec)
* [$$\langle$$⁠`前言區`⁠$$\rangle$$](#preamble)
* [$$\langle$$⁠`本體`⁠$$\rangle$$](#body)

## 該 $$\langle$$⁠可選規格⁠$$\rangle$$

表格的預設尺寸／範圍，也就是所謂的「自然尺寸」，由其內容決定——為了說明清楚，這裡所說的尺寸／範圍是指

* 加上 *寬度* ，也就是由 `\halign`，或
* 加上 *高度* ，也就是由 `\valign`

一個 $$\langle$$⁠`可選規格`⁠$$\rangle$$ 可以用來「覆寫」表格的自然尺寸，並有兩種形式：

* **`到`** $$\langle$$**⁠`尺寸`⁠**$$\rangle$$
* **`spread`** $$\langle$$**⁠`尺寸`⁠**$$\rangle$$

其中

* $$\langle$$**⁠`尺寸`⁠**$$\rangle$$ 是一個以 TeX 能理解的單位表示的長度，例如 pt、mm 或 cm——該長度也可以指定為一個會展開成以適當單位表示之值的指令；
* **`到`** 以及 **`spread`** 是指定自然尺寸「覆寫」類型的 TeX 關鍵字：
  * **`到`**：將表格尺寸設定為指定的 $$\langle$$⁠`尺寸`⁠$$\rangle$$ 值
  * **`spread`**：將指定的 $$\langle$$⁠`尺寸`⁠$$\rangle$$ 值加到表格的自然尺寸上

一個 $$\langle$$⁠`可選規格`⁠$$\rangle$$ 的效果取決於所排版的表格類型：它會調整一個 `\halign` 表格的自然 *寬度*，或是 `\valign` 表格的自然 *高度*.

以下是一些範例：

* `\halign **to 100pt**{...}`：將 `\halign` 表格寬度設為 `100pt`
* `\valign **to 50pt**{...}`：將 `\valign` 表格高度設為 `30pt`
* `\halign **spread 30pt**{...}`：將 30pt 加到 `\halign` 表格的自然寬度上。相反地，寫成 **spread -30pt** 會將表格寬度減少 30pt。
* `\valign **spread 20pt**{...}`：將 20pt 加到 `\valign` 表格的自然高度上。相反地，寫成 **spread -20pt** 會將表格高度減少 20pt。

以下程式碼重用上面的表格範例，但對一個 $$\langle$$⁠`可選規格`⁠$$\rangle$$ 套用一個 `\valign` 以及 `\halign` 表格：

```latex
\documentclass{article}
\begin{document}
\pagestyle{empty}
% 緊貼的方塊邊框
\setlength{\fboxsep}{0pt}

這裡是一個 \verb|\valign| 表格：
\begingroup
\hsize=30pt
\parindent=10pt
\fbox{\valign to 50pt{
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}}
\endgroup

這裡是一個 \verb|\halign| 表格：
\fbox{
\vbox{\halign to 100pt{
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}}}
\end{document}
```

[在 Overleaf 中開啟此範例](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Basic+table+example\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%25+Close-fitting+box+borders+%0A%5Csetlength%7B%5Cfboxsep%7D%7B0pt%7D%0A%0AHere+is+a+%5Cverb%7C%5Cvalign%7C+table%3A+%0A%5Cbegingroup%0A%5Chsize%3D30pt+%0A%5Cparindent%3D10pt%0A%5Cfbox%7B%5Cvalign+to+50pt%7B%0A%23%26%23%26%23%5Ccr%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%0A%5Cendgroup%0A%0AHere+is+an+%5Cverb%7C%5Chalign%7C+table%3A%0A%5Cfbox%7B%25%0A%5Cvbox%7B%5Chalign+to+100pt%7B%0A%23%26%23%26%23%5Ccr%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%7D%0A%5Cend%7Bdocument%7D)

此範例產生如下所示的輸出：

![](/files/f22856a2d348c014491d819736538183c987f6b8)

——但請注意兩個表格的內容如何都「擠在一起」。原因是缺乏 TeX 可用來拉伸內容、以填滿由 **`到`** $$\langle$$**⁠`尺寸`⁠**$$\rangle$$所提供額外空間的彈性間距（膠水）。這裡我們先跳到 `\tabskip` 來完成的。

#### 先行介紹 \tabskip 指令

表格版面的美觀可能需要調整其列或欄之間的間距，因此 TeX 引擎自然提供了一個名為 `\tabskip` 的指令，讓你可以做到這一點。 `\tabskip` 用來設定（並變更）TeX 在一個 `\halign` 的欄之間，或一個 `\valign`的列之間所放置的彈性空間（「膠水」）量。後續文章將更深入探討 `\tabskip` 。

作為入門範例，以下程式碼使用了 `\tabskip` 的設定，這會使 TeX 在一個 `\valign` 表格的列之間插入一些（非常）彈性的空間。這個彈性空間讓表格列得以展開，並填滿由 $$\langle$$⁠`可選規格`⁠$$\rangle$$ 的 **`to 50pt`**:

```latex
\documentclass{article}
\setlength{\fboxsep}{0pt}
\setlength{\parindent}{0pt}
\newcommand{\optspec}{\(\langle \texttt{optional specification} \rangle\)}
\begin{document}
\pagestyle{empty}
這裡是一個 \verb|\valign| 表格：
\vspace{6pt}

\begingroup
\hsize=30pt
\parindent=10pt
\fbox{\valign{
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}}
\endgroup
\vspace{6pt}

這裡是相同的 \verb|\valign| 表格，但其 \optspec{} 為 ``\texttt{to 50pt}''。請注意列如何「擠在一起」，因為列之間沒有可用的「可拉伸膠水」：

\vspace{6pt}
\begingroup
\hsize=30pt
\parindent=10pt
\fbox{\valign to 50pt{
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}}
\endgroup
\vspace{6pt}

我們將使用 \optspec{} 為 ``\texttt{to 50pt}'' 的 \verb|\valign| 表格，但透過 \verb|\tabskip| 指令提供「彈性間距」。在這裡，\verb|\tabskip| 提供了足夠的「膠水」，讓 \verb|\valign| 的列可以「拉開」，並填滿任何可用的額外空間。以下是「拉開後」的 \verb|\valign| 表格：

\tabskip=0pt plus1fil % 這會將 \tabskip 設為非常彈性的膠水
\vspace{6pt}

\def\mylen{50pt}
\begingroup
\hsize=30pt
\parindent=10pt
\fbox{\valign to \mylen{
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}}
\endgroup
\end{document}
```

[在 Overleaf 中開啟此範例](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Basic+example+using+tabskip+glue\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Csetlength%7B%5Cfboxsep%7D%7B0pt%7D%0A%5Csetlength%7B%5Cparindent%7D%7B0pt%7D%0A%5Cnewcommand%7B%5Coptspec%7D%7B%5C%28%5Clangle+%5Ctexttt%7Boptional+specification%7D+%5Crangle%5C%29%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0AHere+is+a+%5Cverb%7C%5Cvalign%7C+table%3A%0A%5Cvspace%7B6pt%7D%0A%0A%5Cbegingroup%0A%5Chsize%3D30pt+%0A%5Cparindent%3D10pt%0A%5Cfbox%7B%5Cvalign%7B%0A%23%26%23%26%23%5Ccr%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%0A%5Cendgroup%0A%5Cvspace%7B6pt%7D%0A%0AHere+is+the+same+%5Cverb%7C%5Cvalign%7C+table+but+with+an+%5Coptspec%7B%7D+of+%60%60%5Ctexttt%7Bto+50pt%7D%27%27.+Note+how+the+rows+are+%60%60bunched+up%27%27+because+there%27s+no+available+%60%60stretchable+glue%27%27+between+the+rows%3A+%0A%0A%5Cvspace%7B6pt%7D%0A%5Cbegingroup%0A%5Chsize%3D30pt+%0A%5Cparindent%3D10pt%0A%5Cfbox%7B%5Cvalign+to+50pt%7B%0A%23%26%23%26%23%5Ccr%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%0A%5Cendgroup%0A%5Cvspace%7B6pt%7D%0A%0AWe%27ll+use+the+%5Cverb%7C%5Cvalign%7C+table+with+%5Coptspec%7B%7D+of+%60%60%5Ctexttt%7Bto+50pt%7D%27%27%2C+but+provide+%60%60flexible+spacing%27%27+via+the+%5Cverb%7C%5Ctabskip%7C+command.+Here%2C+%5Cverb%7C%5Ctabskip%7C+is+providing+enough+%60%60glue%27%27+to+enable+the++%5Cverb%7C%5Cvalign%7C+rows+to++%60%60stretch+out%27%27+and+fill+any+available+extra+space.+Here+is+the+%60%60stretched+out%27%27+%5Cverb%7C%5Cvalign%7C+table%3A%0A%0A%5Ctabskip%3D0pt+plus1fil+%25+This+sets+%5Ctabskip+to+a+very+flexible+glue%0A%5Cvspace%7B6pt%7D%0A%0A%5Cdef%5Cmylen%7B50pt%7D%0A%5Cbegingroup%0A%5Chsize%3D30pt+%0A%5Cparindent%3D10pt%0A%5Cfbox%7B%5Cvalign+to+%5Cmylen%7B%0A%23%26%23%26%23%5Ccr%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%0A%5Cendgroup%0A%5Cend%7Bdocument%7D)

此範例會產生以下輸出：

![](/files/677dec06a5a0943c86ac132caa9206103c900a4b)

## 介紹表格 $$\langle$$⁠前導碼⁠$$\rangle$$ 以及 $$\langle$$⁠本體⁠$$\rangle$$

本節將介紹表格的 $$\langle$$⁠`前言區`⁠$$\rangle$$，以及 *簡要地* 簡述表格的 $$\langle$$⁠`本體`⁠$$\rangle$$ ，之後將 [進一步詳加探討](#bodydetails).

本系列後續文章將探討 $$\langle$$⁠`前言區`⁠$$\rangle$$ 以及 $$\langle$$⁠`本體`⁠$$\rangle$$ 的更詳細內容，尤其是 TeX 對表格 $$\langle$$⁠`前言區`⁠$$\rangle$$.

如上所述， `\halign` 或 `\valign` 表格的最一般格式可寫為：

`\halign` $$\langle$$⁠`可選規格`⁠$$\rangle$$ { $$\langle$$⁠`前言區`⁠$$\rangle$$ $$\langle$$⁠`本體`⁠$$\rangle$$ }

`\valign` $$\langle$$⁠`可選規格`⁠$$\rangle$$ { $$\langle$$⁠`前言區`⁠$$\rangle$$ $$\langle$$⁠`本體`⁠$$\rangle$$ }

### 該 $$\langle$$⁠前導碼⁠$$\rangle$$

該 $$\langle$$⁠`前言區`⁠$$\rangle$$ 部分包含單一的 $$\langle$$⁠`前導碼行`⁠$$\rangle$$ ，其 *終止* 由 `\cr` 指令；因此， $$\langle$$⁠`前言區`⁠$$\rangle$$ 可以改寫為：

$$\langle$$⁠`前言區`⁠$$\rangle$$=$$\langle$$⁠`前導碼行`⁠$$\rangle$$**`\cr`**

### 該 $$\langle$$⁠本體⁠$$\rangle$$

同樣地， $$\langle$$⁠本體⁠$$\rangle$$ 部分還可以再分解為一條或多條構成的「行」，但在此每一行有兩種選擇：

* 由一組儲存格組成的一行，這些儲存格形成一個 `\halign` 列，或 `\valign` 欄；或
* 一個 `\noalign` 會在一個 `\halign`的列之間或 `\valign`的欄之間「插入」內容的指令。

就目前而言，我們將忽略 `\noalign` 指令（見 [本文後文](#noalign)) $$\langle$$⁠本體⁠$$\rangle$$ 是供一組儲存格使用的資料，並且 *終止* 由 `\cr` 來完成的。

忽略 `\noalign`中使用時， $$\langle$$⁠`本體`⁠$$\rangle$$ 部分（代表使用者內容）包含一連串行，每一行我們都稱之為 $$\langle$$⁠`本體行`⁠$$\rangle$$ ，其 *終止* 由其對應的 `\cr` 來完成的。

該 $$\langle$$⁠`本體`⁠$$\rangle$$ 可以改寫為：

$$\langle$$⁠本體行$${}\_1$$⁠$$\rangle$$\cr $$\langle$$⁠本體行$${}\_2$$⁠$$\rangle$$\cr $$\langle$$⁠本體行$${}*3$$⁠$$\rangle$$\cr ... $$\langle$$⁠本體行$${}*\mathrm{N}$$⁠$$\rangle$$\cr

綜合以上，我們可以將 `\halign` 以及 `\valign` 定義為：

`\halign` $$\langle$$⁠`可選規格`⁠$$\rangle$$ { $$\langle$$⁠`前導碼行`⁠$$\rangle$$\cr $$\langle$$⁠本體行$${}\_1$$⁠$$\rangle$$\cr $$\langle$$⁠本體行$${}\_2$$⁠$$\rangle$$\cr $$\langle$$⁠本體行$${}*3$$⁠$$\rangle$$\cr ... $$\langle$$⁠本體行$${}*\mathrm{N}$$⁠$$\rangle$$\cr }

`\valign` $$\langle$$⁠`可選規格`⁠$$\rangle$$ { $$\langle$$⁠`前導碼行`⁠$$\rangle$$\cr $$\langle$$⁠本體行$${}\_1$$⁠$$\rangle$$\cr $$\langle$$⁠本體行$${}\_2$$⁠$$\rangle$$\cr $$\langle$$⁠本體行$${}*3$$⁠$$\rangle$$\cr ... $$\langle$$⁠本體行$${}*\mathrm{N}$$⁠$$\rangle$$\cr }

基於稍後文章中會說明的原因， $$\langle$$⁠`前言區`⁠$$\rangle$$，僅單一的 $$\langle$$⁠`前導碼行`⁠$$\rangle$$，其格式與表格中的所有其他行不同 $$\langle$$⁠`本體`⁠$$\rangle$$。我們也會 [重新探討 `\noalign` 命令](#noalign) 它也可以用在表格內的 $$\langle$$⁠`本體`⁠$$\rangle$$.

### 該 $$\langle$$⁠前導碼行⁠$$\rangle$$

該 $$\langle$$⁠`前導碼行`⁠$$\rangle$$ 扮演 *關鍵* 角色，因為它提供了一種用來排版內容的「藍圖」——`\halign` 列或 `\valign` 欄——也就是表格中所包含的 $$\langle$$⁠`本體`⁠$$\rangle$$。 $$\langle$$⁠`前導碼行`⁠$$\rangle$$ 也可以包含儲存格「樣板」，用來建構一個 `\halign` 的列或一個 `\valign`——這個主題稍後將詳細探討。

的目的在於 $$\langle$$⁠`前導碼行`⁠$$\rangle$$ 有兩個方面：

* 它決定 *最大值* 一個的每列儲存格數 `\halign` ，或一個的每欄儲存格數 `\valign`.
* 它儲存 *儲存格樣板* ，可用來自動化表格中儲存格內的格式化或內容插入 $$\langle$$⁠`本體`⁠$$\rangle$$。儲存格樣板是可選的，也可以是「空白」的；或者你可以加入一些字元或指令，讓 TeX 自動在表格中特定儲存格的實際內容之前和／或之後插入它們。這樣可以省去你必須手動在每個需要套用的儲存格中撰寫／加入那些字元或指令的繁瑣工作。

**注意**：一個 `\halign` 列，或 `\valign` 欄所包含的儲存格數可以少於由 $$\langle$$⁠`前導碼行`⁠$$\rangle$$ 所指定的最大值，但不能超過該最大值，否則 TeX 會產生錯誤。就目前而言，我們先略過 *循環* 前導碼的細節。

延續我們的結構圖， $$\langle$$⁠`前導碼行`⁠$$\rangle$$ 用於

* 一個 `\halign` 一個表格，最多有 $$\mathrm{K}$$ 個儲存格／ *列*，或
* 一個 `\valign` 一個表格，最多有 $$\mathrm{K}$$ 個儲存格／ *欄*

可寫為：

$$\langle$$⁠樣板$${}\_1$$⁠$$\rangle$$&$$\langle$$⁠樣板$${}\_2$$⁠$$\rangle$$&$$\langle$$⁠樣板$${}*3$$⁠$$\rangle$$ $$\cdots$$ &$$\langle$$⁠樣板$${}*\mathrm{K}$$⁠$$\rangle$$

其中 `&` 是 *對齊定位字元* ，它表示一個儲存格的結束與下一個儲存格的開始。傳統上，和號字元（`&`）用作對齊定位字元，但任何具有 [類別碼](/latex/zh-tw/geng-duo-zhu-ti/43-table-of-tex-category-codes.md) 4 的字元都可以取代。

提醒一下， $$\langle$$⁠`前言區`⁠$$\rangle$$ 可以寫成 $$\langle$$⁠`前言區`⁠$$\rangle$$=$$\langle$$⁠`前導碼行`⁠$$\rangle$$**`\cr`**，或等價地寫成

$$\langle$$⁠`前言區`⁠$$\rangle$$=$$\langle$$⁠樣板$${}\_1$$⁠$$\rangle$$&$$\langle$$⁠樣板$${}\_2$$⁠$$\rangle$$&$$\langle$$⁠樣板$${}*3$$⁠$$\rangle$$ $$\cdots$$ &$$\langle$$⁠樣板$${}*\mathrm{K}$$⁠$$\rangle$$**`\cr`**

#### 每個儲存格的結構 $$\langle$$⁠樣板⁠$$\rangle$$

每個儲存格 $$\langle$$⁠樣板$${}\_i$$⁠$$\rangle$$ 可寫為：

$$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$ 其中：

* $$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$ 是一組 TeX 會自動插入的字元或指令（記號） *之前* 儲存格的使用者提供內容 $$i$$;
* $$\texttt{#}$$ 是一個佔位符，顯示使用者提供的內容要出現在儲存格中的位置 $$i$$。再次提醒， `#` 字元只是個 *傳統*，任何具有 [類別碼](/latex/zh-tw/geng-duo-zhu-ti/43-table-of-tex-category-codes.md) 6 的字元都可以取代。請注意，類別碼 6 用於巨集參數；
* $$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$ 是一組 TeX 會自動插入的字元或指令（記號） *之後* 儲存格的使用者提供內容 $$i$$.

請注意，所有 $$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$ 以及 $$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$ 是 *選用的*：你不必在儲存格內容之前或之後使用任何字元或指令。

**完成** $$\langle$$**⁠前導碼⁠**$$\rangle$$

最後，使用上面的記法， $$\langle$$⁠`前言區`⁠$$\rangle$$ 用於

* 一個 `\halign` 一個表格，最多有 $$\mathrm{K}$$ 個儲存格／ *列*，或
* 一個 `\valign` 一個表格，最多有 $$\mathrm{K}$$ 個儲存格／ *欄*

可寫為：

$$\langle$$⁠`前言區`⁠$$\rangle$$=$$\langle$$⁠`前導碼行`⁠$$\rangle$$`**\cr**`

或

$$\langle$$⁠`前言區`⁠$$\rangle$$=$$\langle$$⁠$$\texttt{U}\_1$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_1$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_2$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_2$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}*3$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}*3$$⁠$$\rangle$$$$\cdots$$$$\langle$$⁠$$\texttt{U}*\mathrm{K}$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}*\mathrm{K}$$⁠$$\rangle$$`**\cr**`

**該** $$\langle$$**⁠前導碼⁠**$$\rangle$$ **以及列與欄的計數**

一個 **`\halign`** 一個具有 $$\langle$$⁠`前言區`⁠$$\rangle$$ ，並指定 $$\mathrm{K}$$ 個儲存格，以及一個 $$\langle$$⁠`本體`⁠$$\rangle$$ ，其中包含 $$\mathrm{N}$$ $$\langle$$⁠`本體行`⁠$$\rangle$$ 將產生一個具有 $$\mathrm{K}$$ *欄* 以及 $$\mathrm{N}$$ *列*的表格，如下圖所示：

![](/files/e61870e2a3d9291e9566c4a984f4e1b17e96d695)

A **`\valign`** 一個具有 $$\langle$$⁠`前言區`⁠$$\rangle$$ ，並指定 $$\mathrm{K}$$ 個儲存格，以及一個 $$\langle$$⁠`本體`⁠$$\rangle$$ ，其中包含 $$\mathrm{N}$$ $$\langle$$⁠`本體行`⁠$$\rangle$$ 將產生一個具有 $$\mathrm{K}$$ *列* 以及 $$\mathrm{N}$$ *欄*的表格，如下圖所示：

![](/files/e97207d3e014d04fda1f3a5c99f8a27b487da9a5)

### 理論夠了，來點範例！

如我們稍後將詳細看到的，當 TeX 處理表格內容——即包含在 [$$\langle$$⁠`本體`⁠$$\rangle$$](#body)中的表格儲存格時，它會檢查是否存在儲存格樣板，而這些樣板是定義在 $$\langle$$⁠`前言區`⁠$$\rangle$$中，因為 TeX 會尋找任何要在使用者內容之前和／或之後插入的樣板記號。以下這些最小範例展示了儲存格樣板的用法 $$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$ 在一個 `\halign` 以及 `\valign` 表格的 SVG 圖形。

#### 使用儲存格樣板的 \halign 表格

以下範例示範了一個 `\halign` 表格，它使用一個儲存格樣板，自動在每一列第一個儲存格內容的前後插入雙引號：也就是說，這個樣板會影響第一欄的每個儲存格：

```latex
\documentclass{article}
\usepackage{parskip} % 將 \parindent 設為 0pt
% 選擇一個方便的小頁面尺寸
\usepackage[paperheight=10cm,paperwidth=12cm,textwidth=8cm]{geometry}
\setlength{\tabskip}{20pt} % 拉開 \halign 的各欄間距
\begin{document}
\pagestyle{empty}

這裡是一個 \verb|\halign| 表格，\textit{沒有}儲存格樣板：

\halign{
% 在 <preamble> 中每個 '#' 的前後都沒有內容
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}

這裡是相同的 \verb|\halign| 表格，但會自動在每一列的第一個儲存格加上雙引號；也就是說，它會影響第一欄的每個儲存格：

\halign{
% 前導碼中的引號樣板：
``#''&#&#\cr % 在第一個 # 的前後加上雙引號
A&B&C\cr
D&E&F\cr
G&H&I\cr
}
\end{document}
```

[在 Overleaf 中開啟此範例](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=halign+example+of+cell+templates\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%7Bparskip%7D+%25+Set+%5Cparindent+to+0pt%0A%25+Choose+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D10cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D8cm%5D%7Bgeometry%7D%0A%5Csetlength%7B%5Ctabskip%7D%7B20pt%7D+%25+Space+out+the+%5Chalign+columns%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%0AHere+is+an+%5Cverb%7C%5Chalign%7C+table+%5Ctextit%7Bwithout%7D+cell+templates%3A+%0A%0A%5Chalign%7B%0A%25+Nothing+before+or+after+each+%27%23%27+in+the+%3Cpreamble%3E%0A%23%26%23%26%23%5Ccr+%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%0A%0AHere+is+the+same+%5Cverb%7C%5Chalign%7C+table+but+with+double+quotes+automatically+added+to+the+first+cell+in+each+row%3B+i.e.%2C+it+affects+every+cell+in+the+first+column%3A+%0A%0A%5Chalign%7B%0A%25+Quotation+templates+in+the+preamble%3A%0A%60%60%23%27%27%26%23%26%23%5Ccr+%25+Double+quote+marks+before+and+after+first+%23%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%0A%5Cend%7Bdocument%7D)

此範例會產生以下輸出：

![](/files/85d474dd0805e377097d952172fe3b88b88ce018)

下圖是 `\halign` 上例所產生表格的註解版本；在這裡，我們比較一個三儲存格 $$\langle$$⁠`前言區`⁠$$\rangle$$:

$$\langle$$⁠$$\texttt{U}\_1$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_1$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_2$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_2$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_3$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_3$$⁠$$\rangle$$`**\cr**`

的「正式」結構與實際的 $$\langle$$⁠`前言區`⁠$$\rangle$$ 的 ` ``#''&#&#**\cr** `，並突顯儲存格樣板的存在或不存在：

![](/files/91c22319b77dd4a074c99a98717c680d22a80fdc)

#### 使用儲存格樣板的 \valign 表格

以下範例示範了一個 `\valign` 表格，它為每個儲存格使用一個樣板，自動在使用者內容前後插入數字。

```latex
\documentclass{article}
\usepackage{parskip} % 將 \parindent 設為 0pt
% 選擇一個方便的小頁面尺寸
\usepackage[paperheight=14cm,paperwidth=12cm,textwidth=10cm]{geometry}
\setlength{\tabskip}{8pt} % 拉開 \valign 的各列間距
\begin{document}
\pagestyle{empty}

這裡是一個 \verb|\valign| 表格，\textit{沒有}儲存格樣板：

\begingroup
\hsize=25pt
\valign{
% 在每個 '#' 的前後都沒有內容
% 在 <preamble> 中
#&#&#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}
\endgroup

這裡是相同的 \verb|\valign| 表格，但使用儲存格樣板自動將數字插入每個儲存格：

\begingroup
\hsize=25pt
\valign{
% 在每個 '#' 的前後插入數字
% 在 <preamble> 中
1#2&3#4&5#6\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}
\endgroup
\end{document}
```

[在 Overleaf 中開啟此範例](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+of+valign+cell+templates\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%7Bparskip%7D+%25+Set+%5Cparindent+to+0pt%0A%25+Choose+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D14cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D10cm%5D%7Bgeometry%7D%0A%5Csetlength%7B%5Ctabskip%7D%7B8pt%7D+%25+Space+out+the+%5Cvalign+rows%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%0AHere+is+a+%5Cverb%7C%5Cvalign%7C+table+%5Ctextit%7Bwithout%7D+cell+templates%3A%0A%0A%5Cbegingroup%0A%5Chsize%3D25pt%0A%5Cvalign%7B%0A%25+Nothing+before+or+after+each+%27%23%27+in+%0A%25+the+%3Cpreamble%3E%0A%23%26%23%26%23%5Ccr+%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%0A%5Cendgroup%0A%0AHere+is+the+same+%5Cverb%7C%5Cvalign%7C+table+but+using+cell+templates+to+automatically+insert+digits+into+every+cell%3A+%0A%0A%5Cbegingroup%0A%5Chsize%3D25pt%0A%5Cvalign%7B%0A%25+Digits+inserted+before+and+after+every+%27%23%27+in%0A%25+the+%3Cpreamble%3E%0A1%232%263%234%265%236%5Ccr+%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%0A%5Cendgroup%0A%5Cend%7Bdocument%7D)

此範例會產生以下輸出：

![](/files/d666fa83c4a7b4b31eef283a2199f77e8ed1b9f9)

下圖是 `\valign` 上例所產生表格的註解版本；在這裡，我們比較一個三儲存格 $$\langle$$⁠`前言區`⁠$$\rangle$$:

$$\langle$$⁠$$\texttt{U}\_1$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_1$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_2$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_2$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_3$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_3$$⁠$$\rangle$$`**\cr**`

的「正式」結構與實際的 $$\langle$$⁠`前言區`⁠$$\rangle$$ 的 `1#2&3#4&5#6**\cr**`，突顯儲存格樣板的使用 $$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$:

![](/files/9ac50693f8554a78216881790d5162feb666acc1)

請注意儲存格 $$i$$ ($$\langle$$⁠$$\texttt{U}\_i$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_i$$⁠$$\rangle$$）的樣板如何套用到 $$i$$第 個儲存格於每個 `\valign` 欄，因此會使 $$i$$第 *列* 欄中的所有儲存格都受到影響。

#### 使用儲存格樣板為文字加上樣式

下一個範例使用以下 $$\langle$$⁠`前言區`⁠$$\rangle$$ （儲存格範本）用來為每一列或每一欄中的文字套用樣式：

`\textbf{#}&\textit{#}&\texttt{#}\cr`

如果我們將這個 $$\langle$$⁠`前言區`⁠$$\rangle$$ 與我們的「正式」三儲存格結構相比 $$\langle$$⁠`前言區`⁠$$\rangle$$:

$$\langle$$⁠$$\texttt{U}\_1$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_1$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_2$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_2$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_3$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_3$$⁠$$\rangle$$`**\cr**`

我們可以看出：

$$\langle$$⁠$$\texttt{U}\_1$$⁠$$\rangle$$=`\textbf{`

$$\langle$$⁠$$\texttt{V}\_1$$⁠$$\rangle$$=`}`

$$\langle$$⁠$$\texttt{U}\_2$$⁠$$\rangle$$=`\textit{`

$$\langle$$⁠$$\texttt{V}\_2$$⁠$$\rangle$$=`}`

$$\langle$$⁠$$\texttt{U}\_3$$⁠$$\rangle$$=`\texttt{`

$$\langle$$⁠$$\texttt{V}\_3$$⁠$$\rangle$$=`}`

請注意這些儲存格範本，例如 `\textbf{#}` 與具有單一參數（儲存格內容）的巨集很相似。

```latex
一個使用儲存格範本設定文字樣式的 \verb|\valign| 表格：

\begingroup
\hsize=25pt
\valign{
\textbf{#}&\textit{#}&\texttt{#}\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}
\endgroup

一個使用儲存格範本設定文字樣式的 \verb|\halign| 表格：

\halign{
\textbf{#}&\textit{#}&\texttt{#}\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}
```

[在 Overleaf 中開啟此範例](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Styling+with+cell+templates\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%7Bparskip%7D+%25+Set+%5Cparindent+to+0pt%0A%25+Choose+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D14cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D6cm%5D%7Bgeometry%7D%0A%25+Space+out+the+%5Chalign+columns+or+%5Cvalign+rows%0A%5Csetlength%7B%5Ctabskip%7D%7B8pt%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0AA+%5Cverb%7C%5Cvalign%7C+table+with+text+styled+using+cell+templates%3A%0A%0A%5Cbegingroup%0A%5Chsize%3D25pt%0A%5Cvalign%7B%0A%5Ctextbf%7B%23%7D%26%5Ctextit%7B%23%7D%26%5Ctexttt%7B%23%7D%5Ccr+%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%0A%5Cendgroup%0A%0AAn+%5Cverb%7C%5Chalign%7C+table+with+text+styled+using+cell+templates%3A%0A%0A%5Chalign%7B%0A%5Ctextbf%7B%23%7D%26%5Ctextit%7B%23%7D%26%5Ctexttt%7B%23%7D%5Ccr+%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%0A%5Cend%7Bdocument%7D)

此範例會產生以下輸出：

![](/files/876e74c4258a37ba256f342a4612d09d06107343)

## 關於表格的更多細節 $$\langle$$⁠本體⁠$$\rangle$$

在該節中 [介紹表格 $$\langle$$⁠`前言區`⁠$$\rangle$$ 以及 $$\langle$$⁠`本體`⁠$$\rangle$$](#preamble) 我們看過，如果暫時忽略 `\noalign`中使用時， $$\langle$$⁠`本體`⁠$$\rangle$$ 一個 `\halign` 或 `\valign` 表格由多行組成，每一行都指定為 $$\langle$$⁠本體行$${}\_j$$⁠$$\rangle$$，其中：

* 每一個 $$\langle$$⁠本體行$${}\_j$$⁠$$\rangle$$ 都以 `\cr` 命令
* 每一個 $$\langle$$⁠本體行$${}\_j$$⁠$$\rangle$$ 一個 `\halign` 是表格列
* 每一個 $$\langle$$⁠本體行$${}\_j$$⁠$$\rangle$$ 的一個 `\valign` 是表格欄

這些行的序列， $$\langle$$⁠本體行$${}\_j$$⁠$$\rangle$$，其中 $$j=1\ldots\mathrm{N}$$，會產生 $$\mathrm{N}$$ 一個的列 `\halign` 或 $$\mathrm{N}$$ 用於一個的欄 `\valign`。如下圖所總結，一般的 $$\langle$$⁠`前言區`⁠$$\rangle$$ 例如

$$\langle$$⁠`前言區`⁠$$\rangle$$=$$\langle$$⁠$$\texttt{U}\_1$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_1$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}\_2$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}\_2$$⁠$$\rangle$$&$$\langle$$⁠$$\texttt{U}*3$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}*3$$⁠$$\rangle$$$$\cdots$$$$\langle$$⁠$$\texttt{U}*\mathrm{K}$$⁠$$\rangle$$$$\texttt{#}$$$$\langle$$⁠$$\texttt{V}*\mathrm{K}$$⁠$$\rangle$$`**\cr**`

會為最多 $$\mathrm{K}$$ 個儲存格提供範本於每個 $$\mathrm{N}$$ $$\langle$$⁠`本體行`⁠$$\rangle$$ 中的項目 $$\langle$$⁠`本體`⁠$$\rangle$$:

![](/files/21d7a868d930e869c78255d2c763922e19cfaf8f)

### 每一個的結構 $$\langle$$⁠本體行$${}\_j$$⁠$$\rangle$$

每一行 $$\langle$$⁠本體行$${}\_j$$⁠$$\rangle$$ 在表格中 $$\langle$$⁠本體⁠$$\rangle$$ 可包含最多 $$\mathrm{K}$$ 個儲存格——其數量由表格 $$\langle$$⁠前導碼⁠$$\rangle$$——決定，且其一般形式為：

$$\langle$$⁠本體行$${}\_j$$⁠$$\rangle$$=$$\langle$$⁠儲存格$${}\_1$$⁠$$\rangle$$$$\texttt{&}$$$$\langle$$⁠儲存格$${}\_2$$⁠$$\rangle$$$$\texttt{&}$$$$\langle$$⁠儲存格$${}*3$$⁠$$\rangle$$$$\texttt{&}$$$$\cdots$$$$\texttt{&}$$$$\langle$$⁠儲存格$${}*\mathrm{K}$$⁠$$\rangle$$`**\cr**`

其中：

* $$\langle$$⁠儲存格$${}\_i$$⁠$$\rangle$$ 代表使用者在 $$i$$第 th 個儲存格在某個 $$\langle$$⁠本體行$${}\_j$$⁠$$\rangle$$
* 加上 **`&`** 字元稱為 *對齊定位符* （與用於 $$\langle$$⁠前導碼⁠$$\rangle$$）表示一個儲存格的結束與下一個儲存格的開始。同樣地，使用 **`&`** 純粹只是傳統（慣例），因為任何具有 [類別碼](/latex/zh-tw/geng-duo-zhu-ti/43-table-of-tex-category-codes.md) 4 的字元都可以取代。

雖然每一個 $$\langle$$⁠本體行$${}\_j$$⁠$$\rangle$$ 最多可包含 $$\mathrm{K}$$ 個儲存格（由 $$\langle$$⁠前導碼⁠$$\rangle$$決定），它們可以包含 *較少* 於 $$\mathrm{K}$$ 個儲存格，而且任何 $$\langle$$⁠儲存格$${}\_i$$⁠$$\rangle$$ 在 $$\langle$$⁠本體行$${}\_j$$⁠$$\rangle$$ 都可以是空的。

以下範例示範了一個 $$\langle$$⁠前導碼⁠$$\rangle$$ 的 `#&#&#&#&#\cr` 這可讓每個 $$\langle$$⁠主體行⁠$$\rangle$$；然而，排版後的表格含有少於 5 個儲存格的行：

```latex
一個每個\textit{欄}含 1 到 5 個儲存格的 \verb|\valign| 表格：

\begingroup
% \hsize 控制 \valign 欄寬（排版行的大小）。
\hsize=40pt
\fbox{\valign{
% 使用允許每欄 5 個儲存格的前導設定
% 大多數欄並未提供 5 個儲存格的內容
#&#&#&#&#\cr% 5 cells per column
\(\mathrm{Cell}{}_1\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)&\(\mathrm{Cell}{}_3\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)&\(\mathrm{Cell}{}_3\)&\(\mathrm{Cell}{}_4\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)&\(\mathrm{Cell}{}_3\)&\(\mathrm{Cell}{}_4\)&\(\mathrm{Cell}{}_5\)\cr
}}
\endgroup

% 注意：基於稍後解釋的原因
% \halign 必須放在 \vbox 中
一個每行含 1 到 5 個儲存格的 \verb|\halign| 表格：

\fbox{
\vbox{\halign{
% 使用允許每行 5 個儲存格的前導設定
% 大多數行並未提供 5 個儲存格的內容
#&#&#&#&#\cr % 5 cells per row
\(\mathrm{Cell}{}_1\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)&\(\mathrm{Cell}{}_3\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)&\(\mathrm{Cell}{}_3\)&\(\mathrm{Cell}{}_4\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)&\(\mathrm{Cell}{}_3\)&\(\mathrm{Cell}{}_4\)&\(\mathrm{Cell}{}_5\)\cr
}}}
```

[在 Overleaf 中開啟此範例](/latex/zh-tw/shen-ru-wen-zhang/15-how-do-tex-engines-typeset-tables-2.md)

此範例會產生以下輸出：

![](/files/317a900dd20edacc8308da0d07179e1a4ae0b6cf)

接下來的 `\halign` 範例展示每行儲存格數量可變，以及儲存格可以為空的能力——請注意空白儲存格是如何由連續的 **`&`** 字元在表格中產生的：

```latex
一個包含一些空白儲存格的 \verb|\halign| 表格——請注意表格 \(\langle\texttt{body}\rangle\) 中有連續的 \texttt{\&} 字元：

\fbox{
\vbox{\halign{
% 使用允許每行 5 個儲存格的前導設定
% 大多數行並未提供 5 個儲存格的內容
#&#&#&#&#\cr % 5 cells per row
\(\mathrm{Cell}{}_1\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)\cr
\(\mathrm{Cell}{}_1\)&&\(\mathrm{Cell}{}_3\)\cr
&\(\mathrm{Cell}{}_2\)&\(\mathrm{Cell}{}_3\)&\(\mathrm{Cell}{}_4\)\cr
\(\mathrm{Cell}{}_1\)&\(\mathrm{Cell}{}_2\)&&&\(\mathrm{Cell}{}_5\)\cr
}}}
```

[在 Overleaf 中開啟此範例](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Empty+cells+Number+of+cells+per+row\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%7Bparskip%7D+%25+Set+%5Cparindent+to+0pt%0A%25+Choose+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D8cm%5D%7Bgeometry%7D%0A%25+Space+out+the+%5Chalign+columns+and+%5Cvalign+rows%0A%5Csetlength%7B%5Ctabskip%7D%7B8pt%7D+%0A%25+Close-fitting+box+borders+%0A%5Csetlength%7B%5Cfboxsep%7D%7B0pt%7D%0A%5Cbegin%7Bdocument%7D%0AAn+%5Cverb%7C%5Chalign%7C+table+with+some+empty+cells---note+there+are+consecutive+%5Ctexttt%7B%5C%26%7D+characters+in+the+table+%5C%28%5Clangle%5Ctexttt%7Bbody%7D%5Crangle%5C%29%3A%0A%0A%5Cfbox%7B%25%0A%5Cvbox%7B%5Chalign%7B%0A%25+Use+a+preamble+that+allows+for+5+cells+per+row%0A%25+Most+rows+don%27t+provide+content+for+5+cells%0A%23%26%23%26%23%26%23%26%23%5Ccr+%25+5+cells+per+row%0A%5C%28%5Cmathrm%7BCell%7D%7B%7D_1%5C%29%5Ccr+%0A%5C%28%5Cmathrm%7BCell%7D%7B%7D_1%5C%29%26%5C%28%5Cmathrm%7BCell%7D%7B%7D_2%5C%29%5Ccr%0A%5C%28%5Cmathrm%7BCell%7D%7B%7D_1%5C%29%26%26%5C%28%5Cmathrm%7BCell%7D%7B%7D_3%5C%29%5Ccr%0A%26%5C%28%5Cmathrm%7BCell%7D%7B%7D_2%5C%29%26%5C%28%5Cmathrm%7BCell%7D%7B%7D_3%5C%29%26%5C%28%5Cmathrm%7BCell%7D%7B%7D_4%5C%29%5Ccr%0A%5C%28%5Cmathrm%7BCell%7D%7B%7D_1%5C%29%26%5C%28%5Cmathrm%7BCell%7D%7B%7D_2%5C%29%26%26%26%5C%28%5Cmathrm%7BCell%7D%7B%7D_5%5C%29%5Ccr%0A%7D%7D%7D%0A%5Cend%7Bdocument%7D)

此範例會產生以下輸出：

![](/files/2a9e6fe6936eb57e4af08febe8f276e4ab9315ac)

### 在表格排版中，& 和 # 沒有什麼特別之處

TeX 對這些字元的使用 `&` 以及 `#` 在排版 `\halign`- 或 `\valign`基礎的表格是一種傳統，源自 Knuth 原始的 plain TeX 巨集。完全可以使用除了 `&` 以及 `#` ，只要將適當的類別碼指派給你偏好的替代字元即可，如下例所示：

* 替換 `&` 替換成 `@` 透過指派 `@` 為類別碼 4
* 替換 `#` 替換成 `|` 透過指派 `|` 為類別碼 6（用於巨集參數）

可透過使用以下方式將類別碼變更侷限在局部： `\begingroup` 以及 `\endgroup`:

```latex
\documentclass{article}
\begin{document}
\begingroup
\catcode`@=4
\catcode`|=6
\halign{
|@|@|\cr
A@B@C\cr
D@E@F\cr
}
\endgroup
\end{document}
```

[在 Overleaf 中開啟此範例](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Tables+and+category+codes\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cbegingroup%0A%5Ccatcode%60%40%3D4%0A%5Ccatcode%60%7C%3D6%0A%5Chalign%7B%0A%7C%40%7C%40%7C%5Ccr%0AA%40B%40C%5Ccr%0AD%40E%40F%5Ccr%0A%7D%0A%5Cendgroup%0A%5Cend%7Bdocument%7D)

## 重新介紹 \noalign 指令

TeX 引擎提供內建（原始）的 `\noalign` 命令的更多內容：

`\noalign{`$$\langle$$⁠`詞元`⁠$$\rangle$$`}`

其中 $$\langle$$⁠`詞元`⁠$$\rangle$$ 是字元和／或 TeX/LaTeX 指令。 `\noalign` 指令僅可用於 `\halign` 或 `\valign` 表格中：在這些範圍之外使用會產生錯誤。

的用途是 `\noalign` 允許插入文字與 TeX/LaTeX 指令 *在……之間* 一個的各列之間 `\halign` 表格，或一個的各欄之間 `\valign` 表格中。最常見的 `\noalign` 用途是建立表格線（規則線）：

* *水平* 線條於 `\halign` 表格列之間
* *垂直* 線條於 `\valign` 表格欄之間

請注意以下事項：

* 加上 `\noalign` 指令為 ***不以\*\*\*\*終止\*\*\*\* ****`\cr`**** \*\*\*\*\*\*\*\*指令***
* 在其中允許的指令集合 `\noalign{...}` 取決於它是否用於 $$\langle$$⁠`本體`⁠$$\rangle$$ 一個 `\halign` 或 `\valign` 表格中（亦即在垂直或水平模式中）。

現在我們可以說，表格 $$\langle$$⁠`本體`⁠$$\rangle$$ 的 `\halign` 或 `\valign` 可以由單獨的行組成 $$\langle$$⁠本體行$${}\_i$$⁠$$\rangle$$`\cr` 其間穿插 `\noalign` 指令；其中一種眾多可能性／組合可以是：

`\noalign{`$$\langle$$⁠`詞元`⁠$$\rangle$$`}` $$\langle$$⁠本體行$${}\_1$$⁠$$\rangle$$\cr $$\langle$$⁠本體行$${}\_2$$⁠$$\rangle$$\cr `\noalign{`$$\langle$$⁠`更多詞元`⁠$$\rangle$$`}` $$\langle$$⁠本體行$${}*3$$⁠$$\rangle$$\cr ... $$\langle$$⁠本體行$${}*\mathrm{N}$$⁠$$\rangle$$\cr `\noalign{`$$\langle$$⁠`其他詞元`⁠$$\rangle$$`}`

### 使用 \noalign 的範例

我們稍後會在本系列文章中看看其他使用案例，但這裡先提供一個基本範例，示範如何透過 `\noalign`:

```latex
\setlength{\tabskip}{5pt}

使用 \verb|\noalign| 在 \verb|\halign| 表格的列之間放置水平線：
\vspace{6pt}

\halign{%
#&#&#&#&#\cr
\noalign{\hrule\kern2pt}
1&2&3&4&5\cr
\noalign{\kern2pt\hrule\kern2pt}
6&7&8&9&10\cr
\noalign{\kern2pt\hrule}
}

使用 \verb|\noalign| 在 \verb|\valign| 表格的欄之間放置垂直線：
\vspace{6pt}

\begingroup % keep changes to \parindent and \hsize local
\parindent=0pt
\hsize=50pt
\valign{%
#&#&#&#&#\cr
\noalign{\vrule\kern2pt}
1&2&3&4&5\cr
\noalign{\kern2pt\vrule\kern2pt}
6&7&8&9&10\cr
\noalign{\kern2pt\vrule}
}
\endgroup
```

[在 Overleaf 中開啟此範例](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+of+the+noalign+command\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D10cm%2Ctextwidth%3D6cm%5D%7Bgeometry%7D%0A%5Cusepackage%7Bverbatim%7D+%0A%5Cusepackage%7Bparskip%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%5Csetlength%7B%5Ctabskip%7D%7B5pt%7D%0A%0AUsing+%5Cverb%7C%5Cnoalign%7C+to+place+horizontal+rules+between+rows+of+an+%5Cverb%7C%5Chalign%7C+table%3A%0A%5Cvspace%7B6pt%7D%0A%0A%5Chalign%7B%25%0A%23%26%23%26%23%26%23%26%23%5Ccr%0A%5Cnoalign%7B%5Chrule%5Ckern2pt%7D%0A1%262%263%264%265%5Ccr%0A%5Cnoalign%7B%5Ckern2pt%5Chrule%5Ckern2pt%7D%0A6%267%268%269%2610%5Ccr%0A%5Cnoalign%7B%5Ckern2pt%5Chrule%7D%0A%7D%0A%0AUsing+%5Cverb%7C%5Cnoalign%7C+to+place+vertical+rules+between+columns+of+a+%5Cverb%7C%5Cvalign%7C+table%3A%0A%5Cvspace%7B6pt%7D%0A%0A%5Cbegingroup+%25+keep+changes+to+%5Cparindent+and+%5Chsize+local%0A%5Cparindent%3D0pt%0A%5Chsize%3D50pt%0A%5Cvalign%7B%25%0A%23%26%23%26%23%26%23%26%23%5Ccr%0A%5Cnoalign%7B%5Cvrule%5Ckern2pt%7D%0A1%262%263%264%265%5Ccr%0A%5Cnoalign%7B%5Ckern2pt%5Cvrule%5Ckern2pt%7D%0A6%267%268%269%2610%5Ccr%0A%5Cnoalign%7B%5Ckern2pt%5Cvrule%7D%0A%7D%0A%5Cendgroup%0A%5Cend%7Bdocument%7D)

此範例會產生以下輸出：

![](/files/c8bafea80fe2a7d6b839c3a87e5783632fd9e09a)

## 重新探討 \tabskip

我們將更仔細地檢視 `\tabskip` 指令，承接前面對其的 [介紹](#tabskip).

該 `\tabskip` 指令會設定一種特殊的「間距」（glue）值，用於 *僅* 在表格排版中：其用途是提供表格列或欄之間的間距：

* 用於 `\halign` 表格： `\tabskip` 在表格前後（也就是左側與右側）以及表格欄之間插入膠料
* 用於 `\valign` 表格： `\tabskip` 在表格前後（也就是上方與下方）以及表格列之間插入膠料

的值 `\tabskip` 可以使用 LaTeX 的 `\setlength` 命令的更多內容：

`\setlength{\tabskip}{`$$\langle$$⁠`膠料值`⁠$$\rangle$$`}`

其中 $$\langle$$⁠`膠料值`⁠$$\rangle$$ 可以是：

* 固定長度，例如 `5pt`, `3mm`，或
* 有限可彈性調整的膠料，例如 `3pt plus 2pt minus 1pt`，或
* 無限可彈性調整的膠料，例如 `0pt plus1fill`.

你也可以直接設定 `\tabskip` （略過 `\setlength`）而寫成

`\tabskip`=$$\langle$$⁠`膠料值`⁠$$\rangle$$

然而，對 `\tabskip` 膠料值的任何變更，只有在以下情況下才會影響表格間距：

* 是在 *之前* 加上 `\halign` 或 `\valign` 指令被處理時所做，或
* 在表格內所做 $$\langle$$⁠`前言區`⁠$$\rangle$$

嘗試設定 `\tabskip` 值於表格內容內（表格中的儲存格 $$\langle$$⁠`本體`⁠$$\rangle$$) *不會* 不會改變 `\halign` 表格欄或 `\valign` 表格列的間距。這種  `\tabskip` 行為的原因可追溯到 $$\langle$$⁠`前言區`⁠$$\rangle$$ 在表格排版過程中所扮演的角色——我們稍後會更詳細地探討這些過程。

### 眼見為憑

為了協助視覺化表格排版中使用的各種間距／膠料，尤其是

* `\tabskip` glue
* `\baselineskip` glue
* 手動字距微調（`\kern`)

Overleaf 準備了一個以 LuaTeX 為基礎的專案，用來為表格的各個組成部分著色。選擇 LuaTeX 是因為它能對排版後表格的內部資料／結構進行低階重新處理，但這裡我們不會深入探討那些細節。

以下是一些範例，展示 `\tabskip`的各種應用。每個範例我們都會展示實際輸出，以及由 LuaTeX 產生的著色版本。

### \tabskip 範例 1

讓我們來檢視 `\tabskip` 在一個 `\halign` 以及 `\valign` 表格。我們會展示實際排版出的表格，並加上邊框來視覺化其大小與間距，同時附上註解圖，其中包含著色版本，可清楚顯示每個表格中各種膠料／間距的大小。

首先， `\halign`:

```latex
% 為了視覺化表格的範圍，我們會在其周圍加上邊框
\setlength{\fboxsep}{0pt} % 使用緊密貼合的邊框

% 這裡我們「直接」設定 \tabskip
\tabskip5pt % 在表格外設定初始 \tabskip 值

% 要在表格周圍加上邊框，必須先將它存入 TeX 方盒。
% \halign 必須放在 \vbox 中，因為 \halign 必須
% 以「垂直模式」處理：\hbox 無法運作，因為
% 它會以「水平模式」處理

\fbox{\vbox{\halign{
\tabskip10pt#&
\tabskip15pt#&
\tabskip20pt#\cr
A&B&C\cr
D&E&F\cr
G&H&I\cr
}}}
```

[在 Overleaf 中開啟此範例](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Tabskip+glue+in+an+halign\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D10cm%2Ctextwidth%3D6cm%5D%7Bgeometry%7D%0A%5Cusepackage%7Bverbatim%7D+%0A%5Cusepackage%7Bparskip%7D+%25+sets+%5Cparindent+to+0pt%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%25+To+visualize+the+table%27s+extent+we%27ll+put+a+border+around+it+%0A%5Csetlength%7B%5Cfboxsep%7D%7B0pt%7D+%25+Use+close-fitting+borders%0A%0A%25+Here+we+set+%5Ctabskip+%22directly%22%0A%5Ctabskip5pt+%25+Set+the+initial+%5Ctabskip+value+outside+the+table%0A%0A%25+To+put+a+border+around+the+table+it+has+to+be+saved+to+a+TeX+box.%0A%25+An+%5Chalign+has+to+be+placed+in+a+%5Cvbox+because+%5Chalign+must+be+%0A%25+processed+in+a+%22vertical+mode%22%3A+an+%5Chbox+will+not+work+because%0A%25+that+is+processed+in+a+%22horizontal+mode%22%0A%0A%5Cfbox%7B%5Cvbox%7B%5Chalign%7B%0A%5Ctabskip10pt%23%26%0A%5Ctabskip15pt%23%26%0A%5Ctabskip20pt%23%5Ccr%0AA%26B%26C%5Ccr%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%7D%0A%5Cend%7Bdocument%7D)

此範例會產生以下輸出：

![](/files/dad295c8e2647f3c6b4a3ae4a7f51d100d776865)

下一張圖是前一個範例產生的表格之較大、著色且註解過的版本：

![](/files/516af9049fffb2fe20664130187c273df6c74d00)

共有 4 個 `\tabskip` 指令的實例，每一個都對應到表格中的特定間距位置：

1. `\tabskip5pt` 用於表格外，並 `\tabskip` 值，套用在每一列的第一個儲存格之前（左側）。
2. `\tabskip10pt` 設定在 $$\langle$$⁠`前言區`⁠$$\rangle$$ 的第一個儲存格範本中，影響 $$\langle$$⁠儲存格$${}\_1$$⁠$$\rangle$$ 以及 $$\langle$$⁠儲存格$${}\_2$$⁠$$\rangle$$ 每一列之間的間距。
3. `\tabskip15pt` 設定在 $$\langle$$⁠`前言區`⁠$$\rangle$$ 的第一個儲存格範本中，影響 $$\langle$$⁠儲存格$${}\_2$$⁠$$\rangle$$ 以及 $$\langle$$⁠儲存格$${}\_3$$⁠$$\rangle$$ 每一列之間的間距。
4. `\tabskip20pt` 設定在 $$\langle$$⁠`前言區`⁠$$\rangle$$ ，其會影響在……之後加入的間距 $$\langle$$⁠儲存格$${}\_3$$⁠$$\rangle$$，也就是每一列的最後一個儲存格。

接著， `\valign`

```latex
\setlength{\fboxsep}{0pt} % 使用緊密貼合的邊框
\tabskip5pt % 在表格外設定初始 \tabskip 值

% 將 \hsize 的變更維持在局部（在群組內）
\begingroup
% \hsize 決定 \valign 的欄寬
\setlength{\hsize}{50pt}
% 因為 \valign 可以放在 \vbox 或 \hbox 中，所以我們可以使用
% 直接使用 \fbox
\fbox{\valign{
\tabskip10pt#&
\tabskip15pt#&
\tabskip20pt#\cr
A&B&C\cr
E&E&F\cr
G&H&I\cr
}}
\endgroup
```

[在 Overleaf 中開啟此範例](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+halign\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D10cm%2Ctextwidth%3D6cm%5D%7Bgeometry%7D%0A%5Cusepackage%7Bverbatim%7D+%0A%5Cusepackage%7Bparskip%7D+%25+sets+%5Cparindent+to+0pt%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%5Csetlength%7B%5Cfboxsep%7D%7B0pt%7D+%25+Use+close-fitting+borders%0A%5Ctabskip5pt+%25+Set+the+initial+%5Ctabskip+value+outside+the+table%0A%0A%25+Keep+changes+to+%5Chsize+local+%28in+a+group%29%0A%5Cbegingroup%0A%25+%5Chsize+determines+the+%5Cvalign+column+widths%0A%5Csetlength%7B%5Chsize%7D%7B50pt%7D+%0A%25+Because+%5Cvalign+can+be+placed+in+a+%5Cvbox+or+%5Chbox+we+can+use+%0A%25+%5Cfbox+directly%0A%5Cfbox%7B%5Cvalign%7B%0A%5Ctabskip10pt%23%26%0A%5Ctabskip15pt%23%26%0A%5Ctabskip20pt%23%5Ccr%0AA%26B%26C%5Ccr%0AE%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%7D%7D%0A%5Cendgroup%0A%5Cend%7Bdocument%7D)

此範例會產生以下輸出：

![](/files/5b65f5e9dd6992d099f59667c3a5cc3a22b3c4e1)

同樣地，下一張圖是前一個範例產生的表格之較大、著色且註解過的版本：

![](/files/7d20479108f7bf5830587dd46d39679c9855e1ec)

如同 `\halign` 範例一樣，這裡有 4 個 `\tabskip` 指令的實例。然而，在 `\valign` 表格中 `\tabskip` 會插入在表格列之間：

1. `\tabskip5pt` 用於表格外，並 `\tabskip` 值，套用在每一欄第一個儲存格之前（上方）。
2. `\tabskip10pt` 設定在 $$\langle$$⁠`前言區`⁠$$\rangle$$ 的第一個儲存格範本中，影響 $$\langle$$⁠儲存格$${}\_1$$⁠$$\rangle$$ 以及 $$\langle$$⁠儲存格$${}\_2$$⁠$$\rangle$$ 每一欄的
3. `\tabskip15pt` 設定在 $$\langle$$⁠`前言區`⁠$$\rangle$$ 的第一個儲存格範本中，影響 $$\langle$$⁠儲存格$${}\_2$$⁠$$\rangle$$ 以及 $$\langle$$⁠儲存格$${}\_3$$⁠$$\rangle$$ 每一欄的
4. `\tabskip20pt` 設定在 $$\langle$$⁠`前言區`⁠$$\rangle$$ ，其會影響在……之後加入的間距 $$\langle$$⁠儲存格$${}\_3$$⁠$$\rangle$$，也就是每一欄的最後一個儲存格。

**摘要／結論**

* 在一個 `\halign` 表格中 `\tabskip` 膠料會放在每一列中各儲存格的左側與右側，因此將表格欄分隔開來。
* 在 `\valign` 表格中 `\tabskip` 膠料會放在每一欄中各儲存格的上方與下方，因此將表格列分隔開來。

### \tabskip 與 \noalign

#### 使用 \halign

以下 `\halign` 範例使用 `\tabskip` 膠料，並且也示範了 `\noalign` 指令，並用它在一個的列上方與下方放置有間距的線條 `\halign` 表格。那些線條是使用 `\hrule` （原始）指令排版的，並搭配由 `\kern`:

```latex
\setlength{\tabskip}{5pt} % 在表格外設定 \tabskip

\halign{
#&#&#&#&#\cr % <前導設定>
\noalign{\hrule\kern2pt} % 第 1 列前的有間距線條
1&2&3&4&5\cr % 第 1 列
\noalign{\kern2pt\hrule\kern2pt} % 第 1/2 列之間的有間距線條
6&7&8&9&10\cr % 第 2 列
\noalign{\kern2pt\hrule\kern2pt} % 第 2/3 列之間的有間距線條
11&12&13&14&15\cr % 第 3 列
16&17&18&19&20\cr % 第 4 列---第 3/4 列之間沒有線條
\noalign{\kern2pt\hrule} % 表格結尾的間距線條
}
```

[在 Overleaf 中開啟此範例](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+halign\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D10cm%2Ctextwidth%3D6cm%5D%7Bgeometry%7D%0A%5Cusepackage%7Bverbatim%7D+%0A%5Cusepackage%7Bparskip%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%5Csetlength%7B%5Ctabskip%7D%7B5pt%7D+%25+Set+%5Ctabskip+outside+of+the+table%0A%0A%5Chalign%7B%0A%23%26%23%26%23%26%23%26%23%5Ccr+%25+The+%3Cpreamble%3E%0A%5Cnoalign%7B%5Chrule%5Ckern2pt%7D+%25+Spaced+rule+before+row+1%0A1%262%263%264%265%5Ccr+%25+Row+1%0A%5Cnoalign%7B%5Ckern2pt%5Chrule%5Ckern2pt%7D+%25+Spaced+rule+between+rows+1%2F2+%0A6%267%268%269%2610%5Ccr+%25+Row+2%0A%5Cnoalign%7B%5Ckern2pt%5Chrule%5Ckern2pt%7D+%25+Spaced+rule+between+rows+2%2F3+%0A11%2612%2613%2614%2615%5Ccr+%25+Row+3%0A16%2617%2618%2619%2620%5Ccr+%25+Row+4---no+rules+between+rows+3%2F4%0A%5Cnoalign%7B%5Ckern2pt%5Chrule%7D+%25+Space+rule+at+table+end%0A%7D%0A%5Cend%7Bdocument%7D)

此範例會產生下方所示的表格，並進一步加上註解以重現（La）TeX 程式碼以及數字（1）到（4），用來編號 `\noalign` 那些包含線條與 kern 的指令，以及它們對應的排版輸出：

![](/files/bc5efcd79fedebbf6d4182cd131b8a2f3ba2d89e)

下圖顯示表格的著色版本，並標示出表格中的各種間距／膠料：

![](/files/0356e68871e0f8a7f082161866c64b3ff6e540ba)

請注意以下事項：

* 使用 `\noalign` 來在某些列之間插入線條，以及手動使用 `\kern` 值來在這些線條前後加入一些空間。TeX 引擎不會插入 `\baselineskip` 排版線條之後的膠料，因此空間是透過手動使用 `\kern` （也可以使用其他間距指令）；
* `\baselineskip` 膠料會自動插入在第 3 與第 4 列之間。

#### 使用 \valign

以下 `\valign` 範例使用與前一個相同的資料 `\halign`:

```latex
\begingroup
\setlength{\parindent}{10pt}
\setlength{\hsize}{50pt}
\setlength{\tabskip}{5pt}
\valign{
#&#&#&#&#\cr
\noalign{\vrule\kern2pt}
1&2&3&4&5\cr
\noalign{\kern2pt\vrule\kern2pt}
6&7&8&9&10\cr
\noalign{\kern2pt\vrule\kern2pt}
11&12&13&14&15\cr
16&17&18&19&20\cr
\noalign{\kern2pt\vrule}
}
\endgroup
```

[在 Overleaf 中開啟此範例](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+halign\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D10cm%5D%7Bgeometry%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bempty%7D%0A%5Cbegingroup%0A%5Csetlength%7B%5Cparindent%7D%7B10pt%7D%0A%5Csetlength%7B%5Chsize%7D%7B50pt%7D%0A%5Csetlength%7B%5Ctabskip%7D%7B5pt%7D%0A%5Cvalign%7B%0A%23%26%23%26%23%26%23%26%23%5Ccr%0A%5Cnoalign%7B%5Cvrule%5Ckern2pt%7D%0A1%262%263%264%265%5Ccr%0A%5Cnoalign%7B%5Ckern2pt%5Cvrule%5Ckern2pt%7D%0A6%267%268%269%2610%5Ccr%0A%5Cnoalign%7B%5Ckern2pt%5Cvrule%5Ckern2pt%7D%0A11%2612%2613%2614%2615%5Ccr%0A16%2617%2618%2619%2620%5Ccr%0A%5Cnoalign%7B%5Ckern2pt%5Cvrule%7D%0A%7D%0A%5Cendgroup%0A%5Cend%7Bdocument%7D)

此範例會產生下方所示的表格，並進一步加上註解以重現（La）TeX 程式碼以及數字（1）到（4），用來編號 `\noalign` 那些包含線條與 kern 的指令，以及它們對應的排版輸出：

![](/files/412a8f39937a0b208f4b71d92e71766b8cf6e9d6)

![](/files/62fc88bb18cc8fb09138697b0736383c9007250e)

### 一個包含文字行的 \valign 表格

下一個範例

```latex
\setlength{\tabskip}{5pt}
\begingroup % 將 \parindent 和 \hsize 的變更維持在局部
\setlength{\parindent}{10pt}
\setlength{\hsize}{75pt}
\valign{
#&#&#\cr
\noalign{\vrule\kern5pt}
\TeX{} 可以排版非常複雜的
表格。&這裡再補上一點額外的
文字。&最後，再加上一行額外的
在這一欄中。\cr
\noalign{\kern5pt\vrule\kern5pt}
A&B&C\cr
\noalign{\kern5pt\vrule\kern5pt}
D&E&F\cr
G&H&I\cr
\noalign{\kern5pt\vrule}
}
\endgroup
```

[在 Overleaf 中開啟此範例](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Example+valign+command\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D16cm%2Ctextwidth%3D12cm%5D%7Bgeometry%7D%0A%5Cbegin%7Bdocument%7D%0A%5Csetlength%7B%5Ctabskip%7D%7B5pt%7D%0A%5Cbegingroup+%25+Keep+changes+to+%5Cparindent+and+%5Chsize+local%0A%5Csetlength%7B%5Cparindent%7D%7B10pt%7D%0A%5Csetlength%7B%5Chsize%7D%7B75pt%7D%0A%5Cvalign%7B%0A%23%26%23%26%23%5Ccr%0A%5Cnoalign%7B%5Cvrule%5Ckern5pt%7D%0A%5CTeX%7B%7D+can+typeset+very+complex%0Atables.%26Here%27s+a+bit+of+extra+%0Atext.%26And%2C+finally%2C+an+extra+line%0Ain+this+column.%5Ccr%0A%5Cnoalign%7B%5Ckern5pt%5Cvrule%5Ckern5pt%7D%0AA%26B%26C%5Ccr%0A%5Cnoalign%7B%5Ckern5pt%5Cvrule%5Ckern5pt%7D%0AD%26E%26F%5Ccr%0AG%26H%26I%5Ccr%0A%5Cnoalign%7B%5Ckern5pt%5Cvrule%7D%0A%7D%0A%5Cendgroup%0A%5Cend%7Bdocument%7D)

此範例會產生以下輸出：

## 設定列寬與欄高

## 更多關於表格 $$\langle$$⁠前導碼⁠$$\rangle$$


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://overleaf-pro.ayaka.space/latex/zh-tw/shen-ru-wen-zhang/15-how-do-tex-engines-typeset-tables-2.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
