Markdown 标题语法
ATX 与 Setext 两种标题写法、空格与闭合序列等解析规则、层级规划与目录生成。
认知导入(Layer 0 生存层) 前置知识:无需前置,直接开始。 边界说明:学完本节你能写出层级分明的标题;学不会,后续所有文档的结构都会乱。 强制练习:打开编辑器输入
# 你好和## 小节,观察标题大小;再把#后面的空格删掉,观察标题是否失效——空格是语法的一部分。
1. 两种标题风格
Markdown 支持两种标题写法:ATX 风格(用 #)与 Setext 风格(用下划线行)。ATX 是主流写法,Setext 偶尔见于手写文档。
1.1 ATX 风格(井号标题)
# 的数量对应标题级别,共六级:
# 一级标题(对应 HTML h1)
## 二级标题(对应 HTML h2)
### 三级标题(对应 HTML h3)
#### 四级标题(对应 HTML h4)
##### 五级标题(对应 HTML h5)
###### 六级标题(对应 HTML h6)
Markdown 没有七级标题:再多写井号(#######)不会被识别为标题,会按普通段落渲染。
1.2 Setext 风格(下划线标题)
在标题文本的下一行写一串 = 或 -,分别对应一级和二级标题:
一级标题(下一行写等号)
=====
二级标题(下一行写短横线)
-----
Setext 只支持两级,且下划线行的长度不必与文本一致(一个字符也可以)。但要注意一个高频陷阱:- 下划线紧跟在普通段落文本之后时,会被解析成 Setext 二级标题而不是别的元素。例如:
Hello
---
渲染出来是二级标题 “Hello”,而不是一条水平分隔线。想要分隔线,必须在上文与 --- 之间留一个空行(空行后 --- 才是水平线)。
2. ATX 标题的解析规则
2.1 井号后必须有空格
# 与标题文本之间的空格是语法的一部分:
# 正确写法(井号后有空格)
#错误写法(井号后无空格,按普通文本渲染)
个别渲染器(如某些编辑器插件)对无空格写法宽容,但 CommonMark/GFM 均要求空格,跨平台写作一律加上。
2.2 可选的闭合序列
ATX 标题允许在末尾写一串井号”闭合”,渲染时会被剥离:
## 二级标题 ##
渲染为二级标题”二级标题”。闭合序列的规则有三条:
- 闭合井号前必须有空格:
## 二级标题##中的尾部井号属于标题文本,不会被剥离。 - 闭合序列之后只能有空白:
## 标题 ## 注释不是标题。 - 闭合井号数量不必与开头相同:
# 标题 ###合法。
2.3 层级数量与缩进
- 前导空格最多 3 个,
# 标题仍是标题;4 个及以上会变成代码块。 - 井号数量超过 6(如
#######)不构成标题。 - 标题可以打断段落(中间不需要空行),但推荐标题前后保留空行,源码更易读。
2.4 三个易漏的边界
井号后跟数字不是标题。CommonMark 要求 # 之后必须是空格或行尾,#5 号更新 会按普通文本渲染——写话题标签式内容时留意。
#5 号更新 <!-- 不是标题,是普通文本 -->
# 5 号更新 <!-- 井号后有空格,是一级标题 -->
空标题合法。##(只有井号)会渲染出一个空的 <h2>,不报错但污染文档大纲,提交前应清理。
标题文本内可以放行内格式。代码、加粗、链接都能出现在标题里,并参与锚点生成(这会让自动锚点变得难看,命名时尽量用纯文本):
## 使用 `npm run` 脚本 <!-- 标题里含行内代码 -->
3. Setext 标题的补充规则
Setext 下划线(= 或 - 行)有三条容易被忽略的规则:
- 下划线行可以缩进 1-3 空格,与 CommonMark 的块级前导空格规则一致;
- 文本行不能是”懒延续”的段落:如果上一行是列表项或引用的延续内容,
---会被优先解析为该结构的组成部分而非标题下划线; =行几乎无歧义,-行歧义最大(与列表标记、分隔线共用字符),所以实践中 Setext 基本只用=写一级标题,或干脆不用 Setext。
4. 渲染效果对照
| 源码 | 渲染结果 | HTML 对应 | 典型用途 |
|---|---|---|---|
# 标题 | 最大的标题 | <h1> | 文档主标题 |
## 标题 | 大标题 | <h2> | 主要章节 |
### 标题 | 中标题 | <h3> | 子章节 |
#### 标题 | 小标题 | <h4> | 更细分节 |
##### 标题 | 更小标题 | <h5> | 少用 |
###### 标题 | 最小标题 | <h6> | 少用 |
同一个文档实际渲染效果:
# Markdown 标题语法
## ATX 风格
### 基本写法
预览时会看到从大到小的三级字号;多数平台还会根据标题自动生成目录锚点(见 markdown/200-AutoTOC)。
5. 标题层级规划
5.1 使用原则
- 一级标题只用一次:作为文档主标题。GitHub 的 README、本站的教程页都遵循这一惯例;部分文档平台(如 MkDocs)甚至要求正文从二级标题开始。
- 逐级递进,不跳级:
##之下接###,不要从##直接跳到####。跳级会破坏文档大纲(outline),影响屏幕阅读器导航与自动目录的层级结构。 - 不依赖标题控制字号:标题是结构语义,不是视觉字号。觉得
###太大就去改样式,而不是改用#####凑合。
5.2 命名建议
- 简洁、名词或动宾短语优先,长度控制在单行以内。
- 同一文档内标题风格一致(全部中英混排或全部中文)。
- 标题文本会成为页内锚点的一部分,命名时考虑链接引用(详见
markdown/190-AnchorLinks)。
6. 常见问题与排查
6.1 标题不生效
#后缺少空格(最常见);- 行首缩进达到 4 个空格,整行被识别为代码块;
- 井号数量超过 6 个。
6.2 --- 变成了标题
上文段落与 --- 之间没有空行,--- 被解析为 Setext 二级标题下划线。在两者之间插入空行即可恢复”水平分隔线”语义。
6.3 目录里出现乱码或重复
标题含代码、标点或重复文本时,自动锚点会做转换或追加序号,导致目录链接与预期不同。排查与规避见 markdown/190-AnchorLinks。
6.4 文档大纲出现空层级或跳级
空标题(只有井号)与跳级(## 下直接 ####)都会让文档大纲(outline)出现空洞或断层,屏幕阅读器与自动目录最受影响。提交前的自检清单:唯一 H1、无空标题、层级逐级递进。
小结
- 初学者要点:日常写作只需要
#到###三级;#后必须加空格;一级标题全文一次;层级逐级递进。 - 进阶注意:ATX 支持可选闭合序列(
## 标题 ##),闭合前必须有空格;Setext 只有两级,且段落文本后的---会变成 Setext 标题而不是分隔线;标题是结构语义,勿用它调字号。