latex.mkで、索引や文献リストを作成するときの動作を修正
[makefiles.git] / latex_mk / latex.mk
1 # latex.mk
2 # LaTeX処理(コンパイル)を行う
3 #
4 # == 使い方 ==
5 # 1. texソースファイルと同じディレクトリーに本ファイル(latex.mk)をコピーする
6 # 2. Makefileに変数TARGETS と「include latex.mk」を記述する
7 # 3. texソースファイルと同じディレクトリーで、make コマンドを実行する
8 #
9 # == 機能 ==
10 # - 読み込むべき中間ファイルがないことや相互参照未定義の警告がある場合、LaTeX処理を最大4回繰り返す
11 # - \includegraphics命令がTeXファイルに含まれる場合、グラフィックファイルを挿入
12 #   -- 挿入されたグラフィックファイルが更新されたときは、処理を開始
13 #   -- 挿入されたグラフィックファイルがないときは、処理を中止
14 #   -- 挿入されたグラフィックファイルに対するバウンディング情報ファイル(.xbb)を作成
15 # - \include、\input命令がTeXファイルに含まれる場合、TeXファイルを挿入
16 #   -- 挿入されたTeXファイルが更新されたときは、処理を開始
17 #   -- 挿入されたTeXファイルがないときは、処理を中止
18 # - \makeindex命令が含まれる場合、mendexで索引を作成
19 # - \bibliography命令が含まれる場合、BiBTeXで文献一覧を作成
20 #
21 # == 擬似ターゲット ==
22 # - tex-clean: TeX中間ファイル(auxなど)を削除。ターゲットに.dviが含まれていないときは.dviファイルを削除
23 # - xbb-clean: バウンディング情報ファイル(.xbb)を削除
24 # - tex-distclean: TeX中間ファイル、バウンディング情報ファイル、ターゲットファイル(PDF、.dvi)を削除
25 #
26 # === Makefile -- sample ===
27 # TARGETS := report.tex
28 #
29 # all: $(TARGETS)
30 #
31 # include latex.mk
32 .PHONY: warning tex-clean tex-distclean
33
34 # シェルコマンド
35 CAT := cat
36 CMP := cmp -s
37 CP := cp
38 ECHO := echo
39 GREP := grep
40 SED := sed
41
42 warning:
43         @$(ECHO) "check current directory, or set TARGET in Makefile."
44
45 # LaTeXコマンド
46 LATEX := platex
47 DVIPDFMX := dvipdfmx
48 EXTRACTBB := extractbb
49 BIBTEX := pbibtex
50 MENDEX := mendex
51
52 # TeX中間ファイルの拡張子
53 #   .aux: 相互参照用
54 #   .fls: tex -recorderで生成されるファイルリスト
55 #   .lof: 図リスト(\tableoffigures)用
56 #   .lot: 表リスト(\tableoftables)用
57 #   .out: hyperrefパッケージ用
58 #   .toc: 目次(\tableofcontents)用
59 #   .log: ログ
60 TEX_INT := .aux .fls .lof .lot .out .toc .log
61 # 索引中間ファイルの拡張子
62 #   .idx: auxから作成
63 #   .ind: idxから作成
64 #   .ilg: 索引ログ
65 IND_INT := .idx .ind .ilg
66 # BiBTeX中間ファイルの拡張子
67 #   .bbl: auxから作成
68 #   .blg: BiBTeXログ
69 BIB_INT := .bbl .blg
70
71 # \makeindex命令
72 makeindex = $(shell $(SED) -n -e '/^.*[^\]\{0,1\}%.*\\makeindex/!s/\\makeindex/&/p' $<)
73
74 # \bibliography命令で読み込まれる文献データベースファイル
75 bibdb = $(addsuffix .bib,$(basename $(strip $(shell \
76   $(SED) -n -e '/^.*[^\]\{0,1\}%.*\\bibliography/!s/\\bibliography\(\[[^]]*\]\)\{0,1\}{\([^}]*\)}/&\n/gp' $< $(intex) | \
77   $(SED) -e 's/.*{\([^}]*\)}.*/\1/' | \
78   $(SED) -e 's/,/ /g'))))
79
80 # ファイル名から拡張子を除いた部分
81 BASE = $(basename $<)
82 # .texファイル
83 TEXFILE = $(addsuffix .tex,$(BASE))
84 # .auxファイル
85 AUXFILE = $(addsuffix .aux,$(BASE))
86 # .prev_auxファイル
87 PREV_AUXFILE = $(addsuffix .prev_aux,$(BASE))
88 # .dviファイル
89 DVIFILE = $(addsuffix .dvi,$(BASE))
90 # .dファイル
91 DFILE = $(addsuffix .d,$(BASE))
92 # .logファイル
93 LOGFILE = $(addsuffix .log,$(BASE))
94 # .idxファイル
95 IDXFILE = $(addsuffix .idx,$(BASE))
96 # .prev_idxファイル。.idxファイルのコピー
97 PREV_IDXFILE = $(addsuffix .prev_idx,$(BASE))
98 # .indファイル
99 INDFILE = $(addsuffix .ind,$(BASE))
100 # .prev_indファイル。.indファイルのコピー
101 PREV_INDFILE = $(addsuffix .prev_ind,$(BASE))
102 # .ilgファイル
103 ILGFILE = $(addsuffix .ilg,$(BASE))
104 # .bblファイル
105 BBLFILE = $(addsuffix .bbl,$(BASE))
106 # .prev_bblファイル。.bblファイルのコピー
107 PREV_BBLFILE = $(addsuffix .prev_bbl,$(BASE))
108 # .bblファイル
109 BLGFILE = $(addsuffix .blg,$(BASE))
110
111 #LaTeXオプション
112 LATEXFLAG ?=
113 DVIPDFMXFLAG ?=
114 EXTRACTBBFLAGS ?=
115 BIBTEXFLAG ?=
116 MENDEXFLAG ?=
117
118 # LaTeX処理(コンパイル)
119 LATEXCMD = $(LATEX) -interaction=batchmode $(LATEXFLAG) $(TEXFILE)
120 COMPILE.tex = $(ECHO) $(LATEXCMD); $(LATEXCMD) >/dev/null 2>&1 || ($(CAT) $(LOGFILE); exit 1)
121
122 # 索引(.indファイル)作成
123 MENDEXCMD = $(MENDEX) $(MENDEXFLAG) $(IDXFILE)
124 COMPILE.idx = $(ECHO) $(MENDEXCMD); $(MENDEXCMD) >/dev/null 2>&1 || ($(CAT) $(ILGFILE); exit 1)
125
126 # 文献リスト(.bblファイル)作成
127 BIBTEXCMD = $(BIBTEX) $(BIBTEXFLAG) $(AUXFILE)
128 COMPILE.bbl = $(ECHO) $(BIBTEXCMD); $(BIBTEXCMD) >/dev/null 2>&1 || ($(CAT) $(BLGFILE); exit 1)
129
130 # 相互参照未定義の警告
131 WARN_UNDEFREF := 'There were undefined references\.'
132 # 読み込むべき中間ファイルがないことの警告
133 WARN_NOFILE = 'No file $(BASE)\.[a-zA-Z0-9]*\.'
134
135 # LaTeX処理
136 # 索引ファイルがある場合、1回処理する
137 # ログファイルに警告がある場合、警告がなくなるまで最大4回処理する
138 COMPILES.tex = \
139   @(for f in 1st 2nd 3rd final; do \
140       if test -s $@ -a -s $(LOGFILE); then \
141         $(GREP) -e $(WARN_UNDEFREF) -e $(WARN_NOFILE) $(LOGFILE) || exit 0; \
142       fi; \
143       $(COMPILE.tex); \
144     done)
145
146 # *.*ファイルと *.prev_*ファイルを比較し、*.*ファイルが更新されている場合はその内容を*.prev_* にコピーする
147 CMPPREV = $(CMP) $@ $< && $(ECHO) '$< is up to date.'|| $(CP) -v $< $@
148
149 # \include、\input命令で読み込まれるtexファイル
150 intex = $(addsuffix .tex,$(basename $(strip $(shell \
151   $(SED) -n -e '/^.*[^\]\{0,1\}%.*\\\(include\|input\)/!s/\\\(include\|input\)\(\[[^]]*\]\)\{0,1\}{[^}]*}/&\n/gp' $< | \
152   $(SED) -e 's/.*{\([^}]*\)}.*/\1/'))))
153
154 # \includegraphics命令で読み込まれるグラフィックファイル
155 ingraphics = $(strip $(shell \
156   $(SED) -n -e '/^.*[^\]\{0,1\}%.*\\includegraphics/!s/\\includegraphics\(\[[^]]*\]\)\{0,1\}\({[^}]*}\)/&\n/gp' $< $(intex) | \
157   $(SED) -e 's/.*{\([^}]*\)}.*/\1/'))
158
159 # 依存関係を.dファイルに書き出す
160 %.d: %.tex
161         @$(ECHO) '$@ is created by scanning $^.'
162 # TeX、.aux、.dvi、.dファイルの依存関係
163         @($(ECHO) '$(AUXFILE) $(DFILE): $(TEXFILE)'; \
164       $(ECHO); \
165       $(ECHO) '$(PREV_AUXFILE): $(AUXFILE)'; \
166       $(ECHO); \
167       $(ECHO) '$(DVIFILE): $(PREV_AUXFILE)' $(if $(makeindex),'$(PREV_INDFILE)') $(if $(bibdb),'$(PREV_BBLFILE)'); \
168     ) >$@
169         $(if $(strip $(makeindex) $(bibdb)),@( \
170       $(ECHO) ' @$$(COMPILE.tex)'; \
171       $(ECHO) ' @$$(COMPILES.tex)'; \
172     ) >>$@)
173 # 画像ファイルの依存関係
174         $(if $(ingraphics),@( \
175         $(ECHO); \
176         $(ECHO) '# IncludeGraphic Files - .pdf, .jpeg/.jpg, .png with .xbb'; \
177         $(ECHO) '$(AUXFILE): $(ingraphics)'; \
178         $(ECHO); \
179         $(ECHO) '$(AUXFILE): $(addsuffix .xbb,$(basename $(filter-out %.eps,$(ingraphics))))'; \
180     ) >>$@)
181 # \includeまたは\input命令で読み込まれるTeXファイルの依存関係
182         $(if $(intex),@( \
183         $(ECHO); \
184         $(ECHO) '# Files called from \include or \input - .tex'; \
185         $(ECHO) '$(AUXFILE): $(intex)'; \
186     ) >>$@)
187 # 索引作成用ファイルの依存関係: .aux -> idx -> .ind -> .dvi
188         $(if $(makeindex),@( \
189         $(ECHO); \
190         $(ECHO) '# Index files: .tex -> .idx -> .ind -> .dvi'; \
191         $(ECHO) '$(IDXFILE): $(TEXFILE)'; \
192         $(ECHO); \
193         $(ECHO) '$(PREV_IDXFILE): $(IDXFILE)'; \
194         $(ECHO); \
195         $(ECHO) '$(INDFILE): $(PREV_IDXFILE)'; \
196         $(ECHO); \
197         $(ECHO) '$(PREV_INDFILE): $(INDFILE)'; \
198     ) >>$@)
199   # 文献処理用ファイルの依存関係
200         $(if $(bibdb),@( \
201         $(ECHO); \
202         $(ECHO) '# Bibliography files: .aux, BIBDB -> .bbl -> .div'; \
203         $(ECHO) '$(BBLFILE): $(bibdb) $(AUXFILE)'; \
204         $(ECHO); \
205         $(ECHO) '$(PREV_BBLFILE): $(BBLFILE)'; \
206     ) >>$@)
207
208 # 変数TARGETSで指定されたターゲットファイルに対応する
209 # .dファイルをインクルードし、依存関係を取得する
210 # ターゲットに %clean、%.xbb、%.d が含まれている場合は除く
211 ifeq (,$(filter %clean %.xbb %.d,$(MAKECMDGOALS)))
212   -include $(addsuffix .d,$(basename $(TARGETS)))
213 endif
214
215 # auxファイル作成
216 %.aux: %.tex
217         @$(COMPILE.tex)
218
219 # prev_auxファイル作成
220 %.prev_aux: %.aux
221         @$(CMPPREV)
222
223 # dviファイル作成
224 %.dvi: %.prev_aux
225         $(COMPILES.tex)
226
227 # PDFファイル作成
228 %.pdf: %.dvi
229         $(DVIPDFMX) $(DVIPDFMXFLAG) $<
230
231 # バウンディング情報ファイル作成
232 # pdf、jpeg/jpg、pngファイルに対応
233 %.xbb: %.pdf
234         $(EXTRACTBB) $(EXTRACTBBFLAGS) $<
235
236 %.xbb: %.jpeg
237         $(EXTRACTBB) $(EXTRACTBBFLAGS) $<
238
239 %.xbb: %.jpg
240         $(EXTRACTBB) $(EXTRACTBBFLAGS) $<
241
242 %.xbb: %.png
243         $(EXTRACTBB) $(EXTRACTBBFLAGS) $<
244
245 # 索引ファイル作成
246 %.idx: %.tex
247         @$(COMPILE.tex)
248
249 %.prev_idx: %.idx
250         @$(CMPPREV)
251
252 %.ind: %.prev_idx
253         @$(COMPILE.idx)
254
255 %.prev_ind: %.ind
256         @$(CMPPREV)
257
258 # 文献処理用ファイル作成
259 %.bbl: %.prev_aux
260         @$(COMPILE.bbl)
261
262 %.prev_bbl: %.bbl
263         @$(CMPPREV)
264
265 # tex-cleanターゲット
266 tex-clean:
267         $(RM) $(addprefix *,$(TEX_INT) $(IND_INT) $(BIB_INT) .d .prev_aux .prev_idx .prev_ind .prev_bbl)
268 ifeq (,$(filter %.dvi,$(TARGETS)))
269         $(RM) *.dvi
270 endif
271
272 # xbb-cleanターゲット
273 xbb-clean:
274         $(RM) *.xbb
275
276 # tex-distcleanターゲット
277 tex-distclean: tex-clean xbb-clean
278 ifneq (,$(filter %.dvi,$(TARGETS)))
279         $(RM) *.dvi
280 endif
281         $(RM) $(TARGETS)