Skip to content

Instantly share code, notes, and snippets.

@kristopherjohnson
Last active March 14, 2024 20:42
Show Gist options
  • Star 64 You must be signed in to star a gist
  • Fork 19 You must be signed in to fork a gist
  • Save kristopherjohnson/7466917 to your computer and use it in GitHub Desktop.
Save kristopherjohnson/7466917 to your computer and use it in GitHub Desktop.
Makefile that uses Pandoc to generate HTML, PDF, DOCX, etc. from Markdown source files
# Makefile
#
# Converts Markdown to other formats (HTML, PDF, DOCX, RTF, ODT, EPUB) using Pandoc
# <http://johnmacfarlane.net/pandoc/>
#
# Run "make" (or "make all") to convert to all other formats
#
# Run "make clean" to delete converted files
# Convert all files in this directory that have a .md suffix
SOURCE_DOCS := $(wildcard *.md)
EXPORTED_DOCS=\
$(SOURCE_DOCS:.md=.html) \
$(SOURCE_DOCS:.md=.pdf) \
$(SOURCE_DOCS:.md=.docx) \
$(SOURCE_DOCS:.md=.rtf) \
$(SOURCE_DOCS:.md=.odt) \
$(SOURCE_DOCS:.md=.epub)
RM=/bin/rm
PANDOC=/usr/local/bin/pandoc
PANDOC_OPTIONS=--smart --standalone
PANDOC_HTML_OPTIONS=--to html5
PANDOC_PDF_OPTIONS=
PANDOC_DOCX_OPTIONS=
PANDOC_RTF_OPTIONS=
PANDOC_ODT_OPTIONS=
PANDOC_EPUB_OPTIONS=--to epub3
# Pattern-matching Rules
%.html : %.md
$(PANDOC) $(PANDOC_OPTIONS) $(PANDOC_HTML_OPTIONS) -o $@ $<
%.pdf : %.md
$(PANDOC) $(PANDOC_OPTIONS) $(PANDOC_PDF_OPTIONS) -o $@ $<
%.docx : %.md
$(PANDOC) $(PANDOC_OPTIONS) $(PANDOC_DOCX_OPTIONS) -o $@ $<
%.rtf : %.md
$(PANDOC) $(PANDOC_OPTIONS) $(PANDOC_RTF_OPTIONS) -o $@ $<
%.odt : %.md
$(PANDOC) $(PANDOC_OPTIONS) $(PANDOC_ODT_OPTIONS) -o $@ $<
%.epub : %.md
$(PANDOC) $(PANDOC_OPTIONS) $(PANDOC_EPUB_OPTIONS) -o $@ $<
# Targets and dependencies
.PHONY: all clean
all : $(EXPORTED_DOCS)
clean:
- $(RM) $(EXPORTED_DOCS)
@sstevens2
Copy link

Really like this makefile and would like to use it. What license is it under?

@elizabethmcd
Copy link

I also really like this! Is this under an open source license?

@aWeinzierl
Copy link

hmm?

@floriandierickx
Copy link

Thanks, i have been using this for some time now, works really nice! In the meantime I was wondering if somebody could help out to make the makefile convert only a specific '.md'-file in a folder by typing something like make name-of-the-article. Is this possible?

@llarsson
Copy link

I am sure that you, @floriandierickx, have already figured this out in the mean time, but for others with the same request:

make understands the %.pdf : %.md as a target itself ("generate whatever.pdf from whatever.md") , so if you have foo.md and want foo.pdf, all you'd have to type is make foo.pdf and make will understand what to do (check if the PDF is fresh enough, and if not, generate it).

It just won't show up in your tab completions in your shell, since whoever made the bash autocompletions didn't anticipate this need.

@sjkiss
Copy link

sjkiss commented Jan 5, 2020

Hi, sorry for a noob question. Where do I store this makefile so it is available in any directories? In my root directory? Or does it have to be in the same folder that I am making the file?

@kristopherjohnson
Copy link
Author

Sorry that I never noticed this comments before.

Re: Licensing: Consider it public-domain

Re: File location: Typically people put the makefile in the directory where you run make from. But you could do something like make -f ~/util/pandoc/Makefile

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment