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

幾個細節規則:

  1. 標籤前面必須有空格或位於行首——這是#標籤 不會被識別,這是 #標籤 才會
  2. 標籤後面不能緊跟普通文字——#標籤後面 只會識別 #標籤(空格後面是結束)
  3. 不允許有空格——#我的 標籤 只會識別 #我的,要寫 #我的標籤 或用底線 #我的_標籤
  4. 大小寫不敏感——#Markdown#markdown 是同一個標籤
  5. 數字可以出現——#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 的支援情況:

特性ObsidianJekyllHugoHexoMkDocs Material
行內標籤
嵌套標籤✅(付費)
Front Matter tags
自動標籤頁
YAML 陣列格式
TOML 格式
標籤面板/索引需外掛需外掛

有一個容易混淆的點:tagscategories 的區別。在 Hexo 和 Jekyll 裡,categories 是有層級的(一個文章只能屬於一個分類鏈),tags 是扁平的(一個文章可以有多個標籤)[^3]。但 Obsidian 不區分這兩個概念——它只有標籤。

常見問題

Front Matter 裡的 tags 和 keywords 有什麼區別?

tags 是分類標籤,用來組織內容,通常會在網站上顯示為可點擊的標籤連結。keywords 是 SEO 關鍵字,寫在 HTML meta 標籤裡,不會在頁面上顯示。有些佈景主題會把 tags 同時用作 SEO 關鍵字,但語義上它們是不同的東西。

標籤太多了怎麼辦?

標籤膨脹是真實存在的問題。我有一次整理筆記,發現標籤面板裡有 200 多個標籤,其中一半是只出現過一次的。後來我做了個清理:

  1. 合併同義詞——把 #js#JS#javascript 合併為 #javascript
  2. 刪除低頻標籤——只出現過 1-2 次的標籤,要麼合併到更寬泛的標籤,要麼直接刪除
  3. 用嵌套標籤替代扁平標籤——#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 支援