Python批量编译子目录.tex为PDF并按原结构存储到指定文件夹
问题原因
现有脚本编译生成的PDF全部堆积在脚本根目录,核心是pdflatex默认将所有编译产出(含PDF、各类中间临时文件)输出到执行编译命令的当前工作目录,脚本既没有提前在PDF Folder下复刻原有的子目录结构,也没有给pdflatex指定输出路径,自然无法按要求归档文件。
优化后可直接运行的脚本
import os import subprocess # 基础配置 ROOT_PATH = os.getcwd() TARGET_ROOT = os.path.join(ROOT_PATH, "PDF Folder") # LaTeX编译生成的临时文件后缀,编译完成后自动清理 TEMP_FILE_SUFFIX = (".aux", ".log", ".out", ".toc", ".synctex.gz") # 遍历收集所有.tex文件,自动跳过目标PDF文件夹避免重复扫描 all_tex_files = [] for dir_path, _, files in os.walk(ROOT_PATH): if TARGET_ROOT in dir_path: continue for file in files: if file.endswith(".tex"): all_tex_files.append(os.path.join(dir_path, file)) # 逐个处理tex文件 for tex_abs_path in all_tex_files: # 计算当前tex文件相对于脚本根目录的路径 source_dir = os.path.dirname(tex_abs_path) rel_dir = os.path.relpath(source_dir, ROOT_PATH) # 计算该文件在PDF Folder下对应的目标存储目录 target_dir = os.path.join(TARGET_ROOT, rel_dir) # 目标目录不存在则自动创建 os.makedirs(target_dir, exist_ok=True) # 调用pdflatex编译,指定输出目录,开启非交互模式无需手动确认 subprocess.run( [ "pdflatex", "-interaction=nonstopmode", f"-output-directory={target_dir}", tex_abs_path ], # 不需要查看编译日志的话保留这两行,要排错就注释掉 stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL ) # 清理编译生成的临时文件,目标目录仅保留PDF for f in os.listdir(target_dir): if f.endswith(TEMP_FILE_SUFFIX): os.remove(os.path.join(target_dir, f))
脚本特性
- 自动跳过
PDF Folder目录的扫描,不会重复处理已生成的文件 - 1:1保留原目录结构,子文件夹名称、PDF文件名和原始.tex文件完全匹配
- 编译开启非交互模式,遇到常规引用、格式类问题不会卡住等待手动输入,支持全程无人值守批量编译
- 编译完成后自动清理LaTeX生成的各类临时文件,目标文件夹仅保留需要的PDF
- 路径处理使用Python标准库接口,兼容Windows、macOS、Linux全平台
注意事项
- 运行脚本前请确保已经安装TeX发行版(如TeX Live、MikTeX),且
pdflatex命令已加入系统环境变量,可在终端/命令行直接调用 - 如果你的文档需要生成目录、交叉引用、参考文献,可在编译循环中对同一个tex文件连续调用2次
pdflatex即可正常生成对应内容,无需手动多次编译 - 编译出现异常时,删除代码中
stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL两行即可查看完整编译日志排查问题
内容的提问来源于stack exchange,提问作者Alan Jones
相关产品推荐
相关产品推荐

