テストの追加・整理
[makefiles.git] / latex_mk / latex.mk
1 # latex.mk
2 # LaTeX処理(コンパイル)を行う
3 #
4 # == 使い方 ==
5 # 1. texソースファイルと同じディレクトリーに本ファイル(latex.mk)をコピーする
6 # 2. Makefileに変数TEXTARGETS と「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 # TEXTARGETS := report.tex
28 #
29 # all: $(TEXTARGETS)
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 .SECONDARY: $(wildcard $(addsuffix $(TEX_INT) $(IND_INT) $(BIB_INT) .d,*))
72
73 # \tableofcontents命令
74 toc = $(shell $(SED) -n -e '/^.*[^\]\{0,1\}%.*\\tableofcontents/!s/.*\(\\tableofcontents\).*/\1/p' $<)
75
76 # \listoffigures命令
77 lof = $(shell $(SED) -n -e '/^.*[^\]\{0,1\}%.*\\listoffigures/!s/.*\(\\listoffigures\).*/\1/p' $<)
78
79 # \listoftables命令
80 lot = $(shell $(SED) -n -e '/^.*[^\]\{0,1\}%.*\\listoftables/!s/.*\(\\listoftables\).*/\1/p' $<)
81
82 # \makeindex命令
83 makeindex = $(shell $(SED) -n -e '/^.*[^\]\{0,1\}%.*\\makeindex/!s/.*\(\\makeindex\).*/\1/p' $<)
84
85 # \bibliography命令で読み込まれる文献データベースファイル
86 bibdb = $(addsuffix .bib,$(basename $(strip $(shell \
87   $(SED) -n -e '/^.*[^\]\{0,1\}%.*\\bibliography/!s/\\bibliography\(\[[^]]*\]\)\{0,1\}{\([^}]*\)}/&\n/p' $< $(intex) | \
88   $(SED) -e 's/.*{\([^}]*\)}.*/\1/' | \
89   $(SED) -e 's/,/ /g'))))
90
91 # hyperrefパッケージ読み込み
92 hyperref = $(shell $(SED) -n -e '/^.*[^\]\{0,1\}%.*\\usepackage\(\[[^]]*\]\)\{0,1\}{hyperref}/!s/.*\(\\usepackage\)\(\[[^]]*\]\)\{0,1\}\({hyperref}\).*/\1\3/p' $<)
93
94 # ファイル名から拡張子を除いた部分
95 BASE = $(basename $<)
96
97 # .texファイル
98 TEXFILE = $(addsuffix .tex,$(BASE))
99
100 # .auxファイル
101 AUXFILE = $(addsuffix .aux,$(BASE))
102 # .aux_prevファイル
103 AUXFILE_PREV = $(addsuffix .aux_prev,$(BASE))
104
105 # .dviファイル
106 DVIFILE = $(addsuffix .dvi,$(BASE))
107
108 # .dファイル
109 DFILE = $(addsuffix .d,$(BASE))
110
111 # .logファイル
112 LOGFILE = $(addsuffix .log,$(BASE))
113
114 # .tocファイル
115 TOCFILE = $(addsuffix .toc,$(BASE))
116 # .toc_prevファイル。.tocファイルのコピー
117 TOCFILE_PREV = $(addsuffix .toc_prev,$(BASE))
118
119 # .lofファイル
120 LOFFILE = $(addsuffix .lof,$(BASE))
121 # .lof_prevファイル。.lofファイルのコピー
122 LOFFILE_PREV = $(addsuffix .lof_prev,$(BASE))
123
124 # .lotファイル
125 LOTFILE = $(addsuffix .lot,$(BASE))
126 # .lot_prevファイル。.lotファイルのコピー
127 LOTFILE_PREV = $(addsuffix .lot_prev,$(BASE))
128
129 # .idxファイル
130 IDXFILE = $(addsuffix .idx,$(BASE))
131 # .idx_prevファイル。.idxファイルのコピー
132 IDXFILE_PREV = $(addsuffix .idx_prev,$(BASE))
133
134 # .indファイル
135 INDFILE = $(addsuffix .ind,$(BASE))
136 # .ind_prevファイル。.indファイルのコピー
137 INDFILE_PREV = $(addsuffix .ind_prev,$(BASE))
138
139 # .ilgファイル
140 ILGFILE = $(addsuffix .ilg,$(BASE))
141
142 # .bblファイル
143 BBLFILE = $(addsuffix .bbl,$(BASE))
144 # .bbl_prevファイル。.bblファイルのコピー
145 BBLFILE_PREV = $(addsuffix .bbl_prev,$(BASE))
146
147 # .blgファイル
148 BLGFILE = $(addsuffix .blg,$(BASE))
149
150 # .outファイル
151 OUTFILE = $(addsuffix .out,$(BASE))
152 # .out_prevファイル。.outファイルのコピー
153 OUTFILE_PREV = $(addsuffix .out_prev,$(BASE))
154
155 INTERFILES = $(strip \
156                 $(if $(toc),$(TOCFILE)) \
157                 $(if $(lof),$(LOFFILE)) \
158                 $(if $(lot),$(LOTFILE)) \
159                 $(if $(makeindex),$(INDFILE)) \
160                 $(if $(bibdb),$(BBLFILE)) \
161                 $(if $(hyperref),$(OUTFILE)) \
162               )
163
164 INTERFILES_PREV = $(addsuffix _prev,$(INTERFILES))
165
166 #LaTeXオプション
167 LATEXFLAG ?=
168 DVIPDFMXFLAG ?=
169 EXTRACTBBFLAGS ?=
170 BIBTEXFLAG ?=
171 MENDEXFLAG ?=
172
173 # LaTeX処理(コンパイル)
174 LATEXCMD = $(LATEX) -interaction=batchmode $(LATEXFLAG) $(TEXFILE)
175 COMPILE.tex = $(ECHO) $(LATEXCMD); $(LATEXCMD) >/dev/null 2>&1 || ($(CAT) $(LOGFILE); exit 1)
176
177 # 索引中間ファイル(.ind)作成
178 MENDEXCMD = $(MENDEX) $(MENDEXFLAG) $(IDXFILE)
179 COMPILE.idx = $(ECHO) $(MENDEXCMD); $(MENDEXCMD) >/dev/null 2>&1 || ($(CAT) $(ILGFILE); exit 1)
180
181 # 文献リスト中間ファイル(.bbl)作成
182 BIBTEXCMD = $(BIBTEX) $(BIBTEXFLAG) $(AUXFILE)
183 COMPILE.bib = $(ECHO) $(BIBTEXCMD); $(BIBTEXCMD) >/dev/null 2>&1 || ($(CAT) $(BLGFILE); exit 1)
184
185 # 相互参照未定義の警告
186 WARN_UNDEFREF := 'There were undefined references\.'
187 # 読み込むべき中間ファイルがないことの警告
188 WARN_NOFILE = 'No file $(BASE)\.[a-zA-Z0-9]*\.'
189
190 # LaTeX処理
191 # ログファイルに警告がある場合、警告がなくなるまで最大4回処理する
192 COMPILES.tex = \
193   @(for f in 1st 2nd 3rd final; do \
194       if test -s $@ -a -s $(LOGFILE); then \
195         $(GREP) -e $(WARN_UNDEFREF) $(LOGFILE) || exit 0; \
196       fi; \
197       $(COMPILE.tex); \
198     done)
199
200 # ターゲットファイルと必須ファイルを比較し、内容が異なる場合はターゲットファイルの内容を必須ファイルに置き換える
201 CMPPREV = $(CMP) $@ $< || $(CP) -v -p $< $@
202
203 # \include、\input命令で読み込まれるtexファイル
204 intex = $(addsuffix .tex,$(basename $(strip $(shell \
205   $(SED) -n -e '/^.*[^\]\{0,1\}%.*\\\(include\|input\)/!s/\\\(include\|input\)\(\[[^]]*\]\)\{0,1\}{[^}]*}/&\n/p' $< | \
206   $(SED) -e 's/.*{\([^}]*\)}.*/\1/'))))
207
208 # \includegraphics命令で読み込まれるグラフィックファイル
209 ingraphics = $(strip $(shell \
210   $(SED) -n -e '/^.*[^\]\{0,1\}%.*\\includegraphics/!s/\\includegraphics\(\[[^]]*\]\)\{0,1\}\({[^}]*}\)/&\n/p' $< $(intex) | \
211   $(SED) -e 's/.*{\([^}]*\)}.*/\1/'))
212
213 # 依存関係を.dファイルに書き出す
214 %.d: %.tex
215         @$(ECHO) '$@ is created by scanning $^.'
216 # TeX、.aux、.dvi、.dファイルの依存関係
217         @$(ECHO) '$(DFILE): $(TEXFILE)' >$@
218         $(if $(INTERFILES),@( \
219         $(ECHO); \
220         $(ECHO) '$(DVIFILE): $(TEXFILE)'; \
221         $(ECHO) '       @$$(MAKE) -s $(INTERFILES_PREV)'; \
222         $(ECHO) '       @$$(COMPILE.tex)'; \
223         $(ECHO) '       @$$(COMPILES.tex)'; \
224     )  >>$@)
225 # 画像ファイルの依存関係
226         $(if $(ingraphics),@( \
227         $(ECHO); \
228         $(ECHO) '# IncludeGraphic Files - .pdf, .jpeg/.jpg, .png with .xbb'; \
229         $(ECHO) '$(DVIFILE) $(AUXFILE) $(INTERFILES): $(ingraphics)'; \
230         $(ECHO); \
231         $(ECHO) '$(strip $(DVIFILE) $(AUXFILE) $(INTERFILES)): $(addsuffix .xbb,$(basename $(filter-out %.eps,$(ingraphics))))'; \
232     ) >>$@)
233 # \includeまたは\input命令で読み込まれるTeXファイルの依存関係
234         $(if $(intex),@( \
235         $(ECHO); \
236         $(ECHO) '# Files called from \include or \input - .tex'; \
237         $(ECHO) '$(strip $(DVIFILE) $(AUXFILE) $(INTERFILES)): $(intex)'; \
238     ) >>$@)
239 # 文献処理用ファイルの依存関係
240         $(if $(bibdb),@( \
241         $(ECHO); \
242         $(ECHO) '# Bibliography files: .aux, BIBDB -> .bbl -> .div'; \
243         $(ECHO) '$(BBLFILE): $(bibdb) $(AUXFILE)'; \
244         $(ECHO); \
245         $(ECHO) '$(BBLFILE_PREV): $(BBLFILE)'; \
246     ) >>$@)
247
248 # 変数TEXTARGETSで指定されたターゲットファイルに対応する
249 # .dファイルをインクルードし、依存関係を取得する
250 # ターゲットに %clean、%.xbb、%.d が含まれている場合は除く
251 ifeq (,$(filter %clean %.xbb %.tex %.d,$(MAKECMDGOALS)))
252   -include $(addsuffix .d,$(basename $(TEXTARGETS)))
253 endif
254
255 # auxファイル作成
256 %.aux: %.tex
257         @$(COMPILE.tex)
258
259 %.dvi: %.tex
260         @$(COMPILE.tex)
261         @$(COMPILES.tex)
262
263 %.dvi: %.aux
264         $(if $(filter-out aux,$(NOFILES)),@$(COMPILE.tex))
265         @$(COMPILES.tex)
266
267 # aux_prevファイル作成
268 %.aux_prev: %.aux
269         @$(CMPPREV)
270
271 # PDFファイル作成
272 %.pdf: %.dvi
273         $(DVIPDFMX) $(DVIPDFMXFLAG) $<
274
275 # バウンディング情報ファイル作成
276 # pdf、jpeg/jpg、pngファイルに対応
277 %.xbb: %.pdf
278         $(EXTRACTBB) $(EXTRACTBBFLAGS) $<
279
280 %.xbb: %.jpeg
281         $(EXTRACTBB) $(EXTRACTBBFLAGS) $<
282
283 %.xbb: %.jpg
284         $(EXTRACTBB) $(EXTRACTBBFLAGS) $<
285
286 %.xbb: %.png
287         $(EXTRACTBB) $(EXTRACTBBFLAGS) $<
288
289 # 目次中間ファイル作成
290 %.toc: %.tex
291         @$(COMPILE.tex)
292
293 %.toc_prev: %.toc
294         @$(CMPPREV)
295
296 # 図リスト中間ファイル作成
297 %.lof: %.tex
298         @$(COMPILE.tex)
299
300 %.lof_prev: %.lof
301         @$(CMPPREV)
302
303 # 表リスト中間ファイル作成
304 %.lot: %.tex
305         @$(COMPILE.tex)
306
307 %.lot_prev: %.lot
308         @$(CMPPREV)
309
310 # 索引中間ファイル作成
311 %.idx: %.tex
312         @$(COMPILE.tex)
313
314 %.idx_prev: %.idx
315         @$(CMPPREV)
316
317 %.ind: %.idx_prev
318         @$(COMPILE.idx)
319
320 %.ind_prev: %.ind
321         @$(CMPPREV)
322
323 # BiBTeX中間ファイル作成
324 %.bbl: %.tex
325         @$(COMPILE.bib)
326
327 %.bbl_prev: %.bbl
328         @$(CMPPREV)
329
330 # hyperref中間ファイル作成
331 %.out: %.tex
332         @$(COMPILE.tex)
333
334 %.out_prev: %.out
335         @$(CMPPREV)
336
337 # tex-cleanターゲット
338 tex-clean:
339         $(RM) $(addprefix *, \
340       $(TEX_INT) $(IND_INT) $(BIB_INT) .d \
341       .aux_prev .toc_prev .lof_prev .lot_prev \
342       .idx_prev .ind_prev .bbl_prev .out_prev \
343     )
344 ifeq (,$(filter %.dvi,$(TEXTARGETS)))
345         $(RM) *.dvi
346 endif
347
348 # xbb-cleanターゲット
349 xbb-clean:
350         $(RM) *.xbb
351
352 # tex-distcleanターゲット
353 tex-distclean: tex-clean xbb-clean
354 ifneq (,$(filter %.dvi,$(TEXTARGETS)))
355         $(RM) *.dvi
356 endif
357         $(RM) $(TEXTARGETS)