以下のファイルがあったとして、
main.tex
main.bib
PDFを生成するには、
platex main
pbibtex main
platex main
platex main
dvimdfmx main
を実行する。
これをファイルの変更に応じて自動で実行したい。
ただし、2〜4が不要な場合はスキップしたい。そんなRakefile.rb
がこれ↓。
Rakefile.rb
require 'rake'
require 'rake/clean'
PAPER = 'main'
LATEX = 'platex -kanji=utf8'
BIBTEX = 'pbibtex -kanji=utf8'
DVIPDFM = 'dvipdfmx'
ZIP = 'zip'
task :default do
Rake::Task[:clean].execute
Rake::Task[:latex].execute
Rake::Task[:bibtex].execute
Rake::Task[:latex].execute
Rake::Task[:latex].execute
Rake::Task[:dvipdfm].execute
end
task :latex do
sh("#{LATEX} #{PAPER}")
end
task :bibtex do
sh("#{BIBTEX} #{PAPER}")
end
task :dvipdfm do
sh("#{DVIPDFM} #{PAPER}")
end
task :archive do
sh("#{ZIP} -r #{PAPER}.zip *")
end
task :watch do
require 'watchr'
require 'digest/md5'
executor = Class.new {
def submit(path, &task)
current_hash = Digest::MD5.file(path).to_s
@hashes ||= {}
if @hashes[path] != current_hash
task.call()
@hashes[path] = current_hash
end
end
}.new
script = Watchr::Script.new
script.watch "#{PAPER}.tex" do
executor.submit "#{PAPER}.tex" do
Rake::Task[:latex].execute
executor.submit "#{PAPER}.aux" do
Rake::Task[:bibtex].execute
Rake::Task[:latex].execute
Rake::Task[:latex].execute
end
Rake::Task[:dvipdfm].execute
end
end
script.watch "#{PAPER}.bib" do
executor.submit "#{PAPER}.bib" do
Rake::Task[:latex].execute
Rake::Task[:bibtex].execute
Rake::Task[:latex].execute
Rake::Task[:latex].execute
Rake::Task[:dvipdfm].execute
end
end
Watchr::Controller.new(script, Watchr.handler.new).run
end
CLEAN.include(%w{aux log dvi bbl blg toc lof lot fdb_latexmk fls out bb xbb DS_Store}.map{|e|"**/*.#{e}"}+['**/.DS_Store'])
CLOBBER.include("#{PAPER}.pdf")
rake watch
で監視開始します。