2016-04-15 62 views
2

ユーザーは、Tkinter Entry Widgetなどのテキストボックスに数式を入力し、式をsymbolabに入力したときと同じ方法で表示するGUIを作成する予定です。PythonがリアルタイムでLaTexをテキストボックスに表示することは可能ですか?

これは可能ですか?もしそうなら、これを達成するためにどのモジュールを使用しなければなりませんか?

+0

アプリケーション内でMathJaxを動作させることをお勧めします。TeXは大規模なディストリビューションです。 –

+0

申し訳ありませんが、私はそれを確認します。 –

答えて

2

を使用してラテックスとレンダリング画像の代わり

  • テキストをレンダリング。私はあまりにもそれが閉鎖されるべきかどうかはあまり確信していません。それでも、Tkとmatplotlibを対話的に扱うラテックスを得る方法についての抜粋です。

    エントリウィジェットに何かを入力し、Enterキーを押します。

    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() 
    

    コードは、1怒鳴るなどのウィンドウを生成する必要があります

    enter image description here

    あなたは彼らのこのような素敵なインタフェースが十分ではないようにする場合。彼らはおそらく、ラテックスからUnicodeへの変換設定の平文のようなものを持っています。それとも、おそらく平文からUnicodeに直接変換するのですが、私はラテックスのような数式表現のためのパーサを認識していないので、すべてのルールを再コーディングしなければならないと思われます。ラテックスに重い持ち上げをさせ、次にラテックスをUnicode/Utf8にパースするか、あるいはすべての符号を扱うことができる符号化を解析します。

    次に、要素の型(バイナリ演算子、変数、指数など)に基づいて各要素に独自の素敵なCSSクラスを割り当てる「余分な」(つまりdjangoとjinjaのテンプレート処理)にすべてをダンプしました。素敵に見え、まだコピーすることができる完全な数学の出力。

    いずれにしても、この質問には非常に多くのことがありますが、簡潔で包括的な簡単な答えを与えることは実際には不可能です。

  • +0

    これはTeX出力ではありません。それは近似です。 @SeanAllred; –

    +1

    ;あなたは正しいです、それはより高速ですがオプションの少ないmatplotlibからのmathtextレンダリングです。 OPがLatexレンダリングを使用したい場合は、matplotlibのrc設定でtext.usetex:Trueを設定する必要があります。ありがとう。 – ljetibo

    0

    提案のカップル:

    • バックエンドでPDF /画像にテックスに変換し、この質問はあまりにも広いmatplotlib
    1

    これは非常にエレガントではありませんが、これは実例(python2、raspbian)です。これは多数の中の1つの解決策ですが、ラテックスソースファイルからTkinterプログラムまでのすべてのステップを示しています。

    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() 
    

    さまざまなバリエーションがあります。psの代わりにlatex to pdfをコンパイルします。他のイメージファイル形式を使用する。ライブラリPILを使用して他のフォーマットなどをサポートする

    この解決方法もまた非常に非効率的です(私には分かりませんが、わかります)。たとえば、私のシステムでは、ppmファイルは1,5Mbです。方程式は大きなページの中央にも現れます(それは切り取る必要があります)。

    改善が必要な場合でも、質問に答えて(LaTeXドキュメントをTkinterプログラムで表示する)、出発点を与える必要があります。

    関連する問題