перебирать pdf файлы с pdfcrop в make-файле и назначать зависимости - PullRequest
0 голосов
/ 05 октября 2019

Я могу перебирать pdf-файлы (картинки) в моем make-файле, чтобы обрезать поля. Для этого я использую функцию pdfcrop TexLive в Windows 10. Но сейчас я не могу создать зависимость. Если pdf-файл не обрезан или в моей папке с изображениями есть новый pdf-файл, который не обрезан, pdfcrop обрежет поля и сохранит его с тем же именем в той же папке (так что фактически переопределит старый pdf-файл). Я думаю, что это может быть легко, но я просто не могу понять, как это сделать. Это мой код в make-файле.

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

Ответы [ 2 ]

0 голосов
/ 05 октября 2019

Альтернативное решение, которое (будем надеяться) проверит метку времени для каждого файла 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

Модификация для размещения файлов «обрезки» в папке временных меток

TS_DIR=ts
CROP_FILES = ${FIG_FILES:${FIG_DIR}/%=${TS_DIR}/%.crop}

${TS_DIR}/%.crop: ${FIG_DIR}/%
        @mkdir -p ${TS_DIR}
        pdfcrop $< $<
        touch $@

Предлагает провести дополнительное тестирование, поскольку логика более сложная. Цель «% .crop» заменяется правилом для генерации их в $ {TS_DIR}

0 голосов
/ 05 октября 2019

Если вы сохранили обрезанный файл с тем же именем, что и исходный файл 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, чтобы выполнить проверку каждого из них и повысить производительность.

...