Universe

Create project in app

The official Typst template[1] for doctoral theses published through KIT Scientific Publishing (KSP).

Getting Started

Start a new project from the template with:

typst init @preview/kinetic-kit:0.1.0

Or pick kinetic-kit from the template gallery in the Typst web app. Either way you get a ready-to-fill main.typ.

To add the template to an existing document instead, import it and apply it with a show rule:

#import "@preview/kinetic-kit:0.1.0": dissertation

#show: dissertation.with(
  author-firstname: "Max",
  author-surname:   "Mustermann",
  title:            [Title of the Dissertation],
  lang:             "de",
  abstract-de:      include "content/abstract-de.typ",
  abstract-en:      include "content/abstract-en.typ",
  bibliography:     bibliography("bib/references.bib", title: none, style: "ieee"),
)

#include "content/01-introduction.typ"

See the examples/ directory for more complete examples; the latest release has them attached as rendered PDFs.

Fonts

The template is set in the Libertinus font family.

  • Typst web app: Libertinus is pre-installed, so no additional steps are required.
  • Local compilation: The Libertinus font family must be installed on your system for the compiler to find it. You can get it from the Libertinus releases. The bundled copy is version 7.051.
Local install

To use a local checkout of the template’s repository as a package (e.g. while contributing or to get the bleeding-edge version), follow these steps to install it into your local Typst package directory.

mise-en-place is an optional but recommended prerequisite here. It can be used to install both the template and Typst itself. However, assuming Typst is installed, each task is a plain shell script, so you can also run the bash mise/tasks/… form directly.

Inside your clone of the repository, run either of the following:

# copy — changes require re-installation (recommended for stability)
mise run install # or bash mise/tasks/install/_default

# symlink — changes apply immediately (recommended during development)
mise run install:editable # or bash mise/tasks/install/editable

When installed this way, imports use @local/kinetic-kit:0.1.0 in place of @preview/kinetic-kit:0.1.0.

The repository also bundles the Libertinus fonts. Install them into your user font directory with

mise run install:fonts # or bash mise/tasks/install/fonts

API Reference

Refer to docs/api-reference.pdf, for the API documentation auto-generated from the source code.

Doctoral Thesis: dissertation(...)
Parameter Type Default Description
author-title str | none "M.Sc." Academic title preceding the name; none to omit
author-firstname str "Max"
author-surname str "Mustermann"
author-male bool true Controls gendered German text on the title page
title content Dissertation title
doc-degree str "Doktors der Ingenieurwissenschaften (Dr.-Ing.)" Degree in masculine form
doc-degree-f str "Doktorin der Ingenieurwissenschaften (Dr.-Ing.)" Degree in feminine form
department str "KIT-Fakultät für Maschinenbau"
university-genitive str "des Karlsruher Instituts für Technologie (KIT)" University name in genitive case
lang "de" | "en" "de" Document language
format "a5" | "17x24" | "a4" "a5" Paper format — "a5" (148×210 mm, default), "17x24" (170×240 mm), or "a4" (210×297 mm)
margin-preset "short" | "medium" | "long" "short" KSP margin profile keyed on final page count — short < 200 pp, medium 200–399, long ≥ 400
status-approved bool false false = eingereicht, true = angenommen
exam-date str | none none Date of oral examination; required when status-approved: true
main-advisor str | none none Hauptreferent
main-advisor-male bool true
co-advisor str | none none Korreferent
co-advisor-male bool true
abstract-en content | none none
abstract-de content | none none
acknowledgements content | none none
notation content | none none Symbol/notation list
abbreviations content | none none Abbreviations / acronym list
binding-correction length 0mm BCOR added to inside margin (8–10 mm for physically bound copies)
colored-links bool true KIT Blue hyperlinks (screen); false = black (print)
draft bool false Show “ENTWURF”/“DRAFT” watermark
draft-info str | none none Optional version string next to watermark (e.g. git SHA)
serif-headings bool false Use Libertinus Serif for headings when true, Libertinus Sans-Serif when false
heading-numbering-depth int 3 Deepest heading level that receives a number; deeper levels are styled but not numbered
own-publications content | none none Back-matter publications list
own-patents content | none none Back-matter patents list
supervised-theses content | none none Back-matter supervised theses list
show-lof bool true List of figures
show-lot bool true List of tables
show-lol bool false List of listings
figure-kinds array () Figure kinds beyond image/table/raw, as dicts with kind, supplement, and optionally list-title/show-list
bibliography content | none none Pass bibliography("refs.bib", title: none, style: "ieee"); template adds a translated heading
appendix content | none none Appendix chapters; template applies A, A.1, … numbering, placed before the back-matter lists
Bachelor's/Master's/Diploma Thesis: thesis(...)
Parameter Type Default Description
author-firstname str "Max"
author-surname str "Mustermann"
title content Thesis title
thesis-type str "Masterarbeit" e.g. "Bachelorarbeit", "Diplomarbeit"
department str "KIT-Fakultät für Maschinenbau"
university-genitive str "des Karlsruher Instituts für Technologie (KIT)" University name in genitive case
examiner str | none none Erstprüfer
supervisor str | none none Betreuer
date-submitted str | none none
format "a5" | "17x24" | "a4" "a5" Paper format — "a5" (148×210 mm, default), "17x24" (170×240 mm), or "a4" (210×297 mm)
lang "de" | "en" "de" Document language
margin-preset "short" | "medium" | "long" "short" KSP margin profile keyed on final page count — short < 200 pp, medium 200–399, long ≥ 400
binding-correction length 0mm BCOR added to inside margin (8–10 mm for physically bound copies)
colored-links bool true KIT Blue links (screen); false = black (print)
draft bool false Show “ENTWURF”/“DRAFT” watermark
draft-info str | none none Optional version string next to watermark
serif-headings bool false Use Libertinus Serif for headings when true, Libertinus Sans-Serif when false
heading-numbering-depth int 3 Deepest heading level that receives a number; deeper levels are styled but not numbered
abstract-en content | none none
abstract-de content | none none
acknowledgements content | none none
abbreviations content | none none Abbreviations / acronym list
show-lof bool true List of figures
show-lot bool true List of tables
show-lol bool false List of listings
figure-kinds array () Figure kinds beyond image/table/raw, as dicts with kind, supplement, and optionally list-title/show-list
bibliography content | none none Pass bibliography("refs.bib", title: none, style: "ieee"); template adds a translated heading
appendix content | none none Appendix chapters; template applies A, A.1, … numbering, placed before the back-matter lists

Cookbook

Custom document composition

The components namespace exports the individual building blocks for assembling a document without the full dissertation() / thesis() orchestrator. Use this when the high-level templates don’t fit your layout needs. You are responsible for applying the setup wrappers in the correct order.

Available components: setup-page, setup-front-matter, setup-content, setup-appendix, print-dissertation-title, print-thesis-title, print-toc, print-lof, print-lot, print-lol, print-list-of.

#import "@preview/kinetic-kit:0.1.0": components, kit-style

#let format = "a5"
#let font-sizes = kit-style.font-sizes-by-format.at(format)

// 1. Apply base KIT formatting (page geometry, fonts, heading styles, …)
#show: components.setup-page.with(
  format: format,
  margin-preset: "short",
  lang: "de",
  colored-links: true,
)

// 2. Front matter — Roman numerals, no heading numbers
#show: components.setup-front-matter

#components.print-dissertation-title(
  [Titel der Dissertation],
  author-title: "M.Sc.",
  author-firstname: "Vorname",
  author-surname: "Nachname",
  department: "KIT-Fakultät für Maschinenbau",
  university-genitive: "des Karlsruher Instituts für Technologie (KIT)",
  format: format,
)

= Abstract
Your abstract here.

#components.print-toc(font-sizes, lang: "de")

// 3. Main content — Arabic numerals, numbered headings
#show: components.setup-content

= Introduction
Your content here.

= References
#bibliography("refs.bib", title: none, style: "ieee")
Matching template styles in custom figures

The kit-style namespace exposes the template’s visual constants so custom figures and diagrams can match the document’s typography and color palette exactly.

#import "@preview/kinetic-kit:0.1.0": kit-style

// kit-style.fonts                — (serif, sans, mono) font family arrays
// kit-style.font-sizes-by-format  — dict keyed by format: font sizes per format
// kit-style.leading               — paragraph line spacing (0.75em)
// kit-style.colors                — KIT color palette (green, blue, red, …)

#figure(
  {
    set text(font: kit-style.fonts.sans, size: kit-style.font-sizes-by-format.at("a5").small)
    rect(
      fill: kit-style.colors.green15,
      stroke: kit-style.colors.green,
      width: 6cm, height: 3cm,
    )
  },
  caption: [A custom figure using template styles.],
)
Custom figure kinds (algorithms, theorems, …)

Typst gives every figure kind its own counter and supplement, but only styles the ones it knows: image, table and raw. The template carries strings for exactly those three, because their names are template chrome. Anything else is your document’s vocabulary, so you declare it.

Declaring a kind. Give it a supplement, and a list-title if it should get a back-matter list page. Both take either one value or one per language:

#show: dissertation.with(
  figure-kinds: (
    (
      kind:       "algorithm",
      supplement: (de: [Algorithmus],            en: [Algorithm]),
      list-title: (de: [Algorithmenverzeichnis], en: [List of Algorithms]),
      show-list:  true,
    ),
    // Supplement only — no list page.
    (kind: "theorem", supplement: (de: [Satz], en: [Theorem])),
  ),
)

Then tag the figure:

#figure(
  algorithm-body,
  caption: [This is an algorithm.],
  kind: "algorithm",
)

kind: "algorithm" must be spelled out. A figure whose body is a raw block is inferred as kind: raw otherwise, and lands among the listings.

The built-in kinds stay out of it. image, table and raw are configured by show-lof / show-lot / show-lol alone

List order. Figures, tables, listings, then your kinds in declaration order. For a different order, place them yourself with components.print-list-of, which also sets the state that switches flex-caption to its short form.

Draft mode with git SHA watermark

Set draft: true to show an “ENTWURF” (German) or “DRAFT” (English) watermark on every page. Pass draft-info for an additional version string:

#show: dissertation.with(
  // ...
  draft:      true,
  draft-info: sys.inputs.at("git-sha", default: none),
)

Compile with the SHA injected:

typst compile --input git-sha=$(git rev-parse --short HEAD) main.typ

Set draft: false before submission.

Automatic abbreviation expansion (Glossarium)

Use the glossarium package for automatic first-use expansion.

Important: #show: make-glossary must appear before #show: dissertation.with(...). Forgetting this causes silent failure — abbreviations will not expand.

#import "@preview/kinetic-kit:0.1.0": dissertation
#import "@preview/glossarium:0.5.10": make-glossary, register-glossary, print-glossary

#let abbrevs = (
  (key: "ml",  short: "ML",  long: "Machine Learning"),
  (key: "cnn", short: "CNN", long: "Convolutional Neural Network"),
)

// Must come before #show: dissertation.with(...)
#show: make-glossary
#register-glossary(abbrevs)

#show: dissertation.with(
  // ...
  // The template adds the translated section heading automatically.
  abbreviations: print-glossary(abbrevs),
)

// @ml expands to "Machine Learning (ML)" on first use, "ML" thereafter.

For a nicer two-column grid layout (bold abbreviation on the left, long form on the right) instead of the default print-glossary output, see the custom abbrevs-glossary() helper in examples/content/abbreviations.typ.

Margin notes for drafts (Drafting)

Use the drafting package to add margin notes during writing. Tie is-draft to both the watermark and note visibility so they are toggled in one place:

#import "@preview/kinetic-kit:0.1.0": dissertation
#import "@preview/drafting:0.2.2": set-margin-note-defaults, margin-note

#let is-draft = true
#set-margin-note-defaults(hidden: not is-draft)

#show: dissertation.with(
  // ...
  draft: is-draft,
)

// In your text:
#margin-note[Revisit this paragraph.]

Set is-draft = false before final compilation to hide all margin notes and remove the watermark.

Contributing

Contributions are welcome. Refer to CONTRIBUTING.md for details and development setup.

License

Template code: MIT-0 (no attribution required).

Acknowledgements

This template has been implemented with AI assistance (Claude Code by Anthropic). The basis for the template are the KSP handbook, the official KSP LaTeX template, as well as this LaTeX template. Some inspiration was also drawn from the TUM-tastic thesis template.


  1. This template is provided “as is”. Please note that further technical assistance is currently not available. ↩︎