如何在Makefile中捕获文件名数字后缀?实现LaTeX书籍编译需求
编写支持整书与单章节编译的LaTeX Makefile
我来帮你写一个完全符合需求的Makefile,直接就能用,还附带详细的功能说明和注意事项:
# 定义LaTeX编译器及编译选项,可根据需要换成xelatex/lualatex LATEX = pdflatex BIBTEX = bibtex LATEXFLAGS = -interaction=nonstopmode # 主书籍文件的名称(对应你的book.tex) MAIN = book # 自动匹配所有章节文件(chapter_*.tex) CHAPTERS = $(wildcard chapter_*.tex) # 生成单章节编译的目标名(去掉.tex后缀) CHAPTER_TARGETS = $(CHAPTERS:.tex=) # 默认执行目标:编译整本书 all: book # 整书编译规则:处理交叉引用与目录 book: $(MAIN).tex $(CHAPTERS) $(LATEX) $(LATEXFLAGS) $(MAIN) # 如果你的书籍用到参考文献,取消下面两行注释 # $(BIBTEX) $(MAIN) # $(LATEX) $(LATEXFLAGS) $(MAIN) $(LATEX) $(LATEXFLAGS) $(MAIN) # 第二次编译确保交叉引用正确 # 定义单章节编译的通用模板 define chapter_compile_rule $(1): $(1).tex # 自动生成临时主文件,仅包含当前章节 echo "\documentclass{book}" > temp_$(1).tex # 如果你有公共宏包/命令在preamble.tex里,取消下面一行注释 # echo "\input{preamble.tex}" >> temp_$(1).tex echo "\begin{document}" >> temp_$(1).tex echo "\include{$(1)}" >> temp_$(1).tex echo "\end{document}" >> temp_$(1).tex # 编译临时文件 $(LATEX) $(LATEXFLAGS) temp_$(1) # 清理临时辅助文件(可选,保留的话可以查看编译日志) rm -f temp_$(1).tex temp_$(1).aux temp_$(1).log # 将生成的PDF重命名为章节名称 mv temp_$(1).pdf $(1).pdf endef # 为每个章节自动生成编译规则 $(foreach chap,$(CHAPTER_TARGETS),$(eval $(call chapter_compile_rule,$(chap)))) # 清理所有生成的文件(PDF、辅助文件等) clean: rm -f $(MAIN).pdf $(MAIN).aux $(MAIN).log $(MAIN).toc $(MAIN).lof $(MAIN).lot rm -f $(CHAPTER_TARGETS:=.pdf)
怎么用?
- 编译整本书:直接执行
make book(或者简化成make,因为all默认指向book) - 编译单个章节:比如编译第一章就执行
make chapter_1,完成后会生成chapter_1.pdf - 清理所有生成文件:执行
make clean,会删掉整书PDF、单章节PDF和各种辅助文件
关键细节说明
- 编译器灵活替换:如果你用XeLaTeX或LuaLaTeX,只需要把
LATEX = pdflatex改成对应的编译器名称就行。 - 参考文献支持:如果你的书籍用到BibTeX,记得把
book规则里的BIBTEX命令注释去掉,这样编译时会自动处理参考文献。 - 公共代码复用:如果你的章节依赖主文件里的宏包、自定义命令,建议把这些公共内容提取到
preamble.tex里,然后打开临时文件生成部分的\input{preamble.tex}注释,这样单章节编译时也能正确加载这些内容。 - 交叉引用提示:单章节编译时,章节内的交叉引用正常,但跨章节的引用会显示为
??,这是正常现象——毕竟其他章节没被包含进来,整书编译时会自动修复。
内容的提问来源于stack exchange,提问作者Denisof
相关产品推荐
相关产品推荐

