{"version":3,"kind":"Article","sha256":"570b0ccc12c22545cde3648f8343e61b1c7c2df5c1a18ecc23ead14b5391939b","slug":"b-pdfgeneration","location":"/content/lessons/6b_pdfgeneration.md","dependencies":[],"frontmatter":{"title":"PDFs with Typst and LaTeX 🌶","numbering":{"title":{"offset":1,"enabled":true}},"content_includes_title":false,"authors":[{"nameParsed":{"literal":"Freek Pols","given":"Freek","family":"Pols"},"name":"Freek Pols","id":"contributors-myst-generated-uid-0"},{"nameParsed":{"literal":"Luuk Fröling","given":"Luuk","family":"Fröling"},"name":"Luuk Fröling","id":"contributors-myst-generated-uid-1"},{"nameParsed":{"literal":"Robert Lanzafame","given":"Robert","family":"Lanzafame"},"name":"Robert Lanzafame","id":"contributors-myst-generated-uid-2"},{"nameParsed":{"literal":"Kirstie Whitaker","given":"Kirstie","family":"Whitaker"},"name":"Kirstie Whitaker","id":"contributors-myst-generated-uid-3"},{"nameParsed":{"literal":"Jim Madge","given":"Jim","family":"Madge"},"name":"Jim Madge","id":"contributors-myst-generated-uid-4"}],"date":"2025-11-02","license":{"content":{"id":"CC-BY-4.0","url":"https://creativecommons.org/licenses/by/4.0/","name":"Creative Commons Attribution 4.0 International","free":true,"CC":true}},"github":"https://github.com/jupyter-book/workshop-template","edit_url":null,"abbreviations":{"JB2":"Jupyter Book 2","CI/CD":"Continuous Integration/Continuous Deployment","GHA":"GitHub Actions","GH":"GitHub","IDE":"Integrated Development Environment","VSC":"Visual Studio Code","CLI":"commmand line interface"},"source_url":"https://github.com/jupyter-book/workshop-template/blob/main/content/lessons/6b_pdfgeneration.md","enumerator":"8.2","thumbnail":"/build/mystvstex-72d312ef51aed47c93477909d4490d4e.png","exports":[{"format":"md","filename":"6b_pdfgeneration.md","url":"/build/6b_pdfgeneration-3e80ed5027cf07e27a37051c1aa68507.md"}]},"mdast":{"type":"root","children":[{"type":"div","class":"font-light text-sm mb-4 updated-date-container","children":[{"type":"text","value":"Updated: 02 Nov 2025","key":"O3Yd5ma1bu"}],"key":"OWE4E9LOa4"},{"type":"block","children":[{"type":"paragraph","position":{"start":{"line":9,"column":1},"end":{"line":10,"column":1}},"children":[{"type":"text","value":"Jupyter Book 2 currently supports ","position":{"start":{"line":9,"column":1},"end":{"line":9,"column":1}},"key":"JrrBHql4tO"},{"type":"emphasis","position":{"start":{"line":9,"column":1},"end":{"line":9,"column":1}},"children":[{"type":"text","value":"two","position":{"start":{"line":9,"column":1},"end":{"line":9,"column":1}},"key":"WDzuEB5zeX"}],"key":"VWqRcudDX8"},{"type":"text","value":" primary ways to export your book as a PDF: LaTeX or Typst.\nBoth are powerful tools for generating high-quality PDFs, but they differ in several key aspects (additional advantages and disadvantages ","position":{"start":{"line":9,"column":1},"end":{"line":9,"column":1}},"key":"UXB6JQLmMT"},{"type":"link","url":"https://mystmd.org/guide/creating-pdf-documents","position":{"start":{"line":9,"column":1},"end":{"line":9,"column":1}},"children":[{"type":"text","value":"described here","position":{"start":{"line":9,"column":1},"end":{"line":9,"column":1}},"key":"Jqf1CR0drn"}],"urlSource":"https://mystmd.org/guide/creating-pdf-documents","key":"QISos1tTN6"},{"type":"text","value":"):","position":{"start":{"line":9,"column":1},"end":{"line":9,"column":1}},"key":"GzGJAK0zvl"}],"key":"Gju9VjL9HK"},{"type":"table","position":{"start":{"line":12,"column":1},"end":{"line":20,"column":1}},"children":[{"type":"tableRow","position":{"start":{"line":12,"column":1},"end":{"line":12,"column":1}},"children":[{"type":"tableCell","header":true,"position":{"start":{"line":12,"column":1},"end":{"line":12,"column":1}},"children":[{"type":"text","value":"Feature","position":{"start":{"line":12,"column":1},"end":{"line":12,"column":1}},"key":"dL5LBCtoO9"}],"key":"GT4mBiMQzA"},{"type":"tableCell","header":true,"position":{"start":{"line":12,"column":1},"end":{"line":12,"column":1}},"children":[{"type":"text","value":"Typst","position":{"start":{"line":12,"column":1},"end":{"line":12,"column":1}},"key":"hx2N4r3VjX"}],"key":"MTDYR0N09L"},{"type":"tableCell","header":true,"position":{"start":{"line":12,"column":1},"end":{"line":12,"column":1}},"children":[{"type":"text","value":"LaTeX","position":{"start":{"line":12,"column":1},"end":{"line":12,"column":1}},"key":"RR8vVqFYli"}],"key":"vyVv5wm0sy"}],"key":"Dr3OJ3EQMw"},{"type":"tableRow","position":{"start":{"line":14,"column":1},"end":{"line":14,"column":1}},"children":[{"type":"tableCell","position":{"start":{"line":14,"column":1},"end":{"line":14,"column":1}},"children":[{"type":"strong","position":{"start":{"line":14,"column":1},"end":{"line":14,"column":1}},"children":[{"type":"text","value":"Ease of Use","position":{"start":{"line":14,"column":1},"end":{"line":14,"column":1}},"key":"xsqgd1jgC9"}],"key":"cvfzzrysKi"}],"key":"JBVG7Nqxx4"},{"type":"tableCell","position":{"start":{"line":14,"column":1},"end":{"line":14,"column":1}},"children":[{"type":"text","value":"Modern syntax, easier to learn and use","position":{"start":{"line":14,"column":1},"end":{"line":14,"column":1}},"key":"VqnXwvNFZZ"}],"key":"UZXuHd2TNP"},{"type":"tableCell","position":{"start":{"line":14,"column":1},"end":{"line":14,"column":1}},"children":[{"type":"text","value":"Steeper learning curve, more complex syntax","position":{"start":{"line":14,"column":1},"end":{"line":14,"column":1}},"key":"q5ARXnVHTm"}],"key":"U2O2KIuxd9"}],"key":"aVRX6j9zCy"},{"type":"tableRow","position":{"start":{"line":15,"column":1},"end":{"line":15,"column":1}},"children":[{"type":"tableCell","position":{"start":{"line":15,"column":1},"end":{"line":15,"column":1}},"children":[{"type":"strong","position":{"start":{"line":15,"column":1},"end":{"line":15,"column":1}},"children":[{"type":"text","value":"Speed","position":{"start":{"line":15,"column":1},"end":{"line":15,"column":1}},"key":"E0uD4kCKEb"}],"key":"iU8TsohemN"}],"key":"nz4zFdEOLn"},{"type":"tableCell","position":{"start":{"line":15,"column":1},"end":{"line":15,"column":1}},"children":[{"type":"text","value":"Fast compilation","position":{"start":{"line":15,"column":1},"end":{"line":15,"column":1}},"key":"hjNkP6V72B"}],"key":"cKFAetAVcS"},{"type":"tableCell","position":{"start":{"line":15,"column":1},"end":{"line":15,"column":1}},"children":[{"type":"text","value":"Slower compilation, especially for large docs","position":{"start":{"line":15,"column":1},"end":{"line":15,"column":1}},"key":"TxXYwLcg5E"}],"key":"KGKyEkSOdZ"}],"key":"LNv25zqdfV"},{"type":"tableRow","position":{"start":{"line":16,"column":1},"end":{"line":16,"column":1}},"children":[{"type":"tableCell","position":{"start":{"line":16,"column":1},"end":{"line":16,"column":1}},"children":[{"type":"strong","position":{"start":{"line":16,"column":1},"end":{"line":16,"column":1}},"children":[{"type":"text","value":"Customization","position":{"start":{"line":16,"column":1},"end":{"line":16,"column":1}},"key":"orwJdmvHSJ"}],"key":"GUpugX8clX"}],"key":"zLRnWGAfPC"},{"type":"tableCell","position":{"start":{"line":16,"column":1},"end":{"line":16,"column":1}},"children":[{"type":"text","value":"Templates are easy to modify","position":{"start":{"line":16,"column":1},"end":{"line":16,"column":1}},"key":"MzbVPfGwED"}],"key":"QDbd90OFi5"},{"type":"tableCell","position":{"start":{"line":16,"column":1},"end":{"line":16,"column":1}},"children":[{"type":"text","value":"Highly customizable, but requires more effort","position":{"start":{"line":16,"column":1},"end":{"line":16,"column":1}},"key":"epL52Pr1g7"}],"key":"wVkkqXBnRq"}],"key":"W1zSgxe0V2"},{"type":"tableRow","position":{"start":{"line":17,"column":1},"end":{"line":17,"column":1}},"children":[{"type":"tableCell","position":{"start":{"line":17,"column":1},"end":{"line":17,"column":1}},"children":[{"type":"strong","position":{"start":{"line":17,"column":1},"end":{"line":17,"column":1}},"children":[{"type":"text","value":"Integration","position":{"start":{"line":17,"column":1},"end":{"line":17,"column":1}},"key":"erxPdvGqzb"}],"key":"apmP9jaK5K"}],"key":"Q61LHoDTTR"},{"type":"tableCell","position":{"start":{"line":17,"column":1},"end":{"line":17,"column":1}},"children":[{"type":"text","value":"Designed for MyST Markdown and Jupyter Book","position":{"start":{"line":17,"column":1},"end":{"line":17,"column":1}},"key":"AR7K5HgfTa"}],"key":"DXSrbVdmFb"},{"type":"tableCell","position":{"start":{"line":17,"column":1},"end":{"line":17,"column":1}},"children":[{"type":"text","value":"Widely supported in academic publishing","position":{"start":{"line":17,"column":1},"end":{"line":17,"column":1}},"key":"i8gC5hrZRK"}],"key":"cALShO2Uh0"}],"key":"UTBUEZ6nvK"},{"type":"tableRow","position":{"start":{"line":18,"column":1},"end":{"line":18,"column":1}},"children":[{"type":"tableCell","position":{"start":{"line":18,"column":1},"end":{"line":18,"column":1}},"children":[{"type":"strong","position":{"start":{"line":18,"column":1},"end":{"line":18,"column":1}},"children":[{"type":"text","value":"Community","position":{"start":{"line":18,"column":1},"end":{"line":18,"column":1}},"key":"dNCAWn1l3B"}],"key":"vXtMGbWk8Z"}],"key":"IsgLxRlEFD"},{"type":"tableCell","position":{"start":{"line":18,"column":1},"end":{"line":18,"column":1}},"children":[{"type":"text","value":"Growing, newer ecosystem","position":{"start":{"line":18,"column":1},"end":{"line":18,"column":1}},"key":"ggR3XzvIyw"}],"key":"QlzwicXrFv"},{"type":"tableCell","position":{"start":{"line":18,"column":1},"end":{"line":18,"column":1}},"children":[{"type":"text","value":"Large, established community","position":{"start":{"line":18,"column":1},"end":{"line":18,"column":1}},"key":"eMm7NTN9pB"}],"key":"SPTPW08VMb"}],"key":"IlEkiA1Lr7"},{"type":"tableRow","position":{"start":{"line":19,"column":1},"end":{"line":19,"column":1}},"children":[{"type":"tableCell","position":{"start":{"line":19,"column":1},"end":{"line":19,"column":1}},"children":[{"type":"strong","position":{"start":{"line":19,"column":1},"end":{"line":19,"column":1}},"children":[{"type":"text","value":"Features","position":{"start":{"line":19,"column":1},"end":{"line":19,"column":1}},"key":"vLPX8q9xpg"}],"key":"n4li7CBOkG"}],"key":"fIeDzHqDVP"},{"type":"tableCell","position":{"start":{"line":19,"column":1},"end":{"line":19,"column":1}},"children":[{"type":"text","value":"Good support for math, figures, and tables","position":{"start":{"line":19,"column":1},"end":{"line":19,"column":1}},"key":"nEQxZRWIXe"}],"key":"Etc2k4bMyD"},{"type":"tableCell","position":{"start":{"line":19,"column":1},"end":{"line":19,"column":1}},"children":[{"type":"text","value":"Extensive support for math, figures, tables, and packages","position":{"start":{"line":19,"column":1},"end":{"line":19,"column":1}},"key":"eJBoFVmtLL"}],"key":"pY81GYRtuN"}],"key":"bqZ2mRfjNJ"},{"type":"tableRow","position":{"start":{"line":20,"column":1},"end":{"line":20,"column":1}},"children":[{"type":"tableCell","position":{"start":{"line":20,"column":1},"end":{"line":20,"column":1}},"children":[{"type":"strong","position":{"start":{"line":20,"column":1},"end":{"line":20,"column":1}},"children":[{"type":"text","value":"Output Quality","position":{"start":{"line":20,"column":1},"end":{"line":20,"column":1}},"key":"mXKzuaEds6"}],"key":"fNAJ0r7cdn"}],"key":"Kxo17iXNPr"},{"type":"tableCell","position":{"start":{"line":20,"column":1},"end":{"line":20,"column":1}},"children":[{"type":"text","value":"High-quality, modern look","position":{"start":{"line":20,"column":1},"end":{"line":20,"column":1}},"key":"HGmiOCE0G6"}],"key":"lamo1vz5KC"},{"type":"tableCell","position":{"start":{"line":20,"column":1},"end":{"line":20,"column":1}},"children":[{"type":"text","value":"Professional, traditional academic look","position":{"start":{"line":20,"column":1},"end":{"line":20,"column":1}},"key":"wrAkqIFmOc"}],"key":"Ckf4HbUz24"}],"key":"l8d3uQyyoB"}],"key":"cRoIsYxYb3"},{"type":"paragraph","position":{"start":{"line":22,"column":1},"end":{"line":22,"column":1}},"children":[{"type":"text","value":"In short: choose Typst for simplicity and speed, or LaTeX for advanced customization and compatibility with academic standards.","position":{"start":{"line":22,"column":1},"end":{"line":22,"column":1}},"key":"KttveBWAnL"}],"key":"VgTkp46mzm"},{"type":"paragraph","position":{"start":{"line":24,"column":1},"end":{"line":24,"column":1}},"children":[{"type":"text","value":"Below we provide the screen shots of the PDF output using Typst (left) using the ","position":{"start":{"line":24,"column":1},"end":{"line":24,"column":1}},"key":"BRX7p8avO0"},{"type":"link","url":"https://github.com/myst-templates/plain_typst_book","position":{"start":{"line":24,"column":1},"end":{"line":24,"column":1}},"children":[{"type":"text","value":"plain​_typst​_template","position":{"start":{"line":24,"column":1},"end":{"line":24,"column":1}},"key":"NSEbhEHLkP"}],"urlSource":"https://github.com/myst-templates/plain_typst_book","error":true,"key":"BAZvpcElKZ"},{"type":"text","value":" and LaTeX (right) using the ","position":{"start":{"line":24,"column":1},"end":{"line":24,"column":1}},"key":"eyXmpjBj8b"},{"type":"link","url":"https://github.com/myst-templates/plain_latex_book","position":{"start":{"line":24,"column":1},"end":{"line":24,"column":1}},"children":[{"type":"text","value":"plain​_latex​_template","position":{"start":{"line":24,"column":1},"end":{"line":24,"column":1}},"key":"M93NVEawIB"}],"urlSource":"https://github.com/myst-templates/plain_latex_book","error":true,"key":"TFDhFvzD0y"},{"type":"text","value":".","position":{"start":{"line":24,"column":1},"end":{"line":24,"column":1}},"key":"oOxZVnv9mL"}],"key":"HZh5r2FuvD"},{"type":"container","kind":"figure","children":[{"type":"image","url":"/build/mystvstex-72d312ef51aed47c93477909d4490d4e.png","alt":"Comparison of PDF output using Typst (left) and LaTeX (right) using both the plain book template.","width":"100%","data":{"altTextIsAutoGenerated":true},"urlSource":"figures/mystvstex.png","key":"gU3nTKLlOT"},{"type":"caption","children":[{"type":"paragraph","position":{"start":{"line":30,"column":1},"end":{"line":30,"column":1}},"children":[{"type":"captionNumber","kind":"figure","label":"fig_mystvstex","identifier":"fig_mystvstex","html_id":"fig-mystvstex","enumerator":"1","children":[{"type":"text","value":"Figure ","key":"LbX0qif0Bn"},{"type":"text","value":"1","key":"bu3oMBdU3o"},{"type":"text","value":":","key":"MUzOWrA965"}],"template":"Figure %s:","key":"xFmGCJgKkx"},{"type":"text","value":"Comparison of PDF output using Typst (left) and LaTeX (right) using both the plain book template.","position":{"start":{"line":30,"column":1},"end":{"line":30,"column":1}},"key":"QlMmmkC732"}],"key":"f0p8vAWnSl"}],"key":"jyGeh1ffEW"}],"label":"fig_mystvstex","identifier":"fig_mystvstex","enumerator":"1","html_id":"fig-mystvstex","key":"ZeKuJuilj3"},{"type":"paragraph","position":{"start":{"line":33,"column":1},"end":{"line":34,"column":1}},"children":[{"type":"text","value":"You can specify the ","position":{"start":{"line":33,"column":1},"end":{"line":33,"column":1}},"key":"RVmqnWkU7V"},{"type":"link","url":"https://github.com/myst-templates","position":{"start":{"line":33,"column":1},"end":{"line":33,"column":1}},"children":[{"type":"text","value":"output template","position":{"start":{"line":33,"column":1},"end":{"line":33,"column":1}},"key":"SCzBJmEZpq"}],"urlSource":"https://github.com/myst-templates","error":true,"key":"iYoSA8Ez02"},{"type":"text","value":", download the template and tweak to match your preferences.\nWe won’t go into detail here, but you can find more information ","position":{"start":{"line":33,"column":1},"end":{"line":33,"column":1}},"key":"pQtUpsB2L3"},{"type":"link","url":"https://mystmd.org/guide/creating-pdf-documents","position":{"start":{"line":33,"column":1},"end":{"line":33,"column":1}},"children":[{"type":"text","value":"in the MyST Markdown documentations","position":{"start":{"line":33,"column":1},"end":{"line":33,"column":1}},"key":"dHo1t1yQdM"}],"urlSource":"https://mystmd.org/guide/creating-pdf-documents","key":"Db4NjVrUML"},{"type":"text","value":".","position":{"start":{"line":33,"column":1},"end":{"line":33,"column":1}},"key":"qHxAsdn8o4"}],"key":"sVJGL48jnc"},{"type":"admonition","kind":"note","children":[{"type":"admonitionTitle","children":[{"type":"text","value":"Note","key":"jh1CYhdzKC"}],"key":"lsqlIuTE9x"},{"type":"paragraph","position":{"start":{"line":37,"column":1},"end":{"line":37,"column":1}},"children":[{"type":"text","value":"One reason Typst is preferred in this workshop is that the installation (both for local users and via GitHub Actions) is much faster and easier than LaTeX, as you will see when we implement the PDF generation in our workflow file.","position":{"start":{"line":37,"column":1},"end":{"line":37,"column":1}},"key":"Ce0zlBEcJU"}],"key":"Q9UdiPiQ9u"}],"key":"kYanipGqOT"},{"type":"heading","depth":2,"position":{"start":{"line":40,"column":1},"end":{"line":40,"column":1}},"children":[{"type":"text","value":"Interactive file types","position":{"start":{"line":40,"column":1},"end":{"line":40,"column":1}},"key":"rECik1zHvo"}],"identifier":"interactive-file-types","label":"Interactive file types","html_id":"interactive-file-types","implicit":true,"key":"ukPxVwIazt"},{"type":"paragraph","position":{"start":{"line":42,"column":1},"end":{"line":45,"column":1}},"children":[{"type":"text","value":"When starting your own project, consider whether a PDF output is desired.\nIf so, consider the interactive elements that may be included and that some functionality and multimedia types are not supported in a PDF.\nFor instance, a ","position":{"start":{"line":42,"column":1},"end":{"line":42,"column":1}},"key":"NnZj8fj5rs"},{"type":"inlineCode","value":"*.gif","position":{"start":{"line":42,"column":1},"end":{"line":42,"column":1}},"key":"iT3Za1aHS6"},{"type":"text","value":" file or movie cannot be included in a PDF.\n","key":"HDeZMJzFI3"},{"type":"abbreviation","title":"Jupyter Book 2","children":[{"type":"text","value":"JB2","key":"dxZUFGoW5Z"}],"key":"g8AHdM6L2u"},{"type":"text","value":" is thoughtful in this by choosing the best possible alternative if multiple files with the same name but different extensions are present: gif is chosen over png, png over jpg.","key":"CBDntSg9Wn"}],"key":"TKoaXIXsw3"},{"type":"admonition","kind":"tip","children":[{"type":"admonitionTitle","children":[{"type":"text","value":"Tip","key":"ZJulxztaNT"}],"key":"CGwVWIncaq"},{"type":"paragraph","position":{"start":{"line":48,"column":1},"end":{"line":48,"column":1}},"children":[{"type":"text","value":"When incorporating interactive media files with an alternative “static” file extension, rather than specifying the filename with extension, you can just use the file name and an asterisk, e.g. ","position":{"start":{"line":48,"column":1},"end":{"line":48,"column":1}},"key":"GVSRRyK5YJ"},{"type":"inlineCode","value":"![figure](figures/mystvstex.*)","position":{"start":{"line":48,"column":1},"end":{"line":48,"column":1}},"key":"yW6w4fcgAN"},{"type":"text","value":". Then Jupyter Book 2 will include the proper file type depending on the export format being used.","position":{"start":{"line":48,"column":1},"end":{"line":48,"column":1}},"key":"cuh6EdKkjY"}],"key":"arPEz5W1cO"}],"key":"fXCk1neae4"},{"type":"paragraph","position":{"start":{"line":51,"column":1},"end":{"line":53,"column":1}},"children":[{"type":"text","value":"For YouTube clips and online interactive materials embedded through iframes, you can make use of plugins.\nSee for instance the ","position":{"start":{"line":51,"column":1},"end":{"line":51,"column":1}},"key":"NHY4aMpJ3g"},{"type":"link","url":"https://github.com/jupyter-book/myst-plugins/tree/main/plugins/iframe-to-thumbnail-pdf","position":{"start":{"line":51,"column":1},"end":{"line":51,"column":1}},"children":[{"type":"text","value":"iframe-to-thumbnail plugin","position":{"start":{"line":51,"column":1},"end":{"line":51,"column":1}},"key":"QM7RFOBlIs"}],"urlSource":"https://github.com/jupyter-book/myst-plugins/tree/main/plugins/iframe-to-thumbnail-pdf","error":true,"key":"hJyi2zqoso"},{"type":"text","value":".\nThis plugin replaces the iframe with a thumbnail image that links to the original content as well as a QR code and a link in the caption.","position":{"start":{"line":51,"column":1},"end":{"line":51,"column":1}},"key":"J3mQHYyCzs"}],"key":"Ghbai4YrQV"}],"key":"OLxAn7PN6r"}],"key":"SgLHfsG7wL"},"references":{"cite":{"order":[],"data":{}}},"footer":{"navigation":{"prev":{"title":"MyST Document Creation 🌶","url":"/a-myst","group":"Jupyter Book 2 Workshop Template"},"next":{"title":"Create a PDF 🌶","url":"/c-pdfoutput","group":"Jupyter Book 2 Workshop Template"}}},"domain":"http://localhost:3000"}