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
33 .PHONY: tex-clean tex-distclean
34
35 # シェルコマンド
36 CAT := cat
37 CMP := cmp -s
38 CP := cp
39 ECHO := echo
40 GREP := grep
41 SED := sed
42
43 # LaTeXコマンド
44 LATEX := platex
45 DVIPDFMX := dvipdfmx
46 EXTRACTBB := extractbb
47 BIBTEX := pbibtex
48 MENDEX := mendex
49
50 # TeX中間ファイルの拡張子
51 #   .aux: 相互参照用
52 #   .fls: tex -recorderで生成されるファイルリスト
53 #   .lof: 図リスト(\tableoffigures)用
54 #   .lot: 表リスト(\tableoftables)用
55 #   .out: hyperrefパッケージ用
56 #   .toc: 目次(\tableofcontents)用
57 #   .log: ログ
58 TEX_INT := .aux .fls .lof .lot .out .toc .log
59
60 # 索引中間ファイルの拡張子
61 #   .idx: auxから作成
62 #   .ind: idxから作成
63 #   .ilg: 索引ログ
64 IND_INT := .idx .ind .ilg
65
66 # BiBTeX中間ファイルの拡張子
67 #   .bbl: auxから作成
68 #   .blg: BiBTeXログ
69 BIB_INT := .bbl .blg
70
71 # ファイル名から拡張子を除いた部分
72 FILEBASE = $(basename $<)
73 # .texファイル
74 TEXFILE = $(addsuffix .tex,$(FILEBASE))
75 # .auxファイル
76 AUXFILE = $(addsuffix .aux,$(FILEBASE))
77 # .prev_auxファイル。.auxファイルのコピー
78 PREV_AUXFILE = $(addsuffix .prev_aux,$(FILEBASE))
79 # .dviファイル
80 DVIFILE = $(addsuffix .dvi,$(FILEBASE))
81 # .dファイル
82 DFILE = $(addsuffix .d,$(FILEBASE))
83 # .logファイル
84 LOGFILE = $(addsuffix .log,$(FILEBASE))
85 # .idxファイル
86 IDXFILE = $(addsuffix .idx,$(FILEBASE))
87 # .prev_idxファイル。.idxファイルのコピー
88 PREV_IDXFILE = $(addsuffix .prev_idx,$(FILEBASE))
89 # .indファイル
90 INDFILE = $(addsuffix .ind,$(FILEBASE))
91 # .bblファイル
92 BBLFILE = $(addsuffix .bbl,$(FILEBASE))
93
94 #LaTeXオプション
95 LATEXFLAG ?=
96 DVIPDFMXFLAG ?=
97 EXTRACTBBFLAGS ?=
98 BIBTEXFLAG ?=
99 MENDEXFLAG ?=
100
101 # LaTeX処理(コンパイル)
102 COMPILE.tex = $(LATEX) -interaction=batchmode $(LATEXFLAG) $(TEXFILE) || $(CAT) $(LOGFILE)
103
104 # 相互参照未定義の警告
105 WARN_UNDEFREF := 'There were undefined references\.'
106
107 # 読み込むべき中間ファイルがないことの警告
108 WARN_NOFILE = 'No file $(FILEBASE)\.[a-zA-Z0-9]*\.'
109
110 # ログファイルに警告がある場合、LaTeX処理を最大4回繰り返す
111 COMPILES.tex = \
112   if test -s $(INDFILE); then \
113     $(ECHO) "---------- for index ----------"; \
114     $(COMPILE.tex); \
115   fi; \
116   for f in 1st 2nd 3rd final; do \
117     if test -s $@ -a -s $(LOGFILE); then \
118       $(GREP) -e $(WARN_UNDEFREF) -e $(WARN_NOFILE) $(LOGFILE) || exit 0; \
119     fi; \
120     $(ECHO) "---------- $$f try ----------"; \
121     $(COMPILE.tex); \
122   done
123
124 # \includegraphics命令で読み込まれるグラフィックファイル
125 ingraphics = $(strip $(shell \
126   $(SED) -n -e '/^%/!s/\\includegraphics\(\[[^]]*\]\)\{0,1\}\({[^}]*}\)/&\n/gp' $< $(intex) | \
127   $(SED) -e 's/.*{\([^}]*\)}.*/\1/'))
128
129 # \include、\input命令で読み込まれるtexファイル
130 intex = $(addsuffix .tex,$(basename $(strip $(shell \
131   $(SED) -n -e '/^%/!s/\\\(include\|input\)\(\[[^]]*\]\)\{0,1\}{[^}]*}/&\n/gp' $< | \
132   $(SED) -e 's/.*{\([^}]*\)}.*/\1/'))))
133
134 # \makeindex命令
135 makeindex = $(SED) -n -e '/^%/!s/\\makeindex/&/p' $<
136
137 # \bibliography命令で読み込まれる文献データベースファイル
138 bibdb = $(addsuffix .bib,$(basename $(strip $(shell \
139   $(SED) -n -e '/^%/!s/\\bibliography\(\[[^]]*\]\)\{0,1\}{\([^}]*\)}/&\n/gp' $< $(intex) | \
140   $(SED) -e 's/.*{\([^}]*\)}.*/\1/' | \
141   $(SED) -e 's/,/ /g'))))
142
143 # 依存関係を.dファイルに書き出す
144 %.d: %.tex
145         @$(ECHO) '$@ is created by scanning $^.'
146   # texファイルの依存関係
147         @($(ECHO) '$(AUXFILE) $(DFILE): $<'; \
148       $(ECHO); \
149       $(ECHO) '$(DVIFILE): $(AUXFILE)') >$@
150   # 画像ファイルの依存関係
151         $(if $(ingraphics),@( \
152       $(ECHO); \
153       $(ECHO) '# IncludeGraphic Files - .pdf, .jpeg/.jpg, .png with .xbb'; \
154       $(ECHO) '$(DVIFILE) $(AUXFILE): $(ingraphics)'; \
155       $(ECHO); \
156       $(ECHO) '$(DVIFILE) $(AUXFILE): $(addsuffix .xbb,$(basename $(ingraphics)))') >>$@)
157   # Include/Inputファイルの依存関係
158         $(if $(intex),@( \
159       $(ECHO); \
160       $(ECHO) '# Include / Input Files - .tex'; \
161       $(ECHO) '$(DVIFILE) $(AUXFILE): $(intex)') >>$@)
162   # 索引作成用ファイルの依存関係
163         $(if $(makeindex),@( \
164       $(ECHO); \
165       $(ECHO) '# Index Files: .aux -> idx -> .ind -> .dvi'; \
166       $(ECHO) '$(IDXFILE): $<'; \
167       $(ECHO); \
168       $(ECHO) '$(PREV_IDXFILE): $(IDXFILE)'; \
169       $(ECHO); \
170       $(ECHO) '$(INDFILE): $(PREV_IDXFILE)'; \
171       $(ECHO); \
172       $(ECHO) '$(DVIFILE): $(INDFILE)') >>$@)
173   # 文献処理用ファイルの依存関係
174         $(if $(bibdb),@( \
175       $(ECHO); \
176       $(ECHO) '# Bibliography Files - .bbl, .bib'; \
177       $(ECHO) '$(PREV_AUXFILE): $(AUXFILE)'; \
178       $(ECHO); \
179       $(ECHO) '$(DVIFILE): $(BBLFILE)'; \
180       $(ECHO); \
181       $(ECHO) '$(BBLFILE): $(bibdb)') >>$@)
182
183 # 変数TARGETSで指定されたターゲットファイルに対応する
184 # .dファイルをインクルードし、依存関係を取得する
185 # ターゲットに %clean、%.xbb、%.d が含まれている場合は除く
186 ifeq (,$(filter %clean %.xbb %.d,$(MAKECMDGOALS)))
187   -include $(addsuffix .d,$(basename $(TARGETS)))
188 endif
189
190 # dviファイル作成
191 %.dvi: %.tex
192         $(COMPILES.tex)
193
194 # auxファイル作成
195 %.aux: %.tex
196         $(COMPILE.tex)
197
198 %.prev_aux: %.aux
199         -$(CMP) $@ $< || $(CP) $< $@
200
201 # PDFファイル作成
202 %.pdf: %.dvi
203         $(DVIPDFMX) $(DVIPDFMXFLAG) $<
204
205 # バウンディング情報ファイル作成
206 # pdf、jpeg/jpg、pngファイルに対応
207 %.xbb: %.pdf
208         $(EXTRACTBB) $(EXTRACTBBFLAGS) $<
209
210 %.xbb: %.jpeg
211         $(EXTRACTBB) $(EXTRACTBBFLAGS) $<
212
213 %.xbb: %.jpg
214         $(EXTRACTBB) $(EXTRACTBBFLAGS) $<
215
216 %.xbb: %.png
217         $(EXTRACTBB) $(EXTRACTBBFLAGS) $<
218
219 # 索引ファイル作成
220 %.idx: %.tex
221         $(COMPILE.tex)
222
223 %.prev_idx: %.idx
224         -$(CMP) $@ $< || $(CP) $< $@
225
226 %.ind: %.prev_idx
227         $(MENDEX) $(MENDEXFLAG) $(IDXFILE)
228
229 # 文献処理用ファイル作成
230 %.bbl: %.prev_aux
231         $(BIBTEX) $(BIBTEXFLAG) $(AUXFILE)
232
233 # tex-cleanターゲット
234 tex-clean:
235         $(RM) $(addprefix *,$(TEX_INT) $(IND_INT) $(BIB_INT) .d .prev_aux .prev_idx)
236 ifeq (,$(filter %.dvi,$(TARGETS)))
237         $(RM) *.dvi
238 endif
239
240 # xbb-cleanターゲット
241 xbb-clean:
242         $(RM) *.xbb
243
244 # tex-distcleanターゲット
245 tex-distclean: tex-clean xbb-clean
246 ifneq (,$(filter %.dvi,$(TARGETS)))
247         $(RM) *.dvi
248 endif
249         $(RM) $(TARGETS)