Пользовательские атрибуты sympy MathJax в jupyter - PullRequest
0 голосов
/ 09 мая 2019

Я пытаюсь сделать симпатичные выражения рендеринга с пользовательскими атрибутами в результирующем MathJax под Jupyter.Я могу заставить его работать, если я явно отображаю его с помощью IPython.display.HTML, однако я хочу сделать это способом по умолчанию, как sympy отображает выражения.мне нужно использовать Инспектор в Firefox или тому подобное, чтобы увидеть его).

ml=MyMathMLPresentationPrinter()._print(expr).toxml()
HTML('<math>'+ml+'</math>')

Я пытался сделать следующее, но это не решило проблему.

def my_print(expr, **settings):
    ml= MyMathMLPresentationPrinter().doprint(expr)
    return ml
sympy.init_printing(pretty_printer=my_print,pretty_print=True,use_latex=False)

expr

Любые предложения о том, как сделать эту работу?

Спасибо

1 Ответ

0 голосов
/ 20 мая 2019

В случае, если кому-то еще это понадобится, следующее будет делать то, что я хотел

from sympy.printing.mathml import MathMLPresentationPrinter
from sympy import init_printing,Symbol,Function
from sympy.abc import x,y
from IPython.display import HTML
from sympy.core.basic import Basic

class MyMathMLPresentationPrinter(MathMLPresentationPrinter):
    def _print(self,expr):
        res=super()._print(expr)
        res.attributes['sympyclass']=type(expr).__name__
        return(res)

    def _print_AppliedUndef(self, e):
        mrow = self.dom.createElement('mrow')
        x = self.dom.createElement('mi')
        x.appendChild(self.dom.createTextNode(e.__class__.__name__))
        y = self.dom.createElement('mfenced')
        for arg in e.args:
            y.appendChild(self._print(arg))
        mrow.appendChild(x)
        mrow.appendChild(y)
        return mrow

    def doprint(self, expr):
        mathML = self._print(expr)
        unistr = mathML.toxml()
        xmlbstr = unistr.encode('ascii', 'xmlcharrefreplace')
        res = xmlbstr.decode()
        return res


def basic_html(obj):
    ml=MyMathMLPresentationPrinter()._print(obj).toxml()
    return '<math>'+ml+'</math>'

html_formatter = get_ipython().display_formatter.formatters['text/html']
html_formatter.for_type(Basic, basic_html)

init_printing()
F=Function('F')
expr=F(x).diff(x)
expr
...