2 # Makefile for the automation of LaTeX document processing
5 # The following targets are understood:
6 # dvi generate dvi output (latex default target)
7 # pdf generate pdf output (pdflatex default target)
8 # ps generate postscript
9 # clean erase all intermediate files
10 # realclean erase all but the source files
13 # -recursively process \include{} and \input{} commands for .tex
15 # -do the same for \bibliography{} commands
16 # -add metapost processing
20 # Document information (provided by top-level Makefile)
23 # The name of the latex compiler to use. If the program name is,
24 # specifically, "pdflatex" then the .pdf will be the default target
25 # rather than the .dvi. Note that at present there is no way to ask
26 # for one or the other without switching the contents of this
30 # (required) The root name for all files.
33 # Any graphic files the document depends on, for example any .eps or
34 # .pdf files included with \includegraphics{}. The output is rebuilt
35 # if any of these files change but otherwise they play no role in the
39 # Thes Makefile rules allow your LaTeX document to include xfig .fig
40 # files directly. Each .fig file is converted to a graphic format
41 # suitable for inclusion by the LaTeX processor, for example
42 # postscript or pdf. This is accomplished by processing the .fig
43 # file with fig2dev and producing two output files: a graphics
44 # version of the .fig file and a LaTeX source file containing the
45 # commands needed to import that graphics file. In your own LaTeX
46 # document, you will need to include this .tex source file. For
47 # example, if you have an xfig file called diagram.fig, you should
48 # set "XFIG_FILES = diagram.fig" in your Makefile and place the
49 # command "\include{diagram.fig}" in your LaTeX document where you
50 # would like the image placed. When your document is processed, the
51 # xfig file will be converted to a, for example, postscript file
52 # called diagram.fig.ps and a LaTeX source file called
53 # diagram.fig.tex. The \include{} command in your LaTeX source reads
54 # in the .fig.tex file (the .tex extension is assumed by the command)
55 # which in turn contains the commands to import the graphics file.
57 # As an added bonus, any text objects in the xfig document that have
58 # their "special" flag set will be removed from the document before
59 # it is converted to a graphics format. Their contents are added to
60 # the LaTeX source file along with the commands needed to overlay
61 # them in the correct places on the figure. In this way, you can use
62 # LaTeX to typset the text of your xfig figure. This has the
63 # advantage of having the text rendered in the same font as the rest
64 # of your document and also allows you to make use of all of LaTeX's
65 # typsetting facilities. Note that in your xfig document you should
66 # set the pen colour of the "special" text to "Default" in order to
67 # prevent \color commands from being issued, otherwise you will need
68 # to include the LaTeX package "color".
70 # If you get error messages about "unknown graphics format" related
71 # to the .fig.ps or .fig.pdf intermediate graphics file then you must
72 # issue the \DeclareGraphicsRule{.fig.ps}{eps}{.fig.ps}{} command or
73 # the \DeclareGraphicsRule{.fig.pdf}{pdf}{.fig.pdf}{} command in your
74 # document's preamble. See the grfguide.ps graphics package
75 # documentation for more information.
78 # $(DOCUMENT).tex will be automatically searched for all .bib files
79 # specified via \bibliography{} commands. Use this variable to
80 # override the automatic search and manually specify the .bib files.
81 # Reasons for wanting to override the automatics: (i) scanning a
82 # large document can be time-consuming and can be skipped by entering
83 # the info yourself (ii) the algorithm may be broken for your
88 # The contents of these variables override the system default search
89 # paths for bibtex. If you are using a custom bibliographic style,
90 # you may need to set BSTINPUTS to the directory in which the .bst
91 # file resides. If your .bib databases cannot be found, then you
92 # will need to set BIBINPUTS to a colon-separated list of the
93 # directories in which they reside.
96 # Flags to pass to dvips. It might be necessary to include the -K
97 # flag if you are having trouble getting mpage to handle documents
98 # that contain EPS figures generated by certain applications.
102 ###############################################################################
106 ###############################################################################
108 DVI_FILE := $(DOCUMENT).dvi
109 PDF_FILE := $(DOCUMENT).pdf
110 PS_FILE := $(DOCUMENT).ps
111 AUX_FILE := $(DOCUMENT).aux
112 LOF_FILE := $(shell ls $(DOCUMENT).lof 2>/dev/null)
113 LOT_FILE := $(shell ls $(DOCUMENT).lot 2>/dev/null)
114 TOC_FILE := $(shell ls $(DOCUMENT).toc 2>/dev/null)
115 IDX_FILE := $(shell ls $(DOCUMENT).idx 2>/dev/null)
116 END_FILE := $(shell ls $(DOCUMENT).end 2>/dev/null)
117 TEX_FILES := $(DOCUMENT).tex
118 OTHER_FILES := $(DOCUMENT).blg $(DOCUMENT).log $(DOCUMENT).out
119 INDEX_ARGS := -s mkidx.ist
121 # grab the contents of \bibliograph{} commands
123 BIB_FILES := $(shell for source in $(TEX_FILES) ; do sed -e '{' -e 'y/,/ /' -e 's?.*\\bibliography[{]\(.*\)[}].*?\1?' -e 't' -e 'd' -e '}' <$$source ; done)
124 BIB_FILES := $(BIB_FILES:%=%.bib)
127 ifneq ($(BIB_FILES),)
128 BBL_FILE := $(DOCUMENT).bbl
131 IND_FILE := $(DOCUMENT).ind
134 # construct the names of auxiliary files related to xfig documents
135 XFIG_AUX = $(strip $(XFIG_FILES:%.fig=%.fig.aux))
136 XFIG_GFX = $(strip $(XFIG_FILES:%.fig=%.fig.pdf) $(XFIG_FILES:%.fig=%.fig.ps))
137 XFIG_TEX = $(strip $(XFIG_FILES:%.fig=%.fig.tex))
139 # latex will be run over and over and over again until the following files
141 MONITOR_FILES := $(strip $(AUX_FILE) $(TOC_FILE) $(LOF_FILE) $(LOT_FILE) $(BBL_FILE) $(IND_FILE) $(END_FILE))
143 # the following files must be present or processing will fail
144 SOURCE_FILES := $(TEX_FILES) $(BIB_FILES) $(GRAPHIC_FILES) $(XFIG_FILES)
147 ###############################################################################
151 ###############################################################################
153 .PHONY : dvi pdf ps clean realclean check_for_sources
155 .SECONDARY : $(MONITOR_FILES) $(XFIG_AUX) $(XFIG_GFX) $(XFIG_TEX)
161 ifeq ($(notdir $(LATEX)),pdflatex)
170 -rm -f $(MONITOR_FILES)
171 -rm -f $(MONITOR_FILES:%=%.old)
172 -rm -f $(OTHER_FILES)
183 ###############################################################################
187 ###############################################################################
190 ###############################################################################
192 # Dependancies and Generation Rules
194 ###############################################################################
197 # Check for the existance of all required source files
201 @FOUNDALL=1 ; for source in $(SOURCE_FILES) ; do [ -f "$$source" ] || { echo "Error: cannot find source file: $$source" ; FOUNDALL=0 ; } ; done ; [ $$FOUNDALL == 1 ]
204 # Generate a postscript file from a .dvi file
208 dvips $(DVIPS_FLAGS) -o $@ $*
211 # Generate the .dvi (or .pdf) file by running LaTeX (or PDFLaTeX) until the
212 # auxiliary files listed in MONITOR_FILES stop changing. Rather than just
213 # looping, make is re-run which allows any files that depend on the
214 # particular auxiliary files that changed to be updated as well.
218 @function saveold () { for file ; do [ -f $${file} ] && cp -fp $${file} $${file}.old ; done ; true ; } ; \
219 function restoreold () { for file ; do [ -f $${file}.old ] && mv -f $${file}.old $${file} ; done ; true ; } ; \
220 function deleteold () { for file ; do rm -f $${file}.old ; done ; true ; } ; \
221 function makeobsolete () { touch -r $$(ls *.old | tail -n 1) $${1} ; true ; } ; \
222 function nochange () { for file ; do [ ! -f $${1} ] || cmp $${1} $${1}.old >/dev/null || return ; done ; true ; } ; \
223 saveold $(MONITOR_FILES) ; \
224 if $(LATEX) $* ; then \
225 if nochange $(MONITOR_FILES) ; then \
226 echo "$(MAKE): LaTeX auxiliary files did not change (processing is complete)" ; \
227 restoreold $(MONITOR_FILES) ; \
229 echo "$(MAKE): LaTeX auxiliary files changed (further processing is required)" ; \
230 echo "please wait..." ; sleep 2 ; \
232 deleteold $(MONITOR_FILES) ; \
233 $(MAKE) --no-print-directory $@ ; \
241 $(DVI_FILE) : %.dvi : $(TEX_FILES) $(MONITOR_FILES) $(GRAPHIC_FILES) $(XFIG_TEX)
244 $(PDF_FILE) : %.pdf : $(TEX_FILES) $(MONITOR_FILES) $(GRAPHIC_FILES) $(XFIG_TEX)
248 # Generate a .bbl file from the .aux file.
251 %.bbl : %.aux $(BIB_FILES)
252 BSTINPUTS="$(BSTINPUTS)" BIBINPUTS="$(BIBINPUTS)" bibtex $*
255 # Generate a .ind file from the .idx file.
259 makeindex $(INDEX_ARGS) $<
262 # Generate a .aux or .idx file if it doesn't already exist. The existance
263 # of these files is a prerequisite for the main document processing loop
264 # above so that's what we're doing here. Note, however, that all .fig.tex
265 # files must be present in order for this first pass to succeed
268 %.aux %.idx : $(XFIG_TEX)
272 # Distill xfig .fig files into .fig.tex and either .fig.pdf or .fig.ps
276 ifeq ($(notdir $(LATEX)),pdflatex)
277 %.fig.tex : %.fig %.fig.pdf
278 fig2dev -L pstex_t -p $*.fig.pdf <$< >$@
280 %.fig.tex : %.fig %.fig.ps
281 fig2dev -L pstex_t -p $*.fig.ps <$< >$@
285 pushd $(dir $<) ; fig2dev -L pstex <$(nodir $<) | ps2pdf - - >$(nodir $@) ; popd
288 pushd $(dir $<) ; fig2dev -L pstex <$(notdir $<) >$(notdir $@) ; popd