LaTeXコンパイル用のRakefileを書いた

最初の$TARGETだけ対象とするhoge-resume.texの.tex抜いた名前に変更して使う。


rakeと叩くだけでうまいことやってくれる、と嬉しいなあ。
texファイルを読んで適当に依存関係を設定してるつもり。
あとbibtexファイルを置いてるディレクトリを環境変数BIBTEXDIRを設定しておくと、texファイル内で使ってる.bibファイルから現在のディレクトリにリンクを貼る。リンクサポートしてない環境ならコピーされるはず。
rake cleanで中間ファイルの削除、rake clobberで生成したもの全部削除。rake -Tで可能なことが表示されます。

codereposに上げておいた

http://coderepos.org/share/browser/lang/ruby/misc/rake_template/Rakefile-latex

$TARGET     = "hoge-resume"

def tex_dep(texname)
    inputs = [texname]
    resources = []
    bibs = []
    while !inputs.empty?
        resources << (input = inputs.shift)
        File.open(input){|file|
            file.each_line{|line|
                if /\\input\{(.+)\}/ =~ line
                    inputs << $1
                elsif /\\(?:verbatiminput|includegraphics\[.+\])\{(.+)\}/ =~ line
                    resources << $1
                elsif /\\bibliography\{(.+)\}/ =~ line
                    bibs += $1.split(",").map{|x| "#{x}.bib"}
                end
            }
        }
    end
    [resources, bibs]
end

$TEXNAME    = "#$TARGET.tex"
$DVINAME    = "#$TARGET.dvi"
$PDFNAME    = "#$TARGET.pdf"
$PSNAME     = "#$TARGET.ps"
$TEX	    = "platex"
$BIB	    = "jbibtex"
$DVIPS	    = "dvips"
$DVIPDF	    = "dvipdfmx"
$BIBTEXDIR  = ENV["BIBTEXDIR"]
$RESOURCES,$BIBS = tex_dep($TEXNAME)

desc "Compile LaTeX -> DVI"
task :default => $DVINAME

desc "Compile DVI -> PDF"
task :pdf => $PDFNAME

desc "Compile DVI -> PS"
task :ps => $PSNAME

desc "Print Depends Information"
task :dep do
    puts "#$DVINAME: #{($RESOURCES+$BIBS).join(" ")}"
    puts "#$PDFNAME: #$DVINAME"
    puts "#$PSNAME: #$DVINAME"
end

require "rake/clean"
CLEAN.include(%w[aux toc lot lof log bbl blg bib].map{|x|"*.#{x}"})
CLOBBER.include([$DVINAME, $PDFNAME, $PSNAME])

def texcompile
    sh "#$TEX #$TARGET"
    if !$BIBS.empty?
        sh "#$BIB #$TARGET"
    end
    sh "#$TEX #$TARGET"
    sh "#$TEX #$TARGET"
end

desc "Force Compile LaTeX -> DVI"
task :force do
    texcompile
end
file $DVINAME => ($RESOURCES+$BIBS) do
    texcompile
end

file $PDFNAME => $DVINAME do
    sh "#$DVIPDF #$DVINAME"
end

file $PSNAME => $DVINAME do
    sh "#$DVIS #$DVINAME"
end

rule ".bib" do |bib|
    ln "#$BIBTEXDIR/#{bib}", "."
end
# vim: set ft=ruby sw=4 ts=4 et:

test