跳到主内容

← 返回文章列表

不装 LaTeX 把 Markdown 转成 PDF:浏览器打印管线是怎么工作的

问怎么把 Markdown 变成 PDF,标准答案是 Pandoc 加一套 LaTeX 引擎——这条工具链从几个 GB 的 TeX 下载开始,常常以字体报错和模板调试收尾。为了一份简历、一份报告、一份会议纪要,要立起来的机器实在太多了。

还有第二条路,上面这些一样都不需要:把 Markdown 渲染成 HTML,用分页 CSS 排版,交给浏览器自带的打印引擎输出 PDF。这篇文章讲清楚这条管线怎么工作、为什么它产出的是真正的文档而不是截图、它在哪里赢过 LaTeX,又在哪里诚实地认输。

简单任务上的 LaTeX 税

Pandoc 是大多数文档转换的正确答案,但它的 PDF 输出是个例外:Pandoc 自己并不渲染 PDF。它把文档排成 LaTeX 源码,再调用外部引擎——pdflatex、xelatex 或 lualatex——这意味着你机器上要有一套能用的 TeX 发行版。完整版 TeX Live 要占几个 GB;精简版省了空间,却在第一个缺包报错时把你送回安装器。

云端转换器绕过安装,代价是转移了问题:文件上传到别人的服务器、排队、再回来——如果没超大小限制、没撞上每日额度的话。对机密草稿、合同、未发表的书稿,上传这一步本身就是否决项。而这件事本身——把结构化文本变成可打印的页面——并没有那么难,只是传统工具链让它显得难。

浏览器打印管线到底在做什么

管线分三段,全部在本地。第一,Markdown 转成 HTML——本站用的就是驱动其他所有转换的同一个 Pandoc WASM 引擎。第二,把这段 HTML 包进一份完整文档,挂上打印样式表:固定页面尺寸、真实的页边距,以及标题、列表、代码、表格的字体层级。第三,浏览器的打印引擎完成分页,写出 PDF。

第三阶段做的事情比看起来多。Chrome、Edge、Firefox、Safari 都内置了成熟的分页引擎——就是打印收据和登机牌的那一个——它们“另存为 PDF”的输出是真正的 PDF:带文本层的矢量字形。你可以在结果里选中句子、搜索、复制、交给屏幕阅读器。它不是文档的照片,它是排好页的文档本身。

分页 CSS:让它像一份文档的关键

打印出来的网页和一份文档之间的差距,就在寥寥几条 CSS 规则里。@page 规则固定纸张——这里是 A4 加 16 毫米页边距——版式从此不再依赖窗口大小。字号从标题到各级标题逐级递减,间距遵循印刷惯例而不是屏幕惯例。

更微妙的是分页规则。标题带 break-after: avoid,于是章节标题永远不会孤零零地蹲在页底、正文却翻去下一页。表格、代码块、引用块、图片带 break-inside: avoid,渲染器会把它们整体挪到下一页,而不是拦腰切断。这正是文字处理软件默默执行的那些规则——把它们显式写出来,浏览器标签页就变成了排版机。

LaTeX 仍然赢在哪里

对边界诚实很重要。如果你的文档是带两百个交叉引用的学位论文、要投给强制模板的期刊、或者满是数学公式,那就装 TeX:没有其他东西能把公式排成 LaTeX 那样,也没有期刊接受“差不多”的版式。文献工具链——BibTeX、各种机构定制变体的 CSL——也是 TeX 世界更深。

这条边界之外,是绝大多数真实文档。报告、简历、文档、发票、会议纪要、送审的章节:它们要的是干净的字体排印、合理的分页、不跨页撕裂的表格。对这类活,打印管线不是妥协——它是到达同一终点的更短路径,而且迭代循环更快,因为没有什么要装、要编译、要调试。

隐私与速度红利

因为每个阶段都在你的机器上跑,文档从不离开它。没有上传进度条,因为没有上传;没有排队位置,因为没有队列;没有账号,因为没有东西要计量。这条管线在飞机上、在野外办公室、在页面加载后再没碰过网络的机器上都能工作。

速度来自同一个事实。转换加分页只要几秒,反馈循环很紧:改 Markdown、再转一次、扫一眼预览、打印。对任何在迭代文档的人——PDF 通常是迭代的最后一步而不是第一步——去掉安装和上传,就是去掉那个让人干脆不出 PDF 的摩擦力。

从打印管线拿到最好结果

几个习惯很值。文档开头用一个一级标题作为题目,并保持标题层级诚实——分页规则能把标题和正文拴在一起,但前提是结构是真的。表格保持窄;放得进版心的表格能完整存活,过宽的会把单元格挤得换行。图片给合理的宽度,并记住浏览器默认不打印背景色——这里的样式表刻意只依赖边框和留白。

最后,把打印对话框当作最后一道检查。预览在任何保存动作之前就展示真实分页;这是为受众在 A4 和 Letter 之间切换、确认没有表格落得太尴尬的时刻。花三十秒看预览,比 PDF 发出去之后再返工便宜得多。

继续阅读

把 Markdown 转成 PDF