Sublime Text 的 Export to PDF 菜单项灰色,主因是未满足触发条件:未安装启用 MarkdownPreview 插件、文件语法未设为 Markdown/GFM、构建系统 selector 不匹配或 pandoc 不可用。

Sublime Text 本身不提供 Markdown 转 PDF 功能,所谓“配置成功”,本质是让编辑器能正确调用 pandoc(或其他命令行工具)完成转换——路径错、权限缺、插件旧,任一环节断掉,Export to PDF 就会灰色或报错。
为什么 Export to PDF 菜单项是灰色的?
这不是 Sublime 的 bug,而是触发条件没满足:
-
MarkdownPreview插件必须已安装且启用(老版MarkdownPDF插件已废弃,不兼容 ST4) - 当前文件语法必须设为
Markdown或GitHub Flavored Markdown(右键 →Set Syntax→ 选对项) - 构建系统(Build System)未激活,或 selector 不匹配:
"selector": "source.gfm"才能在 .md 文件里生效 - 插件内部检测到
pandoc不可用(比如终端能运行,但 Sublime 的环境变量里没有),也会禁用菜单
如何写一个能用的 Markdown2PDF.sublime-build?
别抄网上过时的模板,关键字段只有三个,且必须按你本地环境调整:
-
"cmd":必须显式指定pandoc全路径(Mac 上常见位置是/opt/homebrew/bin/pandoc或/usr/local/bin/pandoc;Linux 多在/usr/bin/pandoc;Windows 是C:\Program Files\Pandoc\pandoc.exe) -
"path":只填pandoc所在目录,不是整个 PATH;多个路径用冒号(macOS/Linux)或分号(Windows)隔开,例如"path": "/opt/homebrew/bin:/usr/local/bin" -
"selector":务必设为"source.gfm",这是MarkdownPreview插件识别 GitHub 风格 Markdown 的标准 scope
最小可用示例(macOS):
将任意网站转换为文件系统,自动抓取网站并将页面挂载为 Markdown 文件,可使用 grep、diff、cat 等标准 Unix 命令进行搜索、比较、读取和浏览。
{
"cmd": ["/opt/homebrew/bin/pandoc", "-s", "-o", "$file_base_name.pdf", "$file"],
"selector": "source.gfm",
"path": "/opt/homebrew/bin"
}
导出的 PDF 中文乱码/字体丑怎么办?
这和 Sublime 无关,是 pandoc 渲染链路的问题。默认用 LaTeX 引擎(如 xelatex)时,中文需显式指定字体;用 weasyprint 则依赖 CSS 中的 font-family 和系统字体存在性:
- 若用
pandoc + xelatex,必须加--pdf-engine=xelatex和-V mainfont="Noto Serif CJK SC"(需系统装了该字体) - 若用
pandoc + weasyprint,得先pip install weasyprint,再在 build cmd 里写["pandoc", "-t", "html5", ...]并配合自定义 CSS 指定中文字体,例如body { font-family: "PingFang SC", "Microsoft YaHei", sans-serif; } - 直接用
wkhtmltopdf更简单,但它默认不嵌入字体,中文显示方框——唯一解是确保 CSS 中写的字体名与系统已安装字体完全一致(大小写、空格、括号都要对)
为什么推荐 pandoc 而不是 phantomjs/puppeteer?
因为前者稳定、可控、可调试:
-
phantomjs已停止维护,puppeteer依赖 Chrome 环境,在 CI 或无图形界面服务器上容易失败 -
pandoc是纯命令行工具,输出可预测;报错信息明确(比如Could not find data file fonts.conf就是字体配置问题) - LaTeX 模板支持目录、页眉页脚、参考文献等专业排版,
weasyprint对复杂表格和分页支持弱,尤其含中文时容易断行错位
真正卡住人的从来不是“怎么配”,而是把 pandoc --version 能跑通的路径,准确塞进 sublime-build 的 path 字段里——多试两次 which pandoc,别信“应该在 /usr/local/bin”这种经验判断。

















