[{"data":1,"prerenderedAt":64},["Reactive",2],{"blog-post-markdown-print-styles-pdf-formatting-complete-guide":3},{"slug":4,"title":5,"description":6,"excerpt":7,"date":8,"category":9,"author":10,"keywords":11,"readingMinutes":12,"html":13,"headings":14,"tools":37,"related":38},"markdown-print-styles-pdf-formatting-complete-guide","Markdown Print Styles and PDF Formatting: Complete Guide for Professional Document Output and Print-Ready Publications","Master print styles and PDF formatting for Markdown documents. Learn CSS print media queries, page layout control, typography optimization, and automated PDF generation for professional document output.","Print styles and PDF formatting for Markdown documents enable professional document output that maintains design consistency, typography excellence, and layout precision across digital screens and…","2025-09-18","Tutorial","Matthew Rathbone","markdown print styles, pdf formatting markdown, print css markdown, markdown to pdf, print media queries, document formatting, professional print layout, markdown publishing",23,"\u003Cp>Print styles and PDF formatting for Markdown documents enable professional document output that maintains design consistency, typography excellence, and layout precision across digital screens and physical publications. While Markdown provides semantic structure ideal for web display, specialized CSS print media queries and PDF generation techniques ensure optimal presentation when documents transition from screen to paper or professional PDF distribution.\u003C/p>\n\u003Ch2 id=\"why-master-print-styles-for-markdown\">Why Master Print Styles for Markdown?\u003C/h2>\n\u003Cp>Professional print formatting provides essential benefits for document publication:\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>Professional Publications\u003C/strong>: Create print-ready documents that maintain brand standards and typography excellence\u003C/li>\n\u003Cli>\u003Cstrong>Consistent Output\u003C/strong>: Ensure reliable formatting across different PDF generators and printing systems\u003C/li>\n\u003Cli>\u003Cstrong>Cost-Effective Publishing\u003C/strong>: Optimize layouts for efficient paper usage and reduced printing costs\u003C/li>\n\u003Cli>\u003Cstrong>Accessibility Compliance\u003C/strong>: Implement print styles that support high contrast and readable typography\u003C/li>\n\u003Cli>\u003Cstrong>Cross-Platform Reliability\u003C/strong>: Generate consistent results across browsers and PDF conversion tools\u003C/li>\n\u003C/ul>\n\u003Ch2 id=\"understanding-print-css-fundamentals\">Understanding Print CSS Fundamentals\u003C/h2>\n\u003Ch3 id=\"print-media-queries-and-page-control\">Print Media Queries and Page Control\u003C/h3>\n\u003Cp>CSS print media queries provide comprehensive control over document appearance in print format:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-css\">\u003Cspan class=\"hljs-comment\">/* comprehensive-print-styles.css - Professional print formatting */\u003C/span>\n\n\u003Cspan class=\"hljs-comment\">/* Print-specific CSS variables */\u003C/span>\n\u003Cspan class=\"hljs-keyword\">@media\u003C/span> print {\n  \u003Cspan class=\"hljs-selector-pseudo\">:root\u003C/span> {\n    \u003Cspan class=\"hljs-attr\">--print-font-family\u003C/span>: Georgia, \u003Cspan class=\"hljs-string\">&#x27;Times New Roman&#x27;\u003C/span>, serif;\n    \u003Cspan class=\"hljs-attr\">--print-font-size\u003C/span>: \u003Cspan class=\"hljs-number\">12pt\u003C/span>;\n    \u003Cspan class=\"hljs-attr\">--print-line-height\u003C/span>: \u003Cspan class=\"hljs-number\">1.4\u003C/span>;\n    \u003Cspan class=\"hljs-attr\">--print-margin\u003C/span>: \u003Cspan class=\"hljs-number\">1in\u003C/span>;\n    \u003Cspan class=\"hljs-attr\">--print-header-height\u003C/span>: \u003Cspan class=\"hljs-number\">0.5in\u003C/span>;\n    \u003Cspan class=\"hljs-attr\">--print-footer-height\u003C/span>: \u003Cspan class=\"hljs-number\">0.5in\u003C/span>;\n    \n    \u003Cspan class=\"hljs-attr\">--print-primary-color\u003C/span>: \u003Cspan class=\"hljs-number\">#000000\u003C/span>;\n    \u003Cspan class=\"hljs-attr\">--print-secondary-color\u003C/span>: \u003Cspan class=\"hljs-number\">#333333\u003C/span>;\n    \u003Cspan class=\"hljs-attr\">--print-accent-color\u003C/span>: \u003Cspan class=\"hljs-number\">#666666\u003C/span>;\n    \u003Cspan class=\"hljs-attr\">--print-border-color\u003C/span>: \u003Cspan class=\"hljs-number\">#000000\u003C/span>;\n    \n    \u003Cspan class=\"hljs-attr\">--print-heading-size-h1\u003C/span>: \u003Cspan class=\"hljs-number\">18pt\u003C/span>;\n    \u003Cspan class=\"hljs-attr\">--print-heading-size-h2\u003C/span>: \u003Cspan class=\"hljs-number\">16pt\u003C/span>;\n    \u003Cspan class=\"hljs-attr\">--print-heading-size-h3\u003C/span>: \u003Cspan class=\"hljs-number\">14pt\u003C/span>;\n    \u003Cspan class=\"hljs-attr\">--print-heading-size-h4\u003C/span>: \u003Cspan class=\"hljs-number\">12pt\u003C/span>;\n  }\n  \n  \u003Cspan class=\"hljs-comment\">/* Page setup and margins */\u003C/span>\n  \u003Cspan class=\"hljs-keyword\">@page\u003C/span> {\n    size: \u003Cspan class=\"hljs-number\">8.5in\u003C/span> \u003Cspan class=\"hljs-number\">11in\u003C/span>; \u003Cspan class=\"hljs-comment\">/* US Letter size */\u003C/span>\n    \u003Cspan class=\"hljs-attribute\">margin\u003C/span>: \u003Cspan class=\"hljs-built_in\">var\u003C/span>(--print-margin);\n    \n    \u003Cspan class=\"hljs-comment\">/* Headers and footers */\u003C/span>\n    \u003Cspan class=\"hljs-keyword\">@top-left\u003C/span> {\n      \u003Cspan class=\"hljs-attribute\">content\u003C/span>: \u003Cspan class=\"hljs-string\">&quot;Document Title&quot;\u003C/span>;\n      \u003Cspan class=\"hljs-attribute\">font\u003C/span>: \u003Cspan class=\"hljs-number\">10pt\u003C/span> \u003Cspan class=\"hljs-built_in\">var\u003C/span>(--print-font-family);\n      \u003Cspan class=\"hljs-attribute\">color\u003C/span>: \u003Cspan class=\"hljs-built_in\">var\u003C/span>(--print-secondary-color);\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">@top-right\u003C/span> {\n      \u003Cspan class=\"hljs-attribute\">content\u003C/span>: \u003Cspan class=\"hljs-string\">&quot;Page &quot;\u003C/span> \u003Cspan class=\"hljs-built_in\">counter\u003C/span>(page);\n      \u003Cspan class=\"hljs-attribute\">font\u003C/span>: \u003Cspan class=\"hljs-number\">10pt\u003C/span> \u003Cspan class=\"hljs-built_in\">var\u003C/span>(--print-font-family);\n      \u003Cspan class=\"hljs-attribute\">color\u003C/span>: \u003Cspan class=\"hljs-built_in\">var\u003C/span>(--print-secondary-color);\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">@bottom-center\u003C/span> {\n      \u003Cspan class=\"hljs-attribute\">content\u003C/span>: \u003Cspan class=\"hljs-string\">&quot;© 2025 Company Name - Confidential&quot;\u003C/span>;\n      \u003Cspan class=\"hljs-attribute\">font\u003C/span>: \u003Cspan class=\"hljs-number\">8pt\u003C/span> \u003Cspan class=\"hljs-built_in\">var\u003C/span>(--print-font-family);\n      \u003Cspan class=\"hljs-attribute\">color\u003C/span>: \u003Cspan class=\"hljs-built_in\">var\u003C/span>(--print-accent-color);\n    }\n  }\n  \n  \u003Cspan class=\"hljs-comment\">/* A4 page size alternative */\u003C/span>\n  \u003Cspan class=\"hljs-keyword\">@page\u003C/span> :first {\n    size: A4;\n    \u003Cspan class=\"hljs-attribute\">margin-top\u003C/span>: \u003Cspan class=\"hljs-number\">2in\u003C/span>; \u003Cspan class=\"hljs-comment\">/* Extra space for letterhead */\u003C/span>\n  }\n  \n  \u003Cspan class=\"hljs-comment\">/* Chapter pages */\u003C/span>\n  \u003Cspan class=\"hljs-keyword\">@page\u003C/span> chapter {\n    \u003Cspan class=\"hljs-keyword\">@bottom-center\u003C/span> {\n      \u003Cspan class=\"hljs-attribute\">content\u003C/span>: none;\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">@top-left\u003C/span> {\n      \u003Cspan class=\"hljs-attribute\">content\u003C/span>: \u003Cspan class=\"hljs-built_in\">attr\u003C/span>(data-chapter-title);\n    }\n  }\n  \n  \u003Cspan class=\"hljs-comment\">/* Base document styles */\u003C/span>\n  * {\n    -webkit-print-\u003Cspan class=\"hljs-attribute\">color\u003C/span>-adjust: exact \u003Cspan class=\"hljs-meta\">!important\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">color\u003C/span>-adjust: exact \u003Cspan class=\"hljs-meta\">!important\u003C/span>;\n    print-\u003Cspan class=\"hljs-attribute\">color\u003C/span>-adjust: exact \u003Cspan class=\"hljs-meta\">!important\u003C/span>;\n  }\n  \n  \u003Cspan class=\"hljs-selector-tag\">body\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">font-family\u003C/span>: \u003Cspan class=\"hljs-built_in\">var\u003C/span>(--print-font-family);\n    \u003Cspan class=\"hljs-attribute\">font-size\u003C/span>: \u003Cspan class=\"hljs-built_in\">var\u003C/span>(--print-font-size);\n    \u003Cspan class=\"hljs-attribute\">line-height\u003C/span>: \u003Cspan class=\"hljs-built_in\">var\u003C/span>(--print-line-height);\n    \u003Cspan class=\"hljs-attribute\">color\u003C/span>: \u003Cspan class=\"hljs-built_in\">var\u003C/span>(--print-primary-color);\n    \u003Cspan class=\"hljs-attribute\">background\u003C/span>: white;\n    \u003Cspan class=\"hljs-attribute\">margin\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">padding\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>;\n  }\n  \n  \u003Cspan class=\"hljs-comment\">/* Typography optimization for print */\u003C/span>\n  \u003Cspan class=\"hljs-selector-tag\">h1\u003C/span>, \u003Cspan class=\"hljs-selector-tag\">h2\u003C/span>, \u003Cspan class=\"hljs-selector-tag\">h3\u003C/span>, \u003Cspan class=\"hljs-selector-tag\">h4\u003C/span>, \u003Cspan class=\"hljs-selector-tag\">h5\u003C/span>, \u003Cspan class=\"hljs-selector-tag\">h6\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">font-family\u003C/span>: \u003Cspan class=\"hljs-built_in\">var\u003C/span>(--print-font-family);\n    \u003Cspan class=\"hljs-attribute\">font-weight\u003C/span>: bold;\n    \u003Cspan class=\"hljs-attribute\">color\u003C/span>: \u003Cspan class=\"hljs-built_in\">var\u003C/span>(--print-primary-color);\n    \u003Cspan class=\"hljs-attribute\">page-break-after\u003C/span>: avoid;\n    \u003Cspan class=\"hljs-attribute\">page-break-inside\u003C/span>: avoid;\n    \u003Cspan class=\"hljs-attribute\">margin-top\u003C/span>: \u003Cspan class=\"hljs-number\">24pt\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">margin-bottom\u003C/span>: \u003Cspan class=\"hljs-number\">12pt\u003C/span>;\n  }\n  \n  \u003Cspan class=\"hljs-selector-tag\">h1\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">font-size\u003C/span>: \u003Cspan class=\"hljs-built_in\">var\u003C/span>(--print-heading-size-h1);\n    \u003Cspan class=\"hljs-attribute\">page-break-before\u003C/span>: always;\n    \u003Cspan class=\"hljs-attribute\">counter-reset\u003C/span>: section;\n  }\n  \n  \u003Cspan class=\"hljs-selector-tag\">h1\u003C/span>\u003Cspan class=\"hljs-selector-pseudo\">:first\u003C/span>-child {\n    \u003Cspan class=\"hljs-attribute\">page-break-before\u003C/span>: avoid;\n    \u003Cspan class=\"hljs-attribute\">margin-top\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>;\n  }\n  \n  \u003Cspan class=\"hljs-selector-tag\">h2\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">font-size\u003C/span>: \u003Cspan class=\"hljs-built_in\">var\u003C/span>(--print-heading-size-h2);\n    \u003Cspan class=\"hljs-attribute\">page-break-before\u003C/span>: avoid;\n    \u003Cspan class=\"hljs-attribute\">counter-increment\u003C/span>: section;\n    \u003Cspan class=\"hljs-attribute\">counter-reset\u003C/span>: subsection;\n  }\n  \n  \u003Cspan class=\"hljs-selector-tag\">h2\u003C/span>\u003Cspan class=\"hljs-selector-pseudo\">::before\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">content\u003C/span>: \u003Cspan class=\"hljs-built_in\">counter\u003C/span>(section) \u003Cspan class=\"hljs-string\">&quot;. &quot;\u003C/span>;\n  }\n  \n  \u003Cspan class=\"hljs-selector-tag\">h3\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">font-size\u003C/span>: \u003Cspan class=\"hljs-built_in\">var\u003C/span>(--print-heading-size-h3);\n    \u003Cspan class=\"hljs-attribute\">counter-increment\u003C/span>: subsection;\n  }\n  \n  \u003Cspan class=\"hljs-selector-tag\">h3\u003C/span>\u003Cspan class=\"hljs-selector-pseudo\">::before\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">content\u003C/span>: \u003Cspan class=\"hljs-built_in\">counter\u003C/span>(section) \u003Cspan class=\"hljs-string\">&quot;.&quot;\u003C/span> \u003Cspan class=\"hljs-built_in\">counter\u003C/span>(subsection) \u003Cspan class=\"hljs-string\">&quot; &quot;\u003C/span>;\n  }\n  \n  \u003Cspan class=\"hljs-selector-tag\">h4\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">font-size\u003C/span>: \u003Cspan class=\"hljs-built_in\">var\u003C/span>(--print-heading-size-h4);\n  }\n  \n  \u003Cspan class=\"hljs-comment\">/* Paragraph and text formatting */\u003C/span>\n  \u003Cspan class=\"hljs-selector-tag\">p\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">margin\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span> \u003Cspan class=\"hljs-number\">0\u003C/span> \u003Cspan class=\"hljs-number\">12pt\u003C/span> \u003Cspan class=\"hljs-number\">0\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">text-align\u003C/span>: justify;\n    \u003Cspan class=\"hljs-attribute\">text-justify\u003C/span>: inter-word;\n    \u003Cspan class=\"hljs-attribute\">hyphens\u003C/span>: auto;\n    -webkit-\u003Cspan class=\"hljs-attribute\">hyphens\u003C/span>: auto;\n    -ms-\u003Cspan class=\"hljs-attribute\">hyphens\u003C/span>: auto;\n    \u003Cspan class=\"hljs-attribute\">orphans\u003C/span>: \u003Cspan class=\"hljs-number\">3\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">widows\u003C/span>: \u003Cspan class=\"hljs-number\">3\u003C/span>;\n  }\n  \n  \u003Cspan class=\"hljs-selector-tag\">p\u003C/span>\u003Cspan class=\"hljs-selector-pseudo\">:last-child\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">margin-bottom\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>;\n  }\n  \n  \u003Cspan class=\"hljs-comment\">/* List formatting */\u003C/span>\n  \u003Cspan class=\"hljs-selector-tag\">ul\u003C/span>, \u003Cspan class=\"hljs-selector-tag\">ol\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">margin\u003C/span>: \u003Cspan class=\"hljs-number\">12pt\u003C/span> \u003Cspan class=\"hljs-number\">0\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">padding-left\u003C/span>: \u003Cspan class=\"hljs-number\">24pt\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">page-break-inside\u003C/span>: avoid;\n  }\n  \n  \u003Cspan class=\"hljs-selector-tag\">li\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">margin-bottom\u003C/span>: \u003Cspan class=\"hljs-number\">6pt\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">page-break-inside\u003C/span>: avoid;\n    \u003Cspan class=\"hljs-attribute\">orphans\u003C/span>: \u003Cspan class=\"hljs-number\">2\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">widows\u003C/span>: \u003Cspan class=\"hljs-number\">2\u003C/span>;\n  }\n  \n  \u003Cspan class=\"hljs-comment\">/* Table formatting */\u003C/span>\n  \u003Cspan class=\"hljs-selector-tag\">table\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">width\u003C/span>: \u003Cspan class=\"hljs-number\">100%\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">border-collapse\u003C/span>: collapse;\n    \u003Cspan class=\"hljs-attribute\">margin\u003C/span>: \u003Cspan class=\"hljs-number\">12pt\u003C/span> \u003Cspan class=\"hljs-number\">0\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">page-break-inside\u003C/span>: avoid;\n    \u003Cspan class=\"hljs-attribute\">font-size\u003C/span>: \u003Cspan class=\"hljs-number\">10pt\u003C/span>;\n  }\n  \n  \u003Cspan class=\"hljs-selector-tag\">table\u003C/span>, \u003Cspan class=\"hljs-selector-tag\">th\u003C/span>, \u003Cspan class=\"hljs-selector-tag\">td\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">border\u003C/span>: \u003Cspan class=\"hljs-number\">1pt\u003C/span> solid \u003Cspan class=\"hljs-built_in\">var\u003C/span>(--print-border-color);\n  }\n  \n  \u003Cspan class=\"hljs-selector-tag\">th\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">background\u003C/span>: \u003Cspan class=\"hljs-number\">#f0f0f0\u003C/span> \u003Cspan class=\"hljs-meta\">!important\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">font-weight\u003C/span>: bold;\n    \u003Cspan class=\"hljs-attribute\">padding\u003C/span>: \u003Cspan class=\"hljs-number\">6pt\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">text-align\u003C/span>: left;\n  }\n  \n  \u003Cspan class=\"hljs-selector-tag\">td\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">padding\u003C/span>: \u003Cspan class=\"hljs-number\">4pt\u003C/span> \u003Cspan class=\"hljs-number\">6pt\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">vertical-align\u003C/span>: top;\n  }\n  \n  \u003Cspan class=\"hljs-comment\">/* Table headers on new pages */\u003C/span>\n  \u003Cspan class=\"hljs-selector-tag\">thead\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">display\u003C/span>: table-header-group;\n  }\n  \n  \u003Cspan class=\"hljs-selector-tag\">tfoot\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">display\u003C/span>: table-footer-group;\n  }\n  \n  \u003Cspan class=\"hljs-comment\">/* Code formatting */\u003C/span>\n  \u003Cspan class=\"hljs-selector-tag\">code\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">font-family\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Courier New&#x27;\u003C/span>, Courier, monospace;\n    \u003Cspan class=\"hljs-attribute\">font-size\u003C/span>: \u003Cspan class=\"hljs-number\">10pt\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">background\u003C/span>: \u003Cspan class=\"hljs-number\">#f5f5f5\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">padding\u003C/span>: \u003Cspan class=\"hljs-number\">1pt\u003C/span> \u003Cspan class=\"hljs-number\">2pt\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">border\u003C/span>: \u003Cspan class=\"hljs-number\">0.5pt\u003C/span> solid \u003Cspan class=\"hljs-number\">#cccccc\u003C/span>;\n  }\n  \n  pre {\n    \u003Cspan class=\"hljs-attribute\">background\u003C/span>: \u003Cspan class=\"hljs-number\">#f8f8f8\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">border\u003C/span>: \u003Cspan class=\"hljs-number\">1pt\u003C/span> solid \u003Cspan class=\"hljs-number\">#cccccc\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">padding\u003C/span>: \u003Cspan class=\"hljs-number\">8pt\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">margin\u003C/span>: \u003Cspan class=\"hljs-number\">12pt\u003C/span> \u003Cspan class=\"hljs-number\">0\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">white-space\u003C/span>: pre-wrap;\n    \u003Cspan class=\"hljs-attribute\">word-wrap\u003C/span>: break-word;\n    \u003Cspan class=\"hljs-attribute\">page-break-inside\u003C/span>: avoid;\n    \u003Cspan class=\"hljs-attribute\">font-family\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Courier New&#x27;\u003C/span>, Courier, monospace;\n    \u003Cspan class=\"hljs-attribute\">font-size\u003C/span>: \u003Cspan class=\"hljs-number\">9pt\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">line-height\u003C/span>: \u003Cspan class=\"hljs-number\">1.2\u003C/span>;\n  }\n  \n  pre \u003Cspan class=\"hljs-selector-tag\">code\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">background\u003C/span>: none;\n    \u003Cspan class=\"hljs-attribute\">border\u003C/span>: none;\n    \u003Cspan class=\"hljs-attribute\">padding\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>;\n  }\n  \n  \u003Cspan class=\"hljs-comment\">/* Blockquote formatting */\u003C/span>\n  \u003Cspan class=\"hljs-selector-tag\">blockquote\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">border-left\u003C/span>: \u003Cspan class=\"hljs-number\">3pt\u003C/span> solid \u003Cspan class=\"hljs-built_in\">var\u003C/span>(--print-border-color);\n    \u003Cspan class=\"hljs-attribute\">margin\u003C/span>: \u003Cspan class=\"hljs-number\">12pt\u003C/span> \u003Cspan class=\"hljs-number\">0\u003C/span> \u003Cspan class=\"hljs-number\">12pt\u003C/span> \u003Cspan class=\"hljs-number\">12pt\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">padding-left\u003C/span>: \u003Cspan class=\"hljs-number\">12pt\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">font-style\u003C/span>: italic;\n    \u003Cspan class=\"hljs-attribute\">page-break-inside\u003C/span>: avoid;\n  }\n  \n  \u003Cspan class=\"hljs-comment\">/* Image handling */\u003C/span>\n  \u003Cspan class=\"hljs-selector-tag\">img\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">max-width\u003C/span>: \u003Cspan class=\"hljs-number\">100%\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">height\u003C/span>: auto;\n    \u003Cspan class=\"hljs-attribute\">page-break-inside\u003C/span>: avoid;\n    \u003Cspan class=\"hljs-attribute\">page-break-after\u003C/span>: avoid;\n  }\n  \n  \u003Cspan class=\"hljs-selector-tag\">figure\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">margin\u003C/span>: \u003Cspan class=\"hljs-number\">12pt\u003C/span> \u003Cspan class=\"hljs-number\">0\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">page-break-inside\u003C/span>: avoid;\n    \u003Cspan class=\"hljs-attribute\">text-align\u003C/span>: center;\n  }\n  \n  \u003Cspan class=\"hljs-selector-tag\">figcaption\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">font-size\u003C/span>: \u003Cspan class=\"hljs-number\">10pt\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">font-style\u003C/span>: italic;\n    \u003Cspan class=\"hljs-attribute\">margin-top\u003C/span>: \u003Cspan class=\"hljs-number\">6pt\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">text-align\u003C/span>: center;\n  }\n  \n  \u003Cspan class=\"hljs-comment\">/* Hide web-only elements */\u003C/span>\n  \u003Cspan class=\"hljs-selector-class\">.no-print\u003C/span>,\n  \u003Cspan class=\"hljs-selector-class\">.screen-only\u003C/span>,\n  \u003Cspan class=\"hljs-selector-tag\">nav\u003C/span>,\n  \u003Cspan class=\"hljs-selector-class\">.navigation\u003C/span>,\n  \u003Cspan class=\"hljs-selector-class\">.sidebar\u003C/span>,\n  \u003Cspan class=\"hljs-selector-class\">.advertisement\u003C/span>,\n  \u003Cspan class=\"hljs-selector-class\">.social-share\u003C/span>,\n  \u003Cspan class=\"hljs-selector-tag\">button\u003C/span>\u003Cspan class=\"hljs-selector-pseudo\">:not\u003C/span>(\u003Cspan class=\"hljs-selector-class\">.print-button\u003C/span>),\n  \u003Cspan class=\"hljs-selector-tag\">input\u003C/span>\u003Cspan class=\"hljs-selector-attr\">[type=\u003Cspan class=\"hljs-string\">&quot;search&quot;\u003C/span>]\u003C/span>,\n  \u003Cspan class=\"hljs-selector-class\">.search-form\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">display\u003C/span>: none \u003Cspan class=\"hljs-meta\">!important\u003C/span>;\n  }\n  \n  \u003Cspan class=\"hljs-comment\">/* Show print-only elements */\u003C/span>\n  \u003Cspan class=\"hljs-selector-class\">.print-only\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">display\u003C/span>: block \u003Cspan class=\"hljs-meta\">!important\u003C/span>;\n  }\n  \n  \u003Cspan class=\"hljs-comment\">/* URL display for links */\u003C/span>\n  \u003Cspan class=\"hljs-selector-tag\">a\u003C/span>\u003Cspan class=\"hljs-selector-pseudo\">:after\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">content\u003C/span>: \u003Cspan class=\"hljs-string\">&quot; (&quot;\u003C/span> \u003Cspan class=\"hljs-built_in\">attr\u003C/span>(href) \u003Cspan class=\"hljs-string\">&quot;)&quot;\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">font-size\u003C/span>: \u003Cspan class=\"hljs-number\">9pt\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">color\u003C/span>: \u003Cspan class=\"hljs-built_in\">var\u003C/span>(--print-secondary-color);\n    \u003Cspan class=\"hljs-attribute\">text-decoration\u003C/span>: none;\n  }\n  \n  \u003Cspan class=\"hljs-selector-tag\">a\u003C/span>\u003Cspan class=\"hljs-selector-attr\">[href^=\u003Cspan class=\"hljs-string\">&quot;#&quot;\u003C/span>]\u003C/span>\u003Cspan class=\"hljs-selector-pseudo\">:after\u003C/span>,\n  \u003Cspan class=\"hljs-selector-tag\">a\u003C/span>\u003Cspan class=\"hljs-selector-attr\">[href^=\u003Cspan class=\"hljs-string\">&quot;javascript:&quot;\u003C/span>]\u003C/span>\u003Cspan class=\"hljs-selector-pseudo\">:after\u003C/span>,\n  \u003Cspan class=\"hljs-selector-tag\">a\u003C/span>\u003Cspan class=\"hljs-selector-attr\">[href=\u003Cspan class=\"hljs-string\">&quot;&quot;\u003C/span>]\u003C/span>\u003Cspan class=\"hljs-selector-pseudo\">:after\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">content\u003C/span>: \u003Cspan class=\"hljs-string\">&quot;&quot;\u003C/span>;\n  }\n  \n  \u003Cspan class=\"hljs-comment\">/* Page break controls */\u003C/span>\n  \u003Cspan class=\"hljs-selector-class\">.page-break-before\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">page-break-before\u003C/span>: always;\n  }\n  \n  \u003Cspan class=\"hljs-selector-class\">.page-break-after\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">page-break-after\u003C/span>: always;\n  }\n  \n  \u003Cspan class=\"hljs-selector-class\">.page-break-inside-avoid\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">page-break-inside\u003C/span>: avoid;\n  }\n  \n  \u003Cspan class=\"hljs-selector-class\">.keep-together\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">page-break-inside\u003C/span>: avoid;\n    \u003Cspan class=\"hljs-attribute\">display\u003C/span>: block;\n  }\n  \n  \u003Cspan class=\"hljs-comment\">/* Chapter and section breaks */\u003C/span>\n  \u003Cspan class=\"hljs-selector-class\">.chapter\u003C/span> {\n    page: chapter;\n    \u003Cspan class=\"hljs-attribute\">page-break-before\u003C/span>: always;\n  }\n  \n  \u003Cspan class=\"hljs-selector-class\">.section\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">page-break-before\u003C/span>: avoid;\n  }\n  \n  \u003Cspan class=\"hljs-comment\">/* Table of contents styling */\u003C/span>\n  \u003Cspan class=\"hljs-selector-class\">.toc\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">page-break-after\u003C/span>: always;\n  }\n  \n  \u003Cspan class=\"hljs-selector-class\">.toc-entry\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">display\u003C/span>: flex;\n    \u003Cspan class=\"hljs-attribute\">justify-content\u003C/span>: space-between;\n    \u003Cspan class=\"hljs-attribute\">margin-bottom\u003C/span>: \u003Cspan class=\"hljs-number\">6pt\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">border-bottom\u003C/span>: \u003Cspan class=\"hljs-number\">1pt\u003C/span> dotted \u003Cspan class=\"hljs-built_in\">var\u003C/span>(--print-accent-color);\n    \u003Cspan class=\"hljs-attribute\">padding-bottom\u003C/span>: \u003Cspan class=\"hljs-number\">2pt\u003C/span>;\n  }\n  \n  \u003Cspan class=\"hljs-selector-class\">.toc-title\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">flex-grow\u003C/span>: \u003Cspan class=\"hljs-number\">1\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">margin-right\u003C/span>: \u003Cspan class=\"hljs-number\">12pt\u003C/span>;\n  }\n  \n  \u003Cspan class=\"hljs-selector-class\">.toc-page\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">flex-shrink\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">font-weight\u003C/span>: bold;\n  }\n  \n  \u003Cspan class=\"hljs-comment\">/* Print optimization for specific content types */\u003C/span>\n  \u003Cspan class=\"hljs-selector-class\">.callout\u003C/span>,\n  \u003Cspan class=\"hljs-selector-class\">.alert\u003C/span>,\n  \u003Cspan class=\"hljs-selector-class\">.note\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">border\u003C/span>: \u003Cspan class=\"hljs-number\">2pt\u003C/span> solid \u003Cspan class=\"hljs-built_in\">var\u003C/span>(--print-border-color);\n    \u003Cspan class=\"hljs-attribute\">padding\u003C/span>: \u003Cspan class=\"hljs-number\">8pt\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">margin\u003C/span>: \u003Cspan class=\"hljs-number\">12pt\u003C/span> \u003Cspan class=\"hljs-number\">0\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">background\u003C/span>: \u003Cspan class=\"hljs-number\">#f9f9f9\u003C/span> \u003Cspan class=\"hljs-meta\">!important\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">page-break-inside\u003C/span>: avoid;\n  }\n  \n  \u003Cspan class=\"hljs-selector-class\">.callout-title\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">font-weight\u003C/span>: bold;\n    \u003Cspan class=\"hljs-attribute\">margin-bottom\u003C/span>: \u003Cspan class=\"hljs-number\">6pt\u003C/span>;\n  }\n  \n  \u003Cspan class=\"hljs-comment\">/* Footnote styling */\u003C/span>\n  \u003Cspan class=\"hljs-selector-class\">.footnote\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">font-size\u003C/span>: \u003Cspan class=\"hljs-number\">9pt\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">margin-top\u003C/span>: \u003Cspan class=\"hljs-number\">24pt\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">border-top\u003C/span>: \u003Cspan class=\"hljs-number\">1pt\u003C/span> solid \u003Cspan class=\"hljs-built_in\">var\u003C/span>(--print-border-color);\n    \u003Cspan class=\"hljs-attribute\">padding-top\u003C/span>: \u003Cspan class=\"hljs-number\">6pt\u003C/span>;\n  }\n  \n  \u003Cspan class=\"hljs-selector-class\">.footnote-ref\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">vertical-align\u003C/span>: super;\n    \u003Cspan class=\"hljs-attribute\">font-size\u003C/span>: \u003Cspan class=\"hljs-number\">8pt\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">line-height\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>;\n  }\n  \n  \u003Cspan class=\"hljs-comment\">/* Index styling */\u003C/span>\n  \u003Cspan class=\"hljs-selector-class\">.index\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">column-count\u003C/span>: \u003Cspan class=\"hljs-number\">2\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">column-gap\u003C/span>: \u003Cspan class=\"hljs-number\">24pt\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">column-rule\u003C/span>: \u003Cspan class=\"hljs-number\">1pt\u003C/span> solid \u003Cspan class=\"hljs-built_in\">var\u003C/span>(--print-accent-color);\n  }\n  \n  \u003Cspan class=\"hljs-selector-class\">.index-entry\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">margin-bottom\u003C/span>: \u003Cspan class=\"hljs-number\">3pt\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">text-indent\u003C/span>: -\u003Cspan class=\"hljs-number\">12pt\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">margin-left\u003C/span>: \u003Cspan class=\"hljs-number\">12pt\u003C/span>;\n  }\n  \n  \u003Cspan class=\"hljs-selector-class\">.index-subentry\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">margin-left\u003C/span>: \u003Cspan class=\"hljs-number\">12pt\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">font-size\u003C/span>: \u003Cspan class=\"hljs-number\">10pt\u003C/span>;\n  }\n}\n\n\u003Cspan class=\"hljs-comment\">/* High-resolution print styles */\u003C/span>\n\u003Cspan class=\"hljs-keyword\">@media\u003C/span> print \u003Cspan class=\"hljs-keyword\">and\u003C/span> (\u003Cspan class=\"hljs-attribute\">min-resolution\u003C/span>: \u003Cspan class=\"hljs-number\">300dpi\u003C/span>) {\n  \u003Cspan class=\"hljs-selector-tag\">body\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">font-size\u003C/span>: \u003Cspan class=\"hljs-number\">11pt\u003C/span>;\n  }\n  \n  \u003Cspan class=\"hljs-selector-tag\">h1\u003C/span> { \u003Cspan class=\"hljs-attribute\">font-size\u003C/span>: \u003Cspan class=\"hljs-number\">17pt\u003C/span>; }\n  \u003Cspan class=\"hljs-selector-tag\">h2\u003C/span> { \u003Cspan class=\"hljs-attribute\">font-size\u003C/span>: \u003Cspan class=\"hljs-number\">15pt\u003C/span>; }\n  \u003Cspan class=\"hljs-selector-tag\">h3\u003C/span> { \u003Cspan class=\"hljs-attribute\">font-size\u003C/span>: \u003Cspan class=\"hljs-number\">13pt\u003C/span>; }\n  \n  \u003Cspan class=\"hljs-selector-tag\">code\u003C/span>, pre {\n    \u003Cspan class=\"hljs-attribute\">font-size\u003C/span>: \u003Cspan class=\"hljs-number\">8pt\u003C/span>;\n  }\n}\n\n\u003Cspan class=\"hljs-comment\">/* Print styles for different paper sizes */\u003C/span>\n\u003Cspan class=\"hljs-keyword\">@media\u003C/span> print \u003Cspan class=\"hljs-keyword\">and\u003C/span> (\u003Cspan class=\"hljs-attribute\">width\u003C/span>: \u003Cspan class=\"hljs-number\">210mm\u003C/span>) { \u003Cspan class=\"hljs-comment\">/* A4 width */\u003C/span>\n  \u003Cspan class=\"hljs-selector-pseudo\">:root\u003C/span> {\n    \u003Cspan class=\"hljs-attr\">--print-margin\u003C/span>: \u003Cspan class=\"hljs-number\">25mm\u003C/span>;\n  }\n  \n  \u003Cspan class=\"hljs-keyword\">@page\u003C/span> {\n    size: A4;\n    \u003Cspan class=\"hljs-attribute\">margin\u003C/span>: \u003Cspan class=\"hljs-built_in\">var\u003C/span>(--print-margin);\n  }\n}\n\n\u003Cspan class=\"hljs-keyword\">@media\u003C/span> print \u003Cspan class=\"hljs-keyword\">and\u003C/span> (\u003Cspan class=\"hljs-attribute\">width\u003C/span>: \u003Cspan class=\"hljs-number\">8.5in\u003C/span>) { \u003Cspan class=\"hljs-comment\">/* US Letter width */\u003C/span>\n  \u003Cspan class=\"hljs-selector-pseudo\">:root\u003C/span> {\n    \u003Cspan class=\"hljs-attr\">--print-margin\u003C/span>: \u003Cspan class=\"hljs-number\">1in\u003C/span>;\n  }\n  \n  \u003Cspan class=\"hljs-keyword\">@page\u003C/span> {\n    size: letter;\n    \u003Cspan class=\"hljs-attribute\">margin\u003C/span>: \u003Cspan class=\"hljs-built_in\">var\u003C/span>(--print-margin);\n  }\n}\n\u003C/code>\u003C/pre>\u003Ch3 id=\"advanced-page-layout-and-typography\">Advanced Page Layout and Typography\u003C/h3>\n\u003Cp>Professional document formatting with sophisticated layout control:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-css\">\u003Cspan class=\"hljs-comment\">/* advanced-print-layout.css - Enterprise document formatting */\u003C/span>\n\n\u003Cspan class=\"hljs-keyword\">@media\u003C/span> print {\n  \u003Cspan class=\"hljs-comment\">/* Document structure variables */\u003C/span>\n  \u003Cspan class=\"hljs-selector-pseudo\">:root\u003C/span> {\n    \u003Cspan class=\"hljs-attr\">--document-title\u003C/span>: \u003Cspan class=\"hljs-string\">&quot;Technical Documentation&quot;\u003C/span>;\n    \u003Cspan class=\"hljs-attr\">--document-version\u003C/span>: \u003Cspan class=\"hljs-string\">&quot;v2.1&quot;\u003C/span>;\n    \u003Cspan class=\"hljs-attr\">--document-date\u003C/span>: \u003Cspan class=\"hljs-string\">&quot;September 2025&quot;\u003C/span>;\n    \u003Cspan class=\"hljs-attr\">--company-name\u003C/span>: \u003Cspan class=\"hljs-string\">&quot;Professional Publishing&quot;\u003C/span>;\n    \n    \u003Cspan class=\"hljs-attr\">--page-number-format\u003C/span>: decimal;\n    \u003Cspan class=\"hljs-attr\">--chapter-number-format\u003C/span>: upper-roman;\n    \u003Cspan class=\"hljs-attr\">--section-number-format\u003C/span>: decimal;\n  }\n  \n  \u003Cspan class=\"hljs-comment\">/* Multi-page document structure */\u003C/span>\n  \u003Cspan class=\"hljs-keyword\">@page\u003C/span> cover {\n    \u003Cspan class=\"hljs-attribute\">margin\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>;\n    \n    \u003Cspan class=\"hljs-keyword\">@top-left\u003C/span> { \u003Cspan class=\"hljs-attribute\">content\u003C/span>: none; }\n    \u003Cspan class=\"hljs-keyword\">@top-right\u003C/span> { \u003Cspan class=\"hljs-attribute\">content\u003C/span>: none; }\n    \u003Cspan class=\"hljs-keyword\">@bottom-center\u003C/span> { \u003Cspan class=\"hljs-attribute\">content\u003C/span>: none; }\n  }\n  \n  \u003Cspan class=\"hljs-keyword\">@page\u003C/span> toc {\n    \u003Cspan class=\"hljs-keyword\">@top-left\u003C/span> {\n      \u003Cspan class=\"hljs-attribute\">content\u003C/span>: \u003Cspan class=\"hljs-string\">&quot;Table of Contents&quot;\u003C/span>;\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">@bottom-center\u003C/span> {\n      \u003Cspan class=\"hljs-attribute\">content\u003C/span>: \u003Cspan class=\"hljs-string\">&quot;Page &quot;\u003C/span> \u003Cspan class=\"hljs-built_in\">counter\u003C/span>(page, lower-roman);\n    }\n  }\n  \n  \u003Cspan class=\"hljs-keyword\">@page\u003C/span> \u003Cspan class=\"hljs-attribute\">chapter\u003C/span>:first {\n    \u003Cspan class=\"hljs-attribute\">margin-top\u003C/span>: \u003Cspan class=\"hljs-number\">2in\u003C/span>;\n    \n    \u003Cspan class=\"hljs-keyword\">@top-left\u003C/span> { \u003Cspan class=\"hljs-attribute\">content\u003C/span>: none; }\n  }\n  \n  \u003Cspan class=\"hljs-keyword\">@page\u003C/span> \u003Cspan class=\"hljs-attribute\">chapter\u003C/span>:left {\n    \u003Cspan class=\"hljs-attribute\">margin-left\u003C/span>: \u003Cspan class=\"hljs-number\">1.5in\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">margin-right\u003C/span>: \u003Cspan class=\"hljs-number\">1in\u003C/span>;\n    \n    \u003Cspan class=\"hljs-keyword\">@top-left\u003C/span> {\n      \u003Cspan class=\"hljs-attribute\">content\u003C/span>: \u003Cspan class=\"hljs-built_in\">var\u003C/span>(--document-title);\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">@top-right\u003C/span> { \u003Cspan class=\"hljs-attribute\">content\u003C/span>: none; }\n  }\n  \n  \u003Cspan class=\"hljs-keyword\">@page\u003C/span> \u003Cspan class=\"hljs-attribute\">chapter\u003C/span>:right {\n    \u003Cspan class=\"hljs-attribute\">margin-left\u003C/span>: \u003Cspan class=\"hljs-number\">1in\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">margin-right\u003C/span>: \u003Cspan class=\"hljs-number\">1.5in\u003C/span>;\n    \n    \u003Cspan class=\"hljs-keyword\">@top-left\u003C/span> { \u003Cspan class=\"hljs-attribute\">content\u003C/span>: none; }\n    \n    \u003Cspan class=\"hljs-keyword\">@top-right\u003C/span> {\n      \u003Cspan class=\"hljs-attribute\">content\u003C/span>: \u003Cspan class=\"hljs-string\">&quot;Chapter &quot;\u003C/span> \u003Cspan class=\"hljs-built_in\">counter\u003C/span>(chapter, \u003Cspan class=\"hljs-built_in\">var\u003C/span>(--chapter-number-format));\n    }\n  }\n  \n  \u003Cspan class=\"hljs-comment\">/* Advanced counters */\u003C/span>\n  \u003Cspan class=\"hljs-selector-tag\">body\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">counter-reset\u003C/span>: chapter \u003Cspan class=\"hljs-number\">0\u003C/span> page \u003Cspan class=\"hljs-number\">1\u003C/span>;\n  }\n  \n  \u003Cspan class=\"hljs-selector-class\">.cover-page\u003C/span> {\n    page: cover;\n    \u003Cspan class=\"hljs-attribute\">page-break-after\u003C/span>: always;\n  }\n  \n  \u003Cspan class=\"hljs-selector-class\">.table-of-contents\u003C/span> {\n    page: toc;\n    \u003Cspan class=\"hljs-attribute\">counter-reset\u003C/span>: page \u003Cspan class=\"hljs-number\">1\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">page-break-after\u003C/span>: always;\n  }\n  \n  \u003Cspan class=\"hljs-selector-class\">.chapter\u003C/span> {\n    page: chapter;\n    \u003Cspan class=\"hljs-attribute\">page-break-before\u003C/span>: always;\n    \u003Cspan class=\"hljs-attribute\">counter-increment\u003C/span>: chapter;\n    \u003Cspan class=\"hljs-attribute\">counter-reset\u003C/span>: section \u003Cspan class=\"hljs-number\">0\u003C/span> subsection \u003Cspan class=\"hljs-number\">0\u003C/span>;\n  }\n  \n  \u003Cspan class=\"hljs-comment\">/* Chapter title pages */\u003C/span>\n  \u003Cspan class=\"hljs-selector-class\">.chapter-title\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">font-size\u003C/span>: \u003Cspan class=\"hljs-number\">24pt\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">font-weight\u003C/span>: bold;\n    \u003Cspan class=\"hljs-attribute\">text-align\u003C/span>: center;\n    \u003Cspan class=\"hljs-attribute\">margin-top\u003C/span>: \u003Cspan class=\"hljs-number\">2in\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">margin-bottom\u003C/span>: \u003Cspan class=\"hljs-number\">1in\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">page-break-after\u003C/span>: avoid;\n  }\n  \n  \u003Cspan class=\"hljs-selector-class\">.chapter-title\u003C/span>\u003Cspan class=\"hljs-selector-pseudo\">::before\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">content\u003C/span>: \u003Cspan class=\"hljs-string\">&quot;Chapter &quot;\u003C/span> \u003Cspan class=\"hljs-built_in\">counter\u003C/span>(chapter, \u003Cspan class=\"hljs-built_in\">var\u003C/span>(--chapter-number-format));\n    \u003Cspan class=\"hljs-attribute\">display\u003C/span>: block;\n    \u003Cspan class=\"hljs-attribute\">font-size\u003C/span>: \u003Cspan class=\"hljs-number\">18pt\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">font-weight\u003C/span>: normal;\n    \u003Cspan class=\"hljs-attribute\">margin-bottom\u003C/span>: \u003Cspan class=\"hljs-number\">0.5in\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">color\u003C/span>: \u003Cspan class=\"hljs-built_in\">var\u003C/span>(--print-secondary-color);\n  }\n  \n  \u003Cspan class=\"hljs-selector-class\">.chapter-summary\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">font-style\u003C/span>: italic;\n    \u003Cspan class=\"hljs-attribute\">text-align\u003C/span>: center;\n    \u003Cspan class=\"hljs-attribute\">margin\u003C/span>: \u003Cspan class=\"hljs-number\">1in\u003C/span> \u003Cspan class=\"hljs-number\">2in\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">page-break-after\u003C/span>: always;\n  }\n  \n  \u003Cspan class=\"hljs-comment\">/* Advanced section numbering */\u003C/span>\n  \u003Cspan class=\"hljs-selector-class\">.section-header\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">counter-increment\u003C/span>: section;\n    \u003Cspan class=\"hljs-attribute\">counter-reset\u003C/span>: subsection \u003Cspan class=\"hljs-number\">0\u003C/span>;\n  }\n  \n  \u003Cspan class=\"hljs-selector-class\">.section-header\u003C/span>\u003Cspan class=\"hljs-selector-pseudo\">::before\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">content\u003C/span>: \u003Cspan class=\"hljs-built_in\">counter\u003C/span>(chapter) \u003Cspan class=\"hljs-string\">&quot;.&quot;\u003C/span> \u003Cspan class=\"hljs-built_in\">counter\u003C/span>(section) \u003Cspan class=\"hljs-string\">&quot; &quot;\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">font-weight\u003C/span>: bold;\n  }\n  \n  \u003Cspan class=\"hljs-selector-class\">.subsection-header\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">counter-increment\u003C/span>: subsection;\n  }\n  \n  \u003Cspan class=\"hljs-selector-class\">.subsection-header\u003C/span>\u003Cspan class=\"hljs-selector-pseudo\">::before\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">content\u003C/span>: \u003Cspan class=\"hljs-built_in\">counter\u003C/span>(chapter) \u003Cspan class=\"hljs-string\">&quot;.&quot;\u003C/span> \u003Cspan class=\"hljs-built_in\">counter\u003C/span>(section) \u003Cspan class=\"hljs-string\">&quot;.&quot;\u003C/span> \u003Cspan class=\"hljs-built_in\">counter\u003C/span>(subsection) \u003Cspan class=\"hljs-string\">&quot; &quot;\u003C/span>;\n  }\n  \n  \u003Cspan class=\"hljs-comment\">/* Professional table formatting */\u003C/span>\n  \u003Cspan class=\"hljs-selector-class\">.data-table\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">font-size\u003C/span>: \u003Cspan class=\"hljs-number\">9pt\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">margin\u003C/span>: \u003Cspan class=\"hljs-number\">18pt\u003C/span> \u003Cspan class=\"hljs-number\">0\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">width\u003C/span>: \u003Cspan class=\"hljs-number\">100%\u003C/span>;\n  }\n  \n  \u003Cspan class=\"hljs-selector-class\">.data-table\u003C/span> \u003Cspan class=\"hljs-selector-tag\">th\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">background\u003C/span>: \u003Cspan class=\"hljs-number\">#e0e0e0\u003C/span> \u003Cspan class=\"hljs-meta\">!important\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">font-weight\u003C/span>: bold;\n    \u003Cspan class=\"hljs-attribute\">text-align\u003C/span>: center;\n    \u003Cspan class=\"hljs-attribute\">padding\u003C/span>: \u003Cspan class=\"hljs-number\">8pt\u003C/span> \u003Cspan class=\"hljs-number\">6pt\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">border\u003C/span>: \u003Cspan class=\"hljs-number\">1pt\u003C/span> solid \u003Cspan class=\"hljs-built_in\">var\u003C/span>(--print-border-color);\n  }\n  \n  \u003Cspan class=\"hljs-selector-class\">.data-table\u003C/span> \u003Cspan class=\"hljs-selector-tag\">td\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">padding\u003C/span>: \u003Cspan class=\"hljs-number\">4pt\u003C/span> \u003Cspan class=\"hljs-number\">6pt\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">border\u003C/span>: \u003Cspan class=\"hljs-number\">0.5pt\u003C/span> solid \u003Cspan class=\"hljs-built_in\">var\u003C/span>(--print-accent-color);\n    \u003Cspan class=\"hljs-attribute\">text-align\u003C/span>: left;\n  }\n  \n  \u003Cspan class=\"hljs-selector-class\">.data-table\u003C/span> \u003Cspan class=\"hljs-selector-class\">.numeric\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">text-align\u003C/span>: right;\n    \u003Cspan class=\"hljs-attribute\">font-family\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Courier New&#x27;\u003C/span>, monospace;\n  }\n  \n  \u003Cspan class=\"hljs-selector-class\">.data-table\u003C/span> \u003Cspan class=\"hljs-selector-class\">.centered\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">text-align\u003C/span>: center;\n  }\n  \n  \u003Cspan class=\"hljs-comment\">/* Table captions and numbering */\u003C/span>\n  \u003Cspan class=\"hljs-selector-class\">.table-caption\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">font-weight\u003C/span>: bold;\n    \u003Cspan class=\"hljs-attribute\">margin-bottom\u003C/span>: \u003Cspan class=\"hljs-number\">6pt\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">text-align\u003C/span>: center;\n    \u003Cspan class=\"hljs-attribute\">counter-increment\u003C/span>: table;\n  }\n  \n  \u003Cspan class=\"hljs-selector-class\">.table-caption\u003C/span>\u003Cspan class=\"hljs-selector-pseudo\">::before\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">content\u003C/span>: \u003Cspan class=\"hljs-string\">&quot;Table &quot;\u003C/span> \u003Cspan class=\"hljs-built_in\">counter\u003C/span>(chapter) \u003Cspan class=\"hljs-string\">&quot;-&quot;\u003C/span> \u003Cspan class=\"hljs-built_in\">counter\u003C/span>(table) \u003Cspan class=\"hljs-string\">&quot;: &quot;\u003C/span>;\n  }\n  \n  \u003Cspan class=\"hljs-comment\">/* Figure numbering and captions */\u003C/span>\n  \u003Cspan class=\"hljs-selector-class\">.figure\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">counter-increment\u003C/span>: figure;\n    \u003Cspan class=\"hljs-attribute\">text-align\u003C/span>: center;\n    \u003Cspan class=\"hljs-attribute\">page-break-inside\u003C/span>: avoid;\n    \u003Cspan class=\"hljs-attribute\">margin\u003C/span>: \u003Cspan class=\"hljs-number\">18pt\u003C/span> \u003Cspan class=\"hljs-number\">0\u003C/span>;\n  }\n  \n  \u003Cspan class=\"hljs-selector-class\">.figure-caption\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">font-style\u003C/span>: italic;\n    \u003Cspan class=\"hljs-attribute\">font-size\u003C/span>: \u003Cspan class=\"hljs-number\">10pt\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">margin-top\u003C/span>: \u003Cspan class=\"hljs-number\">6pt\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">counter-increment\u003C/span>: figure;\n  }\n  \n  \u003Cspan class=\"hljs-selector-class\">.figure-caption\u003C/span>\u003Cspan class=\"hljs-selector-pseudo\">::before\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">content\u003C/span>: \u003Cspan class=\"hljs-string\">&quot;Figure &quot;\u003C/span> \u003Cspan class=\"hljs-built_in\">counter\u003C/span>(chapter) \u003Cspan class=\"hljs-string\">&quot;-&quot;\u003C/span> \u003Cspan class=\"hljs-built_in\">counter\u003C/span>(figure) \u003Cspan class=\"hljs-string\">&quot;: &quot;\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">font-weight\u003C/span>: bold;\n  }\n  \n  \u003Cspan class=\"hljs-comment\">/* Code listing formatting */\u003C/span>\n  \u003Cspan class=\"hljs-selector-class\">.code-listing\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">page-break-inside\u003C/span>: avoid;\n    \u003Cspan class=\"hljs-attribute\">counter-increment\u003C/span>: listing;\n  }\n  \n  \u003Cspan class=\"hljs-selector-class\">.code-listing-title\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">font-weight\u003C/span>: bold;\n    \u003Cspan class=\"hljs-attribute\">margin-bottom\u003C/span>: \u003Cspan class=\"hljs-number\">6pt\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">border-bottom\u003C/span>: \u003Cspan class=\"hljs-number\">1pt\u003C/span> solid \u003Cspan class=\"hljs-built_in\">var\u003C/span>(--print-accent-color);\n    \u003Cspan class=\"hljs-attribute\">padding-bottom\u003C/span>: \u003Cspan class=\"hljs-number\">3pt\u003C/span>;\n  }\n  \n  \u003Cspan class=\"hljs-selector-class\">.code-listing-title\u003C/span>\u003Cspan class=\"hljs-selector-pseudo\">::before\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">content\u003C/span>: \u003Cspan class=\"hljs-string\">&quot;Listing &quot;\u003C/span> \u003Cspan class=\"hljs-built_in\">counter\u003C/span>(chapter) \u003Cspan class=\"hljs-string\">&quot;-&quot;\u003C/span> \u003Cspan class=\"hljs-built_in\">counter\u003C/span>(listing) \u003Cspan class=\"hljs-string\">&quot;: &quot;\u003C/span>;\n  }\n  \n  \u003Cspan class=\"hljs-selector-class\">.code-listing\u003C/span> pre {\n    \u003Cspan class=\"hljs-attribute\">margin-top\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">border\u003C/span>: \u003Cspan class=\"hljs-number\">1pt\u003C/span> solid \u003Cspan class=\"hljs-built_in\">var\u003C/span>(--print-border-color);\n    \u003Cspan class=\"hljs-attribute\">background\u003C/span>: \u003Cspan class=\"hljs-number\">#f8f8f8\u003C/span> \u003Cspan class=\"hljs-meta\">!important\u003C/span>;\n  }\n  \n  \u003Cspan class=\"hljs-comment\">/* Cross-references */\u003C/span>\n  \u003Cspan class=\"hljs-selector-class\">.ref-chapter\u003C/span>\u003Cspan class=\"hljs-selector-pseudo\">::before\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">content\u003C/span>: \u003Cspan class=\"hljs-string\">&quot;Chapter &quot;\u003C/span> \u003Cspan class=\"hljs-built_in\">target-counter\u003C/span>(\u003Cspan class=\"hljs-built_in\">attr\u003C/span>(href), chapter);\n  }\n  \n  \u003Cspan class=\"hljs-selector-class\">.ref-section\u003C/span>\u003Cspan class=\"hljs-selector-pseudo\">::before\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">content\u003C/span>: \u003Cspan class=\"hljs-string\">&quot;Section &quot;\u003C/span> \u003Cspan class=\"hljs-built_in\">target-counter\u003C/span>(\u003Cspan class=\"hljs-built_in\">attr\u003C/span>(href), chapter) \u003Cspan class=\"hljs-string\">&quot;.&quot;\u003C/span> \u003Cspan class=\"hljs-built_in\">target-counter\u003C/span>(\u003Cspan class=\"hljs-built_in\">attr\u003C/span>(href), section);\n  }\n  \n  \u003Cspan class=\"hljs-selector-class\">.ref-page\u003C/span>\u003Cspan class=\"hljs-selector-pseudo\">::after\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">content\u003C/span>: \u003Cspan class=\"hljs-string\">&quot; (page &quot;\u003C/span> \u003Cspan class=\"hljs-built_in\">target-counter\u003C/span>(\u003Cspan class=\"hljs-built_in\">attr\u003C/span>(href), page) \u003Cspan class=\"hljs-string\">&quot;)&quot;\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">font-style\u003C/span>: italic;\n    \u003Cspan class=\"hljs-attribute\">color\u003C/span>: \u003Cspan class=\"hljs-built_in\">var\u003C/span>(--print-secondary-color);\n  }\n  \n  \u003Cspan class=\"hljs-comment\">/* Appendix formatting */\u003C/span>\n  \u003Cspan class=\"hljs-selector-class\">.appendix\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">page-break-before\u003C/span>: always;\n    \u003Cspan class=\"hljs-attribute\">counter-reset\u003C/span>: section \u003Cspan class=\"hljs-number\">0\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">counter-increment\u003C/span>: appendix;\n  }\n  \n  \u003Cspan class=\"hljs-selector-class\">.appendix-title\u003C/span>\u003Cspan class=\"hljs-selector-pseudo\">::before\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">content\u003C/span>: \u003Cspan class=\"hljs-string\">&quot;Appendix &quot;\u003C/span> \u003Cspan class=\"hljs-built_in\">counter\u003C/span>(appendix, upper-alpha) \u003Cspan class=\"hljs-string\">&quot;: &quot;\u003C/span>;\n  }\n  \n  \u003Cspan class=\"hljs-comment\">/* Glossary and index */\u003C/span>\n  \u003Cspan class=\"hljs-selector-class\">.glossary-term\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">font-weight\u003C/span>: bold;\n    \u003Cspan class=\"hljs-attribute\">text-indent\u003C/span>: -\u003Cspan class=\"hljs-number\">18pt\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">margin-left\u003C/span>: \u003Cspan class=\"hljs-number\">18pt\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">margin-bottom\u003C/span>: \u003Cspan class=\"hljs-number\">6pt\u003C/span>;\n  }\n  \n  \u003Cspan class=\"hljs-selector-class\">.glossary-definition\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">margin-bottom\u003C/span>: \u003Cspan class=\"hljs-number\">12pt\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">margin-left\u003C/span>: \u003Cspan class=\"hljs-number\">18pt\u003C/span>;\n  }\n  \n  \u003Cspan class=\"hljs-comment\">/* Bibliography and references */\u003C/span>\n  \u003Cspan class=\"hljs-selector-class\">.bibliography\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">page-break-before\u003C/span>: always;\n  }\n  \n  \u003Cspan class=\"hljs-selector-class\">.reference\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">text-indent\u003C/span>: -\u003Cspan class=\"hljs-number\">24pt\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">margin-left\u003C/span>: \u003Cspan class=\"hljs-number\">24pt\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">margin-bottom\u003C/span>: \u003Cspan class=\"hljs-number\">12pt\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">counter-increment\u003C/span>: reference;\n  }\n  \n  \u003Cspan class=\"hljs-selector-class\">.reference\u003C/span>\u003Cspan class=\"hljs-selector-pseudo\">::before\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">content\u003C/span>: \u003Cspan class=\"hljs-string\">&quot;[&quot;\u003C/span> \u003Cspan class=\"hljs-built_in\">counter\u003C/span>(reference) \u003Cspan class=\"hljs-string\">&quot;] &quot;\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">font-weight\u003C/span>: bold;\n  }\n  \n  \u003Cspan class=\"hljs-comment\">/* Mathematical equations */\u003C/span>\n  \u003Cspan class=\"hljs-selector-class\">.equation\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">text-align\u003C/span>: center;\n    \u003Cspan class=\"hljs-attribute\">margin\u003C/span>: \u003Cspan class=\"hljs-number\">18pt\u003C/span> \u003Cspan class=\"hljs-number\">0\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">counter-increment\u003C/span>: equation;\n  }\n  \n  \u003Cspan class=\"hljs-selector-class\">.equation\u003C/span>\u003Cspan class=\"hljs-selector-pseudo\">::after\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">content\u003C/span>: \u003Cspan class=\"hljs-string\">&quot; (&quot;\u003C/span> \u003Cspan class=\"hljs-built_in\">counter\u003C/span>(chapter) \u003Cspan class=\"hljs-string\">&quot;.&quot;\u003C/span> \u003Cspan class=\"hljs-built_in\">counter\u003C/span>(equation) \u003Cspan class=\"hljs-string\">&quot;)&quot;\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">float\u003C/span>: right;\n    \u003Cspan class=\"hljs-attribute\">margin-right\u003C/span>: \u003Cspan class=\"hljs-number\">12pt\u003C/span>;\n  }\n  \n  \u003Cspan class=\"hljs-comment\">/* Warning and note boxes */\u003C/span>\n  \u003Cspan class=\"hljs-selector-class\">.warning-box\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">border\u003C/span>: \u003Cspan class=\"hljs-number\">2pt\u003C/span> solid \u003Cspan class=\"hljs-number\">#cc0000\u003C/span> \u003Cspan class=\"hljs-meta\">!important\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">background\u003C/span>: \u003Cspan class=\"hljs-number\">#ffe6e6\u003C/span> \u003Cspan class=\"hljs-meta\">!important\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">padding\u003C/span>: \u003Cspan class=\"hljs-number\">12pt\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">margin\u003C/span>: \u003Cspan class=\"hljs-number\">18pt\u003C/span> \u003Cspan class=\"hljs-number\">0\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">page-break-inside\u003C/span>: avoid;\n  }\n  \n  \u003Cspan class=\"hljs-selector-class\">.warning-box\u003C/span>\u003Cspan class=\"hljs-selector-pseudo\">::before\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">content\u003C/span>: \u003Cspan class=\"hljs-string\">&quot;⚠ WARNING: &quot;\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">font-weight\u003C/span>: bold;\n    \u003Cspan class=\"hljs-attribute\">color\u003C/span>: \u003Cspan class=\"hljs-number\">#cc0000\u003C/span>;\n  }\n  \n  \u003Cspan class=\"hljs-selector-class\">.note-box\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">border\u003C/span>: \u003Cspan class=\"hljs-number\">1pt\u003C/span> solid \u003Cspan class=\"hljs-built_in\">var\u003C/span>(--print-accent-color);\n    \u003Cspan class=\"hljs-attribute\">background\u003C/span>: \u003Cspan class=\"hljs-number\">#f0f0f0\u003C/span> \u003Cspan class=\"hljs-meta\">!important\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">padding\u003C/span>: \u003Cspan class=\"hljs-number\">8pt\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">margin\u003C/span>: \u003Cspan class=\"hljs-number\">12pt\u003C/span> \u003Cspan class=\"hljs-number\">0\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">font-size\u003C/span>: \u003Cspan class=\"hljs-number\">10pt\u003C/span>;\n  }\n  \n  \u003Cspan class=\"hljs-selector-class\">.note-box\u003C/span>\u003Cspan class=\"hljs-selector-pseudo\">::before\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">content\u003C/span>: \u003Cspan class=\"hljs-string\">&quot;Note: &quot;\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">font-weight\u003C/span>: bold;\n  }\n  \n  \u003Cspan class=\"hljs-comment\">/* Signature lines */\u003C/span>\n  \u003Cspan class=\"hljs-selector-class\">.signature-line\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">border-bottom\u003C/span>: \u003Cspan class=\"hljs-number\">1pt\u003C/span> solid \u003Cspan class=\"hljs-built_in\">var\u003C/span>(--print-border-color);\n    \u003Cspan class=\"hljs-attribute\">width\u003C/span>: \u003Cspan class=\"hljs-number\">3in\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">height\u003C/span>: \u003Cspan class=\"hljs-number\">24pt\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">margin\u003C/span>: \u003Cspan class=\"hljs-number\">24pt\u003C/span> \u003Cspan class=\"hljs-number\">0\u003C/span> \u003Cspan class=\"hljs-number\">6pt\u003C/span> \u003Cspan class=\"hljs-number\">0\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">display\u003C/span>: inline-block;\n  }\n  \n  \u003Cspan class=\"hljs-selector-class\">.signature-label\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">font-size\u003C/span>: \u003Cspan class=\"hljs-number\">10pt\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">color\u003C/span>: \u003Cspan class=\"hljs-built_in\">var\u003C/span>(--print-secondary-color);\n  }\n  \n  \u003Cspan class=\"hljs-comment\">/* Legal document formatting */\u003C/span>\n  \u003Cspan class=\"hljs-selector-class\">.legal-section\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">margin-left\u003C/span>: \u003Cspan class=\"hljs-number\">0.5in\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">text-indent\u003C/span>: -\u003Cspan class=\"hljs-number\">0.5in\u003C/span>;\n  }\n  \n  \u003Cspan class=\"hljs-selector-class\">.legal-subsection\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">margin-left\u003C/span>: \u003Cspan class=\"hljs-number\">1in\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">text-indent\u003C/span>: -\u003Cspan class=\"hljs-number\">0.5in\u003C/span>;\n  }\n  \n  \u003Cspan class=\"hljs-selector-class\">.legal-paragraph\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">margin-left\u003C/span>: \u003Cspan class=\"hljs-number\">1.5in\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">text-indent\u003C/span>: -\u003Cspan class=\"hljs-number\">0.5in\u003C/span>;\n  }\n}\n\u003C/code>\u003C/pre>\u003Ch2 id=\"pdf-generation-and-automation\">PDF Generation and Automation\u003C/h2>\n\u003Ch3 id=\"command-line-pdf-generation\">Command-Line PDF Generation\u003C/h3>\n\u003Cp>Automated PDF generation from Markdown using various tools:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-bash\">\u003Cspan class=\"hljs-meta\">#!/bin/bash\u003C/span>\n\u003Cspan class=\"hljs-comment\"># markdown-to-pdf-generator.sh - Professional PDF generation script\u003C/span>\n\n\u003Cspan class=\"hljs-comment\"># Configuration variables\u003C/span>\nINPUT_DIR=\u003Cspan class=\"hljs-string\">&quot;./markdown-docs&quot;\u003C/span>\nOUTPUT_DIR=\u003Cspan class=\"hljs-string\">&quot;./pdf-output&quot;\u003C/span>\nSTYLES_DIR=\u003Cspan class=\"hljs-string\">&quot;./print-styles&quot;\u003C/span>\nTEMPLATE_DIR=\u003Cspan class=\"hljs-string\">&quot;./pdf-templates&quot;\u003C/span>\n\n\u003Cspan class=\"hljs-comment\"># Pandoc-based PDF generation\u003C/span>\n\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-title\">generate_pdf_pandoc\u003C/span>\u003C/span>() {\n    \u003Cspan class=\"hljs-built_in\">local\u003C/span> input_file=\u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$1\u003C/span>&quot;\u003C/span>\n    \u003Cspan class=\"hljs-built_in\">local\u003C/span> output_file=\u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$2\u003C/span>&quot;\u003C/span>\n    \u003Cspan class=\"hljs-built_in\">local\u003C/span> template=\u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">${3:-default}\u003C/span>&quot;\u003C/span>\n    \n    \u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;Generating PDF with Pandoc: \u003Cspan class=\"hljs-variable\">$input_file\u003C/span> -&gt; \u003Cspan class=\"hljs-variable\">$output_file\u003C/span>&quot;\u003C/span>\n    \n    pandoc \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$input_file\u003C/span>&quot;\u003C/span> \\\n        --pdf-engine=xelatex \\\n        --template=\u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$TEMPLATE_DIR\u003C/span>/\u003Cspan class=\"hljs-variable\">${template}\u003C/span>.latex&quot;\u003C/span> \\\n        --css=\u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$STYLES_DIR\u003C/span>/print-styles.css&quot;\u003C/span> \\\n        --metadata-file=\u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$TEMPLATE_DIR\u003C/span>/metadata.yaml&quot;\u003C/span> \\\n        --table-of-contents \\\n        --toc-depth=3 \\\n        --number-sections \\\n        --highlight-style=tango \\\n        --variable geometry:margin=1in \\\n        --variable fontsize:12pt \\\n        --variable documentclass:article \\\n        --variable papersize:letter \\\n        --filter pandoc-crossref \\\n        --filter pandoc-citeproc \\\n        --output \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$output_file\u003C/span>&quot;\u003C/span>\n}\n\n\u003Cspan class=\"hljs-comment\"># Puppeteer-based PDF generation\u003C/span>\n\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-title\">generate_pdf_puppeteer\u003C/span>\u003C/span>() {\n    \u003Cspan class=\"hljs-built_in\">local\u003C/span> input_file=\u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$1\u003C/span>&quot;\u003C/span>\n    \u003Cspan class=\"hljs-built_in\">local\u003C/span> output_file=\u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$2\u003C/span>&quot;\u003C/span>\n    \n    \u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;Generating PDF with Puppeteer: \u003Cspan class=\"hljs-variable\">$input_file\u003C/span> -&gt; \u003Cspan class=\"hljs-variable\">$output_file\u003C/span>&quot;\u003C/span>\n    \n    node -e \u003Cspan class=\"hljs-string\">&quot;\nconst puppeteer = require(&#x27;puppeteer&#x27;);\nconst markdown = require(&#x27;markdown-it&#x27;)();\nconst fs = require(&#x27;fs&#x27;);\n\n(async () =&gt; {\n  const browser = await puppeteer.launch({\n    headless: true,\n    args: [&#x27;--no-sandbox&#x27;, &#x27;--disable-setuid-sandbox&#x27;]\n  });\n  \n  const page = await browser.newPage();\n  \n  // Read and convert Markdown\n  const markdownContent = fs.readFileSync(&#x27;\u003Cspan class=\"hljs-variable\">$input_file\u003C/span>&#x27;, &#x27;utf8&#x27;);\n  const htmlContent = markdown.render(markdownContent);\n  \n  // Read CSS styles\n  const printStyles = fs.readFileSync(&#x27;\u003Cspan class=\"hljs-variable\">$STYLES_DIR\u003C/span>/comprehensive-print-styles.css&#x27;, &#x27;utf8&#x27;);\n  const layoutStyles = fs.readFileSync(&#x27;\u003Cspan class=\"hljs-variable\">$STYLES_DIR\u003C/span>/advanced-print-layout.css&#x27;, &#x27;utf8&#x27;);\n  \n  // Create complete HTML document\n  const fullHtml = \\`\n&lt;!DOCTYPE html&gt;\n&lt;html&gt;\n&lt;head&gt;\n    &lt;meta charset=&#x27;utf-8&#x27;&gt;\n    &lt;title&gt;Document&lt;/title&gt;\n    &lt;style&gt;\n        \\${printStyles}\n        \\${layoutStyles}\n        \n        @media screen {\n            body { \n                max-width: 8.5in; \n                margin: 0 auto; \n                padding: 1in;\n                background: white;\n                box-shadow: 0 0 10px rgba(0,0,0,0.1);\n            }\n        }\n    &lt;/style&gt;\n&lt;/head&gt;\n&lt;body class=&#x27;typography-enhanced&#x27;&gt;\n    \\${htmlContent}\n&lt;/body&gt;\n&lt;/html&gt;\\`;\n  \n  await page.setContent(fullHtml, { waitUntil: &#x27;networkidle2&#x27; });\n  \n  await page.pdf({\n    path: &#x27;\u003Cspan class=\"hljs-variable\">$output_file\u003C/span>&#x27;,\n    format: &#x27;Letter&#x27;,\n    margin: {\n      top: &#x27;1in&#x27;,\n      right: &#x27;1in&#x27;,\n      bottom: &#x27;1in&#x27;,\n      left: &#x27;1in&#x27;\n    },\n    printBackground: true,\n    preferCSSPageSize: true,\n    displayHeaderFooter: true,\n    headerTemplate: \\`\n      &lt;div style=&#x27;font-size: 10px; width: 100%; text-align: center; color: #666;&#x27;&gt;\n        &lt;span class=&#x27;title&#x27;&gt;&lt;/span&gt;\n      &lt;/div&gt;\\`,\n    footerTemplate: \\`\n      &lt;div style=&#x27;font-size: 10px; width: 100%; text-align: center; color: #666;&#x27;&gt;\n        Page &lt;span class=&#x27;pageNumber&#x27;&gt;&lt;/span&gt; of &lt;span class=&#x27;totalPages&#x27;&gt;&lt;/span&gt;\n      &lt;/div&gt;\\`\n  });\n  \n  await browser.close();\n  console.log(&#x27;PDF generated successfully&#x27;);\n})();\n&quot;\u003C/span> 2&gt;/dev/null\n}\n\n\u003Cspan class=\"hljs-comment\"># WeasyPrint-based PDF generation\u003C/span>\n\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-title\">generate_pdf_weasyprint\u003C/span>\u003C/span>() {\n    \u003Cspan class=\"hljs-built_in\">local\u003C/span> input_file=\u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$1\u003C/span>&quot;\u003C/span>\n    \u003Cspan class=\"hljs-built_in\">local\u003C/span> output_file=\u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$2\u003C/span>&quot;\u003C/span>\n    \n    \u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;Generating PDF with WeasyPrint: \u003Cspan class=\"hljs-variable\">$input_file\u003C/span> -&gt; \u003Cspan class=\"hljs-variable\">$output_file\u003C/span>&quot;\u003C/span>\n    \n    \u003Cspan class=\"hljs-comment\"># Convert Markdown to HTML first\u003C/span>\n    \u003Cspan class=\"hljs-built_in\">local\u003C/span> html_file=\u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">${input_file%.*}\u003C/span>.html&quot;\u003C/span>\n    \n    python3 -c \u003Cspan class=\"hljs-string\">&quot;\nimport markdown\nfrom weasyprint import HTML, CSS\nfrom weasyprint.text.fonts import FontConfiguration\n\n# Read Markdown file\nwith open(&#x27;\u003Cspan class=\"hljs-variable\">$input_file\u003C/span>&#x27;, &#x27;r&#x27;, encoding=&#x27;utf-8&#x27;) as f:\n    md_content = f.read()\n\n# Convert to HTML\nmd = markdown.Markdown(extensions=[\n    &#x27;toc&#x27;,\n    &#x27;tables&#x27;, \n    &#x27;fenced_code&#x27;,\n    &#x27;codehilite&#x27;,\n    &#x27;attr_list&#x27;\n])\nhtml_content = md.convert(md_content)\n\n# Create complete HTML document\nfull_html = f&#x27;&#x27;&#x27;\n&lt;!DOCTYPE html&gt;\n&lt;html&gt;\n&lt;head&gt;\n    &lt;meta charset=&#x27;utf-8&#x27;&gt;\n    &lt;title&gt;Document&lt;/title&gt;\n    &lt;link rel=&#x27;stylesheet&#x27; href=&#x27;\u003Cspan class=\"hljs-variable\">$STYLES_DIR\u003C/span>/comprehensive-print-styles.css&#x27;&gt;\n    &lt;link rel=&#x27;stylesheet&#x27; href=&#x27;\u003Cspan class=\"hljs-variable\">$STYLES_DIR\u003C/span>/advanced-print-layout.css&#x27;&gt;\n&lt;/head&gt;\n&lt;body&gt;\n    {html_content}\n&lt;/body&gt;\n&lt;/html&gt;\n&#x27;&#x27;&#x27;\n\n# Generate PDF\nfont_config = FontConfiguration()\nhtml_doc = HTML(string=full_html, base_url=&#x27;\u003Cspan class=\"hljs-variable\">$PWD\u003C/span>/&#x27;)\ncss_files = [\n    CSS(&#x27;\u003Cspan class=\"hljs-variable\">$STYLES_DIR\u003C/span>/comprehensive-print-styles.css&#x27;),\n    CSS(&#x27;\u003Cspan class=\"hljs-variable\">$STYLES_DIR\u003C/span>/advanced-print-layout.css&#x27;)\n]\n\nhtml_doc.write_pdf(\n    &#x27;\u003Cspan class=\"hljs-variable\">$output_file\u003C/span>&#x27;,\n    stylesheets=css_files,\n    font_config=font_config\n)\n\nprint(&#x27;PDF generated successfully with WeasyPrint&#x27;)\n&quot;\u003C/span>\n}\n\n\u003Cspan class=\"hljs-comment\"># Prince XML-based PDF generation (commercial)\u003C/span>\n\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-title\">generate_pdf_prince\u003C/span>\u003C/span>() {\n    \u003Cspan class=\"hljs-built_in\">local\u003C/span> input_file=\u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$1\u003C/span>&quot;\u003C/span>\n    \u003Cspan class=\"hljs-built_in\">local\u003C/span> output_file=\u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$2\u003C/span>&quot;\u003C/span>\n    \n    \u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;Generating PDF with Prince XML: \u003Cspan class=\"hljs-variable\">$input_file\u003C/span> -&gt; \u003Cspan class=\"hljs-variable\">$output_file\u003C/span>&quot;\u003C/span>\n    \n    \u003Cspan class=\"hljs-comment\"># Convert Markdown to HTML\u003C/span>\n    \u003Cspan class=\"hljs-built_in\">local\u003C/span> html_file=\u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">${input_file%.*}\u003C/span>.html&quot;\u003C/span>\n    markdown \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$input_file\u003C/span>&quot;\u003C/span> &gt; \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$html_file\u003C/span>&quot;\u003C/span>\n    \n    \u003Cspan class=\"hljs-comment\"># Generate PDF with Prince\u003C/span>\n    prince \\\n        --css=\u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$STYLES_DIR\u003C/span>/comprehensive-print-styles.css&quot;\u003C/span> \\\n        --css=\u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$STYLES_DIR\u003C/span>/advanced-print-layout.css&quot;\u003C/span> \\\n        --media=\u003Cspan class=\"hljs-built_in\">print\u003C/span> \\\n        --pdf-profile=\u003Cspan class=\"hljs-string\">&quot;PDF/A-1a&quot;\u003C/span> \\\n        --pdf-title=\u003Cspan class=\"hljs-string\">&quot;Professional Document&quot;\u003C/span> \\\n        --pdf-author=\u003Cspan class=\"hljs-string\">&quot;Document Generator&quot;\u003C/span> \\\n        --pdf-keywords=\u003Cspan class=\"hljs-string\">&quot;Markdown, PDF, Professional&quot;\u003C/span> \\\n        --pdf-creator=\u003Cspan class=\"hljs-string\">&quot;Prince XML&quot;\u003C/span> \\\n        \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$html_file\u003C/span>&quot;\u003C/span> \\\n        --output=\u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$output_file\u003C/span>&quot;\u003C/span>\n    \n    \u003Cspan class=\"hljs-comment\"># Clean up temporary HTML\u003C/span>\n    \u003Cspan class=\"hljs-built_in\">rm\u003C/span> \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$html_file\u003C/span>&quot;\u003C/span>\n}\n\n\u003Cspan class=\"hljs-comment\"># Batch processing function\u003C/span>\n\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-title\">process_markdown_files\u003C/span>\u003C/span>() {\n    \u003Cspan class=\"hljs-built_in\">local\u003C/span> method=\u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">${1:-pandoc}\u003C/span>&quot;\u003C/span>\n    \u003Cspan class=\"hljs-built_in\">local\u003C/span> template=\u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">${2:-default}\u003C/span>&quot;\u003C/span>\n    \n    \u003Cspan class=\"hljs-comment\"># Create output directory\u003C/span>\n    \u003Cspan class=\"hljs-built_in\">mkdir\u003C/span> -p \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$OUTPUT_DIR\u003C/span>&quot;\u003C/span>\n    \n    \u003Cspan class=\"hljs-comment\"># Process all Markdown files\u003C/span>\n    find \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$INPUT_DIR\u003C/span>&quot;\u003C/span> -name \u003Cspan class=\"hljs-string\">&quot;*.md&quot;\u003C/span> -\u003Cspan class=\"hljs-built_in\">type\u003C/span> f | \u003Cspan class=\"hljs-keyword\">while\u003C/span> \u003Cspan class=\"hljs-built_in\">read\u003C/span> -r input_file; \u003Cspan class=\"hljs-keyword\">do\u003C/span>\n        \u003Cspan class=\"hljs-built_in\">local\u003C/span> filename=$(\u003Cspan class=\"hljs-built_in\">basename\u003C/span> \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$input_file\u003C/span>&quot;\u003C/span> .md)\n        \u003Cspan class=\"hljs-built_in\">local\u003C/span> output_file=\u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$OUTPUT_DIR\u003C/span>/\u003Cspan class=\"hljs-variable\">${filename}\u003C/span>.pdf&quot;\u003C/span>\n        \n        \u003Cspan class=\"hljs-keyword\">case\u003C/span> \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$method\u003C/span>&quot;\u003C/span> \u003Cspan class=\"hljs-keyword\">in\u003C/span>\n            \u003Cspan class=\"hljs-string\">&quot;pandoc&quot;\u003C/span>)\n                generate_pdf_pandoc \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$input_file\u003C/span>&quot;\u003C/span> \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$output_file\u003C/span>&quot;\u003C/span> \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$template\u003C/span>&quot;\u003C/span>\n                ;;\n            \u003Cspan class=\"hljs-string\">&quot;puppeteer&quot;\u003C/span>)\n                generate_pdf_puppeteer \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$input_file\u003C/span>&quot;\u003C/span> \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$output_file\u003C/span>&quot;\u003C/span>\n                ;;\n            \u003Cspan class=\"hljs-string\">&quot;weasyprint&quot;\u003C/span>)\n                generate_pdf_weasyprint \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$input_file\u003C/span>&quot;\u003C/span> \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$output_file\u003C/span>&quot;\u003C/span>\n                ;;\n            \u003Cspan class=\"hljs-string\">&quot;prince&quot;\u003C/span>)\n                generate_pdf_prince \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$input_file\u003C/span>&quot;\u003C/span> \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$output_file\u003C/span>&quot;\u003C/span>\n                ;;\n            *)\n                \u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;Unknown method: \u003Cspan class=\"hljs-variable\">$method\u003C/span>&quot;\u003C/span>\n                \u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;Available methods: pandoc, puppeteer, weasyprint, prince&quot;\u003C/span>\n                \u003Cspan class=\"hljs-built_in\">return\u003C/span> 1\n                ;;\n        \u003Cspan class=\"hljs-keyword\">esac\u003C/span>\n        \n        \u003Cspan class=\"hljs-comment\"># Validate PDF generation\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> [ -f \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$output_file\u003C/span>&quot;\u003C/span> ]; \u003Cspan class=\"hljs-keyword\">then\u003C/span>\n            \u003Cspan class=\"hljs-built_in\">local\u003C/span> file_size=$(\u003Cspan class=\"hljs-built_in\">stat\u003C/span> -f%z \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$output_file\u003C/span>&quot;\u003C/span> 2&gt;/dev/null || \u003Cspan class=\"hljs-built_in\">stat\u003C/span> -c%s \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$output_file\u003C/span>&quot;\u003C/span> 2&gt;/dev/null)\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> [ \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$file_size\u003C/span>&quot;\u003C/span> -gt 1024 ]; \u003Cspan class=\"hljs-keyword\">then\u003C/span>\n                \u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;✓ Successfully generated: \u003Cspan class=\"hljs-variable\">$output_file\u003C/span> (\u003Cspan class=\"hljs-variable\">$file_size\u003C/span> bytes)&quot;\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">else\u003C/span>\n                \u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;✗ Failed to generate valid PDF: \u003Cspan class=\"hljs-variable\">$output_file\u003C/span>&quot;\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">fi\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">else\u003C/span>\n            \u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;✗ PDF generation failed: \u003Cspan class=\"hljs-variable\">$output_file\u003C/span>&quot;\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">fi\u003C/span>\n    \u003Cspan class=\"hljs-keyword\">done\u003C/span>\n}\n\n\u003Cspan class=\"hljs-comment\"># Quality assurance checks\u003C/span>\n\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-title\">validate_pdf_output\u003C/span>\u003C/span>() {\n    \u003Cspan class=\"hljs-built_in\">local\u003C/span> pdf_file=\u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$1\u003C/span>&quot;\u003C/span>\n    \n    \u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;Validating PDF: \u003Cspan class=\"hljs-variable\">$pdf_file\u003C/span>&quot;\u003C/span>\n    \n    \u003Cspan class=\"hljs-comment\"># Check file exists and has content\u003C/span>\n    \u003Cspan class=\"hljs-keyword\">if\u003C/span> [ ! -f \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$pdf_file\u003C/span>&quot;\u003C/span> ]; \u003Cspan class=\"hljs-keyword\">then\u003C/span>\n        \u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;✗ PDF file does not exist&quot;\u003C/span>\n        \u003Cspan class=\"hljs-built_in\">return\u003C/span> 1\n    \u003Cspan class=\"hljs-keyword\">fi\u003C/span>\n    \n    \u003Cspan class=\"hljs-built_in\">local\u003C/span> file_size=$(\u003Cspan class=\"hljs-built_in\">stat\u003C/span> -f%z \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$pdf_file\u003C/span>&quot;\u003C/span> 2&gt;/dev/null || \u003Cspan class=\"hljs-built_in\">stat\u003C/span> -c%s \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$pdf_file\u003C/span>&quot;\u003C/span> 2&gt;/dev/null)\n    \u003Cspan class=\"hljs-keyword\">if\u003C/span> [ \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$file_size\u003C/span>&quot;\u003C/span> -lt 1024 ]; \u003Cspan class=\"hljs-keyword\">then\u003C/span>\n        \u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;✗ PDF file too small (\u003Cspan class=\"hljs-variable\">$file_size\u003C/span> bytes)&quot;\u003C/span>\n        \u003Cspan class=\"hljs-built_in\">return\u003C/span> 1\n    \u003Cspan class=\"hljs-keyword\">fi\u003C/span>\n    \n    \u003Cspan class=\"hljs-comment\"># Validate PDF structure\u003C/span>\n    \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-built_in\">command\u003C/span> -v pdfinfo &gt;/dev/null 2&gt;&amp;1; \u003Cspan class=\"hljs-keyword\">then\u003C/span>\n        \u003Cspan class=\"hljs-built_in\">local\u003C/span> page_count=$(pdfinfo \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$pdf_file\u003C/span>&quot;\u003C/span> 2&gt;/dev/null | grep \u003Cspan class=\"hljs-string\">&quot;Pages:&quot;\u003C/span> | awk \u003Cspan class=\"hljs-string\">&#x27;{print $2}&#x27;\u003C/span>)\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> [ \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$page_count\u003C/span>&quot;\u003C/span> -gt 0 ]; \u003Cspan class=\"hljs-keyword\">then\u003C/span>\n            \u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;✓ PDF contains \u003Cspan class=\"hljs-variable\">$page_count\u003C/span> pages&quot;\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">else\u003C/span>\n            \u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;✗ PDF appears to be corrupted&quot;\u003C/span>\n            \u003Cspan class=\"hljs-built_in\">return\u003C/span> 1\n        \u003Cspan class=\"hljs-keyword\">fi\u003C/span>\n    \u003Cspan class=\"hljs-keyword\">fi\u003C/span>\n    \n    \u003Cspan class=\"hljs-comment\"># Check for text content\u003C/span>\n    \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-built_in\">command\u003C/span> -v pdftotext &gt;/dev/null 2&gt;&amp;1; \u003Cspan class=\"hljs-keyword\">then\u003C/span>\n        \u003Cspan class=\"hljs-built_in\">local\u003C/span> text_length=$(pdftotext \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$pdf_file\u003C/span>&quot;\u003C/span> - 2&gt;/dev/null | \u003Cspan class=\"hljs-built_in\">wc\u003C/span> -c)\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> [ \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$text_length\u003C/span>&quot;\u003C/span> -gt 100 ]; \u003Cspan class=\"hljs-keyword\">then\u003C/span>\n            \u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;✓ PDF contains text content (\u003Cspan class=\"hljs-variable\">$text_length\u003C/span> characters)&quot;\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">else\u003C/span>\n            \u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;⚠ PDF may not contain extractable text&quot;\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">fi\u003C/span>\n    \u003Cspan class=\"hljs-keyword\">fi\u003C/span>\n    \n    \u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;✓ PDF validation completed&quot;\u003C/span>\n}\n\n\u003Cspan class=\"hljs-comment\"># Main execution\u003C/span>\n\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-title\">main\u003C/span>\u003C/span>() {\n    \u003Cspan class=\"hljs-built_in\">local\u003C/span> method=\u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">${1:-pandoc}\u003C/span>&quot;\u003C/span>\n    \u003Cspan class=\"hljs-built_in\">local\u003C/span> template=\u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">${2:-default}\u003C/span>&quot;\u003C/span>\n    \u003Cspan class=\"hljs-built_in\">local\u003C/span> validate=\u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">${3:-false}\u003C/span>&quot;\u003C/span>\n    \n    \u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;=== Markdown to PDF Generator ===&quot;\u003C/span>\n    \u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;Method: \u003Cspan class=\"hljs-variable\">$method\u003C/span>&quot;\u003C/span>\n    \u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;Template: \u003Cspan class=\"hljs-variable\">$template\u003C/span>&quot;\u003C/span>\n    \u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;Input Directory: \u003Cspan class=\"hljs-variable\">$INPUT_DIR\u003C/span>&quot;\u003C/span>\n    \u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;Output Directory: \u003Cspan class=\"hljs-variable\">$OUTPUT_DIR\u003C/span>&quot;\u003C/span>\n    \u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;==================================&quot;\u003C/span>\n    \n    \u003Cspan class=\"hljs-comment\"># Check dependencies\u003C/span>\n    \u003Cspan class=\"hljs-keyword\">case\u003C/span> \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$method\u003C/span>&quot;\u003C/span> \u003Cspan class=\"hljs-keyword\">in\u003C/span>\n        \u003Cspan class=\"hljs-string\">&quot;pandoc&quot;\u003C/span>)\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> ! \u003Cspan class=\"hljs-built_in\">command\u003C/span> -v pandoc &gt;/dev/null 2&gt;&amp;1; \u003Cspan class=\"hljs-keyword\">then\u003C/span>\n                \u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;Error: Pandoc is not installed&quot;\u003C/span>\n                \u003Cspan class=\"hljs-built_in\">exit\u003C/span> 1\n            \u003Cspan class=\"hljs-keyword\">fi\u003C/span>\n            ;;\n        \u003Cspan class=\"hljs-string\">&quot;puppeteer&quot;\u003C/span>)\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> ! \u003Cspan class=\"hljs-built_in\">command\u003C/span> -v node &gt;/dev/null 2&gt;&amp;1; \u003Cspan class=\"hljs-keyword\">then\u003C/span>\n                \u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;Error: Node.js is not installed&quot;\u003C/span>\n                \u003Cspan class=\"hljs-built_in\">exit\u003C/span> 1\n            \u003Cspan class=\"hljs-keyword\">fi\u003C/span>\n            ;;\n        \u003Cspan class=\"hljs-string\">&quot;weasyprint&quot;\u003C/span>)\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> ! \u003Cspan class=\"hljs-built_in\">command\u003C/span> -v python3 &gt;/dev/null 2&gt;&amp;1; \u003Cspan class=\"hljs-keyword\">then\u003C/span>\n                \u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;Error: Python 3 is not installed&quot;\u003C/span>\n                \u003Cspan class=\"hljs-built_in\">exit\u003C/span> 1\n            \u003Cspan class=\"hljs-keyword\">fi\u003C/span>\n            ;;\n        \u003Cspan class=\"hljs-string\">&quot;prince&quot;\u003C/span>)\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> ! \u003Cspan class=\"hljs-built_in\">command\u003C/span> -v prince &gt;/dev/null 2&gt;&amp;1; \u003Cspan class=\"hljs-keyword\">then\u003C/span>\n                \u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;Error: Prince XML is not installed&quot;\u003C/span>\n                \u003Cspan class=\"hljs-built_in\">exit\u003C/span> 1\n            \u003Cspan class=\"hljs-keyword\">fi\u003C/span>\n            ;;\n    \u003Cspan class=\"hljs-keyword\">esac\u003C/span>\n    \n    \u003Cspan class=\"hljs-comment\"># Process files\u003C/span>\n    process_markdown_files \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$method\u003C/span>&quot;\u003C/span> \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$template\u003C/span>&quot;\u003C/span>\n    \n    \u003Cspan class=\"hljs-comment\"># Validate output if requested\u003C/span>\n    \u003Cspan class=\"hljs-keyword\">if\u003C/span> [ \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$validate\u003C/span>&quot;\u003C/span> = \u003Cspan class=\"hljs-string\">&quot;true&quot;\u003C/span> ]; \u003Cspan class=\"hljs-keyword\">then\u003C/span>\n        \u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;=== Validating Generated PDFs ===&quot;\u003C/span>\n        find \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$OUTPUT_DIR\u003C/span>&quot;\u003C/span> -name \u003Cspan class=\"hljs-string\">&quot;*.pdf&quot;\u003C/span> -\u003Cspan class=\"hljs-built_in\">type\u003C/span> f | \u003Cspan class=\"hljs-keyword\">while\u003C/span> \u003Cspan class=\"hljs-built_in\">read\u003C/span> -r pdf_file; \u003Cspan class=\"hljs-keyword\">do\u003C/span>\n            validate_pdf_output \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$pdf_file\u003C/span>&quot;\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">done\u003C/span>\n    \u003Cspan class=\"hljs-keyword\">fi\u003C/span>\n    \n    \u003Cspan class=\"hljs-built_in\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;=== Generation Complete ===&quot;\u003C/span>\n}\n\n\u003Cspan class=\"hljs-comment\"># Execute if script is run directly\u003C/span>\n\u003Cspan class=\"hljs-keyword\">if\u003C/span> [ \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">${BASH_SOURCE[0]}\u003C/span>&quot;\u003C/span> = \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">${0}\u003C/span>&quot;\u003C/span> ]; \u003Cspan class=\"hljs-keyword\">then\u003C/span>\n    main \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-variable\">$@\u003C/span>&quot;\u003C/span>\n\u003Cspan class=\"hljs-keyword\">fi\u003C/span>\n\u003C/code>\u003C/pre>\u003Ch3 id=\"github-actions-workflow-for-pdf-generation\">GitHub Actions Workflow for PDF Generation\u003C/h3>\n\u003Cp>Automated PDF generation in CI/CD pipelines:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-yaml\">\n\u003Cspan class=\"hljs-comment\"># .github/workflows/generate-pdfs.yml\u003C/span>\n\u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Generate\u003C/span> \u003Cspan class=\"hljs-string\">PDF\u003C/span> \u003Cspan class=\"hljs-string\">Documentation\u003C/span>\n\n\u003Cspan class=\"hljs-attr\">on:\u003C/span>\n  \u003Cspan class=\"hljs-attr\">push:\u003C/span>\n    \u003Cspan class=\"hljs-attr\">branches:\u003C/span> [\u003Cspan class=\"hljs-string\">main\u003C/span>]\n    \u003Cspan class=\"hljs-attr\">paths:\u003C/span> [\u003Cspan class=\"hljs-string\">&#x27;docs/**/*.md&#x27;\u003C/span>]\n  \u003Cspan class=\"hljs-attr\">pull_request:\u003C/span>\n    \u003Cspan class=\"hljs-attr\">branches:\u003C/span> [\u003Cspan class=\"hljs-string\">main\u003C/span>]\n    \u003Cspan class=\"hljs-attr\">paths:\u003C/span> [\u003Cspan class=\"hljs-string\">&#x27;docs/**/*.md&#x27;\u003C/span>]\n  \u003Cspan class=\"hljs-attr\">workflow_dispatch:\u003C/span>\n    \u003Cspan class=\"hljs-attr\">inputs:\u003C/span>\n      \u003Cspan class=\"hljs-attr\">pdf_method:\u003C/span>\n        \u003Cspan class=\"hljs-attr\">description:\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;PDF generation method&#x27;\u003C/span>\n        \u003Cspan class=\"hljs-attr\">required:\u003C/span> \u003Cspan class=\"hljs-literal\">true\u003C/span>\n        \u003Cspan class=\"hljs-attr\">default:\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;puppeteer&#x27;\u003C/span>\n        \u003Cspan class=\"hljs-attr\">type:\u003C/span> \u003Cspan class=\"hljs-string\">choice\u003C/span>\n        \u003Cspan class=\"hljs-attr\">options:\u003C/span>\n          \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;puppeteer&#x27;\u003C/span>\n          \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;pandoc&#x27;\u003C/span>\n          \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;weasyprint&#x27;\u003C/span>\n\n\u003Cspan class=\"hljs-attr\">jobs:\u003C/span>\n  \u003Cspan class=\"hljs-attr\">generate-pdfs:\u003C/span>\n    \u003Cspan class=\"hljs-attr\">runs-on:\u003C/span> \u003Cspan class=\"hljs-string\">ubuntu-latest\u003C/span>\n    \n    \u003Cspan class=\"hljs-attr\">steps:\u003C/span>\n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Checkout\u003C/span> \u003Cspan class=\"hljs-string\">repository\u003C/span>\n      \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">actions/checkout@v4\u003C/span>\n      \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Setup\u003C/span> \u003Cspan class=\"hljs-string\">Node.js\u003C/span>\n      \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">actions/setup-node@v4\u003C/span>\n      \u003Cspan class=\"hljs-attr\">with:\u003C/span>\n        \u003Cspan class=\"hljs-attr\">node-version:\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;18&#x27;\u003C/span>\n        \u003Cspan class=\"hljs-attr\">cache:\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;npm&#x27;\u003C/span>\n        \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Install\u003C/span> \u003Cspan class=\"hljs-string\">Node.js\u003C/span> \u003Cspan class=\"hljs-string\">dependencies\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        npm install -g puppeteer markdown-it\n        npm install puppeteer markdown-it\n\u003C/span>        \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Setup\u003C/span> \u003Cspan class=\"hljs-string\">Python\u003C/span>\n      \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">actions/setup-python@v4\u003C/span>\n      \u003Cspan class=\"hljs-attr\">with:\u003C/span>\n        \u003Cspan class=\"hljs-attr\">python-version:\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;3.11&#x27;\u003C/span>\n        \u003Cspan class=\"hljs-attr\">cache:\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;pip&#x27;\u003C/span>\n        \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Install\u003C/span> \u003Cspan class=\"hljs-string\">Python\u003C/span> \u003Cspan class=\"hljs-string\">dependencies\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        pip install weasyprint markdown beautifulsoup4\n\u003C/span>        \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Install\u003C/span> \u003Cspan class=\"hljs-string\">Pandoc\u003C/span>\n      \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">r-lib/actions/setup-pandoc@v2\u003C/span>\n      \u003Cspan class=\"hljs-attr\">with:\u003C/span>\n        \u003Cspan class=\"hljs-attr\">pandoc-version:\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;latest&#x27;\u003C/span>\n        \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Install\u003C/span> \u003Cspan class=\"hljs-string\">LaTeX\u003C/span> \u003Cspan class=\"hljs-string\">for\u003C/span> \u003Cspan class=\"hljs-string\">Pandoc\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        sudo apt-get update\n        sudo apt-get install -y texlive-latex-recommended \\\n                               texlive-latex-extra \\\n                               texlive-fonts-recommended \\\n                               texlive-xetex\n\u003C/span>    \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Create\u003C/span> \u003Cspan class=\"hljs-string\">output\u003C/span> \u003Cspan class=\"hljs-string\">directories\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        mkdir -p pdf-output\n        mkdir -p pdf-reports\n\u003C/span>        \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Generate\u003C/span> \u003Cspan class=\"hljs-string\">PDFs\u003C/span> \u003Cspan class=\"hljs-string\">with\u003C/span> \u003Cspan class=\"hljs-string\">Puppeteer\u003C/span>\n      \u003Cspan class=\"hljs-attr\">if:\u003C/span> \u003Cspan class=\"hljs-string\">github.event.inputs.pdf_method\u003C/span> \u003Cspan class=\"hljs-string\">==\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;puppeteer&#x27;\u003C/span> \u003Cspan class=\"hljs-string\">||\u003C/span> \u003Cspan class=\"hljs-string\">github.event.inputs.pdf_method\u003C/span> \u003Cspan class=\"hljs-string\">==\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        node generate-pdfs.js\n\u003C/span>        \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Generate\u003C/span> \u003Cspan class=\"hljs-string\">PDFs\u003C/span> \u003Cspan class=\"hljs-string\">with\u003C/span> \u003Cspan class=\"hljs-string\">Pandoc\u003C/span>\n      \u003Cspan class=\"hljs-attr\">if:\u003C/span> \u003Cspan class=\"hljs-string\">github.event.inputs.pdf_method\u003C/span> \u003Cspan class=\"hljs-string\">==\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;pandoc&#x27;\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        for file in docs/**/*.md; do\n          filename=$(basename &quot;$file&quot; .md)\n          pandoc &quot;$file&quot; \\\n            --pdf-engine=xelatex \\\n            --css=styles/print-styles.css \\\n            --table-of-contents \\\n            --number-sections \\\n            --variable geometry:margin=1in \\\n            --output &quot;pdf-output/${filename}.pdf&quot;\n        done\n\u003C/span>        \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Generate\u003C/span> \u003Cspan class=\"hljs-string\">PDFs\u003C/span> \u003Cspan class=\"hljs-string\">with\u003C/span> \u003Cspan class=\"hljs-string\">WeasyPrint\u003C/span>\n      \u003Cspan class=\"hljs-attr\">if:\u003C/span> \u003Cspan class=\"hljs-string\">github.event.inputs.pdf_method\u003C/span> \u003Cspan class=\"hljs-string\">==\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;weasyprint&#x27;\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        python generate-pdfs-weasyprint.py\n\u003C/span>        \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Validate\u003C/span> \u003Cspan class=\"hljs-string\">PDF\u003C/span> \u003Cspan class=\"hljs-string\">files\u003C/span>\n      \u003Cspan class=\"hljs-attr\">run:\u003C/span> \u003Cspan class=\"hljs-string\">|\n        echo &quot;=== PDF Generation Report ===&quot; &gt; pdf-reports/generation-report.txt\n        echo &quot;Generated at: $(date)&quot; &gt;&gt; pdf-reports/generation-report.txt\n        echo &quot;Method: ${{ github.event.inputs.pdf_method || &#x27;puppeteer&#x27; }}&quot; &gt;&gt; pdf-reports/generation-report.txt\n        echo &quot;&quot; &gt;&gt; pdf-reports/generation-report.txt\n\u003C/span>        \n        \u003Cspan class=\"hljs-string\">total_files=0\u003C/span>\n        \u003Cspan class=\"hljs-string\">successful_files=0\u003C/span>\n        \n        \u003Cspan class=\"hljs-string\">for\u003C/span> \u003Cspan class=\"hljs-string\">pdf\u003C/span> \u003Cspan class=\"hljs-string\">in\u003C/span> \u003Cspan class=\"hljs-string\">pdf-output/*.pdf;\u003C/span> \u003Cspan class=\"hljs-string\">do\u003C/span>\n          \u003Cspan class=\"hljs-string\">if\u003C/span> [ \u003Cspan class=\"hljs-string\">-f\u003C/span> \u003Cspan class=\"hljs-string\">&quot;$pdf&quot;\u003C/span> ]\u003Cspan class=\"hljs-string\">;\u003C/span> \u003Cspan class=\"hljs-string\">then\u003C/span>\n            \u003Cspan class=\"hljs-string\">total_files=$((total_files\u003C/span> \u003Cspan class=\"hljs-string\">+\u003C/span> \u003Cspan class=\"hljs-number\">1\u003C/span>\u003Cspan class=\"hljs-string\">))\u003C/span>\n            \u003Cspan class=\"hljs-string\">file_size=$(stat\u003C/span> \u003Cspan class=\"hljs-string\">-c%s\u003C/span> \u003Cspan class=\"hljs-string\">&quot;$pdf&quot;\u003C/span>\u003Cspan class=\"hljs-string\">)\u003C/span>\n            \n            \u003Cspan class=\"hljs-string\">if\u003C/span> [ \u003Cspan class=\"hljs-string\">&quot;$file_size&quot;\u003C/span> \u003Cspan class=\"hljs-string\">-gt\u003C/span> \u003Cspan class=\"hljs-number\">1024\u003C/span> ]\u003Cspan class=\"hljs-string\">;\u003C/span> \u003Cspan class=\"hljs-string\">then\u003C/span>\n              \u003Cspan class=\"hljs-string\">successful_files=$((successful_files\u003C/span> \u003Cspan class=\"hljs-string\">+\u003C/span> \u003Cspan class=\"hljs-number\">1\u003C/span>\u003Cspan class=\"hljs-string\">))\u003C/span>\n              \u003Cspan class=\"hljs-string\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;✓ $(basename &quot;\u003C/span>\u003Cspan class=\"hljs-string\">$pdf&quot;):\u003C/span> \u003Cspan class=\"hljs-string\">$file_size\u003C/span> \u003Cspan class=\"hljs-string\">bytes&quot;\u003C/span> \u003Cspan class=\"hljs-string\">&gt;&gt;\u003C/span> \u003Cspan class=\"hljs-string\">pdf-reports/generation-report.txt\u003C/span>\n            \u003Cspan class=\"hljs-string\">else\u003C/span>\n              \u003Cspan class=\"hljs-string\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;✗ $(basename &quot;\u003C/span>\u003Cspan class=\"hljs-string\">$pdf&quot;):\u003C/span> \u003Cspan class=\"hljs-string\">Failed\u003C/span> \u003Cspan class=\"hljs-string\">($file_size\u003C/span> \u003Cspan class=\"hljs-string\">bytes)&quot;\u003C/span> \u003Cspan class=\"hljs-string\">&gt;&gt;\u003C/span> \u003Cspan class=\"hljs-string\">pdf-reports/generation-report.txt\u003C/span>\n            \u003Cspan class=\"hljs-string\">fi\u003C/span>\n          \u003Cspan class=\"hljs-string\">fi\u003C/span>\n        \u003Cspan class=\"hljs-string\">done\u003C/span>\n        \n        \u003Cspan class=\"hljs-string\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;&quot;\u003C/span> \u003Cspan class=\"hljs-string\">&gt;&gt;\u003C/span> \u003Cspan class=\"hljs-string\">pdf-reports/generation-report.txt\u003C/span>\n        \u003Cspan class=\"hljs-string\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;Summary: $successful_files/$total_files files generated successfully&quot;\u003C/span> \u003Cspan class=\"hljs-string\">&gt;&gt;\u003C/span> \u003Cspan class=\"hljs-string\">pdf-reports/generation-report.txt\u003C/span>\n        \n        \u003Cspan class=\"hljs-comment\"># Fail if no PDFs were generated successfully\u003C/span>\n        \u003Cspan class=\"hljs-string\">if\u003C/span> [ \u003Cspan class=\"hljs-string\">&quot;$successful_files&quot;\u003C/span> \u003Cspan class=\"hljs-string\">-eq\u003C/span> \u003Cspan class=\"hljs-number\">0\u003C/span> ]\u003Cspan class=\"hljs-string\">;\u003C/span> \u003Cspan class=\"hljs-string\">then\u003C/span>\n          \u003Cspan class=\"hljs-string\">echo\u003C/span> \u003Cspan class=\"hljs-string\">&quot;Error: No PDFs were generated successfully&quot;\u003C/span>\n          \u003Cspan class=\"hljs-string\">exit\u003C/span> \u003Cspan class=\"hljs-number\">1\u003C/span>\n        \u003Cspan class=\"hljs-string\">fi\u003C/span>\n        \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Upload\u003C/span> \u003Cspan class=\"hljs-string\">PDF\u003C/span> \u003Cspan class=\"hljs-string\">artifacts\u003C/span>\n      \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">actions/upload-artifact@v3\u003C/span>\n      \u003Cspan class=\"hljs-attr\">with:\u003C/span>\n        \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">generated-pdfs-${{\u003C/span> \u003Cspan class=\"hljs-string\">github.event.inputs.pdf_method\u003C/span> \u003Cspan class=\"hljs-string\">||\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;puppeteer&#x27;\u003C/span> \u003Cspan class=\"hljs-string\">}}\u003C/span>\n        \u003Cspan class=\"hljs-attr\">path:\u003C/span> \u003Cspan class=\"hljs-string\">pdf-output/\u003C/span>\n        \u003Cspan class=\"hljs-attr\">retention-days:\u003C/span> \u003Cspan class=\"hljs-number\">30\u003C/span>\n        \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Upload\u003C/span> \u003Cspan class=\"hljs-string\">generation\u003C/span> \u003Cspan class=\"hljs-string\">report\u003C/span>\n      \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">actions/upload-artifact@v3\u003C/span>\n      \u003Cspan class=\"hljs-attr\">with:\u003C/span>\n        \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">pdf-generation-report\u003C/span>\n        \u003Cspan class=\"hljs-attr\">path:\u003C/span> \u003Cspan class=\"hljs-string\">pdf-reports/\u003C/span>\n        \u003Cspan class=\"hljs-attr\">retention-days:\u003C/span> \u003Cspan class=\"hljs-number\">7\u003C/span>\n        \n    \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">Comment\u003C/span> \u003Cspan class=\"hljs-string\">on\u003C/span> \u003Cspan class=\"hljs-string\">PR\u003C/span> \u003Cspan class=\"hljs-string\">with\u003C/span> \u003Cspan class=\"hljs-string\">results\u003C/span>\n      \u003Cspan class=\"hljs-attr\">if:\u003C/span> \u003Cspan class=\"hljs-string\">github.event_name\u003C/span> \u003Cspan class=\"hljs-string\">==\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;pull_request&#x27;\u003C/span>\n      \u003Cspan class=\"hljs-attr\">uses:\u003C/span> \u003Cspan class=\"hljs-string\">actions/github-script@v6\u003C/span>\n      \u003Cspan class=\"hljs-attr\">with:\u003C/span>\n        \u003Cspan class=\"hljs-attr\">script:\u003C/span> \u003Cspan class=\"hljs-string\">|\n          const fs = require(&#x27;fs&#x27;);\n          const report = fs.readFileSync(&#x27;pdf-reports/generation-report.txt&#x27;, &#x27;utf8&#x27;);\n\u003C/span>          \n          \u003Cspan class=\"hljs-string\">github.rest.issues.createComment({\u003C/span>\n            \u003Cspan class=\"hljs-attr\">issue_number:\u003C/span> \u003Cspan class=\"hljs-string\">context.issue.number,\u003C/span>\n            \u003Cspan class=\"hljs-attr\">owner:\u003C/span> \u003Cspan class=\"hljs-string\">context.repo.owner,\u003C/span>\n            \u003Cspan class=\"hljs-attr\">repo:\u003C/span> \u003Cspan class=\"hljs-string\">context.repo.repo,\u003C/span>\n            \u003Cspan class=\"hljs-attr\">body:\u003C/span> \u003Cspan class=\"hljs-string\">`##\u003C/span> \u003Cspan class=\"hljs-string\">PDF\u003C/span> \u003Cspan class=\"hljs-string\">Generation\u003C/span> \u003Cspan class=\"hljs-string\">Report\u003C/span>\n            \n\u003Cspan class=\"hljs-string\">\\`\\`\\`\u003C/span>\n\u003Cspan class=\"hljs-string\">${report}\u003C/span>\n\u003Cspan class=\"hljs-string\">\\`\\`\\`\u003C/span>\n\n\u003Cspan class=\"hljs-string\">Download\u003C/span> \u003Cspan class=\"hljs-string\">the\u003C/span> \u003Cspan class=\"hljs-string\">generated\u003C/span> \u003Cspan class=\"hljs-string\">PDFs\u003C/span> \u003Cspan class=\"hljs-string\">from\u003C/span> \u003Cspan class=\"hljs-string\">the\u003C/span> \u003Cspan class=\"hljs-string\">workflow\u003C/span> \u003Cspan class=\"hljs-string\">artifacts.`\u003C/span>\n          \u003Cspan class=\"hljs-string\">});\u003C/span>\n\u003C/code>\u003C/pre>\u003Ch2 id=\"platform-specific-implementation\">Platform-Specific Implementation\u003C/h2>\n\u003Ch3 id=\"jekyll-pdf-generation-plugin\">Jekyll PDF Generation Plugin\u003C/h3>\n\u003Cp>Jekyll plugin for automated PDF generation:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-ruby\">\u003Cspan class=\"hljs-comment\"># _plugins/pdf_generator.rb\u003C/span>\n\u003Cspan class=\"hljs-keyword\">require\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;puppeteer-ruby&#x27;\u003C/span>\n\u003Cspan class=\"hljs-keyword\">require\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;kramdown&#x27;\u003C/span>\n\u003Cspan class=\"hljs-keyword\">require\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;liquid&#x27;\u003C/span>\n\n\u003Cspan class=\"hljs-keyword\">module\u003C/span> \u003Cspan class=\"hljs-title class_\">Jekyll\u003C/span>\n  \u003Cspan class=\"hljs-keyword\">class\u003C/span> \u003Cspan class=\"hljs-title class_\">PDFGenerator\u003C/span> &lt; \u003Cspan class=\"hljs-title class_ inherited__\">Generator\u003C/span>\n    safe \u003Cspan class=\"hljs-literal\">true\u003C/span>\n    priority \u003Cspan class=\"hljs-symbol\">:low\u003C/span>\n\n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">generate\u003C/span>(\u003Cspan class=\"hljs-params\">site\u003C/span>)\n      \u003Cspan class=\"hljs-variable\">@site\u003C/span> = site\n      \u003Cspan class=\"hljs-variable\">@config\u003C/span> = site.config[\u003Cspan class=\"hljs-string\">&#x27;pdf_generator&#x27;\u003C/span>] |\u003Cspan class=\"hljs-params\">\u003C/span>| {}\n      \n      \u003Cspan class=\"hljs-comment\"># Skip if PDF generation is disabled\u003C/span>\n      \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-keyword\">unless\u003C/span> \u003Cspan class=\"hljs-variable\">@config\u003C/span>[\u003Cspan class=\"hljs-string\">&#x27;enabled&#x27;\u003C/span>]\n      \n      \u003Cspan class=\"hljs-comment\"># Create PDF output directory\u003C/span>\n      pdf_dir = \u003Cspan class=\"hljs-title class_\">File\u003C/span>.join(site.dest, \u003Cspan class=\"hljs-string\">&#x27;pdfs&#x27;\u003C/span>)\n      \u003Cspan class=\"hljs-title class_\">FileUtils\u003C/span>.mkdir_p(pdf_dir)\n      \n      \u003Cspan class=\"hljs-comment\"># Generate PDFs for specified collections\u003C/span>\n      collections_to_process = \u003Cspan class=\"hljs-variable\">@config\u003C/span>[\u003Cspan class=\"hljs-string\">&#x27;collections&#x27;\u003C/span>] |\u003Cspan class=\"hljs-params\">\u003C/span>| [\u003Cspan class=\"hljs-string\">&#x27;posts&#x27;\u003C/span>]\n      \n      collections_to_process.each \u003Cspan class=\"hljs-keyword\">do\u003C/span> |\u003Cspan class=\"hljs-params\">collection_name\u003C/span>|\n        collection = site.collections[collection_name]\n        \u003Cspan class=\"hljs-keyword\">next\u003C/span> \u003Cspan class=\"hljs-keyword\">unless\u003C/span> collection\n        \n        collection.docs.each \u003Cspan class=\"hljs-keyword\">do\u003C/span> |\u003Cspan class=\"hljs-params\">doc\u003C/span>|\n          generate_pdf_for_document(doc, pdf_dir)\n        \u003Cspan class=\"hljs-keyword\">end\u003C/span>\n      \u003Cspan class=\"hljs-keyword\">end\u003C/span>\n      \n      \u003Cspan class=\"hljs-comment\"># Generate combined PDFs if configured\u003C/span>\n      generate_combined_pdfs(pdf_dir) \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-variable\">@config\u003C/span>[\u003Cspan class=\"hljs-string\">&#x27;combined_pdfs&#x27;\u003C/span>]\n    \u003Cspan class=\"hljs-keyword\">end\u003C/span>\n    \n    \u003Cspan class=\"hljs-keyword\">private\u003C/span>\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">generate_pdf_for_document\u003C/span>(\u003Cspan class=\"hljs-params\">doc, output_dir\u003C/span>)\n      \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-keyword\">unless\u003C/span> should_generate_pdf?(doc)\n      \n      \u003Cspan class=\"hljs-keyword\">begin\u003C/span>\n        \u003Cspan class=\"hljs-title class_\">Jekyll\u003C/span>.logger.info \u003Cspan class=\"hljs-string\">&quot;PDF Generator:&quot;\u003C/span>, \u003Cspan class=\"hljs-string\">&quot;Processing \u003Cspan class=\"hljs-subst\">#{doc.relative_path}\u003C/span>&quot;\u003C/span>\n        \n        \u003Cspan class=\"hljs-comment\"># Prepare HTML content\u003C/span>\n        html_content = prepare_html_content(doc)\n        \n        \u003Cspan class=\"hljs-comment\"># Generate PDF filename\u003C/span>\n        pdf_filename = \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-subst\">#{doc.basename_without_ext}\u003C/span>.pdf&quot;\u003C/span>\n        pdf_path = \u003Cspan class=\"hljs-title class_\">File\u003C/span>.join(output_dir, pdf_filename)\n        \n        \u003Cspan class=\"hljs-comment\"># Generate PDF using Puppeteer\u003C/span>\n        generate_pdf_with_puppeteer(html_content, pdf_path, doc)\n        \n        \u003Cspan class=\"hljs-title class_\">Jekyll\u003C/span>.logger.info \u003Cspan class=\"hljs-string\">&quot;PDF Generator:&quot;\u003C/span>, \u003Cspan class=\"hljs-string\">&quot;Generated \u003Cspan class=\"hljs-subst\">#{pdf_filename}\u003C/span>&quot;\u003C/span>\n        \n      \u003Cspan class=\"hljs-keyword\">rescue\u003C/span> \u003Cspan class=\"hljs-title class_\">StandardError\u003C/span> =&gt; e\n        \u003Cspan class=\"hljs-title class_\">Jekyll\u003C/span>.logger.error \u003Cspan class=\"hljs-string\">&quot;PDF Generator:&quot;\u003C/span>, \u003Cspan class=\"hljs-string\">&quot;Failed to generate PDF for \u003Cspan class=\"hljs-subst\">#{doc.relative_path}\u003C/span>: \u003Cspan class=\"hljs-subst\">#{e.message}\u003C/span>&quot;\u003C/span>\n      \u003Cspan class=\"hljs-keyword\">end\u003C/span>\n    \u003Cspan class=\"hljs-keyword\">end\u003C/span>\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">should_generate_pdf?\u003C/span>(\u003Cspan class=\"hljs-params\">doc\u003C/span>)\n      \u003Cspan class=\"hljs-comment\"># Check if document should be converted to PDF\u003C/span>\n      \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-literal\">false\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> doc.data[\u003Cspan class=\"hljs-string\">&#x27;pdf&#x27;\u003C/span>] == \u003Cspan class=\"hljs-literal\">false\u003C/span>\n      \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-literal\">true\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> doc.data[\u003Cspan class=\"hljs-string\">&#x27;pdf&#x27;\u003C/span>] == \u003Cspan class=\"hljs-literal\">true\u003C/span>\n      \n      \u003Cspan class=\"hljs-comment\"># Default behavior based on configuration\u003C/span>\n      \u003Cspan class=\"hljs-variable\">@config\u003C/span>[\u003Cspan class=\"hljs-string\">&#x27;auto_generate&#x27;\u003C/span>] != \u003Cspan class=\"hljs-literal\">false\u003C/span>\n    \u003Cspan class=\"hljs-keyword\">end\u003C/span>\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">prepare_html_content\u003C/span>(\u003Cspan class=\"hljs-params\">doc\u003C/span>)\n      \u003Cspan class=\"hljs-comment\"># Get the rendered content\u003C/span>\n      content = doc.content\n      \n      \u003Cspan class=\"hljs-comment\"># Apply PDF-specific transformations\u003C/span>\n      content = transform_content_for_pdf(content, doc)\n      \n      \u003Cspan class=\"hljs-comment\"># Create complete HTML document\u003C/span>\n      template = get_pdf_template\n      \n      \u003Cspan class=\"hljs-comment\"># Prepare template variables\u003C/span>\n      template_vars = {\n        \u003Cspan class=\"hljs-string\">&#x27;title&#x27;\u003C/span> =&gt; doc.data[\u003Cspan class=\"hljs-string\">&#x27;title&#x27;\u003C/span>] |\u003Cspan class=\"hljs-params\">\u003C/span>| doc.basename_without_ext,\n        \u003Cspan class=\"hljs-string\">&#x27;author&#x27;\u003C/span> =&gt; doc.data[\u003Cspan class=\"hljs-string\">&#x27;author&#x27;\u003C/span>] |\u003Cspan class=\"hljs-params\">\u003C/span>| \u003Cspan class=\"hljs-variable\">@site\u003C/span>.config[\u003Cspan class=\"hljs-string\">&#x27;author&#x27;\u003C/span>],\n        \u003Cspan class=\"hljs-string\">&#x27;date&#x27;\u003C/span> =&gt; doc.data[\u003Cspan class=\"hljs-string\">&#x27;date&#x27;\u003C/span>]&amp;.strftime(\u003Cspan class=\"hljs-string\">&#x27;%B %d, %Y&#x27;\u003C/span>) |\u003Cspan class=\"hljs-params\">\u003C/span>| \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>,\n        \u003Cspan class=\"hljs-string\">&#x27;description&#x27;\u003C/span> =&gt; doc.data[\u003Cspan class=\"hljs-string\">&#x27;description&#x27;\u003C/span>] |\u003Cspan class=\"hljs-params\">\u003C/span>| \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>,\n        \u003Cspan class=\"hljs-string\">&#x27;content&#x27;\u003C/span> =&gt; content,\n        \u003Cspan class=\"hljs-string\">&#x27;print_styles&#x27;\u003C/span> =&gt; get_print_styles,\n        \u003Cspan class=\"hljs-string\">&#x27;site&#x27;\u003C/span> =&gt; \u003Cspan class=\"hljs-variable\">@site\u003C/span>.config\n      }\n      \n      \u003Cspan class=\"hljs-comment\"># Render template\u003C/span>\n      liquid_template = \u003Cspan class=\"hljs-title class_\">Liquid\u003C/span>\u003Cspan class=\"hljs-symbol\">:\u003C/span>\u003Cspan class=\"hljs-symbol\">:Template\u003C/span>.parse(template)\n      liquid_template.render(template_vars)\n    \u003Cspan class=\"hljs-keyword\">end\u003C/span>\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">transform_content_for_pdf\u003C/span>(\u003Cspan class=\"hljs-params\">content, doc\u003C/span>)\n      \u003Cspan class=\"hljs-comment\"># Convert relative URLs to absolute\u003C/span>\n      base_url = \u003Cspan class=\"hljs-variable\">@site\u003C/span>.config[\u003Cspan class=\"hljs-string\">&#x27;url&#x27;\u003C/span>] |\u003Cspan class=\"hljs-params\">\u003C/span>| \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>\n      content = content.gsub(\u003Cspan class=\"hljs-regexp\">/href=&quot;\\//\u003C/span>, \u003Cspan class=\"hljs-string\">&quot;href=\\&quot;\u003Cspan class=\"hljs-subst\">#{base_url}\u003C/span>/&quot;\u003C/span>)\n      content = content.gsub(\u003Cspan class=\"hljs-regexp\">/src=&quot;\\//\u003C/span>, \u003Cspan class=\"hljs-string\">&quot;src=\\&quot;\u003Cspan class=\"hljs-subst\">#{base_url}\u003C/span>/&quot;\u003C/span>)\n      \n      \u003Cspan class=\"hljs-comment\"># Add print-specific classes\u003C/span>\n      content = content.gsub(\u003Cspan class=\"hljs-regexp\">/&lt;h([1-6])/\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;&lt;h\\1 class=&quot;pdf-heading&quot;&#x27;\u003C/span>)\n      content = content.gsub(\u003Cspan class=\"hljs-regexp\">/&lt;table/\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;&lt;table class=&quot;pdf-table&quot;&#x27;\u003C/span>)\n      content = content.gsub(\u003Cspan class=\"hljs-regexp\">/&lt;pre/\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;&lt;pre class=&quot;pdf-code&quot;&#x27;\u003C/span>)\n      \n      \u003Cspan class=\"hljs-comment\"># Handle page breaks\u003C/span>\n      content = content.gsub(\u003Cspan class=\"hljs-regexp\">/&lt;!-- page-break --&gt;/\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;&lt;div class=&quot;page-break-before&quot;&gt;&lt;/div&gt;&#x27;\u003C/span>)\n      \n      content\n    \u003Cspan class=\"hljs-keyword\">end\u003C/span>\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">get_pdf_template\u003C/span>\n      template_path = \u003Cspan class=\"hljs-variable\">@config\u003C/span>[\u003Cspan class=\"hljs-string\">&#x27;template&#x27;\u003C/span>] |\u003Cspan class=\"hljs-params\">\u003C/span>| \u003Cspan class=\"hljs-title class_\">File\u003C/span>.join(\u003Cspan class=\"hljs-variable\">@site\u003C/span>.source, \u003Cspan class=\"hljs-string\">&#x27;_layouts&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;pdf.html&#x27;\u003C/span>)\n      \n      \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-title class_\">File\u003C/span>.exist?(template_path)\n        \u003Cspan class=\"hljs-title class_\">File\u003C/span>.read(template_path)\n      \u003Cspan class=\"hljs-keyword\">else\u003C/span>\n        default_pdf_template\n      \u003Cspan class=\"hljs-keyword\">end\u003C/span>\n    \u003Cspan class=\"hljs-keyword\">end\u003C/span>\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">default_pdf_template\u003C/span>\n      \u003Cspan class=\"hljs-string\">&lt;&lt;~HTML\n        &lt;!DOCTYPE html&gt;\n        &lt;html&gt;\n        &lt;head&gt;\n            &lt;meta charset=&quot;utf-8&quot;&gt;\n            &lt;title&gt;{{ title }}&lt;/title&gt;\n            &lt;meta name=&quot;author&quot; content=&quot;{{ author }}&quot;&gt;\n            &lt;meta name=&quot;description&quot; content=&quot;{{ description }}&quot;&gt;\n            &lt;style&gt;\n                {{ print_styles }}\n            &lt;/style&gt;\n        &lt;/head&gt;\n        &lt;body&gt;\n            &lt;header class=&quot;pdf-header&quot;&gt;\n                &lt;h1&gt;{{ title }}&lt;/h1&gt;\n                {% if author %}\n                &lt;p class=&quot;author&quot;&gt;By {{ author }}&lt;/p&gt;\n                {% endif %}\n                {% if date %}\n                &lt;p class=&quot;date&quot;&gt;{{ date }}&lt;/p&gt;\n                {% endif %}\n            &lt;/header&gt;\n            \n            &lt;main class=&quot;pdf-content&quot;&gt;\n                {{ content }}\n            &lt;/main&gt;\n            \n            &lt;footer class=&quot;pdf-footer&quot;&gt;\n                &lt;p&gt;Generated from {{ site.title | default: &quot;Jekyll Site&quot; }}&lt;/p&gt;\n            &lt;/footer&gt;\n        &lt;/body&gt;\n        &lt;/html&gt;\n      HTML\u003C/span>\n    \u003Cspan class=\"hljs-keyword\">end\u003C/span>\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">get_print_styles\u003C/span>\n      styles_path = \u003Cspan class=\"hljs-title class_\">File\u003C/span>.join(\u003Cspan class=\"hljs-variable\">@site\u003C/span>.source, \u003Cspan class=\"hljs-string\">&#x27;assets&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;css&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;print.css&#x27;\u003C/span>)\n      \n      \u003Cspan class=\"hljs-keyword\">if\u003C/span> \u003Cspan class=\"hljs-title class_\">File\u003C/span>.exist?(styles_path)\n        \u003Cspan class=\"hljs-title class_\">File\u003C/span>.read(styles_path)\n      \u003Cspan class=\"hljs-keyword\">else\u003C/span>\n        \u003Cspan class=\"hljs-comment\"># Return basic print styles\u003C/span>\n        basic_print_styles\n      \u003Cspan class=\"hljs-keyword\">end\u003C/span>\n    \u003Cspan class=\"hljs-keyword\">end\u003C/span>\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">basic_print_styles\u003C/span>\n      \u003Cspan class=\"hljs-string\">&lt;&lt;~CSS\n        @media print {\n          body {\n            font-family: Georgia, serif;\n            font-size: 12pt;\n            line-height: 1.4;\n            color: #000;\n            background: white;\n          }\n          \n          .pdf-header {\n            text-align: center;\n            margin-bottom: 2em;\n            page-break-after: avoid;\n          }\n          \n          .pdf-header h1 {\n            font-size: 18pt;\n            margin-bottom: 0.5em;\n          }\n          \n          .author, .date {\n            font-size: 10pt;\n            color: #666;\n          }\n          \n          .pdf-heading {\n            page-break-after: avoid;\n            margin-top: 1.5em;\n          }\n          \n          .pdf-table {\n            border-collapse: collapse;\n            width: 100%;\n            margin: 1em 0;\n          }\n          \n          .pdf-table th, .pdf-table td {\n            border: 1px solid #000;\n            padding: 6pt;\n          }\n          \n          .pdf-code {\n            font-family: Courier, monospace;\n            font-size: 10pt;\n            background: #f5f5f5;\n            border: 1px solid #ccc;\n            padding: 8pt;\n            page-break-inside: avoid;\n          }\n          \n          .page-break-before {\n            page-break-before: always;\n          }\n          \n          .pdf-footer {\n            margin-top: 2em;\n            padding-top: 1em;\n            border-top: 1px solid #ccc;\n            font-size: 10pt;\n            text-align: center;\n            color: #666;\n          }\n        }\n      CSS\u003C/span>\n    \u003Cspan class=\"hljs-keyword\">end\u003C/span>\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">generate_pdf_with_puppeteer\u003C/span>(\u003Cspan class=\"hljs-params\">html_content, pdf_path, doc\u003C/span>)\n      \u003Cspan class=\"hljs-comment\"># PDF generation options from configuration\u003C/span>\n      pdf_options = \u003Cspan class=\"hljs-variable\">@config\u003C/span>[\u003Cspan class=\"hljs-string\">&#x27;pdf_options&#x27;\u003C/span>] |\u003Cspan class=\"hljs-params\">\u003C/span>| {}\n      \n      default_options = {\n        \u003Cspan class=\"hljs-symbol\">format:\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;Letter&#x27;\u003C/span>,\n        \u003Cspan class=\"hljs-symbol\">margin:\u003C/span> {\n          \u003Cspan class=\"hljs-symbol\">top:\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;1in&#x27;\u003C/span>,\n          \u003Cspan class=\"hljs-symbol\">right:\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;1in&#x27;\u003C/span>,\n          \u003Cspan class=\"hljs-symbol\">bottom:\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;1in&#x27;\u003C/span>,\n          \u003Cspan class=\"hljs-symbol\">left:\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;1in&#x27;\u003C/span>\n        },\n        \u003Cspan class=\"hljs-symbol\">print_background:\u003C/span> \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n        \u003Cspan class=\"hljs-symbol\">prefer_css_page_size:\u003C/span> \u003Cspan class=\"hljs-literal\">true\u003C/span>\n      }\n      \n      options = default_options.merge(pdf_options)\n      \n      \u003Cspan class=\"hljs-comment\"># Use Puppeteer to generate PDF\u003C/span>\n      \u003Cspan class=\"hljs-title class_\">Puppeteer\u003C/span>.launch(\u003Cspan class=\"hljs-symbol\">headless:\u003C/span> \u003Cspan class=\"hljs-literal\">true\u003C/span>) \u003Cspan class=\"hljs-keyword\">do\u003C/span> |\u003Cspan class=\"hljs-params\">browser\u003C/span>|\n        page = browser.new_page\n        page.set_content(html_content, \u003Cspan class=\"hljs-symbol\">wait_until:\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;networkidle2&#x27;\u003C/span>)\n        page.pdf(\u003Cspan class=\"hljs-symbol\">path:\u003C/span> pdf_path, **options)\n      \u003Cspan class=\"hljs-keyword\">end\u003C/span>\n    \u003Cspan class=\"hljs-keyword\">end\u003C/span>\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">generate_combined_pdfs\u003C/span>(\u003Cspan class=\"hljs-params\">output_dir\u003C/span>)\n      combined_configs = \u003Cspan class=\"hljs-variable\">@config\u003C/span>[\u003Cspan class=\"hljs-string\">&#x27;combined_pdfs&#x27;\u003C/span>]\n      \n      combined_configs.each \u003Cspan class=\"hljs-keyword\">do\u003C/span> |\u003Cspan class=\"hljs-params\">config\u003C/span>|\n        \u003Cspan class=\"hljs-keyword\">next\u003C/span> \u003Cspan class=\"hljs-keyword\">unless\u003C/span> config[\u003Cspan class=\"hljs-string\">&#x27;name&#x27;\u003C/span>] &amp;&amp; config[\u003Cspan class=\"hljs-string\">&#x27;collections&#x27;\u003C/span>]\n        \n        \u003Cspan class=\"hljs-title class_\">Jekyll\u003C/span>.logger.info \u003Cspan class=\"hljs-string\">&quot;PDF Generator:&quot;\u003C/span>, \u003Cspan class=\"hljs-string\">&quot;Generating combined PDF: \u003Cspan class=\"hljs-subst\">#{config[\u003Cspan class=\"hljs-string\">&#x27;name&#x27;\u003C/span>]}\u003C/span>&quot;\u003C/span>\n        \n        \u003Cspan class=\"hljs-comment\"># Collect documents\u003C/span>\n        documents = []\n        config[\u003Cspan class=\"hljs-string\">&#x27;collections&#x27;\u003C/span>].each \u003Cspan class=\"hljs-keyword\">do\u003C/span> |\u003Cspan class=\"hljs-params\">collection_name\u003C/span>|\n          collection = \u003Cspan class=\"hljs-variable\">@site\u003C/span>.collections[collection_name]\n          \u003Cspan class=\"hljs-keyword\">next\u003C/span> \u003Cspan class=\"hljs-keyword\">unless\u003C/span> collection\n          \n          collection_docs = collection.docs.select { |\u003Cspan class=\"hljs-params\">doc\u003C/span>| should_generate_pdf?(doc) }\n          collection_docs = collection_docs.sort_by { |\u003Cspan class=\"hljs-params\">doc\u003C/span>| doc.data[\u003Cspan class=\"hljs-string\">&#x27;date&#x27;\u003C/span>] |\u003Cspan class=\"hljs-params\">\u003C/span>| \u003Cspan class=\"hljs-title class_\">Time\u003C/span>.now } \u003Cspan class=\"hljs-keyword\">if\u003C/span> config[\u003Cspan class=\"hljs-string\">&#x27;sort_by_date&#x27;\u003C/span>]\n          documents.concat(collection_docs)\n        \u003Cspan class=\"hljs-keyword\">end\u003C/span>\n        \n        \u003Cspan class=\"hljs-comment\"># Generate combined HTML\u003C/span>\n        combined_content = generate_combined_content(documents, config)\n        \n        \u003Cspan class=\"hljs-comment\"># Generate combined PDF\u003C/span>\n        pdf_filename = \u003Cspan class=\"hljs-string\">&quot;\u003Cspan class=\"hljs-subst\">#{config[\u003Cspan class=\"hljs-string\">&#x27;name&#x27;\u003C/span>]}\u003C/span>.pdf&quot;\u003C/span>\n        pdf_path = \u003Cspan class=\"hljs-title class_\">File\u003C/span>.join(output_dir, pdf_filename)\n        \n        generate_pdf_with_puppeteer(combined_content, pdf_path, \u003Cspan class=\"hljs-literal\">nil\u003C/span>)\n        \n        \u003Cspan class=\"hljs-title class_\">Jekyll\u003C/span>.logger.info \u003Cspan class=\"hljs-string\">&quot;PDF Generator:&quot;\u003C/span>, \u003Cspan class=\"hljs-string\">&quot;Generated combined PDF: \u003Cspan class=\"hljs-subst\">#{pdf_filename}\u003C/span>&quot;\u003C/span>\n      \u003Cspan class=\"hljs-keyword\">end\u003C/span>\n    \u003Cspan class=\"hljs-keyword\">end\u003C/span>\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">generate_combined_content\u003C/span>(\u003Cspan class=\"hljs-params\">documents, config\u003C/span>)\n      content_parts = []\n      \n      \u003Cspan class=\"hljs-comment\"># Add title page if configured\u003C/span>\n      \u003Cspan class=\"hljs-keyword\">if\u003C/span> config[\u003Cspan class=\"hljs-string\">&#x27;title_page&#x27;\u003C/span>]\n        content_parts &lt;&lt; generate_title_page(config[\u003Cspan class=\"hljs-string\">&#x27;title_page&#x27;\u003C/span>])\n      \u003Cspan class=\"hljs-keyword\">end\u003C/span>\n      \n      \u003Cspan class=\"hljs-comment\"># Add table of contents if configured\u003C/span>\n      \u003Cspan class=\"hljs-keyword\">if\u003C/span> config[\u003Cspan class=\"hljs-string\">&#x27;table_of_contents&#x27;\u003C/span>]\n        content_parts &lt;&lt; generate_table_of_contents(documents)\n      \u003Cspan class=\"hljs-keyword\">end\u003C/span>\n      \n      \u003Cspan class=\"hljs-comment\"># Add documents\u003C/span>\n      documents.each_with_index \u003Cspan class=\"hljs-keyword\">do\u003C/span> |\u003Cspan class=\"hljs-params\">doc, index\u003C/span>|\n        \u003Cspan class=\"hljs-comment\"># Add page break between documents\u003C/span>\n        content_parts &lt;&lt; \u003Cspan class=\"hljs-string\">&#x27;&lt;div class=&quot;page-break-before&quot;&gt;&lt;/div&gt;&#x27;\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> index &gt; \u003Cspan class=\"hljs-number\">0\u003C/span>\n        \n        \u003Cspan class=\"hljs-comment\"># Add document content\u003C/span>\n        doc_content = prepare_html_content(doc)\n        content_parts &lt;&lt; extract_body_content(doc_content)\n      \u003Cspan class=\"hljs-keyword\">end\u003C/span>\n      \n      \u003Cspan class=\"hljs-comment\"># Wrap in complete HTML document\u003C/span>\n      template_vars = {\n        \u003Cspan class=\"hljs-string\">&#x27;title&#x27;\u003C/span> =&gt; config[\u003Cspan class=\"hljs-string\">&#x27;title&#x27;\u003C/span>] |\u003Cspan class=\"hljs-params\">\u003C/span>| config[\u003Cspan class=\"hljs-string\">&#x27;name&#x27;\u003C/span>],\n        \u003Cspan class=\"hljs-string\">&#x27;author&#x27;\u003C/span> =&gt; config[\u003Cspan class=\"hljs-string\">&#x27;author&#x27;\u003C/span>] |\u003Cspan class=\"hljs-params\">\u003C/span>| \u003Cspan class=\"hljs-variable\">@site\u003C/span>.config[\u003Cspan class=\"hljs-string\">&#x27;author&#x27;\u003C/span>],\n        \u003Cspan class=\"hljs-string\">&#x27;date&#x27;\u003C/span> =&gt; \u003Cspan class=\"hljs-title class_\">Time\u003C/span>.now.strftime(\u003Cspan class=\"hljs-string\">&#x27;%B %d, %Y&#x27;\u003C/span>),\n        \u003Cspan class=\"hljs-string\">&#x27;content&#x27;\u003C/span> =&gt; content_parts.join(\u003Cspan class=\"hljs-string\">&quot;\\n&quot;\u003C/span>),\n        \u003Cspan class=\"hljs-string\">&#x27;print_styles&#x27;\u003C/span> =&gt; get_print_styles,\n        \u003Cspan class=\"hljs-string\">&#x27;site&#x27;\u003C/span> =&gt; \u003Cspan class=\"hljs-variable\">@site\u003C/span>.config\n      }\n      \n      liquid_template = \u003Cspan class=\"hljs-title class_\">Liquid\u003C/span>\u003Cspan class=\"hljs-symbol\">:\u003C/span>\u003Cspan class=\"hljs-symbol\">:Template\u003C/span>.parse(get_pdf_template)\n      liquid_template.render(template_vars)\n    \u003Cspan class=\"hljs-keyword\">end\u003C/span>\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">generate_title_page\u003C/span>(\u003Cspan class=\"hljs-params\">title_config\u003C/span>)\n      \u003Cspan class=\"hljs-string\">&lt;&lt;~HTML\n        &lt;div class=&quot;title-page&quot;&gt;\n          &lt;h1&gt;\u003Cspan class=\"hljs-subst\">#{title_config[\u003Cspan class=\"hljs-string\">&#x27;title&#x27;\u003C/span>]}\u003C/span>&lt;/h1&gt;\n          \u003Cspan class=\"hljs-subst\">#{title_config[\u003Cspan class=\"hljs-string\">&#x27;subtitle&#x27;\u003C/span>] ? \u003Cspan class=\"hljs-string\">&quot;&lt;h2&gt;\u003Cspan class=\"hljs-subst\">#{title_config[\u003Cspan class=\"hljs-string\">&#x27;subtitle&#x27;\u003C/span>]}\u003C/span>&lt;/h2&gt;&quot;\u003C/span> : \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>}\u003C/span>\n          \u003Cspan class=\"hljs-subst\">#{title_config[\u003Cspan class=\"hljs-string\">&#x27;author&#x27;\u003C/span>] ? \u003Cspan class=\"hljs-string\">&quot;&lt;p class=&#x27;author&#x27;&gt;\u003Cspan class=\"hljs-subst\">#{title_config[\u003Cspan class=\"hljs-string\">&#x27;author&#x27;\u003C/span>]}\u003C/span>&lt;/p&gt;&quot;\u003C/span> : \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>}\u003C/span>\n          \u003Cspan class=\"hljs-subst\">#{title_config[\u003Cspan class=\"hljs-string\">&#x27;date&#x27;\u003C/span>] ? \u003Cspan class=\"hljs-string\">&quot;&lt;p class=&#x27;date&#x27;&gt;\u003Cspan class=\"hljs-subst\">#{title_config[\u003Cspan class=\"hljs-string\">&#x27;date&#x27;\u003C/span>]}\u003C/span>&lt;/p&gt;&quot;\u003C/span> : \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>}\u003C/span>\n        &lt;/div&gt;\n        &lt;div class=&quot;page-break-after&quot;&gt;&lt;/div&gt;\n      HTML\u003C/span>\n    \u003Cspan class=\"hljs-keyword\">end\u003C/span>\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">generate_table_of_contents\u003C/span>(\u003Cspan class=\"hljs-params\">documents\u003C/span>)\n      toc_entries = documents.map.with_index \u003Cspan class=\"hljs-keyword\">do\u003C/span> |\u003Cspan class=\"hljs-params\">doc, index\u003C/span>|\n        title = doc.data[\u003Cspan class=\"hljs-string\">&#x27;title&#x27;\u003C/span>] |\u003Cspan class=\"hljs-params\">\u003C/span>| doc.basename_without_ext\n        \u003Cspan class=\"hljs-string\">&quot;&lt;div class=&#x27;toc-entry&#x27;&gt;&lt;span class=&#x27;toc-title&#x27;&gt;\u003Cspan class=\"hljs-subst\">#{title}\u003C/span>&lt;/span&gt;&lt;span class=&#x27;toc-page&#x27;&gt;\u003Cspan class=\"hljs-subst\">#{index + \u003Cspan class=\"hljs-number\">1\u003C/span>}\u003C/span>&lt;/span&gt;&lt;/div&gt;&quot;\u003C/span>\n      \u003Cspan class=\"hljs-keyword\">end\u003C/span>.join(\u003Cspan class=\"hljs-string\">&quot;\\n&quot;\u003C/span>)\n      \n      \u003Cspan class=\"hljs-string\">&lt;&lt;~HTML\n        &lt;div class=&quot;table-of-contents&quot;&gt;\n          &lt;h2&gt;Table of Contents&lt;/h2&gt;\n          \u003Cspan class=\"hljs-subst\">#{toc_entries}\u003C/span>\n        &lt;/div&gt;\n        &lt;div class=&quot;page-break-after&quot;&gt;&lt;/div&gt;\n      HTML\u003C/span>\n    \u003Cspan class=\"hljs-keyword\">end\u003C/span>\n    \n    \u003Cspan class=\"hljs-keyword\">def\u003C/span> \u003Cspan class=\"hljs-title function_\">extract_body_content\u003C/span>(\u003Cspan class=\"hljs-params\">html\u003C/span>)\n      \u003Cspan class=\"hljs-comment\"># Extract content from &lt;main&gt; or &lt;body&gt; tags\u003C/span>\n      match = html.match(\u003Cspan class=\"hljs-regexp\">/&lt;main[^&gt;]*&gt;(.*?)&lt;\\/main&gt;/m\u003C/span>) |\u003Cspan class=\"hljs-params\">\u003C/span>| html.match(\u003Cspan class=\"hljs-regexp\">/&lt;body[^&gt;]*&gt;(.*?)&lt;\\/body&gt;/m\u003C/span>)\n      match ? match[\u003Cspan class=\"hljs-number\">1\u003C/span>] : html\n    \u003Cspan class=\"hljs-keyword\">end\u003C/span>\n  \u003Cspan class=\"hljs-keyword\">end\u003C/span>\n\u003Cspan class=\"hljs-keyword\">end\u003C/span>\n\u003C/code>\u003C/pre>\u003Ch3 id=\"hugo-pdf-shortcodes\">Hugo PDF Shortcodes\u003C/h3>\n\u003Cp>Hugo shortcodes for PDF-optimized content:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-go-html-template\">&lt;!-- layouts/shortcodes/pdf-chapter.html --&gt;\n{{ $title := .Get &quot;title&quot; | default .Page.Title }}\n{{ $number := .Get &quot;number&quot; }}\n\n&lt;div class=&quot;chapter&quot; data-chapter-title=&quot;{{ $title }}&quot;&gt;\n  {{ if $number }}\n    &lt;h1 class=&quot;chapter-title&quot; data-chapter-number=&quot;{{ $number }}&quot;&gt;{{ $title }}&lt;/h1&gt;\n  {{ else }}\n    &lt;h1 class=&quot;chapter-title&quot;&gt;{{ $title }}&lt;/h1&gt;\n  {{ end }}\n  \n  {{ if .Get &quot;summary&quot; }}\n    &lt;div class=&quot;chapter-summary&quot;&gt;{{ .Get &quot;summary&quot; | markdownify }}&lt;/div&gt;\n  {{ end }}\n  \n  &lt;div class=&quot;chapter-content&quot;&gt;\n    {{ .Inner | markdownify }}\n  &lt;/div&gt;\n&lt;/div&gt;\n\u003C/code>\u003C/pre>\u003Cpre>\u003Ccode class=\"hljs language-go-html-template\">&lt;!-- layouts/shortcodes/pdf-table.html --&gt;\n{{ $caption := .Get &quot;caption&quot; }}\n{{ $class := .Get &quot;class&quot; | default &quot;data-table&quot; }}\n\n&lt;div class=&quot;table-container&quot;&gt;\n  {{ if $caption }}\n    &lt;div class=&quot;table-caption&quot;&gt;{{ $caption }}&lt;/div&gt;\n  {{ end }}\n  \n  &lt;table class=&quot;{{ $class }}&quot;&gt;\n    {{ .Inner }}\n  &lt;/table&gt;\n&lt;/div&gt;\n\u003C/code>\u003C/pre>\u003Cpre>\u003Ccode class=\"hljs language-go-html-template\">&lt;!-- layouts/shortcodes/pdf-figure.html --&gt;\n{{ $src := .Get &quot;src&quot; }}\n{{ $caption := .Get &quot;caption&quot; }}\n{{ $alt := .Get &quot;alt&quot; | default $caption }}\n\n&lt;figure class=&quot;figure&quot;&gt;\n  &lt;img src=&quot;{{ $src | relURL }}&quot; alt=&quot;{{ $alt }}&quot; class=&quot;figure-image&quot;&gt;\n  {{ if $caption }}\n    &lt;figcaption class=&quot;figure-caption&quot;&gt;{{ $caption | markdownify }}&lt;/figcaption&gt;\n  {{ end }}\n&lt;/figure&gt;\n\u003C/code>\u003C/pre>\u003Cpre>\u003Ccode class=\"hljs language-go-html-template\">&lt;!-- layouts/shortcodes/pdf-code.html --&gt;\n{{ $language := .Get &quot;lang&quot; | default &quot;text&quot; }}\n{{ $title := .Get &quot;title&quot; }}\n{{ $file := .Get &quot;file&quot; }}\n\n&lt;div class=&quot;code-listing&quot;&gt;\n  {{ if $title }}\n    &lt;div class=&quot;code-listing-title&quot;&gt;{{ $title }}&lt;/div&gt;\n  {{ end }}\n  \n  &lt;pre class=&quot;code-listing-content&quot; data-language=&quot;{{ $language }}&quot;&gt;&lt;code class=&quot;language-{{ $language }}&quot;&gt;{{- if $file -}}{{ readFile $file }}{{- else -}}{{ .Inner }}{{- end -}}&lt;/code&gt;&lt;/pre&gt;\n&lt;/div&gt;\n\u003C/code>\u003C/pre>\u003Cpre>\u003Ccode class=\"hljs language-go-html-template\">&lt;!-- layouts/shortcodes/pdf-pagebreak.html --&gt;\n&lt;div class=&quot;page-break-before&quot;&gt;&lt;/div&gt;\n\u003C/code>\u003C/pre>\u003Cpre>\u003Ccode class=\"hljs language-go-html-template\">&lt;!-- layouts/shortcodes/pdf-note.html --&gt;\n{{ $type := .Get &quot;type&quot; | default &quot;note&quot; }}\n{{ $title := .Get &quot;title&quot; }}\n\n&lt;div class=&quot;{{ $type }}-box&quot;&gt;\n  {{ if $title }}\n    &lt;div class=&quot;note-title&quot;&gt;{{ $title }}&lt;/div&gt;\n  {{ end }}\n  {{ .Inner | markdownify }}\n&lt;/div&gt;\n\u003C/code>\u003C/pre>\u003Cp>\u003Cstrong>Hugo Content Usage\u003C/strong>:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-markdown\">\n{{&lt; pdf-chapter title=&quot;Introduction&quot; number=&quot;1&quot; summary=&quot;Overview of the system architecture and design principles.&quot; &gt;}}\n\nThis chapter provides a comprehensive introduction to the system design.\n\n\u003Cspan class=\"hljs-section\">## System Overview\u003C/span>\n\nThe architecture follows a microservices pattern with the following components:\n\n{{&lt; pdf-table caption=&quot;System Components Overview&quot; &gt;}}\n| Component | Purpose | Technology |\n|-----------|---------|------------|\n| API Gateway | Request routing | Node.js |\n| User Service | Authentication | Python |\n| Data Service | Storage | PostgreSQL |\n{{&lt; /pdf-table &gt;}}\n\n{{&lt; pdf-figure src=&quot;/images/architecture-diagram.png&quot; caption=&quot;System Architecture Diagram showing the relationship between components&quot; &gt;}}\n\n{{&lt; pdf-code lang=&quot;javascript&quot; title=&quot;API Gateway Configuration&quot; &gt;}}\nconst express = require(&#x27;express&#x27;);\nconst app = express();\n\napp.use(&#x27;/api/users&#x27;, userRoutes);\napp.use(&#x27;/api/data&#x27;, dataRoutes);\n\napp.listen(3000, () =&gt; {\n  console.log(&#x27;API Gateway running on port 3000&#x27;);\n});\n{{&lt; /pdf-code &gt;}}\n\n{{&lt; pdf-note type=&quot;warning&quot; title=&quot;Security Consideration&quot; &gt;}}\nAlways validate and sanitize input data before processing to prevent security vulnerabilities.\n{{&lt; /pdf-note &gt;}}\n\n{{&lt; /pdf-chapter &gt;}}\n\n{{&lt; pdf-pagebreak &gt;}}\n\n{{&lt; pdf-chapter title=&quot;Implementation Details&quot; number=&quot;2&quot; &gt;}}\n\nThis chapter covers the detailed implementation of each component.\n\n{{&lt; /pdf-chapter &gt;}}\n\u003C/code>\u003C/pre>\u003Ch2 id=\"integration-with-modern-workflows\">Integration with Modern Workflows\u003C/h2>\n\u003Cp>Print styles and PDF formatting integrate seamlessly with comprehensive Markdown workflows. When combined with \u003Ca href=\"/blog/markdown-document-versioning-change-tracking-complete-guide\">document versioning and change tracking\u003C/a>, professional PDF output ensures version-controlled document distribution that maintains formatting consistency across revisions while enabling collaborative development of complex publications.\u003C/p>\n\u003Cp>For comprehensive documentation systems requiring both digital and print delivery, PDF formatting works effectively with \u003Ca href=\"/blog/markdown-custom-css-classes-styling-complete-guide\">custom CSS classes and styling\u003C/a> to create design systems that translate seamlessly from web presentation to professional print output while maintaining brand identity and visual hierarchy.\u003C/p>\n\u003Cp>When managing enterprise documentation workflows, print styles complement \u003Ca href=\"/blog/markdown-blockquotes-advanced-styling-complete-guide\">blockquote advanced styling\u003C/a> to create professional publications that effectively communicate complex information through both textual content and sophisticated visual presentation that works across digital screens and physical print media.\u003C/p>\n\u003Ch2 id=\"troubleshooting-common-pdf-issues\">Troubleshooting Common PDF Issues\u003C/h2>\n\u003Ch3 id=\"font-and-typography-problems\">Font and Typography Problems\u003C/h3>\n\u003Cp>\u003Cstrong>Problem\u003C/strong>: Fonts not rendering correctly in PDF output or missing special characters\u003C/p>\n\u003Cp>\u003Cstrong>Solutions\u003C/strong>:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-css\">\u003Cspan class=\"hljs-comment\">/* Font fallback and embedding strategies */\u003C/span>\n\u003Cspan class=\"hljs-keyword\">@media\u003C/span> print {\n  \u003Cspan class=\"hljs-comment\">/* Specify complete font stacks */\u003C/span>\n  \u003Cspan class=\"hljs-selector-tag\">body\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">font-family\u003C/span>: Georgia, \u003Cspan class=\"hljs-string\">&#x27;Times New Roman&#x27;\u003C/span>, Times, serif;\n  }\n  \n  \u003Cspan class=\"hljs-selector-tag\">code\u003C/span>, pre {\n    \u003Cspan class=\"hljs-attribute\">font-family\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Courier New&#x27;\u003C/span>, Courier, \u003Cspan class=\"hljs-string\">&#x27;Lucida Console&#x27;\u003C/span>, monospace;\n  }\n  \n  \u003Cspan class=\"hljs-comment\">/* Ensure Unicode support */\u003C/span>\n  * {\n    \u003Cspan class=\"hljs-attribute\">font-variant-numeric\u003C/span>: normal;\n    \u003Cspan class=\"hljs-attribute\">font-feature-settings\u003C/span>: normal;\n  }\n  \n  \u003Cspan class=\"hljs-comment\">/* Fix for missing characters */\u003C/span>\n  \u003Cspan class=\"hljs-selector-class\">.unicode-fix\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">font-family\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Arial Unicode MS&#x27;\u003C/span>, Arial, sans-serif;\n  }\n  \n  \u003Cspan class=\"hljs-comment\">/* Web font fallbacks */\u003C/span>\n  \u003Cspan class=\"hljs-keyword\">@font-face\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">font-family\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;CustomFont&#x27;\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">src\u003C/span>: \u003Cspan class=\"hljs-built_in\">local\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;Georgia&#x27;\u003C/span>), \u003Cspan class=\"hljs-built_in\">local\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;Times New Roman&#x27;\u003C/span>);\n    \u003Cspan class=\"hljs-attribute\">font-display\u003C/span>: block;\n  }\n}\n\u003C/code>\u003C/pre>\u003Cp>\u003Cstrong>PDF Generation Configuration\u003C/strong>:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-javascript\">\u003Cspan class=\"hljs-comment\">// Puppeteer font handling\u003C/span>\n\u003Cspan class=\"hljs-keyword\">const\u003C/span> pdfOptions = {\n  \u003Cspan class=\"hljs-attr\">format\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Letter&#x27;\u003C/span>,\n  \u003Cspan class=\"hljs-attr\">margin\u003C/span>: { \u003Cspan class=\"hljs-attr\">top\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;1in&#x27;\u003C/span>, \u003Cspan class=\"hljs-attr\">right\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;1in&#x27;\u003C/span>, \u003Cspan class=\"hljs-attr\">bottom\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;1in&#x27;\u003C/span>, \u003Cspan class=\"hljs-attr\">left\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;1in&#x27;\u003C/span> },\n  \u003Cspan class=\"hljs-attr\">printBackground\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n  \u003Cspan class=\"hljs-attr\">preferCSSPageSize\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n  \n  \u003Cspan class=\"hljs-comment\">// Font loading settings\u003C/span>\n  \u003Cspan class=\"hljs-attr\">waitUntil\u003C/span>: [\u003Cspan class=\"hljs-string\">&#x27;networkidle2&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;load&#x27;\u003C/span>],\n  \u003Cspan class=\"hljs-attr\">timeout\u003C/span>: \u003Cspan class=\"hljs-number\">60000\u003C/span>,\n  \n  \u003Cspan class=\"hljs-comment\">// Ensure fonts are loaded\u003C/span>\n  \u003Cspan class=\"hljs-attr\">args\u003C/span>: [\n    \u003Cspan class=\"hljs-string\">&#x27;--no-sandbox&#x27;\u003C/span>,\n    \u003Cspan class=\"hljs-string\">&#x27;--disable-setuid-sandbox&#x27;\u003C/span>,\n    \u003Cspan class=\"hljs-string\">&#x27;--disable-font-subpixel-positioning&#x27;\u003C/span>,\n    \u003Cspan class=\"hljs-string\">&#x27;--enable-font-antialiasing&#x27;\u003C/span>\n  ]\n};\n\u003C/code>\u003C/pre>\u003Ch3 id=\"page-break-and-layout-issues\">Page Break and Layout Issues\u003C/h3>\n\u003Cp>\u003Cstrong>Problem\u003C/strong>: Content breaking awkwardly across pages or overlapping page margins\u003C/p>\n\u003Cp>\u003Cstrong>Solutions\u003C/strong>:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-css\">\u003Cspan class=\"hljs-keyword\">@media\u003C/span> print {\n  \u003Cspan class=\"hljs-comment\">/* Better page break control */\u003C/span>\n  \u003Cspan class=\"hljs-selector-class\">.keep-together\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">page-break-inside\u003C/span>: avoid;\n    \u003Cspan class=\"hljs-attribute\">break-inside\u003C/span>: avoid;\n  }\n  \n  \u003Cspan class=\"hljs-selector-class\">.force-page-break\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">page-break-before\u003C/span>: always;\n    \u003Cspan class=\"hljs-attribute\">break-before\u003C/span>: page;\n  }\n  \n  \u003Cspan class=\"hljs-selector-class\">.avoid-page-break-after\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">page-break-after\u003C/span>: avoid;\n    \u003Cspan class=\"hljs-attribute\">break-after\u003C/span>: avoid;\n  }\n  \n  \u003Cspan class=\"hljs-comment\">/* Fix for widows and orphans */\u003C/span>\n  \u003Cspan class=\"hljs-selector-tag\">p\u003C/span>, \u003Cspan class=\"hljs-selector-tag\">li\u003C/span>, \u003Cspan class=\"hljs-selector-tag\">dd\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">orphans\u003C/span>: \u003Cspan class=\"hljs-number\">3\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">widows\u003C/span>: \u003Cspan class=\"hljs-number\">3\u003C/span>;\n  }\n  \n  \u003Cspan class=\"hljs-comment\">/* Heading page break control */\u003C/span>\n  \u003Cspan class=\"hljs-selector-tag\">h1\u003C/span>, \u003Cspan class=\"hljs-selector-tag\">h2\u003C/span>, \u003Cspan class=\"hljs-selector-tag\">h3\u003C/span>, \u003Cspan class=\"hljs-selector-tag\">h4\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">page-break-after\u003C/span>: avoid;\n    \u003Cspan class=\"hljs-attribute\">break-after\u003C/span>: avoid;\n    \u003Cspan class=\"hljs-attribute\">page-break-inside\u003C/span>: avoid;\n    \u003Cspan class=\"hljs-attribute\">break-inside\u003C/span>: avoid;\n  }\n  \n  \u003Cspan class=\"hljs-comment\">/* List handling */\u003C/span>\n  \u003Cspan class=\"hljs-selector-tag\">ul\u003C/span>, \u003Cspan class=\"hljs-selector-tag\">ol\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">page-break-inside\u003C/span>: avoid;\n    \u003Cspan class=\"hljs-attribute\">break-inside\u003C/span>: avoid;\n  }\n  \n  \u003Cspan class=\"hljs-comment\">/* Table handling */\u003C/span>\n  \u003Cspan class=\"hljs-selector-tag\">table\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">page-break-inside\u003C/span>: avoid;\n    \u003Cspan class=\"hljs-attribute\">break-inside\u003C/span>: avoid;\n  }\n  \n  \u003Cspan class=\"hljs-selector-tag\">thead\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">display\u003C/span>: table-header-group;\n  }\n  \n  \u003Cspan class=\"hljs-selector-tag\">tr\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">page-break-inside\u003C/span>: avoid;\n    \u003Cspan class=\"hljs-attribute\">break-inside\u003C/span>: avoid;\n  }\n  \n  \u003Cspan class=\"hljs-comment\">/* Image handling */\u003C/span>\n  \u003Cspan class=\"hljs-selector-tag\">img\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">page-break-inside\u003C/span>: avoid;\n    \u003Cspan class=\"hljs-attribute\">break-inside\u003C/span>: avoid;\n    \u003Cspan class=\"hljs-attribute\">page-break-after\u003C/span>: avoid;\n    \u003Cspan class=\"hljs-attribute\">break-after\u003C/span>: avoid;\n    \u003Cspan class=\"hljs-attribute\">max-width\u003C/span>: \u003Cspan class=\"hljs-number\">100%\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">height\u003C/span>: auto;\n  }\n  \n  \u003Cspan class=\"hljs-comment\">/* Code block handling */\u003C/span>\n  pre {\n    \u003Cspan class=\"hljs-attribute\">page-break-inside\u003C/span>: avoid;\n    \u003Cspan class=\"hljs-attribute\">break-inside\u003C/span>: avoid;\n    \u003Cspan class=\"hljs-attribute\">white-space\u003C/span>: pre-wrap;\n    \u003Cspan class=\"hljs-attribute\">word-wrap\u003C/span>: break-word;\n    \u003Cspan class=\"hljs-attribute\">overflow-wrap\u003C/span>: break-word;\n  }\n}\n\u003C/code>\u003C/pre>\u003Ch3 id=\"color-and-background-issues\">Color and Background Issues\u003C/h3>\n\u003Cp>\u003Cstrong>Problem\u003C/strong>: Colors or backgrounds not appearing in PDF output\u003C/p>\n\u003Cp>\u003Cstrong>Solutions\u003C/strong>:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-css\">\u003Cspan class=\"hljs-keyword\">@media\u003C/span> print {\n  \u003Cspan class=\"hljs-comment\">/* Force color and background printing */\u003C/span>\n  * {\n    -webkit-print-\u003Cspan class=\"hljs-attribute\">color\u003C/span>-adjust: exact \u003Cspan class=\"hljs-meta\">!important\u003C/span>;\n    \u003Cspan class=\"hljs-attribute\">color\u003C/span>-adjust: exact \u003Cspan class=\"hljs-meta\">!important\u003C/span>;\n    print-\u003Cspan class=\"hljs-attribute\">color\u003C/span>-adjust: exact \u003Cspan class=\"hljs-meta\">!important\u003C/span>;\n  }\n  \n  \u003Cspan class=\"hljs-comment\">/* Ensure backgrounds are printed */\u003C/span>\n  \u003Cspan class=\"hljs-selector-class\">.highlight-box\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">background\u003C/span>: \u003Cspan class=\"hljs-number\">#f0f8ff\u003C/span> \u003Cspan class=\"hljs-meta\">!important\u003C/span>;\n    -webkit-print-\u003Cspan class=\"hljs-attribute\">color\u003C/span>-adjust: exact;\n  }\n  \n  \u003Cspan class=\"hljs-comment\">/* Convert colors to print-friendly versions */\u003C/span>\n  \u003Cspan class=\"hljs-selector-class\">.screen-blue\u003C/span> {\n    \u003Cspan class=\"hljs-attribute\">color\u003C/span>: \u003Cspan class=\"hljs-number\">#003366\u003C/span> \u003Cspan class=\"hljs-meta\">!important\u003C/span>; \u003Cspan class=\"hljs-comment\">/* Darker for print */\u003C/span>\n    \u003Cspan class=\"hljs-attribute\">background\u003C/span>: \u003Cspan class=\"hljs-number\">#e6f3ff\u003C/span> \u003Cspan class=\"hljs-meta\">!important\u003C/span>; \u003Cspan class=\"hljs-comment\">/* Lighter for print */\u003C/span>\n  }\n  \n  \u003Cspan class=\"hljs-comment\">/* High contrast alternatives */\u003C/span>\n  \u003Cspan class=\"hljs-keyword\">@media\u003C/span> print \u003Cspan class=\"hljs-keyword\">and\u003C/span> (\u003Cspan class=\"hljs-attribute\">prefers-contrast\u003C/span>: high) {\n    \u003Cspan class=\"hljs-selector-class\">.color-element\u003C/span> {\n      \u003Cspan class=\"hljs-attribute\">background\u003C/span>: white \u003Cspan class=\"hljs-meta\">!important\u003C/span>;\n      \u003Cspan class=\"hljs-attribute\">color\u003C/span>: black \u003Cspan class=\"hljs-meta\">!important\u003C/span>;\n      \u003Cspan class=\"hljs-attribute\">border\u003C/span>: \u003Cspan class=\"hljs-number\">2px\u003C/span> solid black \u003Cspan class=\"hljs-meta\">!important\u003C/span>;\n    }\n  }\n}\n\u003C/code>\u003C/pre>\u003Cp>\u003Cstrong>Puppeteer Configuration\u003C/strong>:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-javascript\">\u003Cspan class=\"hljs-keyword\">const\u003C/span> page = \u003Cspan class=\"hljs-keyword\">await\u003C/span> browser.\u003Cspan class=\"hljs-title function_\">newPage\u003C/span>();\n\n\u003Cspan class=\"hljs-comment\">// Enable background graphics\u003C/span>\n\u003Cspan class=\"hljs-keyword\">await\u003C/span> page.\u003Cspan class=\"hljs-title function_\">emulateMediaType\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;print&#x27;\u003C/span>);\n\u003Cspan class=\"hljs-keyword\">await\u003C/span> page.evaluateOnNewDocument(\u003Cspan class=\"hljs-function\">() =&gt;\u003C/span> {\n  \u003Cspan class=\"hljs-variable language_\">document\u003C/span>.\u003Cspan class=\"hljs-property\">documentElement\u003C/span>.\u003Cspan class=\"hljs-property\">style\u003C/span>.\u003Cspan class=\"hljs-title function_\">setProperty\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;-webkit-print-color-adjust&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;exact&#x27;\u003C/span>);\n});\n\n\u003Cspan class=\"hljs-keyword\">await\u003C/span> page.\u003Cspan class=\"hljs-title function_\">pdf\u003C/span>({\n  \u003Cspan class=\"hljs-attr\">path\u003C/span>: outputPath,\n  \u003Cspan class=\"hljs-attr\">format\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Letter&#x27;\u003C/span>,\n  \u003Cspan class=\"hljs-attr\">printBackground\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>, \u003Cspan class=\"hljs-comment\">// Critical for backgrounds\u003C/span>\n  \u003Cspan class=\"hljs-attr\">preferCSSPageSize\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n  \u003Cspan class=\"hljs-attr\">margin\u003C/span>: { \u003Cspan class=\"hljs-attr\">top\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;1in&#x27;\u003C/span>, \u003Cspan class=\"hljs-attr\">right\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;1in&#x27;\u003C/span>, \u003Cspan class=\"hljs-attr\">bottom\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;1in&#x27;\u003C/span>, \u003Cspan class=\"hljs-attr\">left\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;1in&#x27;\u003C/span> }\n});\n\u003C/code>\u003C/pre>\u003Ch2 id=\"conclusion\">Conclusion\u003C/h2>\n\u003Cp>Print styles and PDF formatting for Markdown documents transform digital content into professional publications that maintain design excellence, typography precision, and layout consistency across different output formats and distribution channels. By mastering CSS print media queries, automated PDF generation techniques, and platform-specific implementations, content creators can produce high-quality documents that serve both digital and physical publication requirements.\u003C/p>\n\u003Cp>The key to successful print formatting lies in understanding the fundamental differences between screen and print media, implementing robust CSS that handles page breaks gracefully, and choosing appropriate PDF generation tools that meet specific project requirements. Whether you&#39;re creating technical documentation, academic papers, or business reports, the techniques covered in this guide provide the foundation for professional document output that maintains quality across all distribution formats.\u003C/p>\n\u003Cp>Remember to test your print styles across different PDF generators and browsers, validate output quality with various paper sizes and printer settings, and implement automated workflows that ensure consistent results across large document sets. With proper print style implementation, your Markdown content becomes a powerful platform for professional publication that bridges the gap between digital creation and physical distribution while maintaining the simplicity and portability that makes Markdown ideal for modern content workflows.\u003C/p>\n",[15,19,22,25,28,31,34],{"id":16,"text":17,"level":18},"why-master-print-styles-for-markdown","Why Master Print Styles for Markdown?",2,{"id":20,"text":21,"level":18},"understanding-print-css-fundamentals","Understanding Print CSS Fundamentals",{"id":23,"text":24,"level":18},"pdf-generation-and-automation","PDF Generation and Automation",{"id":26,"text":27,"level":18},"platform-specific-implementation","Platform-Specific Implementation",{"id":29,"text":30,"level":18},"integration-with-modern-workflows","Integration with Modern Workflows",{"id":32,"text":33,"level":18},"troubleshooting-common-pdf-issues","Troubleshooting Common PDF Issues",{"id":35,"text":36,"level":18},"conclusion","Conclusion",[],[39,47,56],{"slug":40,"title":41,"description":42,"excerpt":43,"date":44,"category":9,"author":10,"keywords":45,"readingMinutes":46},"markdown-advanced-formatting-techniques-complete-guide","Markdown Advanced Formatting Techniques: Complete Guide for Professional Document Layout and Complex Structure Design","Master advanced Markdown formatting techniques for professional document layouts, complex structures, and sophisticated content organization. Learn nested formatting, custom HTML integration, and advanced typography patterns.","Advanced Markdown formatting techniques enable content creators to build sophisticated document structures that combine the simplicity of Markdown syntax with the precision of professional…","2025-12-01","markdown advanced formatting, professional markdown layout, complex markdown structures, markdown typography, advanced markdown techniques, markdown document design",12,{"slug":48,"title":49,"description":50,"excerpt":51,"date":52,"category":53,"author":10,"keywords":54,"readingMinutes":55},"remove-markdown-formatting-chatgpt-claude-output","How to Remove Markdown Formatting from ChatGPT and Claude Output","AI chat answers arrive full of asterisks, pound signs and link syntax. Why it happens, three ways to get clean text out (and which one fits where you're pasting), and what plain text can't preserve.","You ask an AI assistant for a summary, paste it into an email or a form field, and the result is littered with pairs, ## prefixes and text links. Nothing is broken. The assistant wrote Markdown,…","2026-10-02","Troubleshooting","remove markdown formatting chatgpt, strip markdown from ai output, markdown to plain text, chatgpt asterisks copy paste, remove ** from chatgpt, claude markdown output",4,{"slug":57,"title":58,"description":59,"excerpt":60,"date":61,"category":9,"author":10,"keywords":62,"readingMinutes":63},"markdown-table-borders-styling-complete-guide","Markdown Table Borders and Styling: Complete Guide for Professional Table Formatting","Master table borders, styling, and formatting in Markdown. Learn to create professional tables with custom borders, colors, alignment, and responsive design for documentation and web content.","Table borders and styling in Markdown enable writers to create professional, visually appealing data presentations that enhance readability and information hierarchy. While basic Markdown tables…","2025-09-04","markdown table borders, markdown table styling, table formatting markdown, custom table borders, markdown table css, professional tables, responsive table design",13,1792184941951]