问题:如何获得一个makefile,它可以检查任意数量的*.eps和*.gp(gnuplot代码),并具有从新编辑的*.gp文件构建新的*.eps和*.tex文件的规则?
目标:创建一个Makefile,检查我的任何章节(.tex)、绘图(.eps、.tex)或gnuplot代码(.gp)自上次编译以来是否发生了更改。创建一个通用规则,在编译文档之前执行必要的*.gp代码。
编辑:关于GOAL的更多细节:我希望Make构建Thesis.pdf,但在此之前,请执行自上次构建以来更改的任何foo.gp
文件。.gp文件可能因多种原因而更新,包括更改轴标签、图例条目、添加数据。。。
背景:我正在写我的论文,打算同时使用LaTex和GNUplot。由于有大量的数字,所以在编译latex文档之前,将一个makefile放在一起似乎是一个很好的选择,它可以确保如果我的任何gnuplot代码(*.gp)发生了更改,则执行必要的代码(而未更改的*.gp代码则不执行)。我正在使用epslatex生成*.eps和*.tex文件(与\input----一起使用,而不是独立的)。如果从示例代码中看不太清楚,这是我对makefile的第一次尝试。
编辑:更多关于GNUplot 的详细信息
gnuplot foo.gp
生成foo.eps
(包括绘图的所有图形部分)和foo.tex
(格式化图形并添加所有必要文本的tex文件)。foo.gp
是一个构建绘图的脚本(很像MatLab中的绘图或python中的MatPlotLib)。foo.tex
文件在乳胶图形环境中用作intut{foo.tex}
。我可能会有大约100个数字,我的顾问无疑会让我编辑到令人作呕,这意味着我将反复编辑许多不同的gnuplot脚本。
目录结构:
根目录:~/论文
Latex文件目录:~/论文/文本(这也是我的makefile当前所在的位置)
Gnuplot代码目录:~/学位论文/数字/Gnuplot_codes
Gnuplot输出目录:~/论文/数字/图表
这是我迄今为止的代码:
PAPER=Thesis
CODES=$(wildcard ../figures/gnuplot_codes/*.gp) # list of all gnuplot scripts
EPSES=$(wildcard ../figures/figs/*.eps) # list of all eps files
FIGTEX=$(wildcard ../figures/figs/*.tex) # list of all associated tex files
all: $(EPSES) $(FIGTEX) $(CODES) $(PAPER).pdf
evince $(PAPER).pdf
# This is the line I can't figure out ---
# if any of the gnuplot codes are updated it runs all of them
$(EPSES) $(FIGTEX): $(CODES)
gnuplot $(CODES)
# compiles the latex document using latexmk
$(PAPER).pdf: $(PAPER).tex $(EPSES) $(FIGTEX) $(CODES)
latexmk -latex="latex -interaction=nonstopmode" -use-make $<
dvips $(PAPER).dvi -Ppdf
ps2pdf $(PAPER).ps
# This catches any missing *.eps files thrown back from latexmk
# I feel like I should have a way of checking before
# running $(PAPER).pdf rule
../figures/figs/%.eps: ../figures/gnuplot_codes/%.gp
gnuplot $<
# same as the rule above but for *.tex
../figures/figs/%.tex: ../figures/gnuplot_codes/%.gp
gnuplot $<
# this cleans all the latex files
clean:
latexmk -CA
我们将从现有gp文件的列表开始:
CODES=$(wildcard ../figures/gnuplot_codes/*.gp)
到目前为止,一切都很好。这个列表告诉我们存在哪些gp文件,因此可以构建哪些eps和tex文件。(我们不在乎哪些已经存在。)
EPSES=$(patsubst ../figures/gnuplot_codes/%.gp,../figures/figs/%.eps, $(CODES))
FIGTEX=$(patsubst ../figures/gnuplot_codes/%.gp,../figures/figs/%.tex, $(CODES))
现在让规则运行gnuplot并生成这些文件。这个版本的问题:
$(EPSES) $(FIGTEX): $(CODES)
gnuplot $(CODES)
它使所有gp文件成为每个eps和tex文件的先决条件;更改一个gp文件,就必须重新生成所有内容。所以去掉它,用一个模式规则来代替它:
../figures/figs/%.eps ../figures/figs/%.tex: ../figures/gnuplot_codes/%.gp
gnuplot $<
(我不知道gnuplot是如何知道将其输出文件放在哪里的;你没有指定,所以我假设你已经解决了这个部分。如果你在这方面有问题,我很乐意提供帮助。)
现在针对Thesis.pdf
规则:
# compiles the latex document using latexmk
$(PAPER).pdf: $(PAPER).tex $(EPSES) $(FIGTEX)
latexmk -latex="latex -interaction=nonstopmode" -use-make $<
dvips $(PAPER).dvi -Ppdf
ps2pdf $(PAPER).ps
我删除了先决条件$(CODES)
,因为它看起来是多余的。这个配方可能会改进(并推广到其他pdf文件中),但嘿,如果它没有坏。。。
最后是运行该节目的规则(如果你希望它是默认的,应该放在第一位):
all: $(EPSES) $(FIGTEX) $(CODES) $(PAPER).pdf
evince $(PAPER).pdf
除非evince
实际上使用gp、eps和tex文件,否则我们可以不使用这些前提条件:
all: $(PAPER).pdf
evince $<
试试看。