用于 gnuplot(许多数字)和乳胶集成的 Makefile
Makefile for gnuplot (Many figures) and latex integration
问题:如何获得可以检查任意数量的 *.eps 和 *.gp(gnuplot 代码)并具有从新编辑的文件构建新的 *.eps 和 *.tex 文件的规则*.gp 文件?
目标:
创建一个 Makefile 来检查我的任何章节 (.tex)、绘图 (.eps、.tex) 或 gnuplot 代码 (.gp ) 自上次编译以来发生了变化。创建一个在编译文档之前执行必要的 *.gp 代码的通用规则。
编辑:关于目标的更多细节:我希望 Make 构建 Thesis.pdf 但在此之前执行自上次构建以来已更改的任何 foo.gp
文件。 .gp 文件可能会因多种原因而更新,包括更改轴标签、图例条目、添加数据...
背景:我正在写我的论文,打算同时使用 LaTex 和 GNUPlot。由于大量的数字,将一个 makefile 放在一起似乎是一个很好的调用,它确保如果我的任何 gnuplot 代码 (*.gp) 被更改,必要的代码将被执行(而未更改的 *.gp 代码则不会)在编译乳胶文件之前。我正在使用 epslatex 生成 *.eps 和 *.tex 文件(与 \input 一起使用——不是独立的)。如果示例代码中的内容不是很清楚,这是我第一次尝试生成文件。
编辑:关于 GNUPlot 的更多细节
gnuplot foo.gp
生成 foo.eps
(包括绘图的所有图形部分)和 foo.tex
(格式化图形并添加所有必要文本的 tex 文件)。 foo.gp
是一个构建绘图的脚本(很像在 MatLab 中绘图或在 python 中使用 MatPlotLib 绘图)。 foo.tex
文件在latex图形环境中用作\intut{foo.tex}
。我可能会有大约 100 个数字,我的顾问无疑会让我编辑到令人作呕的地步,这意味着我将反复编辑许多不同的 gnuplot 脚本。
目录结构:
根目录:~/论文
Latex 文件目录:~/dissertation/text(这也是我的 makefile 当前所在的位置)
Gnuplot 代码目录:~/dissertation/figures/gnuplot_codes
Gnuplot 输出目录:~/dissertation/figures/figs
到目前为止,这是我的代码:
PAPER=Thesis
CODES=$(wildcard ../figures/gnuplot_codes/*.gp) # list of all gnuplot scripts
EPSES=$(wildcard ../figures/figs/*.eps) # list of all eps files
FIGTEX=$(wildcard ../figures/figs/*.tex) # list of all associated tex files
all: $(EPSES) $(FIGTEX) $(CODES) $(PAPER).pdf
evince $(PAPER).pdf
# This is the line I can't figure out ---
# if any of the gnuplot codes are updated it runs all of them
$(EPSES) $(FIGTEX): $(CODES)
gnuplot $(CODES)
# compiles the latex document using latexmk
$(PAPER).pdf: $(PAPER).tex $(EPSES) $(FIGTEX) $(CODES)
latexmk -latex="latex -interaction=nonstopmode" -use-make $<
dvips $(PAPER).dvi -Ppdf
ps2pdf $(PAPER).ps
# This catches any missing *.eps files thrown back from latexmk
# I feel like I should have a way of checking before
# running $(PAPER).pdf rule
../figures/figs/%.eps: ../figures/gnuplot_codes/%.gp
gnuplot $<
# same as the rule above but for *.tex
../figures/figs/%.tex: ../figures/gnuplot_codes/%.gp
gnuplot $<
# this cleans all the latex files
clean:
latexmk -CA
我们将从现有 gp 文件列表开始:
CODES=$(wildcard ../figures/gnuplot_codes/*.gp)
到目前为止,还不错。该列表告诉我们存在哪些 gp 文件,因此可以构建哪些 eps 和 tex 文件。 (我们不关心哪些已经存在。)
EPSES=$(patsubst ../figures/gnuplot_codes/%.gp,../figures/figs/%.eps, $(CODES))
FIGTEX=$(patsubst ../figures/gnuplot_codes/%.gp,../figures/figs/%.tex, $(CODES))
现在 运行 gnuplot 的规则并生成这些文件。这个版本的问题:
$(EPSES) $(FIGTEX): $(CODES)
gnuplot $(CODES)
是它使所有 gp文件成为每个 eps和tex文件的先决条件;更改一个 gp 文件,您必须重建所有内容。所以摆脱它并用 pattern rule:
替换它
../figures/figs/%.eps ../figures/figs/%.tex: ../figures/gnuplot_codes/%.gp
gnuplot $<
(我不知道 gnuplot 如何知道将其输出文件放在哪里;你没有指定,所以我假设你已经解决了那部分问题。如果你遇到问题,我'我们很乐意提供帮助。)
现在 Thesis.pdf
规则:
# compiles the latex document using latexmk
$(PAPER).pdf: $(PAPER).tex $(EPSES) $(FIGTEX)
latexmk -latex="latex -interaction=nonstopmode" -use-make $<
dvips $(PAPER).dvi -Ppdf
ps2pdf $(PAPER).ps
我删除了先决条件 $(CODES)
,因为它似乎是多余的。配方可能会得到改进(并推广以生成其他 pdf 文件)但是嘿,如果它没有坏...
最后是 运行 显示的规则(如果您希望它成为默认设置,则应该排在第一位):
all: $(EPSES) $(FIGTEX) $(CODES) $(PAPER).pdf
evince $(PAPER).pdf
除非evince
实际上使用 gp、eps 和tex 文件,否则我们可以不用这些先决条件:
all: $(PAPER).pdf
evince $<
试一试。
问题:如何获得可以检查任意数量的 *.eps 和 *.gp(gnuplot 代码)并具有从新编辑的文件构建新的 *.eps 和 *.tex 文件的规则*.gp 文件?
目标: 创建一个 Makefile 来检查我的任何章节 (.tex)、绘图 (.eps、.tex) 或 gnuplot 代码 (.gp ) 自上次编译以来发生了变化。创建一个在编译文档之前执行必要的 *.gp 代码的通用规则。
编辑:关于目标的更多细节:我希望 Make 构建 Thesis.pdf 但在此之前执行自上次构建以来已更改的任何 foo.gp
文件。 .gp 文件可能会因多种原因而更新,包括更改轴标签、图例条目、添加数据...
背景:我正在写我的论文,打算同时使用 LaTex 和 GNUPlot。由于大量的数字,将一个 makefile 放在一起似乎是一个很好的调用,它确保如果我的任何 gnuplot 代码 (*.gp) 被更改,必要的代码将被执行(而未更改的 *.gp 代码则不会)在编译乳胶文件之前。我正在使用 epslatex 生成 *.eps 和 *.tex 文件(与 \input 一起使用——不是独立的)。如果示例代码中的内容不是很清楚,这是我第一次尝试生成文件。
编辑:关于 GNUPlot 的更多细节
gnuplot foo.gp
生成 foo.eps
(包括绘图的所有图形部分)和 foo.tex
(格式化图形并添加所有必要文本的 tex 文件)。 foo.gp
是一个构建绘图的脚本(很像在 MatLab 中绘图或在 python 中使用 MatPlotLib 绘图)。 foo.tex
文件在latex图形环境中用作\intut{foo.tex}
。我可能会有大约 100 个数字,我的顾问无疑会让我编辑到令人作呕的地步,这意味着我将反复编辑许多不同的 gnuplot 脚本。
目录结构:
根目录:~/论文
Latex 文件目录:~/dissertation/text(这也是我的 makefile 当前所在的位置)
Gnuplot 代码目录:~/dissertation/figures/gnuplot_codes
Gnuplot 输出目录:~/dissertation/figures/figs
到目前为止,这是我的代码:
PAPER=Thesis
CODES=$(wildcard ../figures/gnuplot_codes/*.gp) # list of all gnuplot scripts
EPSES=$(wildcard ../figures/figs/*.eps) # list of all eps files
FIGTEX=$(wildcard ../figures/figs/*.tex) # list of all associated tex files
all: $(EPSES) $(FIGTEX) $(CODES) $(PAPER).pdf
evince $(PAPER).pdf
# This is the line I can't figure out ---
# if any of the gnuplot codes are updated it runs all of them
$(EPSES) $(FIGTEX): $(CODES)
gnuplot $(CODES)
# compiles the latex document using latexmk
$(PAPER).pdf: $(PAPER).tex $(EPSES) $(FIGTEX) $(CODES)
latexmk -latex="latex -interaction=nonstopmode" -use-make $<
dvips $(PAPER).dvi -Ppdf
ps2pdf $(PAPER).ps
# This catches any missing *.eps files thrown back from latexmk
# I feel like I should have a way of checking before
# running $(PAPER).pdf rule
../figures/figs/%.eps: ../figures/gnuplot_codes/%.gp
gnuplot $<
# same as the rule above but for *.tex
../figures/figs/%.tex: ../figures/gnuplot_codes/%.gp
gnuplot $<
# this cleans all the latex files
clean:
latexmk -CA
我们将从现有 gp 文件列表开始:
CODES=$(wildcard ../figures/gnuplot_codes/*.gp)
到目前为止,还不错。该列表告诉我们存在哪些 gp 文件,因此可以构建哪些 eps 和 tex 文件。 (我们不关心哪些已经存在。)
EPSES=$(patsubst ../figures/gnuplot_codes/%.gp,../figures/figs/%.eps, $(CODES))
FIGTEX=$(patsubst ../figures/gnuplot_codes/%.gp,../figures/figs/%.tex, $(CODES))
现在 运行 gnuplot 的规则并生成这些文件。这个版本的问题:
$(EPSES) $(FIGTEX): $(CODES)
gnuplot $(CODES)
是它使所有 gp文件成为每个 eps和tex文件的先决条件;更改一个 gp 文件,您必须重建所有内容。所以摆脱它并用 pattern rule:
替换它../figures/figs/%.eps ../figures/figs/%.tex: ../figures/gnuplot_codes/%.gp
gnuplot $<
(我不知道 gnuplot 如何知道将其输出文件放在哪里;你没有指定,所以我假设你已经解决了那部分问题。如果你遇到问题,我'我们很乐意提供帮助。)
现在 Thesis.pdf
规则:
# compiles the latex document using latexmk
$(PAPER).pdf: $(PAPER).tex $(EPSES) $(FIGTEX)
latexmk -latex="latex -interaction=nonstopmode" -use-make $<
dvips $(PAPER).dvi -Ppdf
ps2pdf $(PAPER).ps
我删除了先决条件 $(CODES)
,因为它似乎是多余的。配方可能会得到改进(并推广以生成其他 pdf 文件)但是嘿,如果它没有坏...
最后是 运行 显示的规则(如果您希望它成为默认设置,则应该排在第一位):
all: $(EPSES) $(FIGTEX) $(CODES) $(PAPER).pdf
evince $(PAPER).pdf
除非evince
实际上使用 gp、eps 和tex 文件,否则我们可以不用这些先决条件:
all: $(PAPER).pdf
evince $<
试一试。