在python中将乳胶代码转换为mathml或svg代码

时间:2012-03-06 16:57:01

标签: python parsing svg latex mathml

是否有任何python代码允许采用乳胶代码(方程式)并将其解析为mathml或svg代码?将字符串(乳胶代码)作为参数并输出字符串(svg或mathml代码)的简单函数将是完美的。

PS。我发现了这个http://svgkit.sourceforge.net/SVGLaTeX.html,但这是一个基于网络的项目,不知道如何使用它。

编辑:或者用任何语言(非强制性的python),或者至少是一个可以通过命令行执行的exe文件(不需要安装其他东西)。

4 个答案:

答案 0 :(得分: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的文本(试一试)。

请注意,与依赖第三方网络应用的任何解决方案一样,

  1. 这假设您有可靠的互联网连接

  2. 其性能取决于连接和服务器的速度

  3. 这依赖于第三方网站保持一致(如果他们将其删除,或者格式发生重大变化,如果不进行调整,这将不再有效)

答案 1 :(得分:2)

关于SVGLaTeX:

我会说你可以在你的计算机上使用它作为python脚本(非基于web)[编辑:不是这样],但它没有满足你的要求'没有安装额外的东西'因为我认为你是需要乳胶分销。

关于MathML与SVG:

将Latex转换为mathml(我只能找到基于web的解决方案)与将LateX转换为SVG不同,因为mathml更像是像LateX源这样的数学源的描述,而SVG是一种存储排版的格式方程式,如PDF。

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

编辑:

从LateX制作SVG的Python脚本(沿着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)

答案 2 :(得分:2)

我的解决方案是使用latex生成DVI文件,然后使用dvisvgm将dvi转换为svg:

  1. latex file.tex #products file.dvi
  2. dvisvgm --no-fonts file.dvi file.svg#--no-fonts:仅使用SVG路径
  3. 根据我的经验,最终的svg完全按照需要呈现(使用InkScape或QSvgRenderer)。

    我使用的LaTeX模板是:

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

答案 3 :(得分:2)

我知道两种解决方案,两者都在某个时候为我服务,并且对我来说效果很好。我按照我的个人喜好顺序提供它们。

选项1-latextools

这是我首选的解决方案,因为它允许combine SVG generated LaTeX with other SVG objects without messing them up

import latextools
import drawSvg as draw  # pip3 install drawSvg

# Render latex
latex_eq = latextools.render_snippet(
    r'$\sqrt{X^\dag}$',
    commands=[latextools.cmd.all_math])
svg_eq = latex_eq.as_svg()

# Use the rendered latex in a vector drawing
d = draw.Drawing(100, 100, origin='center', displayInline=False)
d.append(draw.Circle(0, 0, 49, fill='yellow', stroke='black', stroke_width=2))
d.draw(svg_eq, x=0, y=0, center=True, scale=2.5)

d.saveSvg('vector.svg')
d.savePng('vector.png')

创建output image from latextools

选项2-latex2svg

打算使用更多的命令行工具,而不是PyPi上的命令行工具(您必须下载文件),但是通过稍作修改即可完全以编程方式工作。

from latex2svg import latex2svg
out = latex2svg(r'\( e^{i \pi} + 1 = 0 \)')
print(out['depth'])  # baseline position in em
print(out['svg'])  # rendered SVG

输出output from latex2svg