2012-03-06 28 views
6

Có mã python nào cho phép lấy mã latex (đối với phương trình) và phân tích cú pháp mã này thành mã mathml hay svg không? Một hàm đơn giản lấy làm đối số một chuỗi (mã latex) và đầu ra một chuỗi (mã svg hoặc mathml) sẽ là hoàn hảo.chuyển mã latex thành mã mathml hoặc svg trong python

PS. Tôi đã tìm thấy điều này http://svgkit.sourceforge.net/SVGLaTeX.html nhưng nó là một dự án dựa trên web và không chắc chắn làm thế nào để sử dụng nó.

CHỈNH SỬA: hoặc bằng bất kỳ ngôn ngữ nào (không bắt buộc trăn), hoặc ít nhất một tệp exe có thể được thực thi đơn giản bằng dòng lệnh để thực hiện điều đó (không cài đặt thêm nội dung).

+0

Khi bạn nói "mà không cài đặt công cụ bổ sung" - làm bạn đã cài đặt LaTeX? (Ví dụ, bạn có thể chạy pdflatex trên dòng lệnh của mình không?) –

+0

Tôi không cài đặt latex, tôi thích một công cụ có thể thực hiện mà không cần cài đặt bản phân phối latex (trừ khi không thể). – shn

Trả lời

4

Bạn có thể làm điều này mà không cần cài đặt bất cứ điều gì:

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

này tập lệnh gọi máy chủ SVGKit mà bạn đề cập, công việc chuyển đổi LaTeX thành SVG. Nó trả về văn bản của SVG (dùng thử).

Lưu ý rằng, như với bất kỳ giải pháp dựa trên các ứng dụng web của bên thứ ba,

  1. này giả định bạn có một kết nối internet đáng tin cậy

  2. hiệu suất của nó phụ thuộc vào tốc độ kết nối của bạn và của máy chủ

  3. Điều này dựa trên trang web của bên thứ ba để duy trì tính nhất quán (nếu họ gỡ xuống hoặc định dạng thay đổi đáng kể, điều này sẽ không còn hoạt động mà không cần điều chỉnh)

+0

Giải pháp tạm thời tuyệt vời, tất nhiên sẽ tốt hơn nếu chúng tôi không cần kết nối internet để thực hiện chuyển đổi, nhưng hiện tại vẫn ổn. Cảm ơn. – shn

+0

Tuyệt vời. Tuy nhiên, mọi giải pháp sẽ liên quan đến việc sử dụng kết nối internet hoặc cài đặt LaTeX. Sau khi tất cả, * cái gì đó * cần giải thích mã LaTeX (nó không giống như bạn có thể gói gọn tất cả LaTeX thành một vài hàm Python). –

2

Về SVGLaTeX:

tôi sẽ nói bạn có thể sử dụng nó như một kịch bản python trên máy tính của bạn (không webbased) [sửa: không vì nó là], nhưng nó không đáp ứng yêu cầu của bạn mà không cần cài đặt thêm thứ vì tôi nghĩ bạn cần phân phối latex.

Về MathML vs SVG:

Chuyển đổi Latex để MathML (tôi có thể tìm giải pháp duy nhất webbased) là khác nhau để chuyển đổi LaTeX để SVG, theo nghĩa là MathML là giống như một mô tả về nguồn toán học như mủ nguồn và SVG là một định dạng để lưu trữ các phương trình sắp xếp, như PDF.

Sản xuất SVG từ LateX là quá trình tham gia nhiều hơn chuyển đổi LaTeX thành MathML, trước đây (theo kiến ​​thức của tôi) luôn sử dụng chương trình Knut TeX. Vì vậy, nếu bạn không cài đặt bất kỳ LateX [chỉnh sửa: hoặc sử dụng nó từ xa] bạn sẽ phải chuyển đổi sang MathML. [Hy vọng người khác biết một công cụ cho nó. Tôi không quen với JavaScript. Nó có thể được chạy từ bàn điều khiển không?].

Edit:

Python script để làm cho SVG từ latex (dọc theo dòng 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

Làm thế nào để sử dụng nó như là một kịch bản python trên máy tính của tôi nếu tôi có một bản phân phối latex được cài đặt? (ngay cả khi tôi không muốn cài đặt latex). – shn

+0

SVGLaTeX chứa tập lệnh python, nhưng tiếc là có vẻ như không chấp nhận chính xác tệp latex và lưu tệp svg. Vì vậy, tôi lột nó xuống và nối thêm một số dòng trăn vào câu trả lời của tôi. Về cơ bản nó gọi là latex, dvips và pstoedit. Chỉ có thể sử dụng một kịch bản lệnh shell. Bạn có thể lưu nó và gọi nó với một đối số, tập tin latex của bạn. Nó sẽ cung cấp cho bạn một tệp svg có cùng tên với tệp latex của bạn .svg thay vì .tex. –

+0

Tôi nhận được lỗi này khi tôi cố gắng thực thi mã của bạn: C: \ Users \ TheUser \ Desktop> tex2svg.py input.tex Traceback (cuộc gọi gần đây nhất): Tệp "C: \ Users \ TheUser \ Desktop \ tex2svg.py ", dòng 13, trong nếu gọi ([" latex ", tex_name]): thoát (1) Tệp" C: \ Python26 \ lib \ subprocess.py ", dòng 444, gọi trả lại Popen (* popenargs, ** kwargs) .wait() Tệp "C: \ Python26 \ lib \ subprocess.py", dòng 595, trong __init__ errread, errwrite) Tệp "C: \ Python26 \ lib \ subprocess. py ", dòng 821, trong _execute_child startupinfo) WindowsError: [Lỗi 2] Không tìm thấy tệp được chỉ định – shn

2

Giải pháp của tôi là sử dụng latex để tạo ra một tập tin DVI và sau đó sử dụng dvisvgm để chuyển đổi DVI để svg:

  1. latex file.tex # tạo file.DVI
  2. dvisvgm --no-fonts file.dvi file.svg # --no-phông chữ: đường dẫn sử dụng SVG chỉ

Theo kinh nghiệm của tôi, svg cuối cùng được trả lại chính xác như mong muốn (với Inkscape, hoặc QSvgRenderer).

Mẫu LaTeX tôi sử dụng là:

\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} 
Các vấn đề liên quan