Markdown 文稿要转成 Word 或 PDF,Pandoc 官方怎么转?

手里是一份 Markdown,要交出去的却是 Word 或 PDF。想按官方命令把格式转过去,不是去搭一套论文排版系统。

Getting started with pandoc 面向还不熟命令行的人,命令行已经用顺的可以直接看 User’s Guide。它是命令行工具,没有图形界面。安装按入门页第一步,对照自己平台的官方说明来做。装好后在终端里执行 pandoc --version,能看到版本信息就说明命令已经可用。Windows 若走经典的 cmd,入门页还提醒先执行 chcp 65001,把编码设成 UTF-8。手册也写明,Pandoc 的输入和输出都按 UTF-8 处理。

不指定任何输入文件时,它会作为过滤器来用:从终端读入,再把结果写回终端。默认把输入当成 pandoc 的 Markdown,输出是 HTML。要改格式,用 -f / --from 指定输入,用 -t / --to 指定输出。入门页演示过 pandoc -f html -t markdown,把一段 HTML 转回 Markdown。源文件要用文本编辑器来写,不要用 Word 这类字处理器去存那份 Markdown。入门页给过一份很短的例子:先用 YAML 元数据块写上 title,再写标题、斜体和列表,保存为 test1.md,然后就可以按下面的命令转换。真正转换一份文件时,常见写法是:

pandoc test1.md -f markdown -t html -s -o test1.html

-s(--standalone)表示生成带页眉页脚的独立文档,而不是一段片段。-o 指定输出文件。从 Markdown 转到 HTML 时,这两种格式本来就是默认值,-f 和 -t 可以省略,写上也不妨碍。Pandoc 常常能根据文件名的扩展名判断格式,所以转到 LaTeX 也可以只写 pandoc test1.md -s -o test1.tex。入门页接着让读者试着生成扩展名为 docx 的 Word 文档。按同样的扩展名推断,可以写成 pandoc test1.md -s -o test1.docx,也可以显式加上 -f markdown -t docx。

要出 PDF,入门页写的是本机需要先装好 LaTeX(macOS 用 MacTeX,Windows 用 MiKTeX,Linux 则安装 texlive 包),然后执行 pandoc test1.md -s -o test1.pdf。手册把这件事写得更完整:只要输出文件用 .pdf 扩展名即可。默认会借助 LaTeX 引擎来生成,因此需要安装该引擎,具体用哪一个可以用 --pdf-engine 指定。也可以把 ConTeXt、roff ms 或 HTML 当作中间格式,在命令里加上 --pdf-engine,或使用 -t context、-t html、-t ms。排查 PDF 问题时,手册提到可以先不直接 -o test.pdf,而是例如用 -s -o test.tex 把中间的 LaTeX 拿出来,再单独用 pdflatex 试。这里只把官方的转换命令跑通,不去展开 LaTeX 本身怎么排版。

手册把 Pandoc 写成一套用 Haskell 写的库,外加调用这套库的命令行工具,用来在不同标记和字处理格式之间转换,范围包括多种 Markdown、HTML、LaTeX 和 Word 的 docx,也可以产出 PDF。完整的输入、输出格式列表见手册里 -f 和 -t 的说明。也可以在本机执行 pandoc --list-input-formats 和 pandoc --list-output-formats 查看当前这份程序支持哪些。没有显式指定时,它会尝试从扩展名猜测。结果写到标准输出、或扩展名无法识别时,默认当成 HTML。从标准输入读取、或来源后缀无法识别时,则按 Markdown 处理。多份输入会先按顺序拼接(中间插入空行)再解析。它的模块设计是先由 reader 解析成一份中间的抽象语法树,再交给 writer 写成目标格式。正因为中间表示比许多源格式更简单,不要指望每一种格式之间都能无损转换:它会尽量保留文档的结构要素,但不会保留页边距这类排版细节,复杂表格也可能放不进它的文档模型。记不住参数时,用 pandoc --help 就能列出支持的选项和格式。

这和站内这篇 Typst 排版入门 不是同一层:那边谈的是用一套排版系统把文稿写出来,这里只按官方命令,把已经写好的 Markdown 转成 Word 或 PDF。

这份稿你是先转成 Word 方便别人改,还是本机已经能调 LaTeX,直接出 PDF?