Skip to main content

md2textbook

Turn a Markdown file into a coursebook-style PDF: gradient cover, table of contents, chapter banners, colored boxes, publication-quality equations and syntax-highlighted code. It runs fully offline on Windows, macOS and Linux, with no network access and no AI.

Cover, chapter opener and equations Code listings, tables, lists, figures and callout boxes

These pages come from examples/showcase.md; the resulting showcase.pdf is in the repo too.

Install

pipx install md2textbook      # recommended: isolated, global command
# or
pip install md2textbook

Requires Python 3.10 or newer. Poppins and Caladea fonts are bundled; nothing else to download.

On Linux the file chooser needs Tk (sudo apt install python3-tk on Debian/Ubuntu, sudo dnf install python3-tkinter on Fedora). Without it the tool falls back to zenity/kdialog, or to a prompt in the terminal. Passing the file on the command line never needs any of these.

Use

md2textbook                   # opens a file chooser
md2textbook notes.md          # writes notes.pdf next to the input and opens it
md2textbook notes.md -o out/book.pdf --no-open
md2textbook-gui               # same as no arguments, without a console window on Windows
python -m md2textbook notes.md

Two example inputs are in examples/: a minimal sample.md and the feature tour showcase.md.

Markdown support

Markdown Result
Front matter title, subtitle, author, date Cover page
A first # Title (the only #, or equal to the front-matter title), then ## / ### / #### Title on the cover; chapters, sections, subsections
Several # headings Each # is a chapter
$x^2$ and $$ ... $$ (or a math fence) Inline math and numbered display equations
Fenced code, ```python title="Loss" Highlighted listing with line numbers and wrapping
Pipe tables, optional Table: caption line Zebra tables with a repeating header
![caption](img.png) Numbered figure
> [!DEFINITION] Title Colored box
> **Example:** text Same, shorthand form
Plain > quote Quiet unlabeled note

Box kinds: DEFINITION, EXAMPLE, INSIGHT, WARNING, RECAP, OBJECTIVE, CODE, IDEA, REVIEW, BRIEF, MATH, NOTE, plus aliases such as TIP, CAUTION, THEOREM, PROOF, SUMMARY.

Code fence options: title="...", nonumbers, start=N.

Limitations

  • Equations use matplotlib's mathtext, so some LaTeX (matrices, \substack, custom macros) is unsupported and shown as source text.
  • Remote and SVG images are skipped.
  • No Mermaid diagrams or footnotes.

Development

git clone https://github.com/MikeDegany/md2textbook
cd md2textbook
pip install -e ".[dev]"
pytest
Module Role
cli.py Command line, file chooser, opening the result
parser.py Markdown parsing and mapping onto the book
builder.py ReportLab book builder (pages, boxes, code, tables)
theme.py Fonts, palette, paragraph styles, inline markup
mathkit.py LaTeX to PNG rendering with an on-disk cache

Changelog

See CHANGELOG.md.

License

MIT, see LICENSE. The bundled Poppins and Caladea fonts are under the SIL Open Font License 1.1 (src/md2textbook/fonts/OFL-*.txt).

Metadata

Release files for md2textbook 0.1.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for md2textbook 0.1.2
File Size Uploaded
md2textbook-0.1.2.tar.gz 553.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for md2textbook 0.1.2
File Interpreter ABI Platform
md2textbook-0.1.2-py3-none-any.whl Python 3 none any Details

Total release size: 1.1 MB

Release files / md2textbook-0.1.2.tar.gz

Download URL md2textbook-0.1.2.tar.gz
Size 553.0 kB
Tags Source
SHA-256 checksum
How to use checksums
ffc30bf60632492d95f28157b0f9b500511ea7bb985a4ff7016003e40676485c
BLAKE2b-256 checksum
How to use checksums
ac96edbd9b125803194f5901916cefde6c065b6a438a7d27c6bb86ba707efc9d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / md2textbook-0.1.2-py3-none-any.whl

Download URL md2textbook-0.1.2-py3-none-any.whl
Size 558.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
fcd85dedb5187f18ffbee8d0492a59bee7984b601a5ab61edf6264673553e793
BLAKE2b-256 checksum
How to use checksums
72c2993e158023484c5b62c4f398195b705d7db775fd8da36526750f1e83044e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release history Release notifications | RSS feed

0.1.3

2 release files

This release

0.1.2 This release

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page