大於符號:引言的唯一標記

引言區塊就是開頭放一個大於符號的行。規則只有這一條:

> Markdown 的目標,是在可行範圍內
> 讓文件盡量好讀、也盡量好寫。
重點摘要
  • 行首一個 > 就是引言,符號後面的空格可加可不加。
  • 單獨一行 > 能讓引言連貫;真正的空行則會把它切成兩段。
  • 每多一個 > 就多一層巢狀,實務上兩層是極限。
  • GitHub 提示框與 Obsidian 標註框,本質是第一行放了 [!NOTE] 這類關鍵字的普通引言。

解析器會輸出 HTML 的 <blockquote>,多數樣式表把它畫成縮排文字加上左側色條。

Markdown 本身不負責外觀,樣式全部來自周圍的 CSS。所以同一段引言在 GitHub 上是灰色面板,在部落格上可能是襯線體抽言,在郵件軟體裡只是單純縮排。解析器實際交出什麼,Markdown 與 HTML 的比較有完整說明。

符號後面的空格是必要的嗎?

不是。在 CommonMark 與 GitHub 上,>引言> 引言 解析結果相同。但還是請加上空格:原始碼比較好讀,少數較舊的解析器也確實要求它。

空格多到什麼程度會出事

  • 符號後面一個空格是標準寫法,到哪都安全。
  • 符號後面多出四個以上空格,會變成引言內部的縮排式程式碼區塊。
  • 符號前面最多三個空格會被忽略,不影響結果。
  • 符號前面第四個空格會讓整行變成程式碼區塊,所以引言請貼齊左邊界。
插圖:一段普通文字前面加上大於符號後,變成左側帶有色彩直條的縮排引言

多行引言與換行延續

多行引言的每一行都應該自己帶標記:

> 在網路上得到正確答案最快的方法,
> 不是發問,而是先貼一個錯誤答案。

換行延續(lazy continuation)

Markdown 其實允許你偷懶。當引言中的段落延續到下一行時,就算那一行完全沒有標記,也會被算進同一段引言:

> 在網路上得到正確答案最快的方法,
不是發問,而是先貼一個錯誤答案。

兩種寫法渲染結果一模一樣。這就是換行延續。它會存在,是因為 Markdown 當初設計給在純文字編輯器裡手動折行的人使用。它只適用於「已經在引言內」那個段落的續行。

為什麼還是該乖乖寫滿標記

只要那一行本身有能力開啟一個新區塊,換行延續就立刻失效。項目符號、標題、程式碼圍欄或表格列都會直接跳出引言,而且毫無警告:

> Pull request 請盡量小。
- 小的變更審查得比較快。

第一行是引言,第二行則是落在引言外面的普通清單,原始碼完全看不出異狀。更麻煩的是,只要編輯器重新折行,斷點一移動,結果也跟著變。

小提醒:每一行都寫上 >,這一整類問題就不存在。這和清單參考裡「縮排寧可寫滿」的習慣是同一件事:寫明確,解析器就沒有猜測空間。

空行會把一段引言切成兩段

空行會終止引言區塊。看起來像「一段引言、兩個段落」的寫法,實際上是兩段各自獨立的引言:

> 引文的第一段。

> 引文的第二段。

你會得到兩個相鄰的 <blockquote>,中間有明顯空隙;在 GitHub 上就是兩塊分開的灰色面板。

單獨一個標記就能讓引言連貫

把那行空行也一起引用起來,寫成後面什麼都不接的單獨 >

> 引文的第一段。
>
> 同一段引文的第二段。

就是這一個字元,決定你得到的是一段引言還是兩段,也回答了大部分「引言中間為什麼有空隙」的疑問。

同一個標記也用來區隔其他區塊

在引言內部,單獨的 > 扮演的是一般 Markdown 中空行的角色。以下情況都要用它:

  • 同一段引文的兩個段落之間
  • 標題與它底下的段落之間
  • 段落與接在後面的清單之間
  • 段落與程式碼圍欄的開頭之間

巢狀引言與郵件式回覆

每多一層就多一個標記。兩個標記就是引言裡的引言:

> > 這個端點是不是該改成非同步?
>
> 該改,而且還要加上逾時設定。

標記之間的空格可有可無,因此 >>> > 意思相同。每一層都會再包一層 <blockquote>,而多數佈景主題每層都會縮排。三、四層之後文字只剩窄窄一條,兩層就是實務極限。

郵件式回覆

巢狀引言最有價值的場合就是討論串。郵件論壇與純文字電子郵件用 > 標示引用內容,遠早於 Markdown 出現,Markdown 也原封不動繼承了這個慣例。最舊的訊息縮在最裡層:

> > > 我們禮拜五能上線嗎?
> >
> > 要看資料庫遷移有沒有審查完。
>
> 今天早上已經審完了。

那就出貨吧。

巢狀引言最容易塌陷的地方

這種寫法一定要每行補滿標記。跨層級的換行延續正是回覆鏈崩掉的元凶:標記比上一行少的那一行,會被吸進較深的段落,而不是像大家預期的那樣另起一層較淺的引言。

插圖:三條引言色帶層層內縮地疊在一起,像郵件討論串裡的回覆鏈

引言裡可以放哪些元素

引言區塊可以容納任何區塊內容:段落、標題、清單、程式碼圍欄、表格、圖片,甚至其他引言。規則只有兩條。

  1. 那些內容的每一行都要有 > 標記,看起來空空如也的行也一樣。
  2. 區塊之間用單獨的 > 分隔,不能用真正的空行。
> ### 發佈檢查清單
>
> 1. 打上版本標籤
> 2. 發佈更新說明
>
> ```bash
> git tag -s v2.1.0
> ```
>
> 兩道圍欄都要有標記,不是只有中間的程式碼。

引言內的縮排是去掉標記之後才算的,所以巢狀清單的行為跟引言外面完全一樣。空格數見清單參考,圍欄規則見程式碼區塊參考

各種區塊的寫法與注意事項

元素在引言裡的寫法要注意的地方
段落> 一段文字沒有特別限制
第二個段落中間放單獨的 >真正的空行會終止引言
標題> ## 標題在 GitHub 上仍會進入頁面大綱
符號清單> - 項目每一個項目都要有標記
編號清單> 1. 項目續行也一樣要補
巢狀清單> - 子項目縮排從 > 之後開始算
圍欄式程式碼> ``` 單獨一行開頭與結尾圍欄都要有
縮排式程式碼> 加四個空格很容易不小心觸發
表格> | A | B |表頭、分隔列與每一列都要
圖片> ![說明](cat.jpg)寬度受引言限制,不是整頁寬
連結> [文字](/page)沒有特別限制
分隔線> ---緊接在文字下方會變成標題
巢狀引言> > 被引用的回覆標記之間的空格可省略
待辦清單> - [ ] 項目限 GFM,而且一律不可點選

注意:表格放進引言後,寬度是引言的寬度而不是整頁寬,欄位很快就會擠在一起。什麼時候該把表格拉出來獨立成一節,表格參考有說明。

出處與署名怎麼寫

Markdown 沒有署名語法,所以以下每一種寫法都只是社群慣例,不是規範。最常見的做法是在引言最後一行放一個破折號加上名字:

> 簡潔是複雜的極致。
>
> - 達文西

印刷上這個符號通常排成長破折號,但在原始檔裡用普通連字號才安全:跨編輯器複製貼上不會走樣,存成錯誤編碼時也不會變成亂碼。

名字為什麼會變成項目符號

連字號後面接空格就是清單語法,所以上面的範例會把名字渲染成一個項目符號。有些佈景主題看起來像刻意設計,有些則像出了錯。

三種保持純文字的做法

  • 把連字號跳脫掉,破折號留著,項目符號消失。
  • 把名字改成斜體,讀起來像附註而不是清單項目。
  • 改用巢狀引言,把出處和引文本身區隔開來。
> 簡潔是複雜的極致。
>
> \- 達文西
>
> *達文西,傳為其言*

巢狀引言的版本,讀起來像是針對這段引文的附註,而不是引文的一部分:

> 簡潔是複雜的極致。
>
> > 達文西,普遍認為出自其口

允許行內 HTML 的地方可以直接用 <cite> 取得語意;不允許的地方,用粗體與斜體參考裡的斜體寫法就很夠用。

GitHub 提示框與 Obsidian 標註框

GitHub 在 2023 年底推出提示框(alerts),直接建立在引言語法之上。引言的第一行是一個加了驚嘆號的方括號關鍵字,內文接在下一行:

> [!NOTE]
> 讀者不該跳過的重要資訊。

> [!WARNING]
> 忽略之後可能出事的注意事項。

GitHub 檢查的三條規則

  1. 關鍵字必須全大寫[!NOTE] 可以,[!note] 不行。
  2. 它必須自成一行,而且是引言的第一行,內文寫在下一行。
  3. 一段引言只能放一個提示框,也不支援巢狀提示框。

三條都對,GitHub 就會畫出帶色邊框、圖示與粗體標籤;錯一條,你得到的是一段方括號原樣顯示的普通引言。方言的其他部分請見 GFM 參考

在其他渲染器上會怎樣

提示框是優雅降級,不是直接壞掉。沒聽過這套語法的渲染器只會看到一段普通引言,第一行剛好是 [!NOTE] 這串文字,內容照樣可讀。這個划算的取捨,正是它建立在引言語法上的原因。

Obsidian 標註框多做了什麼

Obsidian 標註框沿用同一套基礎語法,另外多了四件事:

  • 關鍵字清單長得多,連 [!BUG][!EXAMPLE] 都有
  • 接受小寫,所以 [!tip] 也能生效
  • 可以在同一行加上自訂標題
  • 用結尾的 +- 控制展開與收合
> [!tip] 比你想的還好用
> 標註框的標題是選填的。

> [!warning]- 預設收合
> 減號會讓這一塊載入時就是收起來的。

所有關鍵字與支援平台

語法渲染結果支援平台
> [!NOTE]藍色提示框,標示為 NoteGitHub、GitLab、Obsidian
> [!TIP]綠色提示框,選擇性建議GitHub、GitLab、Obsidian
> [!IMPORTANT]紫色提示框,務必閱讀GitHub、GitLab、Obsidian
> [!WARNING]琥珀色提示框,有風險的步驟GitHub、GitLab、Obsidian
> [!CAUTION]紅色提示框,可能造成損害GitHub、GitLab、Obsidian
> [!INFO]中性資訊標註框僅 Obsidian
> [!SUCCESS]綠色打勾標註框僅 Obsidian
> [!QUESTION]問號標註框僅 Obsidian
> [!FAILURE]紅色叉號標註框僅 Obsidian
> [!BUG]臭蟲圖示標註框僅 Obsidian
> [!EXAMPLE]清單圖示標註框僅 Obsidian
> [!QUOTE]引號圖示標註框僅 Obsidian
> [!NOTE]- 標題載入時收合的標註框僅 Obsidian
任何無法辨識的關鍵字普通引言,方括號原樣顯示其餘所有渲染器

小提醒:關鍵字要照「對讀者的風險」來挑,不是照你喜歡的顏色挑。[!WARNING] 留給可能弄壞東西的步驟,[!NOTE] 給背景說明,[!TIP] 給可以略過的建議。連續四個提示框,只會訓練讀者四個都跳過。

常見錯誤與修正寫法

幾乎所有壞掉的引言都逃不出這五種錯誤,而且每一種都只要改一行:

  1. 引言前面沒有空行,標記被上一個段落吞掉。
  2. 該放單獨 > 的地方放了空行,一段引言被切成兩段。
  3. 清單或圍欄漏掉標記,後面整個區塊跟著跑出引言。
  4. 提示框關鍵字寫成小寫,或跟內文擠在同一行。
  5. 引言行尾有多餘空白,強制斷行,段落變成參差不齊的短行。

修正兩種空行錯誤

CommonMark 與 GitHub 允許引言直接插斷段落,但 MkDocs 使用的 Python-Markdown 不行,原始的 Markdown.pl 與許多 wiki 也不行,它們只會印出一個字面上的 >。錯誤寫法與正確寫法:

寫作規範是這樣說的:
> 句子請盡量短。
寫作規範是這樣說的:

> 句子請盡量短。

第二種錯誤剛好相反:引言內部放了真正的空行,於是變成兩段中間有空隙的引言。錯誤寫法與正確寫法:

> 第一段。

> 第二段。
> 第一段。
>
> 第二段。

修正漏掉的標記

沒有標記的那一行會跳出引言,後面的內容也一起跑出去。錯誤寫法與正確寫法:

> 檢查清單:
> - 打上版本標籤
- 發佈更新說明
> 檢查清單:
>
> - 打上版本標籤
> - 發佈更新說明

修正渲染成普通引言的提示框

GitHub 只認「自成一行的全大寫關鍵字」。下面兩種寫法都會失敗,而且都會留下裸露的方括號:

> [!note] 記得輪替簽章金鑰
> [!NOTE] 記得輪替簽章金鑰
> [!NOTE]
> 簽章金鑰每 90 天要輪替一次。

其他狀況怎麼除錯

流程和 Markdown 其他元素一樣:把引言貼進編輯器,一行一行刪到它正確渲染為止。最後刪掉的那一行就是元凶,原因幾乎都是漏掉標記或空行放錯位置。

空行在這個格式裡承載了大量意義,原因請見 Markdown 的設計初衷語法速查表把引言寫法濃縮在一頁,完整指南把引言擺回其他元素之間,標題註腳則涵蓋最常和引文搭配的兩種元素。

相容性資料驗證日期

常見問題

Markdown 引言區塊的 > 後面一定要空格嗎?

在 CommonMark 與 GitHub 上不必,>引言> 引言 解析結果相同。但為了可讀性與少數較舊的解析器,還是建議加上。要避免的是符號後面多出四個以上空格,那會被當成引言內部的縮排式程式碼區塊。

一段引言裡要放兩個段落該怎麼寫?

在兩段之間放一行單獨的 >。真正的空行會終止引言,於是你會得到兩段中間有空隙的獨立引言。同一個單獨標記也用來把標題、清單或程式碼圍欄和上一個段落隔開。

巢狀引言(引言裡的引言)怎麼寫?

每一層放一個標記:> > 內層引言,標記之間的空格可省略。請每一行都明確寫滿標記,因為標記數量比上一行少的行,通常會被吸進較深的引言,而不是另起一層較淺的引言。

GitHub 的 [!NOTE] 提示框在其他平台能用嗎?

在 GitHub、GitLab 與 Obsidian 上會渲染成帶色的提示框。其他平台則降級成普通引言,第一行顯示字面上的 [!NOTE],不會壞掉,內容照樣可讀。Obsidian 支援的關鍵字多得多,而且接受小寫。

為什麼我的署名那一行變成項目符號了?

因為連字號加空格就是清單語法。解法有三種:用反斜線跳脫連字號、把名字改成斜體,或把署名放進巢狀引言。三種都能避開清單,原始檔也都還是好讀。

延伸閱讀

立即使用編輯器

立即使用編輯器