a0d4028c29f535c17534fbdc45b1f93f119add39
[makefiles.git] / latex_mk / latex.mk
1 .PHONY: clean-tex distclean-tex
2
3 # シェルコマンド
4 ECHO := echo
5 GREP := grep
6 SED := sed
7
8 # LaTeXコマンド
9 BIBTEX := pbibtex
10 DVIPDFMX := dvipdfmx
11 EXTRACTBB := extractbb
12 LATEX := platex
13 MENDEX := mendex
14
15 #LaTeXオプション
16 BIBTEXFLAG ?=
17 DVIPDFMXFLAG ?=
18 EXTRACTBBFLAGS ?=
19 LATEXFLAG ?=
20 MENDEXFLAG ?=
21
22 # LaTeXで処理
23 COMPILE.tex = $(LATEX) -interaction=batchmode $(LATEXFLAG) $(addsuffix .tex,$(basename $<))
24
25 # logファイルに未定義参照の警告があるか確認
26 REFWARN := 'LaTeX Warning: There were undefined references.'
27
28 # \includeコマンドで読み込まれるtexファイル
29 intex = $(addsuffix .tex,$(basename $(strip $(shell \
30   $(SED) -n -e 's/\\\(include\|input\)\(\[[^]]*\]\)\{0,1\}{[^}]*}/&\n/gp' $<  | \
31   $(SED) -e 's/.*{\([^}]*\)}.*/\1/'))))
32
33 # \includegraphicsコマンドで読み込まれるグラフィックファイル
34 ingraphics = $(strip $(shell \
35   $(SED) -n -e 's/\\includegraphics\(\[[^]]*\]\)\{0,1\}\({[^}]*}\)/&\n/gp' $< $(intex) | \
36   $(SED) -e 's/.*{\([^}]*\)}.*/\1/'))
37
38 # \bibliographyコマンドで読み込まれる文献データベースファイル
39 bibdb = $(addsuffix .bib,$(basename $(strip $(shell \
40   $(SED) -n -e 's/\\bibliography\(\[[^]]*\]\)\{0,1\}{\([^}]*\)}/&\n/gp' $< $(intex) | \
41   $(SED) -e 's/.*{\([^}]*\)}.*/\1/' | \
42   $(SED) -e 's/,/ /g'))))
43
44 # texファイルに索引作成の指定があるか確認
45 MAKEINDEX := '\makeindex'
46 GREP-makeindex = $(GREP) -F $(MAKEINDEX) $<
47
48 # 依存関係を自動生成し、dファイルに格納
49 %.d: %.tex
50         @$(ECHO) '$@ is created by scanning $^.'
51   # texファイルの依存関係
52         @($(ECHO) '$(subst .tex,.dvi,$<) $(subst .tex,.aux,$<) $(subst .tex,.d,$<): $<' >$@)
53   # Include/Inputファイルの依存関係
54         $(if $(intex),@( \
55       $(ECHO); \
56       $(ECHO) '# Include/Input Files - tex'; \
57       $(ECHO) '$(subst .tex,.dvi,$<) $(subst .tex,.aux,$<): $(intex)') >>$@)
58   # 画像ファイルの依存関係
59         $(if $(ingraphics),@( \
60       $(ECHO); \
61       $(ECHO) '# IncludeGraphic Files - pdf, jpeg/jpg, png & xbb'; \
62       $(ECHO) '$(subst .tex,.dvi,$<) $(subst .tex,.aux,$<): $(ingraphics)'; \
63       $(ECHO); \
64       $(ECHO) '$(subst .tex,.dvi,$<) $(subst .tex,.aux,$<): $(addsuffix .xbb,$(basename $(ingraphics)))') >>$@)
65   # 文献処理用ファイルの依存関係
66         $(if $(bibdb),@( \
67       $(ECHO); \
68       $(ECHO) '# Bibliography Files - bbl & bib'; \
69       $(ECHO) '$(subst .tex,.dvi,$<): $(subst .tex,.bbl,$<)'; \
70       $(ECHO); \
71       $(ECHO) '$(subst .tex,.bbl,$<): $(bibdb)') >>$@)
72   # 索引作成用ファイルの依存関係
73         $(if $(strip $(shell $(GREP-makeindex))),@( \
74       $(ECHO); \
75       $(ECHO) '# MakeIndex Files - ind'; \
76       $(ECHO) '$(subst .tex,.dvi,$<): $(subst .tex,.ind,$<)') >>$@)
77
78 # 変数TARGETSで指定されたターゲットファイルに対応するdファイルをインクルード
79 # .dファイルからヘッダファイルの依存関係を取得する
80 # ターゲットに clean が含まれている場合は除く
81 ifeq (,$(filter %clean,$(MAKECMDGOALS)))
82   -include $(addsuffix .d,$(basename $(TARGETS)))
83 endif
84
85 # 相互参照ファイル作成。dviファイルも同時に作成される
86 %.aux: %.tex
87         $(COMPILE.tex)
88
89 # dviファイル作成
90 %.dvi: %.aux
91   # logファイルに未定義参照の警告がある場合、LaTeXで処理
92         while $(GREP) -F $(REFWARN) $(addsuffix .log,$(basename $<)); do $(COMPILE.tex); done
93
94 # 文献処理用ファイル作成
95 # BiBTeXで文献処理するときに使用される
96 %.bbl: %.aux
97         $(BIBTEX) $(BIBTEXFLAG) $(addsuffix .aux,$(basename $<))
98
99 # バウンディング情報ファイル作成
100 # dvipdfmxで図を挿入するときに使用される
101 # pdf、jpeg/jpg、pngファイルに対応
102 %.xbb: %.pdf
103         $(EXTRACTBB) $(EXTRACTBBFLAGS) $<
104
105 %.xbb: %.jpeg
106         $(EXTRACTBB) $(EXTRACTBBFLAGS) $<
107
108 %.xbb: %.jpg
109         $(EXTRACTBB) $(EXTRACTBBFLAGS) $<
110
111 %.xbb: %.png
112         $(EXTRACTBB) $(EXTRACTBBFLAGS) $<
113
114 # 索引ファイル作成
115 # 索引を作成するときに使用される
116 %.idx: %.aux
117
118 %.ind: %.idx
119         $(MENDEX) $(MENDEXFLAG) $<
120
121 # PDFファイル作成
122 %.pdf: %.dvi
123         $(DVIPDFMX) $(DVIPDFMXFLAG) $<
124
125 # tex-cleanターゲット
126 tex-clean:
127         $(RM) *.aux *.bbl *.blg *.d *.idx *.ilg *.ind *.lof *.log *.lot *.out *.toc *.xbb
128
129 # tex-distcleanターゲット
130 tex-distclean: tex-clean
131         $(RM) $(addsuffix .dvi,$(basename $(TARGETS))) $(addsuffix .pdf,$(basename $(TARGETS)))