我正在尝试为使用 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 "apply"" title="Unknown node type "apply"">
<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>˙</mo>
</mover>
</mrow>
<mo>=</mo>
<mi>x</mi>
<msup>
<mi>y</mi>
<mn>2</mn>
</msup>
<mo>−</mo>
<mfrac>
<msqrt>
<mi>x</mi>
</msqrt>
<mi>y</mi>
</mfrac>
</math>
绝对不一样。
有没有已知的方法可以正确地做到这一点?
以下解决方案使用 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
结果是