Ricerca tra la vecchia roba

Python e TeX

Posted: Aprile 9th, 2008 | Author: | Filed under: Math, Physics, Programmazione, TeX | Commenti disabilitati su Python e TeX

Le formule inserite nel post precedente sono state create attraverso il mio script per generare dei file png direttamente da codice TeX a linea di comando; come via è abbastanza comoda per ottenere delle formule da inserire nel blog, ma un passo successivo dovrebbe essere quello di inserire all’interno dell’interfaccia di gnome-blog un editor di equazioni. Prima di fare ciò però ho sviluppato un programma di python con il quale generare/visualizzare/salvare tramite una comoda interfaccia le formule composte in TeX.

Il python non lo conosco molto ma ne ho sentito parlare e visionato in molti progetti che seguo, molte applicazioni che utilizzo (non ultimo gnome-blog); è molto comodo grazie ai numerosi binding con le librerie più diffuse su linux (fra tutte le Gtk) e alla sua natura multi-paradigma (cioé può essere utilizzato in maniera object-oriented, strutturata oppure funzionale) con una sintassi essenziale uniforme dove i blocchi di codice sono definiti attraverso l’indentazione.

Ma passiamo ai fatti, ecco il codice


#!/usr/bin/env python
#
# 2008 (C) Packz Enoch
#

 


import os
import sys
import pygtk
pygtk.require(‘2.0’)
import gtk

 

class stderr_catcher:
        def __init__(self):
                self.data = ”

        def write(self, stuff):
                self.data = self.data + stuff

class Alert(gtk.Dialog):
        def __init__(self, error, parent=None, flags=0, buttons=None):
                gtk.Dialog.__init__(self,error, parent, flags, buttons)
                label = gtk.Label(error)
                self.vbox.pack_start(label)
                self.add_buttons("Close", gtk.RESPONSE_CLOSE)
                self.vbox.show_all()
                print error

class texviewer:
        def __init__(self):
                self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
                self.window.set_title("pyTeX viewer")
                self.window.set_default_size(500, 300)
                self.window.connect("delete-event", self.delete_event)
                self.window.connect("destroy",self.destroy)
                #container
                box = gtk.VBox()
                # entry for math
                self.entry = gtk.Entry()
                self.entry.connect("activate",self.on_enter)
                # for image
                self.image = gtk.Image()
                # buttons to save png
                box2 = gtk.HBox()
                self.saving_as = gtk.Button(stock=gtk.STOCK_SAVE_AS)
                self.saving_as.connect("clicked", self._on_save_as)
                self.saving = gtk.Button(stock=gtk.STOCK_SAVE)
                self.saving.connect("clicked", self._on_save)
                box2.pack_start(self.saving, expand=False, fill=False)
                box2.pack_start(self.saving_as, expand=False, fill=False)
                # pack all
                box.pack_start(self.image, padding=20)
                box.pack_start(self.entry, expand=False, fill=False)
                box.pack_start(box2, expand=False, fill=False)

                #self.image.set_from_file("/tmp/spin-element.png")

                self.window.add(box)
                self.window.show_all()               
                # set fundamental variables
                self.filename = "/tmp/default.png"

        def delete_event(self, widget, event, data=None):
                return False

        def destroy(self, event, data=None):
                gtk.main_quit()

        def generate_image(self, is_time_to_save):
                math = self.entry.get_text()
                if is_time_to_save:
                        filename = self.filename
                else:
                        filename = "/tmp/default.png"

                print "Generating math expression: %s" % math
                return_value = os.system("tex2png-bis.sh "$$  %s $$" %s" % (math,filename))

                if return_value == 0:
                        self.image.set_from_file(filename)
                else:
                        alert = Alert("Some error is occoured during TeXification,ncheck for macro definition")
                        alert.run()
                        alert.destroy()

        def _on_save_as(self, event, data=None):
                fs = gtk.FileSelection()
                fs.complete("*.png")
                fs.ok_button.connect("clicked", self._on_ok_save, fs)
                fs.show_all()

        def _on_save(self, event, data=None):
                self.generate_image(True)

        def _on_ok_save(self, event, data):
                self.filename = data.get_filename()
                data.destroy()
                self.generate_image(True)

        def on_enter(self, widget, data=None):
                self.generate_image(False)

        def main(self):
                gtk.main()

if __name__ == "__main__":
        tex = texviewer()
        tex.main()

 

dove viene utilizzata una versione modificata del mio script di conversione TeX -> png;

#!/bin/bash
#
# script inspired by latex pidgin plugin

function on_error(){
        echo "error during " $1
        exit 1
}

# this need to be random
TEXFILE=out-tex
# DENSITY is proportional to final size of png
DENSITY=120

MATH=$1
OUTPUT_FILE=$2

# write the minimal document
echo ‘footline={}’ > /tmp/$TEXFILE.tex
echo $1 >> /tmp/$TEXFILE.tex
echo ‘end’ >> /tmp/$TEXFILE.tex

echo "Converting"
echo "———————————"
echo "$TEXFILE.tex ——> $TEXFILE.dvi"
tex -halt-on-error -output-directory=/tmp/ /tmp/$TEXFILE.tex || on_error "TeXifing" 
echo "$TEXFILE.dvi ——> $TEXFILE.ps"
dvips /tmp/$TEXFILE.dvi -o /tmp/$TEXFILE.ps || on_error "dviing"
echo "$TEXFILE.ps  ——> $OUTPUT_FILE"
convert -density ${DENSITY}x${DENSITY} -trim /tmp/$TEXFILE.ps $OUTPUT_FILE || on_error "converting to png"

# some cleanup
rm /tmp/$TEXFILE.tex /tmp/$TEXFILE.dvi

Ovviamente il codice è anche troppo grezzo ma funziona e prima o poi lo inserirò nella mia versione modificata di gnome-blog per postare direttamente su noblogs.per adesso beccatevi uno screenshoot con gli assiomi di Peano in bella mostra

E gia che ci siamo facciamo un bel test fra i nostri assidui lettori: come fareste a spiegare ad un alieno in contatto radio qual’è la sinistra? esistono fenomeni fisici che distinguono destra da sinistra? (evidentemente si, se come afferma Feynman, gli animali viventi assumono solo zucchero levogiro…) forse tutto sta nel termine? Fatemi sapere affezionati lettori…


Comments are closed.