diff --git a/1.0.1/README.md b/1.0.1/README.md new file mode 100644 index 0000000..7e5c66a --- /dev/null +++ b/1.0.1/README.md @@ -0,0 +1,66 @@ +# Typst ISEC Slides Template + +An opinionated version of the ISEC slides template made in Typst. Easily configurable for other institutes or organizations. + +Author: Ernesto Martínez García <[ecomaikgolf.com](https://ecomaikgolf.com)> + +Tested typst version: `0.13.1`. + +> [!NOTE] +> If you are an ISEC or TUGraz employee and think that `isec-slides` or +> `tugraz-slieds` fits more, I would need an approval to allocate the name :) + +Need a thesis? Check out the sibling package [definitely-not-isec-thesis](https://typst.app/universe/package/definitely-not-isec-thesis) + +## Contributing + +Contribute to the template in the [upstream repository](https://github.com/ecomaikgolf/typst-isec-slides-template) + +Check for [open issues](https://github.com/ecomaikgolf/typst-isec-slides-template/issues) + +## Design +--- +![title](https://github.com/user-attachments/assets/d29f53ff-0622-45fe-9727-7d286e8d15b1) + +--- +![list](https://github.com/user-attachments/assets/27dc198d-714d-4ed6-ad2e-f39babcf4fce) + +--- +![listimage](https://github.com/user-attachments/assets/b16cb69b-c9a1-4f50-8fd5-e7c3b0a97617) + +--- +![standout](https://github.com/user-attachments/assets/179960f4-e909-4856-8aba-6beb7a91e3c5) + +--- +![colors](https://github.com/user-attachments/assets/312a013e-fd89-4b6a-921b-bbfe9f4fa565) + +--- +![features]https://github.com/user-attachments/assets/1f3cd158-3860-4962-9802-7fc22d4b94a1) + +--- +![code](https://github.com/user-attachments/assets/508abb37-8224-4ef8-9424-2f367981b91f) + +--- +![blocks](https://github.com/user-attachments/assets/e4214dc0-f434-40d2-b1fa-0463ef18d9b7) + +--- +![plots](https://github.com/user-attachments/assets/605a3bab-c040-4932-9777-03dffabb3a9f) + +--- +![configurable](https://github.com/user-attachments/assets/310a25e2-981c-40b3-bbcb-fc243cbb5983) + +--- +![blank](https://github.com/user-attachments/assets/7533e702-bba3-4462-add2-f2fbe1e50a20) + +--- +![bibliography](https://github.com/user-attachments/assets/6ad78bf1-8af1-43c3-ad15-192fdfd42aff) + +## License `src/assets/tuglogo.svg` + +According to Wikipedia: + +> This logo image consists only of simple geometric shapes or text. It does not +> meet the threshold of originality needed for copyright protection, and is +> therefore in the public domain. [...] + +https://en.m.wikipedia.org/wiki/File:TU_Graz.svg diff --git a/1.0.1/src/assets/tuglogo.svg b/1.0.1/src/assets/tuglogo.svg new file mode 100644 index 0000000..e5d11af --- /dev/null +++ b/1.0.1/src/assets/tuglogo.svg @@ -0,0 +1,47 @@ + + + + + + + + + + diff --git a/1.0.1/src/helper.typ b/1.0.1/src/helper.typ new file mode 100644 index 0000000..6dd9606 --- /dev/null +++ b/1.0.1/src/helper.typ @@ -0,0 +1,59 @@ +// -------------------------------------------------------------------------- +// Extra helper functions + +// Fix for typst #311 "Behavior of first line indentation in paragraphs ..." +// https://github.com/typst/typst/issues/311#issuecomment-2023038611 +// https://forum.typst.app/t/how-to-indent-paragraphs-following-a-list-without-affecting-the-paragraph-after-a-heading/4210?u=fungai2000 +#let fix-311 = context { + set par.line(numbering: none) + v(0pt, weak: true) + par(none) +} + +#let content-to-string(content) = { + if content.has("text") { + content.text + }else if content.has("child") { + content-to-string(content.child) + } else if content.has("children") { + content.children.map(content-to-string).join("") + } else if content.has("body") { + content-to-string(content.body) + } else if content == [ ] { + " " + } +} + +#let content-to-string-omit(content) = { + if content.has("text") { + content.text + }else if content.has("child") { + content-to-string-omit(content.child) + } else if content.has("children") { + content.children.map(content-to-string-omit).join("") + } else if content.has("body") { + content-to-string-omit(content.body) + } else if content == [ ] { + " " + } else { + "..." + } +} + +// partitle simulates \paragraph{title} (more or less) +#let partitle(title: [Title], body) = context [ + #block(above: 0.8cm)[ + *#title.* #h(0.3cm) #body + ] + #fix-311 +] + +// Wrapper for the technique shown here: +// https://typst.app/docs/reference/layout/layout/ +#let measure-text-height(body) = { + layout(size => { + let (height,) = measure(width: size.width, body) + return height + }) +} + +//vim:tabstop=2 softtabstop=2 shiftwidth=2 noexpandtab colorcolumn=81 diff --git a/1.0.1/src/lib.typ b/1.0.1/src/lib.typ new file mode 100644 index 0000000..c996a54 --- /dev/null +++ b/1.0.1/src/lib.typ @@ -0,0 +1,714 @@ +#import "@preview/touying:0.6.1": * + +// Project +#import "helper.typ": * +#import "logos.typ": * + +// Core Imports +#import "@preview/codly:1.3.0": * // For bindings +#import "@preview/cetz:0.4.1" // For bindings +#import "@preview/fletcher:0.5.8" as fletcher: edge, node // For bindings +#import "@preview/tiaoma:0.3.0" // For auto QR generation + +// Styling Macro Imports +#import "@preview/showybox:2.0.4": showybox + +// ----------------------------------------------------------------------------- +// General Config +// ----------------------------------------------------------------------------- + +// Touying bindings for cetz +#let cetz-canvas = touying-reducer.with( + reduce: cetz.canvas, + cover: cetz.draw.hide.with(bounds: true), +) + +// Touying bindings for fletcher +#let fletcher-diagram = touying-reducer.with( + reduce: fletcher.diagram, + cover: fletcher.hide, +) + +// ----------------------------------------------------------------------------- +// Slide Types +// ----------------------------------------------------------------------------- + +/// Normal slide for the presentation, with title (header) and footer +/// +/// Example: +/// +/// ```typst +/// #slide(title: [Slide Title])[ +/// #lorem(20) +/// ] +/// ``` +/// +/// - title (content): Title for the slide +/// - alignment (alignment): Alignment of the contents of the slide +/// - outlined (boolean): If the slide shows on the PDF ToC +/// +/// -> content +#let slide( + title: auto, + alignment: none, + outlined: true, + ..args, +) = touying-slide-wrapper(self => { + let info = self.info + args.named() + + // Header: + // --------------------------------------------------------------------------- + // [ ] Slide Title [ ] Logo [ ] + // --------------------------------------------------------------------------- + let header(self) = { + // Slide Title: if the user overrides the title of a certain slide, use it + let hdr = if title != auto { title } else { self.store.header } + + show heading: set text(size: 24pt, weight: "semibold") + + grid( + columns: (self.page.margin.left, 1fr, 1cm, auto, 1.2cm), + block(), + heading(level: 1, outlined: outlined, hdr), + block(), + move(dy: -0.31cm, institute-logo(self)), + block(), + ) + } + + // Footer: + // --------------------------------------------------------------------------- + // Slide Number [ ] First Author + // --------------------------------------------------------------------------- + let footer(self) = context { + set block(height: 100%, width: 100%) + set text(size: 15pt, fill: self.colors.footer) + + grid( + columns: (self.page.margin.bottom - 1.68%, 1.3%, auto, 1cm), + block(fill: self.colors.primary)[ + #set align(center + horizon) + #set text(fill: white, size: 12pt) + #utils.slide-counter.display() + ], + block(), + block[ + #set align(left + horizon) + #set text(size: 13pt) + #info.at("footer", default: "") + ], + block(), + ) + + // Progress bar + if self.store.progress-bar { + place(bottom + left, float: true, + move(dy: 1.05cm, // Bad solution, I know + components.progress-bar( + height: 3pt, + self.colors.primary, + white, + ) + ) + ) + } + } + + let self = utils.merge-dicts(self, config-page( + header: header, + footer: footer, + )) + + set align( + if alignment == none { + self.store.default-alignment + } else { + alignment + } + ) + + touying-slide(self: self, ..args) +}) + +/// Title slide for the presentation +/// +/// Example: +/// +/// ```typst +/// #title-slide() +/// ``` +/// +/// -> content +#let title-slide(..args) = touying-slide-wrapper(self => { + let info = self.info + args.named() + let body = { + let footer-isec = [ + #set text(size: 13.3pt, weight: "medium") + + #let arrow-icon = [ + #move(dy: -0.05cm, dx: -0.05cm, rotate(45deg, square( + fill: none, + size: 0.18cm, + stroke: ( + "top": self.colors.primary + 1.35pt, + "bottom": none, + "right": self.colors.primary + 1.35pt, + "left": none, + ), + ))) + ] + + #v(-0.5cm) + #box(arrow-icon) #h(0.1cm) #self.store.institute + ] + + set page(footer: footer-isec, header: none) + set block(below: 0pt, above: 0pt) + + // Top-right icon + text + place(top + right, dy: -1.9cm, dx: 0.78cm, [ + #self.store.logo + ]) + + v(0.8cm) + + block(width: 83%)[ + #let title = text(size: 40.5pt, weight: "bold")[#info.at( + "title", + default: "", + )] + + #move(dx: 0.04em)[ + #grid( + columns: (0.195cm, auto), + column-gutter: 0.7cm, + context [ + #let s = measure(title) + #move(dy: -0.4cm, rect( + fill: self.colors.primary, + height: s.height + 0.65cm, + )) + ], + title, + ) + ] + ] + + v(0.6cm) + + block(width: 70%)[ + #text( + size: 28.3pt, + fill: self.colors.primary, + weight: "bold", + )[#info.subtitle] + ] + + v(1.48cm) + + block(width: 70%)[ + #set text(size: 19pt) + #if type(info.authors) == array [ + #for author in info.authors [ + #author #h(1.1em) + ] + ] else [ + #info.authors + ] + ] + + v(0.95cm) + + block(width: 70%)[ + #info.extra + ] + + if ( + self.info.at("download-qr", default: none) != none + and self.info.at("download-qr", default: none) != "" + ) { + place(bottom + right)[ + #align(center + horizon)[ + #let s = 4.9cm + #tiaoma.qrcode(self.info.download-qr, width: s, height: s) + ] + ] + } + } + + touying-slide(self: self, body) +}) + +/// Standout slide for the presentation +/// +/// Example: +/// +/// ```typst +/// #standout-slide(title: [Text]) +/// ``` +/// +/// - title (content): Title for the standout slide +/// +/// -> content +#let standout-slide( + title: none, + ..args, +) = touying-slide-wrapper(self => { + let body = { + set align(center + horizon) + set text(size: 28pt) + if title != none { + move(dy: -2.08cm)[ + #text(weight: "semibold")[#title] + ] + } + } + + let self = utils.merge-dicts(self, config-page( + header: none, + footer: none, + )) + + //counter("touying-slide-counter").update(n => if n > 0 { n - 1 } else { 0 }) + + touying-slide(self: self, body, ..args) +}) + +/// Section slide for the presentation +/// +/// Example: +/// +/// ```typst +/// #section-slide(title: [Section A], subtitle: [Subtitle]) +/// ``` +/// +/// - title (content): Title for the section +/// - subtitle (content): Subtitle for the section +/// +/// -> content +#let section-slide( + title: none, + subtitle: none, + ..args, +) = touying-slide-wrapper(self => { + let body = { + align(center + horizon)[ + #move(dy: -0.4cm)[ + #if title != none [ + #text(size: 36pt, weight: "semibold")[#title] + ] + + #if subtitle != none [ + #text(size: 20pt)[#subtitle] + ] + ] + ] + } + + let self = utils.merge-dicts(self, config-page( + header: none, + footer: none, + )) + + touying-slide(self: self, body, ..args) +}) + +/// Blank slide for free content in the presentation +/// +/// Example: +/// +/// ```typst +/// #blank-slide[ +/// #align(center + horizon)[#lorem(5)] +/// ] +/// ``` +/// +/// -> content +#let blank-slide( + ..args, + body, +) = touying-slide-wrapper(self => { + let body = { + align(center + horizon)[ + #body + ] + } + + let self = utils.merge-dicts(self, config-page( + header: none, + footer: none, + margin: 0pt, + )) + + touying-slide(self: self, body, ..args) +}) + +// ----------------------------------------------------------------------------- +// Main Function +// ----------------------------------------------------------------------------- + +/// Theme cofniguration +/// +/// Example: +/// +/// ```typst +/// #show: definitely-not-isec-theme.with( +/// aspect-ratio: "16-9", +/// slide-alignment: top, +/// config-info( +/// title: [Long Paper Title \ with One to Three Lines], +/// subtitle: [An optional short subtitle], +/// authors: ([*First Author*], [Second Author], [Third Author]), +/// extra: [SomeConf 2025], +/// footer: [First Author, Second Author, Third Author], +/// download-qr: "", +/// ), +/// config-common( +/// handout: false, +/// ), +/// config-colors( +/// ), +/// ) +/// ``` +/// +/// - aspect-ratio (str): Aspect ratio for the page. See typst documentatin. +/// - slide-alignemnt (alignment): Default alignment for `#slide()` +/// - config-info (dict): +/// - title (content): Title for the presentation +/// - subtitle (content): Subtitle for the presentation +/// - authors (array): Arrray of authors (content) +/// - extra (content): Extra information for the presentation +/// - footer (content): Footer for each `#slide()` +/// - download-qr (str): URL to show on `#title-slide()` with a QR +/// - config-common (dict): +/// - handout (bool): Boolean for handout mode +/// - config-colors (dict): Colors for the presentation +/// - ... see definition of `#definitely-not-isec-theme` +#let definitely-not-isec-theme( + aspect-ratio: "16-9", + header: utils.display-current-heading(level: 1), + font: "Open Sans", + institute: [isec.tugraz.at], + logo: tugraz-logo, + slide-alignment: top, + progress-bar: true, + ..args, + body, +) = { + // Touying configuration + show: touying-slides.with( + config-page( + paper: "presentation-" + aspect-ratio, + margin: ( + left: 1.49cm, + right: 1.48cm, + top: 2.6cm, + bottom: 1.6cm, + ) + ), + config-store( + header: header, + font: font, + institute: institute, + logo: logo, + default-alignment: slide-alignment, + progress-bar: progress-bar, + ), + config-common( + slide-fn: slide, + new-section-slide-fn: none, + preamble: { + codly( + display-name: false, + display-icon: false, + radius: 0pt, + stroke: 1pt + black, + smart-indent: true, + fill: luma(260), + zebra-fill: luma(250), + number-format: number => [#text(size: 12pt, fill: gray)[#number]], + number-align: right + horizon, + breakable: true, + ) + } + ), + config-colors( // Exported from official template + tug: rgb("e4154b"), + primary: rgb("e4154b"), + footer: rgb("808080"), + isec: rgb("272733"), + foot: rgb("e1e1e1"), + web: rgb("0c5a77"), + csbme: rgb("19b4e3"), + arch: rgb("0a98a2"), + bauw: rgb("d68e23"), + etec: rgb("68242c"), + mach: rgb("3066ba"), + chem: rgb("5e60a8"), + math: rgb("1e6934"), + crypto: rgb("a6c947"), + system: rgb("1171a8"), + formal: rgb("f7931e"), + applied: rgb("7d219e"), + page: rgb("e4154b"), + fore: rgb("0f0f0f"), + back: rgb("ffffff"), + dark: rgb("3b5a70"), + lite: rgb("eeece1"), + head: rgb("245b78"), + body: rgb("e2e9ed"), + urlA: rgb("0066d8"), + urlB: rgb("6c2f91"), + colA: rgb("e4154b"), + colB: rgb("5191c1"), + colC: rgb("a5a5a5"), + colD: rgb("285f82"), + colE: rgb("78b473"), + colF: rgb("e59352"), + tugred: rgb("e4154b"), + tuggreen: rgb("78b473"), + tugblue: rgb("285f82"), + tugyellow: rgb("e59352"), + tugcyan: rgb("19b4e3"), + tugpurple: rgb("7d219e"), + tugviolet: rgb("5e60a8"), + tugmagenta: rgb("7d219e"), + tugturquoise: rgb("0a98a2"), + tugbrown: rgb("68242c"), + tugblack: rgb("0f0f0f"), + tugwhite: rgb("ffffff"), + tuggray: rgb("a5a5a5"), + tuggrey: rgb("a5a5a5"), + tugdark: rgb("3b5a70"), + tugmid: rgb("5191c1"), + tuglite: rgb("eeece1"), + main: rgb("e4154b"), + emph: rgb("285f82"), + standout: rgb("245b78"), + ), + config-methods( + cover: (self: none, body) => hide(body), + init: ( + self: none, + body, + ) => { + // TUGraz uses Source Sans Pro, but its a licensed Adobe font + set text(size: 20pt, lang: "en", region: "US", font: font) + show emph: it => { text(self.colors.primary, it.body) } + show cite: it => { text(self.colors.primary, it) } + show strong: it => { text(weight: "bold", it.body) } + + // Bibliography + set bibliography(title: none, style: "ieee") + set cite(style: "alphanumeric") + show bibliography: set par(spacing: 0.4cm) + show bibliography: set grid(align: top + left) + show bibliography: set text(17pt) + show bibliography: t => { + show grid.cell.where(x: 0): set text(fill: self.colors.primary) + show grid.cell.where(x: 0): set align(top + left) + show link: set text(fill: gray) + t + } + + // Lists & Enums + set list( + marker: ( + (move(dy: 0.11cm, square(width: 0.4em, height: 0.4em, fill: self.colors.primary))), + (move(dy: 0.11cm, square(width: 0.4em, height: 0.4em, fill: black))), + (move(dy: 0.11cm, square(width: 0.4em, height: 0.4em, fill: gray))), + ), + body-indent: 1.2em, + ) + set enum( + numbering: n => { + square(stroke: none, fill: self.colors.primary, size: 0.53cm)[ + #align(center + horizon)[ #text(size: 12pt, fill: white)[#n] ] + ] + }, + body-indent: 0.6cm + ) + + // Code blocks + show: codly-init.with() + show raw.where(block: true): set text(size: 13pt) + + // Hotfixes, the messy part + + // https://github.com/touying-typ/touying/issues/136 + set par(spacing: 0.65em) + + body + }), + ..args, + ) + + body +} + +// ----------------------------------------------------------------------------- +// Macros +// ----------------------------------------------------------------------------- + +/// Macro for a pdfpc note +/// +/// Example: +/// +/// ```typst +/// #note("This will show on pdfpc speaker notes") +/// ``` +/// +/// - text (str): Note for pdfpc +/// +/// -> content +#let note(text) = [ + #pdfpc.speaker-note(text) +] + +/// Quote block for phrases. Has a color.primary rectangle in the left +/// +/// Example: +/// +/// ```typst +/// #quote-block[ +/// #lorem(10) +/// ] +/// ``` +/// +/// - top-pad (length): Extra height of the quote colored block +/// - color (color): Color of the quote block +/// - spacing (length): Spacing after the `#quote-block` +/// +/// -> content +#let quote-block( + top-pad: 0.55cm, + color: none, + spacing: 0.3cm, + body, +) = [ + #touying-fn-wrapper((self: none) => [ + // Grid with the design + #let g(s: 0cm, body) = [ + #grid( + columns: (0.195cm, auto), + column-gutter: 0.7cm, + row-gutter: 0cm, + [ + #rect( + fill: if color == none { self.colors.primary } else { color }, + height: s + top-pad, + ) + ], + align(horizon, body), + ) + ] + + // We compute its "auto" heigth and then print it with the correct height + #layout(size => { + let (height,) = measure(width: size.width, g(body)) + g(s: height, body) + }) + + #v(spacing) + ]) +] + +/// Block with title and content +/// +/// Example: +/// +/// ```typst +/// #color-block(title: [Advantages])[ +/// - A +/// - B +/// - C +/// ] +/// ``` +/// +/// - title (content): Title for the color block +/// - icon (str): Icon to show at the left of the title (Tableau Icons) https://tabler.io/icons +/// - spacing (length): Spacing before and after the color block +/// - color (color): Color for the title block +/// - color-body (color): Color for the background of the body +/// +/// -> content +#let color-block( + title: [], + icon: none, + spacing: 0.78em, + color: none, + color-body: none, + body +) = [ + #import "@preview/tableau-icons:0.331.0": * + #touying-fn-wrapper((self: none) => [ + #show emph: it => { + text(weight: "medium", fill: self.colors.primary, it.body) + } + + #showybox( + title-style: ( + color: white, + sep-thickness: 0pt, + ), + frame: ( + //inset: 0.4em, + radius: 0pt, + thickness: 0pt, + border-color: if color == none { self.colors.primary } else { color }, + title-color: if color == none { self.colors.primary } else { color }, + body-color: if color-body == none { self.colors.lite } else { color-body }, + inset: (x: 0.55em, y: 0.65em), + ), + above: spacing, + below: spacing, + title: if icon == none { + align(horizon)[#strong(title)] + } else { + align(horizon)[ + #draw-icon(icon, height: 1.2em, baseline: 20%, fill: white) #h(0.2cm) #strong[#title] + ] + }, + body, + ) + ]) +] + +/// Showcase the colors of the slide +/// +/// Example: +/// +/// ```typst +/// #showcase-colors +/// ``` +/// +/// -> content +#let showcase-colors = [ + #touying-fn-wrapper((self: none) => [ + #set rect(width: 7.4cm, height: 1.5cm) + #set text(fill: white) + #set align(center) + #grid(columns: 3, rows: 6, column-gutter: 1.8cm, row-gutter: 0.05cm, align: left, + rect(fill: self.colors.isec)[isec], + rect(fill: self.colors.tug)[tug = main], + rect(fill: self.colors.colA)[colA = tugred], + rect(fill: self.colors.csbme)[csbme = tugcyan], + rect(fill: self.colors.fore)[fore], + rect(fill: self.colors.colB)[colB = tugmid], + rect(fill: self.colors.crypto)[crypto], + rect(fill: self.colors.back)[#text(fill: black)[back]], + rect(fill: self.colors.colC)[colC = tuggray], + rect(fill: self.colors.system)[system], + rect(fill: self.colors.foot)[#text(fill: black)[foot]], + rect(fill: self.colors.colD)[colD = tugblue], + rect(fill: self.colors.formal)[formal], + rect(fill: self.colors.emph)[emph], + rect(fill: self.colors.colE)[colE = tuggreen], + rect(fill: self.colors.applied)[applied = tugpurple], + rect(fill: self.colors.lite)[#text(fill: black)[lite]], + rect(fill: self.colors.colF)[colF = tugyellow], + ) + ]) +] + +//vim:tabstop=2 softtabstop=2 shiftwidth=2 noexpandtab colorcolumn=81 diff --git a/1.0.1/src/logos.typ b/1.0.1/src/logos.typ new file mode 100644 index 0000000..308e751 --- /dev/null +++ b/1.0.1/src/logos.typ @@ -0,0 +1,40 @@ +#let institute-logo(self) = [ + #block[ + #text(size: 13.5pt, weight: "medium")[#self.store.institute] + #h(0.1cm) + #box(inset: 0pt, outset: 0pt)[#square( + width: 0.3cm, + height: 0.3cm, + outset: 0pt, + inset: 0pt, + stroke: none, + fill: self.colors.primary, + )] + ] +] + +#let tugraz-logo = [ + #set align(right) + #set text(size: 12pt, tracking: 3.6pt) + + #image("assets/tuglogo.svg", width: 4.1cm) + + #v(0.13cm) + + #move(dx: -0.07cm)[ + SCIENCE + ] + + #v(0.65em) + + #move(dx: -0.03cm)[ + PASSION + ] + + #v(0.65em) + + #move(dx: -0.06cm)[ + TECHNOLOGY + ] +] + diff --git a/1.0.1/template/bibliography.bib b/1.0.1/template/bibliography.bib new file mode 100644 index 0000000..78d22e8 --- /dev/null +++ b/1.0.1/template/bibliography.bib @@ -0,0 +1,13 @@ +// You can use LaTeX's bibliography format per default +// or +// Typst's Hayagriva: +// https://github.com/typst/hayagriva/blob/main/docs/file-format.md + +@software{emg25template, + author = {Ernesto Martínez García}, + year = {2025}, + month = {3}, + title = {{ISEC Slides Typst Template}}, + url = {https://github.com/ecomaikgolf/typst-isec-master-thesis-template}, + urldate = {2025-08-31} +} diff --git a/1.0.1/template/slides.typ b/1.0.1/template/slides.typ new file mode 100644 index 0000000..21f113e --- /dev/null +++ b/1.0.1/template/slides.typ @@ -0,0 +1,62 @@ +#import "@preview/definitely-not-isec-slides:1.0.1": * + +#show: definitely-not-isec-theme.with( + aspect-ratio: "16-9", + slide-alignment: top, + progress-bar: true, + institute: [isec.tugraz.at], + logo: [#tugraz-logo], + config-info( + title: [Long Paper Title \ with One to Three Lines], + subtitle: [An optional short subtitle], + authors: ([*First Author*], [Second Author], [Third Author]), + extra: [SomeConf 2025], + footer: [First Author, Second Author, Third Author], + download-qr: "", + ), + config-common( + handout: false, + ), + config-colors( + primary: rgb("e4154b"), + ), +) + +// -------------------------------[[ CUT HERE ]]-------------------------------- +// +// === Available slides === +// +// #title-slide() +// #standout-slide(title) +// #section-slide(title,subtitle) +// #blank-slide() +// #slide(title) +// +// === Available macros === +// +// #quote-block(body) +// #color-block(title, body) +// #icon-block(title, icon, body) +// +// === Presenting with pdfpc === +// +// Use #note("...") to add pdfpc presenter annotations on a specific slide +// Before presenting, export all notes to a pdfpc file: +// $ typst query slides.typ --field value --one "" > slides.pdfpc +// $ pdfpc slides.pdf +// +// -------------------------------[[ CUT HERE ]]-------------------------------- + +#title-slide() + +#slide(title: [First Slide])[ + #quote-block[ + Good luck with your presentation! @emg25template + ] + + #note("This will show on pdfpc speaker notes ;)") +] + +#slide(title: [Bibliography])[ + #bibliography("bibliography.bib") +] diff --git a/1.0.1/thumbnail.png b/1.0.1/thumbnail.png new file mode 100644 index 0000000..24d0b41 Binary files /dev/null and b/1.0.1/thumbnail.png differ diff --git a/1.0.1/typst.toml b/1.0.1/typst.toml new file mode 100644 index 0000000..2a3d54f --- /dev/null +++ b/1.0.1/typst.toml @@ -0,0 +1,17 @@ +[package] +name = "definitely-not-isec-slides" +version = "1.0.1" +entrypoint = "src/lib.typ" +authors = ["Ernesto Martínez "] +license = "MIT" +description = "An unofficial ISEC TUGraz slides template" +repository = "https://github.com/ecomaikgolf/typst-isec-slides-template" +categories = ["presentation"] +disciplines = ["computer-science", "engineering"] +keywords = ["ISEC", "Institute of Information Security", "IAIK", "TUGraz", "Graz University of Technology", "thesis", "template", "Master Thesis"] +compiler = "0.13.1" + +[template] +path = "template" +entrypoint = "slides.typ" +thumbnail = "thumbnail.png"