X-Git-Url: http://j8takagi.net/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=latex_mk%2Flatex.mk;h=05b867341dac4ce71e1c02063176f9b9d8d55c21;hb=e1ed1c7c696648c7e567b0a1aaa5e9e63fcdef7d;hp=ead3a7af87e3d039e34ce56896a0d97da57ff50c;hpb=addbf3540829f63cb3f30537fdb197f160e7b2de;p=makefiles.git diff --git a/latex_mk/latex.mk b/latex_mk/latex.mk index ead3a7a..05b8673 100644 --- a/latex_mk/latex.mk +++ b/latex_mk/latex.mk @@ -1,101 +1,208 @@ -.PHONY: clean-tex distclean-tex +# latex.mk +# LaTeX処理(コンパイル)を行う +# +# == 使い方 == +# 1. texソースファイルと同じディレクトリーに本ファイル(latex.mk)をコピーする +# 2. Makefileに変数TARGETS と「include latex.mk」を記述する +# 3. texソースファイルと同じディレクトリーで、make コマンドを実行する +# +# == 機能 == +# - 読み込むべき中間ファイルがないことや相互参照未定義の警告がある場合、LaTeX処理を最大4回繰り返す +# - \includegraphics命令がTeXファイルに含まれる場合、グラフィックファイルを挿入 +# -- 挿入されたグラフィックファイルが更新されたときは、処理を開始 +# -- 挿入されたグラフィックファイルがないときは、処理を中止 +# -- 挿入されたグラフィックファイルに対するバウンディング情報ファイル(.xbb)を作成 +# - \include、\input命令がTeXファイルに含まれる場合、TeXファイルを挿入 +# -- 挿入されたTeXファイルが更新されたときは、処理を開始 +# -- 挿入されたTeXファイルがないときは、処理を中止 +# - \makeindex命令が含まれる場合、mendexで索引を作成 +# - \bibliography命令が含まれる場合、BiBTeXで文献一覧を作成 + +# == 擬似ターゲット == +# - tex-clean: TeX中間ファイル(auxなど)を削除。ターゲットに.dviが含まれていないときは.dviファイルを削除 +# - xbb-clean: バウンディング情報ファイル(.xbb)を削除 +# - tex-distclean: TeX中間ファイル、バウンディング情報ファイル、ターゲットファイル(PDF、.dvi)を削除 +# +# === Makefile -- sample === +# TARGETS := report.tex +# +# all: $(TARGETS) +# +# include latex.mk + +.PHONY: tex-clean tex-distclean # シェルコマンド +CAT := cat +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 +# TeX中間ファイルの拡張子 +# .aux: 相互参照用 +# .fls: tex -recorderで生成されるファイルリスト +# .lof: 図リスト(\tableoffigures)用 +# .lot: 表リスト(\tableoftables)用 +# .out: hyperrefパッケージ用 +# .toc: 目次(\tableofcontents)用 +# .log: ログ +TEX_INT := .aux .fls .lof .lot .out .toc .log + +# 索引中間ファイルの拡張子 +# .idx: auxから作成 +# .ind: idxから作成 +# .ilg: 索引ログ +IND_INT := .idx .ind .ilg + +# BiBTeX中間ファイルの拡張子 +# .bbl: auxから作成 +# .blg: BiBTeXログ +BIB_INT := .bbl .blg + +# ファイル名から拡張子を除いた部分 +FILEBASE = $(basename $<) +# .texファイル +TEXFILE = $(addsuffix .tex,$(FILEBASE)) +# .auxファイル +AUXFILE = $(addsuffix .aux,$(FILEBASE)) +# .prev_auxファイル。.auxファイルのコピー +PREV_AUXFILE = $(addsuffix .prev_aux,$(FILEBASE)) +# .dviファイル +DVIFILE = $(addsuffix .dvi,$(FILEBASE)) +# .dファイル +DFILE = $(addsuffix .d,$(FILEBASE)) +# .logファイル +LOGFILE = $(addsuffix .log,$(FILEBASE)) +# .idxファイル +IDXFILE = $(addsuffix .idx,$(FILEBASE)) +# .prev_idxファイル。.idxファイルのコピー +PREV_IDXFILE = $(addsuffix .prev_idx,$(FILEBASE)) +# .indファイル +INDFILE = $(addsuffix .ind,$(FILEBASE)) +# .bblファイル +BBLFILE = $(addsuffix .bbl,$(FILEBASE)) + #LaTeXオプション -BIBTEXFLAG ?= +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=batchmode $(LATEXFLAG) $(TEXFILE) || $(CAT) $(LOGFILE) + +# 相互参照未定義の警告 +WARN_UNDEFREF := 'There were undefined references\.' + +# 読み込むべき中間ファイルがないことの警告 +WARN_NOFILE = 'No file $(FILEBASE)\.[a-zA-Z0-9]*\.' + +# ログファイルに警告がある場合、LaTeX処理を最大4回繰り返す +COMPILES.tex = \ + if test -s $(INDFILE); then \ + $(ECHO) "---------- for index ----------"; \ + $(COMPILE.tex); \ + fi; \ + for f in 1st 2nd 3rd final; do \ + if test -s $@ -a -s $(LOGFILE); then \ + $(GREP) -e $(WARN_UNDEFREF) -e $(WARN_NOFILE) $(LOGFILE) || exit 0; \ + fi; \ + $(ECHO) "---------- $$f try ----------"; \ + $(COMPILE.tex); \ + done + +# \includegraphics命令で読み込まれるグラフィックファイル +ingraphics = $(strip $(shell \ + $(SED) -n -e '/^%/!s/\\includegraphics\(\[[^]]*\]\)\{0,1\}\({[^}]*}\)/&\n/gp' $< $(intex) | \ + $(SED) -e 's/.*{\([^}]*\)}.*/\1/')) -# \includeコマンドで読み込まれるtexファイル +# \include、\input命令で読み込まれるtexファイル intex = $(addsuffix .tex,$(basename $(strip $(shell \ - $(SED) -n -e 's/\\\(include\|input\)\(\[[^]]*\]\)\{0,1\}{[^}]*}/&\n/gp' $< | \ + $(SED) -n -e '/^%/!s/\\\(include\|input\)\(\[[^]]*\]\)\{0,1\}{[^}]*}/&\n/gp' $< | \ $(SED) -e 's/.*{\([^}]*\)}.*/\1/')))) -# \includegraphicsコマンドで読み込まれるグラフィックファイル -ingraphics = $(strip $(shell \ - $(SED) -n -e 's/\\includegraphics\(\[[^]]*\]\)\{0,1\}\({[^}]*}\)/&\n/gp' $< $(intex) | \ - $(SED) -e 's/.*{\([^}]*\)}.*/\1/')) +# \makeindex命令 +makeindex = $(SED) -n -e '/^%/!s/\\makeindex/&/p' $< -# \bibliographyコマンドで読み込まれる文献データベースファイル +# \bibliography命令で読み込まれる文献データベースファイル bibdb = $(addsuffix .bib,$(basename $(strip $(shell \ - $(SED) -n -e 's/\\bibliography\(\[[^]]*\]\)\{0,1\}{\([^}]*\)}/&\n/gp' $< $(intex) | \ + $(SED) -n -e '/^%/!s/\\bibliography\(\[[^]]*\]\)\{0,1\}{\([^}]*\)}/&\n/gp' $< $(intex) | \ $(SED) -e 's/.*{\([^}]*\)}.*/\1/' | \ $(SED) -e 's/,/ /g')))) -# texファイルに索引作成の指定があるか確認 -MAKEINDEX := '\makeindex' -GREP-makeindex = $(GREP) -F $(MAKEINDEX) $< - -# 依存関係を自動生成し、dファイルに格納 +# 依存関係を.dファイルに書き出す %.d: %.tex @$(ECHO) '$@ is created by scanning $^.' # texファイルの依存関係 - @($(ECHO) '$(subst .tex,.dvi,$<) $(subst .tex,.aux,$<) $(subst .tex,.d,$<): $<' >$@) - # texファイルの依存関係 - $(if $(intex),@( \ + @($(ECHO) '$(AUXFILE) $(DFILE): $<'; \ $(ECHO); \ - $(ECHO) '# Include/Input Files - tex'; \ - $(ECHO) '$(subst .tex,.dvi,$<) $(subst .tex,.aux,$<): $(intex)') >>$@) + $(ECHO) '$(DVIFILE): $(AUXFILE)') >$@ # 画像ファイルの依存関係 $(if $(ingraphics),@( \ $(ECHO); \ - $(ECHO) '# IncludeGraphic Files - pdf, jpeg/jpg, png & xbb'; \ - $(ECHO) '$(subst .tex,.dvi,$<) $(subst .tex,.aux,$<): $(ingraphics)'; \ + $(ECHO) '# IncludeGraphic Files - .pdf, .jpeg/.jpg, .png with .xbb'; \ + $(ECHO) '$(DVIFILE) $(AUXFILE): $(ingraphics)'; \ + $(ECHO); \ + $(ECHO) '$(DVIFILE) $(AUXFILE): $(addsuffix .xbb,$(basename $(ingraphics)))') >>$@) + # Include/Inputファイルの依存関係 + $(if $(intex),@( \ + $(ECHO); \ + $(ECHO) '# Include / Input Files - .tex'; \ + $(ECHO) '$(DVIFILE) $(AUXFILE): $(intex)') >>$@) + # 索引作成用ファイルの依存関係 + $(if $(makeindex),@( \ $(ECHO); \ - $(ECHO) '$(subst .tex,.dvi,$<) $(subst .tex,.aux,$<): $(addsuffix .xbb,$(basename $(ingraphics)))') >>$@) + $(ECHO) '# Index Files: .aux -> idx -> .ind -> .dvi'; \ + $(ECHO) '$(IDXFILE): $<'; \ + $(ECHO); \ + $(ECHO) '$(PREV_IDXFILE): $(IDXFILE)'; \ + $(ECHO); \ + $(ECHO) '$(INDFILE): $(PREV_IDXFILE)'; \ + $(ECHO); \ + $(ECHO) '$(DVIFILE): $(INDFILE)') >>$@) # 文献処理用ファイルの依存関係 $(if $(bibdb),@( \ $(ECHO); \ - $(ECHO) '# Bibliography Files - bbl & bib'; \ - $(ECHO) '$(subst .tex,.dvi,$<): $(subst .tex,.bbl,$<)'; \ + $(ECHO) '# Bibliography Files - .bbl, .bib'; \ + $(ECHO) '$(PREV_AUXFILE): $(AUXFILE)'; \ $(ECHO); \ - $(ECHO) '$(subst .tex,.bbl,$<): $(bibdb)') >>$@) - # 索引作成用ファイルの依存関係 - $(if $(strip $(shell $(GREP-makeindex))),@( \ + $(ECHO) '$(DVIFILE): $(BBLFILE)'; \ $(ECHO); \ - $(ECHO) '# MakeIndex Files - ind'; \ - $(ECHO) '$(subst .tex,.dvi,$<): $(subst .tex,.ind,$<)') >>$@) + $(ECHO) '$(BBLFILE): $(bibdb)') >>$@) -# 変数TARGETSで指定されたターゲットファイルに対応するdファイルをインクルード -ifdef TARGETS +# 変数TARGETSで指定されたターゲットファイルに対応する +# .dファイルをインクルードし、依存関係を取得する +# ターゲットに %clean、%.xbb、%.d が含まれている場合は除く +ifeq (,$(filter %clean %.xbb %.d,$(MAKECMDGOALS))) -include $(addsuffix .d,$(basename $(TARGETS))) endif -# 相互参照ファイル作成。dviファイルも同時に作成される +# dviファイル作成 +%.dvi: %.tex + $(COMPILES.tex) + +# auxファイル作成 %.aux: %.tex $(COMPILE.tex) -# dviファイル作成 -%.dvi: %.aux - # logファイルに未定義参照の警告がある場合、LaTeXで処理 - while $(GREP) -F $(REFWARN) $(addsuffix .log,$(basename $<)); do $(COMPILE.tex); done +%.prev_aux: %.aux + -$(CMP) $@ $< || $(CP) $< $@ -# 文献処理用ファイル作成 -# BiBTeXで文献処理するときに使用される -%.bbl: %.aux - $(BIBTEX) $(BIBTEXFLAG) $(addsuffix .aux,$(basename $<)) +# PDFファイル作成 +%.pdf: %.dvi + $(DVIPDFMX) $(DVIPDFMXFLAG) $< # バウンディング情報ファイル作成 -# dvipdfmxで図を挿入するときに使用される # pdf、jpeg/jpg、pngファイルに対応 %.xbb: %.pdf $(EXTRACTBB) $(EXTRACTBBFLAGS) $< @@ -110,20 +217,33 @@ endif $(EXTRACTBB) $(EXTRACTBBFLAGS) $< # 索引ファイル作成 -# 索引を作成するときに使用される -%.idx: %.aux +%.idx: %.tex + $(COMPILE.tex) -%.ind: %.idx - $(MENDEX) $(MENDEXFLAG) $< +%.prev_idx: %.idx + -$(CMP) $@ $< || $(CP) $< $@ -# PDFファイル作成 -%.pdf: %.dvi - $(DVIPDFMX) $(DVIPDFMXFLAG) $< +%.ind: %.prev_idx + $(MENDEX) $(MENDEXFLAG) $(IDXFILE) + +# 文献処理用ファイル作成 +%.bbl: %.prev_aux + $(BIBTEX) $(BIBTEXFLAG) $(AUXFILE) # tex-cleanターゲット tex-clean: - $(RM) *.aux *.bbl *.blg *.d *.idx *.ilg *.ind *.lof *.log *.lot *.out *.toc *.xbb + $(RM) $(addprefix *,$(TEX_INT) $(IND_INT) $(BIB_INT) .d .prev_aux .prev_idx) +ifeq (,$(filter %.dvi,$(TARGETS))) + $(RM) *.dvi +endif + +# xbb-cleanターゲット +xbb-clean: + $(RM) *.xbb # tex-distcleanターゲット -tex-distclean: tex-clean - $(RM) $(addsuffix .dvi,$(basename $(TARGETS))) $(addsuffix .pdf,$(basename $(TARGETS))) +tex-distclean: tex-clean xbb-clean +ifneq (,$(filter %.dvi,$(TARGETS))) + $(RM) *.dvi +endif + $(RM) $(TARGETS)