makefile编译子目录中更改的latex文件

makefile编译子目录中更改的latex文件,makefile,latex,Makefile,Latex,我试图创建一个makefile来编译子目录中的LaTeX文件。所需的目录结构应该是这样的,除了a、b和c之外,latex文件夹下可以有任意数量的子目录 ├── latex │   ├── a │   │   ├── output │   │   │   └── stuff.pdf │   │   └── stuff.tex │   ├── b │   │   ├── blah.tex │   │   └── output │   │   └── blah.pdf │   └── c │ 

我试图创建一个makefile来编译子目录中的LaTeX文件。所需的目录结构应该是这样的,除了a、b和c之外,latex文件夹下可以有任意数量的子目录

├── latex
│   ├── a
│   │   ├── output
│   │   │   └── stuff.pdf
│   │   └── stuff.tex
│   ├── b
│   │   ├── blah.tex
│   │   └── output
│   │       └── blah.pdf
│   └── c
│       ├── asdf.tex
│       └── output
│           └── asdf.pdf
└── makefile
我想在latex目录中只使用一个makefile来实现这一点,它将自动编译每个子目录中的tex文件。 我当前的makefile如下所示:

TEX_COMMAND = pdflatex

TEX_FILES = $(wildcard **/*.tex)

OUTPUT_DIRECTORIES = $(addsuffix output/,$(wildcard */))
PDF_FILES = $(join $(dir $(TEX_FILES)),$(addprefix output/,$(notdir $(TEX_FILES:tex=pdf))))

all: mkdir $(PDF_FILES)

mkdir:
    @mkdir -p $(OUTPUT_DIRECTORIES)

$(PDF_FILES): $(TEX_FILES)
    @$(TEX_COMMAND) -file-line-error -halt-on-error -output-directory $(dir $@) -aux_directory=$(dir $@) $(subst output/,$(notdir $(@:pdf=tex)),$(dir $@))
    @$(TEX_COMMAND) -file-line-error -halt-on-error -output-directory $(dir $@) -aux_directory=$(dir $@) $(subst output/,$(notdir $(@:pdf=tex)),$(dir $@))

clean:
    @rm -rf $(OUTPUT_DIRECTORIES)
这将在每个子目录的
输出
目录中正确生成适当的
pdf
aux
log
toc
等文件。但是,如果我更改一个tex文件,make将导致所有内容重新编译


我已经研究了许多其他类似的问题。对于其他问题,子目录的数量是已知的,因此您可以将它们硬编码到makefile中。在这种情况下,latex文件夹中的子目录数量会不断变化并添加到其中,等等,这就是为什么我使用通配符来获取所有tex文件的原因。我宁愿不必为每个子目录创建makefile并使用递归make。

make的一个基本缺点是它对通配符的处理粗糙

在这种情况下,您可以使用编写一个模式规则,该规则将执行您想要的操作:

all: mkdir $(PDF_FILES)

.SECONDEXPANSION:
%.pdf: $$(subst /output/,/, $$(subst .pdf,.tex, $$@))
    @echo buiding $@ from $<
all:mkdir$(PDF\u文件)
.第二次扩展:
%.pdf:$$(subst/output/,/,$$(subst.pdf,.tex,$$@))
@echo Building$@来自$<

使用GNU Make,您可以自动为每个子目录创建一个Make文件,并
包含它。您还可以使用
eval()
。我最后做的是创建一个makefile.template文件,latex/文件夹中的makefile将复制到每个子目录中,然后递归运行。我想这可能更容易,但我一定会试试你的方法。