преобразование латексного кода в mathml или svg код в python - PullRequest
6 голосов
/ 06 марта 2012

Есть ли какой-нибудь код на Python, позволяющий взять латексный код (для уравнений) и проанализировать его в коде mathml или svg?Простая функция, которая принимает в качестве аргумента строку (код латекса) и выводит строку (код svg или mathml), была бы идеальной.

PS.Я нашел это http://svgkit.sourceforge.net/SVGLaTeX.html, но это веб-проект и не уверен, как его использовать.

РЕДАКТИРОВАТЬ: или на любом языке (не обязательно Python), или, по крайней мере, исполняемый файл, которыйдля этого может быть просто выполнен из командной строки (без установки дополнительных вещей).

Ответы [ 3 ]

4 голосов
/ 07 марта 2012

Вы можете сделать это без установки чего-либо:

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. Это зависит от стороннего сайта дляоставайтесь последовательными (если их уберут или формат существенно изменится, это больше не будет работать без настройки)

2 голосов
/ 03 июня 2013

Мое решение состоит в том, чтобы использовать 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 голосов
/ 06 марта 2012

О SVGLaTeX:

Я бы сказал, что вы можете использовать его в качестве сценария Python на вашем компьютере (не на веб-основе) [править: не так, как есть], но он не соответствует вашим требованиям »без установкидополнительные вещи », так как я думаю, что вам понадобится дистрибутив латекса.

О MathML против SVG:

Преобразование латекса в mathml (я мог бы найти только веб-решения) отличается от преобразования LateX вSVG в том смысле, что mathml больше похож на описание математического источника, такого как источник LateX, а SVG - это формат для хранения уравнений набора типов, например PDF.

Создание SVG из LateX - гораздо более сложный процессчем преобразование LaTeX в MathML, первое (насколько мне известно) всегда в конечном итоге использует программу Knuts TeX.Поэтому, если вы не устанавливаете какой-либо LateX [edit: или используете его удаленно], вам придется конвертировать в MathML.[Надеюсь, кто-то еще знает инструмент для этого.Я не знаком с JavaScript.Можно ли запустить его из консоли?].

Редактировать:

Скрипт Python для создания SVG из LateX (по линии 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)
...