You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写可在Jupyter Notebook自然输出LaTeX的自定义类

问题描述

本问题并非另一相似问题的重复,尽管二者密切相关。

在Jupyter Notebook中使用SymPy时,它可以通过MathJax优雅格式化方程输出,示例效果为渲染美观的数学公式(如二次方程求根公式的分式形式)。

查看笔记本源码可知,保存的输出包含text/plain和text/latex两部分:

"outputs": [
 {
  "data": {
   "text/latex": [
    "$\\displaystyle \\frac{- b - \\sqrt{- 4 a c + b^{2}}}{2 a}$"
   ],
   "text/plain": [
    "(-b - sqrt(-4*a*c + b**2))/(2*a)"
   ]
  },
  "execution_count": 22,
  "metadata": {},
  "output_type": "execute_result"
 }
],
"source": [
 "import sympy\\n",
 "\\n",
 "a, b, c = sympy.symbols('a b c')\\n",
 "(-b - sympy.sqrt(b**2 - 4*a*c)) / (2*a)"
]

尽管已知如何手动打印LaTeX格式,但我希望让自定义对象表现得像SymPy对象一样,能够在Jupyter Notebook中自然显示为LaTeX数学公式,同时填充text/plain和text/latex字段,求实现思路。


实现思路

Jupyter Notebook通过识别对象的特殊方法来生成不同格式的输出,给自定义类实现对应方法即可达成需求:

1. 填充text/plain字段:实现__repr__/__str__方法

  • __repr__用于交互式环境的“正式”输出,__str__用于print()调用时的输出,Jupyter会基于这两个方法生成text/plain部分的内容。
  • 示例代码:
class MyMathObj:
    def __init__(self, numerator, denominator):
        self.num = numerator
        self.den = denominator
    
    # 给交互式环境的正式输出
    def __repr__(self):
        return f"MyMathObj(num={self.num}, den={self.den})"
    
    # 给print()的简洁输出
    def __str__(self):
        return f"{self.num} / {self.den}"

2. 生成text/latex字段:实现_repr_latex_方法

Jupyter会自动检测对象是否包含该方法,调用它生成LaTeX格式输出,返回的字符串需要用$包裹,推荐加上\displaystyle来渲染更美观的公式排版。

  • 示例代码(继承上面的类):
class MyMathObj:
    # 继承__repr__/__str__方法
    def _repr_latex_(self):
        # 用双大括号转义LaTeX中的大括号
        return f"$\\displaystyle \\frac{{{self.num}}}{{{self.den}}}$"

3. 进阶:精细控制多格式输出(可选)

如果需要同时控制多种MIME类型的输出(比如HTML、SVG),可以实现_repr_mimebundle_方法,直接返回包含各格式内容的字典,精准指定text/plain和text/latex的内容:

class MyMathObj:
    def __init__(self, numerator, denominator):
        self.num = numerator
        self.den = denominator
    
    def _repr_mimebundle_(self, include=None, exclude=None):
        plain_content = f"({self.num} / {self.den})"
        latex_content = f"$\\displaystyle \\frac{{{self.num}}}{{{self.den}}}$"
        return {
            'text/plain': plain_content,
            'text/latex': latex_content
        }

验证效果

在Jupyter中实例化自定义对象后直接运行单元格,就能看到和SymPy完全一致的效果:既会渲染美观的LaTeX公式,查看笔记本源码时也能看到text/plain和text/latex字段被正确填充。

内容的提问来源于stack exchange,提问作者yota

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 17:01:09