在makefile中使用pdfcrop遍历pdf文件并分配依赖项

问题描述 投票:0回答:2

我能够遍历我的Makefile中的pdf文件(图片)以裁剪边距。为此,我在Windows 10上使用TexLive的pdfcrop函数。但是现在,我无法创建依赖项。如果没有裁剪pdf文件,或者在我的图片文件夹中没有裁剪新的pdf文件,则pdfcrop将裁剪页边距并将其以相同的名称保存在同一文件夹中(因此实际上会覆盖旧的pdf文件)。我认为这可能很容易,但是我不知道该怎么做。这是我在生成文件中的代码。

MAIN_FILE = Dissertation
FIG_DIR  = ./Bilder/Abbildungen
FIG_FILES  := $(wildcard $(FIG_DIR)/*.pdf)

all: $(MAIN_FILE).pdf

$(MAIN_FILE).pdf: $(MAIN_FILE).tex $(CROP_FILES)
    pdflatex $(MAIN_FILE).tex

CROP_FILES = ${FIG_FILES:%=%.crop}

$(CROP_FILES): $(FIG_FILES) # this line doesn't seem work correctly
    $(foreach FIG_FILE, $(FIG_FILES), $(call CROP, $(FIG_FILE)))

define CROP
    pdfcrop $(1) $(1).crop

endef
makefile latex crop gnu
2个回答
0
投票

如果以与原始PDF文件相同的名称存储裁剪后的文件,Make将无法确定是否裁剪了特定文件。作为替代方案,请考虑以其他方式命名裁剪的文件(例如,filename.pdf.crop)

    # Add '.crop' suffix to the original file name
CROP_FILES = ${FIG_FILES:%=%.crop}

    # Recreate ALL CROPPED files, on changes to ANY source file
$(CROP_FILES): $(FIG_FILES) # this line doesn't seem work correctly
    $(foreach FIG_FILE, $(FIG_FILES), $(call CROP, $(FIG_FILE)))

    # Based on doc, 2nd parameter to pdfcrop name the output file.
define CROP
    pdfcrop $(1) $(1).crop

endef

请注意,添加单个PDF文件后,此版本将重新裁剪所有PDF文件。如果这是一项耗时的操作,则可以扩展Makefile来对每个文件进行检查,并提高性能。


0
投票

替代解决方案,它将(希望)检查每个PDF文件的时间戳,并仅在更新/新文件上激活CROP。

裁切后的文件保留相同的文件名。如果'.crop'文件的时间戳比'pdf'文件新,则表示文件被裁剪,否则,将裁剪PDF文件,并触摸'.crop'文件。

MAIN_FILE = Dissertation
FIG_DIR  = ./Bilder/Abbildungen
FIG_FILES  := $(wildcard $(FIG_DIR)/*.pdf)

all: $(MAIN_FILE).pdf

    # The '.crop' timestamp capture the time the file was cropped
CROP_FILES=${FIG_FILES:%=%.crop}

%.crop: %
        pdfcrop $<
        touch $@

$(MAIN_FILE).pdf: $(MAIN_FILE).tex $(CROP_FILES)
        pdflatex $(MAIN_FILE).tex

© www.soinside.com 2019 - 2024. All rights reserved.