这是我第一次使用 GNU make 尝试做一些不太基本的事情。我希望 Makefile 的默认目标能够查找多个匹配文件名中的任何一个,这是我认为是根 tex 文件的命名方案,表达如下:
#!/usr/bin/env bash
# this is just a sketch, I know this is inaccurate
# and simplified by make's standard...
# mainfiles := main letter report course
mainfiles=(main letter report course)
_readable(){
if ([ -f "$1" ] && [ -r "$1" ]); then
return 0
fi
return 1
}
# how to make all of these existing targets using GNU make?
# all: $(patsubst %, %.tex, $$(mainfiles))
all() {
for base in $mainfiles[@]; do
if _readable "${base}.tex"; then
latexmk -pdfxe "${base}.tex"
fi
done
}
# clean:
# latexmk -c
clean(){
latexmk -c
}
我不确定如何将其变成 makefile。
编辑:
@G-Man 指出我的问题充其量是不清楚的。确实我很着急,我也不知道自己想要什么。我想想偷懒,而:make
不是使用 vim 中精美的自动编译插件。
关键是我曾经JOBNAME
在一个通用 Makefile 中编辑一个变量,该 Makefile 依赖于我的所有 (la|xe|lua)tex 项目的 Latexmk。当我在 vim 中打开任何一个不存在的文件 main.tex letter.tex course.tex 等时,我让它触发一个自动命令来读取相应的骨架文件,复制我的通用 Makefile 并git init
在没有.git
文件夹的情况下运行。通常我的文件夹中只有其中一个.tex
文件,但也可能有更多。
由于预编译步骤,我想要一个 makefile(使用mylatex格式),一些更细粒度的清理命令以及诸如FILTER = 2>&1 | sed -n '/^\(Running\|Package\|Beginning\|Underfull\)/p;/^! /,$$p'
我可以添加到编译器命令之前的命令。例如,预编译步骤会检查@if ((
grep -c endofdump $(TMP)/$(JOBNAME).tex == 1 )); then ...
。
我的问题是通过懒惰的尝试来理解,以避免指定JOBNAME
,以便任何文件 main.tex letter.tex course.tex 等都使用相同的依赖项进行处理,可能是 rsync 和执行检查的预编译步骤,以及需要$JOBNAME.pdf
进行的编译步骤。
我使用花括号是${mainfiles[@]}
为了我认为很好的做法。我包含了-f
和-r
测试,因为我认为 make 也会检查这一点。
JOBNAME
不管怎样,@meuh 的回答很有帮助,但我重新审视了 make 的使用,因为我认为由于灵活性和未来的使用,编辑仍然是一个更好的选择。我现在用 vim 的力量改变它(参见我在 github 上的 vim 仓库)
答案1
这不是 make 的一个特别好的用法,因为没有依赖项,但也许您稍后会添加它们,所以这里是一个可能的开始:
MAINFILES = main letter report course
T = $(addsuffix .tex,$(MAINFILES))
default: ${T}
${T}:
@if [ -f "$@" -a -r "$@" ]; then latexmk -pdfxe "$@"; else :;fi
clean:
latexmk -c
.PHONY: ${T} clean
默认目标是main.tex
etc。要构建该文件或其他文件,没有依赖性,因此运行一行shell脚本来测试文件的存在性和可读性,然后运行所需的命令。该else
部分的作用是,如果文件不存在,make 不会因错误而停止。
有一个需要.PHONY
目标的复杂情况,否则当文件存在时 make 将看到不存在依赖关系并且不会执行任何操作。如果您clean
在目录中调用了一个文件,这也适用于干净的目标。
答案2
听起来你只需要一个简单的 Makefile 来知道如何从 TeX 制作 PDF:
all: $(patsubst %.tex,%.pdf,$(wildcard *.tex))
%.pdf: %.tex
latexmk -pdfxe $<
.PHONY: all
.DELETE_ON_ERROR: