我想创建一个makefile来编译子目录中的LaTeX文件。所需的目录结构应该如下所示,除了简单的a,b和c之外,在latex文件夹下可以有任意数量的子目录。makefile编译子目录中更改的乳胶文件
├── 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 [email protected]) -aux_directory=$(dir [email protected]) $(subst output/,$(notdir $(@:pdf=tex)),$(dir [email protected]))
@$(TEX_COMMAND) -file-line-error -halt-on-error -output-directory $(dir [email protected]) -aux_directory=$(dir [email protected]) $(subst output/,$(notdir $(@:pdf=tex)),$(dir [email protected]))
clean:
@rm -rf $(OUTPUT_DIRECTORIES)
这将正确生成适当的pdf
,aux
,log
,toc
等在各个子目录中output
目录中的文件。但是,如果我更改了一个tex文件,那么make会重新编译所有的东西。
我已经看过很多其他类似的问题。对于其他问题,子目录的数量是已知的,所以你可以将它们硬编码到makefile中。对于这种情况,latex文件夹中的子目录数量不断变化并被添加到等等,这就是为什么我使用通配符来抓取所有tex文件的原因。我宁愿不必为每个子目录创建一个makefile并使用递归make。
使用GNU制作,你可以在每个子目录创建一个Makefile *自动*和'include'它。你也可以使用'eval()'。 – reinierpost