X-Git-Url: http://j8takagi.net/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=latex_mk%2Flatex.mk;h=420df965e76e1fcc2cf7121f2352c539012fd84c;hb=62a4bd43f485a1d768a9cdfec57a95b9cc1b172f;hp=f0e7cd39e4f6798b5483521e8b5de3170a85ffb2;hpb=b0839dec229293ecfd81b91dfecf47c16ff7b00b;p=makefiles.git diff --git a/latex_mk/latex.mk b/latex_mk/latex.mk index f0e7cd3..420df96 100644 --- a/latex_mk/latex.mk +++ b/latex_mk/latex.mk @@ -78,37 +78,9 @@ GRAPHICSEXT := .pdf .eps .jpg .jpeg .png .bmp # make完了後、中間ファイルを残す .SECONDARY: $(foreach t,$(TEXTARGETS),$(addprefix $(basename $t),$(ALLINTEXT))) -###################################################################### -# TeX処理の定義 -###################################################################### - # ファイル名から拡張子を除いた部分 BASE = $(basename $<) -# LaTeX処理(コンパイル) -LATEXCMD = $(LATEX) -interaction=batchmode $(LATEXFLAG) $(BASE).tex - -COMPILE.tex = \ - $(ECHO) $(LATEXCMD); $(LATEXCMD) >/dev/null 2>&1 || \ - ($(SED) -n -e '/^!/,/^$$/p' $(BASE).log | $(SED) -e 's/.* line \([0-9]*\) .*/$(BASE).tex:\1: &/g'; exit 1) - -# 相互参照未定義の警告 -WARN_UNDEFREF := There were undefined references. - -# LaTeX処理 -# ログファイルに警告がある場合は警告がなくなるまで、最大CNTで指定された回数分、処理を実行する -CNT := 3 - -COMPILES.tex = \ - for i in `$(SEQ) 1 $(CNT)`; do $(GREP) -F "$(WARN_UNDEFREF)" $(BASE).log && $(COMPILE.tex) || (test $$? -eq 1 && exit 0 || exit $$?); done - -# DVI -> PDF -# 出力結果は.logファイルへ出力 -DVIPDFCMD = $(DVIPDFMX) $(DVIPDFMXFLAG) $(BASE).dvi -COMPILE.dvi = \ - $(ECHO) $(DVIPDFCMD); $(DVIPDFCMD) >>$(BASE).log 2>&1 || \ - ($(SED) -n -e '/^Output written on toc_hyperref.dvi/,$$p' $(BASE).log; exit 1) - ###################################################################### # .dファイルの生成と読み込み # .dファイルには、LaTeX処理での依存関係が記述される @@ -147,6 +119,7 @@ LATEXINTFILES_PREV = $(addsuffix _prev,$(LATEXINTFILES)) TEXFILES = $(filter %.tex,$(INPUTFILES)) # \includegraphicsで読み込まれる画像ファイルを$(BASE).texと$(TEXFILES)、および.flsファイルから取得する +# 取得は、1回のmake実行につき1回だけ行われる GRAPHICFILES = $(GRAPHICFILESre) GRAPHICFILESre = $(eval GRAPHICFILES := \ @@ -155,7 +128,7 @@ GRAPHICFILESre = $(eval GRAPHICFILES := \ $(SED) -e '/^\s*%/d' -e 's/\([^\]\)\s*%.*/\1/g' $(BASE).tex $(TEXFILES) | \ $(SED) -e '/\\begin{verbatim}/,/\\end{verbatim}/d' -e 's/\\verb|[^|]*|//g' | \ $(SED) -e 's/}/}%/g' | $(SED) -e 'y/}%/}\n/' | \ - $(SED) -n -e 's/.*\\includegraphics\(\[[^]]*\]\)\{0,1\}{\([^}]*\)}$$/\2/pg' \ + $(SED) -n -e 's/.*\\includegraphics\(\[[^]]*\]\)\{0,1\}{\([^}]*\)}$$/\2/p' \ ) \ $(filter $(addprefix %,$(GRAPHICSEXT)),$(INPUTFILES)) \ )) @@ -164,6 +137,7 @@ GRAPHICFILESre = $(eval GRAPHICFILES := \ OTHERFILES = $(sort $(filter-out %.aux $(LATEXINTFILES) $(TEXFILES) $(GRAPHICFILES),$(INPUTFILES))) # \bibliography命令で読み込まれる文献データベースファイルをTeXファイルから検索する +# 取得は、1回のmake実行につき1回だけ行われる BIBDB = $(BIBDBre) BIBDBre = $(eval BIBDB := \ @@ -171,37 +145,23 @@ BIBDBre = $(eval BIBDB := \ $(SED) -e '/^\s*%/d' -e 's/\([^\]\)\s*%.*/\1/g' $(BASE).tex $(TEXFILES) | \ $(SED) -e '/\\begin{verbatim}/,/\\end{verbatim}/d' -e 's/\\verb|[^|]*|//g' | \ $(SED) -e 's/}/}%/g' | $(SED) -e 'y/}%/}\n/' | \ - $(SED) -n -e 's/.*\\bibliography\(\[[^]]*\]\)\{0,1\}{\([^}]*\)}$$/\2/pg' | \ + $(SED) -n -e 's/.*\\bibliography{\([^}]*\)}$$/\1/p' | \ $(SED) -e 's/,/ /g' \ ))))) -# .flsファイル作成用の一時ディレクトリー -FLSDIR := .fls.temp - -# $(BASE).flsファイルの作成 -FLSCMD = $(LATEX) -interaction=nonstopmode -recorder -output-directory=$(FLSDIR) $(BASE).tex - -GENERETE.fls = \ - test ! -e $(FLSDIR) && $(MKDIR) $(FLSDIR); \ - $(FLSCMD) 1>/dev/null 2>&1; \ - $(SED) -e 's|$(FLSDIR)/||g' $(FLSDIR)/$(BASE).fls >$(BASE).fls; \ - test -e $(BASE).fls && \ - ($(ECHO) '$(BASE).fls is generated.'; $(RM) -r $(FLSDIR)) || \ - ($(ECHO) '$(BASE).fls is not generated.' 1>&2; exit 1) - # 依存関係を.dファイルに書き出す %.d: %.fls # Makefile変数の展開 - @$(foreach i,0 1,$(ECHO) "Makefiles variable -- LATEXINTFILES=$(LATEXINTFILES) TEXFILES=$(TEXFILES) GRAPHICFILES=$(GRAPHICFILES) BIBDB=$(BIBDB)" $(if $(filter 0,$i),>/dev/null);) + @$(foreach i,0 1,$(ECHO) "Makefiles variable -- TEXFILES=$(TEXFILES) LATEXINTFILES=$(LATEXINTFILES) GRAPHICFILES=$(GRAPHICFILES) BIBDB=$(BIBDB)" $(if $(filter 0,$i),>/dev/null);) # .dファイルの依存関係 - @$(ECHO) '$(BASE).d: $(BASE).tex $(BASE).fls' >$@ + @$(ECHO) '$(BASE).d: $(BASE).tex $(BASE).fls $(TEXFILES)' >$@ # 中間ファイルの依存関係 $(if $(sort $(LATEXINTFILES) $(BIBDB)),@( \ $(ECHO); \ $(ECHO) '# LaTeX Intermediate Files'; \ $(ECHO) '#'; \ $(ECHO) '# $$(COMPILE.tex) := $(LATEXCMD)'; \ - $(ECHO) '# $$(COMPILES.tex) := $(subst $(COMPILE.tex),$(LATEXCMD),$(COMPILES.tex))'; \ + $(ECHO) '# $$(COMPILES.tex) := $(subst $(EXITWARN),exit 1,$(subst $(EXITNOWARN),exit 0,$(subst $(COMPILE.tex),$(LATEXCMD),$(COMPILES.tex))))'; \ $(ECHO) '#'; \ $(ECHO) '$(BASE).dvi:: $(sort $(LATEXINTFILES_PREV) $(if $(BIBDB),$(BASE).bbl_prev))'; \ $(ECHO) ' @$$(COMPILE.tex)'; \ @@ -252,6 +212,58 @@ endif # TeX -> dvi -> PDF ###################################################################### +# LaTeX処理(コンパイル) +LATEXCMD = $(LATEX) -interaction=batchmode $(LATEXFLAG) $(BASE).tex + +# エラー発生時、ログのエラー部分を行頭に「:<行番号>:」を付けて表示する +COMPILE.tex = \ + $(ECHO) $(LATEXCMD); $(LATEXCMD) >/dev/null 2>&1 || \ + ( \ + $(SED) -n -e '/^!/,/^$$/p' $(BASE).log | \ + $(SED) -e 's/.*\s*l\.\([0-9]*\)\s*.*/$(BASE).tex:\1: &/' 1>&2; \ + exit 1) + +# 相互参照未定義の警告 +WARN_UNDEFREF := There were undefined references. + +# LaTeX処理 +# ログファイルに警告がある場合は警告がなくなるまで、最大CNTで指定された回数分、処理を実行する +CNT := 3 +CNTMSG := $(LATEX) is run $(CNT) times, but there are still undefined references. + +EXITNOWARN = \ + if test $$? -eq 1; then \ + exit 0; \ + else \ + exit $$?; \ + fi + +EXITWARN = \ + $(ECHO) "$(CNTMSG)" 1>&2; \ + $(SED) -n -e "/^LaTeX Warning:/,/^$$/p" $(BASE).log | \ + $(SED) -e "s/.*\s*line \([0-9]*\)\s*.*/$(BASE).tex:\1: &/" 1>&2; \ + exit 1 + +COMPILES.tex = \ + for i in `$(SEQ) 0 $(CNT)`; do \ + if test $$i -lt $(CNT); then \ + if $(GREP) -F "$(WARN_UNDEFREF)" $(BASE).log; then \ + $(COMPILE.tex); \ + else \ + $(EXITNOWARN); \ + fi; \ + else \ + $(EXITWARN); \ + fi; \ + done; + +# DVI -> PDF +# 出力時のログは.logファイルへ追加出力 +DVIPDFCMD = $(DVIPDFMX) $(DVIPDFMXFLAG) $(BASE).dvi +COMPILE.dvi = \ + $(ECHO) $(DVIPDFCMD); $(DVIPDFCMD) >>$(BASE).log 2>&1 || \ + ($(SED) -n -e '/^Output written on toc_hyperref.dvi/,$$p' $(BASE).log; exit 1) + # TeX -> aux %.aux: %.tex @$(COMPILE.tex) @@ -273,6 +285,26 @@ endif # ファイルリストファイル(.fls)作成 ###################################################################### +# .flsファイル作成用の一時ディレクトリー +FLSDIR := .fls.temp + +# $(BASE).flsファイルの作成 +FLSCMD = $(LATEX) -interaction=nonstopmode -recorder -output-directory=$(FLSDIR) $(BASE).tex + +GENERETE.fls = \ + if test ! -e $(FLSDIR); then \ + $(MKDIR) $(FLSDIR); \ + fi; \ + $(FLSCMD) 1>/dev/null 2>&1; \ + $(SED) -e 's|$(FLSDIR)/||g' $(FLSDIR)/$(BASE).fls >$(BASE).fls; \ + if test -e $(BASE).fls; then \ + $(ECHO) '$(BASE).fls is generated.'; \ + $(RM) -r $(FLSDIR); \ + else \ + $(ECHO) '$(BASE).fls is not generated.' 1>&2; \ + exit 1; \ + fi + %.fls: %.tex @-$(GENERETE.fls) @@ -319,7 +351,7 @@ CMPPREV = $(CMP) $< $@ && $(ECHO) '$@ is up to date.' || $(CP) -p -v $< $@ # 索引用中間ファイル作成コマンド MENDEXCMD = $(MENDEX) $(MENDEXFLAG) $(BASE).idx -COMPILE.idx = $(ECHO) $(MENDEXCMD); $(MENDEXCMD) >/dev/null 2>&1 || ($(CAT) $(BASE).ilg; exit 1) +COMPILE.idx = $(ECHO) $(MENDEXCMD); $(MENDEXCMD) >/dev/null 2>&1 || ($(CAT) $(BASE).ilg 1>&2; exit 1) # .tex -> .idx %.idx: %.tex @@ -341,7 +373,7 @@ COMPILE.idx = $(ECHO) $(MENDEXCMD); $(MENDEXCMD) >/dev/null 2>&1 || ($(CAT) $(BA # 文献リスト用中間ファイル作成コマンド BIBTEXCMD = $(BIBTEX) $(BIBTEXFLAG) $(BASE).aux -COMPILE.bib = $(ECHO) $(BIBTEXCMD); $(BIBTEXCMD) >/dev/null 2>&1 || ($(CAT) $(BASE).blg; exit 1) +COMPILE.bib = $(ECHO) $(BIBTEXCMD); $(BIBTEXCMD) >/dev/null 2>&1 || ($(CAT) $(BASE).blg 1>&2; exit 1) # TeX -> .aux -> .bib %.bbl: %.tex @@ -375,7 +407,7 @@ COMPILE.bib = $(ECHO) $(BIBTEXCMD); $(BIBTEXCMD) >/dev/null 2>&1 || ($(CAT) $(BA # 警告 tex-warn: - @$(ECHO) "check current directory, or set TEXTARGET in Makefile." + @($(ECHO) "check current directory, or set TEXTARGET in Makefile." 1>&2) # すべての画像ファイルに対してextractbbを実行 tex-xbb: