為什麼表格是 Markdown 最難搞的部分

重點摘要
  • 表格需要三個部分:標題列、由破折號組成的分隔列,以及資料列。
  • 分隔列裡的冒號決定整欄的對齊方式,無法只對齊單一儲存格。
  • 儲存格只吃行內語法。不能換行、不能放清單、不能放程式碼區塊。
  • 儲存格裡若有真正的管線符號,必須寫成 \| 跳脫,否則會把格子切成兩半。

表格是後來才加上去的

大部分 Markdown 語法都很寬容,少個空格,渲染器常常會自己補救。表格不一樣。它根本不在 2004 年的原始規格裡,而後來由 GitHub 風格 Markdown(GFM)標準化的管線符號語法,對結構相當講究。少了一行分隔列,精心排好的資料就會塌成一段亂碼,而且完全不會有錯誤訊息告訴你原因。

表格也是「原始碼長相」和「輸出結果」落差最大的元素。**粗體** 就算沒渲染,看起來也有幾分粗體的樣子。表格原始碼卻是一叢管線符號和破折號,渲染之後才會變成格子。

即時預覽的價值就在這裡。把草稿貼進編輯器,你每打一行,就能看到格子成形,或是根本成不了形。

這份資料真的適合做成表格嗎?

動手之前值得先問一句。表格對真正的表格型資料非常好用,對其他東西則相當糟糕:

  • 適合 - 功能比較、選項與說明的配對、價格方案、API 參數。
  • 不適合 - 儲存格要放長篇文字(改用標題加段落)、資料有層級關係(改用巢狀清單)、需要合併儲存格。
  • 硬性限制 - Markdown 沒有 rowspan 也沒有 colspan,超過五、六欄在手機上就沒法看。

但只要資料合適,沒有什麼比表格說得更清楚。而且把語法真正學會只要五分鐘。我們開始吧。

插圖:寫作者把一行行管線符號與破折號排列成整齊的表格網格

基本表格語法

一個 Markdown 表格只需要三樣東西:標題列、由破折號組成的分隔列,以及一列以上的資料列。欄與欄之間用管線符號(|)隔開:

| 姓名   | 職務   | 城市 |
| ------ | ------ | ---- |
| 雅婷   | 設計師 | 台北 |
| 承翰   | 工程師 | 台南 |
| 千尋   | 文案   | 台中 |

渲染結果如下:

姓名職務城市
雅婷設計師台北
承翰工程師台南
千尋文案台中

分隔列才是關鍵

分隔列就是緊貼在標題列下方的那行破折號。它負責告訴解析器「這是表格」。它不是裝飾,沒有它就沒有表格。

每一欄至少要三個破折號(---),雖然多數渲染器少幾個也認得。破折號的數量不影響欄寬,欄寬是由內容決定的。

管線符號不必上下對齊

原始碼裡的儲存格寬度完全自由。下面這段渲染出來和上表一模一樣:

| 姓名 | 職務 | 城市 |
| --- | --- | --- |
| 雅婷 | 設計師 | 台北 |

把原始碼排整齊,純粹是為了方便「人」閱讀原始檔。在同事會一起維護的檔案裡值得花這個心思,在隨手回覆的留言裡就不必了。喜歡整齊但不想手動補空格的話,表格產生器會幫你把管線排好。

用冒號設定欄位對齊

欄位預設靠左對齊。在分隔列加上冒號,就能逐欄改變對齊方式:

  • :--- - 靠左對齊(明確標示,效果同預設)
  • :---: - 置中對齊
  • ---: - 靠右對齊
| 品項     | 數量 | 單價 |
| :------- | :--: | ---: |
| 筆記本   |  3   | $135 |
| 鋼筆     |  1   | $840 |
| 墨水匣   |  12  | $25  |

渲染結果:

品項數量單價
筆記本3$135
鋼筆1$840
墨水匣12$25

哪一欄該用哪種對齊

對齊設定作用於整欄,包含標題儲存格,沒辦法只對齊某一格。慣例其實很單純,但對表格的專業感影響很大:

  • 靠右 - 數字、金額、日期。位數會對齊,眼睛順著一欄往下比較很輕鬆。
  • 置中 - 簡短的狀態值:有、無、Beta、打勾符號。
  • 靠左 - 其餘一律靠左,尤其是名稱和說明。

要從零開始做一張表?Markdown 表格產生器每一欄都有對齊選項,用下拉選單設定就好,不必自己數冒號。

儲存格裡可以用哪些格式

儲存格接受行內 Markdown - 凡是能放在同一行文字裡的語法都可以:

| 功能       | 狀態          | 文件                         |
| ---------- | ------------- | ---------------------------- |
| **匯出**   | 已完成        | [指南](https://example.com)  |
| *同步*     | ~~已取消~~    | `sync --help`                |

粗體、斜體、刪除線、行內程式碼、連結,在儲存格裡都能正常渲染。

儲存格裡放不下的東西

凡是 Markdown 視為區塊級的元素都不行:

  • 換行 - 不能在儲存格裡按 Enter,因為換行代表下一列開始。解法是 HTML 標籤 <br>:寫 第一行<br>第二行 就會顯示成兩行。GitHub 和多數渲染器都支援,但並非所有工具都吃這招。
  • 清單 - 在儲存格裡寫 - 項目,只會原封不動顯示出破折號。真的需要的話,可以用 <br> 硬湊(• 一<br>• 二)。
  • 標題、引言、程式碼區塊 - 都是區塊級元素,一律不行。儲存格裡出現多行程式碼,就強烈暗示它該搬到表格外,用獨立的圍欄式程式碼區塊呈現。

一行原則

判斷原則很簡單。能自然放進一行的內容,儲存格就放得下;需要垂直空間的內容,就不屬於 Markdown 表格。本身有結構的內容,通常更適合寫成巢狀清單或獨立的一節。

跳脫管線符號、寬表格策略與原始碼可讀性

跳脫真正的管線符號

管線符號是欄位的分界,所以儲存格內容若含有真正的 |,就會把格子硬生生切成兩半。寫 shell 指令、正規表達式或型別聯集的文件時特別容易中招。

解法是用反斜線跳脫。寫 \|,渲染出來就是一個普通的管線符號,記錄 grep \| sort 的儲存格也就保得住欄位結構。在 GitHub 上,行內程式碼裡的反斜線跳脫同樣有效。如果某個渲染器不認帳,HTML 實體 &#124; 是四海皆通的保險做法。

小提醒:反引號保護不了管線符號。表格解析器會先切欄位、再處理行內程式碼,所以 `a | b` 一樣會把欄位切壞。程式碼區段裡的管線也要跳脫。

馴服過寬的表格

寬表格是另一個反覆出現的頭痛來源。八個欄位、格格都是長句的表格,編輯原始碼折磨,在手機上更慘:不是滿出畫面,就是縮到看不清。硬撐之前,先試著換個形狀:

  • 拆開 - 一張寬表拆成兩張窄表。
  • 抽出一欄 - 把最囉嗦的那一欄改寫成表格下方的段落。
  • 轉置 - 讓一堆欄變成一堆列。在 Markdown 裡,列很便宜,欄很昂貴。

粗略的判斷標準:超過五個欄位,或任何儲存格超過十來個字,資料就是在告訴你它想換一種形狀。

讓工具去打管線

只要表格夠大、夠麻煩,就別再手打管線符號。我們的表格產生器提供類似試算表的網格介面,直接輸出乾淨的 Markdown。

資料已經在別的地方了嗎?從 Excel、Google 試算表或網頁上複製,貼進表格轉 Markdown 工具,出來就是排好的管線。先寫內容,再生語法。

原始碼漂不漂亮是選擇題

管線歪七扭八的表格,渲染結果和手工精心對齊的一模一樣。檔案放在儲存庫裡、同事會直接讀原始 diff 時,值得把原始碼排整齊;一次性的留言就免了。

如果你就是喜歡整齊的原始碼,交給格式化工具或產生器去補空格。每改一個字就手動重排一次,正是人們學會痛恨表格的原因。

插圖:一張超大的試算表被摺疊收納成精簡整齊的 Markdown 表格

常見表格錯誤與修法

表格死活不渲染的時候,幾乎都是下面這五種情況之一。

五個常見兇手

  1. 分隔列缺失或格式錯誤。頭號元凶。標題下方那行破折號不見了、被自動修正偷換成別的字元(例如混進一個 連接號),或和標題列之間隔了一行空行,整個區塊就會變成純文字。
  2. 分隔列的欄數不對。分隔列的欄數至少要和標題列一樣多。標題三欄、分隔列只有兩欄,嚴格的解析器會直接拒絕組表,GitHub 就是其中之一。數一下你的管線符號。
  3. 資料列的管線數量不一。儲存格太少的資料列會被補上空格子,多出來的儲存格則被默默丟掉。表格照樣渲染,但資料會跑錯欄。如果某個值看起來「往左移了一格」,回頭找找那一列前面是不是有個沒跳脫的 |
  4. 表格前面沒有空行。表格緊貼在段落後面、中間沒空行時,可能整個被吸進那個段落。上下各留一行空行給它。
  5. 頭尾管線的疑惑。每一列開頭和結尾的管線符號在 GFM 裡是可省略的姓名 | 職務| 姓名 | 職務 | 效果相同。但保留它們仍是比較好的習慣:列的邊界一目了然、複製到較嚴格的工具時不易出錯,還有少數舊渲染器根本強制要求。無論選哪種,同一張表格內請保持一致。

注意:文書軟體和聊天軟體很愛把三個破折號「自動修正」成一條長橫線。如果表格是在別處寫好再貼過來的,先把分隔列重打一次,再去查其他問題。

壞掉的版本,修好的版本

把頭號兇手寫兩次給你看。前面那段會渲染成一行文字,後面那段才會變成格子:

壞掉:

| 姓名   | 職務   |
| 雅婷   | 設計師 |

修好:

| 姓名   | 職務   |
| ------ | ------ |
| 雅婷   | 設計師 |

從這一組對照可以看出三件事:

  • 問題出在哪 - 沒有分隔列,解析器根本沒看到表格。
  • 改了什麼 - 加上一行破折號與管線,緊貼在標題列正下方,中間不留空行。
  • 怎麼認出來 - 輸出裡還看得到管線符號。看得到管線,就代表表格從頭到尾沒被組起來。

一分鐘除錯任何表格

把表格貼進即時預覽編輯器,一列一列刪到它能渲染為止,再逐列加回去。加到哪一列壞掉,問題就在那一列,而且通常是一根管線符號。

如果表格在這裡渲染得出來、發佈到別處卻不行,那問題在平台,不在語法。哪些工具支援表格,語法速查表的相容性整理寫得很清楚。

相容性資料驗證日期

常見問題

Markdown 表格可以合併儲存格嗎?

不行 - Markdown 表格沒有 rowspan 或 colspan。如果資料真的需要合併儲存格,要嘛重構成多張簡單的表格,要嘛直接寫原生 HTML 的 <table>,多數 Markdown 渲染器(包括 GitHub)都會照常顯示。

怎麼在儲存格裡換行?

在想換行的位置放 HTML 標籤 <br>第一行<br>第二行。按 Enter 沒有用,因為換行符號會結束整個表格列。注意少數嚴格的渲染器會過濾 HTML,那種情況下儲存格內就真的無法換行。

原始碼裡的管線符號需要上下對齊嗎?

不需要。原始碼對不對齊純屬外觀問題 - | a | b | 和精心補滿空格的版本渲染結果完全相同。只有在別人會閱讀原始檔時才值得對齊,而且最好交給格式化工具或產生器代勞。

為什麼我的表格渲染成純文字?

依序檢查三件事:破折號分隔列有沒有緊貼在標題列正下方(中間不能有空行)、分隔列的欄數是否不少於標題列、表格和上方段落之間有沒有空行。兇手幾乎一定是其中之一。

Markdown 表格在所有平台都能用嗎?

表格屬於延伸語法,所以不是。GitHub、GitLab、Reddit、Obsidian 和多數現代工具都支援;Discord 和一些極簡渲染器則不支援。各平台的詳細差異請見語法速查表的相容性整理。

延伸閱讀

立即使用編輯器

立即使用編輯器