![Makefileを使用して複数のファイルに出力する](https://rvso.com/image/89178/Makefile%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E8%A4%87%E6%95%B0%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AB%E5%87%BA%E5%8A%9B%E3%81%99%E3%82%8B.png)
私は、マークダウン形式のファイルをLaTeXテンプレートを使って.pdfに変換するのに使うmakefileを持っています。現時点では、これは一度に1つのファイルでしか動作しません。しかし、makefileをどれでもアクティブ ディレクトリに markdown ファイルを作成し、1 回の make コマンドで同じ名前の .pdf に出力します。たとえば、次のようになります。
Foo.md ---> Foo.pdf
バー.md ---> バー.pdf
現在の makefile は次の通りです:
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