在 sphinx-gallery 中捕获 sympy 数学输出

问题描述 投票:0回答:1

我正在尝试为使用 sympy 的模块编写一个 sphinx-gallery 示例。 我找不到一种方法来获得像数学一样的输出格式。 例如,在 jupyter 笔记本中,sympy 表达式的输出以数学模式呈现。 在使用 sphinx-gallery 使用 sphinx 渲染的示例中,仅显示字符串。

我尝试使用

sympy.printing.mathml
中的函数并猴子修补表达式以显示,例如

#%%
# Should show this
#
# .. math::
#     \dot{x} = x y^2 - \frac{\sqrt{x}}{y}
#
from sympy.printing.mathml import mathml
from sympy.core.evalf import EvalfMixin

def print_html(expr):
    return f'<math xmlns="http://www.w3.org/1998/Math/MathML" display="block">{mathml(expr)}</math>'
    
EvalfMixin._repr_html_ = print_html

from sympy import symbols, Symbol, Eq, sqrt
x, y = symbols("x y")

expr = Eq(Symbol(r"\dot{x}"), x*y**2 - sqrt(x)/y)
expr

错误是

<math xmlns="http://www.w3.org/1998/Math/MathML">
  <merror data-mjx-error="Unknown node type &quot;apply&quot;" title="Unknown node type &quot;apply&quot;">
    <mtext>Math input error</mtext>
  </merror>
</math>

所以 MathML 似乎不正确。

我的hack生成的html是这样的

<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><apply><eq></eq><ci>\dot{x}</ci><apply><plus></plus><apply><minus></minus><apply><divide></divide><apply><root></root><ci>x</ci></apply><ci>y</ci></apply></apply><apply><times></times><ci>x</ci><apply><power></power><ci>y</ci><cn>2</cn></apply></apply></apply></apply></math>

以及之前的单元格生成的

<math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
  <mrow data-mjx-texclass="ORD">
    <mover>
      <mi>x</mi>
      <mo>&#x2D9;</mo>
    </mover>
  </mrow>
  <mo>=</mo>
  <mi>x</mi>
  <msup>
    <mi>y</mi>
    <mn>2</mn>
  </msup>
  <mo>&#x2212;</mo>
  <mfrac>
    <msqrt>
      <mi>x</mi>
    </msqrt>
    <mi>y</mi>
  </mfrac>
</math>

绝对不一样。

有没有已知的方法可以正确地做到这一点?

sympy python-sphinx
1个回答
0
投票

以下解决方案使用 mathjax 渲染乳胶代码。我仍然无法生成 svg 数学,但这适用于互联网访问

"""
Testing sympy mathml
====================
"""
# %%
# Should show this
#
# .. math::
#     \dot{x} = x y^2 - \frac{\sqrt{x}}{y}
#
from sympy.printing.mathml import mathml
from sympy import latex
from sympy.core.evalf import EvalfMixin


def print_html(expr):
    return f'{latex(expr, mode="equation*", itex=True)}'


EvalfMixin._repr_html_ = print_html

from sympy import symbols, Symbol, Eq, sqrt

x, y = symbols("x y")

expr = Eq(Symbol(r"\dot{x}"), x * y ** 2 - sqrt(x) / y)
expr

结果是

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.