Please contact the owner of the site that linked you to the original URL and let them know their link is broken.
diff --git a/assets/js/5670b452.9d3f13a3.js b/assets/js/5670b452.3b9c366c.js
similarity index 87%
rename from assets/js/5670b452.9d3f13a3.js
rename to assets/js/5670b452.3b9c366c.js
index 45633051..93f6d74d 100644
--- a/assets/js/5670b452.9d3f13a3.js
+++ b/assets/js/5670b452.3b9c366c.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[997],{2261:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>l,default:()=>h,frontMatter:()=>s,metadata:()=>r,toc:()=>c});var i=t(5893),o=t(1151);const s={sidebar_position:11},l="Build Your Own Theme",r={id:"build-your-own-theme",title:"Build Your Own Theme",description:"Creating your own theme with Touying can be a bit complex due to the many concepts we've introduced. But rest assured, if you do create a theme with Touying, you might deeply appreciate the convenience and powerful customizability that Touying offers. You can refer to the source code of the themes. The main things you need to implement are:",source:"@site/docs/build-your-own-theme.md",sourceDirName:".",slug:"/build-your-own-theme",permalink:"/docs/next/build-your-own-theme",draft:!1,unlisted:!1,editUrl:"https://github.com/touying-typ/touying/tree/main/docs/docs/build-your-own-theme.md",tags:[],version:"current",sidebarPosition:11,frontMatter:{sidebar_position:11},sidebar:"tutorialSidebar",previous:{title:"Custom Theme",permalink:"/docs/next/themes/custom"},next:{title:"Progress",permalink:"/docs/next/category/progress"}},a={},c=[{value:"Modifying Existing Themes",id:"modifying-existing-themes",level:2},{value:"Importing",id:"importing",level:2},{value:"register Function and init Method",id:"register-function-and-init-method",level:2},{value:"Color Theme",id:"color-theme",level:2},{value:"Practical: Custom Alert Method",id:"practical-custom-alert-method",level:2},{value:"Custom Header and Footer",id:"custom-header-and-footer",level:2},{value:"Custom Special Slides",id:"custom-special-slides",level:2},{value:"Conclusion",id:"conclusion",level:2}];function d(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,o.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h1,{id:"build-your-own-theme",children:"Build Your Own Theme"}),"\n",(0,i.jsxs)(n.p,{children:["Creating your own theme with Touying can be a bit complex due to the many concepts we've introduced. But rest assured, if you do create a theme with Touying, you might deeply appreciate the convenience and powerful customizability that Touying offers. You can refer to the ",(0,i.jsx)(n.a,{href:"https://github.com/touying-typ/touying/tree/main/themes",children:"source code of the themes"}),". The main things you need to implement are:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Customizing the ",(0,i.jsx)(n.code,{children:"xxx-theme"})," function;"]}),"\n",(0,i.jsxs)(n.li,{children:["Customizing the color theme, i.e., ",(0,i.jsx)(n.code,{children:"config-colors()"}),";"]}),"\n",(0,i.jsx)(n.li,{children:"Customizing the header;"}),"\n",(0,i.jsx)(n.li,{children:"Customizing the footer;"}),"\n",(0,i.jsxs)(n.li,{children:["Customizing the ",(0,i.jsx)(n.code,{children:"slide"})," method;"]}),"\n",(0,i.jsxs)(n.li,{children:["Customizing special slide methods, such as ",(0,i.jsx)(n.code,{children:"title-slide"})," and ",(0,i.jsx)(n.code,{children:"focus-slide"})," methods;"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"To demonstrate how to create a theme with Touying, let's step by step create a simple and aesthetically pleasing Bamboo theme."}),"\n",(0,i.jsx)(n.h2,{id:"modifying-existing-themes",children:"Modifying Existing Themes"}),"\n",(0,i.jsx)(n.p,{children:"If you want to modify a Touying internal theme locally instead of creating one from scratch, you can achieve this by:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["Copying the ",(0,i.jsx)(n.a,{href:"https://github.com/touying-typ/touying/tree/main/themes",children:"theme code"})," from the ",(0,i.jsx)(n.code,{children:"themes"})," directory to your local, for example, copying ",(0,i.jsx)(n.code,{children:"themes/university.typ"})," to your local ",(0,i.jsx)(n.code,{children:"university.typ"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:["Replacing the ",(0,i.jsx)(n.code,{children:'#import "../src/exports.typ": *'})," command at the top of the ",(0,i.jsx)(n.code,{children:"university.typ"})," file with ",(0,i.jsx)(n.code,{children:'#import "@preview/touying:0.5.3": *'}),"."]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Then you can import and use the theme by:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-typst",children:'#import "@preview/touying:0.5.3": *\n#import "university.typ": *\n\n#show: university-theme.with(\n aspect-ratio: "16-9",\n config-info(\n title: [Title],\n subtitle: [Subtitle],\n author: [Authors],\n date: datetime.today(),\n institution: [Institution],\n logo: emoji.school,\n ),\n)\n'})}),"\n",(0,i.jsx)(n.h2,{id:"importing",children:"Importing"}),"\n",(0,i.jsx)(n.p,{children:"Depending on whether the theme is your own or part of Touying, you can import it in two ways:"}),"\n",(0,i.jsx)(n.p,{children:"If it's just for your own use, you can directly import Touying:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-typst",children:'#import "@preview/touying:0.5.3": *\n'})}),"\n",(0,i.jsxs)(n.p,{children:["If you want the theme to be part of Touying, placed in the Touying ",(0,i.jsx)(n.code,{children:"themes"})," directory, then you should change the import statement above to"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-typst",children:'#import "../src/exports.typ": *\n'})}),"\n",(0,i.jsx)(n.p,{children:"And add"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-typst",children:'#import "bamboo.typ"\n'})}),"\n",(0,i.jsxs)(n.p,{children:["in Touying's ",(0,i.jsx)(n.code,{children:"themes/themes.typ"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"register-function-and-init-method",children:"register Function and init Method"}),"\n",(0,i.jsxs)(n.p,{children:["Next, we will differentiate between the ",(0,i.jsx)(n.code,{children:"bamboo.typ"})," template file and the ",(0,i.jsx)(n.code,{children:"main.typ"})," file, which is sometimes omitted."]}),"\n",(0,i.jsx)(n.p,{children:"Generally, the first step in making slides is to determine the font size and page aspect ratio, so we need to register an initialization method:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-typst",children:'// bamboo.typ\n#import "@preview/touying:0.5.3": *\n\n#let bamboo-theme(\n aspect-ratio: "16-9",\n ..args,\n body,\n) = {\n set text(size: 20pt)\n\n show: touying-slides.with(\n config-page(paper: "presentation-" + aspect-ratio),\n config-common(\n slide-fn: slide,\n ),\n ..args,\n )\n\n body\n}\n\n// main.typ\n#import "@preview/touying:0.5.3": *\n#import "bamboo.typ": *\n\n#show: bamboo-theme.with(aspect-ratio: "16-9")\n\n= First Section\n\n== First Slide\n\nA slide with a title and an *important* information.\n'})}),"\n",(0,i.jsxs)(n.p,{children:["As you can see, we've created a ",(0,i.jsx)(n.code,{children:"bamboo-theme"})," function and passed in an ",(0,i.jsx)(n.code,{children:"aspect-ratio"})," parameter to set the page aspect ratio. We've also added ",(0,i.jsx)(n.code,{children:"set text(size: 20pt)"})," to set the font size. You can also place some additional global style settings here, such as ",(0,i.jsx)(n.code,{children:"set par(justify: true)"}),", etc. If you need to use ",(0,i.jsx)(n.code,{children:"self"}),", you might consider using ",(0,i.jsx)(n.code,{children:"config-methods(init: (self: none, body) => { .. })"})," to register an ",(0,i.jsx)(n.code,{children:"init"})," method."]}),"\n",(0,i.jsxs)(n.p,{children:["As you can see, later in ",(0,i.jsx)(n.code,{children:"main.typ"}),", we apply our style settings through ",(0,i.jsx)(n.code,{children:'#show: bamboo-theme.with(aspect-ratio: "16-9")'}),", and internally ",(0,i.jsx)(n.code,{children:"bamboo"})," uses ",(0,i.jsx)(n.code,{children:"show: touying-slides.with()"})," for corresponding configurations."]}),"\n",(0,i.jsx)(n.h2,{id:"color-theme",children:"Color Theme"}),"\n",(0,i.jsxs)(n.p,{children:["Picking an aesthetically pleasing color theme for your slides is key to making good slides. Touying provides built-in color theme support to minimize API differences between different themes. Touying offers two dimensions of color selection. The first dimension is ",(0,i.jsx)(n.code,{children:"neutral"}),", ",(0,i.jsx)(n.code,{children:"primary"}),", ",(0,i.jsx)(n.code,{children:"secondary"}),", and ",(0,i.jsx)(n.code,{children:"tertiary"}),", which are used to distinguish color tones, with ",(0,i.jsx)(n.code,{children:"primary"})," being the most commonly used theme color. The second dimension is ",(0,i.jsx)(n.code,{children:"default"}),", ",(0,i.jsx)(n.code,{children:"light"}),", ",(0,i.jsx)(n.code,{children:"lighter"}),", ",(0,i.jsx)(n.code,{children:"lightest"}),", ",(0,i.jsx)(n.code,{children:"dark"}),", ",(0,i.jsx)(n.code,{children:"darker"}),", ",(0,i.jsx)(n.code,{children:"darkest"}),", which are used to distinguish brightness levels."]}),"\n",(0,i.jsxs)(n.p,{children:["Since we are creating the Bamboo theme, we have chosen a color close to bamboo for the ",(0,i.jsx)(n.code,{children:"primary"})," theme color, ",(0,i.jsx)(n.code,{children:'rgb("#5E8B65")'}),", and added neutral colors ",(0,i.jsx)(n.code,{children:"neutral-lightest"}),", ",(0,i.jsx)(n.code,{children:"neutral-darkest"}),", respectively, as the background and font colors."]}),"\n",(0,i.jsxs)(n.p,{children:["As shown in the following code, we can use the ",(0,i.jsx)(n.code,{children:"config-colors()"})," method to modify the color theme. Its essence is a wrapper for ",(0,i.jsx)(n.code,{children:"self.colors += (..)"}),"."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-typst",children:'#let bamboo-theme(\n aspect-ratio: "16-9",\n ..args,\n body,\n) = {\n set text(size: 20pt)\n\n show: touying-slides.with(\n config-page(paper: "presentation-" + aspect-ratio),\n config-common(\n slide-fn: slide,\n ),\n config-colors(\n primary: rgb("#5E8B65"),\n neutral-lightest: rgb("#ffffff"),\n neutral-darkest: rgb("#000000"),\n ),\n ..args,\n )\n\n body\n}\n'})}),"\n",(0,i.jsxs)(n.p,{children:["After adding the color theme as shown above, we can access this color through ",(0,i.jsx)(n.code,{children:"self.colors.primary"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["It's also worth noting that users can change the color theme at any time in ",(0,i.jsx)(n.code,{children:"main.typ"})," by using ",(0,i.jsx)(n.code,{children:"config-colors()"})," or"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-typst",children:'#show: touying-set-config.with(config-colors(\n primary: blue,\n neutral-lightest: rgb("#ffffff"),\n neutral-darkest: rgb("#000000"),\n))\n'})}),"\n",(0,i.jsx)(n.p,{children:"This feature of being able to change the color theme at any time is a testament to Touying's powerful customizability."}),"\n",(0,i.jsx)(n.h2,{id:"practical-custom-alert-method",children:"Practical: Custom Alert Method"}),"\n",(0,i.jsxs)(n.p,{children:["Generally, we need to provide a ",(0,i.jsx)(n.code,{children:"#alert[..]"})," function for users, similar to ",(0,i.jsx)(n.code,{children:"#strong[..]"}),", both of which are used to emphasize the current text. Typically, ",(0,i.jsx)(n.code,{children:"#alert[..]"})," will change the text color to the theme color, which will look more aesthetically pleasing, and this is our next goal."]}),"\n",(0,i.jsxs)(n.p,{children:["We add a line in the ",(0,i.jsx)(n.code,{children:"register"})," function:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-typst",children:"config-methods(alert: (self: none, it) => text(fill: self.colors.primary, it))\n"})}),"\n",(0,i.jsxs)(n.p,{children:["This code means to change the text color to ",(0,i.jsx)(n.code,{children:"self.colors.primary"}),", and the ",(0,i.jsx)(n.code,{children:"self"})," here is passed in through the parameter ",(0,i.jsx)(n.code,{children:"self: none"}),", so that we can get the ",(0,i.jsx)(n.code,{children:"primary"})," theme color in real-time."]}),"\n",(0,i.jsx)(n.p,{children:"We can also use a shorthand."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-typst",children:"config-methods(alert: utils.alert-with-primary-color)\n"})}),"\n",(0,i.jsx)(n.h2,{id:"custom-header-and-footer",children:"Custom Header and Footer"}),"\n",(0,i.jsx)(n.p,{children:"Here, I assume you have read the page layout section, so we know that we should add a header and footer to the slides."}),"\n",(0,i.jsxs)(n.p,{children:["First, we add ",(0,i.jsx)(n.code,{children:"config-store(title: none)"}),", which means that we save the current slide's title as a member variable ",(0,i.jsx)(n.code,{children:"self.store.title"})," inside ",(0,i.jsx)(n.code,{children:"self"}),", making it convenient for us to use in the header and for subsequent modifications. Similarly, we also create a ",(0,i.jsx)(n.code,{children:"config-store(footer: footer)"})," and save the ",(0,i.jsx)(n.code,{children:"footer: none"})," parameter of the ",(0,i.jsx)(n.code,{children:"bamboo-theme"})," function for display in the footer at the bottom left corner."]}),"\n",(0,i.jsxs)(n.p,{children:["Then it's worth noting that our header is actually a content function with ",(0,i.jsx)(n.code,{children:"self"})," as a parameter, like ",(0,i.jsx)(n.code,{children:"let header(self) = { .. }"}),", rather than a simple content, so that we can get the information we need from the latest ",(0,i.jsx)(n.code,{children:"self"}),", such as ",(0,i.jsx)(n.code,{children:"self.store.title"}),". The footer is the same."]}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"components.cell"})," used here is actually ",(0,i.jsx)(n.code,{children:"#let cell = block.with(width: 100%, height: 100%, above: 0pt, below: 0pt, breakable: false)"}),", and ",(0,i.jsx)(n.code,{children:"show: components.cell"})," is also a shorthand for ",(0,i.jsx)(n.code,{children:"components.cell(body)"}),", and the ",(0,i.jsx)(n.code,{children:"show: pad.with(.4em)"})," for the footer is the same."]}),"\n",(0,i.jsxs)(n.p,{children:["Another point to note is that the ",(0,i.jsx)(n.code,{children:"utils"})," module contains many contents and methods related to counters and states, such as ",(0,i.jsx)(n.code,{children:"utils.display-current-heading(level: 1)"})," for displaying the current ",(0,i.jsx)(n.code,{children:"section"}),", and ",(0,i.jsx)(n.code,{children:'context utils.slide-counter.display() + " / " + utils.last-slide-number'})," for displaying the current page number and total number of pages."]}),"\n",(0,i.jsxs)(n.p,{children:["We also find that we use syntax like ",(0,i.jsx)(n.code,{children:"utils.call-or-display(self, self.store.footer)"})," to display ",(0,i.jsx)(n.code,{children:"self.store.footer"}),", which is to deal with the situation of ",(0,i.jsx)(n.code,{children:"self.store.footer = self => {..}"}),", so that we can unify the display of content functions and content."]}),"\n",(0,i.jsxs)(n.p,{children:["To ensure that the header and footer are displayed correctly and have enough spacing from the main text, we need to set the margin, such as ",(0,i.jsx)(n.code,{children:"config-page(margin: (top: 4em, bottom: 1.5em, x: 2em))"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["We also need to customize a ",(0,i.jsx)(n.code,{children:"slide"})," method, which accepts ",(0,i.jsx)(n.code,{children:"#let slide(title: auto, ..args) = touying-slide-wrapper(self => {..})"}),", where ",(0,i.jsx)(n.code,{children:"self"})," in the callback function is a required parameter to get the latest ",(0,i.jsx)(n.code,{children:"self"}),"; the second ",(0,i.jsx)(n.code,{children:"title"})," is used to update ",(0,i.jsx)(n.code,{children:"self.store.title"})," for display in the header; the third ",(0,i.jsx)(n.code,{children:"..args"})," is used to collect the remaining parameters and pass them to ",(0,i.jsx)(n.code,{children:"touying-slide(self: self, ..args)"}),", which is also necessary for the normal functioning of Touying's ",(0,i.jsx)(n.code,{children:"slide"})," feature. Moreover, we need to register this method in the ",(0,i.jsx)(n.code,{children:"bamboo-theme"})," function using ",(0,i.jsx)(n.code,{children:"config-methods(slide: slide)"}),"."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-typst",children:'// bamboo.typ\n#import "@preview/touying:0.5.3": *\n\n#let slide(title: auto, ..args) = touying-slide-wrapper(self => {\n if title != auto {\n self.store.title = title\n }\n // set page\n let header(self) = {\n set align(top)\n show: components.cell.with(fill: self.colors.primary, inset: 1em)\n set align(horizon)\n set text(fill: self.colors.neutral-lightest, size: .7em)\n utils.display-current-heading(level: 1)\n linebreak()\n set text(size: 1.5em)\n if self.store.title != none {\n utils.call-or-display(self, self.store.title)\n } else {\n utils.display-current-heading(level: 2)\n }\n }\n let footer(self) = {\n set align(bottom)\n show: pad.with(.4em)\n set text(fill: self.colors.neutral-darkest, size: .8em)\n utils.call-or-display(self, self.store.footer)\n h(1fr)\n context utils.slide-counter.display() + " / " + utils.last-slide-number\n }\n self = utils.merge-dicts(\n self,\n config-page(\n header: header,\n footer: footer,\n ),\n )\n touying-slide(self: self, ..args)\n})\n\n#let bamboo-theme(\n aspect-ratio: "16-9",\n footer: none,\n ..args,\n body,\n) = {\n set text(size: 20pt)\n\n show: touying-slides.with(\n config-page(\n paper: "presentation-" + aspect-ratio,\n margin: (top: 4em, bottom: 1.5em, x: 2em),\n ),\n config-common(\n slide-fn: slide,\n ),\n config-methods(\n alert: utils.alert-with-primary-color,\n ),\n config-colors(\n primary: rgb("#5E8B65"),\n neutral-lightest: rgb("#ffffff"),\n neutral-darkest: rgb("#000000"),\n ),\n config-store(\n title: none,\n footer: footer,\n ),\n ..args,\n )\n\n body\n}\n\n\n// main.typ\n#import "@preview/touying:0.5.3": *\n#import "bamboo.typ": *\n\n#show: bamboo-theme.with(aspect-ratio: "16-9")\n\n= First Section\n\n== First Slide\n\nA slide with a title and an *important* information.\n'})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://github.com/touying-typ/touying/assets/34951714/d33bcda7-c032-4b11-b392-5b939d9a0a47",alt:"image"})}),"\n",(0,i.jsx)(n.h2,{id:"custom-special-slides",children:"Custom Special Slides"}),"\n",(0,i.jsxs)(n.p,{children:["On the basis of the basic slides we've created, we further add some special slide functions, such as ",(0,i.jsx)(n.code,{children:"title-slide"}),", ",(0,i.jsx)(n.code,{children:"focus-slide"}),", and custom ",(0,i.jsx)(n.code,{children:"slides"})," methods."]}),"\n",(0,i.jsxs)(n.p,{children:["For the ",(0,i.jsx)(n.code,{children:"title-slide"})," method, first, we can obtain the information saved in ",(0,i.jsx)(n.code,{children:"self.info"})," through ",(0,i.jsx)(n.code,{children:"let info = self.info + args.named()"}),", and we can also update the information with ",(0,i.jsx)(n.code,{children:"args.named()"})," passed in through the function parameters for subsequent use in the form of ",(0,i.jsx)(n.code,{children:"info.title"}),". The specific page content ",(0,i.jsx)(n.code,{children:"body"})," will vary for each theme, so I won't go into too much detail here."]}),"\n",(0,i.jsxs)(n.p,{children:["For the ",(0,i.jsx)(n.code,{children:"new-section-slide"})," method, it's the same, but the only thing to note is that we registered ",(0,i.jsx)(n.code,{children:"new-section-slide-fn: new-section-slide"})," in ",(0,i.jsx)(n.code,{children:"config-methods()"}),", so ",(0,i.jsx)(n.code,{children:"new-section-slide"})," will be automatically called when encountering a first-level heading."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-typst",children:'// bamboo.typ\n#import "@preview/touying:0.5.3": *\n\n#let slide(title: auto, ..args) = touying-slide-wrapper(self => {\n if title != auto {\n self.store.title = title\n }\n // set page\n let header(self) = {\n set align(top)\n show: components.cell.with(fill: self.colors.primary, inset: 1em)\n set align(horizon)\n set text(fill: self.colors.neutral-lightest, size: .7em)\n utils.display-current-heading(level: 1)\n linebreak()\n set text(size: 1.5em)\n if self.store.title != none {\n utils.call-or-display(self, self.store.title)\n } else {\n utils.display-current-heading(level: 2)\n }\n }\n let footer(self) = {\n set align(bottom)\n show: pad.with(.4em)\n set text(fill: self.colors.neutral-darkest, size: .8em)\n utils.call-or-display(self, self.store.footer)\n h(1fr)\n context utils.slide-counter.display() + " / " + utils.last-slide-number\n }\n self = utils.merge-dicts(\n self,\n config-page(\n header: header,\n footer: footer,\n ),\n )\n touying-slide(self: self, ..args)\n})\n\n#let title-slide(..args) = touying-slide-wrapper(self => {\n let info = self.info + args.named()\n let body = {\n set align(center + horizon)\n block(\n fill: self.colors.primary,\n width: 80%,\n inset: (y: 1em),\n radius: 1em,\n text(size: 2em, fill: self.colors.neutral-lightest, weight: "bold", info.title),\n )\n set text(fill: self.colors.neutral-darkest)\n if info.author != none {\n block(info.author)\n }\n if info.date != none {\n block(utils.display-info-date(self))\n }\n }\n touying-slide(self: self, body)\n})\n\n#let new-section-slide(self: none, section) = touying-slide-wrapper(self => {\n let body = {\n set align(center + horizon)\n set text(size: 2em, fill: self.colors.primary, weight: "bold", style: "italic")\n section\n }\n touying-slide(self: self, body)\n})\n\n#let focus-slide(body) = touying-slide-wrapper(self => {\n self = utils.merge-dicts(\n self,\n config-page(\n fill: self.colors.primary,\n margin: 2em,\n ),\n )\n set text(fill: self.colors.neutral-lightest, size: 2em)\n touying-slide(self: self, align(horizon + center, body))\n})\n\n#let bamboo-theme(\n aspect-ratio: "16-9",\n footer: none,\n ..args,\n body,\n) = {\n set text(size: 20pt)\n\n show: touying-slides.with(\n config-page(\n paper: "presentation-" + aspect-ratio,\n margin: (top: 4em, bottom: 1.5em, x: 2em),\n ),\n config-common(\n slide-fn: slide,\n new-section-slide-fn: new-section-slide,\n ),\n config-methods(alert: utils.alert-with-primary-color),\n config-colors(\n primary: rgb("#5E8B65"),\n neutral-lightest: rgb("#ffffff"),\n neutral-darkest: rgb("#000000"),\n ),\n config-store(\n title: none,\n footer: footer,\n ),\n ..args,\n )\n\n body\n}\n\n\n// main.typ\n#import "@preview/touying:0.5.3": *\n#import "bamboo.typ": *\n\n#show: bamboo-theme.with(\n aspect-ratio: "16-9",\n footer: self => self.info.institution,\n config-info(\n title: [Title],\n subtitle: [Subtitle],\n author: [Authors],\n date: datetime.today(),\n institution: [Institution],\n ),\n)\n\n#title-slide()\n\n= First Section\n\n== First Slide\n\nA slide with a title and an *important* information.\n\n#focus-slide[\n Focus on it!\n]\n'})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://github.com/touying-typ/touying/assets/34951714/03c5ad02-8ff4-4068-9664-d9cfad79baaf",alt:"image"})}),"\n",(0,i.jsx)(n.h2,{id:"conclusion",children:"Conclusion"}),"\n",(0,i.jsx)(n.p,{children:"Congratulations! You've created a simple and elegant theme. Perhaps you may find that Touying introduces a wealth of concepts, making it initially challenging to grasp. This is normal, as Touying opts for functionality over simplicity. However, thanks to Touying's comprehensive and unified approach, you can easily extract commonalities between different themes and transfer your knowledge seamlessly. You can also save global variables, modify existing themes, or switch between themes effortlessly, showcasing the benefits of Touying's decoupling."})]})}function h(e={}){const{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>r,a:()=>l});var i=t(7294);const o={},s=i.createContext(o);function l(e){const n=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:l(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
+"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[997],{2261:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>l,default:()=>h,frontMatter:()=>s,metadata:()=>r,toc:()=>c});var i=t(5893),o=t(1151);const s={sidebar_position:11},l="Build Your Own Theme",r={id:"build-your-own-theme",title:"Build Your Own Theme",description:"Creating your own theme with Touying can be a bit complex due to the many concepts we've introduced. But rest assured, if you do create a theme with Touying, you might deeply appreciate the convenience and powerful customizability that Touying offers. You can refer to the source code of the themes. The main things you need to implement are:",source:"@site/docs/build-your-own-theme.md",sourceDirName:".",slug:"/build-your-own-theme",permalink:"/docs/next/build-your-own-theme",draft:!1,unlisted:!1,editUrl:"https://github.com/touying-typ/touying/tree/main/docs/docs/build-your-own-theme.md",tags:[],version:"current",sidebarPosition:11,frontMatter:{sidebar_position:11},sidebar:"tutorialSidebar",previous:{title:"Custom Theme",permalink:"/docs/next/themes/custom"},next:{title:"Progress",permalink:"/docs/next/category/progress"}},a={},c=[{value:"Modifying Existing Themes",id:"modifying-existing-themes",level:2},{value:"Importing",id:"importing",level:2},{value:"register Function and init Method",id:"register-function-and-init-method",level:2},{value:"Color Theme",id:"color-theme",level:2},{value:"Practical: Custom Alert Method",id:"practical-custom-alert-method",level:2},{value:"Custom Header and Footer",id:"custom-header-and-footer",level:2},{value:"Custom Special Slides",id:"custom-special-slides",level:2},{value:"Conclusion",id:"conclusion",level:2}];function d(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,o.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h1,{id:"build-your-own-theme",children:"Build Your Own Theme"}),"\n",(0,i.jsxs)(n.p,{children:["Creating your own theme with Touying can be a bit complex due to the many concepts we've introduced. But rest assured, if you do create a theme with Touying, you might deeply appreciate the convenience and powerful customizability that Touying offers. You can refer to the ",(0,i.jsx)(n.a,{href:"https://github.com/touying-typ/touying/tree/main/themes",children:"source code of the themes"}),". The main things you need to implement are:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Customizing the ",(0,i.jsx)(n.code,{children:"xxx-theme"})," function;"]}),"\n",(0,i.jsxs)(n.li,{children:["Customizing the color theme, i.e., ",(0,i.jsx)(n.code,{children:"config-colors()"}),";"]}),"\n",(0,i.jsx)(n.li,{children:"Customizing the header;"}),"\n",(0,i.jsx)(n.li,{children:"Customizing the footer;"}),"\n",(0,i.jsxs)(n.li,{children:["Customizing the ",(0,i.jsx)(n.code,{children:"slide"})," method;"]}),"\n",(0,i.jsxs)(n.li,{children:["Customizing special slide methods, such as ",(0,i.jsx)(n.code,{children:"title-slide"})," and ",(0,i.jsx)(n.code,{children:"focus-slide"})," methods;"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"To demonstrate how to create a theme with Touying, let's step by step create a simple and aesthetically pleasing Bamboo theme."}),"\n",(0,i.jsx)(n.h2,{id:"modifying-existing-themes",children:"Modifying Existing Themes"}),"\n",(0,i.jsx)(n.p,{children:"If you want to modify a Touying internal theme locally instead of creating one from scratch, you can achieve this by:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["Copying the ",(0,i.jsx)(n.a,{href:"https://github.com/touying-typ/touying/tree/main/themes",children:"theme code"})," from the ",(0,i.jsx)(n.code,{children:"themes"})," directory to your local, for example, copying ",(0,i.jsx)(n.code,{children:"themes/university.typ"})," to your local ",(0,i.jsx)(n.code,{children:"university.typ"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:["Replacing the ",(0,i.jsx)(n.code,{children:'#import "../src/exports.typ": *'})," command at the top of the ",(0,i.jsx)(n.code,{children:"university.typ"})," file with ",(0,i.jsx)(n.code,{children:'#import "@preview/touying:0.5.3": *'}),"."]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Then you can import and use the theme by:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-typst",children:'#import "@preview/touying:0.5.3": *\n#import "university.typ": *\n\n#show: university-theme.with(\n aspect-ratio: "16-9",\n config-info(\n title: [Title],\n subtitle: [Subtitle],\n author: [Authors],\n date: datetime.today(),\n institution: [Institution],\n logo: emoji.school,\n ),\n)\n'})}),"\n",(0,i.jsx)(n.h2,{id:"importing",children:"Importing"}),"\n",(0,i.jsx)(n.p,{children:"Depending on whether the theme is your own or part of Touying, you can import it in two ways:"}),"\n",(0,i.jsx)(n.p,{children:"If it's just for your own use, you can directly import Touying:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-typst",children:'#import "@preview/touying:0.5.3": *\n'})}),"\n",(0,i.jsxs)(n.p,{children:["If you want the theme to be part of Touying, placed in the Touying ",(0,i.jsx)(n.code,{children:"themes"})," directory, then you should change the import statement above to"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-typst",children:'#import "../src/exports.typ": *\n'})}),"\n",(0,i.jsx)(n.p,{children:"And add"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-typst",children:'#import "bamboo.typ"\n'})}),"\n",(0,i.jsxs)(n.p,{children:["in Touying's ",(0,i.jsx)(n.code,{children:"themes/themes.typ"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"register-function-and-init-method",children:"register Function and init Method"}),"\n",(0,i.jsxs)(n.p,{children:["Next, we will differentiate between the ",(0,i.jsx)(n.code,{children:"bamboo.typ"})," template file and the ",(0,i.jsx)(n.code,{children:"main.typ"})," file, which is sometimes omitted."]}),"\n",(0,i.jsx)(n.p,{children:"Generally, the first step in making slides is to determine the font size and page aspect ratio, so we need to register an initialization method:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-typst",children:'// bamboo.typ\n#import "@preview/touying:0.5.3": *\n\n#let bamboo-theme(\n aspect-ratio: "16-9",\n ..args,\n body,\n) = {\n set text(size: 20pt)\n\n show: touying-slides.with(\n config-page(paper: "presentation-" + aspect-ratio),\n config-common(\n slide-fn: slide,\n ),\n ..args,\n )\n\n body\n}\n\n// main.typ\n#import "@preview/touying:0.5.3": *\n#import "bamboo.typ": *\n\n#show: bamboo-theme.with(aspect-ratio: "16-9")\n\n= First Section\n\n== First Slide\n\nA slide with a title and an *important* information.\n'})}),"\n",(0,i.jsxs)(n.p,{children:["As you can see, we've created a ",(0,i.jsx)(n.code,{children:"bamboo-theme"})," function and passed in an ",(0,i.jsx)(n.code,{children:"aspect-ratio"})," parameter to set the page aspect ratio. We've also added ",(0,i.jsx)(n.code,{children:"set text(size: 20pt)"})," to set the font size. You can also place some additional global style settings here, such as ",(0,i.jsx)(n.code,{children:"set par(justify: true)"}),", etc. If you need to use ",(0,i.jsx)(n.code,{children:"self"}),", you might consider using ",(0,i.jsx)(n.code,{children:"config-methods(init: (self: none, body) => { .. })"})," to register an ",(0,i.jsx)(n.code,{children:"init"})," method."]}),"\n",(0,i.jsxs)(n.p,{children:["As you can see, later in ",(0,i.jsx)(n.code,{children:"main.typ"}),", we apply our style settings through ",(0,i.jsx)(n.code,{children:'#show: bamboo-theme.with(aspect-ratio: "16-9")'}),", and internally ",(0,i.jsx)(n.code,{children:"bamboo"})," uses ",(0,i.jsx)(n.code,{children:"show: touying-slides.with()"})," for corresponding configurations."]}),"\n",(0,i.jsx)(n.h2,{id:"color-theme",children:"Color Theme"}),"\n",(0,i.jsxs)(n.p,{children:["Picking an aesthetically pleasing color theme for your slides is key to making good slides. Touying provides built-in color theme support to minimize API differences between different themes. Touying offers two dimensions of color selection. The first dimension is ",(0,i.jsx)(n.code,{children:"neutral"}),", ",(0,i.jsx)(n.code,{children:"primary"}),", ",(0,i.jsx)(n.code,{children:"secondary"}),", and ",(0,i.jsx)(n.code,{children:"tertiary"}),", which are used to distinguish color tones, with ",(0,i.jsx)(n.code,{children:"primary"})," being the most commonly used theme color. The second dimension is ",(0,i.jsx)(n.code,{children:"default"}),", ",(0,i.jsx)(n.code,{children:"light"}),", ",(0,i.jsx)(n.code,{children:"lighter"}),", ",(0,i.jsx)(n.code,{children:"lightest"}),", ",(0,i.jsx)(n.code,{children:"dark"}),", ",(0,i.jsx)(n.code,{children:"darker"}),", ",(0,i.jsx)(n.code,{children:"darkest"}),", which are used to distinguish brightness levels."]}),"\n",(0,i.jsxs)(n.p,{children:["Since we are creating the Bamboo theme, we have chosen a color close to bamboo for the ",(0,i.jsx)(n.code,{children:"primary"})," theme color, ",(0,i.jsx)(n.code,{children:'rgb("#5E8B65")'}),", and added neutral colors ",(0,i.jsx)(n.code,{children:"neutral-lightest"}),", ",(0,i.jsx)(n.code,{children:"neutral-darkest"}),", respectively, as the background and font colors."]}),"\n",(0,i.jsxs)(n.p,{children:["As shown in the following code, we can use the ",(0,i.jsx)(n.code,{children:"config-colors()"})," method to modify the color theme. Its essence is a wrapper for ",(0,i.jsx)(n.code,{children:"self.colors += (..)"}),"."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-typst",children:'#let bamboo-theme(\n aspect-ratio: "16-9",\n ..args,\n body,\n) = {\n set text(size: 20pt)\n\n show: touying-slides.with(\n config-page(paper: "presentation-" + aspect-ratio),\n config-common(\n slide-fn: slide,\n ),\n config-colors(\n primary: rgb("#5E8B65"),\n neutral-lightest: rgb("#ffffff"),\n neutral-darkest: rgb("#000000"),\n ),\n ..args,\n )\n\n body\n}\n'})}),"\n",(0,i.jsxs)(n.p,{children:["After adding the color theme as shown above, we can access this color through ",(0,i.jsx)(n.code,{children:"self.colors.primary"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["It's also worth noting that users can change the color theme at any time in ",(0,i.jsx)(n.code,{children:"main.typ"})," by using ",(0,i.jsx)(n.code,{children:"config-colors()"})," or"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-typst",children:'#show: touying-set-config.with(config-colors(\n primary: blue,\n neutral-lightest: rgb("#ffffff"),\n neutral-darkest: rgb("#000000"),\n))\n'})}),"\n",(0,i.jsx)(n.p,{children:"This feature of being able to change the color theme at any time is a testament to Touying's powerful customizability."}),"\n",(0,i.jsx)(n.h2,{id:"practical-custom-alert-method",children:"Practical: Custom Alert Method"}),"\n",(0,i.jsxs)(n.p,{children:["Generally, we need to provide a ",(0,i.jsx)(n.code,{children:"#alert[..]"})," function for users, similar to ",(0,i.jsx)(n.code,{children:"#strong[..]"}),", both of which are used to emphasize the current text. Typically, ",(0,i.jsx)(n.code,{children:"#alert[..]"})," will change the text color to the theme color, which will look more aesthetically pleasing, and this is our next goal."]}),"\n",(0,i.jsxs)(n.p,{children:["We add a line in the ",(0,i.jsx)(n.code,{children:"register"})," function:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-typst",children:"config-methods(alert: (self: none, it) => text(fill: self.colors.primary, it))\n"})}),"\n",(0,i.jsxs)(n.p,{children:["This code means to change the text color to ",(0,i.jsx)(n.code,{children:"self.colors.primary"}),", and the ",(0,i.jsx)(n.code,{children:"self"})," here is passed in through the parameter ",(0,i.jsx)(n.code,{children:"self: none"}),", so that we can get the ",(0,i.jsx)(n.code,{children:"primary"})," theme color in real-time."]}),"\n",(0,i.jsx)(n.p,{children:"We can also use a shorthand."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-typst",children:"config-methods(alert: utils.alert-with-primary-color)\n"})}),"\n",(0,i.jsx)(n.h2,{id:"custom-header-and-footer",children:"Custom Header and Footer"}),"\n",(0,i.jsx)(n.p,{children:"Here, I assume you have read the page layout section, so we know that we should add a header and footer to the slides."}),"\n",(0,i.jsxs)(n.p,{children:["First, we add ",(0,i.jsx)(n.code,{children:"config-store(title: none)"}),", which means that we save the current slide's title as a member variable ",(0,i.jsx)(n.code,{children:"self.store.title"})," inside ",(0,i.jsx)(n.code,{children:"self"}),", making it convenient for us to use in the header and for subsequent modifications. Similarly, we also create a ",(0,i.jsx)(n.code,{children:"config-store(footer: footer)"})," and save the ",(0,i.jsx)(n.code,{children:"footer: none"})," parameter of the ",(0,i.jsx)(n.code,{children:"bamboo-theme"})," function for display in the footer at the bottom left corner."]}),"\n",(0,i.jsxs)(n.p,{children:["Then it's worth noting that our header is actually a content function with ",(0,i.jsx)(n.code,{children:"self"})," as a parameter, like ",(0,i.jsx)(n.code,{children:"let header(self) = { .. }"}),", rather than a simple content, so that we can get the information we need from the latest ",(0,i.jsx)(n.code,{children:"self"}),", such as ",(0,i.jsx)(n.code,{children:"self.store.title"}),". The footer is the same."]}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"components.cell"})," used here is actually ",(0,i.jsx)(n.code,{children:"#let cell = block.with(width: 100%, height: 100%, above: 0pt, below: 0pt, breakable: false)"}),", and ",(0,i.jsx)(n.code,{children:"show: components.cell"})," is also a shorthand for ",(0,i.jsx)(n.code,{children:"components.cell(body)"}),", and the ",(0,i.jsx)(n.code,{children:"show: pad.with(.4em)"})," for the footer is the same."]}),"\n",(0,i.jsxs)(n.p,{children:["Another point to note is that the ",(0,i.jsx)(n.code,{children:"utils"})," module contains many contents and methods related to counters and states, such as ",(0,i.jsx)(n.code,{children:"utils.display-current-heading(level: 1)"})," for displaying the current ",(0,i.jsx)(n.code,{children:"section"}),", and ",(0,i.jsx)(n.code,{children:'context utils.slide-counter.display() + " / " + utils.last-slide-number'})," for displaying the current page number and total number of pages."]}),"\n",(0,i.jsxs)(n.p,{children:["We also find that we use syntax like ",(0,i.jsx)(n.code,{children:"utils.call-or-display(self, self.store.footer)"})," to display ",(0,i.jsx)(n.code,{children:"self.store.footer"}),", which is to deal with the situation of ",(0,i.jsx)(n.code,{children:"self.store.footer = self => {..}"}),", so that we can unify the display of content functions and content."]}),"\n",(0,i.jsxs)(n.p,{children:["To ensure that the header and footer are displayed correctly and have enough spacing from the main text, we need to set the margin, such as ",(0,i.jsx)(n.code,{children:"config-page(margin: (top: 4em, bottom: 1.5em, x: 2em))"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["We also need to customize a ",(0,i.jsx)(n.code,{children:"slide"})," method, which accepts ",(0,i.jsx)(n.code,{children:"#let slide(title: auto, ..args) = touying-slide-wrapper(self => {..})"}),", where ",(0,i.jsx)(n.code,{children:"self"})," in the callback function is a required parameter to get the latest ",(0,i.jsx)(n.code,{children:"self"}),"; the second ",(0,i.jsx)(n.code,{children:"title"})," is used to update ",(0,i.jsx)(n.code,{children:"self.store.title"})," for display in the header; the third ",(0,i.jsx)(n.code,{children:"..args"})," is used to collect the remaining parameters and pass them to ",(0,i.jsx)(n.code,{children:"touying-slide(self: self, ..args)"}),", which is also necessary for the normal functioning of Touying's ",(0,i.jsx)(n.code,{children:"slide"})," feature. Moreover, we need to register this method in the ",(0,i.jsx)(n.code,{children:"bamboo-theme"})," function using ",(0,i.jsx)(n.code,{children:"config-methods(slide: slide)"}),"."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-typst",children:'// bamboo.typ\n#import "@preview/touying:0.5.3": *\n\n#let slide(title: auto, ..args) = touying-slide-wrapper(self => {\n if title != auto {\n self.store.title = title\n }\n // set page\n let header(self) = {\n set align(top)\n show: components.cell.with(fill: self.colors.primary, inset: 1em)\n set align(horizon)\n set text(fill: self.colors.neutral-lightest, size: .7em)\n utils.display-current-heading(level: 1)\n linebreak()\n set text(size: 1.5em)\n if self.store.title != none {\n utils.call-or-display(self, self.store.title)\n } else {\n utils.display-current-heading(level: 2)\n }\n }\n let footer(self) = {\n set align(bottom)\n show: pad.with(.4em)\n set text(fill: self.colors.neutral-darkest, size: .8em)\n utils.call-or-display(self, self.store.footer)\n h(1fr)\n context utils.slide-counter.display() + " / " + utils.last-slide-number\n }\n self = utils.merge-dicts(\n self,\n config-page(\n header: header,\n footer: footer,\n ),\n )\n touying-slide(self: self, ..args)\n})\n\n#let bamboo-theme(\n aspect-ratio: "16-9",\n footer: none,\n ..args,\n body,\n) = {\n set text(size: 20pt)\n\n show: touying-slides.with(\n config-page(\n paper: "presentation-" + aspect-ratio,\n margin: (top: 4em, bottom: 1.5em, x: 2em),\n ),\n config-common(\n slide-fn: slide,\n ),\n config-methods(\n alert: utils.alert-with-primary-color,\n ),\n config-colors(\n primary: rgb("#5E8B65"),\n neutral-lightest: rgb("#ffffff"),\n neutral-darkest: rgb("#000000"),\n ),\n config-store(\n title: none,\n footer: footer,\n ),\n ..args,\n )\n\n body\n}\n\n\n// main.typ\n#import "@preview/touying:0.5.3": *\n#import "bamboo.typ": *\n\n#show: bamboo-theme.with(aspect-ratio: "16-9")\n\n= First Section\n\n== First Slide\n\nA slide with a title and an *important* information.\n'})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://github.com/touying-typ/touying/assets/34951714/d33bcda7-c032-4b11-b392-5b939d9a0a47",alt:"image"})}),"\n",(0,i.jsx)(n.h2,{id:"custom-special-slides",children:"Custom Special Slides"}),"\n",(0,i.jsxs)(n.p,{children:["On the basis of the basic slides we've created, we further add some special slide functions, such as ",(0,i.jsx)(n.code,{children:"title-slide"}),", ",(0,i.jsx)(n.code,{children:"focus-slide"}),", and custom ",(0,i.jsx)(n.code,{children:"slides"})," methods."]}),"\n",(0,i.jsxs)(n.p,{children:["For the ",(0,i.jsx)(n.code,{children:"title-slide"})," method, first, we can obtain the information saved in ",(0,i.jsx)(n.code,{children:"self.info"})," through ",(0,i.jsx)(n.code,{children:"let info = self.info + args.named()"}),", and we can also update the information with ",(0,i.jsx)(n.code,{children:"args.named()"})," passed in through the function parameters for subsequent use in the form of ",(0,i.jsx)(n.code,{children:"info.title"}),". The specific page content ",(0,i.jsx)(n.code,{children:"body"})," will vary for each theme, so I won't go into too much detail here."]}),"\n",(0,i.jsxs)(n.p,{children:["For the ",(0,i.jsx)(n.code,{children:"new-section-slide"})," method, it's the same, but the only thing to note is that we registered ",(0,i.jsx)(n.code,{children:"new-section-slide-fn: new-section-slide"})," in ",(0,i.jsx)(n.code,{children:"config-methods()"}),", so ",(0,i.jsx)(n.code,{children:"new-section-slide"})," will be automatically called when encountering a first-level heading."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-typst",children:'// bamboo.typ\n#import "@preview/touying:0.5.3": *\n\n#let slide(title: auto, ..args) = touying-slide-wrapper(self => {\n if title != auto {\n self.store.title = title\n }\n // set page\n let header(self) = {\n set align(top)\n show: components.cell.with(fill: self.colors.primary, inset: 1em)\n set align(horizon)\n set text(fill: self.colors.neutral-lightest, size: .7em)\n utils.display-current-heading(level: 1)\n linebreak()\n set text(size: 1.5em)\n if self.store.title != none {\n utils.call-or-display(self, self.store.title)\n } else {\n utils.display-current-heading(level: 2)\n }\n }\n let footer(self) = {\n set align(bottom)\n show: pad.with(.4em)\n set text(fill: self.colors.neutral-darkest, size: .8em)\n utils.call-or-display(self, self.store.footer)\n h(1fr)\n context utils.slide-counter.display() + " / " + utils.last-slide-number\n }\n self = utils.merge-dicts(\n self,\n config-page(\n header: header,\n footer: footer,\n ),\n )\n touying-slide(self: self, ..args)\n})\n\n#let title-slide(..args) = touying-slide-wrapper(self => {\n let info = self.info + args.named()\n let body = {\n set align(center + horizon)\n block(\n fill: self.colors.primary,\n width: 80%,\n inset: (y: 1em),\n radius: 1em,\n text(size: 2em, fill: self.colors.neutral-lightest, weight: "bold", info.title),\n )\n set text(fill: self.colors.neutral-darkest)\n if info.author != none {\n block(info.author)\n }\n if info.date != none {\n block(utils.display-info-date(self))\n }\n }\n touying-slide(self: self, body)\n})\n\n#let new-section-slide(self: none, body) = touying-slide-wrapper(self => {\n let main-body = {\n set align(center + horizon)\n set text(size: 2em, fill: self.colors.primary, weight: "bold", style: "italic")\n utils.display-current-heading(level: 1)\n }\n touying-slide(self: self, main-body)\n})\n\n#let focus-slide(body) = touying-slide-wrapper(self => {\n self = utils.merge-dicts(\n self,\n config-page(\n fill: self.colors.primary,\n margin: 2em,\n ),\n )\n set text(fill: self.colors.neutral-lightest, size: 2em)\n touying-slide(self: self, align(horizon + center, body))\n})\n\n#let bamboo-theme(\n aspect-ratio: "16-9",\n footer: none,\n ..args,\n body,\n) = {\n set text(size: 20pt)\n\n show: touying-slides.with(\n config-page(\n paper: "presentation-" + aspect-ratio,\n margin: (top: 4em, bottom: 1.5em, x: 2em),\n ),\n config-common(\n slide-fn: slide,\n new-section-slide-fn: new-section-slide,\n ),\n config-methods(alert: utils.alert-with-primary-color),\n config-colors(\n primary: rgb("#5E8B65"),\n neutral-lightest: rgb("#ffffff"),\n neutral-darkest: rgb("#000000"),\n ),\n config-store(\n title: none,\n footer: footer,\n ),\n ..args,\n )\n\n body\n}\n\n\n// main.typ\n#import "@preview/touying:0.5.3": *\n#import "bamboo.typ": *\n\n#show: bamboo-theme.with(\n aspect-ratio: "16-9",\n footer: self => self.info.institution,\n config-info(\n title: [Title],\n subtitle: [Subtitle],\n author: [Authors],\n date: datetime.today(),\n institution: [Institution],\n ),\n)\n\n#title-slide()\n\n= First Section\n\n== First Slide\n\nA slide with a title and an *important* information.\n\n#focus-slide[\n Focus on it!\n]\n'})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://github.com/touying-typ/touying/assets/34951714/03c5ad02-8ff4-4068-9664-d9cfad79baaf",alt:"image"})}),"\n",(0,i.jsx)(n.h2,{id:"conclusion",children:"Conclusion"}),"\n",(0,i.jsx)(n.p,{children:"Congratulations! You've created a simple and elegant theme. Perhaps you may find that Touying introduces a wealth of concepts, making it initially challenging to grasp. This is normal, as Touying opts for functionality over simplicity. However, thanks to Touying's comprehensive and unified approach, you can easily extract commonalities between different themes and transfer your knowledge seamlessly. You can also save global variables, modify existing themes, or switch between themes effortlessly, showcasing the benefits of Touying's decoupling."})]})}function h(e={}){const{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>r,a:()=>l});var i=t(7294);const o={},s=i.createContext(o);function l(e){const n=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:l(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/6dd14aab.5b9ee44d.js b/assets/js/6dd14aab.0a5116b7.js
similarity index 87%
rename from assets/js/6dd14aab.5b9ee44d.js
rename to assets/js/6dd14aab.0a5116b7.js
index 3f66b001..bb3d7876 100644
--- a/assets/js/6dd14aab.5b9ee44d.js
+++ b/assets/js/6dd14aab.0a5116b7.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[458],{5820:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>l,default:()=>h,frontMatter:()=>s,metadata:()=>r,toc:()=>c});var i=t(5893),o=t(1151);const s={sidebar_position:11},l="Build Your Own Theme",r={id:"build-your-own-theme",title:"Build Your Own Theme",description:"Creating your own theme with Touying can be a bit complex due to the many concepts we've introduced. But rest assured, if you do create a theme with Touying, you might deeply appreciate the convenience and powerful customizability that Touying offers. You can refer to the source code of the themes. The main things you need to implement are:",source:"@site/versioned_docs/version-0.5.x/build-your-own-theme.md",sourceDirName:".",slug:"/build-your-own-theme",permalink:"/docs/build-your-own-theme",draft:!1,unlisted:!1,editUrl:"https://github.com/touying-typ/touying/tree/main/docs/versioned_docs/version-0.5.x/build-your-own-theme.md",tags:[],version:"0.5.x",sidebarPosition:11,frontMatter:{sidebar_position:11},sidebar:"tutorialSidebar",previous:{title:"Custom Theme",permalink:"/docs/themes/custom"},next:{title:"Progress",permalink:"/docs/category/progress"}},a={},c=[{value:"Modifying Existing Themes",id:"modifying-existing-themes",level:2},{value:"Importing",id:"importing",level:2},{value:"register Function and init Method",id:"register-function-and-init-method",level:2},{value:"Color Theme",id:"color-theme",level:2},{value:"Practical: Custom Alert Method",id:"practical-custom-alert-method",level:2},{value:"Custom Header and Footer",id:"custom-header-and-footer",level:2},{value:"Custom Special Slides",id:"custom-special-slides",level:2},{value:"Conclusion",id:"conclusion",level:2}];function d(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,o.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h1,{id:"build-your-own-theme",children:"Build Your Own Theme"}),"\n",(0,i.jsxs)(n.p,{children:["Creating your own theme with Touying can be a bit complex due to the many concepts we've introduced. But rest assured, if you do create a theme with Touying, you might deeply appreciate the convenience and powerful customizability that Touying offers. You can refer to the ",(0,i.jsx)(n.a,{href:"https://github.com/touying-typ/touying/tree/main/themes",children:"source code of the themes"}),". The main things you need to implement are:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Customizing the ",(0,i.jsx)(n.code,{children:"xxx-theme"})," function;"]}),"\n",(0,i.jsxs)(n.li,{children:["Customizing the color theme, i.e., ",(0,i.jsx)(n.code,{children:"config-colors()"}),";"]}),"\n",(0,i.jsx)(n.li,{children:"Customizing the header;"}),"\n",(0,i.jsx)(n.li,{children:"Customizing the footer;"}),"\n",(0,i.jsxs)(n.li,{children:["Customizing the ",(0,i.jsx)(n.code,{children:"slide"})," method;"]}),"\n",(0,i.jsxs)(n.li,{children:["Customizing special slide methods, such as ",(0,i.jsx)(n.code,{children:"title-slide"})," and ",(0,i.jsx)(n.code,{children:"focus-slide"})," methods;"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"To demonstrate how to create a theme with Touying, let's step by step create a simple and aesthetically pleasing Bamboo theme."}),"\n",(0,i.jsx)(n.h2,{id:"modifying-existing-themes",children:"Modifying Existing Themes"}),"\n",(0,i.jsx)(n.p,{children:"If you want to modify a Touying internal theme locally instead of creating one from scratch, you can achieve this by:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["Copying the ",(0,i.jsx)(n.a,{href:"https://github.com/touying-typ/touying/tree/main/themes",children:"theme code"})," from the ",(0,i.jsx)(n.code,{children:"themes"})," directory to your local, for example, copying ",(0,i.jsx)(n.code,{children:"themes/university.typ"})," to your local ",(0,i.jsx)(n.code,{children:"university.typ"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:["Replacing the ",(0,i.jsx)(n.code,{children:'#import "../src/exports.typ": *'})," command at the top of the ",(0,i.jsx)(n.code,{children:"university.typ"})," file with ",(0,i.jsx)(n.code,{children:'#import "@preview/touying:0.5.3": *'}),"."]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Then you can import and use the theme by:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-typst",children:'#import "@preview/touying:0.5.3": *\n#import "university.typ": *\n\n#show: university-theme.with(\n aspect-ratio: "16-9",\n config-info(\n title: [Title],\n subtitle: [Subtitle],\n author: [Authors],\n date: datetime.today(),\n institution: [Institution],\n logo: emoji.school,\n ),\n)\n'})}),"\n",(0,i.jsx)(n.h2,{id:"importing",children:"Importing"}),"\n",(0,i.jsx)(n.p,{children:"Depending on whether the theme is your own or part of Touying, you can import it in two ways:"}),"\n",(0,i.jsx)(n.p,{children:"If it's just for your own use, you can directly import Touying:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-typst",children:'#import "@preview/touying:0.5.3": *\n'})}),"\n",(0,i.jsxs)(n.p,{children:["If you want the theme to be part of Touying, placed in the Touying ",(0,i.jsx)(n.code,{children:"themes"})," directory, then you should change the import statement above to"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-typst",children:'#import "../src/exports.typ": *\n'})}),"\n",(0,i.jsx)(n.p,{children:"And add"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-typst",children:'#import "bamboo.typ"\n'})}),"\n",(0,i.jsxs)(n.p,{children:["in Touying's ",(0,i.jsx)(n.code,{children:"themes/themes.typ"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"register-function-and-init-method",children:"register Function and init Method"}),"\n",(0,i.jsxs)(n.p,{children:["Next, we will differentiate between the ",(0,i.jsx)(n.code,{children:"bamboo.typ"})," template file and the ",(0,i.jsx)(n.code,{children:"main.typ"})," file, which is sometimes omitted."]}),"\n",(0,i.jsx)(n.p,{children:"Generally, the first step in making slides is to determine the font size and page aspect ratio, so we need to register an initialization method:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-typst",children:'// bamboo.typ\n#import "@preview/touying:0.5.3": *\n\n#let bamboo-theme(\n aspect-ratio: "16-9",\n ..args,\n body,\n) = {\n set text(size: 20pt)\n\n show: touying-slides.with(\n config-page(paper: "presentation-" + aspect-ratio),\n config-common(\n slide-fn: slide,\n ),\n ..args,\n )\n\n body\n}\n\n// main.typ\n#import "@preview/touying:0.5.3": *\n#import "bamboo.typ": *\n\n#show: bamboo-theme.with(aspect-ratio: "16-9")\n\n= First Section\n\n== First Slide\n\nA slide with a title and an *important* information.\n'})}),"\n",(0,i.jsxs)(n.p,{children:["As you can see, we've created a ",(0,i.jsx)(n.code,{children:"bamboo-theme"})," function and passed in an ",(0,i.jsx)(n.code,{children:"aspect-ratio"})," parameter to set the page aspect ratio. We've also added ",(0,i.jsx)(n.code,{children:"set text(size: 20pt)"})," to set the font size. You can also place some additional global style settings here, such as ",(0,i.jsx)(n.code,{children:"set par(justify: true)"}),", etc. If you need to use ",(0,i.jsx)(n.code,{children:"self"}),", you might consider using ",(0,i.jsx)(n.code,{children:"config-methods(init: (self: none, body) => { .. })"})," to register an ",(0,i.jsx)(n.code,{children:"init"})," method."]}),"\n",(0,i.jsxs)(n.p,{children:["As you can see, later in ",(0,i.jsx)(n.code,{children:"main.typ"}),", we apply our style settings through ",(0,i.jsx)(n.code,{children:'#show: bamboo-theme.with(aspect-ratio: "16-9")'}),", and internally ",(0,i.jsx)(n.code,{children:"bamboo"})," uses ",(0,i.jsx)(n.code,{children:"show: touying-slides.with()"})," for corresponding configurations."]}),"\n",(0,i.jsx)(n.h2,{id:"color-theme",children:"Color Theme"}),"\n",(0,i.jsxs)(n.p,{children:["Picking an aesthetically pleasing color theme for your slides is key to making good slides. Touying provides built-in color theme support to minimize API differences between different themes. Touying offers two dimensions of color selection. The first dimension is ",(0,i.jsx)(n.code,{children:"neutral"}),", ",(0,i.jsx)(n.code,{children:"primary"}),", ",(0,i.jsx)(n.code,{children:"secondary"}),", and ",(0,i.jsx)(n.code,{children:"tertiary"}),", which are used to distinguish color tones, with ",(0,i.jsx)(n.code,{children:"primary"})," being the most commonly used theme color. The second dimension is ",(0,i.jsx)(n.code,{children:"default"}),", ",(0,i.jsx)(n.code,{children:"light"}),", ",(0,i.jsx)(n.code,{children:"lighter"}),", ",(0,i.jsx)(n.code,{children:"lightest"}),", ",(0,i.jsx)(n.code,{children:"dark"}),", ",(0,i.jsx)(n.code,{children:"darker"}),", ",(0,i.jsx)(n.code,{children:"darkest"}),", which are used to distinguish brightness levels."]}),"\n",(0,i.jsxs)(n.p,{children:["Since we are creating the Bamboo theme, we have chosen a color close to bamboo for the ",(0,i.jsx)(n.code,{children:"primary"})," theme color, ",(0,i.jsx)(n.code,{children:'rgb("#5E8B65")'}),", and added neutral colors ",(0,i.jsx)(n.code,{children:"neutral-lightest"}),", ",(0,i.jsx)(n.code,{children:"neutral-darkest"}),", respectively, as the background and font colors."]}),"\n",(0,i.jsxs)(n.p,{children:["As shown in the following code, we can use the ",(0,i.jsx)(n.code,{children:"config-colors()"})," method to modify the color theme. Its essence is a wrapper for ",(0,i.jsx)(n.code,{children:"self.colors += (..)"}),"."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-typst",children:'#let bamboo-theme(\n aspect-ratio: "16-9",\n ..args,\n body,\n) = {\n set text(size: 20pt)\n\n show: touying-slides.with(\n config-page(paper: "presentation-" + aspect-ratio),\n config-common(\n slide-fn: slide,\n ),\n config-colors(\n primary: rgb("#5E8B65"),\n neutral-lightest: rgb("#ffffff"),\n neutral-darkest: rgb("#000000"),\n ),\n ..args,\n )\n\n body\n}\n'})}),"\n",(0,i.jsxs)(n.p,{children:["After adding the color theme as shown above, we can access this color through ",(0,i.jsx)(n.code,{children:"self.colors.primary"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["It's also worth noting that users can change the color theme at any time in ",(0,i.jsx)(n.code,{children:"main.typ"})," by using ",(0,i.jsx)(n.code,{children:"config-colors()"})," or"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-typst",children:'#show: touying-set-config.with(config-colors(\n primary: blue,\n neutral-lightest: rgb("#ffffff"),\n neutral-darkest: rgb("#000000"),\n))\n'})}),"\n",(0,i.jsx)(n.p,{children:"This feature of being able to change the color theme at any time is a testament to Touying's powerful customizability."}),"\n",(0,i.jsx)(n.h2,{id:"practical-custom-alert-method",children:"Practical: Custom Alert Method"}),"\n",(0,i.jsxs)(n.p,{children:["Generally, we need to provide a ",(0,i.jsx)(n.code,{children:"#alert[..]"})," function for users, similar to ",(0,i.jsx)(n.code,{children:"#strong[..]"}),", both of which are used to emphasize the current text. Typically, ",(0,i.jsx)(n.code,{children:"#alert[..]"})," will change the text color to the theme color, which will look more aesthetically pleasing, and this is our next goal."]}),"\n",(0,i.jsxs)(n.p,{children:["We add a line in the ",(0,i.jsx)(n.code,{children:"register"})," function:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-typst",children:"config-methods(alert: (self: none, it) => text(fill: self.colors.primary, it))\n"})}),"\n",(0,i.jsxs)(n.p,{children:["This code means to change the text color to ",(0,i.jsx)(n.code,{children:"self.colors.primary"}),", and the ",(0,i.jsx)(n.code,{children:"self"})," here is passed in through the parameter ",(0,i.jsx)(n.code,{children:"self: none"}),", so that we can get the ",(0,i.jsx)(n.code,{children:"primary"})," theme color in real-time."]}),"\n",(0,i.jsx)(n.p,{children:"We can also use a shorthand."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-typst",children:"config-methods(alert: utils.alert-with-primary-color)\n"})}),"\n",(0,i.jsx)(n.h2,{id:"custom-header-and-footer",children:"Custom Header and Footer"}),"\n",(0,i.jsx)(n.p,{children:"Here, I assume you have read the page layout section, so we know that we should add a header and footer to the slides."}),"\n",(0,i.jsxs)(n.p,{children:["First, we add ",(0,i.jsx)(n.code,{children:"config-store(title: none)"}),", which means that we save the current slide's title as a member variable ",(0,i.jsx)(n.code,{children:"self.store.title"})," inside ",(0,i.jsx)(n.code,{children:"self"}),", making it convenient for us to use in the header and for subsequent modifications. Similarly, we also create a ",(0,i.jsx)(n.code,{children:"config-store(footer: footer)"})," and save the ",(0,i.jsx)(n.code,{children:"footer: none"})," parameter of the ",(0,i.jsx)(n.code,{children:"bamboo-theme"})," function for display in the footer at the bottom left corner."]}),"\n",(0,i.jsxs)(n.p,{children:["Then it's worth noting that our header is actually a content function with ",(0,i.jsx)(n.code,{children:"self"})," as a parameter, like ",(0,i.jsx)(n.code,{children:"let header(self) = { .. }"}),", rather than a simple content, so that we can get the information we need from the latest ",(0,i.jsx)(n.code,{children:"self"}),", such as ",(0,i.jsx)(n.code,{children:"self.store.title"}),". The footer is the same."]}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"components.cell"})," used here is actually ",(0,i.jsx)(n.code,{children:"#let cell = block.with(width: 100%, height: 100%, above: 0pt, below: 0pt, breakable: false)"}),", and ",(0,i.jsx)(n.code,{children:"show: components.cell"})," is also a shorthand for ",(0,i.jsx)(n.code,{children:"components.cell(body)"}),", and the ",(0,i.jsx)(n.code,{children:"show: pad.with(.4em)"})," for the footer is the same."]}),"\n",(0,i.jsxs)(n.p,{children:["Another point to note is that the ",(0,i.jsx)(n.code,{children:"utils"})," module contains many contents and methods related to counters and states, such as ",(0,i.jsx)(n.code,{children:"utils.display-current-heading(level: 1)"})," for displaying the current ",(0,i.jsx)(n.code,{children:"section"}),", and ",(0,i.jsx)(n.code,{children:'context utils.slide-counter.display() + " / " + utils.last-slide-number'})," for displaying the current page number and total number of pages."]}),"\n",(0,i.jsxs)(n.p,{children:["We also find that we use syntax like ",(0,i.jsx)(n.code,{children:"utils.call-or-display(self, self.store.footer)"})," to display ",(0,i.jsx)(n.code,{children:"self.store.footer"}),", which is to deal with the situation of ",(0,i.jsx)(n.code,{children:"self.store.footer = self => {..}"}),", so that we can unify the display of content functions and content."]}),"\n",(0,i.jsxs)(n.p,{children:["To ensure that the header and footer are displayed correctly and have enough spacing from the main text, we need to set the margin, such as ",(0,i.jsx)(n.code,{children:"config-page(margin: (top: 4em, bottom: 1.5em, x: 2em))"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["We also need to customize a ",(0,i.jsx)(n.code,{children:"slide"})," method, which accepts ",(0,i.jsx)(n.code,{children:"#let slide(title: auto, ..args) = touying-slide-wrapper(self => {..})"}),", where ",(0,i.jsx)(n.code,{children:"self"})," in the callback function is a required parameter to get the latest ",(0,i.jsx)(n.code,{children:"self"}),"; the second ",(0,i.jsx)(n.code,{children:"title"})," is used to update ",(0,i.jsx)(n.code,{children:"self.store.title"})," for display in the header; the third ",(0,i.jsx)(n.code,{children:"..args"})," is used to collect the remaining parameters and pass them to ",(0,i.jsx)(n.code,{children:"touying-slide(self: self, ..args)"}),", which is also necessary for the normal functioning of Touying's ",(0,i.jsx)(n.code,{children:"slide"})," feature. Moreover, we need to register this method in the ",(0,i.jsx)(n.code,{children:"bamboo-theme"})," function using ",(0,i.jsx)(n.code,{children:"config-methods(slide: slide)"}),"."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-typst",children:'// bamboo.typ\n#import "@preview/touying:0.5.3": *\n\n#let slide(title: auto, ..args) = touying-slide-wrapper(self => {\n if title != auto {\n self.store.title = title\n }\n // set page\n let header(self) = {\n set align(top)\n show: components.cell.with(fill: self.colors.primary, inset: 1em)\n set align(horizon)\n set text(fill: self.colors.neutral-lightest, size: .7em)\n utils.display-current-heading(level: 1)\n linebreak()\n set text(size: 1.5em)\n if self.store.title != none {\n utils.call-or-display(self, self.store.title)\n } else {\n utils.display-current-heading(level: 2)\n }\n }\n let footer(self) = {\n set align(bottom)\n show: pad.with(.4em)\n set text(fill: self.colors.neutral-darkest, size: .8em)\n utils.call-or-display(self, self.store.footer)\n h(1fr)\n context utils.slide-counter.display() + " / " + utils.last-slide-number\n }\n self = utils.merge-dicts(\n self,\n config-page(\n header: header,\n footer: footer,\n ),\n )\n touying-slide(self: self, ..args)\n})\n\n#let bamboo-theme(\n aspect-ratio: "16-9",\n footer: none,\n ..args,\n body,\n) = {\n set text(size: 20pt)\n\n show: touying-slides.with(\n config-page(\n paper: "presentation-" + aspect-ratio,\n margin: (top: 4em, bottom: 1.5em, x: 2em),\n ),\n config-common(\n slide-fn: slide,\n ),\n config-methods(\n alert: utils.alert-with-primary-color,\n ),\n config-colors(\n primary: rgb("#5E8B65"),\n neutral-lightest: rgb("#ffffff"),\n neutral-darkest: rgb("#000000"),\n ),\n config-store(\n title: none,\n footer: footer,\n ),\n ..args,\n )\n\n body\n}\n\n\n// main.typ\n#import "@preview/touying:0.5.3": *\n#import "bamboo.typ": *\n\n#show: bamboo-theme.with(aspect-ratio: "16-9")\n\n= First Section\n\n== First Slide\n\nA slide with a title and an *important* information.\n'})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://github.com/touying-typ/touying/assets/34951714/d33bcda7-c032-4b11-b392-5b939d9a0a47",alt:"image"})}),"\n",(0,i.jsx)(n.h2,{id:"custom-special-slides",children:"Custom Special Slides"}),"\n",(0,i.jsxs)(n.p,{children:["On the basis of the basic slides we've created, we further add some special slide functions, such as ",(0,i.jsx)(n.code,{children:"title-slide"}),", ",(0,i.jsx)(n.code,{children:"focus-slide"}),", and custom ",(0,i.jsx)(n.code,{children:"slides"})," methods."]}),"\n",(0,i.jsxs)(n.p,{children:["For the ",(0,i.jsx)(n.code,{children:"title-slide"})," method, first, we can obtain the information saved in ",(0,i.jsx)(n.code,{children:"self.info"})," through ",(0,i.jsx)(n.code,{children:"let info = self.info + args.named()"}),", and we can also update the information with ",(0,i.jsx)(n.code,{children:"args.named()"})," passed in through the function parameters for subsequent use in the form of ",(0,i.jsx)(n.code,{children:"info.title"}),". The specific page content ",(0,i.jsx)(n.code,{children:"body"})," will vary for each theme, so I won't go into too much detail here."]}),"\n",(0,i.jsxs)(n.p,{children:["For the ",(0,i.jsx)(n.code,{children:"new-section-slide"})," method, it's the same, but the only thing to note is that we registered ",(0,i.jsx)(n.code,{children:"new-section-slide-fn: new-section-slide"})," in ",(0,i.jsx)(n.code,{children:"config-methods()"}),", so ",(0,i.jsx)(n.code,{children:"new-section-slide"})," will be automatically called when encountering a first-level heading."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-typst",children:'// bamboo.typ\n#import "@preview/touying:0.5.3": *\n\n#let slide(title: auto, ..args) = touying-slide-wrapper(self => {\n if title != auto {\n self.store.title = title\n }\n // set page\n let header(self) = {\n set align(top)\n show: components.cell.with(fill: self.colors.primary, inset: 1em)\n set align(horizon)\n set text(fill: self.colors.neutral-lightest, size: .7em)\n utils.display-current-heading(level: 1)\n linebreak()\n set text(size: 1.5em)\n if self.store.title != none {\n utils.call-or-display(self, self.store.title)\n } else {\n utils.display-current-heading(level: 2)\n }\n }\n let footer(self) = {\n set align(bottom)\n show: pad.with(.4em)\n set text(fill: self.colors.neutral-darkest, size: .8em)\n utils.call-or-display(self, self.store.footer)\n h(1fr)\n context utils.slide-counter.display() + " / " + utils.last-slide-number\n }\n self = utils.merge-dicts(\n self,\n config-page(\n header: header,\n footer: footer,\n ),\n )\n touying-slide(self: self, ..args)\n})\n\n#let title-slide(..args) = touying-slide-wrapper(self => {\n let info = self.info + args.named()\n let body = {\n set align(center + horizon)\n block(\n fill: self.colors.primary,\n width: 80%,\n inset: (y: 1em),\n radius: 1em,\n text(size: 2em, fill: self.colors.neutral-lightest, weight: "bold", info.title),\n )\n set text(fill: self.colors.neutral-darkest)\n if info.author != none {\n block(info.author)\n }\n if info.date != none {\n block(utils.display-info-date(self))\n }\n }\n touying-slide(self: self, body)\n})\n\n#let new-section-slide(self: none, section) = touying-slide-wrapper(self => {\n let body = {\n set align(center + horizon)\n set text(size: 2em, fill: self.colors.primary, weight: "bold", style: "italic")\n section\n }\n touying-slide(self: self, body)\n})\n\n#let focus-slide(body) = touying-slide-wrapper(self => {\n self = utils.merge-dicts(\n self,\n config-page(\n fill: self.colors.primary,\n margin: 2em,\n ),\n )\n set text(fill: self.colors.neutral-lightest, size: 2em)\n touying-slide(self: self, align(horizon + center, body))\n})\n\n#let bamboo-theme(\n aspect-ratio: "16-9",\n footer: none,\n ..args,\n body,\n) = {\n set text(size: 20pt)\n\n show: touying-slides.with(\n config-page(\n paper: "presentation-" + aspect-ratio,\n margin: (top: 4em, bottom: 1.5em, x: 2em),\n ),\n config-common(\n slide-fn: slide,\n new-section-slide-fn: new-section-slide,\n ),\n config-methods(alert: utils.alert-with-primary-color),\n config-colors(\n primary: rgb("#5E8B65"),\n neutral-lightest: rgb("#ffffff"),\n neutral-darkest: rgb("#000000"),\n ),\n config-store(\n title: none,\n footer: footer,\n ),\n ..args,\n )\n\n body\n}\n\n\n// main.typ\n#import "@preview/touying:0.5.3": *\n#import "bamboo.typ": *\n\n#show: bamboo-theme.with(\n aspect-ratio: "16-9",\n footer: self => self.info.institution,\n config-info(\n title: [Title],\n subtitle: [Subtitle],\n author: [Authors],\n date: datetime.today(),\n institution: [Institution],\n ),\n)\n\n#title-slide()\n\n= First Section\n\n== First Slide\n\nA slide with a title and an *important* information.\n\n#focus-slide[\n Focus on it!\n]\n'})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://github.com/touying-typ/touying/assets/34951714/03c5ad02-8ff4-4068-9664-d9cfad79baaf",alt:"image"})}),"\n",(0,i.jsx)(n.h2,{id:"conclusion",children:"Conclusion"}),"\n",(0,i.jsx)(n.p,{children:"Congratulations! You've created a simple and elegant theme. Perhaps you may find that Touying introduces a wealth of concepts, making it initially challenging to grasp. This is normal, as Touying opts for functionality over simplicity. However, thanks to Touying's comprehensive and unified approach, you can easily extract commonalities between different themes and transfer your knowledge seamlessly. You can also save global variables, modify existing themes, or switch between themes effortlessly, showcasing the benefits of Touying's decoupling."})]})}function h(e={}){const{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>r,a:()=>l});var i=t(7294);const o={},s=i.createContext(o);function l(e){const n=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:l(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
+"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[458],{5820:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>l,default:()=>h,frontMatter:()=>s,metadata:()=>r,toc:()=>c});var i=t(5893),o=t(1151);const s={sidebar_position:11},l="Build Your Own Theme",r={id:"build-your-own-theme",title:"Build Your Own Theme",description:"Creating your own theme with Touying can be a bit complex due to the many concepts we've introduced. But rest assured, if you do create a theme with Touying, you might deeply appreciate the convenience and powerful customizability that Touying offers. You can refer to the source code of the themes. The main things you need to implement are:",source:"@site/versioned_docs/version-0.5.x/build-your-own-theme.md",sourceDirName:".",slug:"/build-your-own-theme",permalink:"/docs/build-your-own-theme",draft:!1,unlisted:!1,editUrl:"https://github.com/touying-typ/touying/tree/main/docs/versioned_docs/version-0.5.x/build-your-own-theme.md",tags:[],version:"0.5.x",sidebarPosition:11,frontMatter:{sidebar_position:11},sidebar:"tutorialSidebar",previous:{title:"Custom Theme",permalink:"/docs/themes/custom"},next:{title:"Progress",permalink:"/docs/category/progress"}},a={},c=[{value:"Modifying Existing Themes",id:"modifying-existing-themes",level:2},{value:"Importing",id:"importing",level:2},{value:"register Function and init Method",id:"register-function-and-init-method",level:2},{value:"Color Theme",id:"color-theme",level:2},{value:"Practical: Custom Alert Method",id:"practical-custom-alert-method",level:2},{value:"Custom Header and Footer",id:"custom-header-and-footer",level:2},{value:"Custom Special Slides",id:"custom-special-slides",level:2},{value:"Conclusion",id:"conclusion",level:2}];function d(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,o.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h1,{id:"build-your-own-theme",children:"Build Your Own Theme"}),"\n",(0,i.jsxs)(n.p,{children:["Creating your own theme with Touying can be a bit complex due to the many concepts we've introduced. But rest assured, if you do create a theme with Touying, you might deeply appreciate the convenience and powerful customizability that Touying offers. You can refer to the ",(0,i.jsx)(n.a,{href:"https://github.com/touying-typ/touying/tree/main/themes",children:"source code of the themes"}),". The main things you need to implement are:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Customizing the ",(0,i.jsx)(n.code,{children:"xxx-theme"})," function;"]}),"\n",(0,i.jsxs)(n.li,{children:["Customizing the color theme, i.e., ",(0,i.jsx)(n.code,{children:"config-colors()"}),";"]}),"\n",(0,i.jsx)(n.li,{children:"Customizing the header;"}),"\n",(0,i.jsx)(n.li,{children:"Customizing the footer;"}),"\n",(0,i.jsxs)(n.li,{children:["Customizing the ",(0,i.jsx)(n.code,{children:"slide"})," method;"]}),"\n",(0,i.jsxs)(n.li,{children:["Customizing special slide methods, such as ",(0,i.jsx)(n.code,{children:"title-slide"})," and ",(0,i.jsx)(n.code,{children:"focus-slide"})," methods;"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"To demonstrate how to create a theme with Touying, let's step by step create a simple and aesthetically pleasing Bamboo theme."}),"\n",(0,i.jsx)(n.h2,{id:"modifying-existing-themes",children:"Modifying Existing Themes"}),"\n",(0,i.jsx)(n.p,{children:"If you want to modify a Touying internal theme locally instead of creating one from scratch, you can achieve this by:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["Copying the ",(0,i.jsx)(n.a,{href:"https://github.com/touying-typ/touying/tree/main/themes",children:"theme code"})," from the ",(0,i.jsx)(n.code,{children:"themes"})," directory to your local, for example, copying ",(0,i.jsx)(n.code,{children:"themes/university.typ"})," to your local ",(0,i.jsx)(n.code,{children:"university.typ"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:["Replacing the ",(0,i.jsx)(n.code,{children:'#import "../src/exports.typ": *'})," command at the top of the ",(0,i.jsx)(n.code,{children:"university.typ"})," file with ",(0,i.jsx)(n.code,{children:'#import "@preview/touying:0.5.3": *'}),"."]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Then you can import and use the theme by:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-typst",children:'#import "@preview/touying:0.5.3": *\n#import "university.typ": *\n\n#show: university-theme.with(\n aspect-ratio: "16-9",\n config-info(\n title: [Title],\n subtitle: [Subtitle],\n author: [Authors],\n date: datetime.today(),\n institution: [Institution],\n logo: emoji.school,\n ),\n)\n'})}),"\n",(0,i.jsx)(n.h2,{id:"importing",children:"Importing"}),"\n",(0,i.jsx)(n.p,{children:"Depending on whether the theme is your own or part of Touying, you can import it in two ways:"}),"\n",(0,i.jsx)(n.p,{children:"If it's just for your own use, you can directly import Touying:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-typst",children:'#import "@preview/touying:0.5.3": *\n'})}),"\n",(0,i.jsxs)(n.p,{children:["If you want the theme to be part of Touying, placed in the Touying ",(0,i.jsx)(n.code,{children:"themes"})," directory, then you should change the import statement above to"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-typst",children:'#import "../src/exports.typ": *\n'})}),"\n",(0,i.jsx)(n.p,{children:"And add"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-typst",children:'#import "bamboo.typ"\n'})}),"\n",(0,i.jsxs)(n.p,{children:["in Touying's ",(0,i.jsx)(n.code,{children:"themes/themes.typ"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"register-function-and-init-method",children:"register Function and init Method"}),"\n",(0,i.jsxs)(n.p,{children:["Next, we will differentiate between the ",(0,i.jsx)(n.code,{children:"bamboo.typ"})," template file and the ",(0,i.jsx)(n.code,{children:"main.typ"})," file, which is sometimes omitted."]}),"\n",(0,i.jsx)(n.p,{children:"Generally, the first step in making slides is to determine the font size and page aspect ratio, so we need to register an initialization method:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-typst",children:'// bamboo.typ\n#import "@preview/touying:0.5.3": *\n\n#let bamboo-theme(\n aspect-ratio: "16-9",\n ..args,\n body,\n) = {\n set text(size: 20pt)\n\n show: touying-slides.with(\n config-page(paper: "presentation-" + aspect-ratio),\n config-common(\n slide-fn: slide,\n ),\n ..args,\n )\n\n body\n}\n\n// main.typ\n#import "@preview/touying:0.5.3": *\n#import "bamboo.typ": *\n\n#show: bamboo-theme.with(aspect-ratio: "16-9")\n\n= First Section\n\n== First Slide\n\nA slide with a title and an *important* information.\n'})}),"\n",(0,i.jsxs)(n.p,{children:["As you can see, we've created a ",(0,i.jsx)(n.code,{children:"bamboo-theme"})," function and passed in an ",(0,i.jsx)(n.code,{children:"aspect-ratio"})," parameter to set the page aspect ratio. We've also added ",(0,i.jsx)(n.code,{children:"set text(size: 20pt)"})," to set the font size. You can also place some additional global style settings here, such as ",(0,i.jsx)(n.code,{children:"set par(justify: true)"}),", etc. If you need to use ",(0,i.jsx)(n.code,{children:"self"}),", you might consider using ",(0,i.jsx)(n.code,{children:"config-methods(init: (self: none, body) => { .. })"})," to register an ",(0,i.jsx)(n.code,{children:"init"})," method."]}),"\n",(0,i.jsxs)(n.p,{children:["As you can see, later in ",(0,i.jsx)(n.code,{children:"main.typ"}),", we apply our style settings through ",(0,i.jsx)(n.code,{children:'#show: bamboo-theme.with(aspect-ratio: "16-9")'}),", and internally ",(0,i.jsx)(n.code,{children:"bamboo"})," uses ",(0,i.jsx)(n.code,{children:"show: touying-slides.with()"})," for corresponding configurations."]}),"\n",(0,i.jsx)(n.h2,{id:"color-theme",children:"Color Theme"}),"\n",(0,i.jsxs)(n.p,{children:["Picking an aesthetically pleasing color theme for your slides is key to making good slides. Touying provides built-in color theme support to minimize API differences between different themes. Touying offers two dimensions of color selection. The first dimension is ",(0,i.jsx)(n.code,{children:"neutral"}),", ",(0,i.jsx)(n.code,{children:"primary"}),", ",(0,i.jsx)(n.code,{children:"secondary"}),", and ",(0,i.jsx)(n.code,{children:"tertiary"}),", which are used to distinguish color tones, with ",(0,i.jsx)(n.code,{children:"primary"})," being the most commonly used theme color. The second dimension is ",(0,i.jsx)(n.code,{children:"default"}),", ",(0,i.jsx)(n.code,{children:"light"}),", ",(0,i.jsx)(n.code,{children:"lighter"}),", ",(0,i.jsx)(n.code,{children:"lightest"}),", ",(0,i.jsx)(n.code,{children:"dark"}),", ",(0,i.jsx)(n.code,{children:"darker"}),", ",(0,i.jsx)(n.code,{children:"darkest"}),", which are used to distinguish brightness levels."]}),"\n",(0,i.jsxs)(n.p,{children:["Since we are creating the Bamboo theme, we have chosen a color close to bamboo for the ",(0,i.jsx)(n.code,{children:"primary"})," theme color, ",(0,i.jsx)(n.code,{children:'rgb("#5E8B65")'}),", and added neutral colors ",(0,i.jsx)(n.code,{children:"neutral-lightest"}),", ",(0,i.jsx)(n.code,{children:"neutral-darkest"}),", respectively, as the background and font colors."]}),"\n",(0,i.jsxs)(n.p,{children:["As shown in the following code, we can use the ",(0,i.jsx)(n.code,{children:"config-colors()"})," method to modify the color theme. Its essence is a wrapper for ",(0,i.jsx)(n.code,{children:"self.colors += (..)"}),"."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-typst",children:'#let bamboo-theme(\n aspect-ratio: "16-9",\n ..args,\n body,\n) = {\n set text(size: 20pt)\n\n show: touying-slides.with(\n config-page(paper: "presentation-" + aspect-ratio),\n config-common(\n slide-fn: slide,\n ),\n config-colors(\n primary: rgb("#5E8B65"),\n neutral-lightest: rgb("#ffffff"),\n neutral-darkest: rgb("#000000"),\n ),\n ..args,\n )\n\n body\n}\n'})}),"\n",(0,i.jsxs)(n.p,{children:["After adding the color theme as shown above, we can access this color through ",(0,i.jsx)(n.code,{children:"self.colors.primary"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["It's also worth noting that users can change the color theme at any time in ",(0,i.jsx)(n.code,{children:"main.typ"})," by using ",(0,i.jsx)(n.code,{children:"config-colors()"})," or"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-typst",children:'#show: touying-set-config.with(config-colors(\n primary: blue,\n neutral-lightest: rgb("#ffffff"),\n neutral-darkest: rgb("#000000"),\n))\n'})}),"\n",(0,i.jsx)(n.p,{children:"This feature of being able to change the color theme at any time is a testament to Touying's powerful customizability."}),"\n",(0,i.jsx)(n.h2,{id:"practical-custom-alert-method",children:"Practical: Custom Alert Method"}),"\n",(0,i.jsxs)(n.p,{children:["Generally, we need to provide a ",(0,i.jsx)(n.code,{children:"#alert[..]"})," function for users, similar to ",(0,i.jsx)(n.code,{children:"#strong[..]"}),", both of which are used to emphasize the current text. Typically, ",(0,i.jsx)(n.code,{children:"#alert[..]"})," will change the text color to the theme color, which will look more aesthetically pleasing, and this is our next goal."]}),"\n",(0,i.jsxs)(n.p,{children:["We add a line in the ",(0,i.jsx)(n.code,{children:"register"})," function:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-typst",children:"config-methods(alert: (self: none, it) => text(fill: self.colors.primary, it))\n"})}),"\n",(0,i.jsxs)(n.p,{children:["This code means to change the text color to ",(0,i.jsx)(n.code,{children:"self.colors.primary"}),", and the ",(0,i.jsx)(n.code,{children:"self"})," here is passed in through the parameter ",(0,i.jsx)(n.code,{children:"self: none"}),", so that we can get the ",(0,i.jsx)(n.code,{children:"primary"})," theme color in real-time."]}),"\n",(0,i.jsx)(n.p,{children:"We can also use a shorthand."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-typst",children:"config-methods(alert: utils.alert-with-primary-color)\n"})}),"\n",(0,i.jsx)(n.h2,{id:"custom-header-and-footer",children:"Custom Header and Footer"}),"\n",(0,i.jsx)(n.p,{children:"Here, I assume you have read the page layout section, so we know that we should add a header and footer to the slides."}),"\n",(0,i.jsxs)(n.p,{children:["First, we add ",(0,i.jsx)(n.code,{children:"config-store(title: none)"}),", which means that we save the current slide's title as a member variable ",(0,i.jsx)(n.code,{children:"self.store.title"})," inside ",(0,i.jsx)(n.code,{children:"self"}),", making it convenient for us to use in the header and for subsequent modifications. Similarly, we also create a ",(0,i.jsx)(n.code,{children:"config-store(footer: footer)"})," and save the ",(0,i.jsx)(n.code,{children:"footer: none"})," parameter of the ",(0,i.jsx)(n.code,{children:"bamboo-theme"})," function for display in the footer at the bottom left corner."]}),"\n",(0,i.jsxs)(n.p,{children:["Then it's worth noting that our header is actually a content function with ",(0,i.jsx)(n.code,{children:"self"})," as a parameter, like ",(0,i.jsx)(n.code,{children:"let header(self) = { .. }"}),", rather than a simple content, so that we can get the information we need from the latest ",(0,i.jsx)(n.code,{children:"self"}),", such as ",(0,i.jsx)(n.code,{children:"self.store.title"}),". The footer is the same."]}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"components.cell"})," used here is actually ",(0,i.jsx)(n.code,{children:"#let cell = block.with(width: 100%, height: 100%, above: 0pt, below: 0pt, breakable: false)"}),", and ",(0,i.jsx)(n.code,{children:"show: components.cell"})," is also a shorthand for ",(0,i.jsx)(n.code,{children:"components.cell(body)"}),", and the ",(0,i.jsx)(n.code,{children:"show: pad.with(.4em)"})," for the footer is the same."]}),"\n",(0,i.jsxs)(n.p,{children:["Another point to note is that the ",(0,i.jsx)(n.code,{children:"utils"})," module contains many contents and methods related to counters and states, such as ",(0,i.jsx)(n.code,{children:"utils.display-current-heading(level: 1)"})," for displaying the current ",(0,i.jsx)(n.code,{children:"section"}),", and ",(0,i.jsx)(n.code,{children:'context utils.slide-counter.display() + " / " + utils.last-slide-number'})," for displaying the current page number and total number of pages."]}),"\n",(0,i.jsxs)(n.p,{children:["We also find that we use syntax like ",(0,i.jsx)(n.code,{children:"utils.call-or-display(self, self.store.footer)"})," to display ",(0,i.jsx)(n.code,{children:"self.store.footer"}),", which is to deal with the situation of ",(0,i.jsx)(n.code,{children:"self.store.footer = self => {..}"}),", so that we can unify the display of content functions and content."]}),"\n",(0,i.jsxs)(n.p,{children:["To ensure that the header and footer are displayed correctly and have enough spacing from the main text, we need to set the margin, such as ",(0,i.jsx)(n.code,{children:"config-page(margin: (top: 4em, bottom: 1.5em, x: 2em))"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["We also need to customize a ",(0,i.jsx)(n.code,{children:"slide"})," method, which accepts ",(0,i.jsx)(n.code,{children:"#let slide(title: auto, ..args) = touying-slide-wrapper(self => {..})"}),", where ",(0,i.jsx)(n.code,{children:"self"})," in the callback function is a required parameter to get the latest ",(0,i.jsx)(n.code,{children:"self"}),"; the second ",(0,i.jsx)(n.code,{children:"title"})," is used to update ",(0,i.jsx)(n.code,{children:"self.store.title"})," for display in the header; the third ",(0,i.jsx)(n.code,{children:"..args"})," is used to collect the remaining parameters and pass them to ",(0,i.jsx)(n.code,{children:"touying-slide(self: self, ..args)"}),", which is also necessary for the normal functioning of Touying's ",(0,i.jsx)(n.code,{children:"slide"})," feature. Moreover, we need to register this method in the ",(0,i.jsx)(n.code,{children:"bamboo-theme"})," function using ",(0,i.jsx)(n.code,{children:"config-methods(slide: slide)"}),"."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-typst",children:'// bamboo.typ\n#import "@preview/touying:0.5.3": *\n\n#let slide(title: auto, ..args) = touying-slide-wrapper(self => {\n if title != auto {\n self.store.title = title\n }\n // set page\n let header(self) = {\n set align(top)\n show: components.cell.with(fill: self.colors.primary, inset: 1em)\n set align(horizon)\n set text(fill: self.colors.neutral-lightest, size: .7em)\n utils.display-current-heading(level: 1)\n linebreak()\n set text(size: 1.5em)\n if self.store.title != none {\n utils.call-or-display(self, self.store.title)\n } else {\n utils.display-current-heading(level: 2)\n }\n }\n let footer(self) = {\n set align(bottom)\n show: pad.with(.4em)\n set text(fill: self.colors.neutral-darkest, size: .8em)\n utils.call-or-display(self, self.store.footer)\n h(1fr)\n context utils.slide-counter.display() + " / " + utils.last-slide-number\n }\n self = utils.merge-dicts(\n self,\n config-page(\n header: header,\n footer: footer,\n ),\n )\n touying-slide(self: self, ..args)\n})\n\n#let bamboo-theme(\n aspect-ratio: "16-9",\n footer: none,\n ..args,\n body,\n) = {\n set text(size: 20pt)\n\n show: touying-slides.with(\n config-page(\n paper: "presentation-" + aspect-ratio,\n margin: (top: 4em, bottom: 1.5em, x: 2em),\n ),\n config-common(\n slide-fn: slide,\n ),\n config-methods(\n alert: utils.alert-with-primary-color,\n ),\n config-colors(\n primary: rgb("#5E8B65"),\n neutral-lightest: rgb("#ffffff"),\n neutral-darkest: rgb("#000000"),\n ),\n config-store(\n title: none,\n footer: footer,\n ),\n ..args,\n )\n\n body\n}\n\n\n// main.typ\n#import "@preview/touying:0.5.3": *\n#import "bamboo.typ": *\n\n#show: bamboo-theme.with(aspect-ratio: "16-9")\n\n= First Section\n\n== First Slide\n\nA slide with a title and an *important* information.\n'})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://github.com/touying-typ/touying/assets/34951714/d33bcda7-c032-4b11-b392-5b939d9a0a47",alt:"image"})}),"\n",(0,i.jsx)(n.h2,{id:"custom-special-slides",children:"Custom Special Slides"}),"\n",(0,i.jsxs)(n.p,{children:["On the basis of the basic slides we've created, we further add some special slide functions, such as ",(0,i.jsx)(n.code,{children:"title-slide"}),", ",(0,i.jsx)(n.code,{children:"focus-slide"}),", and custom ",(0,i.jsx)(n.code,{children:"slides"})," methods."]}),"\n",(0,i.jsxs)(n.p,{children:["For the ",(0,i.jsx)(n.code,{children:"title-slide"})," method, first, we can obtain the information saved in ",(0,i.jsx)(n.code,{children:"self.info"})," through ",(0,i.jsx)(n.code,{children:"let info = self.info + args.named()"}),", and we can also update the information with ",(0,i.jsx)(n.code,{children:"args.named()"})," passed in through the function parameters for subsequent use in the form of ",(0,i.jsx)(n.code,{children:"info.title"}),". The specific page content ",(0,i.jsx)(n.code,{children:"body"})," will vary for each theme, so I won't go into too much detail here."]}),"\n",(0,i.jsxs)(n.p,{children:["For the ",(0,i.jsx)(n.code,{children:"new-section-slide"})," method, it's the same, but the only thing to note is that we registered ",(0,i.jsx)(n.code,{children:"new-section-slide-fn: new-section-slide"})," in ",(0,i.jsx)(n.code,{children:"config-methods()"}),", so ",(0,i.jsx)(n.code,{children:"new-section-slide"})," will be automatically called when encountering a first-level heading."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-typst",children:'// bamboo.typ\n#import "@preview/touying:0.5.3": *\n\n#let slide(title: auto, ..args) = touying-slide-wrapper(self => {\n if title != auto {\n self.store.title = title\n }\n // set page\n let header(self) = {\n set align(top)\n show: components.cell.with(fill: self.colors.primary, inset: 1em)\n set align(horizon)\n set text(fill: self.colors.neutral-lightest, size: .7em)\n utils.display-current-heading(level: 1)\n linebreak()\n set text(size: 1.5em)\n if self.store.title != none {\n utils.call-or-display(self, self.store.title)\n } else {\n utils.display-current-heading(level: 2)\n }\n }\n let footer(self) = {\n set align(bottom)\n show: pad.with(.4em)\n set text(fill: self.colors.neutral-darkest, size: .8em)\n utils.call-or-display(self, self.store.footer)\n h(1fr)\n context utils.slide-counter.display() + " / " + utils.last-slide-number\n }\n self = utils.merge-dicts(\n self,\n config-page(\n header: header,\n footer: footer,\n ),\n )\n touying-slide(self: self, ..args)\n})\n\n#let title-slide(..args) = touying-slide-wrapper(self => {\n let info = self.info + args.named()\n let body = {\n set align(center + horizon)\n block(\n fill: self.colors.primary,\n width: 80%,\n inset: (y: 1em),\n radius: 1em,\n text(size: 2em, fill: self.colors.neutral-lightest, weight: "bold", info.title),\n )\n set text(fill: self.colors.neutral-darkest)\n if info.author != none {\n block(info.author)\n }\n if info.date != none {\n block(utils.display-info-date(self))\n }\n }\n touying-slide(self: self, body)\n})\n\n#let new-section-slide(self: none, body) = touying-slide-wrapper(self => {\n let main-body = {\n set align(center + horizon)\n set text(size: 2em, fill: self.colors.primary, weight: "bold", style: "italic")\n utils.display-current-heading(level: 1)\n }\n touying-slide(self: self, main-body)\n})\n\n#let focus-slide(body) = touying-slide-wrapper(self => {\n self = utils.merge-dicts(\n self,\n config-page(\n fill: self.colors.primary,\n margin: 2em,\n ),\n )\n set text(fill: self.colors.neutral-lightest, size: 2em)\n touying-slide(self: self, align(horizon + center, body))\n})\n\n#let bamboo-theme(\n aspect-ratio: "16-9",\n footer: none,\n ..args,\n body,\n) = {\n set text(size: 20pt)\n\n show: touying-slides.with(\n config-page(\n paper: "presentation-" + aspect-ratio,\n margin: (top: 4em, bottom: 1.5em, x: 2em),\n ),\n config-common(\n slide-fn: slide,\n new-section-slide-fn: new-section-slide,\n ),\n config-methods(alert: utils.alert-with-primary-color),\n config-colors(\n primary: rgb("#5E8B65"),\n neutral-lightest: rgb("#ffffff"),\n neutral-darkest: rgb("#000000"),\n ),\n config-store(\n title: none,\n footer: footer,\n ),\n ..args,\n )\n\n body\n}\n\n\n// main.typ\n#import "@preview/touying:0.5.3": *\n#import "bamboo.typ": *\n\n#show: bamboo-theme.with(\n aspect-ratio: "16-9",\n footer: self => self.info.institution,\n config-info(\n title: [Title],\n subtitle: [Subtitle],\n author: [Authors],\n date: datetime.today(),\n institution: [Institution],\n ),\n)\n\n#title-slide()\n\n= First Section\n\n== First Slide\n\nA slide with a title and an *important* information.\n\n#focus-slide[\n Focus on it!\n]\n'})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://github.com/touying-typ/touying/assets/34951714/03c5ad02-8ff4-4068-9664-d9cfad79baaf",alt:"image"})}),"\n",(0,i.jsx)(n.h2,{id:"conclusion",children:"Conclusion"}),"\n",(0,i.jsx)(n.p,{children:"Congratulations! You've created a simple and elegant theme. Perhaps you may find that Touying introduces a wealth of concepts, making it initially challenging to grasp. This is normal, as Touying opts for functionality over simplicity. However, thanks to Touying's comprehensive and unified approach, you can easily extract commonalities between different themes and transfer your knowledge seamlessly. You can also save global variables, modify existing themes, or switch between themes effortlessly, showcasing the benefits of Touying's decoupling."})]})}function h(e={}){const{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>r,a:()=>l});var i=t(7294);const o={},s=i.createContext(o);function l(e){const n=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:l(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/main.f71bc4b4.js b/assets/js/main.87db3418.js
similarity index 99%
rename from assets/js/main.f71bc4b4.js
rename to assets/js/main.87db3418.js
index eb6eaf2c..71312f8d 100644
--- a/assets/js/main.f71bc4b4.js
+++ b/assets/js/main.87db3418.js
@@ -1,2 +1,2 @@
-/*! For license information please see main.f71bc4b4.js.LICENSE.txt */
-(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[179],{723:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});n(7294);var r=n(8356),o=n.n(r),a=n(6887);const i={"018a1506":[()=>n.e(69).then(n.bind(n,3390)),"@site/versioned_docs/version-0.3.2+/code-styles.md",3390],"01a85c17":[()=>Promise.all([n.e(532),n.e(4013)]).then(n.bind(n,1223)),"@theme/BlogTagsListPage",1223],"024af9ce":[()=>n.e(6902).then(n.bind(n,8154)),"@site/versioned_docs/version-0.4.0+/utilities/oop.md",8154],"0275f7e4":[()=>n.e(1560).then(n.bind(n,1898)),"@site/versioned_docs/version-0.2.x/progress/counters.md",1898],"02f62403":[()=>n.e(7836).then(n.bind(n,7837)),"@site/versioned_docs/version-0.3.x/sections.md",7837],"0479d12b":[()=>n.e(4621).then(n.bind(n,3498)),"@site/versioned_docs/version-0.3.2+/utilities/oop.md",3498],"04b649ca":[()=>n.e(1089).then(n.bind(n,4519)),"@site/versioned_docs/version-0.4.0+/themes/university.md",4519],"05206b71":[()=>n.e(8881).then(n.bind(n,4693)),"@site/versioned_docs/version-0.4.0+/external/pdfpc.md",4693],"05ed0e1f":[()=>n.e(7503).then(n.bind(n,8338)),"@site/versioned_docs/version-0.4.0+/themes/aqua.md",8338],"06e97d6d":[()=>n.e(7899).then(n.bind(n,225)),"@site/versioned_docs/version-0.4.2/external/pympress.md",225],"072a110d":[()=>n.e(4061).then(n.bind(n,3074)),"@site/versioned_docs/version-0.4.2/code-styles.md",3074],"080c9bd0":[()=>n.e(417).then(n.bind(n,137)),"@site/versioned_docs/version-0.3.x/external/pdfpc.md",137],"09d28271":[()=>n.e(498).then(n.t.bind(n,4746,19)),"~docs/default/category-docs-040-tutorialsidebar-category-external-tools-158.json",4746],"09ecdeab":[()=>n.e(9139).then(n.bind(n,7396)),"@site/docs/dynamic/cover.md",7396],"0b163c46":[()=>n.e(6486).then(n.bind(n,2502)),"@site/versioned_docs/version-0.4.2/multi-file.md",2502],"0d1c87af":[()=>n.e(2792).then(n.bind(n,2006)),"@site/docs/themes/aqua.md",2006],"0e384e19":[()=>n.e(9671).then(n.bind(n,7876)),"@site/docs/intro.md",7876],"0e3bf0ec":[()=>n.e(8211).then(n.bind(n,5114)),"@site/versioned_docs/version-0.5.x/dynamic/complex.md",5114],"0ecafbc3":[()=>n.e(8201).then(n.t.bind(n,6687,19)),"~docs/default/category-docs-032-tutorialsidebar-category-utilities-d3e.json",6687],"0ed1cf13":[()=>n.e(4245).then(n.bind(n,2936)),"@site/versioned_docs/version-0.4.2/themes/university.md",2936],11366869:[()=>n.e(5428).then(n.bind(n,7159)),"@site/versioned_docs/version-0.3.2+/utilities/fit-to.md",7159],"116fbef0":[()=>n.e(2432).then(n.bind(n,1529)),"@site/versioned_docs/version-0.3.x/integration/cetz.md",1529],"11b282fc":[()=>n.e(8814).then(n.bind(n,8079)),"@site/versioned_docs/version-0.2.x/dynamic/complex.md",8079],"139ef754":[()=>n.e(8016).then(n.bind(n,3717)),"@site/versioned_docs/version-0.5.x/themes/dewdrop.md",3717],"14eb3368":[()=>Promise.all([n.e(532),n.e(9817)]).then(n.bind(n,4228)),"@theme/DocCategoryGeneratedIndexPage",4228],"1514c4f3":[()=>n.e(3651).then(n.bind(n,118)),"@site/versioned_docs/version-0.3.2+/integration/fletcher.md",118],"16a5b323":[()=>n.e(7140).then(n.bind(n,1871)),"@site/versioned_docs/version-0.4.1/integration/fletcher.md",1871],"173c8b24":[()=>n.e(4733).then(n.bind(n,6130)),"@site/versioned_docs/version-0.3.x/themes/metropolis.md",6130],17588091:[()=>n.e(4823).then(n.bind(n,3706)),"@site/versioned_docs/version-0.3.x/changelog.md",3706],17896441:[()=>Promise.all([n.e(532),n.e(9206),n.e(7918)]).then(n.bind(n,5154)),"@theme/DocItem",5154],"1aab1ab5":[()=>n.e(2701).then(n.t.bind(n,4533,19)),"~docs/default/version-0-3-2-metadata-prop-d6b.json",4533],"1adbd46f":[()=>n.e(7323).then(n.t.bind(n,1219,19)),"~docs/default/category-docs-032-tutorialsidebar-category-progress-e05.json",1219],"1b6fd54f":[()=>n.e(5921).then(n.bind(n,479)),"@site/versioned_docs/version-0.3.2+/intro.md",479],"1bf261d1":[()=>n.e(8271).then(n.bind(n,8593)),"@site/versioned_docs/version-0.4.1/themes/metropolis.md",8593],"1cf5eacf":[()=>n.e(5635).then(n.t.bind(n,8322,19)),"~docs/default/version-0-4-0-metadata-prop-2ad.json",8322],"1ea66885":[()=>n.e(9985).then(n.bind(n,5099)),"@site/versioned_docs/version-0.4.1/multi-file.md",5099],"1f391b9e":[()=>Promise.all([n.e(532),n.e(9206),n.e(3085)]).then(n.bind(n,4247)),"@theme/MDXPage",4247],"1f532c1a":[()=>n.e(224).then(n.t.bind(n,1910,19)),"~docs/default/category-docsnext-tutorialsidebar-category-progress-e71.json",1910],"1f894b1c":[()=>n.e(741).then(n.t.bind(n,572,19)),"~docs/default/category-docs-03-x-tutorialsidebar-category-external-tools-46b.json",572],"2073d020":[()=>n.e(2964).then(n.bind(n,3701)),"@site/versioned_docs/version-0.4.2/dynamic/cover.md",3701],"2177108b":[()=>n.e(3943).then(n.t.bind(n,309,19)),"~docs/default/category-docs-tutorialsidebar-category-dynamic-slides-721.json",309],"2227535b":[()=>n.e(1417).then(n.bind(n,8700)),"@site/versioned_docs/version-0.5.x/external/pympress.md",8700],"238fa700":[()=>n.e(44).then(n.bind(n,7522)),"@site/versioned_docs/version-0.5.x/themes/metropolis.md",7522],"2553c37c":[()=>n.e(5526).then(n.bind(n,2382)),"@site/versioned_docs/version-0.3.2+/build-your-own-theme.md",2382],"2659fc90":[()=>n.e(5437).then(n.bind(n,932)),"@site/versioned_docs/version-0.5.x/multi-file.md",932],"267f059f":[()=>n.e(2786).then(n.bind(n,5580)),"@site/versioned_docs/version-0.2.x/external/pdfpc.md",5580],"286c2c64":[()=>n.e(6296).then(n.bind(n,5374)),"@site/versioned_docs/version-0.3.x/dynamic/simple.md",5374],"28a86b5d":[()=>n.e(4447).then(n.bind(n,2970)),"@site/versioned_docs/version-0.3.x/build-your-own-theme.md",2970],"293f9c83":[()=>n.e(8088).then(n.bind(n,9547)),"@site/docs/integration/cetz.md",9547],"29a36bd7":[()=>n.e(4694).then(n.t.bind(n,3061,19)),"~blog/default/blog-tags-development-9e5-list.json",3061],"2ad3b083":[()=>n.e(4282).then(n.bind(n,5704)),"@site/versioned_docs/version-0.5.x/themes/aqua.md",5704],"2b13119a":[()=>n.e(9027).then(n.bind(n,629)),"@site/versioned_docs/version-0.3.2+/sections.md",629],"2b886b59":[()=>n.e(4645).then(n.bind(n,5186)),"@site/versioned_docs/version-0.4.2/integration/cetz.md",5186],"2b9fd23c":[()=>n.e(7545).then(n.bind(n,7512)),"@site/versioned_docs/version-0.2.x/changelog.md",7512],"2c0b54ac":[()=>n.e(80).then(n.bind(n,8925)),"@site/docs/utilities/fit-to.md",8925],"2cc1595c":[()=>n.e(5616).then(n.bind(n,6411)),"@site/versioned_docs/version-0.2.x/dynamic/other.md",6411],"2d4a7f47":[()=>n.e(9183).then(n.bind(n,9763)),"@site/blog/2024-01-17-touying-0-2-0.md",9763],"3018dfec":[()=>n.e(308).then(n.bind(n,158)),"@site/versioned_docs/version-0.5.x/layout.md",158],"30e9e8ba":[()=>n.e(8694).then(n.bind(n,5129)),"@site/versioned_docs/version-0.4.0+/integration/mitex.md",5129],"3143bd0d":[()=>n.e(2529).then(n.bind(n,2705)),"@site/versioned_docs/version-0.3.2+/external/typst-preview.md",2705],"32e572c7":[()=>n.e(2340).then(n.t.bind(n,1564,19)),"~docs/default/category-docs-tutorialsidebar-category-utilities-89d.json",1564],"332622f2":[()=>n.e(7256).then(n.bind(n,4149)),"@site/versioned_docs/version-0.4.1/dynamic/equation.md",4149],"33b22e37":[()=>n.e(8937).then(n.bind(n,4911)),"@site/versioned_docs/version-0.4.1/integration/ctheorems.md",4911],"340f1526":[()=>n.e(1893).then(n.bind(n,4405)),"@site/versioned_docs/version-0.3.2+/changelog.md",4405],"34ff0b4c":[()=>n.e(8084).then(n.bind(n,9634)),"@site/versioned_docs/version-0.3.x/intro.md",9634],"359eb289":[()=>n.e(5651).then(n.bind(n,4153)),"@site/versioned_docs/version-0.4.0+/changelog.md",4153],"360788d8":[()=>n.e(6275).then(n.t.bind(n,2860,19)),"~docs/default/category-docs-040-tutorialsidebar-category-package-integration-978.json",2860],"38682d35":[()=>n.e(9413).then(n.bind(n,346)),"@site/versioned_docs/version-0.3.x/themes/simple.md",346],"38803c52":[()=>n.e(6721).then(n.bind(n,1217)),"@site/versioned_docs/version-0.2.x/themes/university.md",1217],"393be207":[()=>n.e(7414).then(n.bind(n,1181)),"@site/src/pages/markdown-page.md",1181],39430005:[()=>n.e(9619).then(n.bind(n,4057)),"@site/docs/dynamic/other.md",4057],"395814e0":[()=>n.e(2630).then(n.t.bind(n,2246,19)),"~docs/default/category-docs-041-tutorialsidebar-category-utilities-9df.json",2246],"396cf6b9":[()=>n.e(9705).then(n.bind(n,4885)),"@site/docs/dynamic/simple.md",4885],"3b0a1f02":[()=>n.e(7460).then(n.bind(n,5644)),"@site/versioned_docs/version-0.4.1/integration/pinit.md",5644],"3c6c49a5":[()=>n.e(9799).then(n.bind(n,9342)),"@site/versioned_docs/version-0.4.1/progress/sections.md",9342],"3f2877b5":[()=>n.e(8350).then(n.bind(n,5813)),"@site/docs/integration/fletcher.md",5813],"3f5a5931":[()=>n.e(7257).then(n.bind(n,429)),"@site/versioned_docs/version-0.5.x/dynamic/simple.md",429],"3fefcd96":[()=>n.e(6518).then(n.bind(n,9235)),"@site/versioned_docs/version-0.3.2+/start.md",9235],"40f02aaa":[()=>n.e(7857).then(n.bind(n,6239)),"@site/versioned_docs/version-0.4.2/external/typst-preview.md",6239],"41abee02":[()=>n.e(3994).then(n.bind(n,2110)),"@site/versioned_docs/version-0.3.x/dynamic/equation.md",2110],"41b4e7a8":[()=>n.e(9949).then(n.t.bind(n,9505,19)),"~docs/default/category-docsnext-tutorialsidebar-category-package-integration-c64.json",9505],"428c02a9":[()=>n.e(5424).then(n.t.bind(n,3998,19)),"~docs/default/category-docs-042-tutorialsidebar-category-package-integration-078.json",3998],"461a3691":[()=>n.e(8737).then(n.t.bind(n,7156,19)),"~docs/default/category-docsnext-tutorialsidebar-category-external-tools-f23.json",7156],"472f8a66":[()=>n.e(8565).then(n.bind(n,2857)),"@site/docs/layout.md",2857],"4919068e":[()=>n.e(5313).then(n.bind(n,9575)),"@site/versioned_docs/version-0.4.0+/sections.md",9575],"495c719e":[()=>n.e(1400).then(n.bind(n,7102)),"@site/versioned_docs/version-0.3.2+/integration/polylux.md",7102],"49841adc":[()=>n.e(819).then(n.bind(n,4847)),"@site/versioned_docs/version-0.4.1/start.md",4847],"49c05bac":[()=>n.e(8235).then(n.bind(n,7965)),"@site/versioned_docs/version-0.4.2/dynamic/handout.md",7965],"4bb9edb3":[()=>n.e(3280).then(n.bind(n,567)),"@site/docs/dynamic/equation.md",567],"4c713790":[()=>n.e(3389).then(n.bind(n,4760)),"@site/versioned_docs/version-0.3.x/external/typst-preview.md",4760],"4e3d17c1":[()=>n.e(4067).then(n.bind(n,8284)),"@site/versioned_docs/version-0.4.0+/global-settings.md",8284],"4e747cbf":[()=>n.e(6488).then(n.t.bind(n,6929,19)),"~docs/default/category-docs-03-x-tutorialsidebar-category-package-integration-cb3.json",6929],"4fabf2f1":[()=>n.e(9090).then(n.bind(n,4825)),"@site/versioned_docs/version-0.3.x/themes/dewdrop.md",4825],"5057383c":[()=>n.e(5854).then(n.bind(n,3242)),"@site/docs/external/pympress.md",3242],"50b41f0d":[()=>n.e(4684).then(n.bind(n,752)),"@site/versioned_docs/version-0.5.x/sections.md",752],"50bbeff9":[()=>n.e(8367).then(n.bind(n,3690)),"@site/versioned_docs/version-0.5.x/external/typst-preview.md",3690],"51a4d3bf":[()=>n.e(2289).then(n.bind(n,4728)),"@site/docs/dynamic/complex.md",4728],"51f6a377":[()=>n.e(873).then(n.bind(n,2334)),"@site/versioned_docs/version-0.4.1/dynamic/complex.md",2334],"5297811e":[()=>n.e(7504).then(n.bind(n,7161)),"@site/versioned_docs/version-0.3.2+/external/pdfpc.md",7161],"52c10a2f":[()=>n.e(5671).then(n.bind(n,8741)),"@site/versioned_docs/version-0.5.x/themes/simple.md",8741],"54e3aac2":[()=>n.e(9213).then(n.bind(n,9919)),"@site/versioned_docs/version-0.4.2/dynamic/equation.md",9919],"5539901a":[()=>n.e(5701).then(n.bind(n,9275)),"@site/versioned_docs/version-0.4.0+/dynamic/cover.md",9275],"555ecac1":[()=>n.e(6662).then(n.bind(n,4620)),"@site/versioned_docs/version-0.2.x/start.md",4620],"55b57bd3":[()=>n.e(6259).then(n.bind(n,4628)),"@site/docs/integration/ctheorems.md",4628],"5670b452":[()=>n.e(997).then(n.bind(n,2261)),"@site/docs/build-your-own-theme.md",2261],"5806a9e1":[()=>n.e(1827).then(n.bind(n,9288)),"@site/versioned_docs/version-0.4.0+/progress/counters.md",9288],"58092a00":[()=>n.e(6099).then(n.bind(n,8018)),"@site/versioned_docs/version-0.3.2+/integration/pinit.md",8018],58132609:[()=>n.e(6175).then(n.bind(n,1161)),"@site/versioned_docs/version-0.4.0+/progress/sections.md",1161],"583d85fc":[()=>n.e(3715).then(n.bind(n,2069)),"@site/versioned_docs/version-0.3.x/integration/mitex.md",2069],"5848d47c":[()=>n.e(3845).then(n.bind(n,9456)),"@site/versioned_docs/version-0.4.2/utilities/fit-to.md",9456],"58f0297b":[()=>n.e(1330).then(n.t.bind(n,2528,19)),"~docs/default/category-docsnext-tutorialsidebar-category-utilities-432.json",2528],"5a3af86b":[()=>n.e(7991).then(n.bind(n,7906)),"@site/versioned_docs/version-0.4.1/themes/university.md",7906],"5a57e638":[()=>n.e(2143).then(n.bind(n,8811)),"@site/docs/themes/simple.md",8811],"5a6cbd5b":[()=>n.e(1375).then(n.bind(n,6288)),"@site/versioned_docs/version-0.5.x/progress/sections.md",6288],"5b27bc59":[()=>n.e(3969).then(n.bind(n,4154)),"@site/docs/dynamic/handout.md",4154],"5b3786b7":[()=>n.e(832).then(n.t.bind(n,5097,19)),"~docs/default/category-docs-040-tutorialsidebar-category-utilities-357.json",5097],"5c062049":[()=>n.e(263).then(n.bind(n,2403)),"@site/versioned_docs/version-0.3.2+/dynamic/other.md",2403],"5d410c12":[()=>n.e(8912).then(n.bind(n,4734)),"@site/versioned_docs/version-0.4.1/progress/counters.md",4734],"5d4c6151":[()=>n.e(294).then(n.bind(n,9761)),"@site/versioned_docs/version-0.5.x/changelog.md",9761],"5de4625c":[()=>n.e(438).then(n.bind(n,2255)),"@site/versioned_docs/version-0.4.0+/themes/dewdrop.md",2255],"5e95c892":[()=>n.e(9661).then(n.bind(n,1892)),"@theme/DocsRoot",1892],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,6809)),"@generated/docusaurus.config",6809],"5ed554a8":[()=>n.e(2829).then(n.bind(n,828)),"@site/versioned_docs/version-0.4.1/themes/simple.md",828],"5fecb693":[()=>n.e(64).then(n.bind(n,9588)),"@site/versioned_docs/version-0.4.2/themes/simple.md",9588],"5ff4e923":[()=>n.e(4372).then(n.bind(n,2588)),"@site/versioned_docs/version-0.4.1/external/pdfpc.md",2588],"626e34d0":[()=>n.e(1074).then(n.bind(n,4992)),"@site/versioned_docs/version-0.5.x/themes/university.md",4992],"62c811b9":[()=>n.e(642).then(n.t.bind(n,4922,19)),"~docs/default/category-docs-042-tutorialsidebar-category-external-tools-9a8.json",4922],"64ea200d":[()=>n.e(2112).then(n.bind(n,128)),"@site/versioned_docs/version-0.4.2/dynamic/other.md",128],"65e4303d":[()=>n.e(4042).then(n.bind(n,8487)),"@site/versioned_docs/version-0.4.0+/dynamic/complex.md",8487],"65e4cc1e":[()=>n.e(5598).then(n.bind(n,349)),"@site/versioned_docs/version-0.2.x/intro.md",349],"6607fcb6":[()=>n.e(8332).then(n.bind(n,3732)),"@site/docs/multi-file.md",3732],"661132b8":[()=>n.e(7092).then(n.t.bind(n,9572,19)),"~blog/default/blog-tags-development-9e5.json",9572],"678a4048":[()=>n.e(5122).then(n.bind(n,269)),"@site/versioned_docs/version-0.4.2/intro.md",269],"67bae27a":[()=>n.e(1860).then(n.bind(n,5462)),"@site/versioned_docs/version-0.3.x/integration/fletcher.md",5462],"6875c492":[()=>Promise.all([n.e(532),n.e(9206),n.e(9677),n.e(8610)]).then(n.bind(n,1714)),"@theme/BlogTagsPostsPage",1714],"68accac2":[()=>n.e(3388).then(n.bind(n,2869)),"@site/versioned_docs/version-0.5.x/integration/codly.md",2869],"697ece24":[()=>n.e(716).then(n.t.bind(n,1792,19)),"~docs/default/category-docs-042-tutorialsidebar-category-themes-5ed.json",1792],"69faa514":[()=>n.e(9646).then(n.t.bind(n,9862,19)),"~docs/default/category-docs-032-tutorialsidebar-category-package-integration-708.json",9862],"6ab829bd":[()=>n.e(5661).then(n.t.bind(n,495,19)),"~docs/default/category-docs-02-x-tutorialsidebar-category-progress-d91.json",495],"6c1ba8b1":[()=>n.e(5106).then(n.bind(n,5497)),"@site/versioned_docs/version-0.4.0+/integration/codly.md",5497],"6c8708e3":[()=>n.e(3376).then(n.bind(n,8655)),"@site/versioned_docs/version-0.3.2+/themes/simple.md",8655],"6d7ce909":[()=>n.e(5695).then(n.bind(n,689)),"@site/docs/external/typst-preview.md",689],"6dd14aab":[()=>n.e(458).then(n.bind(n,5820)),"@site/versioned_docs/version-0.5.x/build-your-own-theme.md",5820],"7032e634":[()=>n.e(108).then(n.bind(n,2218)),"@site/versioned_docs/version-0.4.2/build-your-own-theme.md",2218],"713fe878":[()=>n.e(8031).then(n.t.bind(n,5212,19)),"~docs/default/category-docs-03-x-tutorialsidebar-category-progress-6f0.json",5212],"71b26582":[()=>n.e(4187).then(n.bind(n,8194)),"@site/versioned_docs/version-0.4.2/integration/ctheorems.md",8194],"7240ac5a":[()=>n.e(3564).then(n.bind(n,9697)),"@site/versioned_docs/version-0.4.2/start.md",9697],"729d3e1e":[()=>n.e(9375).then(n.bind(n,3624)),"@site/versioned_docs/version-0.2.x/layout.md",3624],"730fef4c":[()=>n.e(8341).then(n.bind(n,5960)),"@site/versioned_docs/version-0.3.x/global-settings.md",5960],"7329c3b8":[()=>n.e(5431).then(n.bind(n,8412)),"@site/versioned_docs/version-0.3.2+/dynamic/cover.md",8412],"7381b349":[()=>n.e(9116).then(n.bind(n,3788)),"@site/versioned_docs/version-0.4.2/themes/dewdrop.md",3788],"73a6f857":[()=>n.e(9632).then(n.bind(n,8813)),"@site/versioned_docs/version-0.4.1/integration/cetz.md",8813],"743177ed":[()=>n.e(4432).then(n.bind(n,9230)),"@site/versioned_docs/version-0.4.1/layout.md",9230],"75a8515d":[()=>n.e(7351).then(n.t.bind(n,7884,19)),"~docs/default/category-docs-tutorialsidebar-category-package-integration-92b.json",7884],76911421:[()=>n.e(7577).then(n.bind(n,7441)),"@site/versioned_docs/version-0.4.1/dynamic/cover.md",7441],"77a6cbd2":[()=>n.e(1537).then(n.bind(n,3350)),"@site/versioned_docs/version-0.4.1/themes/aqua.md",3350],"77e3d78c":[()=>n.e(2191).then(n.bind(n,8465)),"@site/docs/progress/counters.md",8465],"78b57648":[()=>n.e(4952).then(n.bind(n,9508)),"@site/versioned_docs/version-0.4.1/external/typst-preview.md",9508],"7927a478":[()=>n.e(2847).then(n.bind(n,8139)),"@site/versioned_docs/version-0.4.0+/code-styles.md",8139],"79f179dd":[()=>n.e(8229).then(n.bind(n,5377)),"@site/versioned_docs/version-0.5.x/utilities/fit-to.md",5377],"7a63211b":[()=>n.e(5439).then(n.t.bind(n,2987,19)),"~docs/default/category-docs-040-tutorialsidebar-category-dynamic-slides-e46.json",2987],"7ba330a5":[()=>n.e(3135).then(n.bind(n,1525)),"@site/versioned_docs/version-0.2.x/dynamic/simple.md",1525],"7bec2371":[()=>n.e(8250).then(n.bind(n,8509)),"@site/versioned_docs/version-0.4.2/changelog.md",8509],"7c9c7243":[()=>n.e(1949).then(n.bind(n,1794)),"@site/versioned_docs/version-0.4.0+/build-your-own-theme.md",1794],"7d3539b2":[()=>n.e(4481).then(n.bind(n,6594)),"@site/docs/themes/university.md",6594],"7f50710c":[()=>n.e(5030).then(n.bind(n,5362)),"@site/versioned_docs/version-0.4.0+/themes/simple.md",5362],"7f65dfb7":[()=>n.e(6917).then(n.bind(n,2049)),"@site/docs/code-styles.md",2049],"80a0c88e":[()=>n.e(3209).then(n.bind(n,8135)),"@site/docs/themes/metropolis.md",8135],"80a29583":[()=>n.e(9380).then(n.t.bind(n,757,19)),"~docs/default/category-docs-032-tutorialsidebar-category-themes-2fb.json",757],"813e2576":[()=>n.e(1877).then(n.t.bind(n,5266,19)),"~docs/default/category-docs-02-x-tutorialsidebar-category-dynamic-slides-631.json",5266],"814f3328":[()=>n.e(2535).then(n.t.bind(n,5641,19)),"~blog/default/blog-post-list-prop-default.json",5641],"82487ba9":[()=>n.e(2865).then(n.bind(n,9191)),"@site/versioned_docs/version-0.2.x/dynamic/equation.md",9191],"8291abfb":[()=>n.e(4285).then(n.bind(n,8553)),"@site/versioned_docs/version-0.5.x/integration/ctheorems.md",8553],"832b8a10":[()=>n.e(8240).then(n.bind(n,3826)),"@site/versioned_docs/version-0.4.0+/multi-file.md",3826],"837b71b1":[()=>n.e(3116).then(n.t.bind(n,7992,19)),"~docs/default/category-docs-041-tutorialsidebar-category-external-tools-69f.json",7992],"850166d8":[()=>n.e(7335).then(n.bind(n,3338)),"@site/versioned_docs/version-0.2.x/utilities/oop.md",3338],"851c2574":[()=>n.e(9319).then(n.bind(n,6691)),"@site/versioned_docs/version-0.2.x/dynamic/cover.md",6691],"85bf372c":[()=>n.e(6764).then(n.t.bind(n,3769,19)),"/home/runner/work/touying-typ.github.io/touying-typ.github.io/.docusaurus/docusaurus-plugin-content-docs/default/plugin-route-context-module-100.json",3769],"864ebe97":[()=>n.e(6193).then(n.bind(n,6602)),"@site/versioned_docs/version-0.3.x/themes/university.md",6602],"86e5cb88":[()=>n.e(2830).then(n.bind(n,1628)),"@site/versioned_docs/version-0.3.x/utilities/oop.md",1628],"86f810a5":[()=>n.e(3134).then(n.bind(n,2109)),"@site/versioned_docs/version-0.3.2+/dynamic/handout.md",2109],"871be668":[()=>n.e(2210).then(n.t.bind(n,1095,19)),"~docs/default/category-docs-042-tutorialsidebar-category-utilities-a9d.json",1095],"886cfe15":[()=>n.e(8563).then(n.bind(n,7027)),"@site/versioned_docs/version-0.4.1/build-your-own-theme.md",7027],"890ef1f8":[()=>n.e(2751).then(n.bind(n,7758)),"@site/versioned_docs/version-0.4.0+/integration/cetz.md",7758],"898f6967":[()=>n.e(7535).then(n.t.bind(n,3056,19)),"~docs/default/category-docs-03-x-tutorialsidebar-category-dynamic-slides-8aa.json",3056],"8992ec7c":[()=>n.e(160).then(n.bind(n,6770)),"@site/versioned_docs/version-0.4.2/global-settings.md",6770],"89f39702":[()=>n.e(6114).then(n.bind(n,1431)),"@site/versioned_docs/version-0.2.x/progress/sections.md",1431],"8aab68b4":[()=>n.e(511).then(n.bind(n,5294)),"@site/versioned_docs/version-0.4.1/dynamic/simple.md",5294],"8ac96054":[()=>n.e(9527).then(n.bind(n,3680)),"@site/docs/external/pdfpc.md",3680],"8e2c1ca5":[()=>n.e(4618).then(n.bind(n,9e3)),"@site/versioned_docs/version-0.4.0+/utilities/fit-to.md",9e3],"8f3e3006":[()=>n.e(5511).then(n.t.bind(n,6966,19)),"~docs/default/category-docs-tutorialsidebar-category-external-tools-820.json",6966],"91b4e1d3":[()=>n.e(4983).then(n.t.bind(n,2801,19)),"~docs/default/version-0-4-1-metadata-prop-27c.json",2801],"91bd08ce":[()=>n.e(3263).then(n.bind(n,9365)),"@site/versioned_docs/version-0.3.x/layout.md",9365],"9255821e":[()=>n.e(8712).then(n.t.bind(n,3125,19)),"~docs/default/category-docs-041-tutorialsidebar-category-progress-3c5.json",3125],"926843be":[()=>n.e(5832).then(n.bind(n,4008)),"@site/versioned_docs/version-0.2.x/utilities/fit-to.md",4008],"9286a2c0":[()=>n.e(2556).then(n.bind(n,3716)),"@site/versioned_docs/version-0.4.1/integration/codly.md",3716],"92f7ac8d":[()=>n.e(1546).then(n.bind(n,7909)),"@site/versioned_docs/version-0.3.2+/integration/codly.md",7909],"935f2afb":[()=>n.e(53).then(n.t.bind(n,1109,19)),"~docs/default/version-current-metadata-prop-751.json",1109],"93a8974a":[()=>n.e(6441).then(n.bind(n,3133)),"@site/versioned_docs/version-0.5.x/themes/custom.md",3133],"95c1a82e":[()=>n.e(7513).then(n.bind(n,4843)),"@site/versioned_docs/version-0.4.1/dynamic/other.md",4843],"9670fa94":[()=>n.e(1768).then(n.bind(n,4345)),"@site/versioned_docs/version-0.5.x/start.md",4345],"974d09da":[()=>n.e(9664).then(n.bind(n,1322)),"@site/versioned_docs/version-0.4.0+/layout.md",1322],"98ce8162":[()=>n.e(1543).then(n.bind(n,715)),"@site/docs/start.md",715],"98ec335f":[()=>n.e(9131).then(n.t.bind(n,8866,19)),"~docs/default/category-docs-041-tutorialsidebar-category-package-integration-6f0.json",8866],"99d50e1d":[()=>n.e(8010).then(n.bind(n,3283)),"@site/versioned_docs/version-0.3.x/start.md",3283],"9a7767cf":[()=>n.e(7084).then(n.t.bind(n,1083,19)),"~docs/default/category-docsnext-tutorialsidebar-category-themes-0b4.json",1083],"9b94a5b3":[()=>n.e(5140).then(n.bind(n,5882)),"@site/versioned_docs/version-0.4.1/integration/mitex.md",5882],"9beb87c2":[()=>n.e(3034).then(n.bind(n,4123)),"@site/docs/changelog.md",4123],"9c7bd7dc":[()=>n.e(1392).then(n.bind(n,9020)),"@site/versioned_docs/version-0.4.2/integration/pinit.md",9020],"9dfc2059":[()=>n.e(9437).then(n.bind(n,7606)),"@site/versioned_docs/version-0.4.1/changelog.md",7606],"9e4087bc":[()=>n.e(3608).then(n.bind(n,3169)),"@theme/BlogArchivePage",3169],"9ea180da":[()=>n.e(9861).then(n.bind(n,9556)),"@site/versioned_docs/version-0.3.2+/themes/university.md",9556],"9f73dd73":[()=>n.e(4004).then(n.bind(n,9698)),"@site/versioned_docs/version-0.5.x/dynamic/cover.md",9698],"9f9db465":[()=>n.e(7060).then(n.bind(n,2124)),"@site/versioned_docs/version-0.3.x/utilities/fit-to.md",2124],a07e1869:[()=>n.e(2595).then(n.bind(n,7397)),"@site/docs/themes/stargazer.md",7397],a449492b:[()=>n.e(1626).then(n.bind(n,4176)),"@site/versioned_docs/version-0.3.x/dynamic/other.md",4176],a5f851c4:[()=>n.e(6428).then(n.bind(n,9792)),"@site/versioned_docs/version-0.5.x/integration/pinit.md",9792],a62a85e6:[()=>n.e(9259).then(n.bind(n,2806)),"@site/versioned_docs/version-0.3.2+/themes/aqua.md",2806],a6aa9e1f:[()=>Promise.all([n.e(532),n.e(9206),n.e(9677),n.e(3089)]).then(n.bind(n,46)),"@theme/BlogListPage",46],a7023ddc:[()=>n.e(1713).then(n.t.bind(n,3457,19)),"~blog/default/blog-tags-tags-4c2.json",3457],a72991e0:[()=>n.e(7736).then(n.t.bind(n,218,19)),"~docs/default/category-docs-03-x-tutorialsidebar-category-themes-d1e.json",218],a732a165:[()=>n.e(4288).then(n.bind(n,5349)),"@site/versioned_docs/version-0.4.0+/dynamic/simple.md",5349],a782524f:[()=>n.e(3726).then(n.bind(n,694)),"@site/versioned_docs/version-0.5.x/integration/fletcher.md",694],a7bd4aaa:[()=>n.e(8518).then(n.bind(n,8564)),"@theme/DocVersionRoot",8564],a7cd7c6a:[()=>n.e(6679).then(n.bind(n,6830)),"@site/versioned_docs/version-0.2.x/themes/metropolis.md",6830],a94703ab:[()=>Promise.all([n.e(532),n.e(4368)]).then(n.bind(n,2674)),"@theme/DocRoot",2674],a94a4682:[()=>n.e(4599).then(n.bind(n,5376)),"@site/blog/2024-01-17-touying-0-2-0.md?truncated=true",5376],a9f25167:[()=>n.e(1922).then(n.bind(n,1775)),"@site/versioned_docs/version-0.5.x/intro.md",1775],ab32da60:[()=>n.e(7190).then(n.bind(n,7022)),"@site/docs/sections.md",7022],ab69a79b:[()=>n.e(4760).then(n.t.bind(n,3103,19)),"~docs/default/category-docs-032-tutorialsidebar-category-external-tools-eb4.json",3103],ab9676e0:[()=>n.e(379).then(n.t.bind(n,5745,19)),"/home/runner/work/touying-typ.github.io/touying-typ.github.io/.docusaurus/docusaurus-plugin-content-pages/default/plugin-route-context-module-100.json",5745],aca67227:[()=>n.e(7941).then(n.bind(n,7308)),"@site/versioned_docs/version-0.5.x/dynamic/other.md",7308],acb203b2:[()=>n.e(1956).then(n.bind(n,4955)),"@site/versioned_docs/version-0.4.1/utilities/fit-to.md",4955],acfad3c9:[()=>n.e(7668).then(n.bind(n,4059)),"@site/versioned_docs/version-0.3.2+/themes/dewdrop.md",4059],ad8b99e1:[()=>n.e(5644).then(n.bind(n,9193)),"@site/versioned_docs/version-0.4.2/external/pdfpc.md",9193],ad972684:[()=>n.e(6403).then(n.bind(n,7378)),"@site/versioned_docs/version-0.3.x/integration/polylux.md",7378],ae31ff46:[()=>n.e(2528).then(n.t.bind(n,8497,19)),"~docs/default/version-0-2-x-metadata-prop-34c.json",8497],ae372017:[()=>n.e(5234).then(n.t.bind(n,6823,19)),"~docs/default/category-docs-042-tutorialsidebar-category-progress-935.json",6823],af23d200:[()=>n.e(3539).then(n.bind(n,9153)),"@site/versioned_docs/version-0.4.1/intro.md",9153],b035a2d2:[()=>n.e(876).then(n.bind(n,655)),"@site/versioned_docs/version-0.3.2+/progress/sections.md",655],b0b113fa:[()=>n.e(6138).then(n.bind(n,887)),"@site/versioned_docs/version-0.4.2/layout.md",887],b1a1bf59:[()=>n.e(3655).then(n.bind(n,5388)),"@site/versioned_docs/version-0.3.x/dynamic/handout.md",5388],b2b675dd:[()=>n.e(533).then(n.t.bind(n,8017,19)),"~blog/default/blog-c06.json",8017],b2b68e5a:[()=>n.e(8210).then(n.bind(n,3536)),"@site/versioned_docs/version-0.3.2+/global-settings.md",3536],b2f554cd:[()=>n.e(1477).then(n.t.bind(n,10,19)),"~blog/default/blog-archive-80c.json",10],b472294c:[()=>n.e(1049).then(n.bind(n,7625)),"@site/versioned_docs/version-0.3.x/progress/sections.md",7625],b5bb8785:[()=>n.e(3597).then(n.t.bind(n,3321,19)),"~docs/default/category-docs-tutorialsidebar-category-themes-bef.json",3321],b5c6b9f1:[()=>n.e(8905).then(n.bind(n,2387)),"@site/versioned_docs/version-0.5.x/dynamic/handout.md",2387],b5dfb830:[()=>n.e(2464).then(n.bind(n,5881)),"@site/versioned_docs/version-0.4.0+/dynamic/handout.md",5881],b6606f5f:[()=>n.e(513).then(n.bind(n,381)),"@site/versioned_docs/version-0.4.0+/intro.md",381],b779464e:[()=>n.e(9156).then(n.bind(n,9310)),"@site/versioned_docs/version-0.4.1/sections.md",9310],b7a138aa:[()=>n.e(9895).then(n.bind(n,4472)),"@site/versioned_docs/version-0.2.x/themes/simple.md",4472],b8cfeb64:[()=>n.e(1842).then(n.bind(n,4505)),"@site/versioned_docs/version-0.4.2/progress/counters.md",4505],b8fd1f7e:[()=>n.e(4984).then(n.bind(n,7519)),"@site/versioned_docs/version-0.3.x/dynamic/complex.md",7519],b9d80392:[()=>n.e(7266).then(n.t.bind(n,6126,19)),"~docs/default/category-docs-02-x-tutorialsidebar-category-themes-2de.json",6126],bb32df29:[()=>n.e(7971).then(n.t.bind(n,4369,19)),"~docs/default/category-docs-040-tutorialsidebar-category-progress-a51.json",4369],bbd5eca0:[()=>n.e(2013).then(n.t.bind(n,2289,19)),"~docs/default/version-0-4-2-metadata-prop-7b5.json",2289],bce42248:[()=>n.e(5675).then(n.bind(n,806)),"@site/versioned_docs/version-0.3.2+/progress/counters.md",806],be8f11ff:[()=>n.e(7258).then(n.t.bind(n,8394,19)),"~docs/default/category-docs-042-tutorialsidebar-category-dynamic-slides-b89.json",8394],be980f90:[()=>n.e(6297).then(n.bind(n,9520)),"@site/versioned_docs/version-0.5.x/code-styles.md",9520],bef23ce3:[()=>n.e(5096).then(n.bind(n,3207)),"@site/versioned_docs/version-0.4.0+/integration/ctheorems.md",3207],bf750d2c:[()=>n.e(4770).then(n.bind(n,871)),"@site/versioned_docs/version-0.3.x/dynamic/cover.md",871],c38df086:[()=>n.e(6154).then(n.bind(n,82)),"@site/docs/integration/pinit.md",82],c4bbdbdb:[()=>n.e(9876).then(n.bind(n,1329)),"@site/versioned_docs/version-0.4.2/utilities/oop.md",1329],c4f5d8e4:[()=>Promise.all([n.e(532),n.e(4195)]).then(n.bind(n,3261)),"@site/src/pages/index.js",3261],c5fe94c9:[()=>n.e(4846).then(n.t.bind(n,1836,19)),"~docs/default/category-docs-041-tutorialsidebar-category-dynamic-slides-ddf.json",1836],c60ded92:[()=>n.e(4450).then(n.bind(n,2136)),"@site/versioned_docs/version-0.4.0+/dynamic/other.md",2136],c6f2035a:[()=>n.e(9160).then(n.bind(n,4633)),"@site/versioned_docs/version-0.4.2/themes/metropolis.md",4633],c748af54:[()=>n.e(4095).then(n.bind(n,9947)),"@site/versioned_docs/version-0.5.x/integration/cetz.md",9947],c7747100:[()=>n.e(2559).then(n.bind(n,2887)),"@site/versioned_docs/version-0.5.x/global-settings.md",2887],c9566e8a:[()=>n.e(6118).then(n.bind(n,4091)),"@site/docs/progress/sections.md",4091],c9c87310:[()=>n.e(9410).then(n.bind(n,7309)),"@site/versioned_docs/version-0.3.2+/integration/mitex.md",7309],cbb499f0:[()=>n.e(1001).then(n.bind(n,7717)),"@site/versioned_docs/version-0.4.1/dynamic/handout.md",7717],cbce90b2:[()=>n.e(6864).then(n.t.bind(n,6307,19)),"~docs/default/version-0-3-x-metadata-prop-ffc.json",6307],ccbf8980:[()=>n.e(3293).then(n.t.bind(n,8277,19)),"~docs/default/category-docs-02-x-tutorialsidebar-category-utilities-265.json",8277],ccc49370:[()=>Promise.all([n.e(532),n.e(9206),n.e(9677),n.e(6103)]).then(n.bind(n,5203)),"@theme/BlogPostPage",5203],ce30cdaf:[()=>n.e(3808).then(n.bind(n,4273)),"@site/versioned_docs/version-0.4.0+/integration/pinit.md",4273],ce57b2d1:[()=>n.e(2868).then(n.bind(n,8575)),"@site/versioned_docs/version-0.2.x/themes/dewdrop.md",8575],cee41b2a:[()=>n.e(4070).then(n.bind(n,9632)),"@site/versioned_docs/version-0.5.x/dynamic/equation.md",9632],d0193031:[()=>n.e(1545).then(n.bind(n,3868)),"@site/versioned_docs/version-0.4.2/integration/fletcher.md",3868],d03d89a3:[()=>n.e(8510).then(n.bind(n,2846)),"@site/versioned_docs/version-0.4.2/sections.md",2846],d066d984:[()=>n.e(3042).then(n.t.bind(n,5098,19)),"~docs/default/version-0-5-x-metadata-prop-11e.json",5098],d16cbc15:[()=>n.e(2403).then(n.bind(n,9741)),"@site/docs/themes/dewdrop.md",9741],d287f9e6:[()=>n.e(612).then(n.bind(n,1344)),"@site/docs/integration/codly.md",1344],d3593394:[()=>n.e(271).then(n.bind(n,3317)),"@site/versioned_docs/version-0.5.x/external/pdfpc.md",3317],d37c9d26:[()=>n.e(743).then(n.bind(n,5455)),"@site/versioned_docs/version-0.4.2/dynamic/simple.md",5455],d434ce9a:[()=>n.e(2992).then(n.bind(n,4946)),"@site/versioned_docs/version-0.4.1/external/pympress.md",4946],d4a2dc55:[()=>n.e(7224).then(n.bind(n,6599)),"@site/versioned_docs/version-0.2.x/build-your-own-theme.md",6599],d4a9b079:[()=>n.e(6629).then(n.t.bind(n,1504,19)),"~docs/default/category-docs-tutorialsidebar-category-progress-3e0.json",1504],d736a72a:[()=>n.e(1214).then(n.bind(n,4489)),"@site/versioned_docs/version-0.4.1/utilities/oop.md",4489],d848b1c8:[()=>n.e(2925).then(n.bind(n,9399)),"@site/versioned_docs/version-0.4.0+/themes/metropolis.md",9399],d85bd5da:[()=>n.e(6060).then(n.bind(n,8253)),"@site/versioned_docs/version-0.4.2/dynamic/complex.md",8253],d9bab663:[()=>n.e(196).then(n.bind(n,6294)),"@site/versioned_docs/version-0.2.x/external/typst-preview.md",6294],dbe874ba:[()=>n.e(1712).then(n.bind(n,8843)),"@site/versioned_docs/version-0.4.2/integration/codly.md",8843],dbfc9d8c:[()=>n.e(7488).then(n.t.bind(n,867,19)),"~docs/default/category-docs-032-tutorialsidebar-category-dynamic-slides-df0.json",867],dc65f2fa:[()=>n.e(9974).then(n.bind(n,5040)),"@site/versioned_docs/version-0.3.2+/layout.md",5040],de4f60ff:[()=>n.e(3432).then(n.bind(n,2964)),"@site/versioned_docs/version-0.3.2+/dynamic/simple.md",2964],df5b4e08:[()=>n.e(7701).then(n.bind(n,8373)),"@site/versioned_docs/version-0.2.x/dynamic/handout.md",8373],e0c18516:[()=>n.e(834).then(n.bind(n,6481)),"@site/versioned_docs/version-0.5.x/themes/stargazer.md",6481],e329454c:[()=>n.e(2020).then(n.t.bind(n,2728,19)),"~docs/default/category-docs-040-tutorialsidebar-category-themes-d5a.json",2728],e511abbf:[()=>n.e(1498).then(n.bind(n,5367)),"@site/versioned_docs/version-0.4.0+/external/typst-preview.md",5367],e52dffae:[()=>n.e(7603).then(n.bind(n,9916)),"@site/versioned_docs/version-0.4.1/code-styles.md",9916],e5a884f4:[()=>n.e(8300).then(n.bind(n,5606)),"@site/versioned_docs/version-0.2.x/style.md",5606],e5b11173:[()=>n.e(5332).then(n.bind(n,1847)),"@site/versioned_docs/version-0.3.x/code-styles.md",1847],e7541c45:[()=>n.e(8990).then(n.bind(n,9706)),"@site/versioned_docs/version-0.4.0+/integration/fletcher.md",9706],e931e8f0:[()=>n.e(3300).then(n.t.bind(n,7954,19)),"~docs/default/category-docs-02-x-tutorialsidebar-category-external-tools-791.json",7954],ebca17e9:[()=>n.e(9095).then(n.bind(n,6917)),"@site/docs/integration/mitex.md",6917],ecfd88b4:[()=>n.e(5619).then(n.bind(n,6111)),"@site/versioned_docs/version-0.3.x/progress/counters.md",6111],ed5e9b8d:[()=>n.e(8207).then(n.bind(n,2307)),"@site/versioned_docs/version-0.4.1/themes/dewdrop.md",2307],ee3959f2:[()=>n.e(2247).then(n.t.bind(n,1010,19)),"~docs/default/category-docs-03-x-tutorialsidebar-category-utilities-d1f.json",1010],efaa2d33:[()=>n.e(2530).then(n.bind(n,4147)),"@site/versioned_docs/version-0.5.x/integration/mitex.md",4147],f24a23d8:[()=>n.e(2322).then(n.bind(n,2417)),"@site/versioned_docs/version-0.4.0+/start.md",2417],f2a3c69a:[()=>n.e(7510).then(n.bind(n,2195)),"@site/versioned_docs/version-0.4.2/progress/sections.md",2195],f2bffab0:[()=>n.e(6142).then(n.bind(n,1647)),"@site/versioned_docs/version-0.3.2+/dynamic/equation.md",1647],f3a7b3b2:[()=>n.e(9916).then(n.bind(n,1075)),"@site/docs/global-settings.md",1075],f3d96861:[()=>n.e(9754).then(n.bind(n,9476)),"@site/versioned_docs/version-0.3.x/integration/codly.md",9476],f554ac40:[()=>n.e(6232).then(n.bind(n,348)),"@site/versioned_docs/version-0.4.0+/dynamic/equation.md",348],f59358a3:[()=>n.e(9510).then(n.t.bind(n,4750,19)),"~docs/default/category-docsnext-tutorialsidebar-category-dynamic-slides-297.json",4750],f5d6ba2d:[()=>n.e(3284).then(n.bind(n,3293)),"@site/versioned_docs/version-0.4.2/themes/aqua.md",3293],f7c1e588:[()=>n.e(9199).then(n.bind(n,5165)),"@site/versioned_docs/version-0.3.x/integration/pinit.md",5165],f7c44c4b:[()=>n.e(382).then(n.t.bind(n,7475,19)),"~docs/default/category-docs-041-tutorialsidebar-category-themes-a67.json",7475],f8016cde:[()=>n.e(9543).then(n.bind(n,8814)),"@site/versioned_docs/version-0.3.2+/themes/metropolis.md",8814],f80396ac:[()=>n.e(1588).then(n.bind(n,402)),"@site/versioned_docs/version-0.3.2+/integration/cetz.md",402],f9b59e29:[()=>n.e(945).then(n.bind(n,7597)),"@site/versioned_docs/version-0.4.2/integration/mitex.md",7597],f9dcd2cf:[()=>n.e(2932).then(n.bind(n,1126)),"@site/docs/themes/custom.md",1126],fbe708ec:[()=>n.e(9159).then(n.bind(n,3316)),"@site/versioned_docs/version-0.3.2+/dynamic/complex.md",3316],fc190723:[()=>n.e(1188).then(n.bind(n,4266)),"@site/versioned_docs/version-0.4.1/global-settings.md",4266],fe7d81f6:[()=>n.e(5039).then(n.t.bind(n,4469,19)),"/home/runner/work/touying-typ.github.io/touying-typ.github.io/.docusaurus/docusaurus-plugin-content-blog/default/plugin-route-context-module-100.json",4469],ff35141a:[()=>n.e(4999).then(n.bind(n,7165)),"@site/versioned_docs/version-0.5.x/progress/counters.md",7165]};var s=n(5893);function l(e){let{error:t,retry:n,pastDelay:r}=e;return t?(0,s.jsxs)("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"},children:[(0,s.jsx)("p",{children:String(t)}),(0,s.jsx)("div",{children:(0,s.jsx)("button",{type:"button",onClick:n,children:"Retry"})})]}):r?(0,s.jsx)("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"},children:(0,s.jsx)("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb",children:(0,s.jsxs)("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2",children:[(0,s.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,s.jsx)("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,s.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,s.jsx)("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,s.jsx)("circle",{cx:"22",cy:"22",r:"8",children:(0,s.jsx)("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"})})]})})}):null}var c=n(9670),d=n(226);function u(e,t){if("*"===e)return o()({loading:l,loader:()=>n.e(1772).then(n.bind(n,1772)),modules:["@theme/NotFound"],webpack:()=>[1772],render(e,t){const n=e.default;return(0,s.jsx)(d.z,{value:{plugin:{name:"native",id:"default"}},children:(0,s.jsx)(n,{...t})})}});const r=a[`${e}-${t}`],u={},p=[],f=[],m=(0,c.Z)(r);return Object.entries(m).forEach((e=>{let[t,n]=e;const r=i[n];r&&(u[t]=r[0],p.push(r[1]),f.push(r[2]))})),o().Map({loading:l,loader:u,modules:p,webpack:()=>f,render(t,n){const o=JSON.parse(JSON.stringify(r));Object.entries(t).forEach((t=>{let[n,r]=t;const a=r.default;if(!a)throw new Error(`The page component at ${e} doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.`);"object"!=typeof a&&"function"!=typeof a||Object.keys(r).filter((e=>"default"!==e)).forEach((e=>{a[e]=r[e]}));let i=o;const s=n.split(".");s.slice(0,-1).forEach((e=>{i=i[e]})),i[s[s.length-1]]=a}));const a=o.__comp;delete o.__comp;const i=o.__context;return delete o.__context,(0,s.jsx)(d.z,{value:i,children:(0,s.jsx)(a,{...o,...n})})}})}const p=[{path:"/blog",component:u("/blog","abb"),exact:!0},{path:"/blog/archive",component:u("/blog/archive","7a5"),exact:!0},{path:"/blog/tags",component:u("/blog/tags","c36"),exact:!0},{path:"/blog/tags/development",component:u("/blog/tags/development","cdb"),exact:!0},{path:"/blog/touying-0-2-0",component:u("/blog/touying-0-2-0","71e"),exact:!0},{path:"/markdown-page",component:u("/markdown-page","578"),exact:!0},{path:"/docs",component:u("/docs","a78"),routes:[{path:"/docs/0.2.x",component:u("/docs/0.2.x","246"),routes:[{path:"/docs/0.2.x",component:u("/docs/0.2.x","956"),routes:[{path:"/docs/0.2.x/build-your-own-theme",component:u("/docs/0.2.x/build-your-own-theme","aee"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.2.x/category/dynamic-slides",component:u("/docs/0.2.x/category/dynamic-slides","c21"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.2.x/category/external-tools",component:u("/docs/0.2.x/category/external-tools","b85"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.2.x/category/progress",component:u("/docs/0.2.x/category/progress","f7a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.2.x/category/themes",component:u("/docs/0.2.x/category/themes","7c8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.2.x/category/utilities",component:u("/docs/0.2.x/category/utilities","12a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.2.x/changelog",component:u("/docs/0.2.x/changelog","43a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.2.x/dynamic/complex",component:u("/docs/0.2.x/dynamic/complex","0ff"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.2.x/dynamic/cover",component:u("/docs/0.2.x/dynamic/cover","a33"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.2.x/dynamic/equation",component:u("/docs/0.2.x/dynamic/equation","dbf"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.2.x/dynamic/handout",component:u("/docs/0.2.x/dynamic/handout","097"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.2.x/dynamic/other",component:u("/docs/0.2.x/dynamic/other","648"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.2.x/dynamic/simple",component:u("/docs/0.2.x/dynamic/simple","ae6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.2.x/external/pdfpc",component:u("/docs/0.2.x/external/pdfpc","b3b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.2.x/external/typst-preview",component:u("/docs/0.2.x/external/typst-preview","657"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.2.x/intro",component:u("/docs/0.2.x/intro","c0d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.2.x/layout",component:u("/docs/0.2.x/layout","b0d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.2.x/progress/counters",component:u("/docs/0.2.x/progress/counters","68f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.2.x/progress/sections",component:u("/docs/0.2.x/progress/sections","099"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.2.x/start",component:u("/docs/0.2.x/start","85d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.2.x/style",component:u("/docs/0.2.x/style","013"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.2.x/themes/dewdrop",component:u("/docs/0.2.x/themes/dewdrop","48a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.2.x/themes/metropolis",component:u("/docs/0.2.x/themes/metropolis","aee"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.2.x/themes/simple",component:u("/docs/0.2.x/themes/simple","fe2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.2.x/themes/university",component:u("/docs/0.2.x/themes/university","99d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.2.x/utilities/fit-to",component:u("/docs/0.2.x/utilities/fit-to","574"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.2.x/utilities/oop",component:u("/docs/0.2.x/utilities/oop","5fc"),exact:!0,sidebar:"tutorialSidebar"}]}]},{path:"/docs/0.3.2+",component:u("/docs/0.3.2+","d35"),routes:[{path:"/docs/0.3.2+",component:u("/docs/0.3.2+","bd6"),routes:[{path:"/docs/0.3.2+/build-your-own-theme",component:u("/docs/0.3.2+/build-your-own-theme","d99"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.2+/category/dynamic-slides",component:u("/docs/0.3.2+/category/dynamic-slides","526"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.2+/category/external-tools",component:u("/docs/0.3.2+/category/external-tools","13d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.2+/category/package-integration",component:u("/docs/0.3.2+/category/package-integration","962"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.2+/category/progress",component:u("/docs/0.3.2+/category/progress","b5e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.2+/category/themes",component:u("/docs/0.3.2+/category/themes","954"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.2+/category/utilities",component:u("/docs/0.3.2+/category/utilities","8e2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.2+/changelog",component:u("/docs/0.3.2+/changelog","58b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.2+/code-styles",component:u("/docs/0.3.2+/code-styles","c71"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.2+/dynamic/complex",component:u("/docs/0.3.2+/dynamic/complex","769"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.2+/dynamic/cover",component:u("/docs/0.3.2+/dynamic/cover","ae7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.2+/dynamic/equation",component:u("/docs/0.3.2+/dynamic/equation","e05"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.2+/dynamic/handout",component:u("/docs/0.3.2+/dynamic/handout","9ba"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.2+/dynamic/other",component:u("/docs/0.3.2+/dynamic/other","bed"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.2+/dynamic/simple",component:u("/docs/0.3.2+/dynamic/simple","510"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.2+/external/pdfpc",component:u("/docs/0.3.2+/external/pdfpc","33d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.2+/external/typst-preview",component:u("/docs/0.3.2+/external/typst-preview","c31"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.2+/global-settings",component:u("/docs/0.3.2+/global-settings","76e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.2+/integration/cetz",component:u("/docs/0.3.2+/integration/cetz","23e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.2+/integration/codly",component:u("/docs/0.3.2+/integration/codly","72e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.2+/integration/fletcher",component:u("/docs/0.3.2+/integration/fletcher","6d6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.2+/integration/mitex",component:u("/docs/0.3.2+/integration/mitex","2ef"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.2+/integration/pinit",component:u("/docs/0.3.2+/integration/pinit","4f4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.2+/integration/polylux",component:u("/docs/0.3.2+/integration/polylux","67b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.2+/intro",component:u("/docs/0.3.2+/intro","5bf"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.2+/layout",component:u("/docs/0.3.2+/layout","ef3"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.2+/progress/counters",component:u("/docs/0.3.2+/progress/counters","849"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.2+/progress/sections",component:u("/docs/0.3.2+/progress/sections","239"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.2+/sections",component:u("/docs/0.3.2+/sections","463"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.2+/start",component:u("/docs/0.3.2+/start","9e3"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.2+/themes/aqua",component:u("/docs/0.3.2+/themes/aqua","c55"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.2+/themes/dewdrop",component:u("/docs/0.3.2+/themes/dewdrop","673"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.2+/themes/metropolis",component:u("/docs/0.3.2+/themes/metropolis","6b9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.2+/themes/simple",component:u("/docs/0.3.2+/themes/simple","7d4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.2+/themes/university",component:u("/docs/0.3.2+/themes/university","7e3"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.2+/utilities/fit-to",component:u("/docs/0.3.2+/utilities/fit-to","3e9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.2+/utilities/oop",component:u("/docs/0.3.2+/utilities/oop","dad"),exact:!0,sidebar:"tutorialSidebar"}]}]},{path:"/docs/0.3.x",component:u("/docs/0.3.x","fb4"),routes:[{path:"/docs/0.3.x",component:u("/docs/0.3.x","15f"),routes:[{path:"/docs/0.3.x/build-your-own-theme",component:u("/docs/0.3.x/build-your-own-theme","d34"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.x/category/dynamic-slides",component:u("/docs/0.3.x/category/dynamic-slides","c30"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.x/category/external-tools",component:u("/docs/0.3.x/category/external-tools","f60"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.x/category/package-integration",component:u("/docs/0.3.x/category/package-integration","a27"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.x/category/progress",component:u("/docs/0.3.x/category/progress","004"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.x/category/themes",component:u("/docs/0.3.x/category/themes","0c1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.x/category/utilities",component:u("/docs/0.3.x/category/utilities","707"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.x/changelog",component:u("/docs/0.3.x/changelog","7df"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.x/code-styles",component:u("/docs/0.3.x/code-styles","d34"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.x/dynamic/complex",component:u("/docs/0.3.x/dynamic/complex","40a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.x/dynamic/cover",component:u("/docs/0.3.x/dynamic/cover","3b4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.x/dynamic/equation",component:u("/docs/0.3.x/dynamic/equation","21f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.x/dynamic/handout",component:u("/docs/0.3.x/dynamic/handout","1dd"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.x/dynamic/other",component:u("/docs/0.3.x/dynamic/other","8cf"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.x/dynamic/simple",component:u("/docs/0.3.x/dynamic/simple","0cb"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.x/external/pdfpc",component:u("/docs/0.3.x/external/pdfpc","c09"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.x/external/typst-preview",component:u("/docs/0.3.x/external/typst-preview","ea5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.x/global-settings",component:u("/docs/0.3.x/global-settings","f68"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.x/integration/cetz",component:u("/docs/0.3.x/integration/cetz","94a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.x/integration/codly",component:u("/docs/0.3.x/integration/codly","b12"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.x/integration/fletcher",component:u("/docs/0.3.x/integration/fletcher","d93"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.x/integration/mitex",component:u("/docs/0.3.x/integration/mitex","d23"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.x/integration/pinit",component:u("/docs/0.3.x/integration/pinit","261"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.x/integration/polylux",component:u("/docs/0.3.x/integration/polylux","809"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.x/intro",component:u("/docs/0.3.x/intro","a0d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.x/layout",component:u("/docs/0.3.x/layout","9bc"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.x/progress/counters",component:u("/docs/0.3.x/progress/counters","ec4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.x/progress/sections",component:u("/docs/0.3.x/progress/sections","3f0"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.x/sections",component:u("/docs/0.3.x/sections","6bf"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.x/start",component:u("/docs/0.3.x/start","d1d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.x/themes/dewdrop",component:u("/docs/0.3.x/themes/dewdrop","e7b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.x/themes/metropolis",component:u("/docs/0.3.x/themes/metropolis","647"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.x/themes/simple",component:u("/docs/0.3.x/themes/simple","9d6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.x/themes/university",component:u("/docs/0.3.x/themes/university","c88"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.x/utilities/fit-to",component:u("/docs/0.3.x/utilities/fit-to","2a1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.3.x/utilities/oop",component:u("/docs/0.3.x/utilities/oop","df4"),exact:!0,sidebar:"tutorialSidebar"}]}]},{path:"/docs/0.4.0+",component:u("/docs/0.4.0+","d8f"),routes:[{path:"/docs/0.4.0+",component:u("/docs/0.4.0+","983"),routes:[{path:"/docs/0.4.0+/build-your-own-theme",component:u("/docs/0.4.0+/build-your-own-theme","3e4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.0+/category/dynamic-slides",component:u("/docs/0.4.0+/category/dynamic-slides","f1c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.0+/category/external-tools",component:u("/docs/0.4.0+/category/external-tools","9b5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.0+/category/package-integration",component:u("/docs/0.4.0+/category/package-integration","ba1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.0+/category/progress",component:u("/docs/0.4.0+/category/progress","b60"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.0+/category/themes",component:u("/docs/0.4.0+/category/themes","edc"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.0+/category/utilities",component:u("/docs/0.4.0+/category/utilities","4a5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.0+/changelog",component:u("/docs/0.4.0+/changelog","75c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.0+/code-styles",component:u("/docs/0.4.0+/code-styles","481"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.0+/dynamic/complex",component:u("/docs/0.4.0+/dynamic/complex","525"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.0+/dynamic/cover",component:u("/docs/0.4.0+/dynamic/cover","0ca"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.0+/dynamic/equation",component:u("/docs/0.4.0+/dynamic/equation","973"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.0+/dynamic/handout",component:u("/docs/0.4.0+/dynamic/handout","9b6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.0+/dynamic/other",component:u("/docs/0.4.0+/dynamic/other","20c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.0+/dynamic/simple",component:u("/docs/0.4.0+/dynamic/simple","f42"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.0+/external/pdfpc",component:u("/docs/0.4.0+/external/pdfpc","303"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.0+/external/typst-preview",component:u("/docs/0.4.0+/external/typst-preview","868"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.0+/global-settings",component:u("/docs/0.4.0+/global-settings","843"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.0+/integration/cetz",component:u("/docs/0.4.0+/integration/cetz","de0"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.0+/integration/codly",component:u("/docs/0.4.0+/integration/codly","adb"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.0+/integration/ctheorems",component:u("/docs/0.4.0+/integration/ctheorems","eab"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.0+/integration/fletcher",component:u("/docs/0.4.0+/integration/fletcher","709"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.0+/integration/mitex",component:u("/docs/0.4.0+/integration/mitex","6dd"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.0+/integration/pinit",component:u("/docs/0.4.0+/integration/pinit","9e0"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.0+/intro",component:u("/docs/0.4.0+/intro","dd3"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.0+/layout",component:u("/docs/0.4.0+/layout","64f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.0+/multi-file",component:u("/docs/0.4.0+/multi-file","e06"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.0+/progress/counters",component:u("/docs/0.4.0+/progress/counters","414"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.0+/progress/sections",component:u("/docs/0.4.0+/progress/sections","fe5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.0+/sections",component:u("/docs/0.4.0+/sections","458"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.0+/start",component:u("/docs/0.4.0+/start","fff"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.0+/themes/aqua",component:u("/docs/0.4.0+/themes/aqua","b0f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.0+/themes/dewdrop",component:u("/docs/0.4.0+/themes/dewdrop","3b5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.0+/themes/metropolis",component:u("/docs/0.4.0+/themes/metropolis","9bb"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.0+/themes/simple",component:u("/docs/0.4.0+/themes/simple","331"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.0+/themes/university",component:u("/docs/0.4.0+/themes/university","596"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.0+/utilities/fit-to",component:u("/docs/0.4.0+/utilities/fit-to","00f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.0+/utilities/oop",component:u("/docs/0.4.0+/utilities/oop","10e"),exact:!0,sidebar:"tutorialSidebar"}]}]},{path:"/docs/0.4.1",component:u("/docs/0.4.1","93c"),routes:[{path:"/docs/0.4.1",component:u("/docs/0.4.1","979"),routes:[{path:"/docs/0.4.1/build-your-own-theme",component:u("/docs/0.4.1/build-your-own-theme","e23"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.1/category/dynamic-slides",component:u("/docs/0.4.1/category/dynamic-slides","0e1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.1/category/external-tools",component:u("/docs/0.4.1/category/external-tools","09c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.1/category/package-integration",component:u("/docs/0.4.1/category/package-integration","8ab"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.1/category/progress",component:u("/docs/0.4.1/category/progress","5f9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.1/category/themes",component:u("/docs/0.4.1/category/themes","271"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.1/category/utilities",component:u("/docs/0.4.1/category/utilities","140"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.1/changelog",component:u("/docs/0.4.1/changelog","6a4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.1/code-styles",component:u("/docs/0.4.1/code-styles","a1d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.1/dynamic/complex",component:u("/docs/0.4.1/dynamic/complex","b21"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.1/dynamic/cover",component:u("/docs/0.4.1/dynamic/cover","cbf"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.1/dynamic/equation",component:u("/docs/0.4.1/dynamic/equation","2a9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.1/dynamic/handout",component:u("/docs/0.4.1/dynamic/handout","cf6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.1/dynamic/other",component:u("/docs/0.4.1/dynamic/other","1cd"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.1/dynamic/simple",component:u("/docs/0.4.1/dynamic/simple","d54"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.1/external/pdfpc",component:u("/docs/0.4.1/external/pdfpc","1bc"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.1/external/pympress",component:u("/docs/0.4.1/external/pympress","f21"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.1/external/typst-preview",component:u("/docs/0.4.1/external/typst-preview","b82"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.1/global-settings",component:u("/docs/0.4.1/global-settings","f48"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.1/integration/cetz",component:u("/docs/0.4.1/integration/cetz","079"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.1/integration/codly",component:u("/docs/0.4.1/integration/codly","341"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.1/integration/ctheorems",component:u("/docs/0.4.1/integration/ctheorems","ebd"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.1/integration/fletcher",component:u("/docs/0.4.1/integration/fletcher","f5b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.1/integration/mitex",component:u("/docs/0.4.1/integration/mitex","70e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.1/integration/pinit",component:u("/docs/0.4.1/integration/pinit","93a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.1/intro",component:u("/docs/0.4.1/intro","9f5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.1/layout",component:u("/docs/0.4.1/layout","edb"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.1/multi-file",component:u("/docs/0.4.1/multi-file","988"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.1/progress/counters",component:u("/docs/0.4.1/progress/counters","56a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.1/progress/sections",component:u("/docs/0.4.1/progress/sections","bd5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.1/sections",component:u("/docs/0.4.1/sections","d51"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.1/start",component:u("/docs/0.4.1/start","e3d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.1/themes/aqua",component:u("/docs/0.4.1/themes/aqua","ca8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.1/themes/dewdrop",component:u("/docs/0.4.1/themes/dewdrop","c15"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.1/themes/metropolis",component:u("/docs/0.4.1/themes/metropolis","618"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.1/themes/simple",component:u("/docs/0.4.1/themes/simple","995"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.1/themes/university",component:u("/docs/0.4.1/themes/university","71f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.1/utilities/fit-to",component:u("/docs/0.4.1/utilities/fit-to","51b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.1/utilities/oop",component:u("/docs/0.4.1/utilities/oop","263"),exact:!0,sidebar:"tutorialSidebar"}]}]},{path:"/docs/0.4.2",component:u("/docs/0.4.2","57b"),routes:[{path:"/docs/0.4.2",component:u("/docs/0.4.2","5d4"),routes:[{path:"/docs/0.4.2/build-your-own-theme",component:u("/docs/0.4.2/build-your-own-theme","b42"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.2/category/dynamic-slides",component:u("/docs/0.4.2/category/dynamic-slides","f42"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.2/category/external-tools",component:u("/docs/0.4.2/category/external-tools","490"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.2/category/package-integration",component:u("/docs/0.4.2/category/package-integration","d4d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.2/category/progress",component:u("/docs/0.4.2/category/progress","2b7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.2/category/themes",component:u("/docs/0.4.2/category/themes","48d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.2/category/utilities",component:u("/docs/0.4.2/category/utilities","491"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.2/changelog",component:u("/docs/0.4.2/changelog","e41"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.2/code-styles",component:u("/docs/0.4.2/code-styles","3bc"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.2/dynamic/complex",component:u("/docs/0.4.2/dynamic/complex","c9e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.2/dynamic/cover",component:u("/docs/0.4.2/dynamic/cover","9dd"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.2/dynamic/equation",component:u("/docs/0.4.2/dynamic/equation","89d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.2/dynamic/handout",component:u("/docs/0.4.2/dynamic/handout","02d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.2/dynamic/other",component:u("/docs/0.4.2/dynamic/other","598"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.2/dynamic/simple",component:u("/docs/0.4.2/dynamic/simple","59e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.2/external/pdfpc",component:u("/docs/0.4.2/external/pdfpc","942"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.2/external/pympress",component:u("/docs/0.4.2/external/pympress","c44"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.2/external/typst-preview",component:u("/docs/0.4.2/external/typst-preview","b3b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.2/global-settings",component:u("/docs/0.4.2/global-settings","f4e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.2/integration/cetz",component:u("/docs/0.4.2/integration/cetz","ced"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.2/integration/codly",component:u("/docs/0.4.2/integration/codly","3ee"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.2/integration/ctheorems",component:u("/docs/0.4.2/integration/ctheorems","c6d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.2/integration/fletcher",component:u("/docs/0.4.2/integration/fletcher","ead"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.2/integration/mitex",component:u("/docs/0.4.2/integration/mitex","339"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.2/integration/pinit",component:u("/docs/0.4.2/integration/pinit","716"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.2/intro",component:u("/docs/0.4.2/intro","32d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.2/layout",component:u("/docs/0.4.2/layout","302"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.2/multi-file",component:u("/docs/0.4.2/multi-file","d01"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.2/progress/counters",component:u("/docs/0.4.2/progress/counters","4f7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.2/progress/sections",component:u("/docs/0.4.2/progress/sections","af5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.2/sections",component:u("/docs/0.4.2/sections","c82"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.2/start",component:u("/docs/0.4.2/start","890"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.2/themes/aqua",component:u("/docs/0.4.2/themes/aqua","121"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.2/themes/dewdrop",component:u("/docs/0.4.2/themes/dewdrop","726"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.2/themes/metropolis",component:u("/docs/0.4.2/themes/metropolis","a4d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.2/themes/simple",component:u("/docs/0.4.2/themes/simple","bee"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.2/themes/university",component:u("/docs/0.4.2/themes/university","2e8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.2/utilities/fit-to",component:u("/docs/0.4.2/utilities/fit-to","67d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/0.4.2/utilities/oop",component:u("/docs/0.4.2/utilities/oop","98e"),exact:!0,sidebar:"tutorialSidebar"}]}]},{path:"/docs/next",component:u("/docs/next","74c"),routes:[{path:"/docs/next",component:u("/docs/next","f6b"),routes:[{path:"/docs/next/build-your-own-theme",component:u("/docs/next/build-your-own-theme","190"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/next/category/dynamic-slides",component:u("/docs/next/category/dynamic-slides","127"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/next/category/external-tools",component:u("/docs/next/category/external-tools","ce8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/next/category/package-integration",component:u("/docs/next/category/package-integration","b4c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/next/category/progress",component:u("/docs/next/category/progress","821"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/next/category/themes",component:u("/docs/next/category/themes","0e7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/next/category/utilities",component:u("/docs/next/category/utilities","55b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/next/changelog",component:u("/docs/next/changelog","ebe"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/next/code-styles",component:u("/docs/next/code-styles","393"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/next/dynamic/complex",component:u("/docs/next/dynamic/complex","176"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/next/dynamic/cover",component:u("/docs/next/dynamic/cover","72f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/next/dynamic/equation",component:u("/docs/next/dynamic/equation","80c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/next/dynamic/handout",component:u("/docs/next/dynamic/handout","61a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/next/dynamic/other",component:u("/docs/next/dynamic/other","6d5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/next/dynamic/simple",component:u("/docs/next/dynamic/simple","b14"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/next/external/pdfpc",component:u("/docs/next/external/pdfpc","c84"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/next/external/pympress",component:u("/docs/next/external/pympress","88e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/next/external/typst-preview",component:u("/docs/next/external/typst-preview","42c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/next/global-settings",component:u("/docs/next/global-settings","536"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/next/integration/cetz",component:u("/docs/next/integration/cetz","ebf"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/next/integration/codly",component:u("/docs/next/integration/codly","ac2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/next/integration/ctheorems",component:u("/docs/next/integration/ctheorems","a81"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/next/integration/fletcher",component:u("/docs/next/integration/fletcher","883"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/next/integration/mitex",component:u("/docs/next/integration/mitex","f31"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/next/integration/pinit",component:u("/docs/next/integration/pinit","4e4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/next/intro",component:u("/docs/next/intro","8d4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/next/layout",component:u("/docs/next/layout","364"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/next/multi-file",component:u("/docs/next/multi-file","cd4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/next/progress/counters",component:u("/docs/next/progress/counters","e74"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/next/progress/sections",component:u("/docs/next/progress/sections","d8f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/next/sections",component:u("/docs/next/sections","539"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/next/start",component:u("/docs/next/start","e0c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/next/themes/aqua",component:u("/docs/next/themes/aqua","ca9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/next/themes/custom",component:u("/docs/next/themes/custom","d8c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/next/themes/dewdrop",component:u("/docs/next/themes/dewdrop","2b7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/next/themes/metropolis",component:u("/docs/next/themes/metropolis","701"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/next/themes/simple",component:u("/docs/next/themes/simple","d18"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/next/themes/stargazer",component:u("/docs/next/themes/stargazer","b1c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/next/themes/university",component:u("/docs/next/themes/university","327"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/next/utilities/fit-to",component:u("/docs/next/utilities/fit-to","e1c"),exact:!0,sidebar:"tutorialSidebar"}]}]},{path:"/docs",component:u("/docs","2cd"),routes:[{path:"/docs",component:u("/docs","6b0"),routes:[{path:"/docs/build-your-own-theme",component:u("/docs/build-your-own-theme","f5b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/category/dynamic-slides",component:u("/docs/category/dynamic-slides","fbb"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/category/external-tools",component:u("/docs/category/external-tools","333"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/category/package-integration",component:u("/docs/category/package-integration","297"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/category/progress",component:u("/docs/category/progress","eaa"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/category/themes",component:u("/docs/category/themes","389"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/category/utilities",component:u("/docs/category/utilities","9d3"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/changelog",component:u("/docs/changelog","114"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/code-styles",component:u("/docs/code-styles","b13"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/dynamic/complex",component:u("/docs/dynamic/complex","c68"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/dynamic/cover",component:u("/docs/dynamic/cover","b5d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/dynamic/equation",component:u("/docs/dynamic/equation","c80"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/dynamic/handout",component:u("/docs/dynamic/handout","68f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/dynamic/other",component:u("/docs/dynamic/other","2a2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/dynamic/simple",component:u("/docs/dynamic/simple","39c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/external/pdfpc",component:u("/docs/external/pdfpc","07c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/external/pympress",component:u("/docs/external/pympress","0c2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/external/typst-preview",component:u("/docs/external/typst-preview","aaa"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/global-settings",component:u("/docs/global-settings","37c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/integration/cetz",component:u("/docs/integration/cetz","cb7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/integration/codly",component:u("/docs/integration/codly","ed9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/integration/ctheorems",component:u("/docs/integration/ctheorems","827"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/integration/fletcher",component:u("/docs/integration/fletcher","dfc"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/integration/mitex",component:u("/docs/integration/mitex","f54"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/integration/pinit",component:u("/docs/integration/pinit","2f6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/intro",component:u("/docs/intro","e9d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/layout",component:u("/docs/layout","6cd"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/multi-file",component:u("/docs/multi-file","add"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/progress/counters",component:u("/docs/progress/counters","af2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/progress/sections",component:u("/docs/progress/sections","d04"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/sections",component:u("/docs/sections","712"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/start",component:u("/docs/start","633"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/themes/aqua",component:u("/docs/themes/aqua","1ff"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/themes/custom",component:u("/docs/themes/custom","898"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/themes/dewdrop",component:u("/docs/themes/dewdrop","505"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/themes/metropolis",component:u("/docs/themes/metropolis","71e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/themes/simple",component:u("/docs/themes/simple","ab4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/themes/stargazer",component:u("/docs/themes/stargazer","a10"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/themes/university",component:u("/docs/themes/university","c2b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/fit-to",component:u("/docs/utilities/fit-to","97e"),exact:!0,sidebar:"tutorialSidebar"}]}]}]},{path:"/",component:u("/","4d4"),exact:!0},{path:"*",component:u("*")}]},8934:(e,t,n)=>{"use strict";n.d(t,{_:()=>a,t:()=>i});var r=n(7294),o=n(5893);const a=r.createContext(!1);function i(e){let{children:t}=e;const[n,i]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{i(!0)}),[]),(0,o.jsx)(a.Provider,{value:n,children:t})}},7221:(e,t,n)=>{"use strict";var r=n(7294),o=n(745),a=n(3727),i=n(405),s=n(412);const l=[n(2497),n(3310),n(8320),n(2295)];var c=n(723),d=n(6550),u=n(8790),p=n(5893);function f(e){let{children:t}=e;return(0,p.jsx)(p.Fragment,{children:t})}var m=n(5742),h=n(2263),g=n(4996),b=n(6668),y=n(1944),v=n(4711),x=n(9727),w=n(3320),S=n(8780),k=n(197);function _(){const{i18n:{currentLocale:e,defaultLocale:t,localeConfigs:n}}=(0,h.Z)(),r=(0,v.l)(),o=n[e].htmlLang,a=e=>e.replace("-","_");return(0,p.jsxs)(m.Z,{children:[Object.entries(n).map((e=>{let[t,{htmlLang:n}]=e;return(0,p.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:n},t)})),(0,p.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:"x-default"}),(0,p.jsx)("meta",{property:"og:locale",content:a(o)}),Object.values(n).filter((e=>o!==e.htmlLang)).map((e=>(0,p.jsx)("meta",{property:"og:locale:alternate",content:a(e.htmlLang)},`meta-og-${e.htmlLang}`)))]})}function E(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,h.Z)(),r=function(){const{siteConfig:{url:e,baseUrl:t,trailingSlash:n}}=(0,h.Z)(),{pathname:r}=(0,d.TH)();return e+(0,S.applyTrailingSlash)((0,g.Z)(r),{trailingSlash:n,baseUrl:t})}(),o=t?`${n}${t}`:r;return(0,p.jsxs)(m.Z,{children:[(0,p.jsx)("meta",{property:"og:url",content:o}),(0,p.jsx)("link",{rel:"canonical",href:o})]})}function C(){const{i18n:{currentLocale:e}}=(0,h.Z)(),{metadata:t,image:n}=(0,b.L)();return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsxs)(m.Z,{children:[(0,p.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,p.jsx)("body",{className:x.h})]}),n&&(0,p.jsx)(y.d,{image:n}),(0,p.jsx)(E,{}),(0,p.jsx)(_,{}),(0,p.jsx)(k.Z,{tag:w.HX,locale:e}),(0,p.jsx)(m.Z,{children:t.map(((e,t)=>(0,p.jsx)("meta",{...e},t)))})]})}const T=new Map;function j(e){if(T.has(e.pathname))return{...e,pathname:T.get(e.pathname)};if((0,u.f)(c.Z,e.pathname).some((e=>{let{route:t}=e;return!0===t.exact})))return T.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return T.set(e.pathname,t),{...e,pathname:t}}var N=n(8934),A=n(8940),R=n(469);function L(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r{const r=t.default?.[e]??t[e];return r?.(...n)}));return()=>o.forEach((e=>e?.()))}const I=function(e){let{children:t,location:n,previousLocation:r}=e;return(0,R.Z)((()=>{r!==n&&(!function(e){let{location:t,previousLocation:n}=e;if(!n)return;const r=t.pathname===n.pathname,o=t.hash===n.hash,a=t.search===n.search;if(r&&o&&!a)return;const{hash:i}=t;if(i){const e=decodeURIComponent(i.substring(1)),t=document.getElementById(e);t?.scrollIntoView()}else window.scrollTo(0,0)}({location:n,previousLocation:r}),L("onRouteDidUpdate",{previousLocation:r,location:n}))}),[r,n]),t};function P(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,u.f)(c.Z,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class O extends r.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=s.Z.canUseDOM?L("onRouteUpdate",{previousLocation:null,location:this.props.location}):()=>{},this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){if(e.location===this.props.location)return t.nextRouteHasLoaded;const n=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=L("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),P(n.pathname).then((()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})})).catch((e=>{console.warn(e),window.location.reload()})),!1}render(){const{children:e,location:t}=this.props;return(0,p.jsx)(I,{previousLocation:this.previousLocation,location:t,children:(0,p.jsx)(d.AW,{location:t,render:()=>e})})}}const D=O,M="__docusaurus-base-url-issue-banner-container",F="__docusaurus-base-url-issue-banner",z="__docusaurus-base-url-issue-banner-suggestion-container";function B(e){return`\ndocument.addEventListener('DOMContentLoaded', function maybeInsertBanner() {\n var shouldInsert = typeof window['docusaurus'] === 'undefined';\n shouldInsert && insertBanner();\n});\n\nfunction insertBanner() {\n var bannerContainer = document.createElement('div');\n bannerContainer.id = '${M}';\n var bannerHtml = ${JSON.stringify(function(e){return`\n