Compare commits

...

13 Commits
v0.5.4 ... main

Author SHA1 Message Date
Sven Vogel b1255bdbab chore: bump release version to v0.6.3
Create Release Commit / prepare (push) Has been skipped Details
Create Release / Check Template and Build example (push) Successful in 3m21s Details
Create Release / release (push) Successful in 1m54s Details
Generated-By: servostar
2024-12-03 08:30:01 +00:00
Sven Vogel 490765d713 fix: typstyle (#120)
Create Release Commit / prepare (push) Has been cancelled Details
Reviewed-on: #120
Release-As: v0.6.3
Co-authored-by: servostar <sven.vogel123@web.de>
Co-committed-by: servostar <sven.vogel123@web.de>
2024-12-03 08:29:33 +00:00
Sven Vogel 208357eeb1 chore: bump release version to v0.6.2
Create Release Commit / prepare (push) Has been skipped Details
Create Release / Check Template and Build example (push) Successful in 2m32s Details
Create Release / release (push) Successful in 2m53s Details
Generated-By: servostar
2024-12-01 11:45:22 +00:00
Sven Vogel 93f0a30109 fix: hide empty author information (#119)
Create Release Commit / prepare (push) Has been cancelled Details
Reviewed-on: #119
Release-As: v0.6.2
Co-authored-by: servostar <sven.vogel123@web.de>
Co-committed-by: servostar <sven.vogel123@web.de>
2024-12-01 11:44:54 +00:00
Sven Vogel 0181e710b8 chore: update assets
Create Release Commit / prepare (push) Has been skipped Details
Create Release / Check Template and Build example (push) Successful in 2m25s Details
Create Release / release (push) Successful in 55s Details
Generated-By: servostar
2024-11-30 19:07:37 +00:00
Sven Vogel 674c783a4f chore: bump release version to v0.6.1
Generated-By: servostar
2024-11-30 19:04:40 +00:00
Sven Vogel a6d0d70f08 ci: autogen-banner (#118)
Create Release Commit / prepare (push) Has been cancelled Details
Reviewed-on: #118
Release-As: v0.6.1
Generate-Assets
2024-11-30 19:04:13 +00:00
Sven Vogel a8d2161efa chore: bump release version to v0.6.0
Create Release Commit / prepare (push) Has been skipped Details
Create Release / Check Template and Build example (push) Successful in 2m31s Details
Create Release / release (push) Successful in 56s Details
Generated-By: servostar
2024-11-30 12:16:00 +00:00
Sven Vogel a99f1aca86 feat: allow-no-company (#117)
Create Release Commit / prepare (push) Has been cancelled Details
Reviewed-on: #117
Release-As: v0.6.0
Co-authored-by: servostar <sven.vogel123@web.de>
Co-committed-by: servostar <sven.vogel123@web.de>
2024-11-30 12:15:44 +00:00
Sven Vogel 0a34cfe3e7 chore: bump release version to v0.5.5
Create Release Commit / prepare (push) Has been skipped Details
Create Release / Check Template and Build example (push) Successful in 2m23s Details
Create Release / release (push) Successful in 57s Details
Generated-By: servostar
2024-11-27 14:25:00 +00:00
Sven Vogel 96ff7a93af fix: convert CMYK branding color to RGB (#116)
Create Release Commit / prepare (push) Has been cancelled Details
Fixes incompatability with PDF/A format

Reviewed-on: #116
Release-As: v0.5.5
Co-authored-by: servostar <sven.vogel123@web.de>
Co-committed-by: servostar <sven.vogel123@web.de>
2024-11-27 14:24:45 +00:00
Sven Vogel ac1968bb12 fix: add missing config reference when using university name in prerelease note (#114)
Create Release Commit / prepare (push) Has been skipped Details
Reviewed-on: #114
Co-authored-by: servostar <sven.vogel123@web.de>
Co-committed-by: servostar <sven.vogel123@web.de>
2024-11-27 13:39:00 +00:00
Sven Vogel 77ed9621bd ci: make github action run on tags (#113)
Create Release Commit / prepare (push) Has been skipped Details
Reviewed-on: #113
Co-authored-by: servostar <sven.vogel123@web.de>
Co-committed-by: servostar <sven.vogel123@web.de>
2024-11-26 10:12:51 +00:00
24 changed files with 320 additions and 179 deletions

View File

@ -12,27 +12,44 @@ jobs:
env: env:
USERNAME: servostar USERNAME: servostar
EMAIL: sven.vogel123@web.de EMAIL: sven.vogel123@web.de
GIT_AUTH_TOKEN: ${{ secrets.RELEASE_TOKEN }}
COMMIT_MESSAGE: ${{ github.event.head_commit.message }}
steps: steps:
- name: Check out repository code - name: Check out repository code
uses: actions/checkout@v3 uses: actions/checkout@v3
with: with:
ref: 'main' ref: 'main'
token: ${{ secrets.RELEASE_TOKEN }} token: ${{ secrets.RELEASE_TOKEN }}
- name: Tag Release Commit - name: Install dependencies for Nix setup action
env: run: |
COMMIT_MESSAGE: ${{ github.event.head_commit.message }} apt update -y
GIT_AUTH_TOKEN: ${{ secrets.RELEASE_TOKEN }} apt install sudo -y
- name: Setup Nix
uses: cachix/install-nix-action@v27
with:
nix_path: nixpkgs=channel:nixos-unstable
- name: Setup Git
run: | run: |
export VERSION=$(echo "${COMMIT_MESSAGE}" | grep -Po '(?<=Release-As: )v\d+\.\d+\.\d+')
git config --global user.name "${USERNAME}" git config --global user.name "${USERNAME}"
git config --global user.email "${EMAIL}" git config --global user.email "${EMAIL}"
echo "==> Update typst.toml version" - name: Update Typst.toml
run: |
export VERSION=$(echo "${COMMIT_MESSAGE}" | grep -Po '(?<=Release-As: )v\d+\.\d+\.\d+')
sed -i "/version/c\version = \"${VERSION#v}\"" typst.toml sed -i "/version/c\version = \"${VERSION#v}\"" typst.toml
git add typst.toml git add typst.toml
git commit -m "chore: bump release version to $VERSION" -m "Generated-By: ${{ gitea.actor }}" git commit -m "chore: bump release version to $VERSION" -m "Generated-By: ${{ gitea.actor }}"
- name: Generate Example Document
run: nix-shell --run ./run-ci.sh
- name: Generate Assets
if: contains(github.event.head_commit.message, 'Generate-Assets')
run: |
./run-bake-assets.sh
git add assets/banner.png
git add assets/page-preview.png
git commit -m "chore: update assets" -m "Generated-By: ${{ gitea.actor }}"
- name: Tag and Push Changes
run: |
git push origin main git push origin main
echo "::endgroup::" export VERSION=$(echo "${COMMIT_MESSAGE}" | grep -Po '(?<=Release-As: )v\d+\.\d+\.\d+')
echo "::group::{Tag commit}"
git tag -m "Release" "${VERSION}" git tag -m "Release" "${VERSION}"
git push origin "${VERSION}" git push origin "${VERSION}"
echo "::endgroup::"

View File

@ -1,10 +1,10 @@
name: Build'n check name: Build'n check
on: on:
push: push:
branches: branches:
- main - main
tags:
- 'v[0-9]+.[0-9]+.[0-9]+'
jobs: jobs:
build: build:
name: Check Template and Build example name: Check Template and Build example

1
.gitignore vendored
View File

@ -1,2 +1,3 @@
*.pdf *.pdf
*.log *.log
images/

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 MiB

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 MiB

After

Width:  |  Height:  |  Size: 9.0 MiB

59
baker/banner.typ Normal file
View File

@ -0,0 +1,59 @@
#import "@preview/shadowed:0.1.2": shadowed
#let LE = 10cm
#let shadow = 0.25cm
#set page(margin: 0pt, width: 2 * LE, height: LE, fill: rgb(0, 0, 0, 0))
#place(
dx: 3cm,
dy: 1.1cm,
rotate(
-9deg,
shadowed(
radius: 0pt,
inset: 0pt,
blur: shadow,
image("./images/21.svg", height: LE * 0.6))))
#place(
dx: 1cm,
dy: 3.25cm,
rotate(
-20deg,
shadowed(
radius: 0pt,
inset: 0pt,
blur: shadow,
image("./images/51.svg", height: LE * 0.55))))
#place(
dx: 14cm,
dy: 1.5cm,
rotate(
6deg,
shadowed(
radius: 0pt,
inset: 0pt,
blur: shadow,
image("./images/41.svg", height: LE * 0.65))))
#place(
dx: 11cm,
dy: 2cm,
rotate(
25deg,
shadowed(
radius: 0pt,
inset: 0pt,
blur: shadow,
image("./images/31.svg", height: LE * 0.6))))
#place(
dx: 7cm,
dy: 0.75cm,
shadowed(
radius: 0pt,
inset: 0pt,
blur: shadow,
image("./images/11.svg", height: LE * 0.75)))

34
baker/preview.typ Normal file
View File

@ -0,0 +1,34 @@
#let gap = 0.5cm
#set page(margin: 0pt, width: 210mm * 3 + 2 * gap, height: 297mm * 2 + gap, fill: rgb(0, 0, 0, 0))
#place(
dx: 0mm,
dy: 0mm,
image("./images/11.svg", height: 297mm))
#place(
dx: 210mm + gap,
dy: 0mm,
image("./images/21.svg", height: 297mm))
#place(
dx: (210mm + gap) * 2,
dy: 0mm,
image("./images/31.svg", height: 297mm))
#place(
dx: 210mm * 0,
dy: 297mm + gap,
image("./images/71.svg", height: 297mm))
#place(
dx: (210mm + gap) * 1,
dy: 297mm + gap,
image("./images/41.svg", height: 297mm))
#place(
dx: (210mm + gap) * 2,
dy: 297mm + gap,
image("./images/51.svg", height: 297mm))

18
baker/run-bake-banner.sh Executable file
View File

@ -0,0 +1,18 @@
#!/bin/bash
echo "==> generate images"
mkdir images || true
# extract images from document created by action
mutool convert -o images/1.svg "$1" 1
mutool convert -o images/2.svg "$1" 2
mutool convert -o images/2.svg "$1" 2
mutool convert -o images/3.svg "$1" 5
mutool convert -o images/7.svg "$1" 7
mutool convert -o images/4.svg "$1" 15
mutool convert -o images/5.svg "$1" 16
echo "==> generate banner"
typst compile banner.typ --ppi 360 ../assets/banner.png
echo "==> generate preview"
typst compile preview.typ --ppi 360 ../assets/page-preview.png

14
baker/shell.nix Normal file
View File

@ -0,0 +1,14 @@
let
nixpkgs = fetchTarball "https://github.com/NixOS/nixpkgs/tarball/nixos-unstable";
pkgs = import nixpkgs { config = {}; overlays = []; };
in
pkgs.mkShellNoCC {
packages = with pkgs; [
python312
python312Packages.pyyaml
typst
typstyle
mupdf-headless
];
}

6
run-bake-assets.sh Executable file
View File

@ -0,0 +1,6 @@
#!/bin/bash
cd baker
echo "==> generate assets"
nix-shell --run "./run-bake-banner.sh ../example.pdf"

View File

@ -17,7 +17,7 @@ function format() {
exit 1 exit 1
fi fi
local imports=$(rg "#import \"([a-z0-9/\-]+\.typ)\"" -Nor '$1' "$1") local imports=$(rg "#import \"([a-z0-9/\-.]+\.typ)\"" -Nor '$1' "$1")
# format all included files # format all included files
while IFS= read -r line; do while IFS= read -r line; do
@ -26,6 +26,16 @@ function format() {
fi fi
format "$wd/$line" "$2" format "$wd/$line" "$2"
done <<< "$imports" done <<< "$imports"
local includes=$(rg "#import \"([a-z0-9/\-.]+\.typ)\"" -Nor '$1' "$1")
# format all included files
while IFS= read -r line; do
if [ -z "$line" ]; then
continue
fi
format "$wd/$line" "$2"
done <<< "$includes"
} }
case $1 in case $1 in

View File

@ -1,5 +1,5 @@
let let
nixpkgs = fetchTarball "https://github.com/NixOS/nixpkgs/tarball/nixos-24.11"; nixpkgs = fetchTarball "https://github.com/NixOS/nixpkgs/tarball/nixos-unstable";
pkgs = import nixpkgs { config = {}; overlays = []; }; pkgs = import nixpkgs { config = {}; overlays = []; };
in in

View File

@ -3,16 +3,16 @@
// https://brand.abb/portal/en/branding-principles/basic-brand-elements/color // https://brand.abb/portal/en/branding-principles/basic-brand-elements/color
// ABB branding colors // ABB branding colors
#let ABB-RED = cmyk(0%, 100%, 95%, 0%) #let ABB-RED = rgb(255, 0, 13)
#let ABB-BLACK = cmyk(0%, 0%, 0%, 100%) #let ABB-BLACK = rgb(0, 0, 0)
#let ABB-GRAY-01 = cmyk(0%, 0%, 0%, 90%) #let ABB-GRAY-01 = rgb(25, 25, 25)
#let ABB-GRAY-02 = cmyk(0%, 0%, 0%, 75%) #let ABB-GRAY-02 = rgb(64, 64, 64)
#let ABB-GRAY-03 = cmyk(0%, 0%, 0%, 55%) #let ABB-GRAY-03 = rgb(115, 115, 115)
#let ABB-GRAY-04 = cmyk(0%, 0%, 0%, 35%) #let ABB-GRAY-04 = rgb(166, 166, 166)
#let ABB-GRAY-05 = cmyk(0%, 0%, 0%, 15%) #let ABB-GRAY-05 = rgb(217, 217, 217)
#let ABB-GRAY-06 = cmyk(0%, 0%, 0%, 5%) #let ABB-GRAY-06 = rgb(242, 242, 242)
#let ABB-WHITE = cmyk(0%, 0%, 0%, 0%) #let ABB-WHITE = rgb(255, 255, 255)
// ABB branding functinal colors // ABB branding functinal colors
#let ABB-BLUE = cmyk(100%, 53%, 2%, 16%) #let ABB-BLUE = rgb(0, 101, 210)
#let ABB-GREEN = cmyk(91%, 4%, 100%, 25%) #let ABB-GREEN = rgb(17, 184, 0)
#let ABB-YELLOW = cmyk(0%, 9%, 100%, 0%) #let ABB-YELLOW = rgb(255, 232, 0)

View File

@ -22,25 +22,10 @@
program: "Informationtechnology", program: "Informationtechnology",
faculty: "Technik", faculty: "Technik",
name: "dualen Hochschule Baden-Württemberg", name: "dualen Hochschule Baden-Württemberg",
campus: "Eppelheim" campus: "Eppelheim",
), ),
supervisor-signature: false, supervisor-signature: false,
authors: ( authors: ((), ()),
(
name: "Sven Vogel",
course: "TINF19IT1",
company: "ABB AG",
supervisor: "Benny Goodman",
matriculation-number: 123456789
),
(
name: "Kurt Jammer",
course: "TINF24AI2",
company: "Siemens",
supervisor: "Henry Badman",
matriculation-number: 478568763
),
),
// information about thesis // information about thesis
thesis: ( thesis: (
title: "Unofficial ABB/DHBW Typst template", title: "Unofficial ABB/DHBW Typst template",
@ -52,38 +37,49 @@
summary: none, summary: none,
abstract: none, abstract: none,
preface: none, preface: none,
keywords: ( "IT", "other stuff" ), keywords: ("IT", "other stuff"),
bibliography: none /* bibliography("refs.bib") */, bibliography: none, /* bibliography("refs.bib") */
glossary: none, glossary: none,
appendices: none), appendices: none,
),
style: ( style: (
header: ( header: (
content-padding: 1.5em, content-padding: 1.5em,
underline-top-padding: 0pt, underline-top-padding: 0pt,
logo-height: 5em, logo-height: 5em,
logo-image: "res/ABB.svg"), logo-image: "res/ABB.svg",
),
footer: ( footer: (
content-padding: 1.5em), content-padding: 1.5em,
),
page: ( page: (
format: "a4", format: "a4",
margin: ( margin: (
left: 3cm, left: 3cm,
right: 2.5cm, right: 2.5cm,
top: 2.5cm, top: 2.5cm,
bottom: 2.5cm)), bottom: 2.5cm,
),
),
text: ( text: (
size: 12pt, size: 12pt,
font: "Fira Sans"), font: "Fira Sans",
),
heading: ( heading: (
font: "Fira Sans"), font: "Fira Sans",
),
code: ( code: (
theme: "res/abb.tmTheme", theme: "res/abb.tmTheme",
font: "FiraCode Nerd Font", font: "FiraCode Nerd Font",
lines: false, lines: false,
size: 10pt, size: 10pt,
tab-size: 4), tab-size: 4,
),
link: ( link: (
color: ABB-GRAY-02))) color: ABB-GRAY-02,
),
),
)
// Insert a dictionary `update` into `base` but only the entries of update that also exist in base // Insert a dictionary `update` into `base` but only the entries of update that also exist in base
// Runs recursively on all sub dictionaries // Runs recursively on all sub dictionaries
@ -102,6 +98,7 @@
if type(val) == array { if type(val) == array {
// ignore checking arraay // ignore checking arraay
base.insert(key, update_val)
} else if type(val) == dictionary and type(update_val) == dictionary { } else if type(val) == dictionary and type(update_val) == dictionary {
base.insert(key, deep-insert-checked(val, update_val)) base.insert(key, deep-insert-checked(val, update_val))
} else if val == none or type(val) == type(update_val) { } else if val == none or type(val) == type(update_val) {

View File

@ -8,7 +8,6 @@
// License: MIT // License: MIT
#let glossary(entries, config) = { #let glossary(entries, config) = {
assert( assert(
type(entries) == dictionary, type(entries) == dictionary,
message: "The glossary is not a dictionary", message: "The glossary is not a dictionary",

View File

@ -8,7 +8,6 @@
#let new_abstract(config) = ( #let new_abstract(config) = (
context { context {
set align(center + horizon) set align(center + horizon)
// only include summary when a language other than english is used // only include summary when a language other than english is used

View File

@ -8,7 +8,6 @@
#let new_confidentiality_statement_page(config) = ( #let new_confidentiality_statement_page(config) = (
context { context {
pagebreak(weak: true) pagebreak(weak: true)
let thesis = config.thesis let thesis = config.thesis

View File

@ -8,7 +8,6 @@
#let new_declaration_of_authorship(config) = ( #let new_declaration_of_authorship(config) = (
context { context {
pagebreak(weak: true) pagebreak(weak: true)
let thesis = config.thesis let thesis = config.thesis

View File

@ -12,7 +12,6 @@
// NOTE: will not render in case the listing is empty // NOTE: will not render in case the listing is empty
#let render_filtered_outline(title: str, kind: selector) = ( #let render_filtered_outline(title: str, kind: selector) = (
context { context {
let elems = query(figure.where(kind: kind)) let elems = query(figure.where(kind: kind))
let count = elems.len() let count = elems.len()

View File

@ -8,7 +8,6 @@
#let new_prerelease_note(config) = ( #let new_prerelease_note(config) = (
context { context {
pagebreak(weak: true) pagebreak(weak: true)
let thesis = config.thesis let thesis = config.thesis
@ -47,7 +46,7 @@
if text.lang == "de" [ if text.lang == "de" [
handelt es sich _nicht_ um die fertige Fassung. Das Dokument kann Inhaltliche-, Grammatikalische- sowie Format-Fehler enthalten. Das Dokument ist im Rahmen der Aufgabenstellung von Seiten der #university.name nicht zur Bewertung freigegeben und ein anderer Verwendungszweck als eine Vorschau ist nicht gestattet. handelt es sich _nicht_ um die fertige Fassung. Das Dokument kann Inhaltliche-, Grammatikalische- sowie Format-Fehler enthalten. Das Dokument ist im Rahmen der Aufgabenstellung von Seiten der #university.name nicht zur Bewertung freigegeben und ein anderer Verwendungszweck als eine Vorschau ist nicht gestattet.
] else if text.lang == "en" [ ] else if text.lang == "en" [
is not the final version. The document may contain errors in content, grammar and formatting. The document may not be released for evaluation to #university.name as part of the assignment, and any use other than a preview is not permitted. is not the final version. The document may contain errors in content, grammar and formatting. The document may not be released for evaluation to #config.university.name as part of the assignment, and any use other than a preview is not permitted.
] ]
} }
) )

View File

@ -49,9 +49,17 @@
// faculty // faculty
#pad()[ #pad()[
#if text.lang == "de" [ #if text.lang == "de" [
aus dem Studiengang #config.university.program | #config.university.faculty aus dem Studiengang #config.university.program
] else if text.lang == "en" [ ] else if text.lang == "en" [
from the course of studies #config.university.program | #config.university.faculty from the course of studies #config.university.program
] else [
#context panic("no translation for language: ", text.lang)
]
#if text.lang == "de" [
an der Fakultät #config.university.faculty
] else if text.lang == "en" [
at the faculty of #config.university.faculty
] else [ ] else [
#context panic("no translation for language: ", text.lang) #context panic("no translation for language: ", text.lang)
] ]
@ -68,14 +76,19 @@
] ]
#config.university.name #config.university.name
#linebreak() #linebreak()
#if text.lang == "de" [
in
] else if text.lang == "en" [
in
] else [
#context panic("no translation for language: ", text.lang)
]
#config.university.campus #config.university.campus
] ]
#pad(top: 1em)[ #pad(top: 1.5em)[
#let names = () #let names = ()
#for author in config.authors {
names.push(author.name)
}
#if text.lang == "de" [ #if text.lang == "de" [
von von
] else if text.lang == "en" [ ] else if text.lang == "en" [
@ -83,70 +96,41 @@
] else [ ] else [
#context panic("no translation for language: ", text.lang) #context panic("no translation for language: ", text.lang)
] ]
#set text(size: 16pt)
#grid(columns: 1, row-gutter: 1em, ..names) #v(1.5em)
#let rows = int(config.authors.len() / 3 + 0.5)
#for i in range(0, rows) {
let cols = calc.min(config.authors.len() - i * 3, 3)
grid(columns: cols, column-gutter: 1.5em, ..config
.authors
.slice(i * 3, i * 3 + cols)
.map(author => par([
#if author.at("name", default: none) != none {
text(size: 1.25em, author.name)
linebreak()
}
#if author.at("company", default: none) != none {
text(size: 1em, author.company)
linebreak()
}
#if author.at("contact", default: none) != none {
text(size: 1em, author.contact)
linebreak()
}
#str(author.matriculation-number), #author.course
])))
}
] ]
#pad(top: 1em)[ #set align(bottom)
#pad(top: 1.5em)[
#thesis.timeframe #thesis.timeframe
] ]
#set align(bottom + left)
#if text.lang == "de" [
#grid(
columns: 2,
column-gutter: 1cm,
row-gutter: 0.5cm,
align: top + left,
stroke: none,
[Matrikelnummer, Kurs:],
par(
leading: 0.5em,
for author in config.authors {
str(author.matriculation-number) + ", " + author.course
linebreak()
},
),
[Betrieb, Betreuer:],
par(
leading: 0.5em,
for author in config.authors {
author.company + ", " + author.supervisor
linebreak()
},
),
)
] else if text.lang == "en" [
#grid(
columns: 2,
column-gutter: 1cm,
row-gutter: 0.5cm,
align: top + left,
stroke: none,
[Student ID, Course:],
par(
leading: 0.5em,
for author in config.authors {
str(author.matriculation-number) + ", " + author.course
linebreak()
},
),
[Company, Supervisor:],
par(
leading: 0.5em,
for author in config.authors {
author.company + ", " + author.supervisor
linebreak()
},
),
)
] else [
#context panic("no translation for language: ", text.lang)
]
#if config.supervisor-signature { #if config.supervisor-signature {
align( align(
bottom, bottom,

View File

@ -241,6 +241,7 @@
set page( set page(
paper: style.page.format, paper: style.page.format,
foreground: watermark(config), foreground: watermark(config),
background: [#rect(width: 100%, height: 100%, fill: white)],
header-ascent: style.header.content-padding, header-ascent: style.header.content-padding,
footer-descent: style.header.content-padding, footer-descent: style.header.content-padding,
margin: ( margin: (
@ -295,7 +296,6 @@
if current-page == 1 { if current-page == 1 {
// logo moved to content // logo moved to content
} else if query(<end-of-content>) } else if query(<end-of-content>)
.first() .first()
.location() .location()

View File

@ -6,16 +6,23 @@
lang: "de", lang: "de",
region: "de", region: "de",
draft: false, draft: false,
author: ( authors: (
(
name: "Sven Vogel",
course: "TINF19IT1",
company: none,
supervisor: "Benny Goodman",
matriculation-number: 123456789,
contact: "sven.vogel123@web.de"
),
(
name: "Sven Vogel", name: "Sven Vogel",
semester: 4,
program: "Informationtechnology",
course: "TINF19IT1", course: "TINF19IT1",
faculty: "Technik",
university: "DHBW Mannheim",
company: "ABB AG", company: "ABB AG",
supervisor: "Benny Goodman", supervisor: "Benny Goodman",
matriculation-number: 123456789, matriculation-number: 123456789,
contact: "sven.vogel123@web.de"
)
), ),
thesis: ( thesis: (
title: "Unofficial ABB/DHBW Typst template", title: "Unofficial ABB/DHBW Typst template",

View File

@ -1,6 +1,6 @@
[package] [package]
name = "dhbw-abb-typst-template" name = "dhbw-abb-typst-template"
version = "0.5.4" version = "0.6.3"
entrypoint = "src/template.typ" entrypoint = "src/template.typ"
authors = ["Sven Vogel <sven.vogel1@de.abb.com>"] authors = ["Sven Vogel <sven.vogel1@de.abb.com>"]
license = "MIT" license = "MIT"