highlight cli 是目前最稳的导出路径:它不依赖 atom 插件、兼容性强、参数可控,配合 chrome 勾选 background graphics 可导出带语法高亮、行号、合适字体与行距的 pdf。

highlight CLI 是目前最稳的导出路径
Atom 自带打印功能不走 CSS 渲染层,Cmd+P 导出的 PDF 必然黑白、无行号、字体小、行距紧。想拿到带语法高亮、可读性强的 PDF,必须绕过 Atom 的渲染流程,用外部工具重生成。首选 highlight:它不依赖 Atom 插件、不卡 Electron 版本兼容性、参数可控、输出 HTML 干净。
常见错误现象包括:highlight: command not found(没装)、PDF 里中文字体糊成方块(缺字体)、长行横向溢出(没启用换行)。
- macOS 执行
brew install highlight;Ubuntu/Debian 用sudo apt install highlight - 关键参数必须带全:
--out-format=html --style=github-dark --font-size=12pt --line-numbers --wrap-simple - 中英文混排出问题时,显式指定字体:
--font="Fira Code"或--font="SFMono-Regular, Consolas" - 文件路径含中文或空格?先
cd到纯英文路径下再执行,否则可能静默失败
Chrome 导出 PDF 时必须勾选 Background graphics
生成的 code.html 在 Chrome 中打开后,Cmd+P → “Save as PDF” 时,若没勾选 Background graphics,所有高亮色、背景色、行号底色都会丢失,只剩黑字白底——这不是样式没生效,是浏览器主动过滤了背景渲染。
其他容易被忽略的细节:
- 导出前确保 Chrome 已更新到 v120+,旧版本对
--wrap-simple生成的折行支持不稳定 - 页边距太窄导致行号被裁?在打印设置里手动调大“Margins”为 None 或 Minimum
- 不想每页都带网址和页码?在 Chrome 打印设置里取消勾选 Headers and footers
插件方案(如 print-atom、prism-highlight)为什么常翻车
这类插件底层调用 Electron 的 webContents.printToPDF(),但 Electron 对 PDF 输出的控制粒度极粗:无法设字体、不能调行高、页边距写死、不支持自定义纸张方向。实际导出后,90% 的排版问题都源于此。
典型症状包括:
-
print-atom导出后行号错位或截断——因它把 Atom 编辑器 DOM 当作整页渲染,未做容器宽度约束 -
prism-highlight生成的 HTML 在微信/邮件里变黑白——默认引用 CDN CSS,而这些环境屏蔽外链 - 导出 PDF 中文字体显示为方块——插件未指定系统字体栈,且未 fallback 到本地已安装字体
- 插件设置里开了
Include line numbers却没效果——因为当前文件 grammar 未正确识别(比如.vue文件 scope 是text.html.vue而非source.vue)
真正起作用的三个前置条件
无论你选 CLI 还是插件,以下三点不满足,高亮 PDF 就不可能正常:
- 当前文件必须有正确 grammar:按
Cmd+Alt+Shift+P(macOS)或Ctrl+Shift+P(Win/Linux)输入Editor: Log Cursor Scope,首行输出应为source.python、source.vue等,而非text.plain - 对应 language 插件必须已安装并重启 Atom:比如
.svelte需language-svelte,.tsx需language-typescript-react,只装language-typescript不行 -
config.cson中fileTypes映射必须准确:写成'.svelte': 'source.svelte',不能漏引号、不能写成'svelte'或source.svelte(无引号)
最容易被跳过的其实是最后一点:很多人改完 config.cson 就直接导出,却忘了 Atom 不会热重载 fileTypes 配置——必须完全退出再启动,否则新映射不生效。











