This commit is contained in:
Gaspard Jankowiak 2025-12-14 20:23:50 +01:00
commit b4a76500b6
20 changed files with 18 additions and 1059 deletions

View file

@ -1,66 +0,0 @@
# 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 :)
## 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
---
<img width="1754" height="987" alt="title" src="https://github.com/user-attachments/assets/d29f53ff-0622-45fe-9727-7d286e8d15b1" />
---
<img width="1754" height="987" alt="list" src="https://github.com/user-attachments/assets/27dc198d-714d-4ed6-ad2e-f39babcf4fce" />
---
<img width="1754" height="987" alt="listimage" src="https://github.com/user-attachments/assets/b16cb69b-c9a1-4f50-8fd5-e7c3b0a97617" />
---
<img width="1754" height="987" alt="standout" src="https://github.com/user-attachments/assets/179960f4-e909-4856-8aba-6beb7a91e3c5" />
---
<img width="1754" height="987" alt="colors" src="https://github.com/user-attachments/assets/312a013e-fd89-4b6a-921b-bbfe9f4fa565" />
---
<img width="1754" height="987" alt="features" src="https://github.com/user-attachments/assets/1f3cd158-3860-4962-9802-7fc22d4b94a1" />
---
<img width="1754" height="987" alt="code" src="https://github.com/user-attachments/assets/508abb37-8224-4ef8-9424-2f367981b91f" />
---
<img width="1754" height="987" alt="blocks" src="https://github.com/user-attachments/assets/e4214dc0-f434-40d2-b1fa-0463ef18d9b7" />
---
<img width="1754" height="987" alt="plots" src="https://github.com/user-attachments/assets/605a3bab-c040-4932-9777-03dffabb3a9f" />
---
<img width="1754" height="987" alt="configurable" src="https://github.com/user-attachments/assets/310a25e2-981c-40b3-bbcb-fc243cbb5983" />
---
<img width="1754" height="987" alt="blank" src="https://github.com/user-attachments/assets/7533e702-bba3-4462-add2-f2fbe1e50a20" />
---
<img width="1754" height="987" alt="bibliography" src="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

View file

@ -1,47 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
version="1.0"
width="800"
height="400"
id="svg2"
sodipodi:docname="tuglogo.svg"
inkscape:version="1.4 (e7c3feb100, 2024-10-09)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview1"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#505050"
inkscape:zoom="0.74125"
inkscape:cx="400"
inkscape:cy="200.33727"
inkscape:window-width="1920"
inkscape:window-height="1080"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="0"
inkscape:current-layer="svg2" />
<defs
id="defs4" />
<path
d="M 587.48841,328.23036 C 583.73744,330.20802 579.84328,331.69127 575.8059,332.68009 C 571.76841,333.66892 567.60074,334.16333 563.30287,334.16333 C 553.58695,334.16333 545.88978,331.21804 540.21134,325.32745 C 534.53287,319.43688 531.69365,311.44857 531.69365,301.36251 C 531.69365,291.1635 534.58497,283.13988 540.36762,277.29162 C 546.15025,271.44347 554.06883,268.51937 564.12337,268.51931 C 568.00448,268.51937 571.72283,268.9149 575.27842,269.7059 C 578.83391,270.49702 582.18759,271.66949 585.33945,273.2233 L 585.33945,286.3182 C 582.0834,284.31234 578.84694,282.81497 575.63006,281.8261 C 572.4131,280.83733 569.18966,280.34291 565.95975,280.34286 C 559.96869,280.34291 555.3517,282.15811 552.10875,285.78848 C 548.86576,289.41893 547.24427,294.61027 547.24429,301.36251 C 547.24427,308.05831 548.80715,313.22846 551.93293,316.87297 C 555.05866,320.51752 559.49983,322.33979 565.25646,322.33978 C 566.8193,322.33979 568.27147,322.23384 569.61299,322.02194 C 570.95441,321.81006 572.15913,321.4781 573.22714,321.02605 L 573.22714,308.73634 L 564.04524,308.73634 L 564.04524,297.80273 L 587.48841,297.80273 L 587.48841,328.23036 z M 632.57745,298.39603 C 631.35316,297.77451 630.13541,297.31542 628.92422,297.01873 C 627.71295,296.72212 626.49522,296.57379 625.27099,296.57376 C 621.67635,296.57379 618.90875,297.82395 616.9682,300.32424 C 615.02761,302.82459 614.05732,306.40555 614.05734,311.06714 L 614.05734,332.93436 L 600.06958,332.93436 L 600.06958,285.47064 L 614.05734,285.47064 L 614.05734,293.26825 C 615.85463,290.16055 617.91893,287.89331 620.25025,286.46653 C 622.58151,285.03983 625.37515,284.32647 628.63118,284.32642 C 629.10001,284.32647 629.60795,284.34766 630.15499,284.38999 C 630.70195,284.43242 631.49643,284.52423 632.53837,284.66545 L 632.57745,298.39603 z M 659.22453,311.57568 C 656.30714,311.57571 654.11259,312.11249 652.64091,313.18606 C 651.16918,314.25966 650.43332,315.84179 650.43334,317.93243 C 650.43332,319.8536 651.02591,321.35802 652.21112,322.44572 C 653.39628,323.53344 655.04381,324.0773 657.15372,324.07729 C 659.78453,324.0773 661.99861,323.05316 663.79596,321.00486 C 665.59323,318.95659 666.49188,316.3927 666.49191,313.3132 L 666.49191,311.57568 L 659.22453,311.57568 z M 680.59689,305.85461 L 680.59689,332.93436 L 666.49191,332.93436 L 666.49191,325.89956 C 664.61643,328.78129 662.50654,330.87902 660.16226,332.19274 C 657.81792,333.50646 654.96566,334.16333 651.60549,334.16333 C 647.07313,334.16333 643.39386,332.72953 640.56767,329.86193 C 637.74146,326.99434 636.32836,323.27211 636.32836,318.69524 C 636.32836,313.12958 638.09311,309.04714 641.62261,306.4479 C 645.1521,303.84873 650.6938,302.54913 658.24773,302.5491 L 666.49191,302.5491 L 666.49191,301.36251 C 666.49188,298.96111 665.61927,297.20241 663.87409,296.08641 C 662.12885,294.97048 659.40684,294.4125 655.70805,294.41246 C 652.71252,294.4125 649.92539,294.7374 647.34665,295.38716 C 644.76789,296.037 642.37149,297.0117 640.15741,298.31127 L 640.15741,286.74198 C 643.15293,285.95097 646.16146,285.35061 649.18304,284.94091 C 652.20459,284.5313 655.22614,284.32647 658.24773,284.32642 C 666.14024,284.32647 671.83823,286.01454 675.34171,289.39063 C 678.84512,292.76681 680.59685,298.2548 680.59689,305.85461 L 680.59689,305.85461 z M 691.53705,285.47064 L 729.71034,285.47064 L 729.71034,296.06521 L 706.65789,322.08551 L 729.71034,322.08551 L 729.71034,332.93436 L 690.56025,332.93436 L 690.56025,322.33978 L 713.6127,296.31949 L 691.53705,296.31949 L 691.53705,285.47064 z"
id="text2424"
style="font-size:110.52407074px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans Bold" />
<path
d="M 530.95111,260.14746 L 530.95111,146.35144 L 489.77639,146.35144 L 489.77639,123.18115 L 600.04894,123.18115 L 600.04894,146.35144 L 558.96886,146.35144 L 558.96886,260.14746 L 530.95111,260.14746 z M 618.03331,123.18115 L 646.05104,123.18115 L 646.05104,197.36345 C 646.051,209.13551 646.39807,216.7655 647.09224,220.25346 C 648.29116,225.8592 651.14657,230.35934 655.65848,233.75388 C 660.17029,237.14848 666.33861,238.84576 674.16345,238.84574 C 682.11435,238.84576 688.10913,237.24191 692.14781,234.03417 C 696.18631,230.82649 698.61577,226.88692 699.43621,222.21545 C 700.25645,217.54407 700.66662,209.7895 700.66671,198.95174 L 700.66671,123.18115 L 728.68447,123.18115 L 728.68447,195.12116 C 728.68434,211.56464 727.92711,223.18092 726.41276,229.97003 C 724.89816,236.7592 722.10586,242.48947 718.03583,247.16089 C 713.96557,251.83232 708.52294,255.5539 701.70792,258.3256 C 694.8927,261.09732 685.99519,262.48317 675.01534,262.48318 C 661.76364,262.48317 651.71449,260.97274 644.86786,257.95189 C 638.02115,254.93104 632.61008,251.00704 628.63461,246.17989 C 624.6591,241.35277 622.04032,236.29205 620.77828,230.99774 C 618.94828,223.14978 618.03328,211.56464 618.03331,196.24231 L 618.03331,123.18115 z"
id="text2428"
style="font-size:255.42478943px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial Bold" />
<path
d="M 261.48597,49.44316 L 261.48597,120.65005 L 176.35344,120.65005 L 176.35344,191.88051 L 162.07436,191.88051 L 162.07436,120.65005 L 21.168588,120.65005 L 21.168588,261.55582 L 92.399046,261.55582 L 92.399046,332.78628 L 233.30481,332.78628 L 233.30481,261.55582 L 317.2592,261.55582 L 317.2592,190.34893 L 331.56184,190.34893 L 331.56184,261.55582 L 472.46761,261.55582 L 472.46761,120.65005 L 402.39173,120.65005 L 402.39173,49.44316 L 261.48597,49.44316 z M 740.18857,284.41177 L 740.18857,333.16328 L 788.94007,333.16328 L 788.94007,284.41177 L 740.18857,284.41177 z"
id="rect2432"
style="opacity:0.97000002;fill:#f70146;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</svg>

Before

Width:  |  Height:  |  Size: 7.2 KiB

View file

@ -1,40 +0,0 @@
#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
]
]

View file

@ -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{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}
}

View file

@ -1,58 +0,0 @@
#import "@preview/definitely-not-isec-slides:1.0.0": *
#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(
),
)
// -------------------------------[[ 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 "<pdfpc-file>" > 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")
]

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

View file

@ -1,17 +0,0 @@
[package]
name = "definitely-not-isec-slides"
version = "1.0.0"
entrypoint = "src/lib.typ"
authors = ["Ernesto Martínez <https://ecomaikgolf.com>"]
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"

View file

@ -1,5 +0,0 @@
# Typst KFU Slides Template
Derived from Ernesto Martínez García's [definitely-not-isec-slides](https://typst.app/universe/package/definitely-not-isec-slides)
Tested typst version: `0.14.0`.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

View file

@ -2,50 +2,28 @@
Adapted from Ernesto Martínez García's [definitely-not-isec-slides](https://typst.app/universe/package/definitely-not-isec-slides).
Quickstart (CLI):
![thumbnail](thumbnail.png)
```sh
typst init @preview/definitely-not-kfu-slides:1.0.1 slides
## Installation (Linux only)
#### Using `typship`
```bash
typship download -n local https://imsc.uni-graz.at/git/gjankowiak/typst-kfu-slides-template
```
Quickstart (WebIDE):
#### Manually
- [Create Document](https://typst.app/app?template=definitely-not-kfu-slides&version=1.0.1)
- [Homepage](https://typst.app/universe/package/definitely-not-kfu-slides)
```bash
mkdir -p ~/.local/share/typst/packages/local/definitely-not-kfu-slides/
cd ~/.local/share/typst/packages/local/definitely-not-kfu-slides/
curl https://imsc.uni-graz.at/git/gjankowiak/typst-kfu-slides-template/archive/v1.0.1.tar.gz | tar zx --xform 's/definitely-not-kfu-slides/1.0.1/'
```
## Quickstart (CLI):
```sh
typst init @local/definitely-not-kfu-slides:1.0.1 slides
```
Tested typst version: `0.14.0`.
## Typst
### What's Typst?
A modern typesetting system which has:
- Milisecond incremental (memoized) builds¹
- Subsecond full builds¹
- Multithreaded builds per pagebreak
- Easy rustc-like compiler error messages (and no intermediates!)
- Transparent multiple compiler passes (no more mklatex/makefiles)
- Simple & powerful scripting and syntax
- WebAssembly plugin support (python/js interpreters in your thesis? Sure)
Migrating from LaTeX? Check the [migration guide](https://typst.app/docs/guides/guide-for-latex-users/)
¹: This is obviously not a serious benchmark and depends on the document. But
it's fast trust me
### Quick usage
Start incremental compilations with:
```sh
typst watch slides.typ
```
then open the generated PDF:
```sh
xdg-open slides.typ
```
Now edit `slides.typ` and it will be incrementally built in each save.

View file

@ -0,0 +1,54 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) by Marsupilami -->
<svg
version="1.1"
width="892"
height="768"
viewBox="-1.66203747 -1.66203747 68.18782194 58.72532394"
id="svg9193"
sodipodi:docname="unigrazlogo-white-border.svg"
inkscape:version="1.4.2 (ebf0e940d0, 2025-05-08)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="1.0520833"
inkscape:cx="446.25743"
inkscape:cy="384"
inkscape:window-width="1920"
inkscape:window-height="1015"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg9193" />
<defs
id="defs9195" />
<path
d="m 0,55.40125 64.86375,0 L 64.86375,0 0,0 0,55.40125 z"
id="path3442"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
<path
d="m 2.85501,2.8575 18.9275,0 0,49.67875 -18.9275,0 0,-49.67875 z"
id="path3444"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
<path
d="m 21.78251,2.8575 40.21999,0 0,49.67875 -40.21999,0 0,-49.67875 z"
id="path3446"
style="fill:#ffdf00;fill-opacity:1;fill-rule:nonzero;stroke:none" />
<path
d="m 45.67713,45.13812 -1.01375,0 0,1.39875 1.01375,0 c 0.63,0 0.81875,-0.30875 0.81875,-0.705 0,-0.3825 -0.18875,-0.69375 -0.81875,-0.69375 m 5.26,2.27375 1.30625,0 -0.64125,-1.54 -0.665,1.54 z m -29.155,5.1325 40.22625,0 0,-9.61 -40.22625,0 0,9.61 z m 19.82875,-4.2175 c -0.465,0.9 -1.54125,1.4275 -2.6775,1.4275 -1.85375,0 -3.12,-1.36875 -3.12,-3.055 0,-1.6875 1.42625,-3.055 3.12,-3.055 1.01625,0 1.91625,0.49125 2.47375,1.25 l -1.19875,0.84875 c -0.3175,-0.42875 -0.7,-0.6725 -1.275,-0.6725 -0.965,0 -1.61,0.6675 -1.61,1.62875 0,0.95875 0.66625,1.58875 1.63125,1.58875 0.8375,0 1.3,-0.3425 1.41375,-0.7725 l -1.00125,0 0,-1.075 2.50375,0 10e-4,0.4875 c 0,0.51125 -0.0537,1.00375 -0.26125,1.39875 m 11.56125,1.31625 -0.48875,-1.02375 -2.17625,0 -0.48875,1.02375 -3.32625,0 -1.13875,-1.7175 -0.89,0 0,1.7175 -1.64375,0 0,-5.89375 2.8125,0 c 1.31875,0 2.18625,0.91 2.18625,2.0825 0,0.79875 -0.34625,1.37875 -1.0325,1.665 l 1.3975,1.98 3.06,-5.7825 0.385,0 3.05875,5.94875 -1.715,0 z m 6.99125,0 -4.9175,0 0,-0.4575 2.56375,-4.0475 -2.525,0 0,-1.38875 4.87875,0 0,0.3375 -2.67375,4.1675 2.67375,0 0,1.38875 z m -2.93708,-17.83562 2.89126,0 0,10.16375 -2.89126,0 0,-10.16375 z m -10.53987,-0.1905 0.815,0 5.285,4.78125 0,-4.5925 2.88,0 0,10.3 -0.88375,0 -5.2075,-4.7225 0,4.58875 -2.895,-0.001 0.0125,-10.35375 z m -10.97975,0.19175 0,5.85125 c 0,2.5625 2.22,4.51 4.7825,4.50875 2.56,-0.004 4.77375,-1.95 4.77375,-4.51125 l 0,-5.85 -2.91125,0 0,5.41875 c 0,1.28375 -0.765,2.13875 -1.87375,2.14 -1.11125,0 -1.88,-0.80125 -1.88,-2.14 l 0,-5.41875 -2.89125,10e-4 z"
id="path3472"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</svg>
<!-- version: 20110311, original size: 64.863747 55.401249, border: 3% -->

After

Width:  |  Height:  |  Size: 3.3 KiB

View file

@ -62,6 +62,18 @@
// ---------------------------------------------------------------------------
let header(self) = {
// Slide Title: if the user overrides the title of a certain slide, use it
// Progress bar
if self.store.progress-bar {
place(top + left, float: false,
move(dy: 0.00cm, // Bad solution, I know
components.progress-bar(
height: 3pt,
self.colors.primary,
white,
)
)
)
}
let hdr = if title != auto { title } else { self.store.header }
show heading: set text(size: 24pt, weight: "semibold")
@ -85,12 +97,12 @@
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)[
columns: (self.page.margin.bottom, 1.3%, auto, 1cm),
move(dx:0.3em, dy: 0.3em, circle(radius: 0.75em, stroke: self.colors.primary + 2pt)[
#set align(center + horizon)
#set text(fill: white, size: 12pt)
#set text(size: 12pt)
#utils.slide-counter.display()
],
]),
block(),
block[
#set align(left + horizon)
@ -100,18 +112,6 @@
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(
@ -142,29 +142,29 @@
#let title-slide(..args) = touying-slide-wrapper(self => {
let info = self.info + args.named()
let body = {
let footer-isec = [
let footer-kfu = [
#set text(size: 13.3pt, weight: "medium")
#let arrow-icon = [
#move(dy: -0.05cm, dx: -0.05cm, rotate(45deg, square(
#let circle-icon = [
#move(dy: 0.03cm, circle(
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
radius: 0.18cm,
stroke: self.colors.primary + 1.35pt,
)
)
]
set page(footer: footer-isec, header: none)
#v(-0.5cm)
#box(circle-icon) #h(0.1cm) #self.store.institute
]
set page(footer: footer-kfu, header: none)
set block(below: 0pt, above: 0pt)
place(center + horizon, dx: -15em, [
#circle(stroke: self.colors.primary + 13em, radius: 32em)
])
// Top-right icon + text
place(top + right, dy: -1.9cm, dx: 0.78cm, [
#self.store.logo
@ -174,9 +174,9 @@
block(width: 83%)[
#let title = text(size: 40.5pt, weight: "bold")[#info.at(
"title",
default: "",
)]
"title",
default: "",
)]
#move(dx: 0.04em)[
#grid(
@ -199,7 +199,7 @@
block(width: 70%)[
#text(
size: 28.3pt,
fill: self.colors.primary,
fill: self.colors.fore,
weight: "bold",
)[#info.subtitle]
]
@ -225,7 +225,7 @@
if (
self.info.at("download-qr", default: none) != none
and self.info.at("download-qr", default: none) != ""
and self.info.at("download-qr", default: none) != ""
) {
place(bottom + right)[
#align(center + horizon)[
@ -347,12 +347,12 @@
// Main Function
// -----------------------------------------------------------------------------
/// Theme cofniguration
/// Theme configuration
///
/// Example:
///
/// ```typst
/// #show: definitely-not-isec-theme.with(
/// #show: definitely-not-kfu-theme.with(
/// aspect-ratio: "16-9",
/// slide-alignment: top,
/// config-info(
@ -383,13 +383,13 @@
/// - 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(
/// - ... see definition of `#definitely-not-kfu-theme`
#let definitely-not-kfu-theme(
aspect-ratio: "16-9",
header: utils.display-current-heading(level: 1),
font: "Open Sans",
institute: [isec.tugraz.at],
logo: tugraz-logo,
institute: [uni-graz.at],
logo: unigrazgraz-logo,
slide-alignment: top,
progress-bar: true,
..args,
@ -433,10 +433,10 @@
}
),
config-colors( // Exported from official template
tug: rgb("e4154b"),
primary: rgb("e4154b"),
kfu: rgb("FED501"),
primary: rgb("FED501"),
secondary: rgb("9933cc"),
footer: rgb("808080"),
isec: rgb("272733"),
foot: rgb("e1e1e1"),
web: rgb("0c5a77"),
csbme: rgb("19b4e3"),
@ -454,7 +454,7 @@
fore: rgb("0f0f0f"),
back: rgb("ffffff"),
dark: rgb("3b5a70"),
lite: rgb("eeece1"),
lite: rgb("fefcf1"),
head: rgb("245b78"),
body: rgb("e2e9ed"),
urlA: rgb("0066d8"),
@ -465,23 +465,6 @@
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"),
@ -489,226 +472,188 @@
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) }
self: none,
body,
) => {
set text(size: 20pt, lang: "en", region: "US", font: font)
show emph: it => { text(self.colors.secondary, it.body) }
show cite: it => { text(self.colors.secondary, 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
// 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.secondary)
show grid.cell.where(x: 0): set align(top + left)
show link: set text(fill: gray)
t
}
// Lists & Enums
set list(
marker: (
(move(dx: 0.15cm, dy: 0.1cm, circle(radius: 0.2em, stroke: self.colors.primary + 2pt, fill: self.colors.primary))),
(move(dy: 0.2cm, circle(width: 0.2em, fill: black))),
(move(dy: 0.2cm, circle(width: 0.2em, fill: gray))),
),
body-indent: 1.2em,
)
set enum(
numbering: n => {
circle(stroke: self.colors.primary + 2pt, radius: 0.3cm)[
#align(center + horizon)[ #text(size: 12pt, fill: black)[#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)
}
// 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))),
#showybox(
title-style: (
color: black,
sep-thickness: 0pt,
),
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] ]
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-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],
body,
)
])
]
]
//vim:tabstop=2 softtabstop=2 shiftwidth=2 noexpandtab colorcolumn=81

21
src/logos.typ Normal file
View file

@ -0,0 +1,21 @@
#let institute-logo(self) = [
#block[
#text(size: 13.5pt, weight: "medium")[#self.store.institute]
#h(0.1cm)
#box(inset: 0pt, outset: 0pt, baseline: 15%)[#circle(
radius: 0.25cm,
outset: 0pt,
inset: 0pt,
stroke: self.colors.primary + 2pt,
fill: none,
)]
]
]
#let unigrazgraz-logo = [
#set align(right)
#set text(size: 12pt, tracking: 3.6pt)
#image("assets/unigrazlogo-white-border.svg", width: 4.1cm)
]

12
template/bibliography.bib Normal file
View file

@ -0,0 +1,12 @@
// You can use LaTeX's bibliography format per default
// or
// Typst's Hayagriva:
// https://github.com/typst/hayagriva/blob/main/docs/file-format.md
@article {zola-1898,
AUTHOR = {Zola, Émile},
TITLE = {J'accuse},
JOURNAL = {L'Aurore},
VOLUME = {87},
YEAR = {1898},
}

75
template/slides.typ Normal file
View file

@ -0,0 +1,75 @@
#import "@local/definitely-not-kfu-slides:1.0.1": *
#show: definitely-not-kfu-theme.with(
aspect-ratio: "16-9",
slide-alignment: top,
progress-bar: true,
institute: [uni-graz.at],
logo: [#unigrazgraz-logo],
config-info(
title: [Is that an interesting title?],
subtitle: [Yes, for a subtitle.],
authors: ([Best Author], [Good Author], [Ugly Author]),
extra: [1st january 2026],
footer: [Let's rock],
download-qr: "",
),
config-common(
handout: false,
),
config-colors(
primary: rgb("FED501"),
),
)
#set text(font:"Fira Sans")
#show math.equation: set text(font:"Fira Math")
#title-slide()
#slide(title: [First Slide])[
#quote-block[
Let there be light!
]
+ This is
+ a numbered
+ list.
Below is an equation:
$
e^(i pi) + 1 = 0 "and" integral_0^1 sin(x) dif x = "something"
$
#note("This will show on pdfpc speaker notes ;)")
]
#slide(title: [Code example])[
The following code block
```typst
#color-block(title: [Advantages])[
- A
- B
- C
]
```
produces this:
#color-block(title: [Advantages])[
- A
- B
- C
]
Let's cite @zola-1898.
Some _emph_ text, and some *strong* text.
]
#slide(title: [Bibliography])[
#set bibliography(title:"References", style: "springer-mathphys")
#bibliography("bibliography.bib")
]

BIN
thumbnail.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

17
typst.toml Normal file
View file

@ -0,0 +1,17 @@
[package]
name = "definitely-not-kfu-slides"
version = "1.0.1"
entrypoint = "src/lib.typ"
authors = ["Ernesto Martínez <https://ecomaikgolf.com>", "Gaspard Jankowiak"]
license = "MIT"
description = "An unofficial UniGraz slides template"
repository = "https://imsc.uni-graz.at/git/gjankowiak/typst-kfu-slides-template"
categories = ["presentation"]
disciplines = ["computer-science", "engineering"]
keywords = ["University of Graz", "template"]
compiler = "0.14.0"
[template]
path = "template"
entrypoint = "slides.typ"
thumbnail = "thumbnail.png"