Markdown 段落詳解:空行、換行與多平台相容指南
Markdown 段落是什麼?比你想的簡單
Markdown 裡的段落(paragraph)可能是整個語法中最「不像語法」的部分——你不需要任何特殊標記,直接寫文字就行。段落之間的分隔靠的是空行,也就是說,只要兩段文字之間有一個完全空白的行,它們就會被渲染成兩個獨立的段落。
說白了,Markdown 段落就是一行或多行連續的文字,段落之間用一個或多個空行隔開。這一規則從 John Gruber 在 2004 年設計 Markdown 的時候就定下來了,到現在也沒變過。
渲染的時候,每個段落會被包在 <p> 標籤裡。所以你在 Markdown 裡寫:
這是第一段。可以寫很多內容,
甚至跨行也沒關係。
這是第二段。中間有個空行。渲染出來的 HTML 是:
<p>這是第一段。可以寫很多內容,
甚至跨行也沒關係。</p>
<p>這是第二段。中間有個空行。</p>這裡有個初學者經常忽略的重點:段落內連續的幾行文字會被合併成一行。也就是說,你在編輯器裡按的 Enter,在不加任何處理的情況下,渲染出來不會換行——多行會變成一行。
段落建立:空行就是一切
建立段落的方法只有一個:在兩段文字之間留一個空行。
第一個段落的內容。
第二個段落的內容。就這麼簡單。沒有標籤、沒有標記、沒有縮排。空行就是段落分隔符。
有幾個細節值得注意:
- 空行的定義:一個完全空白的行,或者只包含空格和製表符的行,都算空行。所以即使你不小心在空行上多打了一個空格,它依然能正常分隔段落
- 多個空行 = 一個空行:不管你連續留了幾個空行,渲染結果都一樣——就是兩個段落之間有一段間距。Markdown 不會因為你留了三個空行就讓間距變成三倍
- 段落不要縮排:這跟傳統中文寫作習慣不一樣。Markdown 段落開頭不需要縮排,也不應該縮排——前面加空格或 Tab 可能會導致內容被解析成程式碼區塊(4 個空格 = 程式碼區塊),或者產生非預期的縮排效果
說實話,我剛開始用 Markdown 的時候也犯過這個錯——習慣性地在段落開頭加兩個全形空格,結果在 GitHub 上一看,全變成了奇怪的縮排。後來才明白 Markdown 的設計哲學就是靠空行來分段,不靠縮排。
段落內換行:三種方法
段落之間的分隔用空行,但如果我想在同一段落內換行呢?比如寫一首詩,或者排版一個地址。這裡有三種常用方法:
方法一:行尾雙空格(最經典)
在要換行的位置,先打兩個空格,再按 Enter。
第一行··
第二行(上面用 ·· 表示兩個空格,實際寫的時候就是普通空格)
這兩個空格會被渲染成 <br> 標籤,實現段落內換行。這個方法來自 Markdown 的原始設計,所有主流解析器都支援。
但這裡有個坑:行尾空格在很多編輯器裡是看不見的,而且有些編輯器會自動幫你刪掉行尾空格。VS Code 預設就會這樣做。如果你發現行尾雙空格不生效,先檢查一下編輯器設定裡有沒有「去除行尾空格」的選項。
方法二:行尾反斜線(更直觀)
在行尾加一個反斜線 \ 再按 Enter:
第一行\
第二行這個方法的好處是反斜線肉眼可見,不用擔心被編輯器偷偷刪掉。它是 CommonMark 規範支援的標準寫法,GitHub、GitLab、Obsidian 都支援。
不過不是所有解析器都認這個。比如一些舊版的 Markdown 解析器可能不支援行尾反斜線換行。如果你需要相容一些不太常見的平台,先測試一下。
方法三:HTML <br> 標籤(最通用)
直接用 HTML 的換行標籤:
第一行<br>
第二行只要你的 Markdown 解析器允許行內 HTML(絕大多數都允許),這個方法就能用。它的好處是語義明確,不存在相容性問題。缺點是……它不算是 Markdown 語法,而是混入了 HTML。
實際使用中,我個人的習慣是:在 GitHub 和大多數平台上用反斜線(可見、可靠),在需要最大相容性的時候用 <br>。行尾雙空格雖然經典,但因為不可見,實在容易出問題。
不同平台的段落行為差異
這可能是最容易讓人困惑的部分——不同平台對段落和換行的處理方式不完全一樣。我整理了一個對比表:
| 平台 | 段落分隔 | 段落內換行 | 備註 |
|---|---|---|---|
| GitHub(.md 檔案) | 空行 | 行尾空格 / \ / <br> | 標準 GFM 行為 |
| GitHub Issues/PR | 空行 | 直接 Enter 即換行 | 跟 .md 檔案行為不同! |
| Typora | 空行 | 直接 Enter 即換行(所見即所得模式) | 跟標準 Markdown 有差異 |
| Obsidian | 空行 | 行尾空格 / \ / <br> | 嚴格模式需手動換行 |
| VS Code 預覽 | 空行 | 行尾空格 / \ / <br> | 取決於預覽插件 |
| GitLab | 空行 | 行尾空格 / \ / <br> | 標準 GFM 行為 |
重點說一下 GitHub Issues/PR 和 .md 檔案的差別。在 GitHub 的 Issues、Pull Request、Discussion 這些評論區域裡,你直接按 Enter 就能換行——這跟標準的 Markdown 行為不一樣。但在倉庫裡的 .md 檔案中,你必須要用行尾空格或反斜線才能換行。這個差異一開始挺讓人迷惑的。
Typora 的情況也類似。Typora 在所見即所得模式下,Enter 就直接換行了,因為它的編輯器幫你處理了換行邏輯。但當你把同一個檔案放到 GitHub 或其他平台上時,那些單獨的 Enter 可能就不會換行了。
段落和其他元素的互動
Markdown 裡的段落不是孤立存在的,它和很多其他元素有互動關係,了解這些能幫你避免一些莫名其妙的問題。
段落和列表
列表項裡可以包含段落,但需要縮排 4 個空格或 1 個 Tab:
- 第一個列表項
這是列表項內的第二段。注意前面有 4 個空格。
- 第二個列表項如果不縮排,那個「第二段」會被當成普通段落,脫離列表。
段落和引用區塊
引用區塊裡的段落和外面一樣,用空行分隔:
> 引用區塊裡的第一段。
>
> 引用區塊裡的第二段。注意空行上也要加 `>`。注意空行上的 > ——不加的話,引用區塊會被打斷成兩個獨立的引用。
段落和程式碼區塊
如果你在段落文字前面加了 4 個空格或者 1 個 Tab,它就不再是段落了——它會被解析成一個程式碼區塊。這是新手特別容易踩的坑:
這是普通段落。
這變成了程式碼區塊,因為前面有 4 個空格。段落和標題
標題前後建議留空行。雖然有些解析器不要求,但養成這個習慣能避免很多相容性問題:
## 這是一個標題
標題下面的段落內容。常見問題與排查
為什麼我的段落沒有換行?
最常見的兩個原因:
- 沒有留空行——段落之間必須有一個完全空白的行
- 空行上有不可見的字元——可能是空格或 Tab,雖然這些在規範中算空行,但某些解析器可能處理不一致
為什麼多行文字渲染成了一行?
這是標準 Markdown 行為——段落內的連續行會被合併成一行。如果你想在段落內換行,用前面說的三種方法之一。
有一次我在 Obsidian 裡寫一篇筆記,連續寫了好幾行都沒換行,以為是 Obsidian 的 bug。後來才明白這就是 Markdown 的設計——行內的換行符被忽略了,除非你用行尾空格或反斜線明確告訴它「這裡要換行」。
為什麼我的段落變成了程式碼區塊?
段落前面有 4 個或以上空格,或者 1 個或以上 Tab。檢查一下段落開頭是不是不小心多打了空格。
連續多個空行為什麼沒效果?
Markdown 規範裡,多個連續空行等價於一個空行。如果你確實需要更大的間距,要用 HTML 的方式處理(比如多個 <br> 或者 CSS),不能靠堆空行。
行尾雙空格不生效怎麼辦?
先檢查編輯器是不是自動刪除了行尾空格。VS Code、Sublime Text 等編輯器預設會這樣做。你可以在編輯器設定中關閉這個功能,或者改用反斜線和 <br> 這兩種替代方案。
Markdown 段落的完整參考表
| 操作 | 語法 | 說明 |
|---|---|---|
| 建立段落 | 段落之間留空行 | 一個或多個空行效果相同 |
| 段落內換行 | 行末加兩個空格再 Enter | 最經典的方法,所有解析器支援 |
| 段落內換行 | 行末加 \ 再 Enter | CommonMark 支援,更直觀 |
| 段落內換行 | 使用 <br> 標籤 | HTML 方式,相容性最好 |
| 多段落列表項 | 列表項內縮排 4 空格 | 第二段起的段落需縮排 |
| 引用區塊內多段落 | 空行上也加 > | 保持引用連續性 |