Я пытаюсь написать пример галереи сфинкса для модуля, использующего Sympy. Я не могу найти способ форматировать выходные данные как математические. Например, в блокнотах Jupyter вывод выражения Sympy отображается в математическом режиме. В примере, отрисованном с помощью sphinx с использованием sphinx-gallery, отображается только строка.
Я попробовал использовать функции из 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 неверен.
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 import latex
from sympy.core.evalf import EvalfMixin
from sympy.matrices.repmatrix import MutableRepMatrix
def print_html(expr):
return f'{latex(expr, mode = "equation*", itex=True)}'
EvalfMixin._repr_html_ = print_html
MutableRepMatrix._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
Результаты