Markdown 縮排完全指南:首行縮排、段落縮排、列表嵌套一篇搞定

Markdown缩进

Markdown 本身沒有專門的「縮排」語法。這個設計是故意的——John Gruber 在設計 Markdown 時,排版佈局的工作就交給了 CSS,Markdown 只管內容結構。但現實是,寫技術文件、部落格文章、README 的時候,縮排需求又確實存在。特別是中文排版,「首行縮排兩個漢字」幾乎是剛需。

這篇文章把 Markdown 中所有跟縮排相關的場景和方法都梳理一遍,看完之後不管你是想在 GitHub 上做嵌套列表,還是在部落格裡實現首行縮排,都能找到對應方案。

先搞清楚:Markdown 中的縮排規則

在講具體方法之前,得先理解 Markdown 對縮排的處理邏輯。簡單來說,Markdown 解析器看到行首的空格和 Tab,會根據數量決定它是什麼:

行首空格/Tab 數量Markdown 的理解效果
0 個普通段落文字正常顯示
1-3 個空格普通段落文字(空格被忽略)看不出縮排
4 個空格或 1 個 Tab程式碼區塊等寬字體顯示
列表項前的 2-4 個空格嵌套列表項下一級列表
> 符號引用區塊(blockquote)左側帶豎線

這個規則來自 CommonMark 規範Gruber 的原始文件。所以你直接在段落前面敲空格,大概率看不到任何縮排效果——解析器直接忽略了。

方法一:HTML 空格實體(最常用)

這是用得最廣泛的方案,原理是在 Markdown 中直接插入 HTML 空格實體字元。解析器不會忽略 HTML 實體,所以縮排能生效。

四種 HTML 空格實體對照

實體名稱寬度適用場景
 不間斷空格約 1 個字元寬度英文排版,微調間距
 半形空格約 0.5 個中文字元寬度較少使用
 全形空格約 1 個中文字元寬度中文首行縮排首選
 窄空格約 0.2 個字元寬度細微間距調整

中文首行縮排寫法

中文文章習慣首行縮排兩個漢字,用兩個   剛好:

  這是一段中文文字,首行會縮排兩個漢字的寬度。這個方法在 GitHub、Typora、VS Code 預覽中都能正常顯示。

  每個段落開頭都加上這兩個實體就行。雖然有點麻煩,但相容性最好。

英文縮排寫法

英文縮排一般用 4 個   或 2 個  

    This paragraph has an indent at the beginning. It works across most Markdown renderers.

說實話,這個方法最大的缺點就是手動敲實體太累。不過如果你用的是 Typora 或 VS Code,可以設定程式碼片段(snippet)來快速輸入。我之前寫一篇長文章,每個段落都要手動加   ,後來直接在 VS Code 裡設了一個 snippet,輸入 ;2em 就自動展開,效率提升不少。

方法二:全形空格(中文排版的隱藏技巧)

這個方法很多英文教學不會提,但對中文使用者來說可能是最簡單的方案。

操作步驟:把輸入法切換到全形模式,然後直接敲兩個空格。

  這段文字前面是兩個全形空格,在中文排版中等同於首行縮排兩個字。

全形空格(Unicode U+3000)在絕大多數 Markdown 渲染器中不會被忽略,所以能實現視覺縮排。相比   實體,全形空格在原始碼中看起來更直觀。

不過有個小坑:有些編輯器的自動格式化工具會把全形空格替換成普通空格,導致縮排消失。如果你發現縮排突然消失了,檢查一下編輯器的格式化設定。我有一次用 Prettier 格式化 Markdown 檔案,格式化完所有全形空格全沒了,之後就不敢在有使用 Prettier 的專案裡用這個方案了。

方法三:引用區塊實現視覺縮排

如果你的目的不是首行縮排,而是想把一整段文字往右挪——比如在文章中引用別人的話、突出顯示某個段落——用引用區塊(blockquote)最合適:

> 這段文字會向右縮排,左側出現一條豎線。
> 可以寫多行內容,視覺效果等同於整體縮排。
>
> 甚至可以分段,中間空一行加 `>` 就行。

引用區塊可以嵌套使用,實現多層縮排:

> 第一層縮排
>
> > 第二層縮排
> >
> > > 第三層縮排

引用區塊嚴格來說不算「縮排語法」,但它是 Markdown 原生支援的功能,在所有渲染器中都相容,而且語義上表示「引用內容」,對於文章中引用別人觀點的場景非常合適。

方法四:HTML 標籤控制縮排

當你需要精確控制縮排距離,或者想讓整段文字都縮排(不只是首行),可以用 HTML 的 divp 標籤配合 margin-left 樣式:

<div style="margin-left: 2em;">
這段文字整體向右縮排了 2em。
適用於需要大面積縮排的場景。
</div>

或者用 padding-left

<p style="padding-left: 40px;">
這段文字左側有 40px 的內邊距。
可以精確到像素級控制縮排距離。
</p>

注意:這個方法依賴於 Markdown 渲染器支援 HTML 標籤和行內樣式。GitHub 和大部分靜態部落格產生器(Jekyll、Hugo、Hexo)都支援,但有些平台(比如部分論壇、Discord)會過濾掉 HTML 標籤。

方法五:列表嵌套縮排

列表嵌套是 Markdown 中縮排最有「官方支援」的場景。在列表項前加 2-4 個空格,就能建立子列表:

- 第一項
  - 嵌套子項(2 個空格)
    - 更深的嵌套(4 個空格)
- 第二項
  - 子項
    - 深層子項
      - 還能更深

有序列表和無序列表可以混用:

1. 安裝步驟
   - 下載安裝包
   - 執行安裝程式
2. 設定步驟
   1. 開啟設定檔
   2. 修改連接埠號
      - 預設連接埠:8080
      - 自訂連接埠範圍:1024-65535

關於列表縮排,有一個經常被問到的問題:到底縮排 2 個空格還是 4 個空格?

CommonMark 規範的定義是:列表項的延續內容需要縮排到列表標記之後的文字起始位置。對於無序列表(-),標記佔 2 個字元,所以子項縮排 2 個空格就夠了。對於有序列表(1.),標記佔 3 個字元,子項需要縮排 3 個空格。

實際操作中,大多數渲染器對 2-4 個空格的縮排都能正確識別,但如果你在 GitHub 上發現嵌套列表渲染異常,試試調整縮排空格數。

方法六:CSS 全域縮排(一勞永逸)

如果你有自己的部落格或網站,用 CSS 設定全域首行縮排是最優雅的方案。一次設定,所有段落自動縮排,不用在每個段落前手動加任何東西:

/* 所有段落首行縮排 2em */
p {
  text-indent: 2em;
}

/* 注意:避免圖片也被縮排 */
p img {
  margin-left: -2em;
}

這個方案適合 Jekyll、Hugo、Hexo 等靜態部落格,也適合 WordPress。在 GitHub README 或他人平台上就用不了了,因為你控制不了 CSS。

順便提一句,用了 CSS 縮排之後,記得清理舊文章裡手動加的 &emsp; 和全形空格,否則會出現雙重縮排。之前幫一個朋友從 WordPress 遷移到 Hugo,他之前每篇文章都手動加了 &emsp;&emsp;,切到 CSS 方案後全變成了「雙倍縮排」,最後寫了個腳本批次清理。

不同場景該用哪種方案?

場景推薦方案原因
GitHub README 中的嵌套列表列表縮排(2-4 空格)原生支援,無需 hack
GitHub README 中的段落縮排&emsp;&nbsp;GitHub 支援但會過濾部分 HTML
Typora 寫中文部落格全形空格或 &emsp;直觀、相容性好
自建部落格網站CSS text-indent一勞永逸,內容與樣式分離
需要精確控制縮排距離HTML margin-left像素級精確
引用別人的內容引用區塊 >語義正確,原生支援
Pandoc / R MarkdownLine block \| 語法原生保留前導空格

渲染器相容性參考

不同平台對縮排方案的支援程度不同,這裡整理了一張對照表:

方案GitHubTyporaVS CodeObsidianJekyll/Hugo
&nbsp; / &emsp;
全形空格
引用區塊 >
HTML margin-left⚠️ 部分過濾⚠️ 有限支援
CSS text-indent
Pandoc line block \|⚠️ 需 Pandoc

表格中「⚠️ 部分過濾」是指 GitHub 會保留部分 HTML 標籤但過濾掉 style 屬性中的某些屬性值,實際效果需要測試。

關於 Tab 鍵

在 Markdown 編輯器中按 Tab 鍵,行為取決於編輯器:

  • Typora:在列表中按 Tab 會縮排當前項;在普通段落中按 Tab 可能插入 4 個空格或跳到下一個焦點
  • VS Code:預設插入 4 個空格(可在設定中改為 2 個);在列表中按 Tab 會縮排
  • Obsidian:在列表中按 Tab 縮排;在普通文字中不回應
  • GitHub 線上編輯器:Tab 鍵主要用於列表縮排

總之,Tab 鍵在 Markdown 編輯器中主要用於列表縮排,不適合用來做段落首行縮排。

常見問題

為什麼我在段落前加空格沒有效果?

Markdown 規範規定,1-3 個前導空格會被忽略。4 個及以上的空格會把內容變成程式碼區塊。所以直接敲空格做段落縮排是行不通的。

&emsp;&nbsp; 有什麼區別?

&emsp; 的寬度等於一個中文字元(也叫「全形空格」),&nbsp; 的寬度約等於一個英文字元。中文首行縮排用 &emsp; 更精確,2 個 &emsp; 剛好是兩個漢字的寬度。

GitHub 上能用 HTML 樣式做縮排嗎?

GitHub 的 Markdown 渲染器(GFM)支援部分 HTML 標籤,但會過濾掉 style 屬性。所以 <div style="margin-left: 2em;"> 這種寫法在 GitHub 上大概率不生效。在 GitHub 上推薦用 &emsp; 或引用區塊。

怎麼在 VS Code 裡快速輸入 &emsp;

可以在 VS Code 的 snippets 中新增自訂程式碼片段。開啟命令面板搜尋「Configure User Snippets」,選擇 markdown.json,新增:

{
  "Chinese indent": {
    "prefix": ";2em",
    "body": ["&emsp;&emsp;$0"],
    "description": "插入中文首行縮排"
  }
}

之後在 Markdown 檔案中輸入 ;2em 按 Tab 就能快速插入。


Markdown 縮排這個話題說大不大,說小不小。語法層面確實沒有原生支援,但透過 HTML 實體、全形空格、引用區塊、HTML 標籤、CSS 這幾種方式,基本上能覆蓋所有縮排需求。選哪種方案,主要看你用的平台和場景——在 GitHub 上寫 README,用 &emsp; 和列表縮排就夠了;自己架部落格的話,直接上 CSS text-indent,乾淨俐落。

來源