From b0dc457b53e55483bb9cf863577b946aa6defce3 Mon Sep 17 00:00:00 2001
From: benjamineeckh <72217356+benjamineeckh@users.noreply.github.com>
Date: Fri, 19 Sep 2025 17:20:00 +0200
Subject: [PATCH 1/3] push of modern-se-kul-thesis template
---
modern-se-kul-thesis/.typstignore | 16 ++
modern-se-kul-thesis/0.1.0/LICENSE | 19 ++
modern-se-kul-thesis/0.1.0/README.md | 67 +++++
.../0.1.0/src/assets/logokul.svg | 25 ++
.../0.1.0/src/assets/logokuleng.svg | 21 ++
.../0.1.0/src/assets/text-blobs.typ | 21 ++
.../0.1.0/src/core/component.typ | 14 +
.../0.1.0/src/core/components/abstract.typ | 25 ++
.../0.1.0/src/core/components/appendix.pdf | Bin 0 -> 2213 bytes
.../0.1.0/src/core/components/appendix.typ | 40 +++
.../src/core/components/bibliography.typ | 27 ++
.../0.1.0/src/core/components/copyright.typ | 31 ++
.../0.1.0/src/core/components/cover-page.typ | 190 +++++++++++++
.../components/declaration-of-originality.typ | 15 +
.../src/core/components/dutch-summary.typ | 20 ++
.../components/list-of-abbrvs-symbols.typ | 39 +++
.../0.1.0/src/core/components/outline.typ | 95 +++++++
.../0.1.0/src/core/components/preface.typ | 39 +++
modern-se-kul-thesis/0.1.0/src/core/utils.typ | 4 +
.../0.1.0/src/core/utils/footers.typ | 16 ++
.../0.1.0/src/core/utils/headers.typ | 32 +++
.../0.1.0/src/core/utils/margins.typ | 2 +
modern-se-kul-thesis/0.1.0/src/lib.typ | 268 ++++++++++++++++++
.../0.1.0/template/references.bib | 0
.../0.1.0/template/sections/chapter-1.typ | 2 +
.../0.1.0/template/sections/preface.typ | 1 +
.../0.1.0/template/thesis.typ | 66 +++++
modern-se-kul-thesis/0.1.0/thumbnail.png | Bin 0 -> 141671 bytes
modern-se-kul-thesis/0.1.0/typst.toml | 26 ++
29 files changed, 1121 insertions(+)
create mode 100644 modern-se-kul-thesis/.typstignore
create mode 100644 modern-se-kul-thesis/0.1.0/LICENSE
create mode 100644 modern-se-kul-thesis/0.1.0/README.md
create mode 100644 modern-se-kul-thesis/0.1.0/src/assets/logokul.svg
create mode 100644 modern-se-kul-thesis/0.1.0/src/assets/logokuleng.svg
create mode 100644 modern-se-kul-thesis/0.1.0/src/assets/text-blobs.typ
create mode 100644 modern-se-kul-thesis/0.1.0/src/core/component.typ
create mode 100644 modern-se-kul-thesis/0.1.0/src/core/components/abstract.typ
create mode 100644 modern-se-kul-thesis/0.1.0/src/core/components/appendix.pdf
create mode 100644 modern-se-kul-thesis/0.1.0/src/core/components/appendix.typ
create mode 100644 modern-se-kul-thesis/0.1.0/src/core/components/bibliography.typ
create mode 100644 modern-se-kul-thesis/0.1.0/src/core/components/copyright.typ
create mode 100644 modern-se-kul-thesis/0.1.0/src/core/components/cover-page.typ
create mode 100644 modern-se-kul-thesis/0.1.0/src/core/components/declaration-of-originality.typ
create mode 100644 modern-se-kul-thesis/0.1.0/src/core/components/dutch-summary.typ
create mode 100644 modern-se-kul-thesis/0.1.0/src/core/components/list-of-abbrvs-symbols.typ
create mode 100644 modern-se-kul-thesis/0.1.0/src/core/components/outline.typ
create mode 100644 modern-se-kul-thesis/0.1.0/src/core/components/preface.typ
create mode 100644 modern-se-kul-thesis/0.1.0/src/core/utils.typ
create mode 100644 modern-se-kul-thesis/0.1.0/src/core/utils/footers.typ
create mode 100644 modern-se-kul-thesis/0.1.0/src/core/utils/headers.typ
create mode 100644 modern-se-kul-thesis/0.1.0/src/core/utils/margins.typ
create mode 100644 modern-se-kul-thesis/0.1.0/src/lib.typ
create mode 100644 modern-se-kul-thesis/0.1.0/template/references.bib
create mode 100644 modern-se-kul-thesis/0.1.0/template/sections/chapter-1.typ
create mode 100644 modern-se-kul-thesis/0.1.0/template/sections/preface.typ
create mode 100644 modern-se-kul-thesis/0.1.0/template/thesis.typ
create mode 100644 modern-se-kul-thesis/0.1.0/thumbnail.png
create mode 100644 modern-se-kul-thesis/0.1.0/typst.toml
diff --git a/modern-se-kul-thesis/.typstignore b/modern-se-kul-thesis/.typstignore
new file mode 100644
index 0000000000..ba2d170a42
--- /dev/null
+++ b/modern-se-kul-thesis/.typstignore
@@ -0,0 +1,16 @@
+# this is not a "standard" ignore file, it's specific to this template's `scripts/package` script
+# list any files here that should not be uploaded to Universe when releasing this package
+
+# if you are used to ignore files, be aware that .typstignore is a bit more limited:
+# - only this file is used; .typstignore files in subdirectories are not considered
+# - patterns must match file/directory names from the beginning: `x.typ` will not match `src/x.typ`
+# - `*` in patterns works, but also matches directory separators: `*.typ` _will_ match `src/x.typ`
+# .git and .typstignore are excluded automatically
+
+.github
+scripts
+tests
+Justfile
+# PDF manuals should be included so that they can be linked, but not their sources
+docs/*
+!docs/*.pdf
diff --git a/modern-se-kul-thesis/0.1.0/LICENSE b/modern-se-kul-thesis/0.1.0/LICENSE
new file mode 100644
index 0000000000..6802bc4b80
--- /dev/null
+++ b/modern-se-kul-thesis/0.1.0/LICENSE
@@ -0,0 +1,19 @@
+MIT License
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
\ No newline at end of file
diff --git a/modern-se-kul-thesis/0.1.0/README.md b/modern-se-kul-thesis/0.1.0/README.md
new file mode 100644
index 0000000000..006e642a19
--- /dev/null
+++ b/modern-se-kul-thesis/0.1.0/README.md
@@ -0,0 +1,67 @@
+# The `modern-se-kul-thesis` Package
+
Version 0.1.0
+
+This is an unofficial typst template for doing a thesis at the engineering science faculty at KU Leuven.
+This was made by trying to as closely follow the Latex template [here](https://eng.kuleuven.be/docs/kulemt).
+## Usage
+
+You can use this template in the web editor by going to "start from template" and searching for "modern-se-kul-thesis".
+Alternatively, you can use this template locally by running:
+```typ
+typst init @preview/modern-se-kul-thesis
+```
+This will then create a basic folder structure with some fields pre-filled.
+
+## Configuration
+- `title`: The title of the thesis.
+- `subtitle`: An optional subtitle.
+- `academic-year`: Can be a starting year (e.g. 2025) or a tuple of start and end year (e.g. 2025,2027)
+- `authors`: An array of all the authors.
+- `promotors`: An array of all the promotors.
+- `assessors`: An array of all the assessors.
+- `supervisors`: An array of all the supervisors.
+- `degree: An array containing`: the name of your master, elective and the specified color in hsv (default is for computer science).
+- `language`: "en" or "nl".
+- `electronic-version`: A boolean toggle to set the thesis as electronic.
+- `english-master`: A boolean toggle to use the template for the English master.
+- `list-of-figures`: Toggle to add a list of figures.
+- `list-of-listings`: Toggle to add a list of listings (code blocks).
+- `font-size`: Font size toggle.
+- `preface`: The preface of your thesis goes here.
+- `abstract`: The abstract of your thesis goes here.
+- `dutch-summary`: The dutch summary of your thesis goes here.
+- `abbreviations`: The abbreviations used in your thesis go here.
+- `symbols`: The symbols used in your thesis go here.
+- `bibliography`: The bibliography of your thesis goes here.
+- `appendices`: The appendices of your thesis goes here.
+```typ
+#import "@preview/modern-se-kul-thesis:0.1.0": template
+#show: template.with(
+title: [The main title],
+subtitle: [The subtitle],
+academic-year: 2025,
+authors: ("an Author",),
+promotors: ("a promotor",),
+assessors: ("an assessor",),
+supervisors: ("a supervisor",),
+degree: (
+ elective: "Software engineering",
+ master: "Computerwetenschappen",
+ color: (0, 0, 1, 0),
+),
+language: "en",
+electronic-version: false,
+english-master: false,
+list-of-figures: true,
+list-of-listings: false,
+font-size: 11pt,
+preface: [#lorem(100)],
+abstract: [#lorem(100)],
+dutch-summary: [#lorem(100)],
+abbreviations: [WIP: Work in progress],
+symbols: [$Omega$:Ohm],
+bibliography: include bibliography.bib,
+appendices: [#lorem(100)],
+)
+// Put your thesis content here
+```
diff --git a/modern-se-kul-thesis/0.1.0/src/assets/logokul.svg b/modern-se-kul-thesis/0.1.0/src/assets/logokul.svg
new file mode 100644
index 0000000000..c049d466a5
--- /dev/null
+++ b/modern-se-kul-thesis/0.1.0/src/assets/logokul.svg
@@ -0,0 +1,25 @@
+
+
diff --git a/modern-se-kul-thesis/0.1.0/src/assets/logokuleng.svg b/modern-se-kul-thesis/0.1.0/src/assets/logokuleng.svg
new file mode 100644
index 0000000000..07dc859f6f
--- /dev/null
+++ b/modern-se-kul-thesis/0.1.0/src/assets/logokuleng.svg
@@ -0,0 +1,21 @@
+
+
diff --git a/modern-se-kul-thesis/0.1.0/src/assets/text-blobs.typ b/modern-se-kul-thesis/0.1.0/src/assets/text-blobs.typ
new file mode 100644
index 0000000000..f060306514
--- /dev/null
+++ b/modern-se-kul-thesis/0.1.0/src/assets/text-blobs.typ
@@ -0,0 +1,21 @@
+#let submission-text(degree, elective) = (
+ "en": [
+ Thesis submitte as part of the degree Master of Science: #degree, with elective #elective
+ ],
+ "nl" : [
+ Thesis voorgedragen tot het behalen van de graad van Master of Science in de ingenieurswetenschappen: #degree, hoofdoptie #elective
+ ]
+)
+
+#let copyright = (
+ "tm": [#sym.copyright Copyright KU Leuven],
+ "en" :[
+ Without written permission of the supervisors and the author it is forbidden to reproduce or adapt in any form or by any means any part of this publication. Requests for obtaining the right to reproduce or utilize parts of this publication should be addressed to the Departement Computerwetenschappen, Celestijnenlaan 200A bus 2402, B-3001 Heverlee, +32-16-327700 or by email #link("mailto:info@cs.kuleuven.be").
+#v(1em)
+ A written permission of the supervisors is also required to use the methods, products, schematics and programmes described in this work for industrial or commercial use, and for submitting this publication in scientific contests.],
+
+ "nl": [Zonder voorafgaande schriftelijke toestemming van zowel de promotoren als de auteur is overnemen, kopiƫren, gebruiken of realiseren van deze uitgave of gedeelten ervan verboden. Voor aanvragen tot of informatie i.v.m. het overnemen en/of gebruik en/of realisatie van gedeelten uit deze publicatie, wend u tot het Departement Computerwetenschappen, Celestijnenlaan 200A bus 2402, B-3001 Heverlee, +32-16- 327700 of via e-mail #link("mailto:info@cs.kuleuven.be").
+
+#v(1em)
+
+ Voorafgaande schriftelijke toestemming van de promotoren is eveneens vereist voor het aanwenden van de in deze masterproef beschreven (originele) methoden, producten, schakelingen en programma's voor industrieel of commercieel nut en voor de inzending van deze publicatie ter deelname aan wetenschappelijke prijzen of wedstrijden.])
diff --git a/modern-se-kul-thesis/0.1.0/src/core/component.typ b/modern-se-kul-thesis/0.1.0/src/core/component.typ
new file mode 100644
index 0000000000..ad6824663b
--- /dev/null
+++ b/modern-se-kul-thesis/0.1.0/src/core/component.typ
@@ -0,0 +1,14 @@
+#import "components/abstract.typ": insert-abstract
+#import "components/bibliography.typ": insert-bibliography
+#import "components/copyright.typ": insert-copyright
+#import "components/cover-page.typ": insert-cover-page
+#import "components/declaration-of-originality.typ": insert-dec-of-orig
+// #import "components/keywords.typ": insert-keywords
+#import "components/preface.typ": insert-preface
+#import "components/outline.typ": (
+ insert-heading-outline, insert-image-outline, insert-listing-outline,
+)
+#import "components/list-of-abbrvs-symbols.typ": insert-list-of-abbrv-symbol
+// #import "components/figure-outline.typ": insert-figure-outline
+#import "components/appendix.typ": insert-appendices
+
diff --git a/modern-se-kul-thesis/0.1.0/src/core/components/abstract.typ b/modern-se-kul-thesis/0.1.0/src/core/components/abstract.typ
new file mode 100644
index 0000000000..aac0e5e377
--- /dev/null
+++ b/modern-se-kul-thesis/0.1.0/src/core/components/abstract.typ
@@ -0,0 +1,25 @@
+#let insert-abstract(abstract, lang: "en") = context {
+ heading(
+ level: 1,
+ numbering: none,
+ outlined: true,
+ if lang == "en" {
+ "Abstract"
+ } else {
+ "Samenvatting"
+ },
+ )
+ if abstract != none {
+ abstract
+ } else {
+ let t = if lang == "nl" {
+ "PLAATSHOUDER VOOR SAMENVATTING"
+ } else {
+ "PLACEHOLDER FOR ABSTRACT"
+ }
+ text(purple, size: 3em)[#t]
+ set text(red)
+ lorem(200)
+ }
+}
+
diff --git a/modern-se-kul-thesis/0.1.0/src/core/components/appendix.pdf b/modern-se-kul-thesis/0.1.0/src/core/components/appendix.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..245a89aff29082971dd63ff6f922c1be408342d8
GIT binary patch
literal 2213
zcma)8&2HO95YC||7JY{W3!@GKiCogOM1o=vi&1OTOjKD-0=Pb`$Q8|)CFzEFX_LT6WhlN%&Ve}cRHzT3Z+oFOX(7}e-x
zV>O{QTkx3H$l5@!%8~))>RJl|jh2ZFK$8Z$NG@oZiW_A0q|;HB3(Da)CxV7FW(k#+
zwcwN#TJy!8n$OOzhlr5bUnwEkpP#>c|Ln!T-~Az-uUVUIq?+9}JHhoT`UMEa^7Yp&
zfe2-KCVOEzTl-e*r;mZX$3U5b-S!{e&OXvuAn8=4cuWK+Es=DnfY*)q`BH#vB;6@!
z$a2OnD-u)G-(Vw1JMw)9sTGx6UG3EZ-7TmDLk0!o=ok`F3uJb&-NnzhD;X<8x%YAC
zS*GQfF78>_v2p)}Y5ioHiWsrvX-;c%EHBPZ{`!#Jo;u~#SwvKjga{&IxLnMHx{)8E
zi`IerFB?#QO9h(IG%E-Ce}Dg@qbwQd@14kusv*6}e!1uL^8U>b%jL4W
zw7ZO_26kQ7FfGHfI>6}Eccmarr>uWmI|ykV^Q;n(Q6wFb8C!^f4tuI#l6dR1TJT)C
zOk#uPw2;+g;4X&vHjx+AmR;6erJ@_N!e~eZOmmMJMNe~!Vvjx@r%&^RQKdVJs+Ens
zP+$QSe_2FW>*(BTY?z
zO9umGyH8ykpO>{DWlX=pxJC7o*qbw65D}27%Cnfr<1#>sZ|s(Q`1YWSzN5T`Yddf+eE})aHF3=fC1K*G*zk1svfMUqI_eM6}I>1U-3s{SqKnu%cM8llabx?7}
zAh1=o4%T)lr?NH!S-c(7?cmxI&R
zw{7(WyXpl!1D!){KGLS~V}of3eIaM5Yz-<^yV3M6qf5%ioX#oCEIDk{Km%f!ap0B_n1QY~rHZkr8w(M*Ib&D=id)NyPF&41Wp7+SP^P`SnIKFqKK%yOV_
zA7I#d$g?dFe896$U|Jkvr!c?{uoL$o&%qCQr#4K4eOuf!Td@dEvYhhupMlHlp2{ph
ywkC|hSX9GMex8?ehU6eo^XNQ8SI1wg(dX#vOKPq{p>m;8j{7j}kB(ly9sLh2)_^Yn
literal 0
HcmV?d00001
diff --git a/modern-se-kul-thesis/0.1.0/src/core/components/appendix.typ b/modern-se-kul-thesis/0.1.0/src/core/components/appendix.typ
new file mode 100644
index 0000000000..8ba7e2589a
--- /dev/null
+++ b/modern-se-kul-thesis/0.1.0/src/core/components/appendix.typ
@@ -0,0 +1,40 @@
+#let insert-appendices(appendices) = {
+ set heading(numbering: "A.1", supplement: "Appendix")
+ // let heading-number = "1.1.1."
+ // let heading-spacing = context h(
+ // measure(heading-number).width - measure(heading-number).width,
+ // )
+ pagebreak(weak: true, to: "odd")
+ page(
+ footer: context [#align(center)[#(
+ (here().page-numbering())(here().page())
+ )]],
+ header: none,
+ )[
+ #set align(center)
+ #v(40%)
+ #text(size: 2.5em, weight: "semibold")[Appendices]
+ ]
+
+ pagebreak(weak: true, to: "odd")
+
+ // shoddy hack, but it works
+ // show heading: it => {
+ // if it.level == 1 { it } else {
+ // let size = if it.level == 2 {
+ // 1.1em
+ // } else { 1em }
+ // set text(size, weight: "bold")
+ // let first-number = numbering(it.numbering, counter(heading).get().first())
+ //
+ // let heading-number = (first-number, ..counter(heading).get().slice(1))
+ // .map(str)
+ // .join(".")
+ // [#linebreak()#heading-number #heading-spacing #it.body#linebreak()]
+ // }
+ // }
+ set heading(numbering: "A.1")
+ counter(heading).update(0)
+ appendices
+}
+
diff --git a/modern-se-kul-thesis/0.1.0/src/core/components/bibliography.typ b/modern-se-kul-thesis/0.1.0/src/core/components/bibliography.typ
new file mode 100644
index 0000000000..62d989c8de
--- /dev/null
+++ b/modern-se-kul-thesis/0.1.0/src/core/components/bibliography.typ
@@ -0,0 +1,27 @@
+
+// Bibliography
+#let insert-bibliography(bib, lang: "en") = {
+ if bib != none {
+ show heading: it => {
+ pagebreak(to: "odd", weak: true)
+ pad(top: 1em + 35mm, bottom: 2em, text(
+ size: 1.7em,
+ )[#it.body])
+ }
+ heading(
+ level: 1,
+ numbering: none,
+ if lang == "en" {
+ "Bibliography"
+ } else {
+ "Bibliografie"
+ },
+ outlined: true,
+ )
+ set bibliography(title: none)
+ set par(spacing: 1em)
+ show bibliography: set text(size: 0.9em)
+ show link: it => text(fill: rgb(238, 34, 153), weight: "semibold")[#it]
+ bib
+ }
+}
diff --git a/modern-se-kul-thesis/0.1.0/src/core/components/copyright.typ b/modern-se-kul-thesis/0.1.0/src/core/components/copyright.typ
new file mode 100644
index 0000000000..3e3af80a56
--- /dev/null
+++ b/modern-se-kul-thesis/0.1.0/src/core/components/copyright.typ
@@ -0,0 +1,31 @@
+#import "../../assets/text-blobs.typ": copyright
+/// inserts the copyright page
+/// -> content
+#let insert-copyright(
+ /// Whether the thesis is done during an English master
+ /// -> bool
+ english-master,
+ /// The language of the thesis
+ /// -> Str
+ lang,
+) = {
+ // Copyright
+ set align(left + bottom)
+ set par(justify: true, first-line-indent: 0pt)
+ show link: it => [#text(font: "Nimbus Mono PS", weight: 300)[#it]]
+ set text(hyphenate: false)
+ copyright.tm + v(2em)
+ if lang == "en" {
+ copyright.en + v(2em)
+ }
+ if not english-master {
+ copyright.nl
+ }
+
+ // par(first-line-indent: 0pt, leading: 5pt, justify: true)[
+ // text(hyphenate: false, size: 10.5pt)[
+ // #copyright-text
+ // ]
+ // ]
+ v(7%)
+}
diff --git a/modern-se-kul-thesis/0.1.0/src/core/components/cover-page.typ b/modern-se-kul-thesis/0.1.0/src/core/components/cover-page.typ
new file mode 100644
index 0000000000..27633ea1d6
--- /dev/null
+++ b/modern-se-kul-thesis/0.1.0/src/core/components/cover-page.typ
@@ -0,0 +1,190 @@
+#import "../../assets/text-blobs.typ": submission-text
+#let generate-year(academic-year) = [
+ #if type(academic-year) == array {
+ [#academic-year.at(0) #sym.dash.en #academic-year.at(1)]
+ } else {
+ let next-year = academic-year + 1
+ [#academic-year #sym.dash.en #next-year]
+ }
+]
+
+#let convert-cmyk(degree) = {
+ let clr = cmyk(..degree.map(v => v * 100%))
+ let (red, green, blue) = rgb(clr)
+ .components()
+ .slice(0, 3)
+ .map(v => int(v * 255 / 100%))
+ let text-clr = if (red * 0.299 + green * 0.587 + blue * 0.114) > 186 {
+ black
+ } else { white }
+ return (clr, text-clr)
+}
+
+// TODO: fix error messages + add some standard values
+#let insert-cover-page(
+ title,
+ subtitle,
+ authors,
+ promotors,
+ evaluators,
+ supervisors,
+ academic-year,
+ // An degree dictionary, you should specify a `university`
+ // keyword, `school` keyword and a `degree` keyword
+ degree,
+ english-master,
+ // can be an actual image, or just a path to an image
+ cover: false,
+ lang: "en",
+) = {
+ // diferent scope so logo and font don't get copied over to all the other pages
+ let background-logo
+ if lang == "en" {
+ background-logo = place(
+ top + left,
+ dy: 10mm,
+ dx: 10mm,
+ image(
+ format: "svg",
+ width: 35%,
+ "../../assets/logokuleng.svg",
+ ),
+ )
+ } else if lang == "nl" {
+ //TODO: add dutch logo
+ background-logo = place(
+ top + left,
+ dy: 10mm,
+ dx: 10mm,
+ image(
+ format: "svg",
+ width: 30%,
+ "../../assets/logokul.svg",
+ ),
+ )
+ // logo = image("../../assets/logokuleng.svg")
+ } else {
+ panic("language not supported")
+ }
+ page(
+ margin: 20mm,
+ header: none,
+ numbering: none,
+ footer: none,
+ background: background-logo,
+ )[
+ #{
+ set text(
+ font: "Nimbus Sans",
+ )
+ [
+ #v(30%)
+ #text(2.25em, weight: 500, title)
+ #if subtitle != none {
+ v(1em)
+ text(1.5em, weight: 300, subtitle)
+ }
+ #v(40pt)
+ #block(height: 67pt)[
+ #text(1.4em)[#authors.join("\n")]
+
+ ]
+
+ ]
+
+ set text(size: 12pt)
+ // v(30pt)
+ set align(right)
+ // promotors, evaluators, supervisors
+ // width should be 50% of the text box, don't know how to do it in typst
+ block(width: 45%)[
+ #[
+ #set par(leading: 6pt)
+ #submission-text(degree.master, degree.elective).at(
+ if english-master { "en" } else { "nl" },
+ )
+
+
+ ]
+
+ #let bold-spacing = 8pt
+ #if promotors == none {
+ panic("You probably need to have a promotor")
+ } else {
+ v(bold-spacing)
+ if english-master {
+ [*Supervisor*#if promotors.len() > 1 { [*s*] }: #linebreak()]
+ } else {
+ [*Promotor*#if promotors.len() > 1 { [*en*] }: #linebreak()]
+ }
+ par(leading: 5pt)[
+ // #v(-0.6em)
+ #promotors.join(linebreak())
+ ]
+ // linebreak()
+ }
+ #if not cover {
+ if evaluators == none {
+ // []
+ } else {
+ v(bold-spacing)
+ if english-master {
+ [*Assessor*#if evaluators.len() > 1 { [*s*] }: #linebreak()]
+ } else {
+ [*Evaluator*#if evaluators.len() > 1 { [*en*] }: #linebreak()]
+ }
+ par(leading: 5pt)[
+ // #v(-0.6em)
+ #evaluators.join(linebreak())
+ ]
+ // linebreak()
+ }
+
+ if supervisors == none {
+ // []
+ } else {
+ v(bold-spacing)
+ if english-master {
+ [*Supervisor*#if supervisors.len() > 1 { [*s*] }: #linebreak()]
+ } else {
+ [*Begeleider*#if supervisors.len() > 1 { [*s*] }: #linebreak()]
+ }
+ par(leading: 5pt)[
+ // #v(-0.6em)
+ #supervisors.join(linebreak())
+ ]
+ }
+ }
+ ]
+
+
+ // let degree = (color:none)
+ let height = if degree.color != none and cover {
+ 30pt
+ } else {
+ 15pt
+ }
+
+ let title-page-footer = text(1.2em, weight: 500, [
+ #if english-master {
+ "Academic Year"
+ } else {
+ "Academiejaar"
+ }
+ #generate-year(academic-year)
+ ])
+ title-page-footer += if degree.color != none and cover {
+ let (clr, text-clr) = convert-cmyk(degree.color)
+ v(15pt)
+ rect(width: 190mm, height: 15mm, fill: clr, stroke: none)[#align(
+ center + horizon,
+ )[#text(fill: text-clr)[#degree.master: #degree.elective]]]
+ }
+ place(
+ center + bottom,
+ dy: height,
+ title-page-footer,
+ )
+ }
+ ]
+}
diff --git a/modern-se-kul-thesis/0.1.0/src/core/components/declaration-of-originality.typ b/modern-se-kul-thesis/0.1.0/src/core/components/declaration-of-originality.typ
new file mode 100644
index 0000000000..54a3649fa9
--- /dev/null
+++ b/modern-se-kul-thesis/0.1.0/src/core/components/declaration-of-originality.typ
@@ -0,0 +1,15 @@
+#let insert-dec-of-orig(declaration-of-originality, lang:"en") = {
+ if declaration-of-originality != none{
+ heading(
+ level: 1,
+ numbering: none,
+ outlined: false,
+ if lang == "en" {
+ "Declaration of Originality"
+ } else {
+ "Declaratie van originaliteit"
+ }
+ )
+ text(style: "italic", declaration-of-originality.at(lang))
+ }
+}
\ No newline at end of file
diff --git a/modern-se-kul-thesis/0.1.0/src/core/components/dutch-summary.typ b/modern-se-kul-thesis/0.1.0/src/core/components/dutch-summary.typ
new file mode 100644
index 0000000000..35de4f85d4
--- /dev/null
+++ b/modern-se-kul-thesis/0.1.0/src/core/components/dutch-summary.typ
@@ -0,0 +1,20 @@
+
+#let insert-dutch-summary(summary, lang: "nl") = {
+ if summary != none and lang == "en"{
+ heading(
+ level: 1,
+ numbering: none,
+ outlined: true,
+ "Samenvatting"
+ )
+ summary
+ }else{
+ if lang == "en"{
+ page[
+ #text(red, size: 5em)[#rotate(45deg)[placeholder]
+
+ You need a dutch summary if you are writing an English thesis set `overrule-dutch-summary` to true if you want to remove this warning]
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/modern-se-kul-thesis/0.1.0/src/core/components/list-of-abbrvs-symbols.typ b/modern-se-kul-thesis/0.1.0/src/core/components/list-of-abbrvs-symbols.typ
new file mode 100644
index 0000000000..e1a4fa5feb
--- /dev/null
+++ b/modern-se-kul-thesis/0.1.0/src/core/components/list-of-abbrvs-symbols.typ
@@ -0,0 +1,39 @@
+// TODO: idk, is kinda wonky to use
+#let insert-list-of-abbrv-symbol(
+ lang: "en",
+ abbreviations: none,
+ symbols: none,
+) = {
+ let title = if lang == "en" {
+ "List of Abbreviations and Symbols"
+ } else {
+ "Lijst van Afkortingen en Symbolen"
+ }
+ let abbrv = if lang == "en" {
+ "Abbreviations"
+ } else {
+ "Afkortingen"
+ }
+
+ let symb = if lang == "en" {
+ "Symbols"
+ } else {
+ "Symbolen"
+ }
+ set par(first-line-indent: 0em)
+ heading(numbering: none, bookmarked: true, level: 1, title)
+ if abbreviations != none {
+ text(black, weight: "bold", size: 1.3em)[#abbrv]
+ v(1em)
+
+ abbreviations
+ }
+
+ if symbols != none {
+ text(black, weight: "bold", size: 1.3em)[#symb]
+ v(1em)
+
+ symbols
+ }
+}
+
diff --git a/modern-se-kul-thesis/0.1.0/src/core/components/outline.typ b/modern-se-kul-thesis/0.1.0/src/core/components/outline.typ
new file mode 100644
index 0000000000..64948263a1
--- /dev/null
+++ b/modern-se-kul-thesis/0.1.0/src/core/components/outline.typ
@@ -0,0 +1,95 @@
+#let graph-outline(..args) = {
+ show outline: set heading(outlined: true)
+ outline(..args)
+}
+#let create-page-number(it) = box(
+ width: 2.5em,
+ align(right + top, it.page()),
+)
+#let format-body-with-page(body, number) = {}
+
+/// Inserts outline
+/// - lang (string): language for the oultine, "en" or "nl" allowed
+/// -> content
+#let insert-heading-outline(lang: "en") = {
+ // Table of contents
+ // Outline customization
+ show outline.entry: it => {
+ let weight = if it.element.level == 1 { 900 } else { 500 }
+ let fill = if it.element.level != 1 {
+ repeat(gap: 0.5em)[.]
+ } else { [] }
+ let rest = (
+ text(red, weight: weight)[#it.body()]
+ + h(1em)
+ + box(width: 1fr, fill)
+ + sym.space
+ + sym.wj
+ + text(weight: weight)[ #create-page-number(it) ]
+ )
+ // TOOD: fix indentation of numbered items
+ link(
+ it.element.location(),
+ it.indented(text(red, weight: weight)[#it.prefix()], rest),
+ )
+ }
+ show outline: set heading(numbering: none, outlined: false)
+ show outline.entry.where(level: 1): set block(above: 1.1em)
+ let title = if lang == "nl" {
+ "Inhoudsopgave"
+ } else {
+ "Contents"
+ }
+ outline(title: title, depth: 2)
+}
+
+#let insert-figure-outline(title, target: image) = {
+ // Table of contents
+ // Outline customization
+ show outline.entry: it => {
+ let fill = repeat(gap: 0.5em)[.]
+ let rest = (
+ text(red, weight: 500)[#it.body()]
+ + h(1em)
+ + box(width: 1fr, fill)
+ + sym.space
+ + sym.wj
+ + create-page-number(it)
+ )
+ // + [#it.element.fields()]
+ let location = it.element.location()
+ let number = context {
+ let chapter-number = counter(heading).at(location).at(0)
+ if it.element.caption != none {
+ let figure-number = it.element.caption.counter.at(location).at(0)
+ numbering("1.1", chapter-number, figure-number)
+ } else { "" }
+ }
+ // TODO: add spacing for images with number "N.1"
+ link(
+ location,
+ it.indented(
+ text(red, weight: 500)[#number],
+ rest,
+ ),
+ )
+ }
+ show outline: set heading(numbering: none, outlined: false)
+ show outline.entry.where(level: 1): set block(above: 1.1em)
+ graph-outline(
+ title: title,
+ target: figure.where(kind: target),
+ )
+}
+#let insert-listing-outline(lang: "en") = {
+ let title = if lang == "en" { "List of Listings" } else {
+ "Lijst van code"
+ }
+ insert-figure-outline(title, target: raw)
+}
+#let insert-image-outline(lang: "en") = {
+ let title = if lang == "en" { "List of Figures" } else {
+ "Lijst van Figuren"
+ }
+ insert-figure-outline(title, target: image)
+}
diff --git a/modern-se-kul-thesis/0.1.0/src/core/components/preface.typ b/modern-se-kul-thesis/0.1.0/src/core/components/preface.typ
new file mode 100644
index 0000000000..38fce5aa73
--- /dev/null
+++ b/modern-se-kul-thesis/0.1.0/src/core/components/preface.typ
@@ -0,0 +1,39 @@
+/// inserts preface
+/// - preface (content): The actual preface content to insert
+/// - authors (array): Array of authors
+/// - lang (string): The language of the preface, should be "en" or "nl"
+/// -> content
+#let insert-preface(preface, authors, lang: "en") = {
+ // preface
+ if preface != none {
+ heading(
+ level: 1,
+ numbering: none,
+ outlined: true,
+ if lang == "en" {
+ "Preface"
+ } else {
+ "Voorwoord"
+ },
+ )
+ block[#sym.zws#label("start-of-preamble")]
+ v(-2em)
+
+ // let spacing = 0.5em
+ // set par(leading: spacing, spacing: spacing)
+ preface
+ v(1em)
+ let auth = authors.join("\n")
+ align(right)[_ #auth _]
+ } else {
+ let t = if lang == "nl" {
+ "PLAATSHOUDER VOOR VOORWOORD"
+ } else {
+ "PLACEHOLDER FOR PREFACE"
+ }
+ text(purple, size: 3em)[#t]
+ set text(red)
+ lorem(200)
+ }
+}
+
diff --git a/modern-se-kul-thesis/0.1.0/src/core/utils.typ b/modern-se-kul-thesis/0.1.0/src/core/utils.typ
new file mode 100644
index 0000000000..ee985adf13
--- /dev/null
+++ b/modern-se-kul-thesis/0.1.0/src/core/utils.typ
@@ -0,0 +1,4 @@
+#import "utils/headers.typ": custom-header
+#import "utils/footers.typ": custom-footer
+#import "utils/margins.typ"
+
diff --git a/modern-se-kul-thesis/0.1.0/src/core/utils/footers.typ b/modern-se-kul-thesis/0.1.0/src/core/utils/footers.typ
new file mode 100644
index 0000000000..a9d20dd162
--- /dev/null
+++ b/modern-se-kul-thesis/0.1.0/src/core/utils/footers.typ
@@ -0,0 +1,16 @@
+// needs context
+// custom footer, used in `set page(footer:...)`
+#let custom-footer() = {
+ let num = counter(page).get().at(0)
+ let dir = if calc.odd(int(num)) {
+ right
+ } else {
+ left
+ }
+ let num = if type(here().page-numbering()) == str {
+ numbering(here().page-numbering(), counter(page).get().at(0))
+ } else {
+ here().page-numbering()(counter(page).get().at(0))
+ }
+ align(dir, num)
+}
diff --git a/modern-se-kul-thesis/0.1.0/src/core/utils/headers.typ b/modern-se-kul-thesis/0.1.0/src/core/utils/headers.typ
new file mode 100644
index 0000000000..cfebf84042
--- /dev/null
+++ b/modern-se-kul-thesis/0.1.0/src/core/utils/headers.typ
@@ -0,0 +1,32 @@
+#import "@preview/hydra:0.6.2": hydra
+// needs context
+// heading generation, depends on if the page is even or odd
+#let custom-header() = {
+ if calc.even(counter(page).get().at(0)) {
+ let entry = hydra(skip-starting: true, 1)
+ if entry != none {
+ entry = if entry.has("text") {
+ entry.text
+ } else {
+ entry.children.first() + [. ] + entry.children.last()
+ }
+ align(left)[#smallcaps(entry)]
+ line(length: 100%, stroke: (thickness: 0.1pt))
+ }
+ } else {
+ let entry = hydra(2, skip-starting: false)
+ if entry == none {
+ entry = hydra(1)
+ }
+ if entry != none {
+ entry = if entry.has("text") {
+ entry.text
+ } else {
+ entry.children.first() + [. ] + entry.children.last()
+ }
+ align(right)[#smallcaps(entry)]
+ line(length: 100%, stroke: (thickness: 0.1pt))
+ }
+ }
+}
+
diff --git a/modern-se-kul-thesis/0.1.0/src/core/utils/margins.typ b/modern-se-kul-thesis/0.1.0/src/core/utils/margins.typ
new file mode 100644
index 0000000000..3e5a780d83
--- /dev/null
+++ b/modern-se-kul-thesis/0.1.0/src/core/utils/margins.typ
@@ -0,0 +1,2 @@
+// TODO after everything else works
+// See https://typst.app/docs/reference/layout/page/#parameters-margin
diff --git a/modern-se-kul-thesis/0.1.0/src/lib.typ b/modern-se-kul-thesis/0.1.0/src/lib.typ
new file mode 100644
index 0000000000..d36b33573f
--- /dev/null
+++ b/modern-se-kul-thesis/0.1.0/src/lib.typ
@@ -0,0 +1,268 @@
+#import "assets/text-blobs.typ": copyright, submission-text
+#import "core/component.typ"
+#import "core/utils.typ"
+
+/// The function used to instantiate the template for the thesis
+/// -> content
+#let template(
+ /// The title of the thesis.
+ /// -> content
+ title: [A very cool thesis],
+ /// An optional subtitle.
+ /// -> content
+ subtitle: none,
+ /// the starting year of the thesis or a tuple of years denoting the starting and ending years.
+ /// -> int | (array, int)
+ academic-year: datetime.today().year(),
+ /// the name(s) of the author.
+ /// -> array
+ authors: (),
+ /// the name of the promotor(s), or a list of authors.
+ /// -> array
+ promotors: (),
+ /// the name of the assessors(s).
+ /// -> array
+ assessors: (),
+ /// the name of the supervisors(s) (aka mentors).
+ /// -> array
+ supervisors: (),
+ /// your studies, should specify (master, elective and color (in hsv)).
+ /// -> array
+ degree: (
+ master: "Computer Science",
+ elective: "Software engineering",
+ color: (0, 0, 1, 0),
+ ),
+ /// the language of the thesis, supported languages are "nl" and "en".
+ /// -> string
+ language: "en",
+ /// whether to print the document as an electronic version or for printing.
+ /// -> bool
+ electronic-version: false,
+ /// toggle to notify the template that you don't need any Dutch things.
+ /// -> bool
+ english-master: false,
+ /// Whether to automatically add a list of figures
+ /// -> bool
+ list-of-figures: false,
+ /// Whether to automatically add a list of listings (code blocks)
+ /// -> bool
+ list-of-listings: false,
+ /// the size of the text, can choose between 10pt and 11pt.
+ /// -> pt
+ font-size: 11pt,
+ /// The preface (voorwoord).
+ /// -> content
+ preface: none,
+ /// The abstract (samenvatting).
+ /// -> content
+ abstract: none,
+ /// (optional) Summary needed if writing a English thesis for the Dutch master.
+ /// -> content
+ dutch-summary: none,
+ /// List of abbreviations
+ /// -> content
+ abbreviations: none,
+ /// List of symbols
+ /// -> content
+ symbols: none,
+ /// the bibliography.
+ /// -> content
+ bibliography: none,
+ /// The appendiceses
+ /// -> content
+ appendices: none,
+ /// automatically inserted content of the thesis.
+ /// -> content
+ body,
+) = {
+ // Set document matadata.
+ set document(title: title, author: authors)
+
+ set text(font: "New Computer Modern", lang: language, size: font-size)
+ set par(first-line-indent: 1em, spacing: 0.65em, justify: true)
+
+ /////////////////////////// Heading config
+ // Configure headings
+ set heading(numbering: "1.1.1")
+
+ /////////////////////////// figure numbering
+ set figure(numbering: it => context {
+ let count = counter(heading).get()
+ numbering("1.1", count.at(0), it)
+ })
+ /////////////////////////// frontpage
+ // Print cover page
+ if not electronic-version {
+ component.insert-cover-page(
+ title,
+ subtitle,
+ authors,
+ promotors,
+ assessors,
+ supervisors,
+ academic-year,
+ degree,
+ english-master,
+ cover: true,
+ lang: language,
+ )
+ }
+ // Actual cover page
+ component.insert-cover-page(
+ title,
+ subtitle,
+ authors,
+ promotors,
+ assessors,
+ supervisors,
+ academic-year,
+ degree,
+ english-master,
+ cover: false,
+ lang: language,
+ )
+
+ /////////////////////////// pre-body content
+ // copyright
+ component.insert-copyright(english-master, language)
+
+ // numbering setup + header + footer
+ // TODO: fix margins for RL pages
+ set page(
+ paper: "a4",
+ numbering: (num, ..) => {
+ // subtract 2 for header page + copyright notice
+ numbering("i", num - 2)
+ },
+ margin: (left: 28mm, right: 28mm, bottom: 45mm, top: 37mm),
+ header: context utils.custom-header(),
+ footer: context utils.custom-footer(),
+ // header-ascent: 10mm,
+ footer-descent: 15%,
+ )
+
+ // header stuff
+ show heading.where(level: 1): it => {
+ pagebreak(weak: true)
+ pad(top: 19mm, bottom: 19mm, {
+ set text(1.55em, weight: "bold")
+ it.body
+ })
+ }
+
+
+ // citations
+ show ref: it => {
+ let el = it.element
+ if el != none {
+ // All other references in the document, such as figures
+ show regex("\d(\.\d)*|[A-Z] |[A-Z](\.\d)+"): it => {
+ text(red)[#it]
+ }
+ it
+ } else {
+ // Bibliography reference
+ show regex("\d"): it => {
+ text(rgb("#00ff00"))[#it]
+ }
+ it
+ }
+ }
+
+ let spacing = 0.5em
+ set par(first-line-indent: 0.5cm, leading: spacing, spacing: spacing)
+ // preface
+ component.insert-preface(preface, authors, lang: language)
+
+ // outline
+ component.insert-heading-outline(lang: language)
+
+ // abstract
+ component.insert-abstract(abstract, lang: language)
+
+ // Optional dutch abstract
+ if (not english-master) and language == "en" {
+ component.insert-abstract(dutch-summary, lang: "nl")
+ }
+
+ if list-of-figures { component.insert-image-outline(lang: language) }
+ if list-of-listings { component.insert-listing-outline(lang: language) }
+ if abbreviations != none or symbols != none {
+ component.insert-list-of-abbrv-symbol(
+ lang: language,
+ symbols: symbols,
+ abbreviations: abbreviations,
+ )
+ }
+
+ let chapter-numbering = "1.1.1"
+ set page(
+ numbering: (num, ..) => {
+ let starting-heading = query(
+ heading.where(level: 1, numbering: chapter-numbering),
+ )
+ .first()
+ .location()
+ .page()
+ numbering("1", num - starting-heading + 1)
+ },
+ )
+ // counter(page).update(1)
+ set heading(supplement: "Chapter")
+ set heading(numbering: chapter-numbering)
+ /////////////////////////// show rules
+ show heading.where(level: 1): it => {
+ pagebreak(weak: true, to: "odd")
+ context counter(figure.where(kind: image)).update(0)
+ block[
+ #pad(top: 25mm, text(
+ size: 1.3em,
+ weight: "semibold",
+ )[
+ #it.supplement #numbering(
+ it.numbering,
+ counter(heading).at(here()).at(0),
+ )
+ ])
+ #pad(top: 1em, bottom: 2em, text(
+ size: 1.7em,
+ )[#it.body])
+
+ ]
+ }
+
+ show heading.where(level: 2): it => block(width: 100%)[
+ #set text(1.1em, weight: "bold")
+ #pad(top: 0.4em, bottom: 0.8em)[
+ #numbering(chapter-numbering, ..counter(heading).get()) #it.body
+ ]
+ ]
+ show heading.where(level: 3): it => block(width: 100%)[
+ #set text(1em, weight: "bold")
+ #pad(top: 0.2em, bottom: 0.5em)[
+ #numbering(chapter-numbering, ..counter(heading).get()) #it.body
+ ]
+ ]
+ show heading.where(level: 4): it => block(width: 100%)[
+ #set text(1em, weight: "bold")
+ #pad(top: 0em, bottom: 0.5em)[
+ #it.body
+ ]
+ ]
+ show pagebreak.where(to: "odd", weak: true): set page(
+ header: none,
+ footer: none,
+ )
+ show pagebreak.where(to: "even", weak: true): set page(
+ header: none,
+ footer: none,
+ )
+
+ body
+
+ if appendices != none {
+ component.insert-appendices(appendices)
+ }
+ component.insert-bibliography(bibliography, lang: language)
+}
diff --git a/modern-se-kul-thesis/0.1.0/template/references.bib b/modern-se-kul-thesis/0.1.0/template/references.bib
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/modern-se-kul-thesis/0.1.0/template/sections/chapter-1.typ b/modern-se-kul-thesis/0.1.0/template/sections/chapter-1.typ
new file mode 100644
index 0000000000..6bd2c35c8d
--- /dev/null
+++ b/modern-se-kul-thesis/0.1.0/template/sections/chapter-1.typ
@@ -0,0 +1,2 @@
+= Chapter 1
+#lorem (300)
diff --git a/modern-se-kul-thesis/0.1.0/template/sections/preface.typ b/modern-se-kul-thesis/0.1.0/template/sections/preface.typ
new file mode 100644
index 0000000000..2fb44f0460
--- /dev/null
+++ b/modern-se-kul-thesis/0.1.0/template/sections/preface.typ
@@ -0,0 +1 @@
+This is a preface
diff --git a/modern-se-kul-thesis/0.1.0/template/thesis.typ b/modern-se-kul-thesis/0.1.0/template/thesis.typ
new file mode 100644
index 0000000000..cc4b523299
--- /dev/null
+++ b/modern-se-kul-thesis/0.1.0/template/thesis.typ
@@ -0,0 +1,66 @@
+#import "@preview/modern-kul-thesis:0.1.0": template
+#show: template.with(
+ // Your title goes here
+ title: "An example title",
+
+ // subtitle: "With a subtitle",
+
+ // Give or only the year you started in (eg: 2024), or a tuple with the start and end year (eg: (2024, 2040))
+ academic-year: datetime.today().year(),
+
+ // "Master's Thesis", "PhD Thesis", etc.
+ // subtitle: "Master's Thesis",
+
+ // Change to the name(s) of the author(s)
+ authors: ("A guy", "Another guy"),
+
+ // Change to the name(s) of the promotor(s)
+ promotors: ("Prof. dr. ir. Man",),
+
+ // Add as many co-supervisors as you needthe entry
+ // if none are needed
+ assessors: (
+ "Assessor nr 1",
+ ),
+
+ // Change to your supervisor's name
+ // remove if none are needed
+ supervisors: (
+ "A supervisor",
+ ),
+
+ // Customize with your own faculty and degree (should be in dutch if you are doing the dutch master)
+ degree: (
+ elective: "Software engineering",
+ master: "Computerwetenschappen",
+ color: (0, 0, 1, 0),
+ ),
+
+ // Change to "nl" for the Dutch template
+ language: "en",
+ english-master: false,
+ font-size: 11pt,
+
+ // set to true to remove extra title-page and have non-changing margins
+ electronic-version: true,
+
+ // Hayagriva bibliography is the default one, if you want to use a
+ // BibTeX file, pass a .bib file instead (e.g. "works.bib")
+ bibliography: bibliography("references.bib"),
+
+ // Preface text
+ preface: include "sections/preface.typ",
+ // Abstract text
+ // abstract: include "sections/main-text/abstract.typ",
+ // dutch-summary: include "sections/main-text/dutch-abstract.typ",
+ list-of-figures: true,
+ list-of-listings: false,
+ // abbreviations: include "sections/main-text/list-of-abbreviations-and-symbols.typ",
+ symbols: none,
+
+ // appendices: include "sections/appendix/appendix.typ",
+
+ // pre-body-page:true,
+)
+
+#include "sections/chapter-1.typ"
diff --git a/modern-se-kul-thesis/0.1.0/thumbnail.png b/modern-se-kul-thesis/0.1.0/thumbnail.png
new file mode 100644
index 0000000000000000000000000000000000000000..5b52dd7f0a67979953d96c1553193c7ab2654399
GIT binary patch
literal 141671
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