You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多编号子目录下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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:57:36