在python中把latex代码转换为mathml或svg代码latextools latex2svg。

问题描述 投票:5回答:4

是否有任何python代码,允许采取一个乳胶代码(方程),并将其解析为mathml或svg代码?A simple function that take as argument a string (the latex code) and output a string (the svg or mathml code) would be perfect.

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

EDIT: 或者用任何语言(不一定是python),或者至少是一个可以简单地通过命令行执行的exe文件(不需要安装额外的东西)。

python parsing svg latex mathml
4个回答
3
投票

你可以在不安装任何东西的情况下实现这个功能。

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. 这有赖于第三方网站保持一致(如果他们下架了,或者格式发生了重大变化,不调整就无法再使用了)。


3
投票

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

  1. latex file.tex # 产生文件.dvi
  2. dvisvgm --no-fonts file.dvi file.svg # --no-fonts:只使用SVG路径。

根据我的经验,最终的 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}

2
投票

关于SVGLaTeX:

我想说的是,你可以在你的电脑上把它作为一个python脚本来使用(非基于web的)[编辑:不是这样的],但它不能满足你的要求 "不需要安装额外的东西",因为我想你需要一个latex发行版。

关于MathML与SVG。

将Latex转换为mathml(我只能找到基于网络的解决方案)与将LateX转换为SVG是不同的,在这个意义上,mathml更像是对数学源的描述,就像LateX源,而SVG是一种存储排版方程的格式,就像PDF。

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

编辑。

从LateX制作SVG的Python脚本(沿用SVGLatexeqtexsvg的思路)。

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
投票

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

方案1 - 乳胶工具 图书馆

这是我首选的解决方案,因为它允许 将SVG生成的LaTeX与其他SVG对象结合起来,而不会使它们变得混乱。.

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

© www.soinside.com 2019 - 2024. All rights reserved.