LoginSignup
10
9

More than 5 years have passed since last update.

ファイルの更新を監視してTeX文書を自動ビルド

Last updated at Posted at 2014-06-25

以下のファイルがあったとして、

  • main.tex
  • main.bib

PDFを生成するには、

  1. platex main
  2. pbibtex main
  3. platex main
  4. platex main
  5. 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で監視開始します。

10
9
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
9