From 912b6cce2baa84b6feffd016ed3734f9ddf162bd Mon Sep 17 00:00:00 2001 From: Ernesto Martinez Garcia Date: Sat, 6 Sep 2025 18:29:23 +0200 Subject: [PATCH] almost finished --- 1.0.0/README.md | 53 ++++-- 1.0.0/example/bibliography.bib | 13 -- 1.0.0/example/slides.pdfpc | 1 - 1.0.0/example/slides.typ | 103 ------------ 1.0.0/src/lib.typ | 289 +++++++++++++++++++++++++++++---- 1.0.0/src/tugcolors.typ | 87 ---------- 1.0.0/template/slides.typ | 79 ++------- 1.0.0/typst.toml | 2 +- 8 files changed, 311 insertions(+), 316 deletions(-) delete mode 100644 1.0.0/example/bibliography.bib delete mode 100644 1.0.0/example/slides.pdfpc delete mode 100644 1.0.0/example/slides.typ delete mode 100644 1.0.0/src/tugcolors.typ diff --git a/1.0.0/README.md b/1.0.0/README.md index ac5aeb0..d59f242 100644 --- a/1.0.0/README.md +++ b/1.0.0/README.md @@ -1,26 +1,59 @@ # Typst ISEC Slides Template -An unofficial ISEC TUGraz 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 want it renamed to `isec-slides` or -> `tugraz-slides` I would need an approval to allocate the name :) - -## Design - -TODO +> If you are an ISEC or TUGraz employee and think that `isec-thesis` or +> `tugraz-thesis` fits more, I would need an approval to allocate the name :) ## 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) +Check for [open issues](https://github.com/ecomaikgolf/typst-isec-slides-template/issues) + +## Design +--- +title + +--- +list + +--- +listimage + +--- +standout + +--- +colors + +--- +features + +--- +code + +--- +blocks + +--- +plots + +--- +configurable + +--- +blank + +--- +bibliography -## Samples -TODO ## License `src/assets/tuglogo.svg` diff --git a/1.0.0/example/bibliography.bib b/1.0.0/example/bibliography.bib deleted file mode 100644 index 2f7d360..0000000 --- a/1.0.0/example/bibliography.bib +++ /dev/null @@ -1,13 +0,0 @@ -// 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{Garcia2025Slides, - author = {Ernesto Martínez García}, - year = {2025}, - month = {8}, - title = {{ISEC Slides Typst Template}}, - url = {https://github.com/ecomaikgolf/typst-isec-slides-template}, - urldate = {2025-08-31} -} diff --git a/1.0.0/example/slides.pdfpc b/1.0.0/example/slides.pdfpc deleted file mode 100644 index fae607b..0000000 --- a/1.0.0/example/slides.pdfpc +++ /dev/null @@ -1 +0,0 @@ -{"pdfpcFormat":2,"disableMarkdown":false,"pages":[{"idx":1,"label":"1","overlay":0,"forcedOverlay":false,"hidden":false,"note":"This is a note that only the speaker will see."},{"idx":2,"label":"2","overlay":0,"forcedOverlay":false,"hidden":false,"note":"\n This note will appear on pdfpc's presenter mode. Lets see how long it can be lol\n\n It even supports multiline!\n "},{"idx":3,"label":"3","overlay":0,"forcedOverlay":false,"hidden":false},{"idx":4,"label":"4","overlay":0,"forcedOverlay":false,"hidden":false},{"idx":5,"label":"5","overlay":0,"forcedOverlay":false,"hidden":false}]} diff --git a/1.0.0/example/slides.typ b/1.0.0/example/slides.typ deleted file mode 100644 index 5557fec..0000000 --- a/1.0.0/example/slides.typ +++ /dev/null @@ -1,103 +0,0 @@ -#import "../src/lib.typ": * -//#import "@local/definitely-not-isec-slides:1.0.0": * - -// ---------------------------------------------------------------------------- -// Configuration -// ---------------------------------------------------------------------------- -#show: definitely-not-isec-theme.with( - aspect-ratio: "16-9", - progress-bar: true, - 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, - ), -) -// -------------------------------[[ CUT HERE ]]-------------------------------- -// -// #title-slide() -// -// #slide(alignment: top, title: [...]) -// -// #standout-slide() -// #section-slide() -// #blank-slide() -// - -// -------------------------------[[ CUT HERE ]]-------------------------------- - -// ---------------------------------------------------------------------------- -// Slides -// ---------------------------------------------------------------------------- - -#show cite: set text(fill: tugcolors.main) - -#title-slide() - -#slide(alignment: top, title: [First Slide])[ - - #quote-block(spacing: 0.3em)[ - #lorem(10) - ] - - #lorem(10) - - #color-block([Symmetric])[ - This looks much better - ] - - #lorem(10) - - #columns(2)[ - #icon-block([Symmetric], "ad-circle")[ - This looks much better - ] - - #color-block([Symmetric])[ - This looks much better - ] - ] - - #pdfpc.speaker-note("This is a note that only the speaker will see.") - -] - -#slide(alignment: top, title: [First Slide], outlined: false)[ - - #quote-block[ - #lorem(20) - ] - - Thus, by using common sense we can deduce that - - #note(" - This note will appear on pdfpc's presenter mode. Lets see how long it can be lol - - It even supports multiline! - ") -] - - -#section-slide(title: [Conclusions], subtitle: [Final Section]) - - -#blank-slide[ - A blank canvas for memes -] - - -#standout-slide(title: [But what if...?]) - - -#slide(title: [Bibliography], alignment: top)[ - #bibliography("bibliography.bib") -] - - -#title-slide() diff --git a/1.0.0/src/lib.typ b/1.0.0/src/lib.typ index d30b994..807731e 100644 --- a/1.0.0/src/lib.typ +++ b/1.0.0/src/lib.typ @@ -1,7 +1,6 @@ #import "@preview/touying:0.6.1": * // Project -#import "tugcolors.typ" #import "helper.typ": * #import "logos.typ": * @@ -14,29 +13,41 @@ // 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, ) -// Macro for notes -#let note(text) = [ - #pdfpc.speaker-note(text) -] - // ----------------------------------------------------------------------------- // Slide Types // ----------------------------------------------------------------------------- -// -// Normal Slide -// +/// 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, @@ -119,9 +130,15 @@ touying-slide(self: self, ..args) }) -// -// Title Slide -// +/// 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 = { @@ -222,19 +239,29 @@ touying-slide(self: self, body) }) -// -// Standout Slide -// +/// Standout slide for the presentation +/// +/// Example: +/// +/// ```typst +/// #standout-slide(title: [Text]) +/// ``` +/// +/// - title (content): Title for the standout slide +/// +/// -> content #let standout-slide( - title: auto, + title: none, ..args, ) = touying-slide-wrapper(self => { let body = { set align(center + horizon) set text(size: 28pt) - move(dy: -2.08cm)[ - #text(weight: "semibold")[#title] - ] + if title != none { + move(dy: -2.08cm)[ + #text(weight: "semibold")[#title] + ] + } } let self = utils.merge-dicts(self, config-page( @@ -247,9 +274,18 @@ touying-slide(self: self, body, ..args) }) -// -// Section Slide -// +/// 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, @@ -277,9 +313,17 @@ touying-slide(self: self, body, ..args) }) -// -// Blank Slide -// +/// Blank slide for free content in the presentation +/// +/// Example: +/// +/// ```typst +/// #blank-slide[ +/// #align(center + horizon)[#lorem(5)] +/// ] +/// ``` +/// +/// -> content #let blank-slide( ..args, body, @@ -303,6 +347,43 @@ // 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), @@ -351,7 +432,60 @@ ) } ), - config-colors(primary: tugcolors.tug, footer: rgb("808080")), + 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: ( @@ -361,6 +495,7 @@ // 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 @@ -394,12 +529,10 @@ 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 @@ -414,12 +547,42 @@ } // ----------------------------------------------------------------------------- -// Styling Macros +// 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: tugcolors.tug, + color: none, spacing: 0.3cm, body, ) = [ @@ -432,7 +595,7 @@ row-gutter: 0cm, [ #rect( - fill: self.colors.primary, + fill: if color == none { self.colors.primary } else { color }, height: s + top-pad, ) ], @@ -450,14 +613,31 @@ ]) ] -// https://tabler.io/icons - +/// 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, + title: [], icon: none, spacing: 0.78em, color: none, - color-body: tugcolors.lite, + color-body: none, body ) = [ #import "@preview/tableau-icons:0.331.0": * @@ -477,7 +657,7 @@ thickness: 0pt, border-color: if color == none { self.colors.primary } else { color }, title-color: if color == none { self.colors.primary } else { color }, - body-color: color-body, + body-color: if color-body == none { self.colors.lite } else { color-body }, inset: (x: 0.55em, y: 0.65em), ), above: spacing, @@ -494,4 +674,41 @@ ]) ] +/// 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.0/src/tugcolors.typ b/1.0.0/src/tugcolors.typ deleted file mode 100644 index 6d68a3e..0000000 --- a/1.0.0/src/tugcolors.typ +++ /dev/null @@ -1,87 +0,0 @@ -// TUGraz -#let tug = rgb("e4154b") -#let isec = rgb("272733") -#let foot = rgb("e1e1e1") -#let web = rgb("0c5a77") - -// Faculties -#let csbme = rgb("19b4e3") -#let arch = rgb("0a98a2") -#let bauw = rgb("d68e23") -#let etec = rgb("68242c") -#let mach = rgb("3066ba") -#let chem = rgb("5e60a8") -#let math = rgb("1e6934") - -// ISEC research areas -#let crypto = rgb("a6c947") -#let system = rgb("1171a8") -#let formal = rgb("f7931e") -#let applied = rgb("7d219e") - -// Powerpoint palette -#let page = tug -#let fore = rgb("0f0f0f") -#let back = rgb("ffffff") -#let dark = rgb("3b5a70") -#let lite = rgb("eeece1") -#let head = rgb("245b78") -#let body = rgb("e2e9ed") -#let urlA = rgb("0066d8") -#let urlB = rgb("6c2f91") -#let colA = tug -#let colB = rgb("5191c1") -#let colC = rgb("a5a5a5") -#let colD = rgb("285f82") -#let colE = rgb("78b473") -#let colF = rgb("e59352") - - -#let tugred = colA -#let tuggreen = colE -#let tugblue = colD -#let tugyellow = colF -#let tugcyan = csbme -#let tugpurple = applied -#let tugviolet = chem -#let tugmagenta = tugpurple -#let tugturquoise = arch -#let tugbrown = etec -#let tugblack = fore -#let tugwhite = back -#let tuggray = colC -#let tuggrey = tuggray -#let tugdark = dark -#let tugmid = colB -#let tuglite = lite - -#let main = tug -#let head = isec -#let emph = colD -#let standout = head - -#let showcase = [ - #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: isec)[isec], - rect(fill: tug)[tug = main], - rect(fill: colA)[colA = tugred], - rect(fill: csbme)[csbme = tugcyan], - rect(fill: fore)[fore], - rect(fill: colB)[colB = tugmid], - rect(fill: crypto)[crypto], - rect(fill: back)[#text(fill: black)[back]], - rect(fill: colC)[colC = tuggray], - rect(fill: system)[system], - rect(fill: foot)[#text(fill: black)[foot]], - rect(fill: colD)[colD = tugblue], - rect(fill: formal)[formal], - rect(fill: emph)[emph], - rect(fill: colE)[colE = tuggreen], - rect(fill: applied)[applied = tugpurple], - rect(fill: lite)[#text(fill: black)[lite]], - rect(fill: colF)[colF = tugyellow], - ) -] diff --git a/1.0.0/template/slides.typ b/1.0.0/template/slides.typ index 390c151..ac4a959 100644 --- a/1.0.0/template/slides.typ +++ b/1.0.0/template/slides.typ @@ -1,5 +1,4 @@ -#import "../src/lib.typ": * -//#import "@local/definitely-not-isec-slides:1.0.0": * +#import "@local/definitely-not-isec-slides:1.0.0": * #show: definitely-not-isec-theme.with( aspect-ratio: "16-9", @@ -16,7 +15,6 @@ handout: false, ), config-colors( - primary: black, ), ) @@ -25,85 +23,36 @@ // === Available slides === // // #title-slide() -// #standout-slide() -// #section-slide() +// #standout-slide(title) +// #section-slide(title,subtitle) // #blank-slide() -// #bibliography-slide() -// #slide() +// #slide(title) // // === Available macros === -// #intro-block[] -// #color-block[] -// #icon-block[] // -// === Integration with pdfpc === +// #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[ - Important or introductory phrase for the current slide topic. + Good luck with your presentation! @emg25template ] - Continuatory explanation @emg25template over the introductory phrase, leading to: - - #v(0.2cm) - #grid( - columns: 2, - column-gutter: 0.6cm, - color-block([Result A])[ - - Benefit - - Benefit - - Downside - ], - color-block([Result B])[ - - Benefit - - Downside - - Downside - ], - ) - #v(0.2cm) - - #lorem(10) - - #v(0.2cm) - ```c - int main() { - void *p = malloc(0x10); - } - ``` + #note("This will show on pdfpc speaker notes ;)") ] -#slide(title: [First Slide])[ - #quote-block[ - #lorem(20) - ] - -] - -#section-slide( - title: [Section A], - subtitle: [Longer Subtitle] -) - -#slide(title: [Second Slide])[ - #rect(fill: gray.lighten(70%), width: 100%, height: 100%)[ - #align(center + horizon)[ - Usable Area - ] - ] -] - -= This is a test - -test - -#slide(title: [Bibliography], alignment: top)[ +#slide(title: [Bibliography])[ #bibliography("bibliography.bib") ] diff --git a/1.0.0/typst.toml b/1.0.0/typst.toml index 45177ae..01422e5 100644 --- a/1.0.0/typst.toml +++ b/1.0.0/typst.toml @@ -9,7 +9,7 @@ repository = "https://github.com/ecomaikgolf/typst-isec-slides-template" categories = ["slides"] disciplines = ["computer-science", "engineering"] keywords = ["ISEC", "Institute of Information Security", "IAIK", "TUGraz", "Graz University of Technology", "thesis", "template", "Master Thesis"] -compiler = "0.13.0" +compiler = "0.13.1" [template] path = "template"