.PHONY: clean-tex distclean-tex
# シェルコマンド
+CMP := cmp -s
+CP := cp
ECHO := echo
GREP := grep
SED := sed
# LaTeXコマンド
-BIBTEX := pbibtex
+LATEX := platex
DVIPDFMX := dvipdfmx
EXTRACTBB := extractbb
-LATEX := platex
+BIBTEX := pbibtex
MENDEX := mendex
#LaTeXオプション
-BIBTEXFLAG ?=
+interaction ?= batchmode
+LATEXFLAG ?=
DVIPDFMXFLAG ?=
EXTRACTBBFLAGS ?=
-LATEXFLAG ?=
+BIBTEXFLAG ?=
MENDEXFLAG ?=
-# LaTeXで処理
-COMPILE.tex = $(LATEX) -interaction=batchmode $(LATEXFLAG) $(addsuffix .tex,$(basename $<))
-
-# logファイルに未定義参照の警告があるか確認
-REFWARN := 'LaTeX Warning: There were undefined references.'
+# LaTeX処理(コンパイル)
+COMPILE.tex = $(LATEX) -interaction=$(interaction) $(LATEXFLAG) $(addsuffix .tex,$(basename $<))
+
+# 相互参照の警告
+WARN_REF := 'Label(s) may have changed. Rerun to get cross-references right.'
+
+# 相互参照未定義の警告。2回目以降の処理で出る場合は、参照エラー
+WARN_UNDEFREF := 'There were undefined references.'
+
+# auxやtocなどのファイルがない警告
+WARN_NOFILE := 'No file'
+
+# LaTeX処理の最大回数
+MAX_CNT := 10
+
+# logファイルに相互参照または目次ファイルなしの警告がある場合、LaTeX処理を繰り返す
+# 2回目以降の処理で相互参照未定義の警告がある場合と、
+# 繰り返しの回数がMAX_CNTになった場合は、警告を表示してエラー終了
+COMPILES.tex = \
+ cnt=0; \
+ while $(GREP) -F -e $(WARN_REF) -e $(WARN_NOFILE) $(addsuffix .log,$(basename $<)); do \
+ if test $$cnt -ge $(MAX_CNT); then \
+ $(ECHO) "LaTeX compile is over $$cnt times, but warnings exist."; \
+ exit 1; \
+ fi; \
+ $(COMPILE.tex); \
+ if test $$cnt -eq 1 && $(GREP) -F $(WARN_UNDEFREF) $(addsuffix .log,$(basename $<)); then \
+ exit 1; \
+ fi; \
+ cnt=`expr $$cnt + 1`; \
+ done
# \includeコマンドで読み込まれるtexファイル
intex = $(addsuffix .tex,$(basename $(strip $(shell \
%.d: %.tex
@$(ECHO) '$@ is created by scanning $^.'
# texファイルの依存関係
- @($(ECHO) '$(subst .tex,.dvi,$<) $(subst .tex,.aux,$<) $(subst .tex,.d,$<): $<' >$@)
+ @(($(ECHO) '$(subst .tex,.dvi,$<) $(subst .tex,.aux,$<) $(subst .tex,.d,$<): $<'; \
+ $(ECHO); \
+ $(ECHO) '$(subst .tex,.prev_aux,$<):') >$@)
# Include/Inputファイルの依存関係
$(if $(intex),@( \
$(ECHO); \
$(ECHO) '$(subst .tex,.dvi,$<) $(subst .tex,.aux,$<): $(addsuffix .xbb,$(basename $(ingraphics)))') >>$@)
# 文献処理用ファイルの依存関係
$(if $(bibdb),@( \
- $(ECHO); \
- $(ECHO) '# Bibliography Files - bbl & bib'; \
- $(ECHO) '$(subst .tex,.dvi,$<): $(subst .tex,.bbl,$<)'; \
- $(ECHO); \
- $(ECHO) '$(subst .tex,.bbl,$<): $(bibdb)') >>$@)
+ $(ECHO); \
+ $(ECHO) '# Bibliography Files - bbl & bib'; \
+ $(ECHO) '$(subst .tex,.dvi,$<): $(subst .tex,.bbl,$<)'; \
+ $(ECHO); \
+ $(ECHO) '$(subst .tex,.bbl,$<): $(bibdb)') >>$@)
# 索引作成用ファイルの依存関係
$(if $(strip $(shell $(GREP-makeindex))),@( \
- $(ECHO); \
- $(ECHO) '# MakeIndex Files - ind'; \
- $(ECHO) '$(subst .tex,.dvi,$<): $(subst .tex,.ind,$<)') >>$@)
+ $(ECHO); \
+ $(ECHO) '# MakeIndex Files - ind'; \
+ $(ECHO) '$(subst .tex,.idx,$<):'; \
+ $(ECHO); \
+ $(ECHO) '$(subst .tex,.ind,$<):'; \
+ $(ECHO); \
+ $(ECHO) '$(subst .tex,.dvi,$<): $(subst .tex,.ind,$<)') >>$@)
# 変数TARGETSで指定されたターゲットファイルに対応するdファイルをインクルード
# .dファイルからヘッダファイルの依存関係を取得する
%.aux: %.tex
$(COMPILE.tex)
+%.prev_aux: %.aux
+ -$(CMP) $@ $< || $(CP) $< $@
+
# dviファイル作成
%.dvi: %.aux
- # logファイルに未定義参照の警告がある場合、LaTeXで処理
- while $(GREP) -F $(REFWARN) $(addsuffix .log,$(basename $<)); do $(COMPILE.tex); done
+ $(COMPILES.tex)
# 文献処理用ファイル作成
# BiBTeXで文献処理するときに使用される
-%.bbl: %.aux
- $(BIBTEX) $(BIBTEXFLAG) $(addsuffix .aux,$(basename $<))
+%.bbl: %.prev_aux
+ $(BIBTEX) $(BIBTEXFLAG) $(subst .prev_aux,aux,$<)
# バウンディング情報ファイル作成
# dvipdfmxで図を挿入するときに使用される
# 索引ファイル作成
# 索引を作成するときに使用される
%.idx: %.aux
+ $(COMPILE.tex)
+
+%.prev_idx: %.idx
+ -$(CMP) $@ $< || $(CP) $< $@
-%.ind: %.idx
- $(MENDEX) $(MENDEXFLAG) $<
+%.ind: %.prev_idx
+ $(MENDEX) $(MENDEXFLAG) $(subst .prev_idx,.idx,$<)
# PDFファイル作成
%.pdf: %.dvi
# tex-cleanターゲット
tex-clean:
- $(RM) *.aux *.bbl *.blg *.d *.idx *.ilg *.ind *.lof *.log *.lot *.out *.toc *.xbb
+ $(RM) *.aux *.bbl *.blg *.idx *.ilg *.ind *.lof *.lot *.out *.toc *.xbb *.log *.d
# tex-distcleanターゲット
tex-distclean: tex-clean