是否有任何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文件(不需要安装额外的东西)。
你可以在不安装任何东西的情况下实现这个功能。
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的文本(试试)。
请注意,与任何依赖于第三方网络应用的解决方案一样。
假设你有一个可靠的互联网连接
它的性能取决于你的连接和服务器的速度。
这有赖于第三方网站保持一致(如果他们下架了,或者格式发生了重大变化,不调整就无法再使用了)。
我的解决方案是使用 latex
生成一个DVI文件,然后使用 dvisvgm
将dvi转换为svg。
latex file.tex
# 产生文件.dvidvisvgm --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}
关于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)
我知道有两个解决方案,它们都在某些时候为我服务过,并且对我来说很好。我按照我个人喜好的顺序提供它们。
这是我首选的解决方案,因为它允许 将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')
意图成为更多的命令行工具,在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