直接点击vscode或jupyter的“导出为pdf”按钮大概率失败,因底层依赖系统latex引擎(如pdflatex或xelatex),而多数环境未安装;且默认不执行代码单元格,导致pdf内容为空或报错;中文显示异常则需改用xelatex并配置ctex及中文字体。

直接点 VSCode 或 Jupyter 界面里的“导出为 PDF”按钮,大概率失败——不是 notebook 有问题,而是你缺 pdflatex 或 xelatex,或者 notebook 根本没执行过就硬导。
为什么 nbconvert --to pdf 报 “pdflatex not found”
VSCode 和经典 Jupyter 的 PDF 导出按钮,底层全靠 jupyter nbconvert 调用系统 LaTeX 引擎。它默认找 pdflatex,但这个命令根本不在你的 PATH 里。
- Windows:装
MiKTeX(选 “Complete” 安装)或TeX Live,安装完重启终端,运行pdflatex --version或xelatex --version应有输出 - macOS:用
brew install --cask mactex(4GB,但省心),或brew install tinytex && tinytex::install_tinytex()(需在 R 里运行,再手动加路径) - Linux(Ubuntu/Debian):
sudo apt install texlive-xetex texlive-fonts-recommended texlive-plain-generic - 验证是否生效:别在 VSCode 内置终端里试——先关掉它,新开一个系统终端,cd 到 notebook 所在目录,再跑
pdflatex --version
导出前必须加 --execute,否则 PDF 是空的
默认 nbconvert 只打包当前编辑器里“已存在”的输出。如果你没手动一个个 Run All,那图是空的、变量报 NameError、Markdown 渲染也不完整。
- 正确命令:
jupyter nbconvert --to pdf --execute my_notebook.ipynb - 容忍部分单元格报错(比如绘图时路径错):
--allow-errors - 想隐藏代码块、只留输出和文字:
--no-input - 注意工作目录:如果 notebook 里用了
pd.read_csv("data.csv"),必须先cd到它所在文件夹再执行命令,否则读不到文件
中文显示为空白?换 xelatex + 自定义模板
pdflatex 原生不支持 TrueType 字体,中文基本必挂;xelatex 才是正解,但它需要显式指定中文字体和宏包。
- 确认
xelatex可用:xelatex --version - 创建自定义模板目录,例如
~/.jupyter/nbconvert/templates/cn/ - 在该目录下放
conf.json(内容为{"base_template": "article"})和index.tex.j2(开头加字体声明):
((*- extends 'article.tplx' -*))
((* block packages *))
((( super() )))
\usepackage{ctex}
\usepackage{fontspec}
\setmainfont{Noto Serif CJK SC}
\setsansfont{Noto Sans CJK SC}
\setmonofont{Fira Code}
((* endblock packages *))
- 导出时指定引擎和模板:
jupyter nbconvert --to pdf --pdf-engine=xelatex --template=cn my_notebook.ipynb
浏览器打印法适合快速出个草稿
不想装 LaTeX?临时分享给同事看一眼?浏览器打印是最轻量的兜底方案。
- 在 Jupyter 或 VSCode 中打开 notebook,先点 “Run All Cells”
- 按
Ctrl+P(Win/Linux)或Cmd+P(Mac),选“另存为 PDF” - 关键设置:布局选“横向”,缩放调到 80%–90%,勾选“背景图形”(不然 matplotlib 图是白底)
- 缺点明显:复杂表格会断行、MathJax 公式可能渲染不全、无书签、不能批量处理
真正稳定的 PDF 导出,核心就三件事:LaTeX 引擎装对、--execute 加到位、中文走 xelatex + ctex。其余都是围绕这三点的路径适配——别被“一键导出”的 UI 欺骗,那个按钮只是壳。











