为gnuplot(许多图)和latex集成制作文件



问题:如何获得一个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 $<

试试看。

最新更新