我希望用一个命令包含目录 /pdfs 中的所有 PDF,这样我只需将新的 PDF 放入目录中,而不必担心每次编译时实际执行它们。就像这样:
\includepdf[pages=-]{pdfs/some.pdf}
\includepdf[pages=-]{pdfs/random.pdf}
\includepdf[pages=-]{pdfs/pdf.pdf}
\includepdf[pages=-]{pdfs/files.pdf}
...
但例如
\includepdf[pages=-]{pdfs/*}
在我的文档的末尾。
pdfjam * -o all_files.pdf
我目前所做的是在目录中运行命令,删除新文件,并将其保存\includepdf[pages=-]{pdfs/all_files.pdf}
在我的文档中。但这是一个有点繁琐和无意义的练习,我觉得应该有一种更简单的方法。
有任何想法吗?
答案1
您可以编写一个 Makefile,将所有文件名转储到辅助宏(空格分隔,确保没有文件名包含空格)中,然后由 LaTeX 进行解析。
Makefile,更改my_latex_file.tex
为 .tex 文件的实际文件名(重要的:Makefile 中的缩进必须是制表符,而不是空格)
PDFS = $(wildcard pdfs/*.pdf)
TEX = pdflatex
main: my_latex_file.tex $(PDFS)
$(TEX) -jobname="$(<:%.tex=%)" "\def\mypdffiles{$(PDFS)}\input{$<}"
还有一个小型 LaTeX 文件,其中包含宏中包含的每个 PDF \mypdffiles
(如果已定义):
\documentclass[]{article}
\usepackage{pdfpages}
\usepackage{xparse}
\ExplSyntaxOn
\seq_new:N \l_elade_pdf_files_seq
\msg_new:nnn { elade } { missing-macro }
{ The~macro~#1 doesn't~exist. }
\NewDocumentCommand \IncludePDFs { O{} }
{
\cs_if_exist:NTF \mypdffiles
{
\seq_set_split:NnV \l_elade_pdf_files_seq { ~ } \mypdffiles
\seq_map_inline:Nn \l_elade_pdf_files_seq
{
\includepdf [ { #1 } ] { ##1 }
}
}
{ \msg_error:nnn { elade } { missing-macro } { \mypdffiles } }
}
\ExplSyntaxOff
\begin{document}
\IncludePDFs[pages=-]
\end{document}
然后使用make
而不是pdflatex
(或任何版本)进行编译。您可能需要稍微扩展 Makefile 以覆盖所有内容,或者将其设置为调用(arara
如果您愿意的话)。