如何简化make文件中的依赖项列表

时间:2019-02-27 16:25:15

标签: makefile latex

目标

我正在尝试使用Make文件来自动生成面板图形。数据和图形是从Rscripts生成的,随后使用乳胶进行组合以生成PDF。

问题描述

比方说,我想生成一个由4个子图组成的面板图,它以2x2网格排列。通过使用以下make文件,我能够生成数据以及子图:

all : data/plot1.txt plots/plot1.pdf \
data/plot2.txt plots/plot2.pdf \
data/plot3.txt plots/plot3.pdf \
data/plot4.txt plots/plot4.pdf \
plots/figure_5.pdf

#Panel Figure#

#Plot 1
data/plot1.txt : scripts/plot1_sim.R
    Rscript scripts/plot1_sim.R $@

plots/plot1.pdf : scripts/plot1_sim.R data/plot1.txt
    Rscript scripts/plot1.R $@

#Plot 2
data/plot2.txt : scripts/plot2_sim.R
    Rscript scripts/plot2_sim.R $@

plots/plot2.pdf : scripts/plot2_sim.R data/plot2.txt
    Rscript scripts/plot2.R $@

#Plot 3
data/plot3.txt : scripts/plot3_sim.R
    Rscript scripts/plot3_sim.R $@

plots/plot3.pdf : scripts/plot3_sim.R data/plot3.txt
    Rscript scripts/plot3.R $@

#Plot 4
data/plot4.txt : scripts/plot4_sim.R
    Rscript scripts/plot4_sim.R $@

plots/plot4.pdf : scripts/plot4_sim.R data/plot4.txt
    Rscript scripts/plot4.R $@

使用乳胶文件,例如figure.tex我可以根据需要编译面板图。

但是,现在我想通过乳胶将最终PDF的构造添加到make文件中。该文件当然取决于plots/plot1.pdf,直至plots/plot4.pdf为止。

我将其添加到如下代码中:

plots/figure.pdf : scripts/figure.tex plots/plot1.pdf plots/plot2.pdf plots/plot3.pdf plots/plot4.pdf
    pdflatex scripts/figure.tex

有四个子图可以这样做(但也许很丑),但是如果您生成带有例如16个子图,代码变得不可读。

问题

有没有更好的方法来包含较大的依赖项列表,在这种情况下,可以使用make和乳胶生成面板图形?

1 个答案:

答案 0 :(得分:1)

据我了解,您可能可以通过以下方式将所有这些因素分解:

SIMRS    := $(wildcard scripts/plot*_sim.R)
PLOTS    := $(patsubst scripts/plot%_sim.R,%,$(SIMRS))
PDFPLOTS := $(patsubst %,plots/plot%.pdf,$(PLOTS))
TXTPLOTS := $(patsubst %,data/plot%.txt,$(PLOTS))

.PHONY: all

all: $(TXTPLOTS) $(PDFPLOTS) plots/figure_5.pdf

data/plot%.txt : scripts/plot%_sim.R
    Rscript $< $@

plots/plot%.pdf : scripts/plot%_sim.R data/plot%.txt
    Rscript scripts/plot$*.R $@

plots/figure.pdf: scripts/figure.tex $(PDFPLOTS)
    pdflatex $<

请注意,plots/plot%.pdf: ...模式规则看起来很奇怪:它的配方使用scripts/plotX.R,但前提条件是scripts/plotX_sim.Rdata/plotX.txt(没有scripts/plotX.R)。正常吗?