2008-02-25

Compilando LaTeX con rake

En el laburo estoy escribiendo un paper (es parte de las cosas que tengo que hacer como investigador en seguridad informática) y, como soy un geek que se precia, lo estoy escribiendo en LaTeX.

El temita es que las figuras que tiene el paper las hice en MS Visio y que quiero tener un script automático para generar el .dvi a partir del .tex, el .bib y los archivos de Visio. Pero LaTeX no acepta archivos de Visio como imágenes, solo .eps (encapsulated postscript) y Visio a lo sumo escupe .wmf. Así que instalé el wmf2eps y entonces tuve una idea, ¿por qué no generar todo usando rake y uso win32ole para hacer automation con el Visio?.

Este es el resultado (que anda) del rakefile que uso para generar el paper:


require 'rake/clean'
require 'win32ole'

VIS = FileList['*.vsd']
EPS = VIS.ext('eps')
MAIN = "paper.tex"
DVI = "paper.dvi"
BIB = "paper.bib"

CLEAN.include(FileList["*.wmf", "*.aux", "*.bbl", "*.blg", "*.log"] )
CLOBBER.include(FileList[DVI], VIS.ext("eps"))

def windows_name(file)
File.expand_path(file).gsub("/","\\").gsub(" ", "\\ ")
end

def visio()
begin
return WIN32OLE.connect("visio.application"), false
rescue WIN32OLERuntimeError # Visio is not running
return WIN32OLE.new("visio.application"), true
end
end

def open_doc(visio, filename)
begin
return visio.Documents(filename), false
rescue WIN32OLERuntimeError # file not open
return visio.Documents.open(filename), true
end
end

def latex
sh "latex", "-halt-on-error", MAIN do
|ok, res|
unless ok
puts "Error compiling LaTeX file (status=#{res.exitstatus})\n"
exit
end
end
end

def bibtex
sh "bibtex", "paper" do
|ok, res|
unless ok
puts "Error compiling bibtex file (status=#{res.exitstatus})\n"
exit
end
end
end

file DVI => EPS + [MAIN, BIB] do
latex
bibtex
latex
latex
end

rule '.wmf' => '.vsd' do
|t|
visio_filename = windows_name(t.source)
wmf_filename = windows_name(t.name)
visio, close_visio = visio()
document, close_document = open_doc(visio, visio_filename)
document.Pages(1).Export(wmf_filename)
document.Close if close_document
visio.Quit if close_visio
end

rule '.eps' => '.wmf' do
|t|
wmf_filename = windows_name(t.source)
dirname = windows_name( File.dirname(t.source) )
sh "wmf2eps\\wmf2eps -o #{dirname} #{wmf_filename}"
end

desc "Generates dvi for paper"
task :dvi => DVI

desc "Generates images for paper from Visio files"
task :images => EPS

desc "Generates images for paper from Visio files"
task :default => :images


Espero que les sirva esto, y que ruby se vaya acercando a la academia.

Happy hacking,
Aureliano.

No hay comentarios.: