Konvertierung von python-numeric-expression in LaTeX
Brauche ich zum konvertieren von Zeichenfolgen, die gültige python-syntax, wie:
'1+2**(x+y)'
und das äquivalent LaTeX:
$1+2^{x+y}$
Habe ich versucht sympy die latex-Funktion, aber es Prozesse, die eigentliche Ausdruck ist, eher als die string-form:
>>> latex(1+2**(x+y))
'$1 + 2^{x + y}$'
>>> latex('1+2**(x+y)')
'$1+2**(x+y)$'
aber auch hierzu benötigt es x und y werden deklariert als Typ "Symbole".
Möchte ich mich etwas mehr straight forward, vorzugsweise machbar mit dem parser aus der compiler-Modul.
>>> compiler.parse('1+2**(x+y)')
Module(None, Stmt([Discard(Add((Const(1), Power((Const(2), Add((Name('x'), Name('y'))))))))]))
Last but not least, warum: ich brauche zu erzeugen, die latex-Schnipsel, so dass ich zeigen kann, die Sie in einer Webseite mit mathjax.
- Eine wichtige Unterscheidung ist, dass Sie analysieren, diese Ausdrücke nicht zu bewerten, sondern zu tun, Dokument-layout mit Ihnen. Es ist zu sagen, dass Sie wusste, zu ersetzen, die Klammern um
x+y
mit Klammern, aber es gibt sicher andere Orte, wo die Klammern würde bewahrt werden müssen. Ich denke, du gehst zu haben, um einige Gründliche Gedanken darüber, was Sie versuchen, zu analysieren, und was sollte es Aussehen, wenn Sie fertig sind. Dann können Sie beginnen, überlegen, wie eine solche Veränderung erreicht werden könnte gegeben, einen passenden parser. Dies wird Ihnen auch helfen zu formulieren, was der parser benötigen, zu tun.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie
sympy.latex
miteval
:Haben Sie immer noch deklarieren Sie die Variablen als Symbole, aber wenn das ist wirklich ein problem, es ist viel einfacher zu schreiben, einen parser, um dies zu tun, als alles analysieren und generieren, die latex von Grund auf.
Hier ist eine ziemlich lange, aber trotzdem unvollständige Methode, die nicht die sympy in keiner Weise. Es ist genug, um das Beispiel von
(-b-sqrt(b**2-4*a*c))/(2*a)
die übersetzt wird, zu\frac{ - b - \sqrt{b^{2} - 4 \; a \; c}}{2 \; a}
und macht soEs schafft im Grunde die AST und Spaziergänge, die Herstellung der latex-Mathematik-das entspricht der AST-Knoten. Was sollte es geben genug von einer Idee, wie Sie erweitern es in den Orten, es fehlt.
\operatorname
Befehl benutzt für Funktionsaufrufe erfordert amsmath. Für mathjax müssen Sie die entsprechende Erweiterung pro mathjax.org/resources/docs/?tex.html#amsmath-and-amssymbolKönnen Sie SymPy. Übergeben Sie die Zeichenfolge an die
sympify()
zuerst die Funktion, die konvertiert es in ein gültiges SymPy-Ausdruck (d.h., erstellen Sie die Symbole für Sie, etc.). Also könnte man tun,S()
ist auch eine Verknüpfung zusympify()
, d.h.,latex(S('1+2**(x+y)'))
auch funktioniert.Nur eine kleine Korrektur zu Geoff Reedy ausgezeichnete Antwort:
Bevor es würde nicht fügen Sie das neue Element an das dict. Jetzt können Sie diese mit Ihrem Ausdruck:
und Sie können noch weiter zu vereinfachen, bevor Sie es konvertieren zu LaTeX:
erhalten Sie dies:
Bauen auf tom10 die Antwort, die Sie definieren können, ein Wörterbuch, das generieren von Symbolen und verwenden Sie, dass beim Aufruf von eval:
Dann, wenn Sie
sollten Sie nicht haben, um sorgen über pre-erstellen von Symbolen für die Variablen.