首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >图形生成文件(多个图形)和胶乳集成

图形生成文件(多个图形)和胶乳集成
EN

Stack Overflow用户
提问于 2015-11-02 23:48:21
回答 1查看 1.1K关注 0票数 1

问:我如何获得一个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:~/毕业论文/图/图

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

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-03 04:12:50

我们将从现有gp文件列表开始:

代码语言:javascript
复制
CODES=$(wildcard ../figures/gnuplot_codes/*.gp)

到现在为止还好。这个列表告诉我们哪些gp文件存在,因此可以构建哪些eps和tex文件。(我们不在乎哪些已经存在。)

代码语言:javascript
复制
EPSES=$(patsubst ../figures/gnuplot_codes/%.gp,../figures/figs/%.eps, $(CODES))
FIGTEX=$(patsubst ../figures/gnuplot_codes/%.gp,../figures/figs/%.tex, $(CODES))

现在,规则要运行gnuplot并生成这些文件。这个版本的问题是:

代码语言:javascript
复制
$(EPSES) $(FIGTEX):   $(CODES)
    gnuplot $(CODES)

它使所有gp文件成为每个eps和tex文件的先决条件;更改一个gp文件,您必须重新构建所有文件。所以把它处理掉,用一个模式规则代替它

代码语言:javascript
复制
../figures/figs/%.eps ../figures/figs/%.tex: ../figures/gnuplot_codes/%.gp
    gnuplot $<

(我不知道gnuplot如何知道将它的输出文件放在哪里;您没有指定,所以我假设您已经完成了这个部分。如果你在这方面有困难,我很乐意帮忙。)

现在是Thesis.pdf规则:

代码语言:javascript
复制
# 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文件),但是嘿,如果它没有坏掉.

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

代码语言:javascript
复制
all: $(EPSES) $(FIGTEX) $(CODES) $(PAPER).pdf
    evince $(PAPER).pdf

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

代码语言:javascript
复制
all: $(PAPER).pdf
    evince $<

试试看。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33489096

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档