Markdown 目錄產生器怎麼用
把整份文件貼進本頁最上方的輸入框,或直接開啟 .md 檔。產生器會逐行掃描,找出以井字號開頭的 ATX 標題,從 # 標題 一路到 ###### 小標題。其餘內容一律略過,所以文件多長都不影響。
- 只讀井字號寫成的標題,內文、程式碼與圖片一律跳過。
- 最小層級設 2 會排除文件大標題,最大層級設 3 能讓長文件的目錄不至於失控。
- 每一項都連到 GitHub 會產生的錨點 ID,標題重複時自動補上
-1。 - 掃描在瀏覽器裡完成,還沒公開的規格書不會離開這個分頁。
兩個層級控制項在做什麼
最小層級決定要納入的最淺標題。設成 2,檔案最上方那個 # 大標題就會被排除。這幾乎永遠是你要的效果,因為目錄很少需要連到它自己所在的那份文件。
最大層級決定最深到哪一層。在冗長的規格書裡停在 3,可以避免第四層標題把清單長度直接變成三倍。
每個標題會變成什麼
保留下來的標題都會變成一個項目。連結文字是去掉行內格式後的標題文字,目標則是 GitHub 會替它產生的錨點 ID。縮排依照標題階層,每深一層多兩個空格,產生的巢狀清單在任何地方都能正確渲染。
做好的清單放哪裡
複製之後貼在文件靠前的位置,通常放在簡短的 ## 目錄 標題底下。想對照即時預覽,把檔案丟進 Markdown 編輯器就好;同一份檔案的轉換與匯出需求,交給其他Markdown 工具。
小提醒:目錄留到最後再產生。草稿寫到一半就做好的目錄,等到要發佈時通常已經跟內容對不上了。
完整範例:標題進去,目錄出來
以下是一份簡短的手冊,有一個第一層大標題、數個第二層章節、若干第三層小節,還藏了一個第四層標題:
# Deploy Handbook
Everything the team needs before shipping.
## Getting started
### Install the CLI
### Options
## Continuous delivery
### Options
#### Retry policy
## FAQ: what breaks & why
把最小層級設為 2、最大層級設為 3,產生器會輸出:
- [Getting started](#getting-started)
- [Install the CLI](#install-the-cli)
- [Options](#options)
- [Continuous delivery](#continuous-delivery)
- [Options](#options-1)
- [FAQ: what breaks & why](#faq-what-breaks--why)
短短六行,裡面看得到四個判斷。
輸出裡的四個判斷
- 大標題消失了。
# Deploy Handbook比最小層級還淺,因此被排除。 - 最深的標題也不見了。
#### Retry policy超過最大層級。 - 第二個
Options指向#options-1。同一頁的錨點 ID 必須唯一,重複時就依序編號。 - & 符號留下了
--。最後那個錨點看起來像打錯字,其實完全正確。
從貼上到發佈的完整步驟
- 把文件貼進本頁最上方的輸入框。
- 把最小層級設為 2,讓文件大標題退出清單。
- 把最大層級設為 3;文件很短的話設 4 也可以。
- 複製清單,貼到檔案前面的
## 目錄標題底下。 - 發佈後點一個項目,確認網址列跟錨點對得上。
為什麼每一項都只是普通連結
每個項目都只是一般的 Markdown 連結,只是目標從網址換成片段識別碼。機制就這麼簡單:[文字](#錨點) 會跳到同一份檔案中 ID 為該錨點的標題。這裡完全沒有平台專屬的東西,所以文件搬到別處之後,只要新的渲染器用同樣方式產生 ID,目錄照樣能用。
GitHub 如何把標題變成錨點 ID
連結目標不是你自己發明的,而是由標題文字經過一組固定規則推導出來。知道這組規則,你光用眼睛就能看出哪個連結會壞掉。
四條規則,依序套用
- 全部轉成小寫。
- 刪掉所有不是字母、數字、空白、連字號或底線的字元。
- 把剩下的每個空白換成連字號。
- 如果這一頁已經用過同樣的 ID,就依出現順序加上
-1、-2。
真實標題與它們產生的錨點
寫成文字聽起來很單純,但第二條規則不斷讓人踩雷,因為標點是被「刪掉」而不是被「取代」。實際的轉換結果如下:
| 你寫的標題 | 產生的錨點 | 原因 |
|---|---|---|
## Getting started | #getting-started | 轉成小寫,空白換成連字號 |
## API Reference | #api-reference | 大寫字母一律轉小寫 |
## FAQ: common questions | #faq-common-questions | 冒號是被刪除,不是被取代 |
## What's new? | #whats-new | 單引號與問號都直接消失 |
## Node.js & npm | #nodejs--npm | 句點被刪,而被刪掉的 & 留下兩個連字號 |
## Step 1: install | #step-1-install | 數字原封不動保留 |
## C++ vs C# | #c-vs-c | 符號全數消失,相似標題極容易撞在一起 |
## 🚀 Deploy | #-deploy | 表情符號被刪,但它後面那個空白仍變成連字號 |
## 安裝說明 | #安裝說明 | 中日韓文字會保留,在網址列上再做百分比編碼 |
## Café résumé | #café-résumé | 帶重音的字母仍是字母,因此留著 |
## **Bold** heading | #bold-heading | 產生 ID 之前會先去掉行內格式 |
## Options(第二個) | #options-1 | 重複的標題依文件順序編號 |
哪些渲染器遵守同一套規則
GitLab、Gitea、Docusaurus 與多數靜態網站產生器都跟得夠近,產生出來的目錄可以直接沿用。Bitbucket 與部分較舊的 wiki 則不同,也有少數渲染器會在每個 ID 前面加上 user-content- 之類的前綴。標題的完整說明請見 Markdown 完整指南,這套行為所屬的方言則由 GitHub 風格 Markdown 負責解釋。
注意:標點很多的標題,千萬不要用猜的。先發佈頁面、點一次連結,直接從網址列把 ID 讀回來。花兩秒,勝過一個點了沒反應的連結。
GitHub 已經會自動產生目錄,那還需要這個嗎?
先把話說清楚:在 GitHub 上,手動維護的目錄如今大致上是多餘的。每份渲染後的 Markdown 檔案,檔頭都有一顆目錄按鈕,點下去會展開依標題整理的大綱;因為是在瀏覽當下即時產生,它永遠與內容同步。
那顆按鈕照顧不到的五個場景
它只涵蓋一個場景,但 Markdown 檔案落腳的地方很多,所以花四秒產生一份清單仍然值得:
- 其他代管平台。自架的 GitLab、Gitea、Codeberg 與公司內部 wiki 支援程度不一,有些根本沒有這項功能。
- 靜態網站。部分 Hugo、Jekyll、Astro 主題會在側邊欄顯示大綱,但更多主題不會;寫在檔案裡的清單則不挑主題。
- 倉庫之外的長文件。規格書或維運手冊,在編輯器、Obsidian 或 Markdown 檢視器裡閱讀時,並沒有那顆檔頭按鈕可以按。
- 轉換後的輸出。檔案變成 HTML 或存成 PDF 時,寫在內文裡的目錄會被一起帶走,介面功能則不會。
- 直接讀原始檔。在終端機或 diff 裡打開
.md的人,第一眼就能看見整份文件的結構。
一條可以照著用的原則
只放在 GitHub 上的短篇 README,就別做手動目錄。超過約一千字,或會被拿到別處閱讀的文件,就產生一份。之後每次新增或改名章節時重新產生即可,成本就是貼一次。
常見問題與修法
目錄壞掉的方式其實不多,而且症狀會直接告訴你是哪一種。
點了連結沒有反應
錨點與標題對不上。原因通常出在標點:有人手寫連結時,保留了 ID 規則會刪掉的字元。
<!-- 壞掉:冒號與大寫字母都被保留了 -->
- [FAQ: Setup](#FAQ:-Setup)
<!-- 正確 -->
- [FAQ: Setup](#faq-setup)
兩個連結跳到同一個位置是它的親戚。兩個標題文字相同,後者需要 -1 後綴。重新產生就能修好,但更好的做法是替其中一個改名:有兩個「Options」章節的文件,不論連結多正確都很難導覽。
清單裡少了某個標題
依序檢查三件事:
- 它是不是落在程式碼區塊裡?那裡的
#只是註解,不是標題。 - 它是不是 Setext 樣式的標題?也就是用
===或---在文字下方畫底線,而不是用井字號。 - 井字號後面是不是漏了空白?多數解析器裡
##Setup只是普通文字,## Setup才是標題。
縮排層級看起來很怪
縮排完全對應檔案裡的標題層級。第二層章節後面直接接第四層標題,清單就會一次縮兩格。該修的是文件而不是目錄,因為跳過標題層級同樣會讓螢幕閱讀器與搜尋引擎困惑。清單指南有完整的巢狀規則。
目錄脫節,或搬家之後整份失效
脫節是手動清單真正的代價,解法是重新產生而不是手工補丁:把現在的文件貼進來、複製新清單、覆蓋舊的那一份。目的地渲染器用不同規則產生 ID,則是同一個問題的加強版,所有連結會一次失效,所以先在目的地點一個連結測試再信任整份清單;需要手改某一項時,語法速查表放在旁邊很方便。文件裡若還有從試算表搬來的表格,那部分交給表格轉 Markdown 工具。
相容性資料驗證日期
常見問題
如何在 Markdown 裡做目錄?
寫一份連結項目清單,把目標設成錨點 ID,例如 - [Getting started](#getting-started),巢狀項目每深一層縮排兩個空白。把文件貼進上方的產生器,清單就會自動建好。
GitHub 怎麼替標題產生錨點?
先把標題文字轉成小寫,刪掉所有不是字母、數字、空白、連字號或底線的字元,再把剩下的空白換成連字號;重複的標題依序加上 -1、-2。因此 ## FAQ: common questions 會變成 #faq-common-questions。
GitHub 不是已經會自動產生目錄了嗎?
是的。GitHub 上渲染後的 Markdown 檔案,檔頭有一顆目錄按鈕可以展開自動大綱。不過手動目錄在其他代管平台、靜態網站、PDF 與 HTML 匯出,以及在 GitHub 之外閱讀的長文件裡,仍然很有用。
可以限制只納入某些標題層級嗎?
可以。產生前先設定最小與最大標題層級。常見的組合是最小 2,用來排除文件大標題;最大 3,讓長文件的目錄不會過長。
這些錨點連結在 GitHub 以外也能用嗎?
大多可以。GitLab、Gitea 與多數靜態網站產生器採用相同的 ID 規則;部分較舊的 wiki 不同,也有少數渲染器會加上前綴。發佈後先點一個連結測試,細節請見 Markdown 連結指南。
Markdown 有目錄語法嗎?
沒有,Markdown 本身沒有目錄語法。大家口中的目錄,其實只是一份指向標題錨點的項目清單,所以產生器才能直接讀你的標題,一秒排好整份清單。GitHub 幫忙分擔了一部分需求,它會從檔頭自動生出可摺疊的大綱。因此手動目錄真正划算的場合,是長篇文件,以及 GitHub 以外的各種渲染器。
延伸閱讀
立即使用編輯器
開啟編輯器