Makefile을 사용하여 여러 파일로 출력

Makefile을 사용하여 여러 파일로 출력

라텍스 템플릿을 통해 마크다운 파일을 .pdf로 변환하기 위한 메이크파일이 있습니다. 현재 이 방법은 한 번에 하나의 파일에만 작동합니다. 그러나 makefile을 실행하고 싶습니다.어느활성 디렉터리에 markdown 파일을 저장하고 단일 make 명령을 사용하여 동일한 이름의 .pdf로 출력합니다. 예를 들어 다음과 같은 정보가 있을 수 있습니다.

Foo.md ---> Foo.pdf

bar.md ---> bar.pdf

내 현재 메이크파일은 여기에 있습니다:

TEX = pandoc
MEXT = md
src = template.tex $(wildcard *.$(MEXT))
FLAGS = --latex-engine=xelatex

letter.pdf : $(src)
$(TEX) $(filter-out $<,$^ ) -o $@ --template=$< $(FLAGS)

.PHONY: clean
clean :
rm output.pdf

귀하의 조언에 감사드립니다...

답변1

이 시도:

TEX = pandoc
MEXT = md
SRC = $(wildcard *.$(MEXT))
PDFS = $(SRC:.md=.pdf)
TMP = template.tex
FLAGS = --latex-engine=xelatex

all:    ${PDFS}

%.pdf:  %.md ${TMP}
        ${TEX} $(filter-out $<,$^ ) -o $@ --template=${TMP} $(FLAGS) $<


.PHONY: clean
clean:
        rm *.pdf

답변2

완전히 테스트하지는 않았지만 일부 수정을 통해 작동해야 한다고 생각합니다. for 루프를 사용하세요:

TEX = pandoc
MEXT = md
SRC = $(wildcard *.$(MEXT))
TMP = template.tex
FLAGS = --latex-engine=xelatex

letter.pdf : 
    $(foreach i, $(SRC), $(TEX) -o $(i).pdf --template=$(TMP) $(FLAGS) $(i);)

.PHONY: clean
clean :
    rm -f *.pdf

또한 이 솔루션은 pdf정확히 동일한 이름의 파일을 생성하지 않습니다 md.

foo.md -> foo.md.pdf

하지만 고치는 것이 어렵지는 않습니다.

답변3

# List files to be made by finding all *.md files and appending .pdf

PDFS := $(patsubst %.md,%.md.pdf,$(wildcard *.md))

# The all rule makes all the PDF files listed
all : $(PDFS)

# This generic rule accepts PDF targets with corresponding Markdown 
# source, and makes them using pandoc
%.md.pdf : %.md
    pandoc --latex-engine=xelatex $< -o $@

# Remove all PDF outputs
clean :
    rm $(PDFS)

# Remove all PDF outputs then build them again
rebuild : clean all

관련 정보