用于 gnuplot(许多数字)和乳胶集成的 Makefile

Makefile for gnuplot (Many figures) and latex integration

问题:如何获得可以检查任意数量的 *.eps 和 *.gp(gnuplot 代码)并具有从新编辑的文件构建新的 *.eps 和 *.tex 文件的规则*.gp 文件?

目标: 创建一个 Makefile 来检查我的任何章节 (.tex)、绘图 (.eps、.tex) 或 gnuplot 代码 (.gp ) 自上次编译以来发生了变化。创建一个在编译文档之前执行必要的 *.gp 代码的通用规则。

编辑:关于目标的更多细节:我希望 Make 构建 Thesis.pdf 但在此之前执行自上次构建以来已更改的任何 foo.gp 文件。 .gp 文件可能会因多种原因而更新,包括更改轴标签、图例条目、添加数据...

背景:我正在写我的论文,打算同时使用 LaTex 和 GNUPlot。由于大量的数字,将一个 makefile 放在一起似乎是一个很好的调用,它确保如果我的任何 gnuplot 代码 (*.gp) 被更改,必要的代码将被执行(而未更改的 *.gp 代码则不会)在编译乳胶文件之前。我正在使用 epslatex 生成 *.eps 和 *.tex 文件(与 \input 一起使用——不是独立的)。如果示例代码中的内容不是很清楚,这是我第一次尝试生成文件。

编辑:关于 GNUPlot 的更多细节

gnuplot foo.gp 生成 foo.eps(包括绘图的所有图形部分)和 foo.tex(格式化图形并添加所有必要文本的 tex 文件)。 foo.gp 是一个构建绘图的脚本(很像在 MatLab 中绘图或在 python 中使用 MatPlotLib 绘图)。 foo.tex文件在latex图形环境中用作\intut{foo.tex}。我可能会有大约 100 个数字,我的顾问无疑会让我编辑到令人作呕的地步,这意味着我将反复编辑许多不同的 gnuplot 脚本。

目录结构:

根目录:~/论文

Latex 文件目录:~/dissertation/text(这也是我的 makefile 当前所在的位置)

Gnuplot 代码目录:~/dissertation/figures/gnuplot_codes

Gnuplot 输出目录:~/dissertation/figures/figs

到目前为止,这是我的代码:

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 文件,您必须重建所有内容。所以摆脱它并用 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 文件)但是嘿,如果它没有坏...

最后是 运行 显示的规则(如果您希望它成为默认设置,则应该排在第一位):

all: $(EPSES) $(FIGTEX) $(CODES) $(PAPER).pdf
    evince $(PAPER).pdf

除非evince实际上使用 gp、eps 和tex 文件,否则我们可以不用这些先决条件:

all: $(PAPER).pdf
    evince $<

试一试。