jupyter notebook中latex公式不渲染的主因是单元格未设为markdown模式、mathjax cdn加载失败或使用了全角符号;离线时可通过nbconvert导出html、本地部署mathjax或用ipython.display.latex绕过。

MathJax 默认已启用,无需额外配置 —— 只要 Jupyter Notebook 启动时能联网加载 CDN 资源,$$ 和 $ 包裹的 LaTeX 就能正常渲染。
但现实里常卡在「公式不显示」,问题几乎都出在环境连通性或单元格类型误用上,不是配置缺失。
为什么公式不渲染?先查这三件事
常见现象:写好 $$E = mc^2$$,运行后只看到原样字符串,没变成公式。
- 单元格没设成 Markdown 模式(不是 Code 模式)—— 这是最高频错误;按
Esc退出编辑,再按M切换;或从菜单栏 Cell → Cell Type → Markdown - 浏览器被拦截了
https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js—— 打开开发者工具(F12),看 Console 是否报Failed to load resource;离线或内网环境会触发此问题 - 用了中文引号、全角符号或粘贴时带隐藏控制字符 —— 比如把
$$粘成了$$(看起来一样,实际是中文标点),直接重敲一遍最稳妥
离线环境怎么让 LaTeX 正常工作
当无法访问 CDN(比如公司内网、无外网笔记本),MathJax 加载失败,公式就彻底空白。
- 方案一:用
jupyter nbconvert --to html --no-input notebook.ipynb导出 HTML,它会把 MathJax 打包进本地文件(需提前安装完整版 TeX 环境支持 PDF 导出,但 HTML 不需要) - 方案二:手动部署本地 MathJax —— 下载 MathJax v3.x 解压到
~/.jupyter/custom/下,再在custom.js里加一行:window.MathJax = {loader: {source: {'[tex]/ams': 'https://cdn.jsdelivr.net/npm/mathjax@3/es5/input/tex/extensions/ams.js'}}};(更推荐改用mathjax-config.js注入路径,避免覆盖默认配置) - 方案三:临时绕过 —— 用
IPython.display.Latex强制渲染:from IPython.display import Latex; Latex(r"\frac{a}{b}"),它走的是内核→前端的富文本通道,不依赖页面级 MathJax
sympy.display() 和纯 Markdown 公式有什么区别
本质都是靠 MathJax 渲染,但触发时机和可控性不同:
-
display(expr)是 Python 表达式实时转 LaTeX 字符串再送前端,适合推导过程自动化 —— 但要求expr是sympy对象,普通字符串或 NumPy 数组会报错 - Markdown 中写
$$\int_0^1 x^2 dx$$是静态文本,完全由前端解析,不经过 Python 内核,所以更快、更稳定,也支持多行对齐、编号等高级 LaTeX 功能 - 混用风险:在同一个 cell 里既跑
display()又写 Markdown 公式,可能因执行顺序导致排版错位;建议逻辑分离 —— 推导用sympy,结论用 Markdown 展示











