我正在尝试简化/改进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而不是解决任何真正的问题;显然在这种情况下复制和粘贴上面的代码实际上很简单!)
答案 0 :(得分:8)
如果你的章节名为xpmt
(猜测是“实验”?),比如thry
,anls
,conc
或其他:
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
它确定是否需要运行pdflatex / latex,bibtex,makeindex等(以及完成编译源的次数)。
latexmk
是一个perl脚本,包含在大多数latex分发中。您只需要确保在系统上安装了perl。