Pandoc 简介
如果你需要在不同的文件格式之间相互转换,多半听说或使用过文档转换的瑞士军刀——Pandoc。事实上,不仅人类知道 Pandoc,最近很火的人工智能 ChatGPT 也知道「将 Markdown 转换为 docx」,首选方案是使用 Pandoc。
如何「将 Markdown 转换为 docx」,ChatGPT 回答使用 Pandoc,并给出了转换命令
Pandoc 是一个基于 GPL 协议开源的免费命令行软件 ,由加州大学伯克利分校哲学系教授 John MacFarlane使用 Haskell语言开发,目前另一位核心开发者是来自德国的Albert Krewinkel 。截止 2022 年 12 月 10 日,Pandoc 的 GitHub 仓库拥有超过 27,000 个 Star,3,000 次 Fork。
根据 John MacFarlane 教授的介绍 ,Pandoc 这个名称是一个组合单词: Pan是希腊神话里的牧神,指的是一切掌管树林、田地和羊群的神,doc 则是 document 的缩写,意为文档。因此从字面意思来看,可以说 Pandoc 是一个「无所不能的文档转换利器」 (universal markup converter),而它的确也拥有名副其实的功能。
作为一个始于 2006 年的个人项目,经过 16 年的发展,现在的 Pandoc 已经变得非常庞杂,拥有相当丰富的功能,可以实现 几十种 文件格式的转换,各种调整细节的选项也不计其数,除了基础的文档转换功能外,还能通过 Lua、Python 等脚本语言实现高度自定义的文档转换,甚至成为其他很多现代文档工具的依赖,例如R Markdown、Quarto。正因如此,它的功能非常复杂,仅PDF 版使用手册 就超过了 150 页。一方面,这使得 Pandoc 上手门槛比较高,容易劝退新手,但另一方面,丰富的功能也让它具有极强的可玩性和无限的可能性,甚至可以不仅限用于文档格式转换,还能实现一些「意料之外」的功能。
Pandoc 作为一个命令行工具,一个经常围绕它的问题是:为什么没有图形化界面(GUI
)?这是因为图形化应用虽然更加容易上手,但缺点也很明显——难以排列下数量庞大的参数。事实上,对于拥有大量参数的软件,命令行界面的易用性其实要优于图形化界面,这一点可以在网友设计的 OpenSSL GUI
中看出来。
如果命令行工具 OpenSSL 拥有图形化界面,将会是如此复杂的样子
当然,如果你非常偏爱图形化应用,可以使用 PanWriter
——一个基于 Pandoc 的 Markdown 编辑器,能够通过 GUI 的方式实现 Pandoc 的部分文档转换功能。
需要指出的是,Pandoc 不仅仅是一个文档转换工具,还包括了它定义的一系列标准,而 Pandoc’s Markdown
就是这样的标准之一。众所周知,诞生于 2004 年的 标准 Markdown
有不少局限性,这导致后来的 Markdown 方言
层出不穷,而在这些 Markdown 方言中,Pandoc’s Markdown 作为少有的「业界良心」,可以说是最为规范、功能最全面的,它主要包括了以下扩展语法:
- 表格:简单表格、多行表格、网格表、管道表格
- 列表:多种多样的有序列表和无序列表
- 行块:以
|
开头,可用于诗歌等特殊文体的排版 - 脚注:包括常规脚注和行内脚注
- 文献引用:在 Markdown 中引用文献,支持 BibTeX 等多种引文格式
- 数学公式:用
$
或$$
包裹数学公式 - 支持混合使用 LaTeX 和 HTML 语法
在强大的 Pandoc’s Markdown 加持下,我们几乎可以在 Markdown 中完成任何类型的写作,并使用 Pandoc 将其转换为其他文件格式。在写作时,我们只需要思考下一句该写什么,而不用考虑写作本身之外的其他因素,正如 Pandoc 邮件讨论组中的网友 Michael Thompson
所说:
In Markdown – not to put too fine a point on it – the writer is only ever faced with one question, and it is the right one: what the next sentence should be.
在 Markdown 中——直言不讳地说——作者只会面对一个问题,而且是正确的问题:下一句应该写什么。
安装 Pandoc 与使用方法
Pandoc 的官网详细介绍了在各个操作系统上的 安装方法
,你可以根据自己使用的操作系统下载安装包进行安装,或者下载源代码 自行编译
。当然,也可以使用包管理器进行安装。例如,在 Windows 上使用 Chocolatey
安装:
choco install pandoc
在 macOS 上使用 Homebrew
安装:
brew install pandoc
在 Linux 上使用 APT
安装:
sudo apt-get install pandoc
安装完成之后,在终端中输入 pandoc --version
,如果输出以下或类似的信息,则意味着安装成功:
pandoc 2.19.2
Compiled with pandoc-types 1.22.2.1, texmath 0.12.5.2, skylighting 0.13,
citeproc 0.8.0.1, ipynb 0.2, hslua 2.2.1
Scripting engine: Lua 5.4
User data directory: /Users/username/.local/share/pandoc
Copyright (C) 2006-2022 John MacFarlane. Web: https://pandoc.org
This is free software; see the source for copying conditions. There is no
warranty, not even for merchantability or fitness for a particular purpose.
Pandoc 的基本使用方式如下:
pandoc [options] [input-file]…
例如,将一个 TXT 文件转换为 HTML 文件:
pandoc -f markdown input.txt -t html -o output.html
上面这行命令中,-f markdown
表示
输入文件的格式为 Markdown,也可以写作 --from=markdown
、-r markdown
或 --read=markdown
。-t html
表示
输出文件格式为 HTML,也可以写作 --to=html
、-w html
或 --write=html
。输入文件为 input.txt
,-o output.html
也可以写作 --output=output.html
,表示
将输出写入到一个 HTML 文件中,命名为 output.html
。
需要注意的是,在命令行中明确指出输入或输出的文件格式不是必须的,因为 Pandoc 可以根据文件扩展名 推测出
文件格式,例如,它会将 .txt
、.md
、.markdown
等扩展名视为 Markdown,将 .html
视为 HTML。而如果输入文件没有扩展名,则会被当作 Markdown,如果输出文件没有扩展名,则会被当作 HTML。因此,上面这行命令可以简写为:
pandoc input.txt -o output.html
不只能处理文件
很多教程都会强调 Pandoc 的「输入文件」和「输出文件」,尽管这本身没有问题,但却在一定程度上限制了 Pandoc 的功能,让新手觉得它只能处理文件。然而事实上并非如此,与大部分命令行工具一样,Pandoc 的输入和输出也可以是 stdin
(标准输入)或 stdout
(标准输出),而不只是文件。
Pandoc 用户手册
指出,如果没有指定输入文件,Pandoc 会从 stdin 读入,如果没有指定输出文件,则输出为 stdout,也就是直接显示在终端中,例如执行下面这行简单的命令:
echo 'hello world' | pandoc
通过 管道操作
|
将 echo
命令的输出结果传递给 pandoc
。由于这里没有指定输入和输出文件,Pandoc 默认会将输入当作 Markdown,将输出当作 HTML,因此输出如下结果,并显示在终端中:
<p>hello world</p>
标准输入和标准输出意味着可以使用 Pandoc 结合其他命令行工具一起使用。假设你得到一个文本文件 input.txt
,它的文件编码不是 UTF-8,但 Pandoc 默认使用