Markdown转PDF分页:在你想要的位置准确另起一页
作者 pdftomd.tools 团队 · 更新于 · 阅读约 6 分钟
Markdown 本身没有分页语法。想在 PDF 里分页,就插入一行 HTML:<div style="page-break-after: always"></div>,上下各空一行。基于 HTML 的导出工具,包括我们的 Markdown转PDF 工具,都会在这里另起一页。如果用 Pandoc 走 LaTeX,就写 \newpage。导出后再检查一下 PDF 里有没有空白页。

为什么 Markdown 没有分页符
Markdown 是为网页设计的,而网页没有“页”的概念。无论是最初的语法还是 CommonMark,都没有定义分页符。最接近的是三个短横线 ---,叫主题分隔线:它会变成一条 <hr> 横线,而不是新的一页。很多人第一反应就是拿它来分页,然后奇怪为什么没反应。
Markdown 允许的是直接写 HTML。大多数导出工具先把 Markdown 转成 HTML,再把 HTML 打印成 PDF;所以分页其实是加在 HTML 元素上的一条 CSS 规则。例外是 Pandoc 的默认路径,它经过 LaTeX,要的是 LaTeX 命令。
确实管用的分页写法
按你用的导出工具选一行,单独放在一行,前后各留一个空行,这样 Markdown 解析器才会把它当作 HTML 块:
Last paragraph of the first part.
<div style="page-break-after: always"></div>
## Part two
This heading starts a new page.- 现代 CSS:
<div style="break-after: page"></div>,或者在要另起一页的元素上写break-before: page。 - 直接加在标题上:
<h2 style="page-break-before: always">第二部分</h2>,前提是你不介意用 HTML 写这个标题。 - VS Code 插件 Markdown PDF:它的 README 给的是
<div class="page"/>,由插件自带的样式表负责分页。这是 VS Code 里最常见的答案,上面的行内样式在那里也能用。 - Pandoc + LaTeX(默认的 PDF 路径):一行
\newpage。raw_tex扩展只会把它原样传给 LaTeX 和 ConTeXt 的 writer。Pandoc 的 newpage 命令不适用于 HTML 输出;如果你用 HTML 引擎生成 PDF,请改用 div。
为什么有两个名字?CSS 分片规范 用 break-before 和 break-after 取代了 page-break-before 和 page-break-after,旧名保留为别名:page-break-after: always 的效果等同于 break-after: page。对老工具来说旧写法更保险;MDN 两种都有说明。
“始终在主盒子之前/之后强制分页。”
我们的导出工具如何处理手动分页
2026 年 10 月 19 日之前,我们的导出工具会忽略手动分页,所有分页位置都自己决定。现在它会读取渲染后文档中每个元素计算出的 break-before 和 break-after 值,所以写在 style 属性里的 CSS 分页,不论新旧写法都会生效。实时预览会在新页开始的地方画一条标着“分页”的虚线,导出后还会提示应用了几个手动分页。

几条规则让输出保持干净:
- 文档最开头或最末尾的分页会被忽略,所以不会出现空白的第一页或最后一页。
- 连续两个分页只算一个。Chrome 会在中间打印一张空白页;我们认为这很少是你想要的。
left、right、recto和verso这几个值都会另起一页。我们不会为了落到左页或右页而插入空白页。---仍然是一条横线,和 Markdown 的定义一致。- 长段落里依然会自动分页,而且依然避免切断一行文字、一行表格或一张图片。

我们测了什么:与 Chrome 打印对比
我们写了 9 个小文档,每个测试一种分页写法,都用真实的“下载 PDF”按钮导出,再用 pdfinfo 和 pdftotext 读回来,看哪段文字落在哪一页。作为参照,我们还用 Chrome 的 PDF 打印输出了同样的 HTML。测试中,9 个用例全部得到了预期的页面且没有空白页,其中 8/9 个与 Chrome 逐页一致。
| 标记 | 我们的页数 | Chrome 页数 | 空白页(我们) | 符合预期 | 与 Chrome 相比 |
|---|---|---|---|---|---|
<div style="page-break-after: always"> | 2 | 2 | 0 | 是 | 一致 |
<div style="break-before: page"> | 2 | 2 | 0 | 是 | 一致 |
<div style="break-after: page"> | 2 | 2 | 0 | 是 | 一致 |
<h2 style="page-break-before: always"> | 2 | 2 | 0 | 是 | 一致 |
| 分页后紧跟 Markdown 标题 | 2 | 2 | 0 | 是 | 一致 |
| 连续两个分页 div | 2 | 3 | 0 | 是 | 不同 |
| 文档开头和结尾各有一个分页 | 1 | 1 | 0 | 是 | 一致 |
---(Markdown 分隔线) | 1 | 1 | 0 | 是 | 一致 |
| 手动分页与自动分页混合 | 4 | 4 | 0 | 是 | 一致 |
让标题和正文在同一页,以及其他尴尬的分页
手动分页能解决你知道的位置,其余交给导出工具。最典型的问题是标题孤零零地落在页面底部,正文却从下一页开始。文字处理软件把解决办法叫作“与下段同页”。在 CSS 里,对应的写法是给标题加 break-after: avoid,但各引擎在打印时对 avoid 值的支持并不一致,用之前先测一下。

我们的导出工具不需要任何标记就能做到:标题总是和它后面的第一行在一起,表格行和图片只要一页放得下就不会被拆开。如果还是不满意某一页的结束位置,就在标题前面加一个手动分页。下图标出了哪里可以分页、哪里不行。

表格要格外注意。我们的 表格打印指南 讲了长表格和宽表格的处理;正式导出前,先用 MD转PDF 快速导出一下,是试排版最快的办法。
分页常见错误
分页没生效时,原因几乎总是下面四个之一:
- div 后面没有空行。在 CommonMark 里,以
<div>开头的 HTML 块会一直延续到下一个空行。紧跟在下面的文字会被吞进 HTML,显示时没有格式,##和**都原样露出来。 - div 放在列表、引用或表格里。把它放到文档最外层,任何导出工具都会把它当作独立的块。
- HTML 被禁用了。有些渲染器默认关闭 HTML,会把标签当文字显示出来。在设置里打开 HTML,或者用该工具自带的分页语法(如果有的话)。
- 只看预览下结论。会清理 HTML 的预览常常去掉行内样式,屏幕上看不到分页,导出时却照样生效。我们的预览会显示虚线标记,但真正的检验还是导出的文件。
还有一个好习惯:手动分页一律放在要另起一页那一节的标题正上方,不要放在标题下面。这样标题和第一段永远在一起;以后删掉分页,文档的顺序也不会乱。
分享 PDF 前的快速检查
- 从头翻到尾找空白页;出现空白页通常是连续两个分页,或者结尾有分页。
- 确认每一节都从页面顶部开始,标题在最前面。
- 搜索最后一页的某个词,确认文字层是真的。
- 如果 PDF 要双面打印,并且每章必须从右页开始,请用支持
break-before: right的工具;我们的工具会把它当普通的另起一页处理。
参考来源
- CSS Fragmentation Module Level 3 — W3C
- break-before — MDN Web Docs
- page-break-after — MDN Web Docs
- CommonMark Spec 0.31.2, Thematic breaks — CommonMark, 2024
- Pandoc User’s Guide (raw_tex extension) — pandoc.org
- Markdown PDF (VS Code extension) — yzane, GitHub
常见问题
Markdown 转 PDF 时怎么插入分页?
Markdown 没有分页语法。插入一行 HTML <div style="page-break-after: always"></div>,前后各空一行;基于 HTML 的 PDF 导出工具会在这里另起一页。
`---` 能分页吗?
不能。三个短横线是主题分隔线,显示为一条横线,在 PDF 里也还是一条线。
该用 page-break-after 还是 break-after?
都可以。break-after: page 是现在的 CSS 名称,page-break-after: always 是旧别名。旧写法在老工具里稍微稳妥一些;我们的导出工具两种都认。
Pandoc 怎么分页?
通过 LaTeX 生成 PDF 时,在单独一行写 \newpage。如果通过 HTML 生成 PDF(比如用 HTML 引擎),就改用 CSS div,因为这个 LaTeX 命令只会传给 LaTeX 和 ConTeXt 的 writer。
为什么多出了一张空白页?
通常是连续两个分页,或者文档最末尾有分页。这两种情况 Chrome 都会打印空白页;我们的导出工具会跳过。
能让每个 H2 都从新的一页开始吗?
在支持自定义 CSS 的工具里,用样式表写 h2 { break-before: page; } 就行。在我们的编辑器里,在每个 H2 前加 div 行,或者把标题写成 <h2 style="page-break-before: always">。

