5

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

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

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

4

4 回答 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. 这依赖于第三方网站来保持一致(如果他们将其撤下,或者格式发生重大变化,这将不再有效,无需调整)

于 2012-03-06T20:51:44.670 回答
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}
于 2013-06-03T09:12:16.083 回答
3

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

选项 1 - latextools

这是我的首选解决方案,因为它允许将 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')

创建从 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

输出latex2svg 的输出

于 2020-06-17T04:15:57.270 回答
2

关于 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)
于 2012-03-06T18:11:33.977 回答