我想创建单个 LaTeX 源的两个 pdf 输出文件。
一个输出文件是公开的,而另一个(包含更多信息)则变为私有。
我使用 make 文件,它使用 find 来 grep 目录中的 tex 文件。这是一个简单的解决方案,因为这样我可以在许多项目中重用 makefile,而无需修改其内容。
这是makefile 的重要部分。
all:
# This creates the public output file
find -name *.tex -exec sh -c 'pdflatex {}' \;
现在我想添加另一行来创建私有输出文件。它应该看起来像这样:
all:
# This creates the public output file
find -name *.tex -exec sh -c 'pdflatex {}' \;
# This creates the private output file
find -name *.tex -exec sh -c 'pdflatex --jobname=ABC '\def\privatflag{}\input{XYZ}' {}' \;
对于 ABC,我寻找一种解决方案来指定默认文件名但带有前缀。
对于 XYZ,我寻找一种解决方案来在此处传递输入文件名。
我认为内部引号的使用在这里也不正确。
更新1: 也许我可以用更简单的方式解释这个问题。
该命令在命令 shell 中运行:
pdflatex --jobname=outputfile '\def\privatflag{}\input{inputfile.tex}'
但我正在寻找一种使用它的解决方案,find -name *.tex -exec
这样我就不需要指定输入文件名 inputfile.tex。
另外,我还在寻找一种不需要指定的方法--jobname=outputfile
。它应该使用附加前缀匹配输入文件名。
这是现在 makefile 的重要部分
all:
# This creates the public output file
find -name *.tex -exec sh -c 'pdflatex {}' \;
# This creates the private output file
find . -name '*.tex' -execdir sh -c 'pdflatex --jobname=privat_"$${1##*/}" "\def\privatflag{""}\input{$${1##*/}}"' {}-job {} \;
答案1
从你的例子来看,我认为你需要的是:
find . -name '*.tex' -execdir sh -c 'pdflatex --jobname=foo"${1##*/}" "\def\privatflag{""}\input{${1##*/}}"' {}-job {} \;
分解它:
-execdir
在找到该文件的目录中运行该命令。${1##*/}
从 给出的参数中去除路径find
。- in
""
是{}
为了防止find
替换{}
成匹配的路径。
sh -c
需要处理 find 给出的路径并仅提取文件名。
答案2
由于您已经在使用 Makefile,因此您可以用 make 自己的机制来替换您的文件来处理文件,假设您的文件位于当前目录中的find
简单情况。.tex
例如,这个 makefile 可能就足够了:
ALLTEX = $(wildcard *.tex)
ALLPDF = $(ALLTEX:.tex=.pdf) $(ALLTEX:.tex=.internal.pdf)
%.pdf: %.tex
pdflatex $<
%.internal.pdf: %.tex
pdflatex --jobname=$@ '\def\privatflag{}\input{$<}'
all: $(ALLPDF)
变量 ALLTEX 保存所有输入文件的名称,ALLPDF 通过将后缀替换.tex
为.pdf
另一个后缀来转换这些名称,这样您就可以获得两倍数量的所需输出文件。
接下来的 2 行设置了一个规则,说明如何从 tex 文件生成 pdf 文件,接下来的 2 行设置了另一个规则,说明如何生成其他后缀。将被输入文件和输出文件名$<
替换。$@
最后,真正的目标all:
说这取决于想要的pdf文件。使用 make 规则的优点是,如果源 tex 文件没有更改,则不会重建 pdf。