多编号子目录下TeX文件编译Makefile编写求助
修复你的多作业目录TeX编译Makefile
先梳理下你现有代码里的几个关键问题:
SRC_DIR := assignment_$(wildcard *)写法逻辑错误,wildcard *会匹配当前目录所有文件/文件夹,拼接后根本没法正确定位到assignment_开头的作业子目录- 遍历子目录TeX文件的规则有问题,无法准确抓取每个作业目录里的
.tex文件 - 缺少目录预创建逻辑,
publish和.tex目录如果不存在的话,编译直接会报错 - 目标文件的路径替换规则没有写完,没法正确映射到最终的PDF输出位置
下面是修复后的完整Makefile,我加了注释方便你理解:
.PHONY: all clean papers # 最终PDF的存放目录 PUBLISH_DIR := publish # 编译过程中临时文件(aux、log等)的存放目录 TEX_TMP_DIR := .tex # 匹配所有assignment_开头的作业子目录 ASSIGNMENT_DIRS := $(wildcard assignment_*) # 遍历所有作业目录,获取里面的所有TeX源文件 SRC_FILES := $(foreach dir,$(ASSIGNMENT_DIRS),$(wildcard $(dir)/*.tex)) # 将TeX源文件路径转换为publish目录下的PDF目标路径(去掉原目录,只保留文件名替换后缀) PDF_TARGETS := $(patsubst %.tex,$(PUBLISH_DIR)/%.pdf,$(notdir $(SRC_FILES))) # 编译工具及参数 LATEX := xelatex LATEX_FLAGS := -shell-escape -output-directory=$(TEX_TMP_DIR) # 默认目标:编译所有作业的PDF all: $(PDF_TARGETS) # 确保输出目录和临时目录存在(不存在则创建) $(PUBLISH_DIR) $(TEX_TMP_DIR): mkdir -p $@ # 单个PDF文件的编译规则 $(PUBLISH_DIR)/%.pdf: %.tex $(PUBLISH_DIR) $(TEX_TMP_DIR) # 第一次编译生成临时文件(处理基本内容) $(LATEX) $(LATEX_FLAGS) $< # 如果你的作业用到参考文献,可以解开下面的注释(适配bibtex) # bibtex $(TEX_TMP_DIR)/$(notdir $*) # 第二次编译处理交叉引用、目录等内容 $(LATEX) $(LATEX_FLAGS) $< # 将临时目录里的成品PDF移到publish目录 mv $(TEX_TMP_DIR)/$(notdir $@) $@ # 保持你原来的papers目标,和all目标功能一致 papers: all # 清理规则:删除临时文件和生成的PDF clean: rm -rf $(TEX_TMP_DIR) $(PUBLISH_DIR)
额外说明:
- 把临时文件和最终PDF分开存放,避免作业目录里堆满编译垃圾文件
- 保留了两次xelatex编译的逻辑,这是TeX处理交叉引用、目录的常规操作;如果用到参考文献,直接解开bibtex的注释即可
- 用
mkdir -p确保目录创建不会报错,即使目录已经存在 - 用
notdir提取纯文件名,避免路径嵌套导致的编译混乱
内容的提问来源于stack exchange,提问作者matteo-g
相关产品推荐
相关产品推荐

