用兩個星號寫粗體
用兩個星號或兩個底線把文字包起來,就會變成粗體:
建置**已經在測試環境跑了**。
建置__已經在測試環境跑了__。
- 值得用的只有
**粗體**與*斜體*,底線版本製造的麻煩比省下的多。 - 符號內側只要有空格就會失效,
** 粗體 **只會把星號印出來。 - 底線不能在單字中間強調,這也正是
snake_case能完整保留的原因。 - 中文粗體失效,多半是全形標點被夾在符號內側,把標點移到外面就好了。
兩種寫法產生相同的 HTML,而且是 <strong> 而不是 <b>。這點很重要:<strong> 代表「強烈重要」,螢幕閱讀器可以把它當成內容而非裝飾,字重則交給 CSS 決定。
如果你只是想要筆畫粗一點、不附帶任何語意,直接寫 <b> 才誠實,這也是 Markdown 與 HTML 的差別之一。
為什麼星號那一種比較好
請用兩個星號。底線有三個各自獨立的陷阱:
- 它會跟
snake_case這類識別字與檔名打架。 - 它在單字中間完全不作用。
- 在 Discord 上
__文字__代表底線,不是粗體。
選 **,這三個問題一次消失。Discord 其他的脾氣,Discord 參考有整理。
用一個星號寫斜體
把符號從兩個減成一個就是斜體,兩種字元一樣都可以用:
請先看完*整份*更新日誌。
請先看完_整份_更新日誌。
輸出是 <em>,意思是「語氣上的強調」,也就是你唸出來會加重的那個詞。
斜體該用在哪、不該用在哪
部分螢幕閱讀器設定會把 <em> 讀出來,所以請留給真正有語氣的文字。書名、外文詞與介面名稱是另一回事:
- 真的要加重語氣:用
*星號*。 - 書名或片名:原始 HTML 的
<cite>才表達得準確。 - 正在下定義的術語:用斜體沒問題,讀者也習慣。
- 按鈕或選單名稱:純文字或
<i>比強調合適。
符號的建議同樣是優先用 *。滿篇 _斜體_ 的檔案,只要貼進一個 Python 變數名稱就會出事。
為什麼星號比底線安全,還有空格陷阱
底線在單字中間不作用
CommonMark 刻意限制底線,好讓識別字能原樣留存。兩側都被字母包住的底線既不能開啟也不能結束強調,星號則沒有這個限制:
un*frigging*believable -> un<em>frigging</em>believable
un_frigging_believable -> 原樣顯示,不會變斜體
好處是 snake_case_words、__init__ 與 my_file_name.txt 在 CommonMark 與 GitHub 風格 Markdown 裡都能完整保留。
比較舊的引擎確實會把中間那段變成斜體,包括原始的 Markdown.pl 與不少 wiki,這就是為什麼老 README 裡偶爾會看到變數名稱中間冒出斜體。最安全的習慣是用反引號,`snake_case_words` 既正確又好讀。
空格陷阱
分隔符號的內側只要有空白,就無法開啟或結束強調。這是所有強調失敗中最常見的一種:
** 粗體 ** -> 星號原樣印出來
**粗體** -> 變成粗體
符號必須緊貼文字。外側有空白沒問題,通常還是必要的,所以 一個 **粗體** 詞 是正確的。
跳脫字面上的星號或底線
在它前面加一個反斜線:
5 \* 3 = 15
檔名是 report\_final.md
小提醒:只要內容長得像程式碼,先想到反引號而不是反斜線。程式碼片段裡什麼都不必跳脫、複製貼上不會壞掉,還順便告訴讀者這段是什麼。行內程式碼與圍欄的完整說明在程式碼區塊參考。
粗斜體、巢狀、連結與標題
三個符號可以同時得到粗體與斜體,而混用兩種字元是最好讀的寫法:
***又粗又斜***
___又粗又斜___
**_又粗又斜_**
三種都渲染成粗斜體。最後一種值得養成習慣,因為 ***字*** 在 diff 裡真的很難一眼數清楚有幾個星號。
把強調套在強調裡面
只要內外層的符號不同,強調就可以巢狀:
**警告:*不要*重新啟動服務。**
*大致是斜體的一行,其中有一個**粗體**詞。*
內外層用同一種字元不會照你想的方式運作。*外層 *內層* 外層* 會讓解析器把前兩組配成一對,結果一團亂。請交替使用兩種字元,或在星號組裡面放底線組。
放在連結與標題裡
強調可以寫在連結文字裡,也可以包住整個連結:
[**下載安裝程式**](https://example.com/setup.exe)
**[下載安裝程式](https://example.com/setup.exe)**
兩種都會變粗體。第一種把符號留在連結內部,之後改網址時比較乾淨,其餘連結語法請見連結參考。
粗體不等於標題
標題裡的強調會正常渲染,但在產生錨點 ID 時會被剝掉,所以 ## The **important** part 得到的是 #the-important-part,完整的 ID 規則在標題參考。
請不要用粗體代替標題。粗體那一行產生不出大綱條目、沒有錨點,目錄產生器也找不到它。
用兩個波浪號寫刪除線
兩側各放兩個波浪號,文字上就會畫一條線:
~~週五出貨~~ 改成週一出貨。
它渲染成 <del>,語意是「被刪除的內容」,所以用在改過的價格、完成的待辦或被取代的日期上都讀得通。
哪裡能用、要放幾個波浪號
刪除線不屬於原始 Markdown,也不在 CommonMark 核心裡,它是以 GFM 延伸語法的身分出現的,所以數量依平台而異:
- 兩個波浪號:GitHub、GitLab、Discord、Reddit、Obsidian、Notion 與多數筆記軟體。
- 一個波浪號:GFM 也接受,而 Slack 剛好只用一個。
- 兩種都不行:嚴格的 CommonMark 渲染器會把波浪號原樣印出來。
在沒有這個延伸語法的地方,只要允許行內 HTML,<del>文字</del> 到哪都有效。
螢光標記、底線、上標與下標
螢光標記
==螢光標記== 不是標準 Markdown。它在 Obsidian、Typora,以及啟用 pymdownx.mark 的 MkDocs Material 上有效,GitHub 則會把等號原樣印出來。通用的寫法是 <mark>螢光標記</mark>。
底線
Markdown 沒有底線語法,而且是刻意不做的:在網頁上底線代表連結,替一般文字加底線會誤導讀者。
真的需要時就用 <u>文字</u>;若是標示「新增的修訂」,<ins>文字</ins> 更合適。Discord 是那個常害人踩雷的例外,因為它把 __文字__ 讀成底線,而其他工具都讀成粗體。
上標與下標
<sup> 與 <sub> 是最可靠的做法,在 GitHub 上也有效。Pandoc 與部分 markdown-it 設定另外提供 ^文字^ 與 ~文字~,但下標寫法會跟單一波浪號的刪除線打架,共用的檔案裡最好避開。
E = mc<sup>2</sup>,還有 H<sub>2</sub>O
所有強調語法與支援範圍
下表列出每一種符號、它產生的 HTML,以及看得懂它的平台。
| 語法 | 結果 | HTML | 支援範圍 |
|---|---|---|---|
**粗體** | 粗體 | <strong> | 所有平台 |
__粗體__ | 粗體 | <strong> | 幾乎所有平台,但 Discord 會變底線 |
*斜體* | 斜體 | <em> | 所有平台 |
_斜體_ | 斜體 | <em> | 所有平台,但不能用在單字中間 |
***粗斜*** | 粗斜 | <strong><em> | 所有平台 |
**_粗斜_** | 粗斜 | <strong><em> | 所有平台,原始碼最好讀 |
~~刪除~~ | <del> | GFM、GitLab、Discord、Reddit、Obsidian、Notion | |
~刪除~ | <del> | GFM 與 Slack;在 Pandoc 裡是下標 | |
==標記== | 標記 | <mark> | Obsidian、Typora、MkDocs Material;GitHub 原樣顯示 |
<mark>標記</mark> | 標記 | <mark> | 任何允許行內 HTML 的地方 |
<u>底線</u> | 底線 | <u> | 任何允許行內 HTML 的地方;Markdown 沒有對應語法 |
<sup>2</sup> | x2 | <sup> | GitHub、GitLab 與多數網站產生器 |
^2^ 與 ~2~ | x2、H2O | <sup> <sub> | Pandoc 與 markdown-it 外掛;GitHub 原樣顯示 |
un*frig*believable | unfrigbelievable | <em> | 所有平台;換成底線則完全沒作用 |
snake_case_words | snake_case_words | 純文字 | CommonMark 與 GFM;部分老引擎會變斜體 |
中日韓文字的強調問題
最常聽到的抱怨是 **粗體** 有時候不會生效。這不是字型問題,也不是編輯器有 bug,而是 CommonMark 的一條規則遇上了全形標點。
單純的中文粗體沒問題
簡單的情況在任何現代 CommonMark 或 GFM 解析器上都正常,整行完全不留空格也可以:
這是**粗體**文字 -> 正常變粗體
加了引號為什麼就失敗
CommonMark 是看符號兩側各是什麼字元,來決定它能不能開啟或結束強調。「內側是標點、外側是文字」的組合,兩件事都不准做。全形引號正是標點,所以會變成這樣:
他說**「這樣」**才對 -> 星號原樣印出來
他說「**這樣**」才對 -> 正常變粗體
這兩行在編輯器裡幾乎看不出差別,變的只有引號的位置,而這就是「粗體正常」與「四個星號裸奔」之間的全部差距。
三種修法,由好到差
- 把標點移到符號外面。寫
「**這樣**」,不要寫**「這樣」**。其他什麼都不用改,句子讀起來也一樣。 - 在開頭符號前加一個空格。有效,但會改變中文句子的間距,多數編輯台不會接受。
- 退回原始 HTML。只要允許行內 HTML,
<strong>「這樣」</strong>永遠有效。
中文用底線失敗的機率更高
有些引擎把中日韓文字當成單字字元,於是 __粗體__ 緊貼著前後文時,就被看成單字中間的強調,而底線本來就不准這樣做。比較舊的中文部落格系統是常見的犯人。
注意:最保險的組合是「用 ** + 標點放在符號外面 + 發佈前先預覽」。本站編輯器渲染中文的方式與 GitHub 一致,你看到的就是讀者看到的。用中文寫作的人也會想順便看一下連結參考裡的全形括號陷阱,那是同一個問題換了一個元素。
常見錯誤與修正寫法
幾乎所有渲染不出來的強調,都出在這六個錯誤:
- 符號內側有空格,符號因此無法開啟或結束。
- 在單字中間用底線,CommonMark 根本不視為強調。
- 符號數量不對稱,星號留在畫面上。
- 用粗體代替標題,沒有大綱條目也沒有錨點。
- 在不支援延伸語法的地方用刪除線。
- 讓強調去做結構的工作,結果什麼都沒突顯。
空格與不對稱的符號
錯誤寫法與正確寫法:
** 重要 **通知
**重要**通知
兩個開頭符號配一個結尾符號,星號會留在畫面上,而且常常把後面整句一起吃掉。錯誤寫法與正確寫法:
**注意:API key *是必填的。
**注意:**API key *是*必填的。
在單字中間用底線
什麼都不會發生,因為底線無法在單字中間開啟強調。錯誤寫法,以及改用星號的正確寫法:
re_start_ the service
re*start* the service
該用標題的地方用了粗體
粗體那一行看起來像標題,行為上卻什麼也不是。錯誤寫法與正確寫法:
**設定**
### 設定
用強調代替結構
一段裡放六個粗體片語,等於什麼都沒強調。一個概念挑一個詞加粗;內容真的是條列就用清單,真的是引述就用引言區塊。
刪除線也屬於同一類問題。如果波浪號原樣印出來,那個渲染器就是純 CommonMark,改用 <del>已取代</del>,或先查GFM 參考確認平台支援哪些語法。
強調怎麼都不生效時的除錯法
把那一行貼進編輯器,一個字元一個字元刪到它正常為止,元凶幾乎都是一個空格或一個沒配對的符號。
語法速查表把這些全部濃縮在一頁,Markdown 完整指南把強調放回其他元素之間,Markdown 是什麼則解釋了這個格式為何堅持讓格式標記本身也保持好讀。
相容性資料驗證日期
常見問題
Markdown 粗體該用星號還是底線?
用星號。**粗體** 與 __粗體__ 產生的 HTML 完全相同,但底線無法在單字中間強調、會跟 snake_case 這類識別字打架,而且在 Discord 上 __文字__ 代表底線而非粗體。星號可以一次避開這三個問題。
為什麼我的 Markdown 粗體沒有生效?
多半是符號內側有空格:** 粗體 ** 會把星號原樣印出來,**粗體** 才正確。其他原因是符號沒有配對,以及在單字中間使用底線,那種情況 CommonMark 根本不會視為強調。
粗體和斜體要怎麼同時使用?
兩側各放三個符號:***粗斜體***。混用寫成 **_粗斜體_** 渲染結果一模一樣,但原始碼好讀得多,在 diff 裡數星號時差別很明顯。
刪除線在所有平台都能用嗎?
不行。~~文字~~ 是 GitHub 風格 Markdown 的延伸語法,不屬於原始 Markdown 也不在 CommonMark 核心裡。GitHub、GitLab、Discord、Reddit、Obsidian 與多數筆記軟體都支援,嚴格的 CommonMark 渲染器則會把波浪號印出來,這時改用 <del>文字</del>。
為什麼中文字有時候不會變粗體?
因為 CommonMark 是看符號兩側的字元來判斷它能不能開啟或結束強調,全形標點緊貼在符號內側就會擋住。他說**「這樣」**才對 失敗,他說「**這樣**」才對 則正常。把標點移到符號外面,或改用 <strong>。
Markdown 可以做彩色文字嗎?
不行。純 Markdown 完全沒有表示顏色的語法,因為它只標記結構,外觀交給渲染器的樣式表決定。變通做法是內嵌 HTML:<span style="color:red">文字</span>,在部分編輯器與靜態網站產生器裡確實有效。但在 GitHub 上就是不會生效,因為 GFM 基於安全會濾掉 style 屬性;README 裡想強調重點,只能改用粗體、表情符號,或 GFM 的警示框。
Markdown 要怎麼把文字置中?
Markdown 同樣沒有置中語法,答案還是內嵌 HTML:把文字包在 <p align="center"> 或 <div align="center"> 裡面。GitHub 允許 align 屬性(不像行內 style 會被濾掉),所以很多 README 都用這招把 Logo 和徽章置中。標籤上下記得各留一行空行,另外部分解析器會忽略區塊級 HTML 元素內部的 Markdown 語法,這條規則在完整指南裡有詳細說明。
Markdown 的刪除線要怎麼打?
在文字前後各加兩個波浪號,例如 ~~這段文字有刪除線~~。語法就這麼多,句子中間、清單項目裡、表格儲存格裡都能用。要留意的是刪除線屬於 GitHub 風格 Markdown 的延伸語法,原始 Markdown 和 CommonMark 都沒有收錄,所以在嚴格的解析器上只會把波浪號印出來,什麼線也不會畫。
延伸閱讀
立即使用編輯器
立即使用編輯器