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.
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
An example input is in examples/sample.md.
Markdown support
| Markdown | Result |
|---|---|
Front matter title, subtitle, author, date |
Cover page |
A single # 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 |
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.0
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.0.tar.gz | 552.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| md2textbook-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 1.1 MB
Release files / md2textbook-0.1.0.tar.gz
| Download URL | md2textbook-0.1.0.tar.gz |
|---|---|
| Size | 552.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
7bde6d8719018f1f160f47705c44a590167bf14e925e5bdb80576f51f2759429
|
|
BLAKE2b-256 checksum How to use checksums |
3a083081b15c4a42f27232f772f0be55ce73fb7d11aa4e7eb27f6ac548c9b27a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.7
|
Release files / md2textbook-0.1.0-py3-none-any.whl
| Download URL | md2textbook-0.1.0-py3-none-any.whl |
|---|---|
| Size | 557.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
87b9e678c1970841cdc071c220e6c2601dd417b9ea1a9cf231ee5460a24103f0
|
|
BLAKE2b-256 checksum How to use checksums |
6f841b4d573dfb6e6b13bad12efec0a9aa56de68d70232cc6af51d110dfa33b9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.7
|