From: j8takagi Date: Thu, 11 Jul 2013 07:46:30 +0000 (+0900) Subject: LaTeXのMakefileで、auxファイルやidxファイルの変更がない場合には不要な作業は行わないように修正 X-Git-Url: https://j8takagi.net/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1b2a67032cdbbf2206330a898e3a92961a4500ce;p=makefiles.git LaTeXのMakefileで、auxファイルやidxファイルの変更がない場合には不要な作業は行わないように修正 *_prev.auxに*.aux、*_prev.idxに*.idxの以前の内容をそれぞれコピーし、 *_prev.auxや*_prev.idxが更新された場合に必要な作業を行う。 『UNIXプログラミング環境』第8章で紹介された方法 --- diff --git a/latex_mk/latex.mk b/latex_mk/latex.mk index a0d4028..a63e131 100644 --- a/latex_mk/latex.mk +++ b/latex_mk/latex.mk @@ -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