Python e TeX
Posted: Aprile 9th, 2008 | Author: packz | 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 + stuffclass 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 errorclass 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 Falsedef 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 pluginfunction 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=120MATH=$1
OUTPUT_FILE=$2# write the minimal document
echo ‘footline={}’ > /tmp/$TEXFILE.tex
echo $1 >> /tmp/$TEXFILE.tex
echo ‘end’ >> /tmp/$TEXFILE.texecho "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…