| 1 | RAKEINFO = ".rakeinfo" |
|---|
| 2 | def find_target |
|---|
| 3 | if FileTest.exist?(RAKEINFO) |
|---|
| 4 | return IO.read(RAKEINFO).chomp |
|---|
| 5 | end |
|---|
| 6 | target = Dir.glob("*.tex").first |
|---|
| 7 | basename = File.basename(target, ".tex") |
|---|
| 8 | File.open(RAKEINFO, "w") do |file| |
|---|
| 9 | file.puts(basename) |
|---|
| 10 | end |
|---|
| 11 | basename |
|---|
| 12 | end |
|---|
| 13 | def tex_dep(texname) |
|---|
| 14 | inputs = [texname] |
|---|
| 15 | resources = [RAKEINFO] |
|---|
| 16 | bibs = [] |
|---|
| 17 | while !inputs.empty? |
|---|
| 18 | resources << (input = inputs.shift) |
|---|
| 19 | begin |
|---|
| 20 | File.open(input){|file| |
|---|
| 21 | file.each_line{|line| |
|---|
| 22 | if /\\input\{(.+)\}/ =~ line |
|---|
| 23 | inputs << $1 |
|---|
| 24 | elsif /\\(?:verbatiminput|includegraphics\[.+\])\{(.+)\}/ =~ line |
|---|
| 25 | resources << $1 |
|---|
| 26 | elsif /\\bibliography\{(.+)\}/ =~ line |
|---|
| 27 | bibs += $1.split(",").map{|x| "#{x}.bib"} |
|---|
| 28 | end |
|---|
| 29 | } |
|---|
| 30 | } |
|---|
| 31 | rescue |
|---|
| 32 | STDERR.puts $! |
|---|
| 33 | end |
|---|
| 34 | end |
|---|
| 35 | [resources, bibs] |
|---|
| 36 | end |
|---|
| 37 | |
|---|
| 38 | Dir.glob("*.tex").each do|tex| |
|---|
| 39 | basename = File.basename(tex, ".tex") |
|---|
| 40 | dvi = "#{basename}.dvi" |
|---|
| 41 | desc "Compile #{tex} -> #{dvi}" |
|---|
| 42 | |
|---|
| 43 | resources, bibs = tex_dep(tex) |
|---|
| 44 | task basename => dvi |
|---|
| 45 | file dvi => (resources+bibs) do |
|---|
| 46 | File.open(RAKEINFO, "w") do |file| |
|---|
| 47 | file.puts(basename) |
|---|
| 48 | end |
|---|
| 49 | texcompile(basename, bibs) |
|---|
| 50 | end |
|---|
| 51 | end |
|---|
| 52 | |
|---|
| 53 | $TARGET = find_target |
|---|
| 54 | $TEXNAME = "#$TARGET.tex" |
|---|
| 55 | $DVINAME = "#$TARGET.dvi" |
|---|
| 56 | $PDFNAME = "#$TARGET.pdf" |
|---|
| 57 | $PSNAME = "#$TARGET.ps" |
|---|
| 58 | $TEX = "platex" |
|---|
| 59 | $BIB = "jbibtex" |
|---|
| 60 | $DVIPS = "dvips" |
|---|
| 61 | $DVIPDF = "dvipdfmx" |
|---|
| 62 | $BIBTEXDIR = ENV["BIBTEXDIR"] |
|---|
| 63 | $RESOURCES,$BIBS = tex_dep($TEXNAME) |
|---|
| 64 | |
|---|
| 65 | desc "Compile LaTeX -> DVI" |
|---|
| 66 | task :default => $DVINAME |
|---|
| 67 | |
|---|
| 68 | desc "Compile DVI -> PDF" |
|---|
| 69 | task :pdf => $PDFNAME |
|---|
| 70 | |
|---|
| 71 | desc "Compile DVI -> PS" |
|---|
| 72 | task :ps => $PSNAME |
|---|
| 73 | |
|---|
| 74 | desc "Link BibTeX files" |
|---|
| 75 | task :bib => $BIBS |
|---|
| 76 | |
|---|
| 77 | desc "Print Depends Information" |
|---|
| 78 | task :dep do |
|---|
| 79 | puts "#$DVINAME: #{tex_dep($TEXNAME).join(" ")}" |
|---|
| 80 | puts "#$PDFNAME: #$DVINAME" |
|---|
| 81 | puts "#$PSNAME: #$DVINAME" |
|---|
| 82 | end |
|---|
| 83 | |
|---|
| 84 | require "rake/clean" |
|---|
| 85 | CLEAN.include(%w[aux toc lot lof log bbl blg bib].map{|x|"*.#{x}"} << RAKEINFO) |
|---|
| 86 | CLOBBER.include([$DVINAME, $PDFNAME, $PSNAME]) |
|---|
| 87 | |
|---|
| 88 | def texcompile(target, bibs) |
|---|
| 89 | begin |
|---|
| 90 | if !bibs.empty? |
|---|
| 91 | sh "#$TEX #{target}" |
|---|
| 92 | sh "#$BIB #{target}" |
|---|
| 93 | end |
|---|
| 94 | sh "#$TEX #{target}" |
|---|
| 95 | sh "#$TEX #{target}" |
|---|
| 96 | rescue |
|---|
| 97 | puts $! |
|---|
| 98 | sh "touch -t 9901010000 #{target}.dvi" |
|---|
| 99 | end |
|---|
| 100 | end |
|---|
| 101 | |
|---|
| 102 | desc "Force Compile LaTeX -> DVI" |
|---|
| 103 | task :force do |
|---|
| 104 | texcompile($TARGET) |
|---|
| 105 | end |
|---|
| 106 | |
|---|
| 107 | rule ".pdf" => [".dvi"] do |t| |
|---|
| 108 | sh "#$DVIPDF #{t.source}" |
|---|
| 109 | end |
|---|
| 110 | |
|---|
| 111 | rule ".ps" => [".dvi"] do |t| |
|---|
| 112 | sh "#$DVIPS #{t.source}" |
|---|
| 113 | end |
|---|
| 114 | |
|---|
| 115 | rule ".bib" do |bib| |
|---|
| 116 | ln "#$BIBTEXDIR/#{bib}", "." |
|---|
| 117 | end |
|---|
| 118 | |
|---|
| 119 | # vim: set ft=ruby sw=4 ts=4 et: |
|---|