LaTeXのMakefileで、auxファイルやidxファイルの変更がない場合には不要な作業は行わないように修正
authorj8takagi <j8takagi@nifty.com>
Thu, 11 Jul 2013 07:46:30 +0000 (16:46 +0900)
committerj8takagi <j8takagi@nifty.com>
Thu, 11 Jul 2013 07:46:30 +0000 (16:46 +0900)
*_prev.auxに*.aux、*_prev.idxに*.idxの以前の内容をそれぞれコピーし、
*_prev.auxや*_prev.idxが更新された場合に必要な作業を行う。
『UNIXプログラミング環境』第8章で紹介された方法

latex_mk/latex.mk

index a0d4028..a63e131 100644 (file)
@@ -1,29 +1,58 @@
 .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 \
@@ -49,7 +78,9 @@ GREP-makeindex = $(GREP) -F $(MAKEINDEX) $<
 %.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); \
@@ -64,16 +95,20 @@ GREP-makeindex = $(GREP) -F $(MAKEINDEX) $<
       $(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ファイルからヘッダファイルの依存関係を取得する
@@ -86,15 +121,17 @@ endif
 %.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で図を挿入するときに使用される
@@ -114,9 +151,13 @@ endif
 # 索引ファイル作成
 # 索引を作成するときに使用される
 %.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
@@ -124,7 +165,7 @@ endif
 
 # 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