在Jupyter中插入可渲染公式必须用IPython.display.Math或sympy.display()触发MathJax渲染,而非print()输出LaTeX字符串;Math(r"e^{ipi}+1=0")渲染行内公式,Math(r"$$int_0^infty e^{-x^2}dx$$")渲染块级公式;sympy需init_printing(use_latex=True)后调用display(expr)。

直接在代码 cell 里用 print() 或 display() 输出 LaTeX 字符串,不会渲染成公式——它只会显示为纯文本。真正在代码中“插入可渲染公式”,本质是让 Jupyter 执行一个能触发 MathJax 渲染的对象,而不是拼字符串。
用 IPython.display.Math 渲染行内或块级公式
这是最稳妥、语义最清晰的方式:把 LaTeX 字符串包装成 Math 对象,Jupyter 会识别并交由 MathJax 渲染。
- 行内公式:
from IPython.display import Math; Math(r"e^{ipi} + 1 = 0") - 块级(居中)公式:
Math(r"$$int_0^infty e^{-x^2}dx = rac{sqrt{pi}}{2}$$")—— 注意:双美元符号$$要写在字符串里,不是外层语法 - 不能用
print(Math(...)),那样会输出对象地址;必须单独一行执行或用display()包裹
用 sympy 的 display() 自动转公式
如果你已经用了 SymPy 做符号计算,display() 是最省心的选择——它自动调用 latex() 并渲染,无需手写 LaTeX。
- 确保已运行
from sympy import *和init_printing(use_latex=True)(后者在新版中常默认启用) -
x, y = symbols("x y"); expr = integrate(sin(x)**2, x); display(expr)→ 直接渲染积分结果 -
display(latex(expr))反而只输出字符串,不渲染;别混淆latex()(生成字符串)和display()(触发渲染) - 矩阵、求导、求和等复杂结构都能正确转换,但自定义宏(如
ewcommand)不被支持
别用 print() 或字符串拼接假装“插入公式”
常见错误写法:print("$$\frac{a}{b}$$") 或 print(f"$$ {some_var} $$") —— 这只会打印出带双美元符的文本,浏览器根本不会解析它。
- Jupyter 只在 Markdown cell 或特定 display 对象中解析
$$;代码 cell 的 stdout 是纯文本流 - 哪怕你用
%%latex魔法命令,也只对整个 cell 生效,不能嵌在普通 Python 代码中间 - 试图用 HTML +
<script>手动加载 MathJax 属于过度设计,且易被 CSP 拦截,不推荐
离线环境公式不显示?检查 MathJax 加载状态
公式空白或显示原始代码,大概率不是语法错,而是 MathJax 没加载成功。
- 打开浏览器开发者工具(F12),看 Console 是否报
MathJax is not defined或 404 - 默认 MathJax 从 CDN(如
https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js)加载;断网或内网环境会失败 - 临时解决:启动 Jupyter 时加参数
jupyter notebook --NotebookApp.nbserver_extensions="{'jupyter_nbextensions_configurator':True}",再装本地 MathJax 插件;长期建议用jupyter lab+@jupyter-widgets/jupyterlab-manager组合更稳定
真正关键的不是“怎么写 LaTeX”,而是“谁来负责渲染”——Markdown cell 由页面解析,代码 cell 必须靠 Math 或 display() 主动触发。漏掉这层机制,写得再标准也是白搭。


















