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 個空格。

段落和標題

標題前後建議留空行。雖然有些解析器不要求,但養成這個習慣能避免很多相容性問題:

## 這是一個標題

標題下面的段落內容。

常見問題與排查

為什麼我的段落沒有換行?

最常見的兩個原因:

  1. 沒有留空行——段落之間必須有一個完全空白的行
  2. 空行上有不可見的字元——可能是空格或 Tab,雖然這些在規範中算空行,但某些解析器可能處理不一致

為什麼多行文字渲染成了一行?

這是標準 Markdown 行為——段落內的連續行會被合併成一行。如果你想在段落內換行,用前面說的三種方法之一。

有一次我在 Obsidian 裡寫一篇筆記,連續寫了好幾行都沒換行,以為是 Obsidian 的 bug。後來才明白這就是 Markdown 的設計——行內的換行符被忽略了,除非你用行尾空格或反斜線明確告訴它「這裡要換行」。

為什麼我的段落變成了程式碼區塊?

段落前面有 4 個或以上空格,或者 1 個或以上 Tab。檢查一下段落開頭是不是不小心多打了空格。

連續多個空行為什麼沒效果?

Markdown 規範裡,多個連續空行等價於一個空行。如果你確實需要更大的間距,要用 HTML 的方式處理(比如多個 <br> 或者 CSS),不能靠堆空行。

行尾雙空格不生效怎麼辦?

先檢查編輯器是不是自動刪除了行尾空格。VS Code、Sublime Text 等編輯器預設會這樣做。你可以在編輯器設定中關閉這個功能,或者改用反斜線和 <br> 這兩種替代方案。

Markdown 段落的完整參考表

操作語法說明
建立段落段落之間留空行一個或多個空行效果相同
段落內換行行末加兩個空格再 Enter最經典的方法,所有解析器支援
段落內換行行末加 \ 再 EnterCommonMark 支援,更直觀
段落內換行使用 <br> 標籤HTML 方式,相容性最好
多段落列表項列表項內縮排 4 空格第二段起的段落需縮排
引用區塊內多段落空行上也加 >保持引用連續性

參考來源