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.
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 |
 |
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)
| File | Size | Uploaded | |
|---|---|---|---|
| md2textbook-0.1.2.tar.gz | 553.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| 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
|