如何通过txt/json文件填充LaTeX模板批量编译生成不同PDF
原生LaTeX宏定义方案(通用首选)
这是目前最常用的实现方式,本身就是通过.tex文件管理所有填充内容,不需要任何额外工具或预处理步骤。
核心逻辑是把所有待替换的内容用LaTeX原生的\newcommand定义在单独的配置.tex文件里,主模板开头直接用\input引入这个配置文件即可,更换内容时只需要替换/修改这个配置文件,就能编译出不同的PDF。
针对你示例里重复定义\it21的问题(LaTeX不允许重复用\newcommand定义同名命令),可以配合遍历宏包处理列表类内容,示例代码如下:
配置文件content.tex(即你要替换的单内容文件):% 单值字段直接定义 \newcommand{\secOne}{first section} \newcommand{\secTwo}{second section} \newcommand{\textOne}{this is a test} % 枚举/列表类多值字段统一存在一个命令里 \newcommand{\enumList}{foo, bar}主模板
foo.tex:\documentclass{article} \usepackage{pgffor} % 引入遍历宏包,可选,用原生LaTeX循环也能实现 \input{content.tex} % 仅需更换这行引入的配置文件即可切换内容 \begin{document} \section{\secOne} \textOne \section{\secTwo} \begin{enumerate} \foreach \curItem in \enumList { \item \curItem } \end{enumerate} \end{document}这个方案的优势是完全兼容LaTeX原生语法,支持公式、特殊格式、交叉引用等所有LaTeX特性,不存在内容转义问题,是简历、学术论文模板、批量生成通知等场景的首选方案。
自定义格式txt预处理方案
你提到的格式化txt、按行分隔内容的方式完全可行,但LaTeX本身没有原生解析自定义键值对格式的能力,需要在编译前加一步简单的预处理流程:
写一个轻量脚本(Python/Shell都可以,十几行代码就能实现),逐行读取你的txt文件,识别带冒号的键名、对应缩进的值,遇到重复键自动归为列表项,最终自动生成上面提到的\newcommand格式的.tex配置文件,再调用LaTeX编译器完成编译。
这个方案适合需要给不懂LaTeX语法的用户提供内容填写入口的场景,填内容的人不需要接触任何LaTeX命令,只需要按照固定格式写txt即可。需要注意的是如果内容里有LaTeX特殊字符(%、_、&等),要么在预处理脚本里加自动转义逻辑,要么填写内容时手动加转义符,否则会出现编译错误。结构化数据文件方案
如果你的内容结构更复杂(比如包含多级嵌套、多行列的表格、多层级枚举),可以选择用JSON/YAML这类结构化格式存储内容,同样通过预处理脚本解析:要么把结构化数据渲染成对应LaTeX代码片段插入主模板,要么借助模板引擎直接渲染生成完整的可编译tex文件再编译,适合批量生成报告、证书等内容结构固定、数据量大的场景。
- 通常是否使用.tex文件实现该需求?
是。对于绝大多数没有特殊要求的场景,直接用.tex文件写宏定义存储内容是成本最低、兼容性最好的选择,不需要额外开发脚本,所有LaTeX编辑器都能直接识别编译,没有额外依赖。 - 是否可通过格式化txt文件、按行分隔内容的方式完成模板填充?
可以,但必须搭配编译前的预处理步骤,无法直接把自定义格式的txt文件丢给LaTeX编译器解析。如果只是自己用、不想额外写脚本,直接用.tex做配置文件是更简单的选择;如果需要给无LaTeX基础的人提供填写入口,自定义txt/结构化数据加预处理的方案更合适。
内容的提问来源于stack exchange,提问作者Hans Wurst

