first commit
This commit is contained in:
		
							
								
								
									
										393
									
								
								firatheme.typ
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										393
									
								
								firatheme.typ
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,393 @@
 | 
			
		||||
// This theme is inspired by https://github.com/zbowang/BeamerTheme
 | 
			
		||||
// The typst version was written by https://github.com/OrangeX4
 | 
			
		||||
 | 
			
		||||
#import "@preview/touying:0.6.1": *
 | 
			
		||||
 | 
			
		||||
#let _typst-builtin-repeat = repeat
 | 
			
		||||
 | 
			
		||||
#let fira-header(self) = {
 | 
			
		||||
  if self.store.navigation == "sidebar" {
 | 
			
		||||
    place(
 | 
			
		||||
      right + top,
 | 
			
		||||
      {
 | 
			
		||||
        v(4em)
 | 
			
		||||
        show: block.with(width: self.store.sidebar.width, inset: (x: 1em))
 | 
			
		||||
        set align(left)
 | 
			
		||||
        set par(justify: false)
 | 
			
		||||
        set text(size: .9em)
 | 
			
		||||
        components.custom-progressive-outline(
 | 
			
		||||
          self: self,
 | 
			
		||||
          level: auto,
 | 
			
		||||
          alpha: self.store.alpha,
 | 
			
		||||
          text-fill: (self.colors.primary, self.colors.neutral-darkest),
 | 
			
		||||
          text-size: (1em, .9em),
 | 
			
		||||
          vspace: (-.2em,),
 | 
			
		||||
          indent: (0em, self.store.sidebar.at("indent", default: .5em)),
 | 
			
		||||
          fill: (self.store.sidebar.at("fill", default: _typst-builtin-repeat[.]),),
 | 
			
		||||
          filled: (self.store.sidebar.at("filled", default: false),),
 | 
			
		||||
          paged: (self.store.sidebar.at("paged", default: false),),
 | 
			
		||||
          short-heading: self.store.sidebar.at("short-heading", default: true),
 | 
			
		||||
        )
 | 
			
		||||
      },
 | 
			
		||||
    )
 | 
			
		||||
  } else if self.store.navigation == "mini-slides" {
 | 
			
		||||
    components.mini-slides(
 | 
			
		||||
      self: self,
 | 
			
		||||
      fill: self.colors.primary,
 | 
			
		||||
      alpha: self.store.alpha,
 | 
			
		||||
      display-section: self.store.mini-slides.at("display-section", default: false),
 | 
			
		||||
      display-subsection: self.store.mini-slides.at("display-subsection", default: true),
 | 
			
		||||
      linebreaks: self.store.mini-slides.at("linebreaks", default: true),
 | 
			
		||||
      short-heading: self.store.mini-slides.at("short-heading", default: true),
 | 
			
		||||
    )
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#let fira-footer(self) = {
 | 
			
		||||
  set align(bottom)
 | 
			
		||||
  set text(size: 0.8em)
 | 
			
		||||
  show: pad.with(.5em)
 | 
			
		||||
  components.left-and-right(
 | 
			
		||||
    text(fill: self.colors.neutral-darkest.lighten(40%), utils.call-or-display(self, self.store.footer)),
 | 
			
		||||
    text(fill: self.colors.neutral-darkest.lighten(20%), utils.call-or-display(self, self.store.footer-right)),
 | 
			
		||||
  )
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// Default slide function for the presentation.
 | 
			
		||||
///
 | 
			
		||||
/// - config (dictionary): The configuration of the slide. You can use `config-xxx` to set the configuration of the slide. For more several configurations, you can use `utils.merge-dicts` to merge them.
 | 
			
		||||
///
 | 
			
		||||
/// - repeat (int, auto): The number of subslides. Default is `auto`, which means touying will automatically calculate the number of subslides.
 | 
			
		||||
///
 | 
			
		||||
///   The `repeat` argument is necessary when you use `#slide(repeat: 3, self => [ .. ])` style code to create a slide. The callback-style `uncover` and `only` cannot be detected by touying automatically.
 | 
			
		||||
///
 | 
			
		||||
/// - setting (function): The setting of the slide. You can use it to add some set/show rules for the slide.
 | 
			
		||||
///
 | 
			
		||||
/// - composer (function, array): The composer of the slide. You can use it to set the layout of the slide.
 | 
			
		||||
///
 | 
			
		||||
///   For example, `#slide(composer: (1fr, 2fr, 1fr))[A][B][C]` to split the slide into three parts. The first and the last parts will take 1/4 of the slide, and the second part will take 1/2 of the slide.
 | 
			
		||||
///
 | 
			
		||||
///   If you pass a non-function value like `(1fr, 2fr, 1fr)`, it will be assumed to be the first argument of the `components.side-by-side` function.
 | 
			
		||||
///
 | 
			
		||||
///   The `components.side-by-side` function is a simple wrapper of the `grid` function. It means you can use the `grid.cell(colspan: 2, ..)` to make the cell take 2 columns.
 | 
			
		||||
///
 | 
			
		||||
///   For example, `#slide(composer: 2)[A][B][#grid.cell(colspan: 2)[Footer]]` will make the `Footer` cell take 2 columns.
 | 
			
		||||
///
 | 
			
		||||
///   If you want to customize the composer, you can pass a function to the `composer` argument. The function should receive the contents of the slide and return the content of the slide, like `#slide(composer: grid.with(columns: 2))[A][B]`.
 | 
			
		||||
///
 | 
			
		||||
/// - bodies (array): The contents of the slide. You can call the `slide` function with syntax like `#slide[A][B][C]` to create a slide.
 | 
			
		||||
#let slide(
 | 
			
		||||
  config: (:),
 | 
			
		||||
  repeat: auto,
 | 
			
		||||
  setting: body => body,
 | 
			
		||||
  composer: auto,
 | 
			
		||||
  ..bodies,
 | 
			
		||||
) = touying-slide-wrapper(self => {
 | 
			
		||||
  let self = utils.merge-dicts(
 | 
			
		||||
    self,
 | 
			
		||||
    config-page(
 | 
			
		||||
      header: fira-header,
 | 
			
		||||
      footer: none,
 | 
			
		||||
    ),
 | 
			
		||||
    config-common(subslide-preamble: self.store.subslide-preamble),
 | 
			
		||||
  )
 | 
			
		||||
  touying-slide(self: self, config: config, repeat: repeat, setting: setting, composer: composer, ..bodies)
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/// Title slide for the presentation. You should update the information in the `config-info` function. You can also pass the information directly to the `title-slide` function.
 | 
			
		||||
///
 | 
			
		||||
/// Example:
 | 
			
		||||
///
 | 
			
		||||
/// ```typst
 | 
			
		||||
/// #show: fira-theme.with(
 | 
			
		||||
///   config-info(
 | 
			
		||||
///     title: [Title],
 | 
			
		||||
///     logo: emoji.city,
 | 
			
		||||
///   ),
 | 
			
		||||
/// )
 | 
			
		||||
///
 | 
			
		||||
/// #title-slide(subtitle: [Subtitle], extra: [Extra information])
 | 
			
		||||
/// ```
 | 
			
		||||
///
 | 
			
		||||
/// - config (dictionary): The configuration of the slide. You can use `config-xxx` to set the configuration of the slide. For more several configurations, you can use `utils.merge-dicts` to merge them.
 | 
			
		||||
/// 
 | 
			
		||||
/// - extra (string, none): The extra information you want to display on the title slide.
 | 
			
		||||
#let title-slide(
 | 
			
		||||
  config: (:),
 | 
			
		||||
  extra: none,
 | 
			
		||||
  ..args,
 | 
			
		||||
) = touying-slide-wrapper(self => {
 | 
			
		||||
  self = utils.merge-dicts(
 | 
			
		||||
    self,
 | 
			
		||||
    config,
 | 
			
		||||
    config-common(freeze-slide-counter: true),
 | 
			
		||||
    config-page(margin: 0em),
 | 
			
		||||
  )
 | 
			
		||||
  let info = self.info + args.named()
 | 
			
		||||
  let body = {
 | 
			
		||||
    set par(justify: false)
 | 
			
		||||
    set text(fill: self.colors.neutral-darkest)
 | 
			
		||||
    set align(center + horizon)
 | 
			
		||||
    block(
 | 
			
		||||
      width: 100%,
 | 
			
		||||
      inset: 3em,
 | 
			
		||||
      {
 | 
			
		||||
        block(
 | 
			
		||||
          // fill: self.colors.neutral-light,
 | 
			
		||||
          inset: 1em,
 | 
			
		||||
          width: 100%,
 | 
			
		||||
          // radius: 0.2em,
 | 
			
		||||
          text(size: 1.6em, fill: self.colors.primary, text(weight: "bold", info.title, hyphenate: false)) + (
 | 
			
		||||
            if info.subtitle != none {
 | 
			
		||||
              linebreak()
 | 
			
		||||
              text(size: 1.2em, fill: self.colors.primary, info.subtitle)
 | 
			
		||||
            }
 | 
			
		||||
          ),
 | 
			
		||||
        )
 | 
			
		||||
        set text(size: 1em)
 | 
			
		||||
        if info.author != none {
 | 
			
		||||
          block(spacing: 1em, info.author)
 | 
			
		||||
        }
 | 
			
		||||
        v(1em)
 | 
			
		||||
        if info.date != none {
 | 
			
		||||
          block(spacing: 1em, utils.display-info-date(self))
 | 
			
		||||
        }
 | 
			
		||||
        set text(size: 1em)
 | 
			
		||||
        if info.institution != none {
 | 
			
		||||
          block(spacing: 1em, info.institution)
 | 
			
		||||
        }
 | 
			
		||||
        if extra != none {
 | 
			
		||||
          block(spacing: 1em, extra)
 | 
			
		||||
        }
 | 
			
		||||
      },
 | 
			
		||||
    )
 | 
			
		||||
  }
 | 
			
		||||
  touying-slide(self: self, body)
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/// Outline slide for the presentation.
 | 
			
		||||
/// 
 | 
			
		||||
/// - config (dictionary): The configuration of the slide. You can use `config-xxx` to set the configuration of the slide. For more several configurations, you can use `utils.merge-dicts` to merge them.
 | 
			
		||||
/// 
 | 
			
		||||
/// - title (string): The title of the slide. Default is `utils.i18n-outline-title`.
 | 
			
		||||
#let outline-slide(config: (:), title: utils.i18n-outline-title, ..args) = touying-slide-wrapper(self => {
 | 
			
		||||
  self = utils.merge-dicts(
 | 
			
		||||
    self,
 | 
			
		||||
    config-page(
 | 
			
		||||
      footer: none,
 | 
			
		||||
    ),
 | 
			
		||||
  )
 | 
			
		||||
  touying-slide(
 | 
			
		||||
    self: self,
 | 
			
		||||
    config: config,
 | 
			
		||||
    components.adaptive-columns(
 | 
			
		||||
      start: underline(text(
 | 
			
		||||
        1.6em,
 | 
			
		||||
        fill: self.colors.primary,
 | 
			
		||||
        weight: "bold",
 | 
			
		||||
        utils.call-or-display(self, title),
 | 
			
		||||
      ),stroke: 4pt, offset: 0.2em),
 | 
			
		||||
      text(
 | 
			
		||||
        fill: self.colors.neutral-darkest,
 | 
			
		||||
        outline(title: none, indent: 1em, depth: self.slide-level, ..args),
 | 
			
		||||
      ),
 | 
			
		||||
    ),
 | 
			
		||||
  )
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/// New section slide for the presentation. You can update it by updating the `new-section-slide-fn` argument for `config-common` function.
 | 
			
		||||
///
 | 
			
		||||
/// Example: `config-common(new-section-slide-fn: new-section-slide.with(numbered: false))`
 | 
			
		||||
/// 
 | 
			
		||||
/// - config (dictionary): The configuration of the slide. You can use `config-xxx` to set the configuration of the slide. For more several configurations, you can use `utils.merge-dicts` to merge them.
 | 
			
		||||
///
 | 
			
		||||
/// - title (string): The title of the slide. Default is `utils.i18n-outline-title`.
 | 
			
		||||
///
 | 
			
		||||
/// - body (array): The contents of the slide.
 | 
			
		||||
#let new-section-slide(config: (:), title: utils.i18n-outline-title, ..args, body) = touying-slide-wrapper(self => {
 | 
			
		||||
  self = utils.merge-dicts(
 | 
			
		||||
    self,
 | 
			
		||||
    config-page(
 | 
			
		||||
      footer: none,
 | 
			
		||||
    ),
 | 
			
		||||
  )
 | 
			
		||||
  touying-slide(
 | 
			
		||||
    self: self,
 | 
			
		||||
    config: config,
 | 
			
		||||
    components.adaptive-columns(
 | 
			
		||||
      start: text(
 | 
			
		||||
        1.2em,
 | 
			
		||||
        fill: self.colors.primary,
 | 
			
		||||
        weight: "bold",
 | 
			
		||||
        utils.call-or-display(self, title),
 | 
			
		||||
      ),
 | 
			
		||||
      text(
 | 
			
		||||
        fill: self.colors.neutral-darkest,
 | 
			
		||||
        components.progressive-outline(
 | 
			
		||||
          alpha: self.store.alpha,
 | 
			
		||||
          title: none,
 | 
			
		||||
          indent: 1em,
 | 
			
		||||
          depth: self.slide-level,
 | 
			
		||||
          ..args,
 | 
			
		||||
        ),
 | 
			
		||||
      ),
 | 
			
		||||
    ),
 | 
			
		||||
  )
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/// Focus on some content.
 | 
			
		||||
///
 | 
			
		||||
/// Example: `#focus-slide[Wake up!]`
 | 
			
		||||
/// 
 | 
			
		||||
/// - config (dictionary): The configuration of the slide. You can use `config-xxx` to set the configuration of the slide. For more several configurations, you can use `utils.merge-dicts` to merge them.
 | 
			
		||||
#let focus-slide(config: (:), body) = touying-slide-wrapper(self => {
 | 
			
		||||
  self = utils.merge-dicts(
 | 
			
		||||
    self,
 | 
			
		||||
    config-common(freeze-slide-counter: true),
 | 
			
		||||
    config-page(fill: self.colors.primary, margin: 2em),
 | 
			
		||||
  )
 | 
			
		||||
  set text(fill: self.colors.neutral-lightest, size: 1.5em)
 | 
			
		||||
  touying-slide(self: self, config: config, align(horizon + center, body))
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/// Touying fira theme.
 | 
			
		||||
///
 | 
			
		||||
/// Example:
 | 
			
		||||
///
 | 
			
		||||
/// ```typst
 | 
			
		||||
/// #show: fira-theme.with(aspect-ratio: "16-9", config-colors(primary: blue))`
 | 
			
		||||
/// ```
 | 
			
		||||
///
 | 
			
		||||
/// The default colors:
 | 
			
		||||
///
 | 
			
		||||
/// ```typ
 | 
			
		||||
/// config-colors(
 | 
			
		||||
///   neutral-darkest: rgb("#000000"),
 | 
			
		||||
///   neutral-dark: rgb("#202020"),
 | 
			
		||||
///   neutral-light: rgb("#f3f3f3"),
 | 
			
		||||
///   neutral-lightest: rgb("#ffffff"),
 | 
			
		||||
///   primary: rgb("#0c4842"),
 | 
			
		||||
/// )
 | 
			
		||||
/// ```
 | 
			
		||||
///
 | 
			
		||||
/// - aspect-ratio (string): The aspect ratio of the slides. Default is `16-9`.
 | 
			
		||||
///
 | 
			
		||||
/// - navigation (string): The navigation of the slides. You can choose from `"sidebar"`, `"mini-slides"`, and `none`. Default is `"sidebar"`.
 | 
			
		||||
///
 | 
			
		||||
/// - sidebar (dictionary): The configuration of the sidebar. You can set the width, filled, numbered, indent, and short-heading of the sidebar. Default is `(width: 10em, filled: false, numbered: false, indent: .5em, short-heading: true)`.
 | 
			
		||||
///   - width (string): The width of the sidebar.
 | 
			
		||||
///   - filled (boolean): Whether the outline in the sidebar is filled.
 | 
			
		||||
///   - numbered (boolean): Whether the outline in the sidebar is numbered.
 | 
			
		||||
///   - indent (length): The indent of the outline in the sidebar.
 | 
			
		||||
///   - short-heading (boolean): Whether the outline in the sidebar is short.
 | 
			
		||||
///
 | 
			
		||||
/// - mini-slides (dictionary): The configuration of the mini-slides. You can set the height, x, display-section, display-subsection, and short-heading of the mini-slides. Default is `(height: 4em, x: 2em, display-section: false, display-subsection: true, linebreaks: true, short-heading: true)`.
 | 
			
		||||
///   - height (length): The height of the mini-slides.
 | 
			
		||||
///   - x (length): The x position of the mini-slides.
 | 
			
		||||
///   - display-section (boolean): Whether the slides of sections are displayed in the mini-slides.
 | 
			
		||||
///   - display-subsection (boolean): Whether the slides of subsections are displayed in the mini-slides.
 | 
			
		||||
///   - linebreaks (boolean): Whether line breaks are in between links for sections and subsections in the mini-slides.
 | 
			
		||||
///   - short-heading (boolean): Whether the mini-slides are short. Default is `true`.
 | 
			
		||||
///
 | 
			
		||||
/// - footer (content, function): The footer of the slides. Default is `none`.
 | 
			
		||||
///
 | 
			
		||||
/// - footer-right (content, function): The right part of the footer. Default is `context utils.slide-counter.display() + " / " + utils.last-slide-number`.
 | 
			
		||||
///
 | 
			
		||||
/// - primary (color): The primary color of the slides. Default is `rgb("#0c4842")`.
 | 
			
		||||
///
 | 
			
		||||
/// - alpha (fraction, float): The alpha of transparency. Default is `60%`.
 | 
			
		||||
///
 | 
			
		||||
/// - outline-title (content, function): The title of the outline. Default is `utils.i18n-outline-title`.
 | 
			
		||||
///
 | 
			
		||||
/// - subslide-preamble (content, function): The preamble of the subslide. Default is `self => block(text(1.2em, weight: "bold", fill: self.colors.primary, utils.display-current-heading(depth: self.slide-level)))`.
 | 
			
		||||
#let fira-theme(
 | 
			
		||||
  aspect-ratio: "4-3",
 | 
			
		||||
  navigation: "sidebar",
 | 
			
		||||
  sidebar: (
 | 
			
		||||
    width: 10em,
 | 
			
		||||
    filled: false,
 | 
			
		||||
    numbered: false,
 | 
			
		||||
    indent: .5em,
 | 
			
		||||
    short-heading: true,
 | 
			
		||||
  ),
 | 
			
		||||
  mini-slides: (
 | 
			
		||||
    height: 4em,
 | 
			
		||||
    x: 2em,
 | 
			
		||||
    display-section: false,
 | 
			
		||||
    display-subsection: true,
 | 
			
		||||
    linebreaks: true,
 | 
			
		||||
    short-heading: true,
 | 
			
		||||
  ),
 | 
			
		||||
  footer: none,
 | 
			
		||||
  footer-right: context utils.slide-counter.display() + " / " + utils.last-slide-number,
 | 
			
		||||
  primary: rgb("#0c4842"),
 | 
			
		||||
  alpha: 60%,
 | 
			
		||||
  subslide-preamble: self => block(
 | 
			
		||||
    text(1.2em, weight: "bold", fill: self.colors.primary, utils.display-current-heading(depth: self.slide-level, style: auto)),
 | 
			
		||||
  ),
 | 
			
		||||
  ..args,
 | 
			
		||||
  body,
 | 
			
		||||
) = {
 | 
			
		||||
  sidebar = utils.merge-dicts(
 | 
			
		||||
    (width: 10em, filled: false, numbered: false, indent: .5em, short-heading: true),
 | 
			
		||||
    sidebar,
 | 
			
		||||
  )
 | 
			
		||||
  mini-slides = utils.merge-dicts(
 | 
			
		||||
    (height: 4em, x: 2em, display-section: false, display-subsection: true, linebreaks: true, short-heading: true),
 | 
			
		||||
    mini-slides,
 | 
			
		||||
  )
 | 
			
		||||
  set text(size: 20pt)
 | 
			
		||||
  set par(justify: true)
 | 
			
		||||
 | 
			
		||||
  show: touying-slides.with(
 | 
			
		||||
    config-page(
 | 
			
		||||
      paper: "presentation-" + aspect-ratio,
 | 
			
		||||
      header-ascent: 0em,
 | 
			
		||||
      footer-descent: 0em,
 | 
			
		||||
      margin: if navigation == "sidebar" {
 | 
			
		||||
        (top: 2em, bottom: 1em, x: sidebar.width)
 | 
			
		||||
      } else if navigation == "mini-slides" {
 | 
			
		||||
        (top: mini-slides.height, bottom: 2em, x: mini-slides.x)
 | 
			
		||||
      } else {
 | 
			
		||||
        (top: 2em, bottom: 2em, x: mini-slides.x)
 | 
			
		||||
      },
 | 
			
		||||
    ),
 | 
			
		||||
    config-common(
 | 
			
		||||
      slide-fn: slide,
 | 
			
		||||
      new-section-slide-fn: none //new-section-slide,
 | 
			
		||||
    ),
 | 
			
		||||
    config-methods(
 | 
			
		||||
        init: (self: none, body) => {
 | 
			
		||||
        show heading: set text(self.colors.primary)
 | 
			
		||||
 | 
			
		||||
        body
 | 
			
		||||
      },
 | 
			
		||||
      alert: utils.alert-with-primary-color,
 | 
			
		||||
    ),
 | 
			
		||||
    config-colors(
 | 
			
		||||
      neutral-darkest: rgb("#000000"),
 | 
			
		||||
      neutral-dark: rgb("#202020"),
 | 
			
		||||
      neutral-light: rgb("#f3f3f3"),
 | 
			
		||||
      neutral-lightest: rgb("#ffffff"),
 | 
			
		||||
      primary: primary,
 | 
			
		||||
    ),
 | 
			
		||||
    // save the variables for later use
 | 
			
		||||
    config-store(
 | 
			
		||||
      navigation: navigation,
 | 
			
		||||
      sidebar: sidebar,
 | 
			
		||||
      mini-slides: mini-slides,
 | 
			
		||||
      footer: footer,
 | 
			
		||||
      footer-right: footer-right,
 | 
			
		||||
      alpha: alpha,
 | 
			
		||||
      subslide-preamble: subslide-preamble,
 | 
			
		||||
    ),
 | 
			
		||||
    ..args,
 | 
			
		||||
  )
 | 
			
		||||
 | 
			
		||||
  body
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										69
									
								
								touying.typ
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								touying.typ
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,69 @@
 | 
			
		||||
#import "@preview/touying:0.6.1": *
 | 
			
		||||
#import "/slides/firatheme.typ": *
 | 
			
		||||
 | 
			
		||||
#import "@preview/numbly:0.1.0": numbly
 | 
			
		||||
 | 
			
		||||
#set text(font: "FiraGO", weight: "light", size: 20pt)
 | 
			
		||||
#show math.equation: set text(font: "Fira Math")
 | 
			
		||||
#set strong(delta: 100)
 | 
			
		||||
#set par(justify: true)
 | 
			
		||||
 | 
			
		||||
#show: fira-theme.with(
 | 
			
		||||
  // aspect-ratio: "16-9",
 | 
			
		||||
  // footer: self => self.info.institution,
 | 
			
		||||
  navigation: "mini-slides",
 | 
			
		||||
  config-info(
 | 
			
		||||
    title: [Faster FPTAS for Edge Connectivity
 | 
			
		||||
Interdiction],
 | 
			
		||||
    // subtitle: [Subtitle],
 | 
			
		||||
    author: [Authors],
 | 
			
		||||
    date: datetime.today(),
 | 
			
		||||
    institution: [Institution],
 | 
			
		||||
  ),
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// #set heading(numbering: numbly("{1}.", default: "1.1"))
 | 
			
		||||
 | 
			
		||||
#title-slide()
 | 
			
		||||
 | 
			
		||||
#outline-slide()
 | 
			
		||||
 | 
			
		||||
= Section A
 | 
			
		||||
 | 
			
		||||
== Subsection A.1
 | 
			
		||||
 | 
			
		||||
$ x_(n+1) = (x_n + a/x_n) / 2 $
 | 
			
		||||
 | 
			
		||||
== Subsection A.2
 | 
			
		||||
 | 
			
		||||
A slide without a title but with *important* infos
 | 
			
		||||
 | 
			
		||||
= Section B
 | 
			
		||||
 | 
			
		||||
== Subsection B.1
 | 
			
		||||
 | 
			
		||||
#lorem(80)
 | 
			
		||||
 | 
			
		||||
#focus-slide[
 | 
			
		||||
  Wake up!
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
== Subsection B.2
 | 
			
		||||
 | 
			
		||||
We can use `#pause` to #pause display something later.
 | 
			
		||||
 | 
			
		||||
#pause
 | 
			
		||||
 | 
			
		||||
Just like this.
 | 
			
		||||
 | 
			
		||||
#meanwhile
 | 
			
		||||
 | 
			
		||||
Meanwhile, #pause we can also use `#meanwhile` to #pause display other content synchronously.
 | 
			
		||||
 | 
			
		||||
#show: appendix
 | 
			
		||||
 | 
			
		||||
= Appendix
 | 
			
		||||
 | 
			
		||||
== Appendix
 | 
			
		||||
 | 
			
		||||
Please pay attention to the current slide number.
 | 
			
		||||
		Reference in New Issue
	
	Block a user