自从习惯了 Markdown 的便利,我便很少打开 Word 了。
但 Markdown 的群众基础毕竟有限,很多时候必须提供 PDF 文件才行。比如,当文件需要发送或分享给其他人时,当用 Markdown 编写的产品文档(尤其是工业领域的产品手册)要发布时 ……
刚接触 Markdown 时,很多文章安利从 Markdown 输出 PDF 文件有多方便。但现实往往很很很骨感,提供这项功能的网站要么收费,要么输出的 PDF 难看到“鬼见愁”。
泡在 Markdown 里的时间久了之后,我才发现借助一些开源的插件或软件,不仅能实现 Markdown 到 PDF 的 DIY,而且还能根据自己的喜好自由设置 PDF 的输出样式。不过,要完成这些成就感满满的任务需要掌握一些额外的技能……
本文将总结 Markdown 转换为 PDF 时设置输出样式的三种方法(技能)、相关的学习资源、每种方法的实现路径以及应用最广泛或当下最流行的插件或软件:
CSS
CSS 是专门为 HTML 文件(网页)设置样式的语言。你平时浏览的网页,无论是在电脑端还是手机端上,都是依靠 CSS 来控制页面上的标题、段落、表格、图片等元素以什么样的格式显示在屏幕上。
除了用于屏幕显示的样式表,CSS 还可以使用分页媒体属性(paged media)设置专门用来打印或生成 PDF 文件的样式表。在 CSS3(CSS 的最新版本)中,不仅可以设置页面大小、页边距、纸张方向、页眉页脚等,还可以为首页和奇偶页分别设置不同的样式。
在本文的姊妹篇里提到过,Markdown 的核心优势之一是“将它转换成 HTML 文件实在太方便了”。有了 HTML,再搭配 CSS 来设置样式,从 Markdown 生成漂亮的 PDF 文件便有了理论基础。
flowchart TD subgraph id1[中间格式] direction TB C(HTML) end A(Markdown) & B(CSS) --> C C --> D(PDF)
使用 CSS 设置 PDF 样式有很多好处:CSS 的使用人群广泛,学习资源很多;CSS 可以为多种格式设置样式,不需要单独为打印版文件设置发布流程……
但目前的浏览器并不支持 CSS 的分页媒体属性,相关的开源软件也不太成熟。有些商用软件虽然在 CSS 分页媒体属性的基础上开发了很多高级功能,但价格不菲。即便如此,CSS 仍被公认为是可打印文档格式样式语言的未来。
使用 CSS 设置 PDF 样式的插件或软件
名称 | 类型 |
---|---|
Markdown PDF | VS Code 扩展(插件) |
xhtml2pdf | 开源软件 |
Pandoc | 开源软件 |
相关教程: CSS 教程
LaTeX
LaTeX 是一种在科技领域广泛应用的专业排版系统,可以直接生成 PDF 文件。很多数学类、物理类或计算机科学类的期刊只接收 LaTex 排版的论文。
使用 LaTex,可以非常高效地输入复杂的公式、表格或图表,深受科技论文写作者的喜爱。在 Markdown 中输入公式时,使用的就是 LaTeX 语法。
一些 Markdown 编译器可以将 Markdown 文件转换为 LaTeX 文件,比如 Pandoc 和 kramdown。然后,再使用 LaTeX 编辑管理软件(如 MiKTeX)生成 PDF 文件。
flowchart TD A(Markdown) --> M{Markdown
编译器} --> B(LaTeX) --> L{LaTeX
编辑器} --> C(PDF)
Pandoc 可以将 Markdown 文件直接转换为 PDF 文件。但转换过程中仍然会使用中间格式。中间格式可以是 LaTeX(默认)、ConTeXt、roff ms 或 HTML,使用选项
--pdf-engine
进行设置。
使用 LaTeX 生成 PDF 文件的技术虽然很成熟,但 Markdown 转换为 LaTeX 时需要调用转换模板(templates)。转换模板是使用模板语言编写的文件。比如,kramdown 使用 Embedded Ruby (ERB) ,Pandoc 使用自定义的语法编写模板。
相比于 CSS,LaTeX 的学习难度较大。编写转换模板,无疑又进一步提高了初学者的入门门槛。
使用 LaTeX 生成 PDF 的相关软件
名称 | 类型 |
---|---|
Pandoc | Markdown 编译器 |
kramdown | Markdown 编译器 |
MiKTeX | LaTeX 编辑管理软件 |
TeX Live | LaTeX 编辑管理软件 |
上表中的软件均为开源软件。
相关教程:Learn LaTeX
XSL-FO
XSL-FO 是专门为 XML 文件设置样式的语言,主要用于输出可打印的文档格式(如 PDF)。
绝大多数 Markdown 编译器都可以将 Markdown 文件转换为 XHTML 文件。XHTML 是符合 XML 语法规范的 HTML 文件。任何可以处理 XML 的软件或工具都可以处理 XHTML 文件。也就是说,XSL-FO 完全可以为 XHTML 文件设置样式。
flowchart TD A(Markdown) --> M{Markdown
编译器} --> B(XHTML) --> XSLT{XSLT变换} --> C(XSL-FO) --> FO{XSL-FO
处理器} --> D(PDF)
与 CSS 相比,XSL-FO 在输出 PDF 文件上的功能更强大、技术更成熟。这也意味着,支持 XSL-FO 的软件或工具比较多,价格也更实惠。
与 LaTeX 相比, XSL-FO 的语法要简单得多,入门门槛比较低。如果有 CSS 基础,则更容易上手。
但 XSL-FO 是包含内容和样式的完成文件,不能像 CSS 一样作为外部样式表链接到 XHTML 中。通常,将 XHTML 转换为带样式的 XSL-FO 文件需要使用 XSLT 变换。否则,手动编写 XSL-FO 将是一项耗时耗力的艰巨任务。
此外,XSL-FO 比较小众(应用领域窄),熟练使用的人并不多,不容易找到合适的学习资源。
使用 XSL-FO 生成 PDF 的相关软件
名称 | 类型 |
---|---|
Pandoc | Markdown 编译器 |
kramdown | Markdown 编译器 |
Apache Xalan | XSLT 处理器 |
Saxon | XSLT 处理器 |
Apache FOP | XSL-FO 处理器 |
上表中的软件均为开源软件。
相关教程:XSLT 教程、XSL-FO 教程 和 XPath 教程