summaryrefslogtreecommitdiff
path: root/presentation/kit-slides.typ
diff options
context:
space:
mode:
Diffstat (limited to 'presentation/kit-slides.typ')
-rw-r--r--presentation/kit-slides.typ321
1 files changed, 321 insertions, 0 deletions
diff --git a/presentation/kit-slides.typ b/presentation/kit-slides.typ
new file mode 100644
index 0000000..b3b5cf8
--- /dev/null
+++ b/presentation/kit-slides.typ
@@ -0,0 +1,321 @@
+//==========================================================
+// Karlsruhe Institute of Technology theme for Typst slides.
+// Based on the official Powerpoint Theme and Latex Template
+//
+// You don't need to edit this file. Only presentation.typ
+// =========================================================
+#import "@preview/polylux:0.3.1": *
+
+#let _kit-outer-margin = 3mm
+#let _kit-inner-margin = 11mm
+#let _kit-top-margin = 10mm
+#let _kit-bottom-margin = 11mm
+
+#let kit-green = rgb(0, 150, 130)
+#let kit-blue = rgb(70, 100, 170)
+#let green = kit-green
+#let blue = kit-blue
+#let black70 = rgb(64, 64, 64)
+#let brown = rgb(167, 130, 46)
+#let purple = rgb(163, 16, 124)
+#let cyan = rgb(35, 161, 224)
+#let lime = rgb(140, 182, 60)
+#let yellow = rgb(252, 229, 0)
+#let orange = rgb(223, 155, 27)
+#let red = rgb(162, 34, 35)
+
+#let kit-title = state("kit-title", [])
+#let kit-subtitle = state("kit-subtitle", [])
+#let kit-short-title = state("kit-short-title", none)
+#let kit-author = state("kit-author", [])
+#let kit-short-author = state("kit-short-author", none)
+#let kit-group-logo = state("kit-group-logo", none)
+#let kit-institute = state("kit-institute", [])
+#let kit-date = state("kit-date", none)
+#let kit-show-page-count = state("kit-show-page-count", false)
+
+//=================
+// Helper functions
+//=================
+
+#let kit-logo(..rest) = context {
+ if text.lang == "de" {
+ image("/assets/kit/logo-de.svg", ..rest)
+ } else {
+ image("/assets/kit/logo-en.svg", ..rest)
+ }
+}
+
+#let kit-rounded-block(radius: 3mm, body) = {
+ block(
+ radius: (
+ top-right: radius,
+ bottom-left: radius,
+ ),
+ clip: true,
+ body,
+ )
+}
+
+#let kit-list-marker = move(
+ dy: 0.125em,
+ kit-rounded-block(
+ radius: 0.15em,
+ rect(
+ // The latex documentclass uses a size of 1ex, but type only supports em.
+ width: 0.5em,
+ height: 0.5em,
+ fill: kit-green,
+ ),
+ ),
+)
+
+#let kit-theme(
+ title: none,
+ subtitle: none,
+ short-title: none,
+ author: none,
+ short-author: none,
+ language: "de",
+ group-logo: none,
+ institute: none,
+ date: none,
+ aspect-ratio: "16-9",
+ show-page-count: false,
+ body,
+) = {
+
+ if language not in ("en", "de") {
+ panic("Only English (en) and German (de) are currently supported")
+ }
+ set page(margin: 0pt, header-ascent: 0pt, footer-descent: 0pt)
+ // Use power point page sizes, as they differ from default typst page sizes.
+ set page(width: 25.4cm, height: 14.29cm) if aspect-ratio == "16-9"
+ set page(width: 25.4cm, height: 15.88cm) if aspect-ratio == "16-10"
+ set page(width: 25.4cm, height: 19.05cm) if aspect-ratio == "4-3"
+ if aspect-ratio not in ("16-9", "16-10", "4-3") {
+ panic("Unsupported aspect ratio")
+ }
+
+ set text(lang: language, font: ("Arial", "Helvetica", "Roboto"))
+
+ set list(marker: kit-list-marker)
+
+ kit-title.update(title)
+ kit-subtitle.update(subtitle)
+ if short-title == none {
+ kit-short-title.update(title)
+ } else {
+ kit-short-title.update(short-title)
+ }
+ kit-author.update(author)
+ if short-author == none {
+ kit-short-author.update(author)
+ } else {
+ kit-short-author.update(short-author)
+ }
+ kit-institute.update(institute)
+ kit-group-logo.update(group-logo)
+ kit-date.update(date)
+ kit-show-page-count.update(show-page-count)
+
+ body
+}
+
+//=================
+// slides
+//=================
+
+#let title-slide(banner: none) = {
+ show: polylux-slide
+ if banner == none {
+ banner = image("/assets/kit/banner.jpg")
+ }
+
+ // Top half
+ pad(left: _kit-inner-margin, right: 6mm, top: _kit-top-margin)[
+ // KIT logo
+ #place[
+ #kit-logo(width: 45mm)
+ ]
+ // Group logo
+ #place(right)[
+ #block(width: 30mm, height: 30mm)[
+ #set image(width: 100%)
+ #context kit-group-logo.get()
+ ]
+ ]
+ // Title
+ #place(dy: 32mm, text(weight: "bold", size: 26pt, kit-title.display()))
+ // Subtitle
+ #place(dy: 44mm)[
+ #set text(weight: "bold", size: 18pt)
+ #set par(leading: 0.3em)
+ #kit-subtitle.display()
+ ]
+ ]
+
+ // Bottom half
+ align(
+ bottom,
+ pad(x: _kit-outer-margin)[
+ // Banner
+ #block(height: 60mm, below: 0pt)[
+ #kit-rounded-block(radius: 3mm)[
+ #set image(width: 100%, height: 100%)
+ #banner
+ ]
+ ]
+ // Footer
+ #block(height: _kit-bottom-margin, width: 100%)[
+ #grid(
+ columns: (auto, 1fr),
+ [
+ #align(left + horizon)[
+ #block(height: 100%)[
+ #set text(size: 8pt)
+ #context {
+ if text.lang == "en" [
+ KIT - The Research University in the Helmholtz Association
+ ] else if text.lang == "de" [
+ KIT - Die Forschungsuniversität in der Helmholtz-Gemeinschaft
+ ]
+ }
+ ]
+ ]
+ ],
+ [
+ #align(
+ right + horizon,
+ block(height: 100%)[
+ #link(
+ "https://www.kit.edu",
+ text("www.kit.edu", weight: "bold", size: 16.5pt),
+ )
+ ],
+ )
+ ],
+ )
+ ]
+ ],
+ )
+}
+
+#let slide(title: [], body) = {
+ // Title bar
+ let header = block(width: 100%, height: 100%, inset: (x: _kit-inner-margin))[
+ #grid(
+ columns: (auto, 1fr),
+ [
+ #set text(24pt, weight: "bold")
+ // We need a block here to force the grid to take the full height of the surrounding block
+ #block(height: 100%)[
+ #align(left + bottom, title)
+ ]
+ ],
+ [
+ #align(right + bottom)[
+ #kit-logo(width: 30mm)
+ ]
+ ],
+ )
+ ]
+
+ // Content block
+ let wrapped-body = block(
+ width: 100%,
+ height: 100%,
+ inset: (x: _kit-inner-margin, top: 15.5mm),
+ )[
+ #set text(18pt)
+ // Default value, but had to be changed for layout
+ #set block(above: 1.2em)
+ #body
+ ]
+
+ // Footer
+ let footer = block(width: 100%, inset: (x: _kit-outer-margin))[
+ #set block(above: 0pt)
+ #set text(size: 9pt)
+ #line(stroke: rgb("#d8d8d8"), length: 100%)
+ #block(width: 100%, height: 100%)[
+ #align(horizon)[
+ #grid(
+ columns: (20mm, 30mm, 1fr, auto),
+ pad(
+ left: 6mm,
+ context if kit-show-page-count.get() [
+ #logic.logical-slide.display()/#strong(utils.last-slide-number)
+ ] else [
+ #logic.logical-slide.display()
+ ],
+ ),
+ kit-date.display(),
+ [#kit-short-author.display() - #kit-short-title.display()],
+ align(right, kit-institute.display()),
+ )
+ ]
+ ]
+ ]
+
+ set page(
+ header: header,
+ footer: footer,
+ margin: (top: 22.5mm, bottom: _kit-bottom-margin),
+ )
+ polylux-slide(wrapped-body)
+}
+
+// This function is left here for backwards compatibility only. Please use #slide(side-by-side[][]) instead.
+#let split-slide(title: [], body-left, body-right) = {
+ let body = grid(
+ columns: (1fr, 1fr),
+ gutter: 2em,
+ body-left, body-right,
+ )
+
+ slide(title: title, body)
+}
+
+#let kit-color-block(title: [], color: [], body) = {
+ // 80% is a rough heuristic, that produces the correct result for all predefined colors.
+ // Might be adjusted in the future
+ let title-color = if luma(color).components().at(0) >= 80% {
+ black
+ } else {
+ white
+ }
+ kit-rounded-block()[
+ #block(
+ width: 100%,
+ inset: (x: 0.5em, top: 0.3em, bottom: 0.4em),
+ fill: gradient.linear(
+ (color, 0%),
+ (color, 87%),
+ (color.lighten(85%), 100%),
+ dir: ttb,
+ ),
+ text(fill: title-color, title),
+ )
+ #set text(size: 15pt)
+ #block(
+ inset: 0.5em,
+ above: 0pt,
+ fill: color.lighten(85%),
+ width: 100%,
+ body,
+ )
+ ]
+}
+
+#let kit-info-block(title: [], body) = {
+ kit-color-block(title: title, color: kit-green, body)
+}
+
+#let kit-example-block(title: [], body) = {
+ kit-color-block(title: title, color: kit-blue, body)
+}
+
+#let kit-alert-block(title: [], body) = {
+ kit-color-block(title: title, color: red.lighten(10%), body)
+}