2016-04-15 3 views
2

Ich plane eine GUI, wo der Benutzer ihre mathematischen Ausdrücke in ein Textfeld eingeben würde, wie zum Beispiel Tkinter Entry Widget, und ihre Ausdrücke würden auf die gleiche Weise angezeigt werden wie beim Eingeben der Ausdrücke in symbolab.Ist es Python möglich, LaTex in Echtzeit in einem Textfeld anzuzeigen?

Ist das möglich? Wenn ja, welche Module muss ich dazu verwenden?

+0

Sie hätten mehr Glück, wenn Sie versuchen, MathJax in Ihrer Anwendung zu verwenden.TeX ist eine große Distribution. –

+0

Okay, ich werde das überprüfen. –

Antwort

2

Diese Frage ist viel zu breit . Ich bin mir nicht sicher ob es geschlossen ist. Nichtsdestoweniger, hier ist ein Ausschnitt, wie Latex zumindest mit Tk und Matplotlib interaktiv arbeiten kann.

Geben Sie etwas in das Eingabe-Widget ein und drücken Sie die Eingabetaste.

import matplotlib 
import matplotlib.pyplot as plt 

from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg 
matplotlib.use('TkAgg') 

from Tkinter import * 
from ttk import * 

def graph(text): 
    tmptext = entry.get() 
    tmptext = "$"+tmptext+"$" 

    ax.clear() 
    ax.text(0.2, 0.6, tmptext, fontsize = 50) 
    canvas.draw() 


root = Tk() 

mainframe = Frame(root) 
mainframe.pack() 

text = StringVar() 
entry = Entry(mainframe, width=70, textvariable=text) 
entry.pack() 

label = Label(mainframe) 
label.pack() 

fig = matplotlib.figure.Figure(figsize=(5, 4), dpi=100) 
ax = fig.add_subplot(111) 

canvas = FigureCanvasTkAgg(fig, master=label) 
canvas.get_tk_widget().pack(side=TOP, fill=BOTH, expand=1) 
canvas._tkcanvas.pack(side=TOP, fill=BOTH, expand=1) 

ax.get_xaxis().set_visible(False) 
ax.get_yaxis().set_visible(False) 

root.bind('<Return>', graph) 
root.mainloop() 

Code soll ein Fenster wie ein Balg produzieren:

enter image description here

Wenn Sie eine schöne Schnittstelle haben wollen wie ihr dies nicht ausreichen wird. Sie haben wahrscheinlich so etwas wie einen Klartext zur Umwandlung von Latex in Unicode. Oder vielleicht sogar direkt von Klartext zu Unicode, aber mir ist kein Parser für mathematische Ausdrücke so gut wie Latex bekannt, also müssten vermutlich alle Regeln neu codiert werden, und das ist eine Menge Arbeit, also haben sie diesen Schritt höchstwahrscheinlich übersprungen Lassen Sie Latex das schwere Heben machen und parsen Sie dann einfach Latex nach Unicode/Utf8 oder welche Kodierung auch immer mit allen Zeichen umgehen kann.

Dann dumpten sie alles durch etwas "extra" (dh django und jinja templating), das jedem Element eine eigene nette css-Klasse zuweist, basierend auf dem Elementtyp (binärer Operator, Variable, Exponent ...) die volle mathematische Ausgabe, die nett aussieht und noch kopiert werden kann.

Auf jeden Fall ist in dieser Frage so viel los, dass es nicht wirklich möglich ist, eine prägnante, allumfassende einfache Antwort zu geben.

+0

Das ist nicht TeX-Ausgabe. Das ist eine Annäherung. –

+1

@SeanAllred; Sie haben Recht, das ist das Mathetext-Rendering von Matplotlib, das schneller ist, aber weniger Möglichkeiten bietet. Wenn das OP Latex-Rendering verwenden möchte, sollte er den Text.usetex: True in den rc-Einstellungen von Matplotlib setzen. Vielen Dank. – ljetibo

0

Ein paar Vorschläge:

  • Convert Tex pdf/Bild im Backend und machen das Bild stattdessen
  • Text-Rendering mit Latex mit matplotlib
1

Dies ist ein funktionierendes Beispiel (Python2, Raspbian), obwohl es nicht sehr elegant ist. Dies ist eine Lösung unter einer Vielzahl, aber es zeigt alle Schritte von der Latex-Quelldatei bis zum Tkinter-Programm.

from subprocess import call 
import Tkinter 

TEX = ( # use raw strings for backslash 
    r"\documentclass{article}", 
    r"\begin{document}", 
    r"$$a^2 + b^2 = c^2$$", 
    r"$$x=\frac{-b \pm \sqrt{b^2 - 4ac}}{2a}$$", 
    r"\end{document}", 
) 

with open('doc1.tex','w') as out_file: 
    for t in TEX: 
    out_file.write("%s\n" % t) 

call(['latex','doc1.tex']) 
call(['dvips','doc1.dvi','-o','doc1.ps']) 
call(['gs','-sDEVICE=ppmraw','-dNOPAUSE','-dBATCH','-dSAFER','-sOutputFile=doc1.ppm','doc1.ps']) 

root1 = Tkinter.Tk() 
img1 = Tkinter.PhotoImage(file="doc1.ppm") 
label1 = Tkinter.Label(root1, image=img1) 
label1.pack() 
root1.mainloop() 

Es gibt viele mögliche Variationen: Kompilieren von Latex zu pdf anstelle von ps; andere Bilddateiformate verwenden; Verwenden Sie die Bibliothek PIL zur Unterstützung anderer Formate usw.

Diese Lösung ist auch sehr ineffizient (sag mir nicht, ich weiß). Zum Beispiel ist auf meinem System die ppm Datei 1,5 MB. Die Gleichungen erscheinen auch in der Mitte einer großen Seite (sie müsste abgeschnitten werden).

Auch wenn es verbessert werden muss, beantwortet es Ihre Frage (zeigt ein LaTeX-Dokument in einem Tkinter-Programm an) und sollte Ihnen einen Ausgangspunkt geben.