问题:如何获取可以检查任意数量的* .eps和* .gp(gnuplot代码)的makefile,并且有一条规则可以从新编辑的*中构建新的* .eps和* .tex文件。 gp文件?
目标: 创建一个Makefile,用于检查自上次编译以来是否有任何章节( .tex),绘图( .eps, .tex)或gnuplot代码( .gp)发生了变化。创建一个通用规则,在编译文档之前执行必要的* .gp代码。
编辑:有关GOAL的更多详细信息:我希望Make能够构建Thesis.pdf,但在此之前执行自上次构建以来已更改的任何foo.gp
文件。 .gp文件可能会因为多种原因而更新,包括更改轴标签,图例条目,添加的数据......
背景:我正在撰写论文,并打算使用LaTex和GNUplot。由于数字很多,将一个makefile放在一起是一个很好的调用,如果我的任何gnuplot代码(* .gp)被更改以确保执行必要的代码(并且未更改* .gp代码)在编译乳胶文件之前。我使用epslatex生成* .eps和* .tex文件(与\ input一起使用---不是独立的)。如果从示例代码中不清楚这是我第一次尝试makefile。
编辑:关于GNUplot的更多细节
gnuplot foo.gp
生成foo.eps
(包括绘图的所有图形部分)和foo.tex
(格式化图形并添加所有必要文本的tex文件)。 foo.gp
是一个构建绘图的脚本(很像在MatLab中绘图或在python中使用MatPlotLib)。 {\ {1}}文件在乳胶图环境中用作foo.tex
。我可能会在100个图片附近,我的顾问无疑会让我编辑到令人作呕的意思,我会反复编辑许多不同的gnuplot脚本。
目录结构:
Root Dir:〜/论文
Latex文件目录:〜/论文/文本(这也是我的makefile目前所在的位置)
Gnuplot代码目录:〜/论文/数字/ gnuplot_codes
Gnuplot输出目录:〜/论文/数字/无花果
到目前为止,这是我的代码:
\intut{foo.tex}
答案 0 :(得分:2)
我们将从现有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文件,你必须重建一切。所以摆脱它并用pattern rule替换它:
../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文件),但嘿,如果没有破坏...
最后运行show的规则(如果你想让它成为默认设置,应该首先出现):
all: $(EPSES) $(FIGTEX) $(CODES) $(PAPER).pdf
evince $(PAPER).pdf
除非evince
实际使用 gp,eps和tex文件,否则我们可以不用这些先决条件:
all: $(PAPER).pdf
evince $<
尽一切努力。