Wer ein bisschen mit LaTeX zu tun hat, wird sicher sein Trio aus Tex, Makeindex und co. kennen. Die meisten IDE’s sind zwar schon flexibel und haben Build-Tools, aber ihr wisst ja: ‘Because I Can’. Flo hat mich daher letztens noch auf ein sehr cooles Tool getippt: rake. Einfach einen Rakefile in eurem Projekt anlegen und los gehts:

PROJECT_NAME = "thesis"
namespace :dir do
  namespace :pyg do
    desc "Pygmentizes all files in the directory to latex"
    task :latex do
      Dir.glob('**/*.{rb,xml,yml,php,html,java}').each do |filename|
        puts "pygmentizing #{File.basename(filename)}"
        `pygmentize -O'style=emacs,linenos=1,encoding=utf-8' -f latex #{filename} > #{filename + '.tex'}`
      end
    end
  end
  namespace :dot do
    desc "Render all images"
    task :png do
      Dir.glob('**/*.{dot,circo,dia}').each do |filename|
        directory = File.dirname(filename) + '/'
        extension = File.extname(filename)
        basename  = File.basename(filename, extension)
        puts "Rendering #{filename}..."
        `dot #{filename} -Tpdf -o #{directory + basename}.pdf` if File.extname(filename) == '.dot'
        `circo #{filename} -Tpdf -o #{directory + basename}.pdf` if File.extname(filename) == '.circo'
        `dia --filter=eps -e #{filename}.eps #{filename}` if File.extname(filename) == '.dia'
     end
    end
  end
end
namespace :latex do
  task :all => [:index, :bib, :compile]
  desc "Counts words of main document"
  task :count do
    puts "#{`detex #{PROJECT_NAME} | wc -w`.strip} words in thesis"
    if (file = ENV["file"])
      puts "#{`detex #{file} | wc -w`.strip} words in #{file}"
    end
  end
  desc "Generates the Index"
  task :index do
    puts "Generating Index for #{PROJECT_NAME}."
    `makeindex -s #{PROJECT_NAME}.ist -t #{PROJECT_NAME}.alg -o #{PROJECT_NAME}.acr #{PROJECT_NAME}.acn`
    `makeindex -s #{PROJECT_NAME}.ist -t #{PROJECT_NAME}.glg -o #{PROJECT_NAME}.gls #{PROJECT_NAME}.glo`
  end
  desc "Generating BibTeX"
  task :bib do
    puts "Generating BibTeX for #{PROJECT_NAME}."
    `bibtex #{PROJECT_NAME}`
  end
  desc "Compile LaTeX"
  task :compile do
    puts "Compiling #{PROJECT_NAME}."
    `pdflatex #{PROJECT_NAME}`
  end
  desc "Generate PDF File"
  task :pdf do
    puts "Generating PDF for #{PROJECT_NAME}."
    `pdflatex #{PROJECT_NAME}.dvi`
  end
  desc "Count PDF Pages"
  task :pages do
    puts "Pages for Project #{PROJECT_NAME}:"
    puts `pdfinfo #{PROJECT_NAME}.pdf|grep Pages`
  end

end

desc "Grep out the TODO's"
task :todo do
  puts "\n** Whats left to do for #{PROJECT_NAME} **\n"
  puts `grep -n %TODO *.tex */*.tex`
end

desc "All (dot, tex, pdf)"
task :default => ["dir:pyg:latex", "dir:dot:png", "latex:all", "todo"]

Mit dem Rakefile in eurem Hauptarchiv habt ihr folgende Kommandos zur Verfügung:

  • rake - baut alles (Bilder, LaTeX, Pdf, Todo)
  • rake dir:dot:png - baut aus den .dot Dateien .eps Bilder
  • rake dir:pyg:latex - Kompiliert die Quellcodebeispiele zu Latex-Dateien
  • rake dir:bib - baut die Bibliografie neu
  • rake dir:index - baut den Index neu rake dir:count - zählt Worte
  • rake dir:pdf - Lässt ein PDF raus rake dir:bib - baut

die Bibliografie neu rake todo - gibt alle übrigen TODO’s aus.

Viel Spaß.

Dank an Flo. Fragen an mich. (Oder in den Kommentaren an Skade.)