2012-03-06 26 views
6

Esiste un codice Python che consente di prendere un codice in lattice (per equazioni) e analizzarlo in codice mathml o svg? Una semplice funzione che prende come argomento una stringa (il codice in lattice) ed emette una stringa (il codice svg o mathml) sarebbe perfetta.conversione di un codice in lattice in codice mathml o svg in python

PS. Ho trovato questo http://svgkit.sourceforge.net/SVGLaTeX.html ma è un progetto basato sul web e non sono sicuro di come usarlo.

MODIFICA: o in qualsiasi lingua (non obbligatorio python), o almeno un file exe che può essere semplicemente eseguito da una riga di comando per farlo (senza installare elementi aggiuntivi).

+0

Quando si dice "senza installare materiale aggiuntivo" - Avete già installato LaTeX? (Ad esempio, potresti eseguire pdflatex sulla tua riga di comando?) –

+0

Non ho installato il latex, preferisco uno strumento che possa farlo senza che sia installata una distribuzione di latex (a meno che non sia impossibile). – shn

risposta

4

Si può fare questo senza installare nulla:

import urllib 
import urllib2 

def latex2svg(latexcode): 
    """ 
    Turn LaTeX string to an SVG formatted string using the online SVGKit 
    found at: http://svgkit.sourceforge.net/tests/latex_tests.html 
    """ 
    txdata = urllib.urlencode({"latex": latexcode}) 
    url = "http://svgkit.sourceforge.net/cgi-bin/latex2svg.py" 
    req = urllib2.Request(url, txdata) 
    return urllib2.urlopen(req).read() 

print latex2svg("2+2=4") 
print latex2svg("\\frac{1}{2\\pi}") 

Questo lo script chiama il server SVGKit che hai citato, che fa il lavoro di conversione di LaTeX in SVG. Restituisce il testo di SVG (provalo).

Si noti che, come con qualsiasi soluzione che si basa su applicazioni web di terze parti,

  1. Questo presuppone che dispone di una connessione internet affidabile

  2. sue prestazioni dipende dalla velocità della connessione e del server

  3. Questo si basa sul sito di terze parti per rimanere coerenti (se lo tolgono, o il formato cambia in modo significativo, questo non funzionerà più senza regolazione)

+0

Ottima soluzione temporanea, ovviamente sarebbe molto meglio se noi non ho bisogno di una connessione internet per fare la conversione, ma per ora è ok. Grazie. – shn

+0

Grande. Ogni soluzione, tuttavia, implicherà l'utilizzo di una connessione Internet o l'installazione di LaTeX. Dopotutto, * qualcosa * deve interpretare il codice LaTeX (non è come se si potesse incapsulare tutto il LaTeX in alcune funzioni Python). –

2

Circa SVGLaTeX:

Direi che si può usare come uno script python sul computer (non basato su Web) [edit: non come è], ma non soddisfa il vostro requisito 'senza installare ulteriore roba da quando penso che avresti bisogno di una distribuzione in lattice.

Chi MathML vs. SVG:

Conversione lattice per MathML (sono riuscito a trovare solo soluzioni basato su Web) è diverso da convertire LaTeX per SVG, nel senso che MathML è più simile a una descrizione della fonte matematica simile a LaTeX fonte, e SVG è un formato per memorizzare le equazioni typeset, come PDF.

La produzione di SVG da LateX è un processo molto più impegnativo rispetto alla conversione di LaTeX in MathML, il primo (a mia conoscenza) sempre alla fine utilizzando il programma Knuts TeX. Quindi, se non si installa LateX [edit: o lo si usa in remoto] si dovrebbe convertire in MathML. [Speriamo che qualcun altro conosca uno strumento per questo. Non ho familiarità con JavaScript. Può essere eseguito dalla console?].

Edit:

script Python per rendere SVG di lattice (lungo la linea di SVGLatex/eqtexsvg):

from subprocess import call 
import sys, re 

if not len(sys.argv) == 2: 
    print "usage: tex2svg input_file.tex" 
    exit(1) 

tex_name = sys.argv[1] 
svg_name = tex_name[:-4] + ".svg" 
ps_name = tex_name[:-4] + ".ps" 
dvi_name = tex_name[:-4] + ".dvi" 

if call(["latex", tex_name]): exit(1) 
if call(["dvips", "-q", "-f", "-e", "0", "-E", "-D", "10000", "-x", "1000", "-o", ps_name, dvi_name]): exit(1) 
if call(["pstoedit", "-f", "plot-svg", "-dt", "-ssp", ps_name, svg_name]): exit(1) 
+0

Come usarlo come script python sul mio computer se ho installato una distribuzione in latex? (anche se preferisco non avere il latex installato). – shn

+0

SVGLaTeX contiene uno script python, ma sfortunatamente sembra non accettare esattamente un file in lattice e salvare un file svg. Così l'ho spogliato e ho aggiunto alcune linee di pitone alla mia risposta. Fondamentalmente chiama latex, dvips e pstoedit. Potrebbe semplicemente usare uno script di shell. Puoi salvarlo e chiamarlo con un argomento, il tuo file in lattice. Ti darà un file SVG con lo stesso nome del tuo file in lattice semplicemente .svg invece di .tex. –

+0

Viene visualizzato questo errore quando tento di eseguire il codice: C: \ Users \ TheUser \ Desktop> tex2svg.py input.tex Traceback (ultima chiamata ultima): File "C: \ Users \ TheUser \ Desktop \ tex2svg.py ", riga 13, in se call ([" latex ", tex_name]): exit (1) File" C: \ Python26 \ lib \ subprocess.py ", riga 444, nella chiamata ritorno Popen (* popenargs, ** kwargs) .wait() File "C: \ Python26 \ lib \ subprocess.py", riga 595, in __init__ errread, errwrite) File "C: \ Python26 \ lib \ subprocess. py ", riga 821, in _execute_child startupinfo) WindowsError: [Errore 2] Il file specificato non è stato trovato – shn

2

La mia soluzione è quella di utilizzare latex per generare un file DVI e quindi utilizzare dvisvgm per convertire il DVI svg:

  1. latex file.tex # produce file.dvi
  2. dvisvgm --no-fonts file.dvi file.svg # --no-font: percorsi uso SVG solo

Nella mia esperienza, lo SVG finale è reso esattamente come voleva (con Inkscape, o QSvgRenderer).

Il modello LaTeX che uso è questo:

\documentclass[paper=a5,fontsize=12pt]{scrbook} 
\usepackage[pdftex,active,tightpage]{preview} 
\usepackage{amsmath} 
\usepackage{amssymb} 
\usepackage{amsfonts} 
\usepackage{tikz} 
\begin{document} 
\begin{preview} 
\begin{tikzpicture}[inner sep=0pt, outer sep=0pt] 
\node at (0, 0) {texCode}; % <--Put your tex-code here 
\end{tikzpicture} 
\end{preview} 
\end{document}