是否有任何 python 代码允许采用乳胶代码(用于方程式)并将其解析为 mathml 或 svg 代码?将字符串(乳胶代码)作为参数并输出字符串(svg 或 mathml 代码)的简单函数将是完美的。
PS。我找到了这个http://svgkit.sourceforge.net/SVGLaTeX.html但它是一个基于网络的项目,不知道如何使用它。
编辑:或任何语言(不是强制性的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}
我知道两种解决方案,并且都在某个时候为我服务并且对我来说效果很好。我按照我个人喜好的顺序提供它们。
这是我的首选解决方案,因为它允许将 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
关于 SVGLaTeX:
我想说你可以在你的计算机上将它用作 python 脚本(非基于网络)[编辑:不是原样],但它不能满足你的要求“不安装额外的东西”,因为我认为你需要一个乳胶分配。
关于 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)