Markdown 分页符完整教程:4 种方法实现 page break
Markdown 原生语法里没有分页符(page break)。John Gruber 设计 Markdown 的初衷是给网页内容写格式,网页不需要分页,所以压根没设计这个功能。但现实是——我们经常需要把 Markdown 导出成 PDF、打印成纸质文档、或者生成 Word 文件,这些场景都离不开分页控制。
这篇文章把目前所有可行的 markdown 分页符方案都整理出来了,从最通用的 HTML/CSS 方法到特定工具的专有语法,按你的使用场景选一个就行。
方法一:HTML + CSS 分页(最通用)
这是适用范围最广的方案。几乎所有 Markdown 渲染器都支持内联 HTML,而 PDF 导出工具和浏览器的打印功能都能识别 CSS 分页属性。
基本写法
在需要分页的位置插入这行 HTML:
第一页的内容写在这里。
<div style="page-break-after: always;"></div>
第二页的内容从这里开始。page-break-after: always 的意思是:在这个元素之后强制分页。渲染器在导出 PDF 或打印时会在这里断开,新内容从下一页开始。
还有一种写法效果相同:
<hr style="page-break-after: always;">这个写法会同时显示一条分割线和分页效果。如果你不想要分割线的视觉效果,用 <div> 的写法更干净。
CSS 分页属性的区别
CSS 提供了三个分页相关属性,很多人分不清它们:
| 属性 | 作用 | 推荐场景 |
|---|---|---|
page-break-after | 元素之后分页 | 最常用,当前内容结束后另起一页 |
page-break-before | 元素之前分页 | 确保某个章节总是从新页开始 |
break-after / break-before | CSS3 新标准,作用相同 | 面向未来,但旧浏览器支持不够 |
说实话,实际使用中 page-break-after: always 就够用了。break-after 是 CSS Fragmentation Module Level 3 里定义的新属性,理论上更强大(支持分栏、分区域等),但目前大部分 PDF 导出工具还是认 page-break-after 更可靠。
我之前用 VS Code 的 Markdown PDF 插件导出文档时,page-break-after 完美生效,换成 break-after 反而没反应。所以除非你确定目标工具支持新标准,否则还是用 page-break-after 稳妥。
用 page-break-before 确保章节从新页开始
如果你希望每个大章节都从新页开始(而不是在上一节结束后分页),可以用 page-break-before:
## 第一章
第一章的内容...
<div style="page-break-before: always;"></div>
## 第二章
第二章的内容...这个写法的好处是:不管第一章内容多长多短,第二章一定会从新页开始。
兼容性
| 工具/平台 | 是否支持 | 备注 |
|---|---|---|
| 浏览器打印(Chrome、Firefox) | 支持 | — |
| VS Code Markdown PDF 插件 | 支持 | — |
| Typora 导出 PDF | 支持 | — |
| Pandoc 转 PDF(通过 HTML) | 支持 | — |
| GitBook | 支持 | — |
| GitHub 网页 | 不生效 | 网页不需要分页 |
| GitLab 网页 | 不生效 | 同上 |
基本上,只要是导出或打印场景,HTML + CSS 的方法都管用。在网页上预览时分页符不会显示——这其实是对的,因为网页本来就是连续滚动的。
方法二:Pandoc 的 \newpage(适合技术文档)
如果你用 Pandoc 把 Markdown 转成 PDF 或 Word(通过 LaTeX),直接写 LaTeX 分页命令就行:
这是第一章的内容。
\newpage
# 第二章
这是第二章的内容。Pandoc 在处理时会直接把 \newpage 传给 LaTeX 引擎,效果就是在这个位置强制分页。
支持的输出格式
\newpage 在 Pandoc 中不只适用于 PDF,对不同输出格式的处理方式:
| 输出格式 | 是否生效 | 实际效果 |
|---|---|---|
| PDF(通过 LaTeX) | 生效 | LaTeX 的 \newpage 命令 |
| Word(.docx) | 生效 | 转换为 Word 的分页符 |
| HTML | 部分生效 | 显示为原始文本,但配合 CSS 可生效 |
| ODT | 生效 | 转换为分页符 |
我写技术报告的时候基本都用这个方法,Pandoc 一行命令 pandoc report.md -o report.pdf 就能把分页处理好,配合 Markdown 换行 和 分割线 语法,排版效果很稳定。
对了,还有一个小技巧:如果你想在同一个 Pandoc 文档里同时支持 PDF 和 HTML 导出,可以把两种写法都加上:
第一页内容
\newpage
<div style="page-break-after: always;"></div>
第二页内容Pandoc 转 PDF 时 \newpage 生效,转 HTML 时 CSS 的分页属性生效。虽然看起来有点冗余,但实际用起来确实省心。
方法三:Quarto 的 pagebreak(数据报告场景)
Quarto 是基于 Pandoc 的下一代发布工具,在学术和技术写作领域越来越流行。它提供了更优雅的分页语法:
第一部分内容
::: pagebreak
:::
第二部分内容::: pagebreak 是 Quarto 的自定义 div 语法。Quarto 会根据你的输出格式自动选择合适的分页方式——PDF 用 LaTeX 命令,Word 用原生分页符,HTML 用 CSS。你不需要关心底层细节,写这一行就够了。
有些 Quarto 模板还支持 shortcode 写法:
{{< pagebreak >}}效果和 ::: pagebreak 一样,选哪种取决于你的模板配置。
Quarto 的方案是我觉得最"干净"的——语法简洁,跨格式自动适配,不用写 HTML 也不用记 LaTeX 命令。如果你已经在用 Quarto 写文档,强烈建议直接用这个。
方法四:编辑器特定语法
有些 Markdown 编辑器定义了自己的分页符语法,只有在它们的环境里才能用。
iA Writer:三个加号
iA Writer 用三个加号 +++ 表示分页:
第一页的内容
+++
第二页的内容在 iA Writer 里导出 PDF 或打印时,+++ 会被识别为分页符。注意 +++ 前后都需要空一行,不然可能不被识别。
Typora
Typora 本身没有专有的分页语法,但它完美支持方法一中的 HTML/CSS 写法。在 Typora 编辑器里,分页标签会显示为一个带虚线边框的 HTML 块,导出 PDF 时正常分页。
其他编辑器
大部分 Markdown 编辑器(Obsidian、Mark Text、MacDown 等)都支持 HTML 内联,所以用方法一的 CSS 方案基本都能解决。如果你的编辑器不支持内联 HTML,那就只能考虑换个工具了。
方法对比:选哪个?
| 方法 | 语法 | 通用性 | 适用场景 |
|---|---|---|---|
| HTML + CSS | <div style="page-break-after: always;"></div> | 最广 | 通用 PDF 导出、浏览器打印 |
Pandoc \newpage | \newpage | Pandoc 用户 | 技术文档、LaTeX 工作流 |
Quarto pagebreak | :::pagebreak | Quarto 用户 | 学术报告、数据文档 |
iA Writer +++ | +++ | 仅 iA Writer | iA Writer 导出 |
选择建议:
- 不确定用哪个:选方法一(HTML + CSS),几乎所有工具都认
- 用 Pandoc 生成文档:直接写
\newpage,最简洁 - 用 Quarto:用
::: pagebreak,跨格式自动适配 - 只用 iA Writer:
+++最方便 - 需要同时支持多种导出格式:可以把 HTML/CSS 和
\newpage都写上
常见问题
Markdown 原生支持分页符吗?
不支持。根据 CommonMark 规范,标准 Markdown 没有定义任何分页语法。Markdown 的设计目标是网页内容格式化,而网页是连续滚动的,不需要分页。所有的分页方案都是通过 HTML 内联、工具扩展或编辑器特定语法实现的。
GitHub 上写 README 能用分页符吗?
没意义。GitHub README 在网页上显示,网页不存在"页"的概念。page-break 相关的 CSS 属性在 GitHub 的渲染环境中不会生效。分页符只在导出 PDF、打印或生成 Word 文档时才有意义。
page-break-after 和 break-after 有什么区别?
page-break-after 是 CSS 2.1 的属性,浏览器和 PDF 工具支持广泛。break-after 是 CSS Fragmentation Module Level 3 定义的新标准,功能更强(支持分栏、分区域等场景),但部分旧工具不认识。对于 Markdown 分页的需求,page-break-after: always 就够了。
为什么导出 PDF 时分页符没生效?
几个常见原因:
- 渲染器不支持内联 HTML——检查你的工具是否开启了 HTML 支持
- CSS 属性写错了——确认是
page-break-after,不是page-break或pagebreak - 分页标签和内容之间没有空行——Markdown 的 HTML 块前后建议各空一行
- 导出工具的问题——有些工具的 PDF 引擎不处理 CSS 分页属性,试试换用 Pandoc
能用分割线(---)代替分页符吗?
不能。Markdown 的分割线(---、***、___)只是在页面上显示一条水平线,对应的 HTML 标签是 <hr>。它没有任何分页功能——导出 PDF 时内容还是连续的,分割线不会导致换页。分割线解决的是视觉分隔,分页符解决的是物理分页,两个完全不同的需求。
参考来源
- CommonMark Spec — Markdown 官方规范,确认无原生分页符语法
- W3C CSS Fragmentation Module Level 3 — CSS 分页属性的权威定义
- Pandoc 官方文档 — Pandoc Markdown 扩展语法说明
- Quarto — Markdown Basics — Quarto pagebreak 语法官方文档
- R Markdown Cookbook — Page Breaks — R Markdown 中的分页方案