288 lines
9.9 KiB
Text
288 lines
9.9 KiB
Text
|
#
|
||
|
# Makefile for the automation of LaTeX document processing
|
||
|
#
|
||
|
# Usage: make [target]
|
||
|
# The following targets are understood:
|
||
|
# dvi generate dvi output (latex default target)
|
||
|
# pdf generate pdf output (pdflatex default target)
|
||
|
# ps generate postscript
|
||
|
# clean erase all intermediate files
|
||
|
# realclean erase all but the source files
|
||
|
#
|
||
|
# To do:
|
||
|
# -recursively process \include{} and \input{} commands for .tex
|
||
|
# dependancies
|
||
|
# -do the same for \bibliography{} commands
|
||
|
# -add metapost processing
|
||
|
#
|
||
|
|
||
|
#
|
||
|
# Document information (provided by top-level Makefile)
|
||
|
#
|
||
|
# LATEX
|
||
|
# The name of the latex compiler to use. If the program name is,
|
||
|
# specifically, "pdflatex" then the .pdf will be the default target
|
||
|
# rather than the .dvi. Note that at present there is no way to ask
|
||
|
# for one or the other without switching the contents of this
|
||
|
# variable.
|
||
|
#
|
||
|
# DOCUMENT
|
||
|
# (required) The root name for all files.
|
||
|
#
|
||
|
# GRAPHIC_FILES
|
||
|
# Any graphic files the document depends on, for example any .eps or
|
||
|
# .pdf files included with \includegraphics{}. The output is rebuilt
|
||
|
# if any of these files change but otherwise they play no role in the
|
||
|
# build process.
|
||
|
#
|
||
|
# XFIG_FILES
|
||
|
# Thes Makefile rules allow your LaTeX document to include xfig .fig
|
||
|
# files directly. Each .fig file is converted to a graphic format
|
||
|
# suitable for inclusion by the LaTeX processor, for example
|
||
|
# postscript or pdf. This is accomplished by processing the .fig
|
||
|
# file with fig2dev and producing two output files: a graphics
|
||
|
# version of the .fig file and a LaTeX source file containing the
|
||
|
# commands needed to import that graphics file. In your own LaTeX
|
||
|
# document, you will need to include this .tex source file. For
|
||
|
# example, if you have an xfig file called diagram.fig, you should
|
||
|
# set "XFIG_FILES = diagram.fig" in your Makefile and place the
|
||
|
# command "\include{diagram.fig}" in your LaTeX document where you
|
||
|
# would like the image placed. When your document is processed, the
|
||
|
# xfig file will be converted to a, for example, postscript file
|
||
|
# called diagram.fig.ps and a LaTeX source file called
|
||
|
# diagram.fig.tex. The \include{} command in your LaTeX source reads
|
||
|
# in the .fig.tex file (the .tex extension is assumed by the command)
|
||
|
# which in turn contains the commands to import the graphics file.
|
||
|
#
|
||
|
# As an added bonus, any text objects in the xfig document that have
|
||
|
# their "special" flag set will be removed from the document before
|
||
|
# it is converted to a graphics format. Their contents are added to
|
||
|
# the LaTeX source file along with the commands needed to overlay
|
||
|
# them in the correct places on the figure. In this way, you can use
|
||
|
# LaTeX to typset the text of your xfig figure. This has the
|
||
|
# advantage of having the text rendered in the same font as the rest
|
||
|
# of your document and also allows you to make use of all of LaTeX's
|
||
|
# typsetting facilities. Note that in your xfig document you should
|
||
|
# set the pen colour of the "special" text to "Default" in order to
|
||
|
# prevent \color commands from being issued, otherwise you will need
|
||
|
# to include the LaTeX package "color".
|
||
|
#
|
||
|
# If you get error messages about "unknown graphics format" related
|
||
|
# to the .fig.ps or .fig.pdf intermediate graphics file then you must
|
||
|
# issue the \DeclareGraphicsRule{.fig.ps}{eps}{.fig.ps}{} command or
|
||
|
# the \DeclareGraphicsRule{.fig.pdf}{pdf}{.fig.pdf}{} command in your
|
||
|
# document's preamble. See the grfguide.ps graphics package
|
||
|
# documentation for more information.
|
||
|
#
|
||
|
# BIB_FILES
|
||
|
# $(DOCUMENT).tex will be automatically searched for all .bib files
|
||
|
# specified via \bibliography{} commands. Use this variable to
|
||
|
# override the automatic search and manually specify the .bib files.
|
||
|
# Reasons for wanting to override the automatics: (i) scanning a
|
||
|
# large document can be time-consuming and can be skipped by entering
|
||
|
# the info yourself (ii) the algorithm may be broken for your
|
||
|
# document.
|
||
|
#
|
||
|
# BSTINPUTS
|
||
|
# BIBINPUTS
|
||
|
# The contents of these variables override the system default search
|
||
|
# paths for bibtex. If you are using a custom bibliographic style,
|
||
|
# you may need to set BSTINPUTS to the directory in which the .bst
|
||
|
# file resides. If your .bib databases cannot be found, then you
|
||
|
# will need to set BIBINPUTS to a colon-separated list of the
|
||
|
# directories in which they reside.
|
||
|
#
|
||
|
# DVIPS_FLAGS
|
||
|
# Flags to pass to dvips. It might be necessary to include the -K
|
||
|
# flag if you are having trouble getting mpage to handle documents
|
||
|
# that contain EPS figures generated by certain applications.
|
||
|
#
|
||
|
|
||
|
|
||
|
###############################################################################
|
||
|
#
|
||
|
# Preamble
|
||
|
#
|
||
|
###############################################################################
|
||
|
|
||
|
DVI_FILE := $(DOCUMENT).dvi
|
||
|
PDF_FILE := $(DOCUMENT).pdf
|
||
|
PS_FILE := $(DOCUMENT).ps
|
||
|
AUX_FILE := $(DOCUMENT).aux
|
||
|
LOF_FILE := $(shell ls $(DOCUMENT).lof 2>/dev/null)
|
||
|
LOT_FILE := $(shell ls $(DOCUMENT).lot 2>/dev/null)
|
||
|
TOC_FILE := $(shell ls $(DOCUMENT).toc 2>/dev/null)
|
||
|
IDX_FILE := $(shell ls $(DOCUMENT).idx 2>/dev/null)
|
||
|
END_FILE := $(shell ls $(DOCUMENT).end 2>/dev/null)
|
||
|
TEX_FILES := $(DOCUMENT).tex
|
||
|
OTHER_FILES := $(DOCUMENT).blg $(DOCUMENT).log $(DOCUMENT).out
|
||
|
|
||
|
# grab the contents of \bibliograph{} commands
|
||
|
ifeq ($(BIB_FILES),)
|
||
|
BIB_FILES := $(shell for source in $(TEX_FILES) ; do sed -e '{' -e 'y/,/ /' -e 's?.*\\bibliography[{]\(.*\)[}].*?\1?' -e 't' -e 'd' -e '}' <$$source ; done)
|
||
|
BIB_FILES := $(BIB_FILES:%=%.bib)
|
||
|
endif
|
||
|
|
||
|
ifneq ($(BIB_FILES),)
|
||
|
BBL_FILE := $(DOCUMENT).bbl
|
||
|
endif
|
||
|
ifneq ($(IDX_FILE),)
|
||
|
IND_FILE := $(DOCUMENT).ind
|
||
|
endif
|
||
|
|
||
|
# construct the names of auxiliary files related to xfig documents
|
||
|
XFIG_AUX = $(strip $(XFIG_FILES:%.fig=%.fig.aux))
|
||
|
XFIG_GFX = $(strip $(XFIG_FILES:%.fig=%.fig.pdf) $(XFIG_FILES:%.fig=%.fig.ps))
|
||
|
XFIG_TEX = $(strip $(XFIG_FILES:%.fig=%.fig.tex))
|
||
|
|
||
|
# latex will be run over and over and over again until the following files
|
||
|
# stop changing.
|
||
|
MONITOR_FILES := $(strip $(AUX_FILE) $(TOC_FILE) $(LOF_FILE) $(LOT_FILE) $(BBL_FILE) $(IND_FILE) $(END_FILE))
|
||
|
|
||
|
# the following files must be present or processing will fail
|
||
|
SOURCE_FILES := $(TEX_FILES) $(BIB_FILES) $(GRAPHIC_FILES) $(XFIG_FILES)
|
||
|
|
||
|
|
||
|
###############################################################################
|
||
|
#
|
||
|
# Targets
|
||
|
#
|
||
|
###############################################################################
|
||
|
|
||
|
.PHONY : dvi pdf ps clean realclean check_for_sources
|
||
|
|
||
|
.SECONDARY : $(MONITOR_FILES) $(XFIG_AUX) $(XFIG_GFX) $(XFIG_TEX)
|
||
|
|
||
|
ifeq (,$(LATEX))
|
||
|
LATEX := latex
|
||
|
endif
|
||
|
|
||
|
ifeq ($(notdir $(LATEX)),pdflatex)
|
||
|
pdf : $(PDF_FILE)
|
||
|
else
|
||
|
dvi : $(DVI_FILE)
|
||
|
endif
|
||
|
|
||
|
ps : $(PS_FILE)
|
||
|
|
||
|
clean :
|
||
|
-rm -f $(MONITOR_FILES)
|
||
|
-rm -f $(MONITOR_FILES:%=%.old)
|
||
|
-rm -f $(OTHER_FILES)
|
||
|
-rm -f $(XFIG_AUX)
|
||
|
-rm -f $(XFIG_GFX)
|
||
|
-rm -f $(XFIG_TEX)
|
||
|
|
||
|
realclean : clean
|
||
|
-rm -f $(DVI_FILE)
|
||
|
-rm -f $(PDF_FILE)
|
||
|
-rm -f $(PS_FILE)
|
||
|
|
||
|
|
||
|
###############################################################################
|
||
|
#
|
||
|
# Macros
|
||
|
#
|
||
|
###############################################################################
|
||
|
|
||
|
|
||
|
###############################################################################
|
||
|
#
|
||
|
# Dependancies and Generation Rules
|
||
|
#
|
||
|
###############################################################################
|
||
|
|
||
|
#
|
||
|
# Check for the existance of all required source files
|
||
|
#
|
||
|
|
||
|
check_for_sources :
|
||
|
@FOUNDALL=1 ; for source in $(SOURCE_FILES) ; do [ -f "$$source" ] || { echo "Error: cannot find source file: $$source" ; FOUNDALL=0 ; } ; done ; [ $$FOUNDALL == 1 ]
|
||
|
|
||
|
#
|
||
|
# Generate a postscript file from a .dvi file
|
||
|
#
|
||
|
|
||
|
%.ps : %.dvi
|
||
|
dvips $(DVIPS_FLAGS) -o $@ $*
|
||
|
|
||
|
#
|
||
|
# Generate the .dvi (or .pdf) file by running LaTeX (or PDFLaTeX) until the
|
||
|
# auxiliary files listed in MONITOR_FILES stop changing. Rather than just
|
||
|
# looping, make is re-run which allows any files that depend on the
|
||
|
# particular auxiliary files that changed to be updated as well.
|
||
|
#
|
||
|
|
||
|
define run-latex
|
||
|
@function saveold () { for file ; do [ -f $${file} ] && cp -fp $${file} $${file}.old ; done ; true ; } ; \
|
||
|
function restoreold () { for file ; do [ -f $${file}.old ] && mv -f $${file}.old $${file} ; done ; true ; } ; \
|
||
|
function deleteold () { for file ; do rm -f $${file}.old ; done ; true ; } ; \
|
||
|
function makeobsolete () { touch -r $$(ls *.old | tail -n 1) $${1} ; true ; } ; \
|
||
|
function nochange () { for file ; do [ ! -f $${1} ] || cmp $${1} $${1}.old >/dev/null || return ; done ; true ; } ; \
|
||
|
saveold $(MONITOR_FILES) ; \
|
||
|
if $(LATEX) $* ; then \
|
||
|
if nochange $(MONITOR_FILES) ; then \
|
||
|
echo "$(MAKE): LaTeX auxiliary files did not change (processing is complete)" ; \
|
||
|
restoreold $(MONITOR_FILES) ; \
|
||
|
else \
|
||
|
echo "$(MAKE): LaTeX auxiliary files changed (further processing is required)" ; \
|
||
|
echo "please wait..." ; sleep 2 ; \
|
||
|
makeobsolete $@ ; \
|
||
|
deleteold $(MONITOR_FILES) ; \
|
||
|
$(MAKE) --no-print-directory $@ ; \
|
||
|
fi ; \
|
||
|
else \
|
||
|
echo ; \
|
||
|
false ; \
|
||
|
fi
|
||
|
endef
|
||
|
|
||
|
$(DVI_FILE) : %.dvi : $(TEX_FILES) $(MONITOR_FILES) $(GRAPHIC_FILES) $(XFIG_TEX)
|
||
|
$(run-latex)
|
||
|
|
||
|
$(PDF_FILE) : %.pdf : $(TEX_FILES) $(MONITOR_FILES) $(GRAPHIC_FILES) $(XFIG_TEX)
|
||
|
$(run-latex)
|
||
|
|
||
|
#
|
||
|
# Generate a .bbl file from the .aux file.
|
||
|
#
|
||
|
|
||
|
%.bbl : %.aux $(BIB_FILES)
|
||
|
BSTINPUTS="$(BSTINPUTS)" BIBINPUTS="$(BIBINPUTS)" bibtex $*
|
||
|
|
||
|
#
|
||
|
# Generate a .ind file from the .idx file.
|
||
|
#
|
||
|
|
||
|
%.ind : %.idx
|
||
|
makeindex $<
|
||
|
|
||
|
#
|
||
|
# Generate a .aux or .idx file if it doesn't already exist. The existance
|
||
|
# of these files is a prerequisite for the main document processing loop
|
||
|
# above so that's what we're doing here. Note, however, that all .fig.tex
|
||
|
# files must be present in order for this first pass to succeed
|
||
|
#
|
||
|
|
||
|
%.aux %.idx : $(XFIG_TEX)
|
||
|
$(LATEX) $*
|
||
|
|
||
|
#
|
||
|
# Distill xfig .fig files into .fig.tex and either .fig.pdf or .fig.ps
|
||
|
# compoents
|
||
|
#
|
||
|
|
||
|
ifeq ($(notdir $(LATEX)),pdflatex)
|
||
|
%.fig.tex : %.fig %.fig.pdf
|
||
|
fig2dev -L pstex_t -p $*.fig.pdf <$< >$@
|
||
|
else
|
||
|
%.fig.tex : %.fig %.fig.ps
|
||
|
fig2dev -L pstex_t -p $*.fig.ps <$< >$@
|
||
|
endif
|
||
|
|
||
|
%.fig.pdf : %.fig
|
||
|
pushd $(dir $<) ; fig2dev -L pstex <$(nodir $<) | ps2pdf - - >$(nodir $@) ; popd
|
||
|
|
||
|
%.fig.ps : %.fig
|
||
|
pushd $(dir $<) ; fig2dev -L pstex <$(notdir $<) >$(notdir $@) ; popd
|