答案1
这是一个相当笼统的问题,所以很难写下完整的答案。我将讨论我何时使用制作当我使用时latexmk
。
latexmk
是一个编译文件的工具.tex
,仅此而已。但是,它擅长确定哪些文件依赖于哪些其他文件:您不需要提供列表,因此latexmk main
只有在依赖关系main.tex
发生变化时才会重新编译。latexmk
如果需要,还会编译文件两到三次(例如,用于参考书目、索引或超链接更新)。
Make 更为通用,但需要明确描述文件的依赖关系以及如何编译它。此信息通常位于名为 的文件中makefile
。假设main
依赖于main.tex
、macros.tex
和eggs.tex
,并且有时需要编译两次。那么 makefile 可能如下所示:
# example makefile
INPUTS = main.tex macros.tex eggs.tex
COMPILER = pdflatex --halt-on-error
main.pdf: $(INPUTS)
$(COMPILER) main.tex
$(COMPILER) main.tex
手动指定依赖项和编译指令需要做更多工作,尤其是因为它们在整个项目中可能会发生变化。但 Make 的优势在于它可以执行任何命令。如果您的最终文件依赖于运行某些统计测试并将结果包含在您的文档中,Make 可以运行该测试。如果您的文件包含代码清单,latexmk
不知道要监视它们是否有变化,但$(INPUTS)
如果您使用 Make,您可以更新以包含它们。
Make 的另一个用途是在编译后自动对输出文件进行一些操作。
总之,Make 更为复杂,但能够处理非 TeX 依赖项,因此仅当您具有非 TeX 依赖项或需要进行后处理时才使用它。
此类依赖关系的示例:
- 非 TeX 语言的源代码列表
- 根据数据自动生成的统计图表或统计分析
- 从输入或数据自动生成的图像
- 从“外部世界”获得的信息,例如用户或互联网
后处理示例:
- 将输出 PDF 转换为图像
- 将输出 PDF 移动到另一个目录
- 压缩输出 PDF
答案2
我想
makefile
知道
命令make
通常指的是GNU 制作或者BSD 制作。每个变体都有其优点;不同之处在于高级用途,此处不作讨论。无论使用哪种变体,make
都期望找到名为
Makefile
,其中包含有关哪些文件的配方(所谓的目标)从其他文件构建(所谓的依赖项) 以及要使用哪些命令来构建目标。
make
然后确定需要构建或重建哪些目标并发出所需的命令。要点:
- 您必须写一份
Makefile
所需的食谱。 make
针对给定目标执行每个重建命令最多一次这对于 LaTeX 文档处理来说很不幸,因为pdflatex
可能需要多次运行。make
通过查看文件最后写入时间来检测依赖项的变化。但每次pdflatex
运行都会写入一个.aux
文件,因此下次make
运行将表现为.aux
文件已更改,无论其实际内容是否已更改。
因此,如果你想制定一个不断重复运行pdflatex
直到.aux
文件内容不再改变的配方,这不是一件容易的事情make
。通过很多复杂的技术和一些技巧,可能的
来制定有用的Makefile
,但它的配方往往看起来非常复杂。
latexmk
专门用于基于 LaTeX 的文档处理。它知道如何使用各种*tex
程序和辅助工具,如
bibtex
、biber
或makeindex
。它不需要Makefile
,它可以根据需要重复命令,并且它通过查看文件内容(实际上是校验和)而不是最后写入时间来检测更改。
当我需要同时使用
makefile
而latexmk
不是latexmk
只使用
有答案
提出一个Makefile
片段,使make
执行与 相同的操作latexmk -pdf
。事实上,这样的make
会将文档处理细节委托给 ,并latexmk -pdf
添加一些花哨的选项。那么为什么要使用make
呢?
如果您只是想要 的功能latexmk
,则不需要make
。但是,
- 您可以添加更多配方,
Makefile
以便make
除了处理 LaTeX 文档之外还能做更多的事情。参见Arun 的回答。我通常会添加编译程序、运行测试、制作插图等的配方。 - 开源软件的普遍用户预计这
make
将构建他们想要的文件。通过提供合适的Makefile
,可以满足这一期望。 make
键入起来更简洁。如果你经常重新编译,这些事情就很重要。
如果以上原因对你没有吸引力,你可以总结如下:
make
withlatexmk
适用于已经习惯并make
认识到 实用性的用户latexmk
。