问:我如何获得一个makefile,它可以检查任意数量的*.eps和*.gp (gnuplot ),并有规则从新编辑的*.gp文件构建新的*.eps和*.tex文件?
目标:创建一个生成文件,检查自上次编译以来,我的章节(.tex)、绘图(.eps、.tex)或gnuplot (.gp)是否发生了变化。创建一个通用规则,在编译文档之前执行必要的*.gp代码。
编辑:关于目标的更多细节:我想要构建Thesis.pdf,但在此之前,执行自上次构建以来修改过的任何foo.gp文件。.gp文件可能由于许多原因而更新,包括更改轴标签、图例条目、添加数据.
背景:我正在写我的论文,打算同时利用LaTex和GNUplot。由于有大量的数字,所以在编译latex文档之前,似乎是一个很好的调用,它可以确保如果对我的gnuplot ( *.gp )进行了更改,就会执行必要的代码(而未修改的*.gp代码)。我正在使用epslatex来生成*.eps和*.tex文件(用于\input --而不是独立的)。如果从示例代码中看不清楚,这是我第一次尝试makefile。
编辑:关于GNUplot的更多细节
gnuplot foo.gp生成foo.eps (包括绘图的所有图形部分)和foo.tex (一个tex文件,用于格式化图形并添加所有必要的文本)。foo.gp是一个构建绘图的脚本(非常类似于MatLab中的绘图或python中的MatPlotLib )。在latex图形环境中,foo.tex文件用作\intut{foo.tex}。我将有可能在近100位数,我的顾问无疑会让我编辑到广告国家博物馆,这意味着我将重复编辑许多不同的格格情节脚本。
Dir结构:
根Dir:~/论文
Latex文件Dir:~/Dir/text(这也是我的makefile当前所在的地方)
Gnuplot码Dir:~/学位论文/数字/gnuplot_ codes
图形输出Dir:~/毕业论文/图/图
到目前为止,这是我的代码:
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发布于 2015-11-03 04:12:50
我们将从现有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 $<试试看。
https://stackoverflow.com/questions/33489096
复制相似问题