我有一些latex文件,我希望能够方便地编译它们。我的makefile目前如下。Makefile命令有条件文件存在
targets := $(patsubst %.tex, %.pdf, $(wildcard *.tex))
.PHONY: all
all: $(targets)
.SECONDEXPANSION:
%.pdf: %.tex $$(wildcard $$*_inc/*.*)
pdflatex $<
这样,如果一个包含文件夹存在,该文件夹内的所有内容将作为一个依赖治疗。
但是,我也想自动运行依赖python脚本。这可能是创作情节或计算要包含的价值。我试图做出以下修改。
targets := $(patsubst %.tex, %.pdf, $(wildcard *.tex))
all: $(targets)
.PHONY: all run_%
.SECONDEXPANSION:
%.pdf: %.tex $$(wildcard $$*_inc/*.*) $$(patsubst %, run_%, $$(wildcard $$*_inc/*.py))
pdflatex $<
run_%: %
$<
但是,这不起作用,因为我期望。我有以下文件夹结构。
|
|-Makefile
|-paper.tex
|-paper_inc/
|---a.txt
|---b.py
我希望它可以运行b.py
,然后运行pdflatex paper.tex
。但是,b.py
未运行。如果我查看创建的依赖项,我看到paper_inc/a.txt
和paper_inc/b.py
是paper.pdf
的依赖关系,但是run_paper_inc/b.py
不是。
我不完全确定这是什么问题,因为它觉得它应该工作。另外,我还尝试了以下几条线以及%.pdf
规则。
%.pdf: %.tex $$(wildcard $$*_inc/*.*) $$(addprefix run_,$$(wildcard $$*_inc/*.py))
%.pdf: %.tex $$(wildcard $$*_inc/*.*) $$(shell ls $$*_inc/*.py | sed 's/^/run/')
%.pdf: %.tex $$(wildcard $$*_inc/*.*) $$(shell ls $$*_inc/*.py | awk '{print "prefix "$0}')
对于每一项规则,不过,我收到错误消息make: *** No rule to make target 'paper.pdf'. Stop.
应该怎样做才能修复这个错误,或者,我应该怎么用的,而不是make
?
啊,好吧。测试这个解决方案,它解决了部分问题,但不是全部。现在,不同的python文件在'pdflatex'命令之前运行。但是,只要乳胶文件被重新编译,python文件就会重新运行。为了弥补这一点,我尝试了以下改变。 .SECONDEXPANSION %.PDF:... $$(addsuffix运行,$$(通配符%_inc/* PY)。) ... %.pyrun:%的.py $ < 自% .py现在是%.pyrun的一个依赖项,我预计这只会再次运行python程序,python文件本身已经改变,但是它会在每次编译时运行。 – 2013-03-23 17:44:22
@MereInterest:如果你不想在编译乳胶文件时运行python文件,为什么要使它们成为先决条件?当*做*你想让他们跑? – Beta 2013-03-23 19:07:19
希望它在正在编译的latex文件之前运行,但只有在python文件已更改时才会运行。例如,我有一个python脚本来制作一个包含在latex文件中的绘图。如果python脚本已经改变,那么它应该再次运行以重新创建该图,否则应该使用现有的图。 – 2013-03-23 19:32:53