TeXコンパイル用のMakefile

もう死んでて、毎週研究室のゼミ資料つくるだけの日常。


hogehoge.texコンパイルするとして、以下のようなMakefileコンパイル。dviをつくるときmake、psファイルを作りたいときはmake ps、pdfファイルを作りたいときはmake pdf。BibTeXファイルは~/docs/bibtex/あたりにあるgc.bib, gcbook.bib, embedded.bib。

RESUME = hogehoge
BIBS = gc.bib,gcbook.bib,embedded.bib
TEX     = platex
BIB     = jbibtex
DVIPS = dvips
DVIPDF = dvipdfmx

.SUFFIXES: .ps .dvi .tex .eps .pdf .bib

all: dvi
dvi: deps bib $(RESUME).dvi
ps: $(RESUME).ps
pdf: $(RESUME).pdf

force:
        $(TEX) $(RESUME)
        $(BIB) $(RESUME)
        $(TEX) $(RESUME)
        $(TEX) $(RESUME)

deps:
        ./texdep.pl $(RESUME).tex >deps

bib:
        zsh -c "cp -p $(HOME)/docs/bibtex/{$(BIBS)} ."

clean:
        -rm -f *.aux *.toc *.lot *.lof *.dvi *.log *.bbl *.blg *.pdf *.ps

remake: clean all

.tex.dvi:
        $(TEX) $(RESUME)
        $(BIB) $(RESUME)
        $(TEX) $(RESUME)
        $(TEX) $(RESUME)
.dvi.ps:
        $(DVIPS) $(RESUME)
.dvi.pdf:
        $(DVIPDF) $(RESUME)

-include deps

依存関係を調べるtexdep.plはこんなの。

#!/usr/bin/perl

use strict;
use warnings;
if(@ARGV == 0) {
  print "usage: $0 texfile\n";
  exit -1;
}
my $texfile = $ARGV[0];

if($texfile =~ /([^\.]+)\.tex/) {
  my $texname = $1;
  print "$texname.dvi: ", join(' ', texdep($texfile)), "\n";
  print "$texname.ps: $texname.dvi\n";
  print "$texname.pdf: $texname.dvi\n";
}

sub texdep {
  my ($texfile) = @_;
  my (@depls, @texls);
  open TEX, $texfile or die "cannot open $texfile";
  while(<TEX>) {
    if(/\\input{([^}]+)}/) {
      print $1;
      push @texls, $1;
    }
    elsif(/\\verbatiminput{([^}]+)}/ or /\\includegraphics\[.+\]{([^}]+)}/) {
      push @depls, $1;
    }
    elsif(/\\bibliography{([^}]+)}/) {
      push @depls, map{"$_.bib"}split(',', $1);
    }
  }
  close TEX;
  for my $input (@texls) {
    push @depls, texdep($input);
  }
  return $texfile, @depls;
}

test