【问题标题】:makefile compile changed latex files in subdirectorymakefile 编译子目录中更改的乳胶文件
【发布时间】:2016-09-07 00:29:16
【问题描述】:

我正在尝试创建一个 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)

这将在每个子目录的output 目录中正确生成正确的pdfauxlogtoc 等文件。但是,如果我更改了一个 tex 文件,那么 make 将导致重新编译所有内容。

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

【问题讨论】:

  • 使用 GNU Make,您可以自动include为每个子目录创建一个 Makefile。您也可以使用eval()

标签: makefile latex


【解决方案1】:

Make 的一个基本缺点是它对通配符的粗略处理。

在这种情况下,您可以使用secondary expansion 编写一个模式规则来满足您的需求:

all: mkdir $(PDF_FILES)

.SECONDEXPANSION:
%.pdf: $$(subst /output/,/, $$(subst .pdf,.tex, $$@))
    @echo buiding $@ from $<

【讨论】:

  • 我最终做的是创建一个 makefile.template 文件,latex/ 文件夹中的 makefile 将复制到每个子目录中,然后递归运行。我认为这可能更容易,但我一定会试试你的方法。
猜你喜欢
  • 2011-01-29
  • 2011-04-25
  • 2022-09-27
  • 2015-08-09
  • 2022-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多