From f2abb7f0b23bb37e129a61bcb7d69a13572c958a Mon Sep 17 00:00:00 2001
From: Rafael Oliveira
Date: Sun, 28 Jun 2026 23:50:22 +0200
Subject: [PATCH] kthesis:0.1.7
---
packages/preview/kthesis/0.1.7/LICENSE-MIT | 21 +
packages/preview/kthesis/0.1.7/LICENSE-MIT-0 | 18 +
packages/preview/kthesis/0.1.7/README.md | 143 ++++++
.../kthesis/0.1.7/assets/KTH_logo_RGB_bla.svg | 1 +
packages/preview/kthesis/0.1.7/shell.nix | 11 +
packages/preview/kthesis/0.1.7/src/covers.typ | 80 +++
.../preview/kthesis/0.1.7/src/for-diva.typ | 197 ++++++++
.../kthesis/0.1.7/src/front-matter.typ | 170 +++++++
packages/preview/kthesis/0.1.7/src/lang.toml | 60 +++
packages/preview/kthesis/0.1.7/src/lib.typ | 463 ++++++++++++++++++
.../kthesis/0.1.7/src/styling-setup.typ | 117 +++++
packages/preview/kthesis/0.1.7/src/utils.typ | 212 ++++++++
.../kthesis/0.1.7/template/acronyms.typ | 15 +
.../0.1.7/template/content/abstract-1-en.typ | 1 +
.../0.1.7/template/content/abstract-2-sv.typ | 1 +
.../0.1.7/template/content/abstract-3-pt.typ | 1 +
.../template/content/acknowledgements.typ | 5 +
.../template/content/ch01-introduction.typ | 21 +
.../template/content/ch02-background.typ | 25 +
.../0.1.7/template/content/ch03-method.typ | 27 +
.../0.1.7/template/content/ch04-the-thing.typ | 15 +
.../0.1.7/template/content/ch05-results.typ | 5 +
.../template/content/ch06-discussion.typ | 9 +
.../template/content/ch07-conclusion.typ | 5 +
.../0.1.7/template/content/zz-a-usage.typ | 5 +
.../0.1.7/template/content/zz-b-else.typ | 3 +
.../kthesis/0.1.7/template/references.yaml | 18 +
.../preview/kthesis/0.1.7/template/thesis.typ | 195 ++++++++
packages/preview/kthesis/0.1.7/thumbnail.png | Bin 0 -> 259431 bytes
packages/preview/kthesis/0.1.7/typst.toml | 17 +
30 files changed, 1861 insertions(+)
create mode 100644 packages/preview/kthesis/0.1.7/LICENSE-MIT
create mode 100644 packages/preview/kthesis/0.1.7/LICENSE-MIT-0
create mode 100644 packages/preview/kthesis/0.1.7/README.md
create mode 100644 packages/preview/kthesis/0.1.7/assets/KTH_logo_RGB_bla.svg
create mode 100644 packages/preview/kthesis/0.1.7/shell.nix
create mode 100644 packages/preview/kthesis/0.1.7/src/covers.typ
create mode 100644 packages/preview/kthesis/0.1.7/src/for-diva.typ
create mode 100644 packages/preview/kthesis/0.1.7/src/front-matter.typ
create mode 100644 packages/preview/kthesis/0.1.7/src/lang.toml
create mode 100644 packages/preview/kthesis/0.1.7/src/lib.typ
create mode 100644 packages/preview/kthesis/0.1.7/src/styling-setup.typ
create mode 100644 packages/preview/kthesis/0.1.7/src/utils.typ
create mode 100644 packages/preview/kthesis/0.1.7/template/acronyms.typ
create mode 100644 packages/preview/kthesis/0.1.7/template/content/abstract-1-en.typ
create mode 100644 packages/preview/kthesis/0.1.7/template/content/abstract-2-sv.typ
create mode 100644 packages/preview/kthesis/0.1.7/template/content/abstract-3-pt.typ
create mode 100644 packages/preview/kthesis/0.1.7/template/content/acknowledgements.typ
create mode 100644 packages/preview/kthesis/0.1.7/template/content/ch01-introduction.typ
create mode 100644 packages/preview/kthesis/0.1.7/template/content/ch02-background.typ
create mode 100644 packages/preview/kthesis/0.1.7/template/content/ch03-method.typ
create mode 100644 packages/preview/kthesis/0.1.7/template/content/ch04-the-thing.typ
create mode 100644 packages/preview/kthesis/0.1.7/template/content/ch05-results.typ
create mode 100644 packages/preview/kthesis/0.1.7/template/content/ch06-discussion.typ
create mode 100644 packages/preview/kthesis/0.1.7/template/content/ch07-conclusion.typ
create mode 100644 packages/preview/kthesis/0.1.7/template/content/zz-a-usage.typ
create mode 100644 packages/preview/kthesis/0.1.7/template/content/zz-b-else.typ
create mode 100644 packages/preview/kthesis/0.1.7/template/references.yaml
create mode 100644 packages/preview/kthesis/0.1.7/template/thesis.typ
create mode 100644 packages/preview/kthesis/0.1.7/thumbnail.png
create mode 100644 packages/preview/kthesis/0.1.7/typst.toml
diff --git a/packages/preview/kthesis/0.1.7/LICENSE-MIT b/packages/preview/kthesis/0.1.7/LICENSE-MIT
new file mode 100644
index 0000000000..d026733c4c
--- /dev/null
+++ b/packages/preview/kthesis/0.1.7/LICENSE-MIT
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2025 Rafael Oliveira
+
+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.
diff --git a/packages/preview/kthesis/0.1.7/LICENSE-MIT-0 b/packages/preview/kthesis/0.1.7/LICENSE-MIT-0
new file mode 100644
index 0000000000..8c06f1c518
--- /dev/null
+++ b/packages/preview/kthesis/0.1.7/LICENSE-MIT-0
@@ -0,0 +1,18 @@
+MIT No Attribution
+
+Copyright (c) 2025 Rafael Oliveira
+
+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.
+
+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.
diff --git a/packages/preview/kthesis/0.1.7/README.md b/packages/preview/kthesis/0.1.7/README.md
new file mode 100644
index 0000000000..f1d07c693e
--- /dev/null
+++ b/packages/preview/kthesis/0.1.7/README.md
@@ -0,0 +1,143 @@
+# KTHesis
+
+An unofficial, slightly opinionated, extensible [Typst](https://typst.app/home/)
+template for writing a Degree Project thesis for KTH Royal Institute of
+Technology in Stockholm, Sweden.
+
+Inspired by and partially adapted from Gerald Q. Maguire Jr.'s LaTeX template
+and KTH's official degree project report covers as published on the
+[institution's website](https://www.kth.se/en/omslag-till-ditt-exjobb-1.479838).
+
+## Overview
+
+This template is primarily targeted at Master's Degree theses, though it aims to
+be sufficiently generic so to also be suitable for other kinds of reports. It
+strives to simplify drafting and counts with the following features, among
+others:
+
+- Supports both English and Swedish as primary language, with built-in
+ translations for template-managed headings and sections;
+- Supports additional Abstracts in other languages;
+- Supports arbitrary extra preamble sections, such as a Glossary / Table of
+ Acronyms - i.e., integrates well with
+ [glossarium](https://typst.app/universe/package/glossarium) or similar;
+- Does not conflict with Typst's native
+ [bibliography](https://typst.app/docs/reference/model/bibliography/) mechanism
+ even without requiring any additional configuration - "plug and play";
+- Uses [hydra](https://typst.app/universe/package/hydra) to show the current
+ Chapter title in the page header;
+- Uses [headcount](https://typst.app/universe/package/headcount) to make figure,
+ table, and listing numbers dependent on Chapter number;
+- Includes built-in selective inclusion of indices: an index for figures,
+ tables, and listings is automatically added if needed and omitted if not;
+- Can generate a "For DiVA" JSON-based trailing section for compatibility with
+ existing, school-prevalent automation scripts; and
+- Provides a simple interface and tuning options.
+
+## Getting Started
+
+Visit the template's [homepage](https://typst.app/universe/package/kthesis/) and
+click "Create project in app" to try it out in the Typst web app.
+
+Alternatively, you can also run `typst init @preview/kthesis` to bootstrap a new
+project via the Typst CLI.
+
+## Usage
+
+The main entrypoint is the function `kth-thesis`, which should be invoked with
+a `show` rule at the beginning of the document:
+
+```typ
+#show: kth-thesis.with(primary-lang: "en")
+```
+
+Additional configuration options are passed as needed. After this rule has been
+declared, you can write your thesis's content as normal. Level 1 headings (`=`)
+mark Chapters, Level 2 headings (`==`) delimitate Sections, Level 3 headings
+(`===`) indicate Subsections, and so on.
+
+The second and last point of contact with the template is the function
+`setup-appendices`, which you may (if needed) opt to invoke in a `show` rule to
+mark the subsequent sections as appendices and switch the numbering to letters:
+
+```typ
+#show: setup-appendices
+```
+
+## Configuration
+
+There are a number of options that can be passed to the `kth-thesis` function to
+customize how the final document looks. All of them are optional since they come
+with default values, but in most cases you'll gradually end up having to set
+all of them to get the behavior you want. Here's a description of what is
+available:
+
+- `primary-lang`: Primary document language; either `en` or `sv`
+- `localized-info`: Language-specific information, including title, subtitle,
+ abstract, and keywords
+- `authors`: Information about who is conducting the degree project
+- `supervisors`: Information about who is supervising the degree project
+- `examiner`: Information about who is evaluating the degree project
+- `course`: Degree project course of which this thesis is part
+- `degree`: Degree within the scope of which this project is being conducted
+- `national-subject-categories`: One or more mandatory classification codes,
+ from [SCB's list](https://www.scb.se/contentassets/10054f2ef27c437884e8cde0d38b9cc4/standard-for-svensk-indelning--av-forskningsamnen-2011-uppdaterad-aug-2016.pdf)
+- `school`: KTH institution hosting the project
+- `trita-number`: TRITA number assigned by the school upon project completion
+- `host-company`: Company hosting the degree project, if any
+- `host-org`: Organization hosting the degree project, if any
+- `opponents`: Names of assigned opponents, if known
+- `presentation`: Final presentation details, if known
+- `cover-image`: Image to include on the front cover, if any
+- `acknowledgements`: Body of acknowledgements section
+- `extra-preambles`: Additional, arbitrary front-matter sections, if needed
+- `doc-date`: Document authoring/submission date
+- `doc-city`: Document city, for acknowledgments signature
+- `doc-extra-keywords`: Additional keywords for document metadata (but not text)
+- `with-for-diva`: Whether to include meta "For DiVA" section after back cover
+- `style`: Miscellaneous settings affecting the document's appearance
+
+Exact syntax and semantics for each option are shown in the starter `thesis.typ`
+main file provided by this template.
+
+**Note:** if `with-for-diva` is enabled, abstracts must use only very simple
+Typst constructs since content must be converted to HTML (which is a very lossy
+and naive process).
+
+## Future Work
+
+Feature requests (via issues) and patch submissions (via PRs) are very welcome.
+
+Among others, in the future it might be nice to support:
+
+- G5 size paper (traditional for theses in Sweden), instead of just A4;
+- Alternative, shorter author names for acknowledgements signature;
+- Multiple degrees, including the "Same"/"Both" mechanism for similar or
+ distinct subject areas, respectively; and
+- Copyleft option, instead of just copyright;
+
+## Conformance
+
+This template is unofficial and has not been verified to fully conform to KTH's
+requirements, therefore you should use it at your own risk. However, available
+information appears to imply that the covers are the only standardized part of
+the degree project report, with students having freedom to decide on all other
+formatting, styling, and layout aspects (if accepted by the Examiner).
+
+Covers (June 2024 version) have been replicated as best as possible in Typst
+from the provided DOTX templates, but future bids at refining fidelity may be
+attempted in the future, especially if and when LaTeX versions are published.
+
+The covers use Arial, which is a proprietary font and may be difficult to get
+access to. This template will use Arial if it is available on the system at
+compile-time and `style.use-arial` is manually enabled (opt-in); otherwise, it
+will be replaced by an open, metric-compatible substitute: Liberation Sans.
+
+## Licensing
+
+This project and all materials in this repository are made available under the
+MIT License, except for the contents of the `/template` directory (i.e., the
+files given for the thesis authors to edit), which are instead licensed under
+MIT No Attribution.
+
+SPDX-License-Identifier: MIT AND MIT-0
diff --git a/packages/preview/kthesis/0.1.7/assets/KTH_logo_RGB_bla.svg b/packages/preview/kthesis/0.1.7/assets/KTH_logo_RGB_bla.svg
new file mode 100644
index 0000000000..9b05b7074a
--- /dev/null
+++ b/packages/preview/kthesis/0.1.7/assets/KTH_logo_RGB_bla.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/preview/kthesis/0.1.7/shell.nix b/packages/preview/kthesis/0.1.7/shell.nix
new file mode 100644
index 0000000000..79ef720e22
--- /dev/null
+++ b/packages/preview/kthesis/0.1.7/shell.nix
@@ -0,0 +1,11 @@
+{
+ pkgs ? (import { }),
+ unstable ? (import { }),
+}:
+pkgs.mkShellNoCC {
+ buildInputs = with pkgs; [
+ unstable.typst
+ unstable.typstyle
+ poppler-utils # for pdfinfo, to see metadata
+ ];
+}
diff --git a/packages/preview/kthesis/0.1.7/src/covers.typ b/packages/preview/kthesis/0.1.7/src/covers.typ
new file mode 100644
index 0000000000..07e9d8e25c
--- /dev/null
+++ b/packages/preview/kthesis/0.1.7/src/covers.typ
@@ -0,0 +1,80 @@
+#import "./utils.typ": sans-serif, t
+
+#let front-cover(
+ title: "Example Title in Primary Language",
+ subtitle: "Example Subtitle in Primary Language",
+ authors: ("Peter Grey", "Joan Yellow"),
+ subject-area: "Technology",
+ cycle: 2,
+ credits: 15,
+ cover-image: none,
+ style,
+) = page(
+ margin: (top: 12.5mm, rest: 25mm),
+ {
+ set align(center)
+ set text(size: 12pt, font: sans-serif(style))
+
+ image("../assets/KTH_logo_RGB_bla.svg", width: 37.45mm)
+
+ [
+ \
+
+ \
+
+ #t("degree-project-in") #subject-area \
+
+ #set text(size: 10pt)
+ #t("cycle-" + str(cycle)), #credits #t("credits") \
+
+ \
+
+ #text(size: 26pt, strong(title)) \
+ \
+ #if subtitle != none [
+ #text(size: 16pt, subtitle)
+ \
+ ]
+
+ \
+ ]
+
+ for author in authors {
+ strong(upper(author))
+ linebreak()
+ }
+
+ if cover-image != none {
+ // from official cover template: 120 twips after author + 680 twips before
+ // image = 800 twips = 40pt of vertical space
+ v(40pt)
+
+ cover-image
+ }
+ },
+)
+
+#let back-cover(
+ trita-series: "EECS-EX",
+ trita-number: "2026:0000",
+ year: 2026,
+ style,
+) = page(
+ margin: (top: 65mm, bottom: 30mm, left: 74pt, right: 35mm),
+ {
+ set text(size: 12pt, font: sans-serif(style))
+
+ v(1fr)
+
+ set text(size: 10pt)
+ show link: it => text(fill: rgb("#1954A6"), it) // not an official color?
+
+ // I don't know why they want an en-dash here...
+ [
+ TRITA -- #trita-series #trita-number \
+ #set text(size: 8pt)
+ #t("stockholm-sweden") #year \
+ #link("https://www.kth.se", "www.kth.se")
+ ]
+ },
+)
diff --git a/packages/preview/kthesis/0.1.7/src/for-diva.typ b/packages/preview/kthesis/0.1.7/src/for-diva.typ
new file mode 100644
index 0000000000..a8aaba3035
--- /dev/null
+++ b/packages/preview/kthesis/0.1.7/src/for-diva.typ
@@ -0,0 +1,197 @@
+#import "./utils.typ": content-to-html, content-to-string, omit-dict-none
+
+// what has humanity done to deserve this structure and its pervasiveness?
+
+#let serialize-org(school, dept) = {
+ let org = omit-dict-none(("L1": school, "L2": dept))
+
+ if org.len() > 0 {
+ org
+ } else {
+ none
+ }
+}
+
+#let serialize-person(person) = {
+ omit-dict-none((
+ "Last name": person.at("last-names"),
+ "First name": person.at("first-name"),
+ "Local User Id": person.at("user-id", default: none),
+ "E-mail": person.at("email", default: none),
+ "organisation": serialize-org(
+ person.at("school", default: none),
+ person.at("department", default: none),
+ ),
+ "Other organisation": person.at("external-org", default: none),
+ ))
+}
+
+#let serialize-degree(degree) = {
+ (
+ "Educational program": degree.at("name"),
+ "programcode": degree.at("code"),
+ "Degree": degree.at("kind"),
+ "subjectArea": degree.at("subject-area"),
+ )
+}
+
+#let serialize-lang(lang) = {
+ if lang.len() == 3 {
+ lang
+ } else if lang == "en" {
+ "eng"
+ } else if lang == "sv" {
+ "swe"
+ } else {
+ panic("Cannot serialize to alpha-3 language " + lang)
+ }
+}
+
+#let serialize-title(lang, info) = {
+ (
+ "Main title": content-to-string(info.at("title")),
+ "Subtitle": content-to-string(info.at("subtitle", default: "")),
+ "Language": info.at("alpha-3", default: serialize-lang(lang)),
+ )
+}
+
+#let serialize-cooperation(host-company, host-org) = {
+ if host-company != none {
+ ("Partner_name": host-company)
+ } else if host-org != none {
+ ("Partner_name": host-org)
+ } else {
+ none
+ }
+}
+
+#let serialize-opponents(opponents) = {
+ if opponents != none and opponents.len() > 0 {
+ ("Name": opponents.join(" & "))
+ } else {
+ none
+ }
+}
+
+#let serialize-presentation(presentation) = {
+ if presentation != none {
+ let location = presentation.at(
+ "location",
+ default: (
+ room: none,
+ address: none,
+ city: none,
+ ),
+ )
+
+ let online = presentation.at("online", default: none)
+ let online-room = if online != none {
+ "via " + online.at("service") + ": " + online.at("link")
+ } else {
+ none
+ }
+
+ omit-dict-none((
+ "Date": presentation
+ .at("slot")
+ .display("[year]-[month]-[day] [hour]:[minute]"),
+ "Language": serialize-lang(presentation.at("language")),
+ "Room": location.at("room", default: online-room),
+ "Address": location.at("address", default: none),
+ "City": location.at("city", default: none),
+ ))
+ } else {
+ none
+ }
+}
+
+#let serialize-global(
+ primary-lang: "en",
+ alt-lang: "sv",
+ localized-info: (:),
+ authors: (),
+ supervisors: (),
+ examiner: (:),
+ course: (:),
+ degree: (:),
+ host-company: none,
+ host-org: none,
+ national-subject-categories: (),
+ trita-series: "TRITA-EECS-EX",
+ trita-number: "2026:0000",
+ opponents: none,
+ presentation: none,
+ doc-date: datetime.today(),
+ page-series-counts: (),
+) = {
+ let struct = (:)
+
+ for (n, author) in authors.enumerate(start: 1) {
+ struct.insert("Author" + str(n), serialize-person(author))
+ // note: n > 2 might be ignored by consuming automation scripts
+ }
+
+ struct.insert("Cycle", str(degree.at("cycle")))
+ struct.insert("Course code", str(course.at("code")))
+ struct.insert("Credits", str(course.at("credits")))
+
+ struct.insert("Degree1", serialize-degree(degree))
+ // TODO: support for multiple degrees (including Same/Both mechanism)
+
+ let primary-info = localized-info.at(primary-lang)
+ let alt-info = localized-info.at(alt-lang)
+
+ struct.insert("Title", serialize-title(primary-lang, primary-info))
+ struct.insert("Alternative title", serialize-title(alt-lang, alt-info))
+
+ for (n, supervisor) in supervisors.enumerate(start: 1) {
+ struct.insert("Supervisor" + str(n), serialize-person(supervisor))
+ // note: n > 3 might be ignored by consuming automation scripts
+ }
+
+ struct.insert("Examiner1", serialize-person(examiner))
+ struct.insert("Cooperation", serialize-cooperation(host-company, host-org))
+ struct.insert(
+ "National Subject Categories",
+ national-subject-categories.join(", "),
+ )
+ struct.insert(
+ "Other information",
+ (
+ "Year": str(doc-date.year()),
+ "Number of pages": page-series-counts.join(","),
+ ),
+ )
+ struct.insert("Copyrightleft", "copyright") // TODO: support copyleft
+ struct.insert(
+ "Series",
+ (
+ "Title of series": "TRITA-" + trita-series,
+ "No. in series": trita-number,
+ ),
+ )
+ struct.insert("Opponents", serialize-opponents(opponents))
+ struct.insert("Presentation", serialize-presentation(presentation))
+ struct.insert("Number of lang instances", str(localized-info.len()))
+
+ for (lang, info) in localized-info.pairs() {
+ let tag = serialize-lang(info.at("alpha-3", default: lang))
+ struct.insert(
+ "Abstract[" + tag + "]",
+ content-to-html(info.at("abstract")),
+ )
+ struct.insert("Keywords[" + tag + "]", info.at("keywords").join(", "))
+ }
+
+ omit-dict-none(struct)
+}
+
+#let for-diva-json(..args) = {
+ let struct = serialize-global(..args)
+
+ set text(font: "DejaVu Sans Mono", size: 10pt, ligatures: false)
+
+ heading(outlined: false, level: 1, "€€€€ For DIVA €€€€")
+
+ json.encode(struct)
+}
diff --git a/packages/preview/kthesis/0.1.7/src/front-matter.typ b/packages/preview/kthesis/0.1.7/src/front-matter.typ
new file mode 100644
index 0000000000..4e9ba11113
--- /dev/null
+++ b/packages/preview/kthesis/0.1.7/src/front-matter.typ
@@ -0,0 +1,170 @@
+#import "./utils.typ": join-names, t
+
+#let title-page(
+ title: "Primary Language Title Goes Here",
+ subtitle: "Primary Language Subtitle Goes Here", // may be none!
+ alt-title: "Alternative Language Title Goes Here",
+ alt-subtitle: "Alternative Language Subtitle Goes Here", // may be none!
+ alt-lang: "sv", // either "en" or "sv"
+ degree: "Master's Program, Computer Science",
+ date: datetime.today(),
+ authors: ("Newt Yellow", "Bellatrix Green"),
+ supervisors: ("Minerva Red", "Filius Blue"),
+ examiner-name: "Brian Gold",
+ examiner-school: "School of Electrical Engineering and Computer Science",
+ host-company: "Företaget AB", // may be none!
+ host-org: "CERN", // may be none!
+) = page(
+ margin: (top: 65mm, bottom: 30mm, left: 74pt, right: 35mm),
+ {
+ text(size: 25pt, strong(title))
+
+ if subtitle != none {
+ v(10pt)
+
+ text(size: 18pt, subtitle)
+ }
+
+ v(10mm)
+
+ for author in authors {
+ text(size: 14pt, upper(author))
+ linebreak()
+ }
+
+ v(1fr)
+
+ [
+ *#degree* \
+ *#t("date"):* #date.display("[month repr:long] [day], [year]")
+ ]
+
+ v(5mm)
+
+ let super-label = if supervisors.len() == 1 {
+ t("supervisor")
+ } else {
+ t("supervisors")
+ }
+
+ [
+ *#super-label:* #join-names(supervisors) \
+ *#t("examiner"):* #examiner-name \
+ #hide[*#t("examiner"):*] #emph(examiner-school) \
+ ]
+
+ if host-company != none {
+ [*#t("host-company"):* #host-company]
+ linebreak()
+ }
+
+ if host-org != none {
+ [*#t("host-org"):* #host-org]
+ linebreak()
+ }
+
+ [
+ *#t("alt-title"):* #text(lang: alt-lang, alt-title) \
+ #if alt-subtitle != none {
+ [*#t("alt-subtitle"):* #text(lang: alt-lang, alt-subtitle)]
+ }
+ ]
+ },
+)
+
+#let copyright-page(
+ year: 2026,
+ authors: ("Astronaut Boulder", "Cat Dog"),
+) = page(
+ margin: (top: 250mm, bottom: 30mm, left: 74pt, right: 35mm),
+ {
+ v(1fr)
+
+ [#sym.copyright #year #sym.space.quad #join-names(authors)]
+ },
+)
+
+#let localized-abstract(
+ lang: "en",
+ abstract-heading: none,
+ keywords-heading: none,
+ keywords: ("Magic", "Wonder"),
+ body,
+) = {
+ if abstract-heading == none {
+ abstract-heading = t("abstract-heading")
+ }
+
+ if keywords-heading == none {
+ keywords-heading = t("keywords-heading")
+ }
+
+ set text(lang: lang)
+
+ // explicit lang is necessary for it to be shown correctly in header,
+ // since it's extracted without the above set rule's effects and so
+ // would otherwise be displayed in the document's primary language
+ heading(outlined: false, depth: 1, text(lang: lang, abstract-heading))
+
+ body
+
+ heading(outlined: false, depth: 2, keywords-heading)
+
+ keywords.join(", ")
+}
+
+#let signed-acknowledgements(
+ city: "Stockholm",
+ date: datetime.today,
+ authors: ("Gary Lose", "Harriet Lung"),
+ body,
+) = {
+ heading(outlined: false, depth: 1, t("ack-heading"))
+
+ body
+
+ v(5pt)
+
+ [#city, #date.display("[month repr:long] [year]")]
+ for author in authors {
+ linebreak()
+ author
+ }
+}
+
+#let indices = {
+ pagebreak(weak: true, to: "odd")
+ {
+ show outline.entry.where(level: 1): it => {
+ v(1em, weak: true)
+ strong(it)
+ }
+
+ outline(title: t("table-of-contents"), indent: auto)
+ }
+
+ let images-target = figure.where(kind: image, outlined: true)
+ context if (query(images-target).len() > 0) {
+ pagebreak(weak: true, to: "odd")
+ outline(title: t("list-of-figures"), target: images-target)
+ }
+
+ let tables-target = figure.where(kind: table, outlined: true)
+ context if (query(tables-target).len() > 0) {
+ pagebreak(weak: true, to: "odd")
+ outline(title: t("list-of-tables"), target: tables-target)
+ }
+
+ let code-target = figure.where(kind: raw, outlined: true)
+ context if (query(code-target).len() > 0) {
+ pagebreak(weak: true, to: "odd")
+ outline(title: t("list-of-listings"), target: code-target)
+ }
+}
+
+#let extra-preamble(title: "Additional Preamble", body) = {
+ pagebreak(weak: true, to: "odd")
+ heading(outlined: false, depth: 1, title)
+
+ body
+}
diff --git a/packages/preview/kthesis/0.1.7/src/lang.toml b/packages/preview/kthesis/0.1.7/src/lang.toml
new file mode 100644
index 0000000000..e928d884c3
--- /dev/null
+++ b/packages/preview/kthesis/0.1.7/src/lang.toml
@@ -0,0 +1,60 @@
+[conf]
+default-lang = "en"
+
+[lang.en]
+degree-project-in = "Degree Project in"
+cycle-1 = "First cycle"
+cycle-2 = "Second cycle"
+credits = "credits"
+stockholm-sweden = "Stockholm, Sweden"
+date = "Date"
+supervisor = "Supervisor"
+supervisors = "Supervisors"
+examiner = "Examiner"
+host-company = "Host company"
+host-org = "Host organization"
+alt-title = "Swedish title"
+alt-subtitle = "Swedish subtitle"
+abstract-heading = "Abstract"
+keywords-heading = "Keywords"
+ack-heading = "Acknowledgments"
+chapter = "Chapter"
+section = "Section"
+appendix = "Appendix"
+table-of-contents = "Contents"
+list-of-figures = "List of Figures"
+list-of-tables = "List of Tables"
+list-of-listings = "Listings"
+figure = "Figure"
+figure-table = "Table"
+figure-code = "Listing"
+separator-last = " and " # Oxford comma would be weird for n=2
+
+[lang.sv]
+degree-project-in = "Examensarbete inom"
+cycle-1 = "Grundnivå"
+cycle-2 = "Avancerad nivå"
+credits = "hp"
+stockholm-sweden = "Stockholm, Sverige"
+date = "Datum"
+supervisor = "Handledare"
+supervisors = "Handledare"
+examiner = "Examinator"
+host-company = "Uppdragsgivare"
+host-org = "Uppdragsgivare"
+alt-title = "Engelsk titel"
+alt-subtitle = "Engelsk undertitel"
+abstract-heading = "Sammanfattning"
+keywords-heading = "Nyckelord"
+ack-heading = "Författarnas tack"
+chapter = "Kapitel"
+section = "Avsnitt"
+appendix = "Bilaga"
+table-of-contents = "Innehåll"
+list-of-figures = "Figurförteckning"
+list-of-tables = "Tabellförteckning"
+list-of-listings = "Kodförteckning"
+figure = "Figur"
+figure-table = "Tabell"
+figure-code = "Kod"
+separator-last = " och "
diff --git a/packages/preview/kthesis/0.1.7/src/lib.typ b/packages/preview/kthesis/0.1.7/src/lib.typ
new file mode 100644
index 0000000000..39d3f68c10
--- /dev/null
+++ b/packages/preview/kthesis/0.1.7/src/lib.typ
@@ -0,0 +1,463 @@
+#import "./covers.typ": *
+#import "./front-matter.typ": *
+#import "./styling-setup.typ": *
+#import "./for-diva.typ": for-diva-json
+#import "./utils.typ": (
+ assert-arg-type, extract-name, get-one-liner, maybe-sans-serif, z,
+ z-arbitrarily-keyed-dict, z-matches-regex,
+)
+
+#let kth-thesis(
+ // Primary document language; either "en" or "sv"
+ primary-lang: "en",
+ // Language-specific title, subtitle, abstract, and keywords.
+ // Grouped by language, with only values for "en" and "sv" being mandatory.
+ // Localized abstract/keywords headings may be omitted only for "en" and "sv".
+ // Field "alpha-3" is the language's ISO 639-3 code, for non-"en"/"sv" langs.
+ // If desired, any "subtitle" field may be set to none (to omit it entirely).
+ localized-info: (
+ en: (
+ title: "How to Abandon Dinosaur-Age TypeSetting Software",
+ subtitle: "A Modern Approach to Problem-Solving",
+ abstract: lorem(300),
+ keywords: ("Dogs", "Chicken nuggets"),
+ ),
+ sv: (
+ title: "Svenska Översättningen av Titeln",
+ subtitle: "Svenska Översättningen av Undertiteln",
+ abstract: lorem(300),
+ keywords: ("Hundar", "Kycklingnuggets"),
+ ),
+ pt: (
+ alpha-3: "por",
+ title: "Tradução em Português do Título",
+ subtitle: "Tradução em Português do Subtítulo",
+ abstract-heading: "Resumo",
+ keywords-heading: "Palavras-chave",
+ abstract: lorem(300),
+ keywords: ("Cães", "Nuggets de frango"),
+ ),
+ ),
+ // Ordered author information; only first and last names fields are mandatory
+ authors: (
+ (
+ first-name: "John",
+ last-names: "Doe",
+ email: "john.doe@example.com",
+ user-id: "jod",
+ school: "School of Electrical Engineering and Computer Science",
+ department: "Department of Typesetting Sanity",
+ ),
+ (
+ first-name: "Jane",
+ last-names: "Doe",
+ ),
+ ),
+ // Ordered supervisor information; "external-org" replaces userid/school/dept
+ supervisors: (
+ (
+ first-name: "Alice",
+ last-names: "Smith",
+ email: "alice@example.com",
+ user-id: "alice",
+ school: "School of Electrical Engineering and Computer Science",
+ department: "Department of Loyal Supervision",
+ ),
+ (
+ first-name: "Bob",
+ last-names: "Jones",
+ email: "bob@example.com",
+ external-org: "Företag AB",
+ ),
+ ),
+ // Thesis examiner; must be internal to the school so all fields are mandatory
+ examiner: (
+ first-name: "Charlie",
+ last-names: "Johnson",
+ email: "charlie@example.com",
+ user-id: "chj",
+ school: "School of Electrical Engineering and Computer Science",
+ department: "Department of Fair Examination",
+ ),
+ // Degree project course within which the thesis is being conducted.
+ // All fields are mandatory; credits are the course's ECTS credits (hp).
+ course: (
+ code: "DA237X",
+ credits: 30,
+ ),
+ // Degree as part of which the thesis is conducted; all fields are mandatory.
+ // Subject area is main field of study as listed in the second dropdown here:
+ // https://www.kth.se/en/student/studier/examen/examensregler-1.5685
+ // Kind is the degree title conferred as listed in the third dropdown above.
+ // Cycle is either 1 (Bachelor's) or 2 (Master's), per Bologna.
+ degree: (
+ code: "TCYSM",
+ name: "Master's Program, Cybersecurity",
+ subject-area: "Computer Science and Engineering",
+ kind: "Master of Science",
+ cycle: 2,
+ ),
+ // National subject category codes; mandatory for DiVA classification.
+ // One or more 3-to-5 digit codes, with preference for 5-digit codes, from:
+ // https://www.scb.se/contentassets/10054f2ef27c437884e8cde0d38b9cc4/standard-for-svensk-indelning--av-forskningsamnen-2011-uppdaterad-aug-2016.pdf
+ national-subject-categories: ("10201", "10206"),
+ // School that the thesis is part of (abbreviation)
+ school: "EECS",
+ // TRITA number assigned to thesis after final examiner approval
+ trita-number: "2026:0000",
+ // Host company collaborating for this thesis; may be none
+ host-company: "Företag AB",
+ // Host organization collaborating for this thesis; may be none
+ host-org: none,
+ // Names of opponents for this thesis; may be none until they're assigned
+ opponents: ("Mary Ignatia", "Alexander Smith"),
+ // Thesis presentation details; may be none until it's scheduled and set.
+ // Either "online" or "location" fields may be none, but not both.
+ presentation: (
+ language: "en",
+ slot: datetime(
+ year: 2026,
+ month: 6,
+ day: 14,
+ hour: 13,
+ minute: 0,
+ second: 0,
+ ),
+ online: (service: "Zoom", link: "https://kth-se.zoom.us/j/111222333"),
+ location: (
+ room: "F1 (Alfvénsalen)",
+ address: "Lindstedtsvägen 22",
+ city: "Stockholm",
+ ),
+ ),
+ // Optional image to show on the front cover.
+ // This should either be none, or an "image" element. For example,
+ // cover-image: image("./assets/cover.png", width: 100%)
+ // If provided, the image can be formatted arbitrarily to look however desired
+ // (especially its height, width, and fit mode). However, the recommended
+ // styles are (width: 100%) or (width: 16cm, height: 10cm, fit: "contain").
+ cover-image: none,
+ // Acknowledgements body
+ acknowledgements: {
+ par(lorem(100))
+ par(lorem(150))
+ },
+ // Additional front-matter sections, each with keys "heading" and "body".
+ // For example, ((heading: "Acronyms and Abbreviations", body: glossary),)
+ extra-preambles: (),
+ // Document date; hardcode for determinism/reproducibility
+ doc-date: datetime.today(),
+ // Document city (where it's being signed/authored/submitted)
+ doc-city: "Stockholm",
+ // Extra keywords, embedded in document metadata but not listed in text
+ doc-extra-keywords: ("master thesis",),
+ // Whether to include trailing "For DiVA" metadata structure section
+ with-for-diva: true,
+ // Miscellaneous settings affecting the document's appearance
+ style: (:),
+ // Document body
+ body,
+) = context {
+ // manual type checking because typst sadly has no strong typing and sometimes
+ // incorrect arguments can lead to very strange errors that are hard to debug
+ // (especially when accidentally using `(x)` instead of `(x,)` to construct an
+ // array, leading to no array being constructed at all)
+ // note that this is not necessarily exhaustive and is intended just as a
+ // convenience, so that obvious problems surface immediately and clearly
+
+ assert-arg-type("primary-lang", primary-lang, z.choice(("en", "sv")))
+ assert-arg-type("localized-info", localized-info, z-arbitrarily-keyed-dict(
+ "localized-info",
+ z.string(assertions: (z.assert.length.equals(2),)),
+ z.dictionary(
+ (
+ alpha-3: z.string(optional: true, assertions: (
+ z.assert.length.equals(3),
+ )),
+ title: z.string(min: 1),
+ subtitle: z.string(optional: true, min: 1),
+ abstract: z.content(),
+ keywords: z.array(z.string(min: 1)),
+ ),
+ ),
+ min: 1,
+ require-keys: ("en", "sv"),
+ ))
+ assert-arg-type("authors", authors, z.array(
+ z.dictionary((
+ first-name: z.string(min: 1),
+ last-names: z.string(min: 1),
+ email: z.email(optional: true),
+ user-id: z.string(optional: true, min: 1),
+ school: z.string(optional: true, min: 1),
+ department: z.string(optional: true, min: 1),
+ )),
+ min: 1,
+ ))
+ let internal-person = z.dictionary((
+ first-name: z.string(min: 1),
+ last-names: z.string(min: 1),
+ email: z.email(),
+ user-id: z.string(min: 1),
+ school: z.string(min: 1),
+ department: z.string(min: 1),
+ ))
+ assert-arg-type("supervisors", supervisors, z.array(
+ z.either(internal-person, z.dictionary((
+ first-name: z.string(min: 1),
+ last-names: z.string(min: 1),
+ email: z.email(),
+ external-org: z.string(min: 1),
+ ))),
+ min: 1,
+ ))
+ assert-arg-type("examiner", examiner, internal-person)
+ assert-arg-type("course", course, z.dictionary((
+ code: z.string(min: 1),
+ credits: z.number(min: 1),
+ )))
+ assert-arg-type("degree", degree, z.dictionary((
+ code: z.string(min: 1),
+ name: z.string(min: 1),
+ subject-area: z.string(min: 1),
+ kind: z.string(min: 1),
+ cycle: z.number(min: 1, max: 2), // better error messages than z.choice
+ )))
+ assert-arg-type(
+ "national-subject-categories",
+ national-subject-categories,
+ z.array(
+ z.string(min: 3, max: 5, assertions: z-matches-regex(
+ "^\d+$",
+ "All characters must be digits",
+ )),
+ min: 1,
+ ),
+ )
+ assert-arg-type("school", school, z.choice((
+ "ABE",
+ "EECS",
+ "ITM",
+ "CBH",
+ "SCI",
+ )))
+ assert-arg-type("trita-number", trita-number, z.string(
+ assertions: z-matches-regex("\d{4}:\d+", "Must follow format `2026:0000`"),
+ ))
+ assert-arg-type("host-company", host-company, z.string(
+ optional: true,
+ min: 1,
+ ))
+ assert-arg-type("host-org", host-org, z.string(optional: true, min: 1))
+ assert-arg-type("opponents", opponents, z.array(
+ z.string(min: 1),
+ optional: true,
+ min: 1,
+ ))
+ assert-arg-type("presentation", presentation, z.dictionary(
+ (
+ language: z.choice(("en", "sv")),
+ slot: z.date(),
+ online: z.dictionary(
+ (service: z.string(min: 1), link: z.string(min: 1)),
+ optional: true,
+ ),
+ location: z.dictionary(
+ (
+ room: z.string(min: 1),
+ address: z.string(min: 1),
+ city: z.string(min: 1),
+ ),
+ optional: true,
+ ),
+ ),
+ optional: true,
+ assertions: (
+ (
+ condition: (_, it) => (
+ it.at("online", default: none) != none
+ or it.at("location", default: none) != none
+ ),
+ message: (_, it) => "Either \"online\" or \"location\" must be set",
+ ),
+ ),
+ ))
+ assert-arg-type("cover-image", cover-image, z.content(optional: true))
+ assert-arg-type(
+ "acknowledgements",
+ acknowledgements,
+ z.content(optional: true),
+ )
+ assert-arg-type("extra-preambles", extra-preambles, z.array(z.dictionary((
+ heading: z.string(min: 1),
+ body: z.content(),
+ ))))
+ assert-arg-type("doc-date", doc-date, z.date())
+ assert-arg-type("doc-city", doc-city, z.string(min: 1))
+ assert-arg-type("doc-extra-keywords", doc-extra-keywords, z.array(
+ z.string(min: 1),
+ ))
+ assert-arg-type("with-for-diva", with-for-diva, z.boolean())
+ assert-arg-type("style", style, z.dictionary(
+ (
+ use-arial: z.boolean(optional: true),
+ more-sans-serif: z.boolean(optional: true),
+ fancy-chapters: z.boolean(optional: true),
+ ),
+ optional: true,
+ ))
+
+ // ---------- END OF MANUAL TYPE CHECKING ----------
+
+ let style = (
+ (
+ more-sans-serif: false,
+ use-arial: false,
+ fancy-chapters: false,
+ )
+ + style // provided values have higher precedence over default values
+ )
+
+ let alt-lang = if primary-lang == "en" {
+ "sv"
+ } else if primary-lang == "sv" {
+ "en"
+ } else {
+ panic("Invalid primary language " + primary-lang)
+ }
+
+ let primary-info = localized-info.at(primary-lang)
+ let alt-info = localized-info.at(alt-lang)
+
+ let author-names = authors.map(extract-name)
+
+ set document(
+ title: get-one-liner(primary-lang, primary-info),
+ description: get-one-liner(alt-lang, alt-info), // Subject field
+ date: doc-date,
+ keywords: primary-info.at("keywords") + doc-extra-keywords,
+ author: author-names,
+ )
+ set page("a4")
+ set text(lang: primary-lang, size: 12pt)
+
+ front-cover(
+ title: primary-info.at("title"),
+ subtitle: primary-info.at("subtitle", default: none),
+ authors: author-names,
+ subject-area: degree.at("subject-area"),
+ cycle: degree.at("cycle"),
+ credits: course.at("credits"),
+ cover-image: cover-image,
+ style,
+ )
+
+ page[] // blank
+
+ set text(font: maybe-sans-serif(style))
+
+ title-page(
+ title: primary-info.at("title"),
+ subtitle: primary-info.at("subtitle", default: none),
+ alt-title: alt-info.at("title"),
+ alt-subtitle: alt-info.at("subtitle", default: none),
+ alt-lang: alt-lang,
+ degree: degree.at("name"),
+ date: doc-date,
+ authors: author-names,
+ supervisors: supervisors.map(extract-name),
+ examiner-name: extract-name(examiner),
+ examiner-school: examiner.at("school"),
+ host-company: host-company,
+ host-org: host-org,
+ )
+
+ copyright-page(year: doc-date.year(), authors: author-names)
+
+ global-setup(style, {
+ set page(numbering: "i")
+ counter(page).update(1)
+
+ for (lang, info) in localized-info {
+ page(
+ localized-abstract(
+ lang: lang,
+ abstract-heading: info.at("abstract-heading", default: none),
+ keywords-heading: info.at("keywords-heading", default: none),
+ keywords: info.at("keywords"),
+ info.at("abstract"),
+ ),
+ )
+ page(header: none, footer: none, []) // blank
+ }
+
+ page(
+ signed-acknowledgements(
+ city: doc-city,
+ date: doc-date,
+ authors: author-names,
+ acknowledgements,
+ ),
+ )
+
+ page(indices)
+
+ for extra in extra-preambles {
+ extra-preamble(title: extra.at("heading"), extra.at("body"))
+ }
+
+ [#metadata(()) ]
+ pagebreak(to: "odd")
+
+ // text.font reflects original font because of the `context` surrounding
+ // this entire function (prior to when the font was changed)
+ set text(font: text.font)
+
+ set page(numbering: "1")
+ counter(page).update(1)
+
+ styled-body(style, body)
+ })
+
+ let trita-series = school + "-EX"
+
+ [#metadata(()) ]
+ pagebreak(to: "odd")
+
+ page[] // empty
+ back-cover(
+ trita-series: trita-series,
+ trita-number: trita-number,
+ year: doc-date.year(),
+ style,
+ )
+
+ context if with-for-diva {
+ let page-series-counts = (
+ numbering("i", ..counter(page).at()),
+ numbering("1", ..counter(page).at()),
+ )
+
+ page(
+ for-diva-json(
+ primary-lang: primary-lang,
+ alt-lang: alt-lang,
+ localized-info: localized-info,
+ authors: authors,
+ supervisors: supervisors,
+ examiner: examiner,
+ course: course,
+ degree: degree,
+ national-subject-categories: national-subject-categories,
+ trita-series: trita-series,
+ trita-number: trita-number,
+ host-company: host-company,
+ host-org: host-org,
+ opponents: opponents,
+ presentation: presentation,
+ doc-date: doc-date,
+ page-series-counts: page-series-counts,
+ ),
+ )
+ }
+}
diff --git a/packages/preview/kthesis/0.1.7/src/styling-setup.typ b/packages/preview/kthesis/0.1.7/src/styling-setup.typ
new file mode 100644
index 0000000000..58bcc8ff84
--- /dev/null
+++ b/packages/preview/kthesis/0.1.7/src/styling-setup.typ
@@ -0,0 +1,117 @@
+#import "./utils.typ": kth-blue, maybe-sans-serif, t
+
+#import "@preview/headcount:0.1.1": dependent-numbering
+#import "@preview/hydra:0.6.3": hydra
+
+#let header(style) = context {
+ set text(font: maybe-sans-serif(style))
+
+ let chapter = hydra(1, skip-starting: false, display: (ctx, h) => h.body)
+
+ let number = counter(page).display(here().page-numbering())
+
+ if calc.odd(here().page()) {
+ align(right, [#chapter | #number])
+ } else {
+ align(left, [#number | #chapter])
+ }
+}
+
+#let global-setup(style, body) = context {
+ set page(
+ // I don't like these numbers, especially the bottom margin...
+ margin: (top: 37mm, bottom: 50mm, inside: 45mm, outside: 35mm),
+ header-ascent: 15mm + 6mm,
+ footer-descent: 25mm,
+ header: header(style),
+ footer: none,
+ )
+
+ set par(justify: true)
+
+ show heading: set text(font: maybe-sans-serif(style))
+
+ // front matter only; essentially styles [h1 as h2] and [h2 as h3]
+ show heading.where(level: 1): set text(size: 18pt)
+ show heading.where(level: 2): set text(size: 14pt)
+
+ show figure: set figure(supplement: t("figure"))
+ show figure.where(kind: table): set figure(supplement: t("figure-table"))
+ show figure.where(kind: raw): set figure(supplement: t("figure-code"))
+
+ set figure(numbering: dependent-numbering("1.1"))
+
+ body
+}
+
+#let styled-body(style, body) = {
+ set heading(numbering: "1.1.", supplement: t("section"))
+
+ show heading: set text(size: 12pt) // for level > 3
+ show heading.where(level: 1): set text(size: 25pt)
+ show heading.where(level: 2): set text(size: 18pt)
+ show heading.where(level: 3): set text(size: 14pt)
+
+ // cannot merge these rules or the first one won't work
+ show heading.where(level: 1): set heading(supplement: t("chapter"))
+ show heading.where(level: 1): it => {
+ pagebreak(weak: true, to: "odd")
+
+ counter(figure.where(kind: image)).update(0)
+ counter(figure.where(kind: table)).update(0)
+ counter(figure.where(kind: raw)).update(0)
+
+ if it.numbering == none {
+ it.body
+ } else {
+ let numbering = it.numbering.slice(0, -1) // remove trailing .
+ let number = counter(heading).display(numbering)
+
+ if style.fancy-chapters {
+ [
+ #set align(end)
+
+ #text(fill: rgb("#444"), [
+ #upper(it.supplement) #box(rect(
+ fill: rgb("#444"),
+ outset: 2pt,
+ text(
+ size: 60pt,
+ fill: white,
+ align(center, number),
+ ),
+ ))
+ ]) \
+ #text(size: 36pt, strong(it.body))
+ ]
+ } else {
+ [
+ #it.supplement #number \
+ #it.body
+ ]
+ }
+
+ v(1em)
+ }
+ }
+
+ show link: it => if type(it.dest) == str {
+ // only affect external links, not e.g. glossary refs
+ underline(
+ stroke: 1pt + kth-blue,
+ text(fill: kth-blue, it),
+ )
+ } else {
+ it
+ }
+
+ body
+}
+
+#let setup-appendices(body) = {
+ set heading(numbering: "A.1.")
+ counter(heading).update(0)
+ show heading.where(level: 1): set heading(supplement: t("appendix"))
+
+ body
+}
diff --git a/packages/preview/kthesis/0.1.7/src/utils.typ b/packages/preview/kthesis/0.1.7/src/utils.typ
new file mode 100644
index 0000000000..701e04a48f
--- /dev/null
+++ b/packages/preview/kthesis/0.1.7/src/utils.typ
@@ -0,0 +1,212 @@
+#import "@preview/linguify:0.5.0": linguify
+#import "@preview/valkyrie:0.2.2" as z
+
+#let kth-blue = rgb("#004791")
+#let kth-navy = rgb("#000061")
+
+#let lang-db = toml("./lang.toml")
+
+#let t = key => linguify(key, from: lang-db)
+
+#let assert-arg-type(name, value, schema) = {
+ let _ = z.parse(value, schema, scope: ("kthesis argument " + name,))
+}
+
+#let z-arbitrarily-keyed-dict(
+ name,
+ k-schema,
+ v-schema,
+ require-keys: (),
+ assertions: (),
+ ..args,
+) = {
+ // see: https://github.com/typst-community/valkyrie/issues/53#issuecomment-3297983717
+ // this feature is missing from valkyrie so we have to implement it manually
+ // using transformations to validate as an array of pairs
+
+ for req in require-keys {
+ assertions.push((
+ condition: (_, it) => it.find(((k, _)) => k == req) != none,
+ message: (_, it) => "Must contain key `" + req + "`",
+ ))
+ }
+
+ return z.array(
+ z.tuple(k-schema, v-schema),
+ pre-transform: (_, it) => {
+ assert.eq(
+ type(it),
+ dictionary,
+ message: "kthesis argument `" + name + "` must be a dictionary",
+ )
+
+ it.pairs()
+ },
+ post-transform: (_, it) => it.fold((:), (acc, (k, v)) => acc + ((k): v)),
+ assertions: assertions,
+ ..args,
+ )
+}
+
+#let z-matches-regex(pattern, message) = {
+ return (
+ (
+ condition: (_, it) => it.match(regex(pattern)) != none,
+ message: (_, it) => message,
+ ),
+ )
+}
+
+#let sans-serif(style) = {
+ let fonts = ("Liberation Sans",)
+
+ if style.use-arial {
+ fonts.insert(0, "Arial")
+ }
+
+ return fonts
+}
+
+// needs to be invoked from within a `context` block (to access `text.font`)
+#let maybe-sans-serif(style) = {
+ if style.more-sans-serif {
+ sans-serif(style)
+ } else {
+ text.font
+ }
+}
+
+#let get-one-liner(lang, info) = {
+ let title = info.at("title")
+ let subtitle = info.at("subtitle", default: none)
+
+ if subtitle == none {
+ return title
+ }
+
+ // I don't really understand why this is the intended behavior either...
+ if lang == "sv" {
+ title + " - " + subtitle
+ } else {
+ title + ": " + subtitle
+ }
+}
+
+#let extract-name(person) = {
+ return person.at("first-name") + " " + person.at("last-names")
+}
+
+#let join-names(names) = {
+ return names.join(", ", last: t("separator-last"))
+}
+
+#let omit-dict-none(d) = {
+ return d.pairs().filter(((_, v)) => v != none).to-dict()
+}
+
+// This function most definitely should not exist, but alas...
+#let content-to-string(it, mode: "plain") = {
+ assert(
+ mode == "plain" or mode == "html",
+ message: "mode must be 'plain' or 'html'",
+ )
+ let content-to-string = content-to-string.with(mode: mode)
+
+ let escape-body = body => {
+ if mode == "html" {
+ body.replace("<", "<").replace(">", ">")
+ } else {
+ body
+ }
+ }
+
+ let tag-or-plain = (tag, body, attrs: none) => {
+ if mode == "html" {
+ let attrs = if attrs != none {
+ " " + attrs
+ } else {
+ ""
+ }
+ "<" + tag + attrs + ">" + body + "" + tag + ">"
+ } else {
+ body
+ }
+ }
+
+ if type(it) == str {
+ escape-body(it)
+ } else if type(it) == content {
+ if it.func() == raw {
+ if it.block {
+ tag-or-plain("pre", it.text)
+ } else {
+ tag-or-plain("code", it.text)
+ }
+ } else if it == [ ] {
+ " "
+ } else if it.func() == linebreak {
+ if mode == "html" {
+ "
"
+ } else {
+ "\n"
+ }
+ } else if it.func() == parbreak {
+ if mode == "html" {
+ "
"
+ } else {
+ "\n\n"
+ }
+ } else if it.func() == smartquote {
+ if it.double {
+ "\""
+ } else {
+ "'"
+ }
+ } else if it.func() == strong {
+ tag-or-plain("strong", content-to-string(it.body))
+ } else if it.func() == emph {
+ tag-or-plain("i", content-to-string(it.body))
+ } else if it.func() == super {
+ tag-or-plain("sup", content-to-string(it.body))
+ } else if it.func() == sub {
+ tag-or-plain("sub", content-to-string(it.body))
+ } else if it.func() == link and type(it.dest) == str {
+ if mode == "html" {
+ tag-or-plain(
+ "a",
+ content-to-string(it.body),
+ attrs: "href='" + it.dest + "'",
+ )
+ } else {
+ it.body
+ }
+ } else if it.func() == heading {
+ tag-or-plain("h" + str(it.depth), content-to-string(it.body))
+ } else if it.has("child") {
+ content-to-string(it.child)
+ } else if it.has("children") {
+ it.children.map(content-to-string).join()
+ } else if it.has("body") {
+ content-to-string(it.body)
+ } else if it.has("text") {
+ if type(it.text) == str {
+ escape-body(it.text)
+ } else {
+ content-to-string(it.text)
+ }
+ } else {
+ panic("Cannot serialize content: " + json.encode(it))
+ }
+ } else {
+ panic("Cannot serialize object: " + json.encode(it))
+ }
+}
+
+#let content-to-html(content) = {
+ // trim empty paragraphs
+ let html = content-to-string(content, mode: "html")
+ .replace(regex("^(
)+"), "")
+ .replace(regex("(
)+$"), "")
+
+ "
" + html.trim() + "
"
+}
diff --git a/packages/preview/kthesis/0.1.7/template/acronyms.typ b/packages/preview/kthesis/0.1.7/template/acronyms.typ
new file mode 100644
index 0000000000..33a69aa45f
--- /dev/null
+++ b/packages/preview/kthesis/0.1.7/template/acronyms.typ
@@ -0,0 +1,15 @@
+#let acronyms = (
+ (
+ key: "kth",
+ short: "KTH",
+ long: "KTH Royal Institute of Technology",
+ description: "A university in Stockholm",
+ ),
+ (
+ key: "os",
+ short: "OS",
+ plural: "OSes",
+ long: "Operating System",
+ longplural: "Operating Systems",
+ ),
+)
diff --git a/packages/preview/kthesis/0.1.7/template/content/abstract-1-en.typ b/packages/preview/kthesis/0.1.7/template/content/abstract-1-en.typ
new file mode 100644
index 0000000000..d83d8aaab9
--- /dev/null
+++ b/packages/preview/kthesis/0.1.7/template/content/abstract-1-en.typ
@@ -0,0 +1 @@
+#lorem(300)
diff --git a/packages/preview/kthesis/0.1.7/template/content/abstract-2-sv.typ b/packages/preview/kthesis/0.1.7/template/content/abstract-2-sv.typ
new file mode 100644
index 0000000000..d83d8aaab9
--- /dev/null
+++ b/packages/preview/kthesis/0.1.7/template/content/abstract-2-sv.typ
@@ -0,0 +1 @@
+#lorem(300)
diff --git a/packages/preview/kthesis/0.1.7/template/content/abstract-3-pt.typ b/packages/preview/kthesis/0.1.7/template/content/abstract-3-pt.typ
new file mode 100644
index 0000000000..d83d8aaab9
--- /dev/null
+++ b/packages/preview/kthesis/0.1.7/template/content/abstract-3-pt.typ
@@ -0,0 +1 @@
+#lorem(300)
diff --git a/packages/preview/kthesis/0.1.7/template/content/acknowledgements.typ b/packages/preview/kthesis/0.1.7/template/content/acknowledgements.typ
new file mode 100644
index 0000000000..f31891a38e
--- /dev/null
+++ b/packages/preview/kthesis/0.1.7/template/content/acknowledgements.typ
@@ -0,0 +1,5 @@
+#lorem(100)
+
+#lorem(150)
+
+#lorem(35)
diff --git a/packages/preview/kthesis/0.1.7/template/content/ch01-introduction.typ b/packages/preview/kthesis/0.1.7/template/content/ch01-introduction.typ
new file mode 100644
index 0000000000..fda3c2031d
--- /dev/null
+++ b/packages/preview/kthesis/0.1.7/template/content/ch01-introduction.typ
@@ -0,0 +1,21 @@
+= Introduction
+
+See @bg:a1 for more information.
+
+#lorem(50)
+
+== Problem
+
+#lorem(100)
+
+== Purpose
+
+#lorem(50)
+
+== Goals
+
+#lorem(100)
+
+== Structure of the Thesis
+
+#lorem(50)
diff --git a/packages/preview/kthesis/0.1.7/template/content/ch02-background.typ b/packages/preview/kthesis/0.1.7/template/content/ch02-background.typ
new file mode 100644
index 0000000000..b9a4cf9b6a
--- /dev/null
+++ b/packages/preview/kthesis/0.1.7/template/content/ch02-background.typ
@@ -0,0 +1,25 @@
+= Background
+
+#lorem(50)
+
+== Major Background Area 1
+
+=== Subarea 1.1
+
+As mentioned in @intro, ...
+
+=== Subarea 1.2
+
+This is explained in @usage.
+
+== Major Background Area 2
+
+#lorem(20)
+
+== Related Work Area
+
+#lorem(50)
+
+== Summary
+
+#lorem(20)
diff --git a/packages/preview/kthesis/0.1.7/template/content/ch03-method.typ b/packages/preview/kthesis/0.1.7/template/content/ch03-method.typ
new file mode 100644
index 0000000000..13d7df05b8
--- /dev/null
+++ b/packages/preview/kthesis/0.1.7/template/content/ch03-method.typ
@@ -0,0 +1,27 @@
+= Method or Methods
+
+#lorem(50)
+
+== Research Process
+
+#lorem(30)
+
+== Data Collection
+
+#lorem(10)
+
+=== Sampling
+
+#lorem(20)
+
+=== Sample Size
+
+#lorem(25)
+
+=== Target Population
+
+#lorem(30)
+
+== Evaluation Framework
+
+#lorem(20)
diff --git a/packages/preview/kthesis/0.1.7/template/content/ch04-the-thing.typ b/packages/preview/kthesis/0.1.7/template/content/ch04-the-thing.typ
new file mode 100644
index 0000000000..5bf0ba9337
--- /dev/null
+++ b/packages/preview/kthesis/0.1.7/template/content/ch04-the-thing.typ
@@ -0,0 +1,15 @@
+= The Thing
+
+== Software Design
+
+#lorem(50)
+
+== Implementation
+
+#lorem(1250)
+
+=== An Example Listing
+
+#figure(caption: [An innocuous command], raw("rm -rf /"))
+
+#lorem(30)
diff --git a/packages/preview/kthesis/0.1.7/template/content/ch05-results.typ b/packages/preview/kthesis/0.1.7/template/content/ch05-results.typ
new file mode 100644
index 0000000000..83b5eb009b
--- /dev/null
+++ b/packages/preview/kthesis/0.1.7/template/content/ch05-results.typ
@@ -0,0 +1,5 @@
+= Results and Analysis
+
+As supported by @bevet, ...
+
+#lorem(100)
diff --git a/packages/preview/kthesis/0.1.7/template/content/ch06-discussion.typ b/packages/preview/kthesis/0.1.7/template/content/ch06-discussion.typ
new file mode 100644
index 0000000000..e7731e7ad8
--- /dev/null
+++ b/packages/preview/kthesis/0.1.7/template/content/ch06-discussion.typ
@@ -0,0 +1,9 @@
+= Discussion
+
+Let's talk about acronyms: when referring to a single @os, the first time we mention it the @os gets expanded, but not any further.
+
+We can also discuss multiple @os:pl at once, in plural.
+
+#line(length: 50%)
+
+#lorem(200)
diff --git a/packages/preview/kthesis/0.1.7/template/content/ch07-conclusion.typ b/packages/preview/kthesis/0.1.7/template/content/ch07-conclusion.typ
new file mode 100644
index 0000000000..35515cdcc8
--- /dev/null
+++ b/packages/preview/kthesis/0.1.7/template/content/ch07-conclusion.typ
@@ -0,0 +1,5 @@
+= Conclusions and Future Work
+
+In conclusion, execute @thing:impl:cmd.
+
+This is another reference to @os:pl.
diff --git a/packages/preview/kthesis/0.1.7/template/content/zz-a-usage.typ b/packages/preview/kthesis/0.1.7/template/content/zz-a-usage.typ
new file mode 100644
index 0000000000..53f9a92f89
--- /dev/null
+++ b/packages/preview/kthesis/0.1.7/template/content/zz-a-usage.typ
@@ -0,0 +1,5 @@
+= Usage Instructions
+
+Hmm...
+
+#lorem(1000)
diff --git a/packages/preview/kthesis/0.1.7/template/content/zz-b-else.typ b/packages/preview/kthesis/0.1.7/template/content/zz-b-else.typ
new file mode 100644
index 0000000000..f26d61f45f
--- /dev/null
+++ b/packages/preview/kthesis/0.1.7/template/content/zz-b-else.typ
@@ -0,0 +1,3 @@
+= Something Else
+
+Whoa!
diff --git a/packages/preview/kthesis/0.1.7/template/references.yaml b/packages/preview/kthesis/0.1.7/template/references.yaml
new file mode 100644
index 0000000000..c094f8bc16
--- /dev/null
+++ b/packages/preview/kthesis/0.1.7/template/references.yaml
@@ -0,0 +1,18 @@
+# Hayagriva: https://github.com/typst/hayagriva/blob/main/docs/file-format.md
+
+bevet:
+ type: article
+ title: 'You can''t "nudge" nuggets: An investigation of college late-night dining with behavioral economics interventions'
+ author:
+ - Samuel Bevet
+ - Meredith T. Niles
+ - Lizzy Pope
+ date: 2018-05-31
+ serial-number:
+ doi: "10.1371/journal.pone.0198162"
+ parent:
+ type: periodical
+ title: "PLoS ONE"
+ volume: 13
+ issue: 5
+ publisher: Public Library of Science
diff --git a/packages/preview/kthesis/0.1.7/template/thesis.typ b/packages/preview/kthesis/0.1.7/template/thesis.typ
new file mode 100644
index 0000000000..cd790e1726
--- /dev/null
+++ b/packages/preview/kthesis/0.1.7/template/thesis.typ
@@ -0,0 +1,195 @@
+#import "@preview/kthesis:0.1.7": kth-thesis, setup-appendices
+
+// The template is extensible and plays well with other dependencies;
+// For example, a table of acronyms can be generated using glossarium
+#import "@preview/glossarium:0.5.10": (
+ make-glossary, print-glossary, register-glossary,
+)
+#import "./acronyms.typ": acronyms
+#show: make-glossary
+#register-glossary(acronyms)
+
+// Configure formatting options before invoking the template;
+// For example, uncomment below to set another font (except for covers)
+// #set text(font: "New Computer Modern")
+
+// --------------------------------------------------------------------- //
+// ---------- MAIN THESIS TEMPLATE ENTRYPOINT & CONFIGURATION ---------- //
+// --------------------------------------------------------------------- //
+#show: kth-thesis.with(
+ // Primary document language; either "en" or "sv"
+ primary-lang: "en",
+ // Language-specific title, subtitle, abstract, and keywords.
+ // Grouped by language, with only values for "en" and "sv" being mandatory.
+ // Localized abstract/keywords headings may be omitted only for "en" and "sv".
+ // Field "alpha-3" is the language's ISO 639-3 code, for non-"en"/"sv" langs.
+ // If desired, any "subtitle" field may be set to none (to omit it entirely).
+ localized-info: (
+ en: (
+ title: "How to Abandon Dinosaur-Age TypeSetting Software",
+ subtitle: "A Modern Approach to Problem-Solving",
+ abstract: include "./content/abstract-1-en.typ",
+ keywords: ("Dogs", "Chicken nuggets"),
+ ),
+ sv: (
+ title: "Svenska Översättningen av Titeln",
+ subtitle: "Svenska Översättningen av Undertiteln",
+ abstract: include "./content/abstract-2-sv.typ",
+ keywords: ("Hundar", "Kycklingnuggets"),
+ ),
+ pt: (
+ alpha-3: "por",
+ title: "Tradução em Português do Título",
+ subtitle: "Tradução em Português do Subtítulo",
+ abstract-heading: "Resumo",
+ keywords-heading: "Palavras-chave",
+ abstract: include "./content/abstract-3-pt.typ",
+ keywords: ("Cães", "Nuggets de frango"),
+ ),
+ ),
+ // Ordered author information; only first and last names fields are mandatory
+ authors: (
+ (
+ first-name: "John",
+ last-names: "Doe",
+ email: "john.doe@example.com",
+ user-id: "jod",
+ school: "School of Electrical Engineering and Computer Science",
+ department: "Department of Typesetting Sanity",
+ ),
+ (
+ first-name: "Jane",
+ last-names: "Doe",
+ ),
+ ),
+ // Ordered supervisor information; "external-org" replaces userid/school/dept
+ supervisors: (
+ (
+ first-name: "Alice",
+ last-names: "Smith",
+ email: "alice@example.com",
+ user-id: "alice",
+ school: "School of Electrical Engineering and Computer Science",
+ department: "Department of Loyal Supervision",
+ ),
+ (
+ first-name: "Bob",
+ last-names: "Jones",
+ email: "bob@example.com",
+ external-org: "Företag AB",
+ ),
+ ),
+ // Thesis examiner; must be internal to the school so all fields are mandatory
+ examiner: (
+ first-name: "Charlie",
+ last-names: "Johnson",
+ email: "charlie@example.com",
+ user-id: "chj",
+ school: "School of Electrical Engineering and Computer Science",
+ department: "Department of Fair Examination",
+ ),
+ // Degree project course within which the thesis is being conducted.
+ // All fields are mandatory; credits are the course's ECTS credits (hp).
+ course: (
+ code: "DA237X",
+ credits: 30,
+ ),
+ // Degree as part of which the thesis is conducted; all fields are mandatory.
+ // Subject area is main field of study as listed in the second dropdown here:
+ // https://www.kth.se/en/student/studier/examen/examensregler-1.5685
+ // Kind is the degree title conferred as listed in the third dropdown above.
+ // Cycle is either 1 (Bachelor's) or 2 (Master's), per Bologna.
+ degree: (
+ code: "TCYSM",
+ name: "Master's Program, Cybersecurity",
+ subject-area: "Computer Science and Engineering",
+ kind: "Master of Science",
+ cycle: 2,
+ ),
+ // National subject category codes; mandatory for DiVA classification.
+ // One or more 3-to-5 digit codes, with preference for 5-digit codes, from:
+ // https://www.scb.se/dokumentation/klassifikationer-och-standarder/standard-for-svensk-indelning-av-forskningsamnen/
+ // ^ (select from that page the most recent PDF)
+ national-subject-categories: ("10201", "10206"),
+ // School that the thesis is part of (abbreviation)
+ school: "EECS",
+ // TRITA number assigned to thesis after final examiner approval
+ trita-number: "2026:0000",
+ // Host company collaborating for this thesis; may be none
+ host-company: "Företag AB",
+ // Host organization collaborating for this thesis; may be none
+ host-org: none,
+ // Names of opponents for this thesis; may be none until they're assigned
+ opponents: ("Mary Ignatia", "Alexander Smith"),
+ // Thesis presentation details; may be none until it's scheduled and set.
+ // Either "online" or "location" fields may be none, but not both.
+ presentation: (
+ language: "en",
+ slot: datetime(
+ year: 2026,
+ month: 6,
+ day: 14,
+ hour: 13,
+ minute: 0,
+ second: 0,
+ ),
+ online: (service: "Zoom", link: "https://kth-se.zoom.us/j/111222333"),
+ location: (
+ room: "F1 (Alfvénsalen)",
+ address: "Lindstedtsvägen 22",
+ city: "Stockholm",
+ ),
+ ),
+ // Optional image to show on the front cover.
+ // This should either be none, or an "image" element. For example,
+ // cover-image: image("./assets/cover.png", width: 100%)
+ // If provided, the image can be formatted arbitrarily to look however desired
+ // (especially its height, width, and fit mode). However, the recommended
+ // styles are (width: 100%) or (width: 16cm, height: 10cm, fit: "contain").
+ cover-image: none,
+ // Acknowledgements body
+ acknowledgements: include "content/acknowledgements.typ",
+ // Additional front-matter sections, each with keys "heading" and "body"
+ extra-preambles: (
+ (heading: "Acronyms and Abbreviations", body: print-glossary(acronyms)),
+ ),
+ // Document date; hardcode for determinism/reproducibility
+ doc-date: datetime.today(),
+ // Document city (where it's being signed/authored/submitted)
+ doc-city: "Stockholm",
+ // Extra keywords, embedded in document metadata but not listed in text
+ doc-extra-keywords: ("master thesis",),
+ // Whether to include trailing "For DiVA" metadata structure section
+ with-for-diva: true,
+ // Miscellaneous settings affecting the document's appearance
+ style: (
+ // Whether the proprietary Arial font should be used in Sans-Serif contexts.
+ // While this is the font prescribed by the official KTH covers, it is often
+ // preferable to use an open, metric-compatible alternative. If this is set
+ // to `false`, Liberation Sans will be used instead of Arial. Otherwise, if
+ // this is set to `true`, Typst will issue a warning if Arial is not found
+ // on the system at compile-time.
+ // Graceful font fallback is not possible until issue typst#6010 is fixed.
+ use-arial: false,
+ // Whether front matter, headings, and headings should use a Sans-Serif font
+ more-sans-serif: false,
+ // Whether to make top-level headings stand out more and look less plain
+ fancy-chapters: false,
+ ),
+)
+
+// Tip: when tagging elements, scope labels like
+
+#include "./content/ch01-introduction.typ"
+#include "./content/ch02-background.typ"
+#include "./content/ch03-method.typ"
+#include "./content/ch04-the-thing.typ"
+#include "./content/ch05-results.typ"
+#include "./content/ch06-discussion.typ"
+#include "./content/ch07-conclusion.typ"
+
+#bibliography("references.yaml", title: "References")
+
+#show: setup-appendices
+#include "./content/zz-a-usage.typ"
+#include "./content/zz-b-else.typ"
diff --git a/packages/preview/kthesis/0.1.7/thumbnail.png b/packages/preview/kthesis/0.1.7/thumbnail.png
new file mode 100644
index 0000000000000000000000000000000000000000..fa50361f1adc883c95d624f0761a96bf669b2722
GIT binary patch
literal 259431
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 0ZUNaI)#PzVwjwJwmAg@POlqY=J3@rCE=
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 |