定义
latexmk是一个用Perl编写的脚本程序,其作用是自动完成LaTeX文档的生成过程。它接收文档的源文件,自行决定该调用哪些程序、以什么顺序调用,最终产出dvi、ps、pdf或硬拷贝形式的文档,并在交叉引用等信息解析完成之前反复运行编译程序[1]。
从定位上看,它相当于通用构建工具make的一个高度专门化的分支:make依据规则和目标文件的时间戳决定做什么,而latexmk把判断依据换成了LaTeX自身的编译产物,用来解决LaTeX文档需要多次编译才能稳定这一特有难题[1]。
原理
LaTeX文档的编号、目录、交叉引用和参考文献都依赖上一次编译写入辅助文件的信息,因此单次编译往往得到页码为问号、目录为空的中间结果。latexmk并不预先写死编译次数,而是先运行一次(LaTeX)编译,再读取该次运行产生的.fls、.log和.aux文件,从中推断出文档实际依赖了哪些文件、哪些引用尚未稳定[1]。
在此基础上,程序按需插入文献和索引处理步骤:若文档使用bbl文件,它会调用bibtex或biber重新生成,两者之中使用哪一个由latexmk自行判断;需要生成索引时则调用makeindex一类程序。之后它再补充运行若干次编译,直到所有引用都得到确定的值才停止[3][1]。
编译流程可以概括为:读取源文件依赖,判断是否需要文献或索引程序,反复调用编译引擎直至收敛。其流程大致如下:
flowchart TD
A[读取源文件与配置] --> B[运行一次 LaTeX 编译]
B --> C[解析 .fls/.log/.aux 依赖]
C --> D{引用是否已稳定}
D -- 否 --> E{需要 bibtex/biber 或 makeindex}
E -- 需要 --> F[运行相应辅助程序]
E -- 不需要 --> B
F --> B
D -- 是 --> G[输出 dvi/ps/pdf]
在连续预览模式下,程序会监视主文件以及被包含的TeX文件和图形文件,任一源文件发生变化即重新执行上述判断与编译,使预览器始终显示最新结果[1]。
发展历程
latexmk的源头是一个名为go的脚本,由David J. Musliner编写。此后伊万·麦克莱恩(Evan McLean)在其基础上改写,形成了latexmk,并以Perl脚本的形式发布,采用GNU通用公共许可证授权[1]。
此后该工具由约翰·柯林斯(John Collins)接手维护并持续更新,CTAN上的版权声明覆盖1998年至2025年[1]。版本迭代长期进行:2008年9月发布4.01版,改进了对nomencl、glossary等需要多轮文献或索引处理的宏包的支持[4];2011年11月上传4.28版,修正了bibtex或biber所需文件缺失时错误中止的问题[5];2020年前后版本号进入4.6x区间,2024年的4.85版、2025年的4.87版与2026年3月的4.88版相继发布[6]。
随着TeX发行版的发展,latexmk被收录进TeX Live和MiKTeX,成为其中随发行版一起安装的组件,在TeX Live 2009及之后的版本中可通过发行版自身的包管理器安装[1]。
应用
latexmk的典型用法是在命令行中指定主源文件,由它完成从编译到输出的全部步骤。默认情况下它生成dvi文件,可通过选项改为直接生成pdf,或经由dvi、PostScript中转生成pdf;也能指定使用latex、pdflatex、lualatex、xelatex等不同的编译引擎[7]。
在编辑器集成方面,latexmk常被配置为编辑器的编译后端。例如TeXShop一类编辑器就把它作为处理多轮编译任务的工具,用户在编辑器中触发编译时,实际执行的是latexmk[4]。连续预览模式则适合边写边看的场景,程序监视所有源文件,改动后自动重排[1]。
在使用方式上,latexmk支持通过初始化文件进行配置,配置文件用Perl语法书写,可放置于用户主目录或系统级目录,也支持命令行选项、环境变量和按项目设置的配置文件。用户可在其中修改变量,例如指定替代的编译程序、更改默认输出格式或调整清理行为。
相关的辅助操作也被一并纳入:命令行可以要求仅执行清理,删除编译过程中产生的可再生成的日志、辅助文件等,或连同dvi、PostScript、pdf一并删除;也可指定中间文件与最终输出的存放目录,避免多轮编译过程中预览器反复刷新出中间状态的文档[8][3]。
局限
latexmk对文件依赖的判断建立在编译过程留下的.fls、.log和.aux等文件之上,若源文件以latexmk无法识别的方式引入外部依赖,它就可能遗漏应执行的步骤,或做出错误的判断。文档中自定义的编译步骤通常需要用户手工在配置文件中声明[1]。
对参考文献的处理存在若干边界情况。当bib文件不存在时,默认设置会跳过bibtex或biber以避免覆盖已有的bbl文件,但这一保护在使用biber时并不生效,可能产生内容不正确的bbl文件。另外,latexmk与bibtex、biber搜索路径不一致时,也可能出现文件实际存在而工具判断为不存在的情形[3]。
文件名方面有限制:美元符号、百分号、反斜杠、波浪号、双引号以及若干控制字符属于被禁止或在编译程序中有问题的字符,latexmk在检测到这些字符时会报出致命错误并停止,以与后端编译程序的行为保持一致[2]。
工具本身不能保证编译成功。如果文档存在语法错误,或多轮编译始终无法收敛,latexmk只能如实反映底层编译程序的报错与循环状态,具体问题仍需回到文档源文件排查[1]。
参见
参考资料
- Directory support/latexmk [引用日期2026-10-14]
- latexmk.1.en [引用日期2026-10-14]
- latexmk [引用日期2026-10-14]
- [OS X TeX] Latexmk 4.01 is released to CTAN [引用日期2026-10-14]
- CTAN package upload: latexmk [引用日期2026-10-14]
- barak/latexmk · GitHub [引用日期2026-10-14]
- latexmk [引用日期2026-10-14]
- latexmk(1) — latexmk — Debian testing [引用日期2026-10-14]