Professional PDF documentation generation. Convert Markdown to PDF with custom templates, styling, table of contents, cross-references, and optimized output for print and archival.
Converts Markdown documentation into professionally formatted PDFs with customizable templates and styling.
npx claudepluginhub a5c-ai/babysitterThis skill is limited to using the following tools:
README.mdProfessional PDF documentation generation.
Invoke this skill when you need to:
| Parameter | Type | Required | Description |
|---|---|---|---|
| inputPath | string | Yes | Path to Markdown source(s) |
| outputPath | string | Yes | Output PDF file path |
| template | string | No | Path to PDF template |
| config | object | No | PDF generation options |
| metadata | object | No | Document metadata |
| toc | boolean | No | Generate table of contents |
{
"inputPath": "./docs",
"outputPath": "./output/documentation.pdf",
"template": "./templates/manual.html",
"toc": true,
"metadata": {
"title": "Product Documentation",
"author": "Documentation Team",
"version": "1.0.0"
}
}
output/
└── documentation.pdf
├── Cover page
├── Table of Contents
├── Chapter 1: Getting Started
│ ├── Installation
│ └── Quick Start
├── Chapter 2: User Guide
│ ├── Configuration
│ └── Features
├── Chapter 3: API Reference
└── Appendix
output/
├── getting-started.pdf
├── user-guide.pdf
├── api-reference.pdf
└── complete-manual.pdf
from: markdown+smart+yaml_metadata_block+implicit_figures+table_captions
to: pdf
pdf-engine: xelatex
variables:
documentclass: report
papersize: letter
fontsize: 11pt
geometry:
- margin=1in
- top=1.25in
- bottom=1.25in
mainfont: "Source Serif Pro"
sansfont: "Source Sans Pro"
monofont: "Source Code Pro"
linkcolor: blue
urlcolor: blue
toccolor: black
toc-depth: 3
include-before-body:
- cover.tex
include-in-header:
- preamble.tex
metadata:
title: "Documentation"
author: "Documentation Team"
date: "2026-01-24"
lang: en-US
toc: true
toc-title: "Table of Contents"
number-sections: true
colorlinks: true
highlight-style: pygments
% Custom styling
\usepackage{fancyhdr}
\usepackage{titlesec}
\usepackage{xcolor}
\usepackage{listings}
\usepackage{graphicx}
% Header/Footer
\pagestyle{fancy}
\fancyhf{}
\fancyhead[L]{\leftmark}
\fancyhead[R]{\thepage}
\fancyfoot[C]{\small Documentation v1.0}
% Code block styling
\lstset{
basicstyle=\ttfamily\small,
breaklines=true,
frame=single,
backgroundcolor=\color{gray!10}
}
% Heading styles
\titleformat{\chapter}[display]
{\normalfont\huge\bfseries}
{\chaptertitlename\ \thechapter}{20pt}{\Huge}
% Link colors
\definecolor{linkblue}{RGB}{0,102,204}
@page {
size: letter;
margin: 1in;
margin-top: 1.25in;
margin-bottom: 1.25in;
@top-center {
content: string(chapter-title);
font-size: 10pt;
color: #666;
}
@bottom-center {
content: "Page " counter(page) " of " counter(pages);
font-size: 9pt;
}
}
@page :first {
@top-center { content: none; }
@bottom-center { content: none; }
}
/* Cover page */
.cover {
page: cover;
text-align: center;
padding-top: 3in;
}
.cover h1 {
font-size: 36pt;
color: #333;
}
.cover .version {
font-size: 14pt;
color: #666;
margin-top: 1in;
}
/* Table of contents */
#toc {
page-break-after: always;
}
#toc h2 {
font-size: 24pt;
margin-bottom: 0.5in;
}
#toc a {
text-decoration: none;
color: inherit;
}
#toc a::after {
content: leader('.') target-counter(attr(href), page);
}
/* Chapters */
h1 {
string-set: chapter-title content();
page-break-before: always;
font-size: 28pt;
border-bottom: 2px solid #333;
padding-bottom: 0.25in;
}
h2 { font-size: 20pt; margin-top: 0.5in; }
h3 { font-size: 16pt; margin-top: 0.3in; }
/* Code blocks */
pre {
background-color: #f5f5f5;
padding: 0.5em;
border-radius: 4px;
font-size: 9pt;
overflow-x: auto;
page-break-inside: avoid;
}
code {
font-family: "Source Code Pro", monospace;
background-color: #f0f0f0;
padding: 0.1em 0.3em;
border-radius: 3px;
}
/* Tables */
table {
width: 100%;
border-collapse: collapse;
margin: 1em 0;
page-break-inside: avoid;
}
th, td {
border: 1px solid #ddd;
padding: 0.5em;
text-align: left;
}
th {
background-color: #f5f5f5;
font-weight: bold;
}
/* Images */
img {
max-width: 100%;
height: auto;
}
figure {
text-align: center;
page-break-inside: avoid;
}
figcaption {
font-style: italic;
color: #666;
margin-top: 0.5em;
}
/* Links */
a {
color: #0066cc;
text-decoration: none;
}
/* Print optimizations */
@media print {
a[href^="http"]::after {
content: " (" attr(href) ")";
font-size: 0.8em;
color: #666;
}
}
<!DOCTYPE html>
<html>
<head>
<style>
body {
font-family: "Source Sans Pro", sans-serif;
text-align: center;
padding-top: 200px;
}
.logo {
max-width: 200px;
margin-bottom: 50px;
}
h1 {
font-size: 48px;
color: #333;
margin-bottom: 20px;
}
.subtitle {
font-size: 24px;
color: #666;
margin-bottom: 100px;
}
.version {
font-size: 18px;
color: #999;
}
.date {
font-size: 14px;
color: #999;
margin-top: 10px;
}
.footer {
position: absolute;
bottom: 50px;
width: 100%;
text-align: center;
color: #666;
}
</style>
</head>
<body>
<img src="logo.png" alt="Company Logo" class="logo">
<h1>{{title}}</h1>
<p class="subtitle">{{subtitle}}</p>
<p class="version">Version {{version}}</p>
<p class="date">{{date}}</p>
<div class="footer">
<p>{{company}}</p>
<p>Confidential</p>
</div>
</body>
</html>
const pandoc = require('pandoc');
const fs = require('fs');
const path = require('path');
async function buildManual(config) {
const chapters = [
{ title: 'Getting Started', files: ['intro.md', 'installation.md', 'quickstart.md'] },
{ title: 'User Guide', files: ['configuration.md', 'features.md', 'advanced.md'] },
{ title: 'API Reference', files: ['api/*.md'] },
{ title: 'Appendix', files: ['glossary.md', 'changelog.md'] }
];
// Combine all Markdown files
let combined = '';
for (const chapter of chapters) {
combined += `# ${chapter.title}\n\n`;
for (const filePattern of chapter.files) {
const files = glob.sync(filePattern, { cwd: config.docsDir });
for (const file of files) {
const content = fs.readFileSync(path.join(config.docsDir, file), 'utf8');
// Adjust heading levels
const adjusted = adjustHeadings(content, 1);
combined += adjusted + '\n\n';
}
}
}
// Write combined file
const tempFile = '/tmp/combined.md';
fs.writeFileSync(tempFile, combined);
// Run Pandoc
await pandoc({
input: tempFile,
output: config.outputPath,
args: [
'--defaults', config.pandocDefaults,
'--metadata-file', config.metadataFile
]
});
return { output: config.outputPath };
}
# Using Pandoc with PDF/A output
pandoc input.md \
-o output.pdf \
--pdf-engine=xelatex \
-V 'pdfa=1b' \
--include-in-header=pdfa-header.tex
# pdfa-header.tex
\usepackage{hyperref}
\hypersetup{
pdfstartview=,
colorlinks=false,
pdfpagelayout=SinglePage
}
\usepackage[a-1b]{pdfx}
{
"devDependencies": {
"pandoc": "^0.2.0",
"weasyprint": "via pip",
"puppeteer": "^21.0.0",
"pdf-lib": "^1.17.0"
}
}
# macOS
brew install pandoc
brew install --cask basictex
pip install weasyprint
# Ubuntu
sudo apt install pandoc texlive-xetex texlive-fonts-recommended
pip install weasyprint
# Windows (via Chocolatey)
choco install pandoc miktex
pip install weasyprint
# Single file with Pandoc
pandoc input.md -o output.pdf --defaults pandoc-defaults.yaml
# Multiple files combined
pandoc docs/*.md -o manual.pdf --toc --number-sections
# Using WeasyPrint
weasyprint input.html output.pdf -s style.css
# Using Puppeteer (for HTML-based PDFs)
node generate-pdf.js --input docs/ --output manual.pdf
Activates when the user asks about AI prompts, needs prompt templates, wants to search for prompts, or mentions prompts.chat. Use for discovering, retrieving, and improving prompts.
Search, retrieve, and install Agent Skills from the prompts.chat registry using MCP tools. Use when the user asks to find skills, browse skill catalogs, install a skill for Claude, or extend Claude's capabilities with reusable AI agent components.
This skill should be used when the user asks to "create an agent", "add an agent", "write a subagent", "agent frontmatter", "when to use description", "agent examples", "agent tools", "agent colors", "autonomous agent", or needs guidance on agent structure, system prompts, triggering conditions, or agent development best practices for Claude Code plugins.