2012-03-06 41 views
6

是否有任何Python代码允许获取乳胶代码(用于方程式)并将其解析为mathml或svg代码?一个简单的函数作为一个字符串(乳胶代码)并输出一个字符串(svg或mathml代码)将是完美的。将一个乳胶代码转换为python中的mathml或svg代码

PS。我发现这个http://svgkit.sourceforge.net/SVGLaTeX.html,但它是一个基于Web的项目,不知道如何使用它。编辑:或在任何语言(不是强制性的Python),或至少一个exe文件,可以简单地执行命令行来做到这一点(没有安装额外的东西)。

+0

当你说“无需安装额外的东西” - 你已经安装了LaTeX的? (例如,你可以在你的命令行上运行pdflatex吗?) – 2012-03-06 17:58:03

+0

我没有安装乳胶,我更喜欢一个不需要安装乳胶分布的工具(除非不可能)。 – shn 2012-03-06 19:06:09

回答

4

你可以做到这一点,而无需安装任何东西:

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

这脚本调用您提到的SVGKit服务器,它将LaTeX转换为SVG。它返回SVG的文本(试用它)。

需要注意的是,与依赖于第三方的Web应用程序的任何解决方案,

  1. 这里假设你有你的连接速度可靠的互联网连接

  2. ,其性能取决于和的服务器

  3. 这依赖于第三方网站保持一致(如果他们把它关掉,或者格式发生重大变化,这将不再工作,没有调整)

+0

伟大的临时解决方案,当然如果我们不需要互联网连接来完成转换,但现在可以。谢谢。 – shn 2012-03-06 22:08:14

+0

太好了。但是,每种解决方案都将涉及使用互联网连接或安装LaTeX。毕竟,* something *需要解释LaTeX代码(它不像你可以将所有的LaTeX封装成几个Python函数)。 – 2012-03-06 22:32:14

2

关于SVGLaTeX:

我会说,你可以使用它作为您的计算机上的Python脚本(非基于Web)[编辑:还不如说是],但它并不无需安装额外的满足您的要求”因为我认为你需要乳胶发行。

关于MATHML与SVG:

乳胶转换成MathML(我能找到的唯一的基于网络的解决方案)是更喜欢像乳胶数学源的描述转换乳胶SVG,在这个意义上,MathML是不同的来源,SVG是存储排版方程的格式,如PDF。

从LateX生成SVG是一个比将LaTeX转换为MathML更加复杂的过程,前者(据我所知)总是最终使用Knuts TeX程序。所以如果你不安装任何LateX [编辑:或远程使用它],你必须转换为MathML。 [希望有人知道它的一个工具。我不熟悉JavaScript。它可以从控制台运行吗?]。

编辑:

Python脚本,使SVG乳胶(沿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

如果我的电脑上安装了乳胶发行版,如何将它用作我的电脑上的python脚本? (即使我不喜欢安装乳胶)。 – shn 2012-03-06 19:10:53

+0

SVGLaTeX包含一个python脚本,但不幸的是它似乎并不完全接受乳胶文件并保存svg文件。所以我把它剥下来,并在我的回答中附加了一些python行。基本上它叫乳胶,dvips和pstoedit。可以只使用一个shell脚本。你可以保存它并用一个参数,你的乳胶文件来调用它。它会给你一个svg文件,其名称与你的胶乳文件相同,只是.svg而不是.tex。 – 2012-03-06 20:55:57

+0

当我尝试执行您的代码时出现此错误: C:\ Users \ TheUser \ Desktop> tex2svg.py input.tex Traceback(最近调用最后一次): 文件“C:\ Users \ TheUser \ Desktop ([“latex”,tex_name]):退出(1) 文件“C:\ Python26 \ lib \ subprocess.py”,第444行,致电 返回文件“C:\ Python26 \ lib \ subprocess.py”,第595行,在__init__中 errread,errwrite) 文件“C:\ Python26 \ lib \ subprocess。 py“,第821行,在_execute_child startupinfo) WindowsError:[错误2]未找到指定的文件 – shn 2012-03-06 22:10:10

2

我的解决方案是使用latex生成一个DVI文件,然后使用dvisvgm到DVI转换为SVG:

  1. latex file.tex#生成文件。DVI
  2. dvisvgm --no-fonts file.dvi file.svg#--no的字体:使用SVG路径只有

以我的经验,最终的SVG正好呈现为希望(使用Inkscape或QSvgRenderer)。

我使用的乳胶模板是这样的:

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