Skip to main content

Merge Markdown files into a single PDF or HTML presentation with Pandoc + XeLaTeX

Project description

mdfusion

Merge all Markdown files in a directory tree into a single PDF or HTML presentation with formatting via Pandoc + XeLaTeX.


Features

  • Recursively collects and sorts all .md files under a directory (natural sort order)
  • Merges them into one document, rewriting image links to absolute paths (so images with the same name in different folders don't collide)
  • Optionally adds a title page with configurable title, author, and date
  • Supports both PDF (via Pandoc + XeLaTeX) and HTML presentations (via reveal.js)
  • Customizes output with your own LaTeX or HTML headers/footers
  • Configurable via TOML for repeatable builds (great for books, reports, or slides)
  • Bundles HTML presentations with all assets for easy sharing

Installation

Requirements

You must have the following on your PATH:

For HTML presentations and PDF export from HTML, you may also want to install:

  • Playwright (for HTML→PDF conversion) via pip install playwright and then playwright install

Install via pip

pip install mdfusion

Install from source

git clone https://github.com/ejuet/mdfusion.git
cd mdfusion
pip install .

Usage

mdfusion [OPTIONS]

You can also pass extra Pandoc arguments at the end of the command; any unknown flags are forwarded to Pandoc.

Common options

  • --root_dir DIR Root directory for Markdown files (default: current directory, or config file directory)
  • --output FILE Output filename (default: <root_dir>.pdf or .html for presentations)
  • --toc Include table of contents (use --notoc to disable)
  • --title_page Include a title page (PDF only)
  • --title TITLE Set title for title page (default: directory name)
  • --author AUTHOR Set author for title page (default: OS user)
  • --pandoc_args ARGS Extra Pandoc arguments (whitespace-separated)
  • --config_path FILE Path to a mdfusion.toml config file (default: mdfusion.toml in the current directory)
  • --header_tex PATH Custom LaTeX header to include (defaults to ./header.tex if present)
  • --merged_md DIR Write merged Markdown to this directory (uses a temp dir by default)
  • --remove_alt_texts TXT Comma-separated list of image alt texts to strip (default: alt text)
  • --verbose Enable verbose Pandoc output

Presentation options

  • --presentation Output as a reveal.js HTML presentation (also converts to PDF)
  • --footer_text TEXT Custom footer for presentations
  • --animate_all_lines Add reveal.js fragment animation to each line
  • --chromium_path PATH Path to Chromium for HTML→PDF conversion (default: /usr/bin/chromium)

Example: Merge docs/ into a PDF with a title page

mdfusion --root_dir docs --title_page --title "My Book" --author "Jane Doe"

Example: Create a reveal.js HTML presentation

mdfusion --root_dir slides --presentation --title "My Talk" --author "Speaker" --footer_text "My Conference 2025"

Configuration file

You can create a mdfusion.toml file in your project directory to avoid long command lines. The [mdfusion] section supports all the same options as the CLI. Presentation-only settings live under [presentation] (these can also remain under [mdfusion] for backward compatibility).

Example: Normal document (PDF)

[mdfusion]
root_dir = "docs"
output = "my-book.pdf"
toc = true
title_page = true
title = "My Book"
author = "Jane Doe"
pandoc_args = ["--number-sections", "--slide-level", "2", "--toc-depth", "4"]
# header_tex = "header.tex"  # Optional: custom LaTeX header

Example: Presentation (HTML via reveal.js)

[mdfusion]
root_dir = "slides"
output = "my-presentation.html"
title = "My Talk"
author = "Speaker"
pandoc_args = ["--slide-level", "6", "--number-sections", "-V", "transition=fade", "-c", "custom.css"]
# You can add more reveal.js or pandoc options as needed with ["-V", "option=value"]

[presentation]
presentation = true
footer_text = "My Presentation 2025"
animate_all_lines = false
# chromium_path = "/usr/bin/chromium"

Then just run:

mdfusion

How it works

  1. Finds and sorts all Markdown files under the root directory (natural order)
  2. Merges them into one file, rewriting image links to absolute paths
  3. Optionally adds a YAML metadata block for title/author/date
  4. Calls Pandoc with XeLaTeX (for PDF) or reveal.js (for HTML presentations)
  5. Optionally bundles HTML output with all assets for easy sharing

Testing

Run all tests with:

pytest

Author

ejuet

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

mdfusion-0.2.9.tar.gz (37.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

mdfusion-0.2.9-py3-none-any.whl (35.5 kB view details)

Uploaded Python 3

File details

Details for the file mdfusion-0.2.9.tar.gz.

File metadata

  • Download URL: mdfusion-0.2.9.tar.gz
  • Upload date:
  • Size: 37.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.2

File hashes

Hashes for mdfusion-0.2.9.tar.gz
Algorithm Hash digest
SHA256 8519a8c5c5979ff92837e6f1f35c0bbc6507c8699af7a569e1599949c096d76a
MD5 09db04f2a547c52d5973a053c7359491
BLAKE2b-256 93c6dc32fcf4360732e90b48fe164657b39282995eafd7999f910658651e2860

See more details on using hashes here.

File details

Details for the file mdfusion-0.2.9-py3-none-any.whl.

File metadata

  • Download URL: mdfusion-0.2.9-py3-none-any.whl
  • Upload date:
  • Size: 35.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.2

File hashes

Hashes for mdfusion-0.2.9-py3-none-any.whl
Algorithm Hash digest
SHA256 b3d0feed400438a8061ecf8fdcc55b9c6a110aeb3f4efce6df2cdfec1344aabf
MD5 5849406b690c1b1c3e0ae1f21aa9db70
BLAKE2b-256 25fe13051e81b50a99f9351e0817ca75228f47d69cd38e15cc25aff34bd7ab46

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page