2012-03-06 28 views
6

¿Hay algún código python que permita tomar un código de látex (para ecuaciones) y analizarlo con código matemático o svg? Una función simple que toma como argumento una cadena (el código de látex) y genera una cadena (el código svg o mathml) sería perfecto.convirtiendo un código de látex a código mathml o svg en python

PS. Encontré este http://svgkit.sourceforge.net/SVGLaTeX.html pero es un proyecto basado en web y no estoy seguro de cómo usarlo.

EDITAR: o en cualquier idioma (no es obligatorio python), o al menos un archivo exe que se puede ejecutar simplemente con una línea de comando para hacer eso (sin instalar cosas adicionales).

+0

Cuando dice "sin necesidad de instalar cosas adicionales" - es lo que ya ha instalado LaTeX? (Por ejemplo, ¿podría ejecutar pdflatex en su línea de comandos?) –

+0

No tengo látex instalado, prefiero una herramienta que pueda hacerlo sin necesidad de instalar una distribución de látex (a menos que sea imposible). – shn

Respuesta

4

Usted puede hacer esto sin necesidad de instalar nada:

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}") 

Este script llama al servidor SVGKit que mencionas, que hace el trabajo de convertir LaTeX a SVG. Devuelve el texto de SVG (pruébelo).

Nota

que, como con cualquier solución que se basa en aplicaciones web de terceros,

  1. Esto supone que usted tiene una conexión a Internet fiable

  2. Su rendimiento depende de la velocidad de su conexión y del servidor

  3. Esto depende del sitio de terceros para mantenerse coherente (si lo eliminan, o el formato cambia significativamente, esto ya no funcionará sin ajustes)

+0

Excelente solución temporal, por supuesto sería mucho mejor si no necesita una conexión a Internet para hacer la conversión, pero está bien por ahora. Gracias. – shn

+0

Genial. Sin embargo, cada solución implicará el uso de una conexión a Internet o la instalación de LaTeX. Después de todo, * algo * necesita interpretar el código LaTeX (no es como si pudieras encapsular todo LaTeX en unas pocas funciones de Python). –

2

Sobre SVGLaTeX:

yo diría que se puede utilizar como un script en Python en su ordenador (no basada en la web) [editar: no como es], pero no cumple con el requisito de 'sin necesidad de instalar adicionales cosas 'ya que creo que necesitaría una distribución de látex.

Sobre MathML vs SVG:

conversión de látex a mathml (sólo pude encontrar soluciones basados ​​en internet) es diferente a la conversión de látex para SVG, en el sentido de que mathml es más como una descripción de la fuente de matemáticas como el látex source, y SVG es un formato para almacenar las ecuaciones compuestas tipográficas, como PDF.

Producir SVG desde LateX es un proceso mucho más complicado que convertir LaTeX a MathML, el primero (que yo sepa) siempre utilizando el programa Knuts TeX. Entonces, si no instalas LateX [edit: o lo usas de forma remota], tendrías que convertir a MathML. [Esperemos que alguien más conozca una herramienta para ello. No estoy familiarizado con JavaScript. ¿Se puede ejecutar desde la consola?].

Editar:

script en Python para hacer SVG de látex (a lo largo de la línea de 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

¿Cómo usarlo como una secuencia de comandos python en mi computadora si tengo instalada una distribución de látex? (incluso si prefiero no tener látex instalado). – shn

+0

SVGLaTeX contiene un script python, pero desafortunadamente parece no aceptar exactamente un archivo latex y guardar un archivo svg. Así que lo desvisté y agregué algunas líneas de pitón a mi respuesta. Básicamente llama latex, dvips y pstoedit. Podría simplemente usar un script de shell. Puede guardarlo y llamarlo con un argumento, su archivo de látex. Le dará un archivo svg con el mismo nombre que su archivo de látex .svg en lugar de .tex. –

+0

Recibo este error cuando intento ejecutar el código: C: \ Users \ TheUser \ Desktop> tex2svg.py input.tex Traceback (la última llamada es la última): Archivo "C: \ Users \ TheUser \ Desktop \ tex2svg.py ", línea 13, en if call ([" latex ", tex_name]): exit (1) Archivo" C: \ Python26 \ lib \ subprocess.py ", línea 444, en la llamada return Popen (* popenargs, ** kwargs) .wait() Archivo "C: \ Python26 \ lib \ subprocess.py", línea 595, en __init__ errread, errwrite) Archivo "C: \ Python26 \ lib \ subprocess. py ", línea 821, en _execute_child startupinfo) WindowsError: [Error 2] El archivo especificado no se encuentra – shn

2

Mi solución es utilizar latex para generar un archivo DVI y luego usar dvisvgm para convertir el DVI a SVG:

  1. latex file.tex # produce archivo.DVI
  2. dvisvgm --no-fonts file.dvi file.svg # --no-fuentes: caminos uso SVG solamente

En mi experiencia, el SVG final se vuelve exactamente como quería (con Inkscape, o QSvgRenderer).

La plantilla de látex que uso es la siguiente:

\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} 
Cuestiones relacionadas