Markdown 標籤完全指南:行內標籤與 Front Matter 標籤
說到 Markdown 標籤(tags),很多人第一反應是「這不是部落格系統才有的功能嗎」。確實,John Gruber 最初設計 Markdown 的時候根本沒有標籤這個概念 [^1]。但隨著 Markdown 被越來越多人用來管理筆記、寫部落格、維護文件,標籤就成了剛需——你總得有個辦法把幾百篇文章按主題歸類吧。
這篇文章把 Markdown 生態裡的標籤徹底講清楚:行內標籤(#tag)怎麼寫,Front Matter 裡的 tags 欄位怎麼用,不同平台之間有什麼差異,以及怎麼取一個好用又好記的標籤名。
Markdown 標籤速查表
先上一張總覽表,方便快速查閱。每種標籤後面都會展開說明。
| 標籤類型 | 寫法 | 適用場景 | 典型平台 |
|---|---|---|---|
| 行內標籤 | #標籤名 | 在正文中隨時打標籤 | Obsidian、Logseq |
| 嵌套標籤 | #父級/子級 | 按層級組織標籤 | Obsidian |
| Front Matter 列表 | tags: [a, b] | 文章級元資料分類 | Jekyll、Hugo、VitePress |
| Front Matter 多行 | tags: + - a | 同上,適合標籤多的情況 | 同上 |
| Front Matter 字串 | tags: a b c | 空格分隔的標籤(Jekyll 專用) | Jekyll |
關鍵認知:Markdown 標籤不是原始規範的一部分。它是由具體工具(靜態網站產生器、筆記軟體)各自實作的,所以不同平台的語法和行為都有差異。下面分兩類來講。
行內標籤:在正文裡隨手標記
行內標籤就是直接在 Markdown 正文裡寫 #標籤名。它看起來像社交媒體的話題標籤(hashtag),但功能上用來給筆記分類。
Obsidian 行內標籤
Obsidian 是目前對行內標籤支援最完善的工具。在正文任意位置寫 #標籤名,Obsidian 就會自動識別並在左側標籤面板裡彙總 [^2]。
今天學習了 Markdown 的基本語法 #markdown
這個筆記和 JavaScript 有關 #javascript幾個細節規則:
- 標籤前面必須有空格或位於行首——
這是#標籤不會被識別,這是 #標籤才會 - 標籤後面不能緊跟普通文字——
#標籤後面只會識別#標籤(空格後面是結束) - 不允許有空格——
#我的 標籤只會識別#我的,要寫#我的標籤或用底線#我的_標籤 - 大小寫不敏感——
#Markdown和#markdown是同一個標籤 - 數字可以出現——
#2026計畫是合法標籤,但純數字#123在某些版本中可能不生效
嵌套標籤:用斜線組織層級
Obsidian 支援用 / 建立嵌套標籤,相當於給標籤建了一個資料夾結構 [^2]:
#inbox/待讀
#inbox/待處理
#專案/前端
#專案/後端在標籤面板裡,#inbox 下面會折疊顯示 待讀 和 待處理 兩個子標籤。搜尋 #inbox 也會比對所有子標籤。這個功能在標籤多了以後特別有用——不然一長串扁平標籤根本沒法看。
嵌套層數沒有硬性限制,但實際使用中兩層到三層就夠了,太深反而增加管理成本。
行內標籤的局限
行內標籤最大的問題是依賴特定工具。#標籤 這個寫法在 Jekyll、Hugo 這些靜態網站產生器裡完全沒有意義——它們只認 Front Matter 裡的元資料。GitHub 上渲染 Markdown 時,#標籤 會被當作一級標題。
所以如果你用 Obsidian 寫筆記,行內標籤很方便。但如果你的檔案最終要發佈到部落格或者 GitHub,還是得靠 Front Matter 標籤。
Front Matter 標籤:在元資料裡分類
Front Matter 標籤是寫在 YAML 頭資訊 裡的 tags 欄位,用來給整篇文章打標籤。這是靜態網站產生器和大部分工具都支援的方式。
YAML 列表語法
兩種寫法等效,選你喜歡的就行:
行內寫法(適合標籤少的情況):
---
title: Markdown 標籤指南
tags: [markdown, tags, 教學]
---多行寫法(適合標籤多的情況):
---
title: Markdown 標籤指南
tags:
- markdown
- tags
- 教學
---我個人傾向多行寫法,因為增刪標籤時 Git diff 更清晰,不會因為一行改動了整個陣列而產生歧義。
Jekyll 的空格分隔語法
Jekyll 有個獨特的寫法——用空格分隔標籤,直接寫成字串 [^3]:
---
title: 我的文章
tags: markdown tags 教學
---這個寫法只有 Jekyll 認。Hugo、Hexo、VitePress 都只接受陣列格式。實測發現,如果你在 Jekyll 裡同時寫了 tags: [a, b] 這種陣列格式,Jekyll 也能正確解析,所以在 Jekyll 專案裡用陣列寫法也沒問題,而且跨平台相容性更好。
Hugo 的多格式支援
Hugo 是少數支援三種 front matter 格式的靜態網站產生器 [^4]:
---
title: 我的文章
tags: [markdown, tags]
---
# TOML
+++
title = "我的文章"
tags = ["markdown", "tags"]
+++
# JSON(極少用)
{
"title": "我的文章",
"tags": ["markdown", "tags"]
}三種格式裡,Hugo 都把 tags 當作 taxonomies(分類法)來處理,會自動產生 /tags/markdown/ 這樣的標籤頁面。
Obsidian 裡兩種標籤怎麼配合
Obsidian 比較特殊——它同時支援行內標籤和 Front Matter 標籤,而且兩種標籤會被合併到同一個系統裡 [^2]。也就是說,不管你在正文裡寫 #javascript 還是在 front matter 裡寫 tags: [javascript],Obsidian 都會在標籤面板的同一個 javascript 條目下彙總。
那兩種方式該怎麼選?我的習慣是:
- Front Matter 標籤用於文章級分類——這篇文章「是什麼」,比如
tags: [教學, markdown, 前端] - 行內標籤用於段落級標記——這段內容「涉及什麼」,比如
#待複習#重要#bug
這樣分工的好處是:Front Matter 標籤適合批次檢索「所有教學類文章」,行內標籤適合在閱讀時快速定位「哪些段落標記了重點」。
Markdown 標籤命名規則
不管用哪種標籤形式,取名字都有一些通用規則。這部分是我踩了不少坑之後總結的。
允許的字元
| 字元 | 行內標籤 | Front Matter 標籤 | 說明 |
|---|---|---|---|
| 中文 | ✅ | ✅ | Obsidian 完美支援中文標籤 |
| 英文字母 | ✅ | ✅ | |
| 數字 | ✅ | ✅ | |
底線 _ | ✅ | ✅ | 用於替代空格 |
短橫線 - | ✅ | ✅ | |
斜線 / | ✅(Obsidian) | ❌ | 行內標籤用於嵌套層級 |
| 空格 | ❌ | ✅(用引號包裹) | 行內標籤遇到空格就截斷 |
# | ❌ | ✅(用引號包裹) | 和行內標籤前綴衝突 |
命名建議
保持簡短——標籤不是描述,2-4 個詞就夠了。#前端 比 #前端開發技術棧 好用得多。
統一風格——要麼全用中文(#前端),要麼全用英文(#frontend),混用會讓標籤面板很亂。我之前就有個壞習慣,#javascript 和 #前端 混著打,後來想找所有前端相關的筆記,發現分散在兩個標籤下面。
避免同義詞——#js 和 #javascript 是兩個不同的標籤,選一個堅持用。可以在標籤面板裡把不常用的那個刪掉,Obsidian 會提醒你哪些筆記用過它。
不同平台的標籤差異對比
一張表看完各平台對 Markdown tags 的支援情況:
| 特性 | Obsidian | Jekyll | Hugo | Hexo | MkDocs Material |
|---|---|---|---|---|---|
| 行內標籤 | ✅ | ❌ | ❌ | ❌ | ❌ |
| 嵌套標籤 | ✅ | ❌ | ✅ | ❌ | ✅(付費) |
| Front Matter tags | ✅ | ✅ | ✅ | ✅ | ✅ |
| 自動標籤頁 | ❌ | ✅ | ✅ | ✅ | ✅ |
| YAML 陣列格式 | ✅ | ✅ | ✅ | ✅ | ✅ |
| TOML 格式 | ❌ | ❌ | ✅ | ❌ | ❌ |
| 標籤面板/索引 | ✅ | 需外掛 | ✅ | 需外掛 | ✅ |
有一個容易混淆的點:tags 和 categories 的區別。在 Hexo 和 Jekyll 裡,categories 是有層級的(一個文章只能屬於一個分類鏈),tags 是扁平的(一個文章可以有多個標籤)[^3]。但 Obsidian 不區分這兩個概念——它只有標籤。
常見問題
Front Matter 裡的 tags 和 keywords 有什麼區別?
tags 是分類標籤,用來組織內容,通常會在網站上顯示為可點擊的標籤連結。keywords 是 SEO 關鍵字,寫在 HTML meta 標籤裡,不會在頁面上顯示。有些佈景主題會把 tags 同時用作 SEO 關鍵字,但語義上它們是不同的東西。
標籤太多了怎麼辦?
標籤膨脹是真實存在的問題。我有一次整理筆記,發現標籤面板裡有 200 多個標籤,其中一半是只出現過一次的。後來我做了個清理:
- 合併同義詞——把
#js、#JS、#javascript合併為#javascript - 刪除低頻標籤——只出現過 1-2 次的標籤,要麼合併到更寬泛的標籤,要麼直接刪除
- 用嵌套標籤替代扁平標籤——
#css#css-動畫#css-佈局改為#css/動畫#css/佈局
目標是把標籤控制在 50 個以內,每個標籤至少關聯 3 篇文章。
行內標籤和 Markdown 標題衝突怎麼辦?
在標準 Markdown 裡,# 開頭是一級標題。所以 #標籤 在 GitHub、GitLab 上渲染時會被當成標題,而不是標籤。只有 Obsidian、Logseq 這類筆記工具才會把正文中的 #單詞 識別為標籤。
如果你的 Markdown 檔案要在多個平台使用,行內標籤只放在 Obsidian 裡用,正式發佈的內容用 Front Matter 標籤。
說實話語法本身沒幾行,但坑都在細節裡。搞清楚你的檔案最終要在哪個平台上使用,選對標籤形式,然後堅持統一的命名習慣,標籤系統就能真正幫到你而不是添亂。
參考來源
[^1]: John Gruber, Markdown: Syntax, Daring Fireball — 原始 Markdown 規範中未定義標籤概念 [^2]: Obsidian Help, Tags, help.obsidian.md — Obsidian 標籤功能官方文件 [^3]: Jekyll Documentation, Front Matter Defaults, jekyllrb.com — Jekyll 對 tags 和 categories 的處理方式 [^4]: Hugo Documentation, Front Matter, gohugo.io — Hugo front matter 三種格式及 taxonomies 支援