Makefile用于多文件LaTeX文档

时间:2009-03-12 02:58:08

标签: latex makefile

我正在尝试简化/改进Makefile以编写我的论文。 Makefile非常适合编译整个文件;我有这样的事情:

show: thesis.pdf
    open thesis.pdf

thesis.pdf: *.tex
    pdflatex --shell-escape thesis

这允许我键入make并检测到任何更改(如果有),并在显示之前重新编译。

现在我想将它扩展为有条件地编译单个章节。例如,这允许我编写make xpmt以便以一种方式获得一个章节:

xpmt: ch-xpmt.pdf
    open ch-xpmt.pdf

ch-xpmt.pdf: xpmt.tex
    pdflatex --shell-escape --jobname=ch-xpmt \
      "\includeonly{xpmt}\input{thesis}"

但我不想为每个章节写下同样的内容。如何以足够的方式编写上述规则以避免重复?

(更多的练习是学习如何编写Makefile而不是解决任何真正的问题;显然在这种情况下复制和粘贴上面的代码实际上很简单!)

3 个答案:

答案 0 :(得分:8)

如果你的章节名为xpmt(猜测是“实验”?),比如thryanlsconc或其他:

xmpt thry anls conc: %: ch-%.pdf
    open $<

ch-%.pdf: %.tex
    pdflatex --shell-escape --jobname=ch-$* "\includeonly{$*}\input{thesis}"

或者用make变量做“正确”的方式,我认为它是这样的:

chapters = xmpt thry anls conc
main = thesis
.PHONY: $(chapters) show

show: $(main).pdf
    open $<

$(main).pdf: $(main).tex $(addsuffix .tex,$(chapters))
    pdflatex --shell-escape $(main)

$(chapters): %: ch-%.pdf
    open $<

ch-%.pdf: %.tex
    pdflatex --shell-escape --jobname=ch-$* "\includeonly{$*}\input{$(main)}"

答案 1 :(得分:2)

您应该考虑使用橡胶之类的东西来处理LaTeX建筑物。虽然可以使用make来完成大部分工作,但是专门的工具可以处理LaTeX的复杂性,例如多次重新运行bibtex以使所有引用排序等等。

答案 2 :(得分:2)

请考虑使用latexmk

http://www.phys.psu.edu/~collins/software/latexmk-jcc/

它确定是否需要运行pdflatex / latex,bibtex,makeindex等(以及完成编译源的次数)。

latexmk是一个perl脚本,包含在大多数latex分发中。您只需要确保在系统上安装了perl。