root/lang/ruby/misc/rake_template/Rakefile-latex @ 24878

Revision 24878, 2.7 kB (checked in by hogelog, 4 years ago)
  • 'rake target' compile target.tex -> target.dvi.
  • 'rake [bib|clean|clobber|dep|force|pdf|ps]' aim previous target.
Line 
1RAKEINFO = ".rakeinfo"
2def 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
12end
13def 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]
36end
37
38Dir.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
51end
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
65desc "Compile LaTeX -> DVI"
66task :default => $DVINAME
67
68desc "Compile DVI -> PDF"
69task :pdf => $PDFNAME
70
71desc "Compile DVI -> PS"
72task :ps => $PSNAME
73
74desc "Link BibTeX files"
75task :bib => $BIBS
76
77desc "Print Depends Information"
78task :dep do
79    puts "#$DVINAME: #{tex_dep($TEXNAME).join(" ")}"
80    puts "#$PDFNAME: #$DVINAME"
81    puts "#$PSNAME: #$DVINAME"
82end
83
84require "rake/clean"
85CLEAN.include(%w[aux toc lot lof log bbl blg bib].map{|x|"*.#{x}"} << RAKEINFO)
86CLOBBER.include([$DVINAME, $PDFNAME, $PSNAME])
87
88def 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
100end
101
102desc "Force Compile LaTeX -> DVI"
103task :force do
104    texcompile($TARGET)
105end
106
107rule ".pdf" => [".dvi"] do |t|
108    sh "#$DVIPDF #{t.source}"
109end
110
111rule ".ps" => [".dvi"] do |t|
112    sh "#$DVIPS #{t.source}"
113end
114
115rule ".bib" do |bib|
116    ln "#$BIBTEXDIR/#{bib}", "."
117end
118
119# vim: set ft=ruby sw=4 ts=4 et:
Note: See TracBrowser for help on using the browser.