MD to PDF
Converts Markdown files to professional PDF using one of two rendering engines.
Step 0: Parse Arguments
Parse $ARGUMENTS to determine mode and components.
Component Required Description
md_file
per mode Path to .md file
--engine
No reportlab or weasyprint (overrides saved config)
custom_prompt
No Last argument in double quotes = LLM preprocessing instructions
Mode detection rules:
Condition Mode
Empty or help
HELP
styles or config
STYLES
test
TEST
Path to .md file + quoted string at end CONVERT+PROMPT
Path to .md file (no quoted string) CONVERT
Extract --engine <name> from anywhere in arguments if present. Remove it before further parsing.
Step 1: Dependency Check
Determine the target engine (from --engine flag, saved config, or default reportlab ).
EXECUTE using Bash tool:
bash "${CLAUDE_SKILL_DIR}/scripts/check_deps.sh" check ENGINE_NAME 2>&1; echo "EXIT_CODE=$?"
Replace ENGINE_NAME with the target engine.
If output contains MISSING_PIP or MISSING_SYSTEM :
Use AskUserQuestion presenting the engine comparison table:
Feature reportlab weasyprint
Install pip only pip + brew
Quality Good Excellent
Speed Fast Moderate
Images Basic Full
CSS Styling No Yes
Code highlight No Yes (Pygments)
Options:
-
"Install ENGINE_NAME dependencies"
-
"Switch to OTHER_ENGINE" (if the other engine is available)
-
"Cancel"
If user chooses install, EXECUTE using Bash tool:
bash "${CLAUDE_SKILL_DIR}/scripts/check_deps.sh" install ENGINE_NAME 2>&1 && echo "---INSTALL_OK---" || echo "---INSTALL_FAILED---"
STOP if INSTALL_FAILED -- report error and exit.
If user cancels -- STOP.
Step 2: Engine Selection (first run only)
Check for saved config in order:
-
Project: .claude/md-to-pdf.config.json
-
Global: ~/.claude/md-to-pdf.config.json
If --engine flag was provided -- use it (skip config lookup).
If no saved preference and no --engine flag -- use AskUserQuestion with the engine comparison table from Step 1. Save the choice:
{ "engine": "reportlab", "pygments_theme": "github" }
Write to project config .claude/md-to-pdf.config.json (create .claude/ dir if needed).
Step 3: Mode Execution
HELP Mode
Print formatted usage:
MD to PDF Converter
Usage: /brewdoc:md-to-pdf <file.md> Convert with saved engine/style /brewdoc:md-to-pdf <file.md> --engine weasyprint Convert with specific engine /brewdoc:md-to-pdf <file.md> "remove section X" Preprocess MD then convert /brewdoc:md-to-pdf styles Configure page/color/font /brewdoc:md-to-pdf test Convert bundled test file /brewdoc:md-to-pdf help Show this help
Engines: reportlab -- Pure Python, fast, no system deps (pip install reportlab) weasyprint -- HTML/CSS pipeline, best quality (pip + brew deps)
EXIT after printing.
CONVERT Mode
-
Read the input MD file with Read tool. If not found -- STOP with error.
-
Determine output path: same directory, same name, .pdf extension.
-
Build the config path argument (if project or global config exists, add --config CONFIG_PATH ).
EXECUTE using Bash tool:
python3 "${CLAUDE_SKILL_DIR}/scripts/md_to_pdf.py" "INPUT_PATH" "OUTPUT_PATH" --engine ENGINE --quiet 2>&1 && echo "---CONVERT_OK---" || echo "---CONVERT_FAILED---"
Replace INPUT_PATH , OUTPUT_PATH , ENGINE with actual values. Add --config CONFIG_PATH if a style config JSON exists. Add --pygments-theme THEME for weasyprint if configured.
STOP if CONVERT_FAILED -- read error output, attempt fix, retry once. If still failing -- report error.
- Parse structured output lines: STATUS , OUTPUT , PAGES , SIZE , ENGINE .
CONVERT+PROMPT Mode
-
Read the input MD file with Read tool.
-
Apply LLM transformations per the custom_prompt instructions (delete sections, rewrite headings, restructure, etc.).
-
Write modified content to temp file: {original_dir}/.tmp_{original_name}.md
-
Run the converter on the temp file (same command as CONVERT mode, using temp file as input, original name for output).
-
Delete the temp file.
EXECUTE using Bash tool:
rm -f "TEMP_FILE_PATH"
- Proceed to Step 4 with preprocessing: true .
STYLES Mode
Run interactive configuration via AskUserQuestion dialogs:
Question 1 -- Page size: Options: A4 (default), Letter , Legal
Question 2 -- Color scheme: Options: Default blue (primary #1a3a5c), Dark (primary #2d3748), Custom (ask for hex values)
Question 3 -- Code theme (weasyprint only): Options: github (default), monokai , friendly , solarized-dark , solarized-light
Question 4 -- Footer format: Options: Page {page} of {total} (default), {page}/{total} , Disabled
Build JSON config matching styles/default.json structure, overriding changed values. Write to .claude/md-to-pdf.config.json .
Report saved settings table and EXIT.
TEST Mode
-
Use bundled test file at ${CLAUDE_SKILL_DIR}/test/test-all-elements.md as INPUT_PATH.
-
Determine output path: /tmp/md-to-pdf-test-ENGINE.pdf
-
Run converter (same command as CONVERT mode, using test file as input, /tmp/ output).
-
Proceed to Step 4.
Step 4: Report Results
Parameter Value
Source absolute path to input MD
Output absolute path to output PDF
Pages from PAGES= in script output
Size from SIZE= in script output
Engine reportlab or weasyprint
Preprocessing custom_prompt summary (if used) or none