加载中...

加载中...

本文覆盖主题启用的全部 16 个 markdown-it 插件。每个插件都按同一条学习路径组织:最小示例 → 常用变体 → 全部写法 → 参数与选项 → 边界与坑。所有示例都是「效果在前、源码在后」成对出现——看到什么就能立刻知道怎么写的。

插件注册位置:根 _config.yml 的 markdown.plugins;渲染配置(breaks / linkify / typographer / html)在同文件 markdown.render。


1. emoji 表情(markdown-it-emoji)

用途:在 Markdown 正文里用短代码写 emoji,不必依赖输入法。

学习路径:最小示例 → 常用变体 → 全部写法 → 参数与选项 → 边界与坑

1.1 最小示例

效果:😄

对应源码:

:smile:

两个冒号夹住短代码名,解析后就是 emoji 字符本身。

1.2 常用变体

效果:❤️ 🚀 👍

对应源码:

:heart: :rocket: :+1:

符号类短代码同样支持,+1 / -1 这种带符号的名字也能用。

效果:✅

对应源码:

:white_check_mark:

多词短代码用下划线连接,不用连字符。

效果:中文😄中文

对应源码:

中文:smile:中文

冒号两侧无需空格,紧贴中文也能转换。

1.3 全部写法

写法渲染结果说明
:smile:😄标准短代码,最常用
:heart: :rocket: :+1:❤️ 🚀 👍符号类短代码同样支持(+1/-1 这类带符号名也可以)
:white_check_mark:✅多词短代码用下划线连接
直接输入 😄😄Unicode 字符原样输出,不经过插件
中文紧邻 中文:smile:中文中文😄中文无需空格

1.4 参数与选项

插件以裸 use() 启用,无 options:整套 shortcode 表全量注册,无法按需裁剪白名单。

输出就是纯 emoji 字符(不额外包 <span>),所以样式完全由系统 emoji 字体决定。

1.5 边界与坑

情况行为
:foo: 非标准短代码原样输出字面量 :foo:,不报错
写在行内代码里 `:smile:`不转换(代码内容受保护)
短代码缺尾冒号 :smile不转换
中文紧邻 中文:smile:中文正常转换,冒号两侧无需空格
在代码块里写不转换

1.6 小结

  • 记不住短代码名就直接输入 emoji 字符,效果一样
  • 多词名一律下划线:white_check_mark,不是 white-check-mark
  • 想禁用某个短代码做不到——插件不支持白名单

测试断言:页面含 emoji 渲染字符(如 😄 ✅)。


2. 缩写 abbr(markdown-it-abbr)

用途:给缩写词挂全称,鼠标悬停时显示。

学习路径:最小示例 → 常用变体 → 全部写法 → 参数与选项 → 边界与坑

2.1 最小示例

效果:

W3C 制定 Web 标准。

对应源码:

*[W3C]: World Wide Web Consortium
W3C 制定 Web 标准。

定义行 *[缩写]: 全称 独占一行,紧随其后的正文里同名缩写自动带虚线。

2.2 常用变体

效果:HTML 定义结构,CSS 定义表现。

对应源码:

*[HTML]: Hyper Text Markup Language
*[CSS]: Cascading Style Sheets
HTML 定义结构,CSS 定义表现。

多行定义连续写即可,一次定义全文生效。

效果:同一缩写出现两次:HTML 与 HTML。

对应源码:

*[HTML]: Hyper Text Markup Language
同一缩写出现两次:HTML 与 HTML。

正文里每一处都会加 abbr,只需定义一次。

2.3 全部写法

写法渲染结果说明
*[HTML]: Hyper Text Markup Language<abbr title="Hyper Text Markup Language">HTML</abbr>定义行,独占一行
连续多行定义多个缩写同时生效每行一个
正文多次出现同一缩写每一处都加 abbr全文生效
定义行写在正文之后同样生效插件先收集全部定义再替换(实测)

2.4 参数与选项

  • 定义行格式固定:*[缩写]: 全称,冒号后可带空格
  • 缩写区分大小写:定义了 HTML 不会匹配小写 html
  • 定义行位置不影响效果:插件在 block 解析阶段先收集全部定义,写在正文之后同样生效

2.5 边界与坑

情况行为
定义行与正文写在同一行 *[API]: …* API整行被当成定义吞掉,正文丢失(实测渲染为空)
大小写不一致 html不加 abbr,保持原文
缩写含空格或特殊符号不支持,按普通文本处理
HTTP 与 HTTPS 同时存在按整词匹配,需分别定义
在代码块 / 行内代码里不替换

2.6 小结

  • 定义行一定单独一行,别和正文挤在一起
  • 大小写敏感,HTML ≠ html
  • 定义放文末也行,位置无所谓

测试断言:页面含 <abbr 标记。


3. 脚注 footnote(markdown-it-footnote)

用途:正文挂角标,注释集中排到文末。

学习路径:最小示例 → 常用变体 → 全部写法 → 参数与选项 → 边界与坑

3.1 最小示例

效果:Hexo 是一个快速静态博客框架[^hexo]。

对应源码:

Hexo 是一个快速静态博客框架[^hexo]。

[^hexo]: Hexo 官网:https://hexo.io

正文写 [^标签],任意位置写 [^标签]: 内容,自动生成角标 + 文末脚注列表 + 回链箭头。

3.2 常用变体

效果:数字标签也行[1],命名标签也行[named]。

对应源码:

数字标签也行[^1],命名标签也行[^named]。

[^1]: 数字标签的脚注。
[^named]: 命名标签的脚注,标签可以是任意单词。

标签只是配对用的标识,渲染出来的序号按出现顺序自动排。

效果:同一脚注引用两次:第一处[dup],第二处[dup]。

对应源码:

同一脚注引用两次:第一处[^dup],第二处[^dup]。

[^dup]: 只有一条定义,但两个回链。

第二次起自动加后缀([1:1]),文末脚注项会带两个 ↩ 回链。

3.3 全部写法

写法渲染结果说明
正文[^1] + [^1]: 内容上标 [1]数字脚注,编号按出现顺序
正文[^note] + [^note]: 内容上标 [2]命名脚注,标签可为任意单词
同一脚注多次引用首次 [1],之后 [1:1]第二次起自动加后缀
定义行缩进续行多段脚注内容续行缩进 4 空格即并入同一脚注

3.4 参数与选项

插件无 options。脚注列表自动追加到文末(<hr> + <section class="footnotes">),每条的回链箭头(↩)自动生成,无需手写。

3.5 边界与坑

情况行为
有引用无定义 [^x]原样输出 [^x],不报错
有定义无引用不渲染到文末,定义被丢弃
定义行位置可集中写在文末(推荐),不必紧跟引用处
引用写在代码块 / 行内代码内不解析
标签大小写视为不同标签,需一致

3.6 小结

  • 标签用有意义的名字([^hexo])比数字好维护
  • 定义统一堆文末,别散落在正文中间
  • 一稿多引没问题,回链自动生成

测试断言:页面含 footnote 相关标记(<sup 或 footnotes)。


4. 插入文本 ins(markdown-it-ins)

用途:++插入文本++ 渲染为下划线插入效果(修订标记语义)。

学习路径:最小示例 → 常用变体 → 全部写法 → 参数与选项 → 边界与坑

4.1 最小示例

效果:这是 插入的内容。

对应源码:

这是 ++插入的内容++。

4.2 常用变体

效果:本次更新 新增了暗色模式 支持。

对应源码:

本次更新 ++新增了暗色模式++ 支持。

内容是中文短语也照常工作,只要在同一行内闭合。

效果:多词 含空格

对应源码:

++多词 含空格++

和 ~ / ^ 不同,++ 允许内容含空格。

4.3 全部写法

写法渲染结果说明
++文本++<ins>文本</ins>唯一写法,无其他变体
++多词 含空格++<ins>多词 含空格</ins>内容可含空格

4.4 参数与选项

插件无 options;<ins> 的样式(下划线/颜色)由主题 CSS 决定,与语法无关。

4.5 边界与坑

情况行为
未闭合 ++文本原样输出,不报错
跨行书写(++ 分处两行)不匹配,原样输出
写在行内代码里 `++x++`不转换
与 ==高亮== 叠加 ++==内容==++允许,但嵌套顺序不同会得到不同 HTML,建议分开写

4.6 小结

  • 唯一写法 ++…++,没有 ~~ 那种双字符变体
  • 必须同一行闭合

测试断言:页面含 <ins 标记。


5. 下标 sub(markdown-it-sub)

用途:~下标~ 渲染为下标,用于化学式、变量下标。

学习路径:最小示例 → 常用变体 → 全部写法 → 参数与选项 → 边界与坑

5.1 最小示例

效果:H2O 是水的化学式。

对应源码:

H~2~O 是水的化学式。

5.2 常用变体

效果:CO2 是二氧化碳。

对应源码:

CO~2~ 是二氧化碳。

效果:word 这种单词下标也可以。

对应源码:

~word~ 这种单词下标也可以。

5.3 全部写法

写法渲染结果说明
H~2~OH<sub>2</sub>O单个 ~ 包裹
~word~<sub>word</sub>单词下标
~多词短语~(含空格)不转换内容不能含空格(实测 ~a b~ 原样输出)

5.4 参数与选项

插件无 options。注意:单个 ~ 由本插件处理,~~ 属于另一套规则(删除线)。

5.5 边界与坑

情况行为
~~删除线~~渲染为 <s> 删除线(markdown-it 内置 strikethrough),不是 sub
~text~ 内含空格不转换
单侧 ~ 未闭合原样输出
与数学公式混排 $a_i$用数学语法写上下标更稳,避免 ~/^ 冲突

5.6 小结

  • 单个 ~ 是下标,两个 ~~ 是删除线,别混
  • 下标内容不能含空格

测试断言:页面含 <sub 标记。


6. 上标 sup(markdown-it-sup)

用途:^上标^ 渲染为上标,用于指数、单位。

学习路径:最小示例 → 常用变体 → 全部写法 → 参数与选项 → 边界与坑

6.1 最小示例

效果:E=mc2 是质能方程。

对应源码:

E=mc^2^ 是质能方程。

6.2 常用变体

效果:210 = 1024。

对应源码:

2^10^ = 1024。

效果:x2 + y2 = z2(同一行多次使用)

对应源码:

x^2^ + y^2^ = z^2^(同一行多次使用)

6.3 全部写法

写法渲染结果说明
E=mc^2^E=mc<sup>2</sup>单个 ^ 包裹
^n^<sup>n</sup>单词上标
x^2^ + y^2^两处上标同一行可多次使用

6.4 参数与选项

插件无 options;上标字号由主题 CSS(sup 样式)控制。

6.5 边界与坑

情况行为
内容含空格 ^a b^不转换
未闭合 ^2原样输出
写在行内代码里 `^2^`不转换
表格里写 ^^(合并标记)正文中无意义,表格合并请见 §9

6.6 小结

  • ^…^ 内容不能含空格(和 ++ 不同)
  • 表格里的 ^^ 是合并语法,与上标无关

测试断言:页面含 <sup 标记。


7. 高亮 mark(markdown-it-mark)

用途:==高亮== 渲染为荧光笔高亮。

学习路径:最小示例 → 常用变体 → 全部写法 → 参数与选项 → 边界与坑

7.1 最小示例

效果:这是 重点内容。

对应源码:

这是 ==重点内容==。

7.2 常用变体

效果:请特别注意 密码安全。

对应源码:

请特别注意 ==密码安全==。

效果:多词 含空格 同样有效。

对应源码:

==多词 含空格== 同样有效。

7.3 全部写法

写法渲染结果说明
==重点内容==<mark>重点内容</mark>唯一写法
==多词 含空格==<mark>多词 含空格</mark>内容可含空格

7.4 参数与选项

插件无 options;高亮底色由主题 CSS 决定,改色改 mark 样式而非语法。

7.5 边界与坑

情况行为
未闭合 ==重点原样输出
空内容 ====不生成 mark,原样输出
跨行书写不匹配(需同一行)
写在行内代码里不转换

7.6 小结

  • ==…== 允许空格,比 ~/^ 宽松
  • 必须同一行闭合,空内容不生效

测试断言:页面含 <mark 标记。


8. 任务列表 task-checkbox(markdown-it-task-checkbox)

用途:- [x] / - [ ] 渲染为只读复选框列表。

学习路径:最小示例 → 常用变体 → 全部写法 → 参数与选项 → 边界与坑

8.1 最小示例

效果:

对应源码:

- [x] 已完成任务
- [ ] 未完成任务

8.2 常用变体

效果:

对应源码:

- [x] 主题测试文章创建
- [x] 自动化测试脚本
- [ ] 视觉回归验证

效果(嵌套 + 行内语法):

对应源码:

- [ ] 父级任务 **加粗** :rocket:
  - [x] 子任务一
  - [ ] 子任务二

复选框后的内容仍走 inline 解析:粗体、emoji、行内代码都能用。

8.3 全部写法

写法渲染结果说明
- [ ] 未完成空复选框方括号内一个空格
- [x] 已完成勾选复选框小写 x
嵌套:- [ ] 父 + 缩进 - [x] 子二级任务列表子项需缩进 2 空格
- [ ] **粗体** :emoji:行内语法正常生效复选框后的内容仍走 inline 解析

8.4 参数与选项

插件裸启用、无 options,但它默认给 checkbox 写入 disabled:渲染为 <input type="checkbox" disabled>,并给 <li> 加 task-list-item 类、给 <ul> 加 task-list 类。

8.5 边界与坑

情况行为
复选框能点吗不能:disabled 只读展示,点击无效果
勾选状态会保存吗不会:纯静态 HTML,刷新页面即还原
[x] 前面不是列表标记 正文 [x]不转换,按普通文本处理
中间态 [-]不识别,按普通文本处理
大写 [X]实测同样渲染为勾选(大小写不敏感)

8.6 小结

  • 只读展示,别指望读者能勾
  • 想保存进度就得用真正的待办服务,静态站做不到

测试断言:页面含 task-list-item 或 checkbox 标记。


9. 表格增强 multimd-table(markdown-it-multimd-table)

用途:在标准表格语法上追加对齐、行合并、列合并、表题。

学习路径:最小示例 → 对齐 → 行合并 → 列合并 → 表题 → 全部写法 → 参数与选项 → 边界与坑

9.1 最小示例

效果:

左对齐居中右对齐
abc

对应源码:

| 左对齐 | 居中 | 右对齐 |
| :----- | :--: | -----: |
| a | b | c |

冒号位置决定对齐::--- 左、:--: 中、---: 右。

9.2 常用变体

效果(行合并,^^ 表示与上一行合并):

组项状态
A基础✅
高级✅
B实验⚠️

对应源码:

| 组 | 项 | 状态 |
| :--- | :--- | :--- |
| A | 基础 | ✅ |
| ^^ | 高级 | ✅ |
| B | 实验 | ⚠️ |

需要 rowspan: true(本项目已开启),且 ^^ 必须在有上一行的连续行里。

效果(列合并,留空单元格向右跨列):

模块说明备注
表格
图片单列正常

对应源码:

| 模块 | 说明 | 备注 |
| :--- | :--- | :--- |
| 表格 | 跨两列 ||
| 图片 | 单列 | 正常 |

效果(表题,表格下方单独一行 [标题]):

常用插件一览
插件类型状态
emoji行内✅
footnote行内✅
mathjax3块级✅

对应源码:

| 插件 | 类型 | 状态 |
| :---- | :--- | :--- |
| emoji | 行内 | ✅ |
| footnote | 行内 | ✅ |
| mathjax3 | 块级 | ✅ |

[常用插件一览]

表题渲染为 <caption> 且靠下(caption-side: bottom),空行隔开后归属上一张表。

9.3 全部写法

写法渲染结果说明
| :--- | :--: | ---: |左 / 居中 / 右对齐分隔行里的冒号位置决定对齐
| ^^ |<td rowspan="2">行合并:^^ 表示「与上一行合并」(需 rowspan: true)
| 跨列 ||<td colspan="2">列合并:留空单元格即向右跨列
表格下方一行 [表格标题]<caption>表题,渲染在表格下方
表头行 + 分隔行普通表格第一行恒为表头(headerless 未启用)
单元格内 \|字面竖线需转义为 \\|

9.4 参数与选项

选项本项目值作用
rowspantrue启用 ^^ 行合并
colspantrue(默认)启用空单元格跨列
multilinefalse(默认)单元格内多行未启用
headerlessfalse(默认)无表头表格未启用

想用单元格内多行,得在 markdown.plugins 里把该项选项改成 multiline: true 再 clean 构建。

9.5 边界与坑

情况行为
行与行之间插空行再写 ^^合并失效:被当成新表格,生成第二个 <tbody>,^^ 原样显示
单元格内换行写多行multiline 未启用,换行被拆成新的一行
^^ 出现在表体第一行无上一行可合并,原样显示 ^^
某行少一列 / 多一列缺列补空,多余列被丢弃
单元格里要写字面 \|需转义为 \\|
表题与表格之间插空行仍归属上一张表(但多表连排时容易错认,建议紧贴)

9.6 小结

  • 对齐靠分隔行冒号,行合并靠 ^^,列合并靠留空
  • ^^ 不能隔空行,否则合并失效
  • 表题写在表格下方,用 [标题]

测试断言:页面含 <table 标记。


10. 图片尺寸 imsize(markdown-it-imsize)

用途:用 =宽x高 控制图片显示尺寸,编译期写进 <img> 的 width/height。

学习路径:最小示例 → 只定宽/只定高 → 百分比 → 全部写法 → 参数与选项 → 边界与坑

10.1 最小示例

效果:

封面

对应源码:

![封面](https://blog.17lai.site/medias_webp/cover/hexo.webp =200x100)

尺寸串挂在 URL 之后,与 URL 用空格分隔。

10.2 常用变体

效果(只定宽,高度按比例自适应):

封面-只定宽

对应源码:

![封面-只定宽](https://blog.17lai.site/medias_webp/cover/hexo.webp =240x)

效果(只定高,宽度按比例自适应):

封面-只定高

对应源码:

![封面-只定高](https://blog.17lai.site/medias_webp/cover/hexo.webp =x80)

效果(百分比宽度,必须带 x):

封面-百分比

对应源码:

![封面-百分比](https://blog.17lai.site/medias_webp/cover/hexo.webp =30%x)

10.3 全部写法

写法渲染属性说明
![alt](url =300x200)width="300" height="200"宽 + 高
![alt](url =300x)width="300"只定宽,高度自适应
![alt](url =x200)height="200"只定高,宽度自适应
![alt](url =50%x)width="50%"百分比宽度,必须带 x
![alt](url =50%x200)width="50%" height="200"百分比宽 + 固定高

10.4 参数与选项

  • 尺寸串挂在 URL 之后,与 URL 用空格分隔:![alt](图片地址 =宽x高)
  • 无插件级 options,写法即参数
  • 百分比必须写成 =50%x(带 x 占位),裸 =50% 不识别

10.5 边界与坑

情况行为
只写 =50%(不带 x)不生效,图片语法整段原样输出(实测)
只写 =300(不带 x)不识别,原样输出
想同时加 title =300x200 "标题"不支持,整段原样输出(实测)
URL 与尺寸间漏空格 url=300x200不识别
尺寸写在 alt 里无效,必须是 URL 之后的独立参数

与 imgsize.js 的区别:markdown-it-imsize 是 Markdown 渲染插件,在编译阶段处理 =宽x高 语法并写入 <img> 标签的 width/height 属性;主题另有 scripts/events/lib/imgsize.js 脚本,在运行时为未手动指定尺寸的 <img> 注入真实宽高(本地同步读取/网络异步拉取),防 CLS。两者协作:手动指定的尺寸由 imsize 插件处理,未指定的由 imgsize.js 兜底。

10.6 小结

  • 两个数字用 x 连,缺哪个就空着:=300x、=x200
  • 百分比必须带 x:=50%x,裸 =50% 会整段失效
  • 别在尺寸后加 title,插件不认

测试断言:页面含 img 且带尺寸属性。


11. 容器 container(markdown-it-container)

用途:::: 类型 渲染带语义色的提示容器(Markdown 层,不是 tag 插件)。

学习路径:最小示例 → 常用类型 → 全部写法 → 参数与选项 → 与 note 的区别 → 边界与坑

11.1 最小示例

效果:

这是 warning 容器。

对应源码:

::: warning
这是 warning 容器。
:::

开始与结束标记各占一行,容器名只能用白名单里的 7 个。

11.2 常用类型

效果:

这是 tip 容器(蓝色,与 info 同义)。

对应源码:

::: tip
这是 tip 容器(蓝色,与 info 同义)。
:::

效果(多段内容,空行不结束容器):

第一段说明。

第二段仍在同一容器内。

对应源码:

::: note
第一段说明。

第二段仍在同一容器内。
:::

11.3 全部写法

写法渲染结果说明
::: warning … :::<div class="warning">开始/结束标记各占一行
::: note … :::<div class="note">同上,7 个名字任选
内容多段(段间空行)多段落在同一容器内空行不结束容器

11.4 参数与选项

本项目注册的 7 个容器名(其余名字不识别):

容器名语义色备注
warning黄 / 警示
note蓝 / 说明
info蓝 / 信息
tip蓝 / 技巧与 info 同义
hint蓝 / 提示与 info 同义
attention紫 / 注意
error红 / 错误

无标题参数:::: tip 容器标题 里的「容器标题」会被丢弃(实测只渲染 <div class="tip"><p>内容</p></div>),需要标题请改用 §19 admon 或 {% note %} 标签。

11.5 与 note 标签的区别

{% note primary 说明 %}
正文
{% endnote %}
维度::: name 容器note 标签
实现层markdown-it-container(Markdown 渲染阶段)主题 tag 插件(Markdown 渲染之前)
产出 HTML<div class="warning"><div class="note primary">
支持标题❌ 会被丢弃✅ 支持 title 参数
支持图标/折叠❌✅
写在代码块内不解析不解析

11.6 边界与坑

情况行为
名字不在 7 个白名单内 ::: custom不识别,原样输出 ::: custom
在名字后加标题标题被丢弃,只剩容器
容器嵌套容器不可靠:实测外层被提前闭合,并残留多余的 ::: 段落
开始/结束标记与其他文字同行不识别
只写开始不写结束容器延伸到文末(吞掉后续内容)

11.7 小结

  • 想无脑用就记 warning / note / info 三个
  • 要标题、要图标、要折叠 → 用 {% note %},不要在 ::: 上折腾
  • 别嵌套 :::,会出错

测试断言:页面含 note warning 容器标记。


12. 定义列表 deflist(markdown-it-deflist)

用途:术语 + 描述的结构化列表(<dl>/<dt>/<dd>)。

学习路径:最小示例 → 多定义 → 全部写法 → 参数与选项 → 边界与坑

12.1 最小示例

效果:

Markdown
轻量级标记语言。
由 John Gruber 于 2004 年创建。

对应源码:

Markdown
: 轻量级标记语言。

术语行与 : 定义 行之间不能有空行,冒号后要一个空格。

12.2 常用变体

效果(一个术语多条定义):

Hexo
快速、简洁且高效的博客框架。
基于 Node.js 编写。

对应源码:

Hexo
: 快速、简洁且高效的博客框架。
: 基于 Node.js 编写。

效果(定义内可用行内语法):

Node.js
支持 JavaScript 与 npm 生态。

对应源码:

Node.js
: 支持 **JavaScript** 与 `npm` 生态。

12.3 全部写法

写法渲染结果说明
术语 + 换行 + : 定义<dt> + <dd>最简形式
同一术语多个 : 定义一个 <dt> + 多个 <dd>一术语多定义
多个术语连续书写自动分组无需空行也能连续
定义内写行内语法正常解析: 支持 **粗体** 与 \代码``

12.4 参数与选项

插件无 options。要求:术语行与 : 定义 行之间不能有空行,冒号后需一个空格。

12.5 边界与坑

情况行为
术语与定义之间插空行断成两个段落,定义不生效
冒号后无空格 :定义不识别,按普通文本处理
定义跨多行续行需缩进,否则被判为新段落
与表格/脚注相邻无空行可能被并入上一个块,建议块间留空行

12.6 小结

  • 术语行、: 定义 行必须紧贴,中间不能空行
  • 一个术语可以挂多条定义

测试断言:页面含 <dl / <dt / <dd> 标记。


13. 数学公式 mathjax3(markdown-it-mathjax3)

用途:编译期把 LaTeX 渲染成 SVG(SSR,无前端 JS 依赖)。

学习路径:行内 → 块级 → 全部写法 → 参数与选项 → 边界与坑

13.1 行内公式

效果:质能方程 E=mc2是最著名的物理公式之一。

对应源码:

质能方程 $E=mc^2$ 是最著名的物理公式之一。

单个 $ 包裹,与文字同排;内部不能换行。

13.2 块级公式

效果:

∫0∞e−x2dx=π2

对应源码:

$$
\int_0^\infty e^{-x^2} dx = \frac{\sqrt{\pi}}{2}
$$

$$ 各占一行,内容居中独占一块。

效果(块级多行,\\ 换行 + aligned 环境):

a2+b2=c2∫01x2dx=13

对应源码:

$$
\begin{aligned}
a^2 + b^2 &= c^2 \\
\int_0^1 x^2 dx &= \frac{1}{3}
\end{aligned}
$$

13.3 全部写法

写法渲染结果说明
$E=mc^2$行内 SVG 公式与文字同排
$$\n...\n$$块级居中公式$$ 单独占行,内容换行写
\\(...\\) / \\[...\\]不支持mathjax3 5.x 硬编码 $/$$,实测退化为普通括号文字
块级内多行\\ 换行、aligned/cases 环境需 ams 宏包(mathjax 内置)

13.4 参数与选项

项值
引擎mathjax3(默认,构建时 SSR 输出 <mjx-container> SVG)
分隔符$...$ 行内 / $$...$$ 块级
配置里的 inlineMath / displayMath无效(mathjax3 5.x 硬编码,写了也不生效)
与 texmath互斥,两者同时启用会冲突

13.5 边界与坑

情况行为
正文含金额 $100 和 $200两个 $ 会被当成行内公式,渲染异常
行内公式里换行不跨行,块级请用 $$
写成 \\(...\\) 或 \\[...\\]不渲染,输出普通括号文字
公式内含 {}正常渲染;若模板引擎报解析错误,用 `` 包裹该段 | | 公式内有下划线 `_` | 正常(在 `$` 内不受 `sub` 插件影响) | ### 13.6 公式双引擎(mathjax / katex,2026-09-10 补) 主题 `post.math.engine` 支持二选一(根 `_config.yml` markdown 插件配套切换): | 引擎 | 分隔符 | 渲染 | |---|---|---| | `mathjax`(默认) | `$...$` 行内 / `$$...$$` 块级(mathjax3 5.x 硬编码,`\(...\)` 不支持) | Node 端 SSR 输出 MathJax SVG(``),无需前端 JS | | `katex` | `$...$` / `$$...$$` + `\(...\)` / `\[...\]`(brackets 需独立成块) | SSR 渲染 + 前端加载 KaTeX CSS(`static_prefix.katex`) | 切换 katex:注释掉 `markdown.plugins` 里的 `markdown-it-mathjax3`,启用 texmath,`post.math.engine: katex`。脑图(markmap)内嵌公式固定走 KaTeX(`.katex`),与正文 MathJax 并存(双通道)。 ### 13.7 小结 - 只用 `$…$` / `$$…$$`,别写 `\(…\)` - 金额里的 `$` 要留意,成对出现会被当成公式 - 改引擎后必须 clean 构建 > **测试断言**:页面含 `math` 渲染标记(SVG 或 ``)。 --- ## 14. 中文排版 cjk-breaks(markdown-it-cjk-breaks) > **用途**:在中英交界处插入零宽断行机会,避免整串英文被挤到下一行或撑破容器。 > > **学习路径**:效果对比 → 全部写法 → 参数与选项 → 边界与坑 ### 14.1 效果对比 **效果**:下面这段中英混排,浏览器可以**在中英边界断行**(而不是只在空格处断): 在 Hexo 博客中使用 markdown-it 插件渲染 SupercalifragilisticexpialidociousEnglishWord 这类长单词时,fallback 行为取决于断行机会。 **对应源码**: {% raw %}
在 Hexo 博客中使用 markdown-it 插件渲染 SupercalifragilisticexpialidociousEnglishWord 这类长单词时,fallback 行为取决于断行机会。
{% endraw %}

源码一个字都不用改:插件在 CJK 字符与拉丁字母/数字/西文标点之间插入零宽空格(U+200B)作为断行点。

效果(插件未覆盖的场景仍可能溢出):中文句子里的超长 URL 仍会溢出容器,因为零宽空格不插入 URL 内部。

对应源码:

{% raw %}
中文句子里的超长 URL 仍会溢出容器:https://example.com/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
{% endraw %}

14.2 全部写法

无语法:插件自动生效,源码一个字都不用改。它在 CJK 字符与拉丁字母/数字/西文标点之间插入断行机会(零宽空格),让浏览器在中英文交界处正常折行,而不是把整串英文挤到下一行或撑破容器。

输入输出
中文English中文中文 + ZWSP + English + ZWSP + 中文
纯中文不变
英文 only不变

14.3 参数与选项

无 options、无开关,全站所有正文生效。不作用于代码块/行内代码内容。

14.4 边界与坑

情况行为
纯中文段落无变化(本就逐字可断)
中英混排 中文English中文允许在中英边界断行
代码块 / 行内代码内不处理,保持原样
与 breaks: true 叠加只影响软换行,不影响硬换行 <br>
长 URL 在中文句子里仍可能溢出(零宽空格不插入 URL 内部)
复制文本时零宽空格可能被一起复制,粘贴到别处偶尔出现「看不见的字符」

14.5 小结

  • 零配置、纯收益,没有需要学的东西
  • 唯一要注意的是超长 URL 仍会溢出,必要时手动断行

测试断言:中文文本正常渲染(无异常断字)。


15. 表格进阶实战(multimd-table 组合用法)

用途:把对齐、行合并、列合并、表题组合到一张真实表格里。

学习路径:组合示例 → 启用项 → multiline 说明 → 边界与坑

15.1 组合示例

效果:

按渲染阶段分类
分类插件状态
行内emoji✅
footnote✅
mark✅
块级mathjax3✅
container✅

对应源码:

{% raw %}
| 分类 | 插件 | 状态 |
| :--- | :--- | :--: |
| 行内 | emoji | ✅ |
| ^^ | footnote | ✅ |
| ^^ | mark | ✅ |
| 块级 | mathjax3 | ✅ |
| ^^ | container | ✅ |

[按渲染阶段分类]
{% endraw %}

连续 ^^ 会逐行向上合并(rowspan 累加),分类列只写一次。

15.2 常用变体

效果(列合并 + 右对齐数值):

项目说明数值
表格扩展
行合并^^2
表题[标题]1

对应源码:

{% raw %}
| 项目 | 说明 | 数值 |
| :--- | :--- | ---: |
| 表格扩展 | 跨两列 ||
| 行合并 | `^^` | 2 |
| 表题 | `[标题]` | 1 |
{% endraw %}

15.3 启用项

选项本项目说明
rowspan✅ 启用^^ 向上合并
colspan✅ 默认空单元格向右跨列
multiline❌ 未启用单元格内多行;需显式 multiline: true
headerless❌ 未启用无表头表格

multiline 未启用时的现象:单元格里换行会被拆成新的一行,而不是同一单元格内的多行内容。真需要多行单元格只能改配置 + clean 构建,或用 HTML 表格。

15.4 边界与坑

情况行为
合并行之间插空行断表,^^ 原样输出
^^ 用在第一行表体无上一行,原样输出
列合并把最后一列留空跨列数为剩余列数,注意别多留
单元格内含 |用 \| 转义
表格与上下段无空行可能被并入同段,表格不渲染

15.5 小结

  • 行合并写 ^^,列合并留空,表题写 [标题]
  • 组合使用时最容易踩的坑是「行间空行」——合并立刻失效

测试断言:页面含 <table 标记(≥2 个表格)。


16. 综合测试(多插件组合)

用途:验证多个插件在同一段内容里互不干扰。

学习路径:组合示例 → 逐项拆解 → 边界与坑

16.1 组合示例

效果:

任务清单(task-checkbox + emoji):

定义列表(deflist):

Markdown
轻量级标记语言。
由 John Gruber 发明。

脚注(footnote):主题测试文章共 4 篇[1]。

对应源码:

{% raw %}
**任务清单**(task-checkbox + emoji):

- [x] emoji 正常::white_check_mark:
- [x] 插入正常:++新增内容++
- [x] 数学正常:$a^2 + b^2 = c^2$

**定义列表**(deflist):

Markdown
: 轻量级标记语言。
: 由 John Gruber 发明。

**脚注**(footnote):主题测试文章共 4 篇[^total]。

[^total]: 内容tag篇、交互视觉篇、布局页面篇、Markdown语法篇。
{% endraw %}

16.2 逐项拆解

组合关键点
复选框 + emoji复选框后内容走 inline,emoji 正常
复选框 + ins++…++ 在 inline 阶段处理,列表项内正常生效
任务列表 + 数学$…$ 在 inline 解析阶段处理,不受列表影响
定义列表 + 强调: 定义 内容走 inline,粗体/代码均可
脚注 + 任意块脚注可从任何块内引用,列表统一追加文末

16.3 边界与坑

情况行为
同一段里 ~(下标)与 $…$ 混用数学公式内优先,$ 内的 ~ 不当下标
复选框内写脚注引用可以,脚注正常生成
定义列表紧跟表格建议留空行,避免并入同一块
多层嵌套 tag + 插件语法主题 tag 先于 markdown 渲染,插件语法在 tag 正文里仍生效

16.4 小结

  • 插件之间基本互不冲突,冲突集中在符号重叠:~/^ 与数学、== 与 attrs
  • 混排时优先用代码块包住原始语法示例

测试断言:页面含多类标记组合(checkbox + dl + footnote + ins)。


17. 行内属性 attrs(markdown-it-attrs)

用途:给块级/行内元素加 id / class / 自定义属性,用于样式定位、锚点、target。

学习路径:最小示例 → 行内元素 → 链接 → 全部写法 → 参数与选项 → 边界与坑

17.1 最小示例

效果:

这是居中段落(class 定位)。

对应源码:

{% raw %}
这是居中段落(class 定位)。
{.text-center}
{% endraw %}

属性块独占下一行,作用于上一个块级元素。

17.2 常用变体

效果(行内元素后紧贴,同一行):这是红色粗体的示例。

对应源码:

{% raw %}
这是**红色粗体**{.red}的示例。
{% endraw %}

行内元素必须与属性块同一行,否则属性落到段落上。

效果(链接加属性):带 target 的链接

对应源码:

{% raw %}
[带 target 的链接](https://hexo.io){target="_blank"}
{% endraw %}

效果(多个 class 连写):这里的文字同时带两个 class。

对应源码:

{% raw %}
这里的文字同时带两个 class。
{.my-class .another-class}
{% endraw %}

多个 class 用空格分隔连写;#id、key=value 可以混在同一个花括号里。属性块必须紧贴上一块,中间隔空行会变成空段落 <p class="…"></p>。

17.3 全部写法

写法渲染结果说明
段落下一行 {.text-center}<p class="text-center">属性块独占一行,作用于上一块
**粗体**{.red}<strong class="red">行内元素后紧贴(同一行)
[链接](url){target="_blank"}<a target="_blank">链接后紧贴
标题 {#custom-id}<h2 id="custom-id">标题加锚点 id
{.a #id key=val}多个属性连写class 可多个,值与 key 用 =

17.4 参数与选项

形式含义
#id设置 id(锚点/JS 选择器)
.class追加 class,可写多个 .a .b
key=value任意自定义属性
key="带 空格"值含空格时用引号

17.5 边界与坑

情况行为
纯文本后紧贴 文字{.red}不生效,原样输出(需加在行内元素后或独占一行)
行内元素与属性分处两行 **粗** ↵ {.red}属性落到段落上,不是粗体
行首单独一行 {.x} 且上方无块生成空段落 <p class="x"></p>
属性块后无空行紧跟正文可能被并入上一块,属性作用范围变大
和 ==高亮== 等插件混用加在标记之后:==文字=={.x}
写 {target="_blank"} 漏引号含空格值从空格处断开,属性残缺

17.6 小结

  • 三种位置:块后独占一行、行内元素后紧贴、链接后紧贴
  • 关键在「同一行」——跨行就换作用对象
  • 纯文本不能直接挂属性,先包成行内元素

测试断言:页面含带 text-center class 的元素。


用途:给 Markdown 链接自动加 target="_blank" + rel="noopener noreferrer"。

学习路径:最小示例 → 站内链接 → 锚点/裸 URL → 全部写法 → 参数与选项 → 边界与坑

18.1 最小示例

效果:Hexo 官网

对应源码:

{% raw %}
[Hexo 官网](https://hexo.io)
{% endraw %}

新窗口打开 + 防反向链接,源码里什么都不用写。

18.2 常用变体

效果(站内链接同样被加 target):站内文章

对应源码:

{% raw %}
[站内文章](/posts/8a11fe0a/)
{% endraw %}

效果(锚点链接也被命中):回到顶部

对应源码:

{% raw %}
[回到顶部](#)
{% endraw %}

效果(linkify 自动识别的裸 URL):https://hexo.io

对应源码:

{% raw %}
https://hexo.io
{% endraw %}

裸 URL 由 linkify: true 转成链接,再被本插件加上属性。

18.3 全部写法

写法处理说明
[文字](https://hexo.io)加 target + rel外链
[文字](/posts/xxx/)同样加 target + rel站内相对链接也命中
[文字](#锚点)同样加 target锚点链接也命中
<https://hexo.io>(linkify 自动识别)同样加 target裸 URL 转成链接后处理
[![图](a.png)](b.html)外层 <a> 同样加图片链接

18.4 参数与选项

配置项本项目值说明
attrs.target_blank新窗口打开
attrs.relnoopener noreferrer防反向链接 + 性能
pattern^https?://未生效:插件只接受 matcher 函数,不认 pattern 字符串

18.5 边界与坑

情况行为
站内链接也被加 target="_blank"(配置缺陷,非预期但当前如此)
模板生成的链接(上一篇/下一篇、侧栏、导航)不受影响,不经过 markdown 渲染
想让站内链接同窗打开改配置为 matcher 函数,或去掉 pattern 只保留外链判断逻辑
HTML 里手写 <a href>不受影响(插件只处理 markdown 链接 token)
写 pattern 字符串不报错但被忽略 → 所有正文链接(含站内、锚点)都加 target

18.6 小结

  • 「只对外链生效」这条当前不成立——pattern 是无效配置
  • 结果:正文里所有链接都新窗口打开,站内跳转也开新标签
  • 想修就得改 matcher 函数,改配置后 clean 构建

测试断言:外链 <a> 含 target="_blank" + rel="noopener noreferrer"。


19. admon 提示块(markdown-it-admon)

用途:!!! type 语法渲染提示块(python-markdown 风格,与 §11 的 ::: 并存)。

学习路径:最小示例 → 自定义标题 → 不同类型 → 全部写法 → 参数与选项 → 边界与坑

19.1 最小示例

效果:

note

这是 note admon——最基础的提示块。

对应源码:

{% raw %}
!!! note
    这是 note admon——最基础的提示块。
{% endraw %}

正文必须缩进 4 空格,否则落在块外。

19.2 常用变体

效果(自定义标题,类型后直接写文字):

部署前请先备份

改动 _config.yml 后记得 clean 构建。

对应源码:

{% raw %}
!!! warning 部署前请先备份
    改动 `_config.yml` 后记得 clean 构建。
{% endraw %}

效果(不写标题时用类型名,首字母大写):

Tip

这是 tip admon——小技巧。

对应源码:

{% raw %}
!!! tip
    这是 tip admon——小技巧。
{% endraw %}

效果(多段内容 + 列表):

Danger

危险操作示例:

  • 删除 public/
  • 覆盖 _config.yml

对应源码:

{% raw %}
!!! danger
    危险操作示例:

    - 删除 `public/`
    - 覆盖 `_config.yml`
{% endraw %}

空行后继续缩进 4 空格,仍属于同一块。

19.3 全部写法

写法渲染结果说明
!!! note<div class="admonition note">蓝色信息块
!!! info / !!! tipadmonition 块提示类
!!! warning黄色警示块
!!! danger / !!! error / !!! failure红色危险块
!!! success绿色成功块
!!! bug / !!! question / !!! quote / !!! example对应图标块语义类
!!! note 自定义标题标题替换为指定文字类型后空格接文字,成为 admonition-title

19.4 参数与选项

项说明
类型note / info / tip / warning / danger / error / success / failure / bug / question / quote / example(插件还接受 summary abstract tldr todo hint check done help faq attention caution fail missing snippet cite,但主题 CSS 只给常见类型配了色)
标题类型后空格接文字即可,不用引号;省略时用类型名(首字母大写,如 Success/Danger)
内容必须缩进 4 空格,否则不进入块内
引号若手写 "标题",typographer 会把直引号转成中文弯引号 “” 并连引号一起显示

19.5 边界与坑

情况行为
内容不缩进只有标题进入块内,正文落在块外
折叠块 ??? note不支持:当前插件版本(1.0.1)无折叠语法,实测原样输出 ??? note
类型拼错 !!! cautoin类型照收(不校验),但主题没有对应配色,显示为无样式块
与 §11 ::: 容器混用两套独立语法:admon 产出 .admonition.<type>,container 产出 .<type>,样式不同
缩进 2 空格不足 4 空格,视为普通段落
标题加引号引号会被渲染出来(“标题”),纯属多余

19.6 小结

  • 三要素:!!! 类型、缩进 4 空格、可选标题(不加引号)
  • 想折叠 → 用 {% note %},admon 的 ??? 在这个版本不存在
  • 类型不校验,拼错不报错但没样式

测试断言:页面含 admon 渲染标记。


⚠️ 已知坑

坑 1:标题编号双重叠加

现象:标题渲染为「1. 1. 概述」(两个编号)。

原因:主题 CSS 自动给 h2–h6 加编号(默认开启),手写编号(如 ## 1. 概述)会叠加。

正确做法:手写编号的页面在 front-matter 加 closeAutoTocNum: true;不手写编号的页面不要加该字段。

本文已正确设置 closeAutoTocNum: true。

坑 2:{% raw %}` 忘了包 **现象**:示例源码里的 `{% note %}`、`{{ }}` 被真实执行或报模板错误。 **正确做法**:所有含 `{% %}` / `{{ }}` 的示例代码块都用 `{% raw %}` … `{% endraw %} 包住。

坑 3:配置项写了不生效

现象:link-attributes 的 pattern: ^https?://、mathjax3 的 inlineMath 都写了,但行为没变。

原因:两处都是插件不认这个键(一个只认 matcher 函数,一个是源码硬编码 $/$$),配置静默失效。

坑 4:改配置后必须 clean 构建

现象:修改根 _config.yml 的 markdown.plugins(如切换 mathjax/katex 引擎、开 multiline)后页面不变。

原因:Hexo 缓存机制不会自动检测配置变更。

正确做法:改 markdown 插件配置后必须 npm run clean && npm run build。


附:markdown-it 插件速查表

插件语法渲染测试标记
emoji:smile:emoji 字符emoji
abbr*[ABBR]: 全称<abbr>abbr
footnote[^1]脚注footnote
ins++文本++<ins>ins
sub~文本~<sub>sub
sup^文本^<sup>sup
mark==文本==<mark>mark
task-checkbox- [x]复选框task-list-item
multimd-table表格<table>table
imsize=200x100尺寸图img
container::: typenote 容器note
deflist术语: 定义<dl>dl
mathjax3$公式$SVGmath
cjk-breaks自动中文优化-
attrs{#id .class key=val}元素属性class/id
link-attributes外链自动target=_blank + reltarget
admon!!! type提示块admon

参考&致谢

系列教程

全部文章RSS订阅

Hexo 主题功能测试系列


  1. 内容tag篇、交互视觉篇、布局页面篇、Markdown语法篇。 ↩︎


Hexo主题功能测试-Markdown语法篇
发布于
2026年8月8日
许可协议。转载请注明来源
赏
评论
数据加载中 ...
 上一篇

阅读全文

Hexo主题功能测试-自动化测试篇
Hexo主题功能测试-自动化测试篇 Hexo主题功能测试-自动化测试篇
主题自动化测试体系完整教程:测试金字塔(L1 构建 / L13 单测门禁 / L11 Playwright 集成 / 生产 release-test)、release-test.sh 用法、L1-L14 各层覆盖、单测清单、外部依赖重试与降
2026-09-11
下一篇 

阅读全文

Hexo主题功能测试-布局与页面篇
Hexo主题功能测试-布局与页面篇 Hexo主题功能测试-布局与页面篇
主题布局与页面功能完整教程与测试:文章布局特性(上下篇/版权/时效/TOC/广告)、侧边栏组件(雷达图/标签云/词云/归档/关于页)、响应式断点、相册、搜索、评论、暗色模式、加密、RSS/站点地图、PWA。每项先看效果、再看对应配置,供自动
2026-08-07