From 9527109f1fe10ef78cb811284384d478315c8200 Mon Sep 17 00:00:00 2001 From: sgimenez Date: Fri, 24 Nov 2006 15:02:55 +0000 Subject: [PATCH] fixes related to bugs (#1495693,#1500967,#1555211) with the eqtexsvg plugin (ie LaTeX Formula): - uses better svg parsing technique - does better tmp file creation - uses plot-svg pstoedit driver to produce svgs - does not use -output-dir with latex - other minor fixes and improvements thanks to Roman S Dubtsov --- share/extensions/eqtexsvg.inx | 2 +- share/extensions/eqtexsvg.py | 121 +++++++++++++++------------------- 2 files changed, 54 insertions(+), 69 deletions(-) diff --git a/share/extensions/eqtexsvg.inx b/share/extensions/eqtexsvg.inx index 819f30aa0..657594a9c 100644 --- a/share/extensions/eqtexsvg.inx +++ b/share/extensions/eqtexsvg.inx @@ -6,7 +6,7 @@ latex dvips pstoedit - \lim_{n \to \infty}\sum_{k=1}^n \frac{1}{k^2}= \frac{\pi^2}{6} + \[\frac{\pi^2}{6}=\lim_{n \to \infty}\sum_{k=1}^n \frac{1}{k^2}\] all diff --git a/share/extensions/eqtexsvg.py b/share/extensions/eqtexsvg.py index a16cdc625..5b88febec 100644 --- a/share/extensions/eqtexsvg.py +++ b/share/extensions/eqtexsvg.py @@ -1,15 +1,13 @@ #!/usr/bin/env python # -*- coding: cp1252 -*- """ -EQTEXSVG.py -functions for converting LATEX equation string into SVG path -This extension need, to work properly : - - a TEX/LATEX distribution (MiKTEX ...) +eqtexsvg.py +functions for converting LaTeX equation string into SVG path +This extension need, to work properly: + - a TeX/LaTeX distribution (MiKTeX ...) - pstoedit software: -Copyright (C) 2006 Julien Vitard, julienvitard@gmail.com - -- I will try to code XML parsing, not the hard way ;-) +Copyright (C) 2006 Julien Vitard This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -23,88 +21,80 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA """ -import inkex, os, tempfile, xml.dom.ext, xml.dom.ext.reader.Sax -import sys -from xml.dom import Node +import inkex, os, tempfile, xml.dom.minidom def create_equation_tex(filename, equation): tex = open(filename, 'w') - tex.write("""%% processed with EqTeXSVG.py -\documentclass{article} -\usepackage{amsmath} + tex.write("""%% processed with eqtexsvg.py +\\documentclass{article} +\\usepackage{amsmath} +\\usepackage{amssymb} +\\usepackage{amsfonts} + \\thispagestyle{empty} \\begin{document} """) - tex.write("$$\n") tex.write(equation) - tex.write("\n$$\n") - tex.write("\end{document}\n") + tex.write("\\end{document}\n") tex.close() -def add_paths(self,group,node): - next = node.firstChild - while next is not None: - child = next - next = child.nextSibling - - if child.nodeType is not Node.ELEMENT_NODE: continue - if child.nodeName == "title": continue - if child.nodeName == "desc": continue - if child.nodeName == "rect" and child.getAttribute("id") == "background": continue - - if child.nodeName == "g": - svg_group = self.document.createElement('svg:g') - if child.hasAttribute("transform"): - svg_group.setAttribute("transform",child.getAttribute("transform")) - group.appendChild(svg_group) - add_paths(self,svg_group,child) - else: - group.appendChild(self.document.importNode(child,1)) - def svg_open(self,filename): - # parsing of SVG file with the equation - reader = xml.dom.ext.reader.Sax.Reader() - stream = open(filename,'r') - svgdoc = reader.fromStream(stream) - - group = self.document.createElement('svg:g') + doc_width = float(self.document.documentElement.getAttribute('width')) + doc_height = float(self.document.documentElement.getAttribute('height')) + doc_sizeH = min(doc_width,doc_height) + doc_sizeW = max(doc_width,doc_height) + + def clone_and_rewrite(self, node_in): + if node_in.localName != 'svg': + node_out = self.document.createElement('svg:' + node_in.localName) + for i in range(0, node_in.attributes.length): + name = node_in.attributes.item(i).name + value = node_in.attributes.item(i).value + node_out.setAttribute(name, value) + else: + node_out = self.document.createElement('svg:g') + for c in node_in.childNodes: + if c.localName in ('g', 'path', 'polyline', 'polygon'): + child = clone_and_rewrite(self, c) + if c.localName == 'g': + child.setAttribute('transform','matrix('+str(doc_sizeH/700.)+',0,0,'+str(-doc_sizeH/700.)+','+str(-doc_sizeH*0.25)+','+str(doc_sizeW*0.75)+')') + node_out.appendChild(child) + + return node_out + + doc = xml.dom.minidom.parse(filename) + svg = doc.getElementsByTagName('svg')[0] + group = clone_and_rewrite(self, svg) self.current_layer.appendChild(group) - child = svgdoc.firstChild - while child is not None: - if child.nodeName == "svg" and child.nodeType == Node.ELEMENT_NODE: - add_paths(self,group,child) - child = child.nextSibling - class EQTEXSVG(inkex.Effect): def __init__(self): inkex.Effect.__init__(self) self.OptionParser.add_option("-f", "--formule", - action="store", type="string", - dest="formule", default=10.0, - help="Formule LaTeX") + action="store", type="string", + dest="formula", default=10.0, + help="LaTeX formula") def effect(self): - base_file = os.path.join(tempfile.gettempdir(), "inkscape-latex.tmp") - latex_file = base_file + ".tex" - create_equation_tex(latex_file, self.options.formule) - out_file = os.path.join(tempfile.gettempdir(), "inkscape-latex.tmp.output") - os.system('latex -output-directory=' + tempfile.gettempdir() + ' ' + latex_file + '> ' + out_file) + base_file = os.path.join(tempfile.gettempdir(), "inkscape-latex.tmp." + str(os.getpid())) + latex_file = base_file + ".tex" + create_equation_tex(latex_file, self.options.formula) + out_file = base_file + ".output" + os.system('cd ' + tempfile.gettempdir() + '; latex -halt-on-error ' + latex_file + ' > ' + out_file); ps_file = base_file + ".ps" dvi_file = base_file + ".dvi" svg_file = base_file + ".svg" - os.system('dvips -q -f -E -D 600 -y 50000 -o ' + ps_file + ' ' + dvi_file) - os.system('pstoedit -f plot-svg -centered -dt -ssp ' + ps_file + ' ' + svg_file + '>> ' + out_file + ' 2>&1') + os.system('dvips -q -f -E -D 600 -y 5000 -o ' + ps_file + ' ' + dvi_file) + os.system('cd ' + tempfile.gettempdir() + '; pstoedit -f plot-svg -dt -ssp ' + ps_file + ' ' + svg_file + '&> ' + out_file) - # ouvrir le svg et remplacer #7F7F7F par #000000 svg_open(self, svg_file) - # clean up + # Clean up aux_file = base_file + ".aux" log_file = base_file + ".log" os.remove(latex_file) @@ -115,10 +105,5 @@ class EQTEXSVG(inkex.Effect): os.remove(svg_file) os.remove(out_file) -#e = EQTEXSVG() -#e.affect() -try: - e = EQTEXSVG() - e.affect() -except Exception, inst: - sys.stderr.write(str(inst) + "\n") +e = EQTEXSVG() +e.affect() -- 2.30.2