format with typstyle (#40)
This commit is contained in:
parent
08a6eaf79f
commit
b1aca1b18b
|
@ -3,16 +3,16 @@
|
|||
// https://brand.abb/portal/en/branding-principles/basic-brand-elements/color
|
||||
|
||||
// ABB branding colors
|
||||
#let ABB-RED = cmyk(0%, 100%, 95%, 0%)
|
||||
#let ABB-BLACK = cmyk(0%, 0%, 0%, 100%)
|
||||
#let ABB-RED = cmyk(0%, 100%, 95%, 0%)
|
||||
#let ABB-BLACK = cmyk(0%, 0%, 0%, 100%)
|
||||
#let ABB-GRAY-01 = cmyk(0%, 0%, 0%, 90%)
|
||||
#let ABB-GRAY-02 = cmyk(0%, 0%, 0%, 75%)
|
||||
#let ABB-GRAY-03 = cmyk(0%, 0%, 0%, 55%)
|
||||
#let ABB-GRAY-04 = cmyk(0%, 0%, 0%, 35%)
|
||||
#let ABB-GRAY-05 = cmyk(0%, 0%, 0%, 15%)
|
||||
#let ABB-GRAY-06 = cmyk(0%, 0%, 0%, 5%)
|
||||
#let ABB-WHITE = cmyk(0%, 0%, 0%, 0%)
|
||||
#let ABB-WHITE = cmyk(0%, 0%, 0%, 0%)
|
||||
// ABB branding functinal colors
|
||||
#let ABB-BLUE = cmyk(100%, 53%, 2%, 16%)
|
||||
#let ABB-GREEN = cmyk(91%, 4%, 100%, 25%)
|
||||
#let ABB-BLUE = cmyk(100%, 53%, 2%, 16%)
|
||||
#let ABB-GREEN = cmyk(91%, 4%, 100%, 25%)
|
||||
#let ABB-YELLOW = cmyk(0%, 9%, 100%, 0%)
|
||||
|
|
20
src/conf.typ
20
src/conf.typ
|
@ -83,20 +83,20 @@
|
|||
}
|
||||
|
||||
for (key, val) in base {
|
||||
if key in update {
|
||||
let update_val = update.at(key)
|
||||
if key in update {
|
||||
let update_val = update.at(key)
|
||||
|
||||
if type(val) == dictionary and type(update_val) == dictionary {
|
||||
base.insert(key, deep-insert-checked(val, update_val))
|
||||
} else if val == none or type(val) == type(update_val) {
|
||||
base.insert(key, update_val)
|
||||
} else {
|
||||
panic("missmatched dictionary entry `" + key + "` type: expected `" + type(val) + "` got `" + type(update_val) + "`")
|
||||
}
|
||||
if type(val) == dictionary and type(update_val) == dictionary {
|
||||
base.insert(key, deep-insert-checked(val, update_val))
|
||||
} else if val == none or type(val) == type(update_val) {
|
||||
base.insert(key, update_val)
|
||||
} else {
|
||||
base.insert(key, val)
|
||||
panic("missmatched dictionary entry `" + key + "` type: expected `" + type(val) + "` got `" + type(update_val) + "`")
|
||||
}
|
||||
} else {
|
||||
base.insert(key, val)
|
||||
}
|
||||
}
|
||||
|
||||
return base
|
||||
}
|
||||
|
|
|
@ -40,7 +40,7 @@ SOFTWARE.*/
|
|||
|
||||
// key not found error
|
||||
#let __not-found-panic-error-msg(key) = {
|
||||
__glossarium_error_prefix+"key '"+key+"' not found"
|
||||
__glossarium_error_prefix + "key '" + key + "' not found"
|
||||
}
|
||||
|
||||
// Reference a term
|
||||
|
@ -80,10 +80,10 @@ SOFTWARE.*/
|
|||
let gloss = __query_labels_with_key(here(), key, before: true)
|
||||
|
||||
let is_first = gloss == ()
|
||||
let entlongplural = entry.at("longplural", default: "");
|
||||
let entlongplural = entry.at("longplural", default: "")
|
||||
let entlong = if entlongplural == [] or entlongplural == "" {
|
||||
// if the entry long plural is not provided, then fallback to adding 's' suffix
|
||||
let entlong = entry.at("long", default: "");
|
||||
let entlong = entry.at("long", default: "")
|
||||
if entlong != [] and entlong != "" {
|
||||
[#entlong#suffix]
|
||||
} else {
|
||||
|
@ -93,7 +93,7 @@ SOFTWARE.*/
|
|||
[#entlongplural]
|
||||
}
|
||||
|
||||
let entplural = entry.at("plural", default: "");
|
||||
let entplural = entry.at("plural", default: "")
|
||||
let short = if entplural == [] or entplural == "" {
|
||||
[#entry.short#suffix]
|
||||
} else {
|
||||
|
@ -164,30 +164,33 @@ SOFTWARE.*/
|
|||
if entry.group == group {
|
||||
[
|
||||
#show figure.where(kind: __glossarium_figure): it => it.caption
|
||||
#figure(
|
||||
supplement: "",
|
||||
kind: __glossarium_figure,
|
||||
numbering: none,
|
||||
caption: {
|
||||
context {
|
||||
let term_references = __query_labels_with_key(here(), entry.key)
|
||||
if term_references.len() != 0 or show-all {
|
||||
let desc = entry.at("desc", default: "")
|
||||
let long = entry.at("long", default: "")
|
||||
let hasLong = long != "" and long != []
|
||||
let hasDesc = desc != "" and desc != []
|
||||
grid(
|
||||
columns: 2,
|
||||
column-gutter: 1em,
|
||||
text(weight: "bold", entry.short),
|
||||
{
|
||||
if hasLong {
|
||||
text(weight: "bold", entry.long)
|
||||
}
|
||||
if hasLong and hasDesc [:]
|
||||
if hasDesc [ #desc ] else [. ]
|
||||
if disable-back-references != true {
|
||||
term_references.map(x => x.location()).sorted(key: x => x.page()).fold(
|
||||
#figure(
|
||||
supplement: "",
|
||||
kind: __glossarium_figure,
|
||||
numbering: none,
|
||||
caption: {
|
||||
context {
|
||||
let term_references = __query_labels_with_key(here(), entry.key)
|
||||
if term_references.len() != 0 or show-all {
|
||||
let desc = entry.at("desc", default: "")
|
||||
let long = entry.at("long", default: "")
|
||||
let hasLong = long != "" and long != []
|
||||
let hasDesc = desc != "" and desc != []
|
||||
grid(
|
||||
columns: 2,
|
||||
column-gutter: 1em,
|
||||
text(weight: "bold", entry.short),
|
||||
{
|
||||
if hasLong {
|
||||
text(weight: "bold", entry.long)
|
||||
}
|
||||
if hasLong and hasDesc [:]
|
||||
if hasDesc [ #desc ] else [. ]
|
||||
if disable-back-references != true {
|
||||
term_references
|
||||
.map(x => x.location())
|
||||
.sorted(key: x => x.page())
|
||||
.fold(
|
||||
(values: (), pages: ()),
|
||||
((values, pages), x) => if pages.contains(x.page()) {
|
||||
(values: values, pages: pages)
|
||||
|
@ -196,25 +199,30 @@ SOFTWARE.*/
|
|||
pages.push(x.page())
|
||||
(values: values, pages: pages)
|
||||
},
|
||||
).values.map(x => {
|
||||
let page-numbering = x.page-numbering();
|
||||
)
|
||||
.values
|
||||
.map(x => {
|
||||
let page-numbering = x.page-numbering()
|
||||
if page-numbering == none {
|
||||
page-numbering = "1"
|
||||
}
|
||||
link(x)[#numbering(page-numbering, ..counter(page).at(x))]
|
||||
}
|
||||
).join(", ")
|
||||
}
|
||||
)
|
||||
.join(", ")
|
||||
}
|
||||
)
|
||||
}
|
||||
},
|
||||
)
|
||||
}
|
||||
},
|
||||
)[] #label(entry.key)
|
||||
}
|
||||
},
|
||||
)[] #label(entry.key)
|
||||
#parbreak()
|
||||
]
|
||||
}
|
||||
}
|
||||
if enable-group-pagebreak { pagebreak(weak: true) }
|
||||
if enable-group-pagebreak {
|
||||
pagebreak(weak: true)
|
||||
}
|
||||
}
|
||||
};
|
116
src/glossary.typ
116
src/glossary.typ
|
@ -9,66 +9,72 @@
|
|||
|
||||
#let glossary(entries) = {
|
||||
|
||||
assert(
|
||||
type(entries) == dictionary,
|
||||
message: "The glossary is not a dictionary",
|
||||
)
|
||||
|
||||
for (k, v) in entries.pairs() {
|
||||
assert(
|
||||
type(entries) == dictionary,
|
||||
message: "The glossary is not a dictionary",
|
||||
type(v) == dictionary,
|
||||
message: "The glossary entry `" + k + "` is not a dictionary",
|
||||
)
|
||||
|
||||
for (k, v) in entries.pairs() {
|
||||
for key in v.keys() {
|
||||
assert(
|
||||
type(v) == dictionary,
|
||||
message: "The glossary entry `" + k + "` is not a dictionary")
|
||||
|
||||
for key in v.keys() {
|
||||
assert(
|
||||
key in ("short", "long", "desc", "group"),
|
||||
message: "Found unexpected key `" + key + "` in glossary entry `" + k)
|
||||
}
|
||||
|
||||
assert(
|
||||
type(v.short) == str,
|
||||
message: "The short form of glossary entry `" + k + "` is not a string")
|
||||
|
||||
if "long" in v {
|
||||
assert(
|
||||
type(v.long) == str,
|
||||
message: "The long form of glossary entry `" + k + "` is not a string")
|
||||
}
|
||||
|
||||
if "desc" in v {
|
||||
assert(
|
||||
type(v.desc) == str,
|
||||
message: "The description of glossary entry `" + k + "` is not a string")
|
||||
}
|
||||
|
||||
if "group" in v {
|
||||
assert(
|
||||
type(v.group) == str,
|
||||
message: "The optional group of glossary entry `" + k + "` is not a string")
|
||||
} else {
|
||||
let group = if "long" in v {
|
||||
if (context text.lang) == "de" {
|
||||
"Akronyme"
|
||||
} else {
|
||||
"Acronyms"
|
||||
}
|
||||
} else {
|
||||
if (context text.lang) == "de" {
|
||||
"Begriffe"
|
||||
} else {
|
||||
"Terms"
|
||||
}
|
||||
}
|
||||
|
||||
entries.at(k).group = group
|
||||
}
|
||||
key in ("short", "long", "desc", "group"),
|
||||
message: "Found unexpected key `" + key + "` in glossary entry `" + k,
|
||||
)
|
||||
}
|
||||
|
||||
assert(
|
||||
type(v.short) == str,
|
||||
message: "The short form of glossary entry `" + k + "` is not a string",
|
||||
)
|
||||
|
||||
if "long" in v {
|
||||
assert(
|
||||
type(v.long) == str,
|
||||
message: "The long form of glossary entry `" + k + "` is not a string",
|
||||
)
|
||||
}
|
||||
|
||||
if "desc" in v {
|
||||
assert(
|
||||
type(v.desc) == str,
|
||||
message: "The description of glossary entry `" + k + "` is not a string",
|
||||
)
|
||||
}
|
||||
|
||||
if "group" in v {
|
||||
assert(
|
||||
type(v.group) == str,
|
||||
message: "The optional group of glossary entry `" + k + "` is not a string",
|
||||
)
|
||||
} else {
|
||||
let group = if "long" in v {
|
||||
if (context text.lang) == "de" {
|
||||
"Akronyme"
|
||||
} else {
|
||||
"Acronyms"
|
||||
}
|
||||
} else {
|
||||
if (context text.lang) == "de" {
|
||||
"Begriffe"
|
||||
} else {
|
||||
"Terms"
|
||||
}
|
||||
}
|
||||
|
||||
entries.at(k).group = group
|
||||
}
|
||||
}
|
||||
|
||||
return entries.pairs().map(((key, entry)) => (
|
||||
key: key,
|
||||
short: eval(entry.short, mode: "markup"),
|
||||
long: eval(entry.at("long", default: ""), mode: "markup"),
|
||||
desc: eval(entry.at("desc", default: ""), mode: "markup"),
|
||||
group: entry.at("group", default: "")
|
||||
))
|
||||
key: key,
|
||||
short: eval(entry.short, mode: "markup"),
|
||||
long: eval(entry.at("long", default: ""), mode: "markup"),
|
||||
desc: eval(entry.at("desc", default: ""), mode: "markup"),
|
||||
group: entry.at("group", default: ""),
|
||||
))
|
||||
}
|
35
src/lib.typ
35
src/lib.typ
|
@ -7,20 +7,20 @@
|
|||
// Edited: 27.06.2024
|
||||
// License: MIT
|
||||
|
||||
#import "conf.typ": validate-config, default-config
|
||||
#import "branding.typ": *
|
||||
#import "style.typ": global_styled_doc, content_styled, end_styled
|
||||
#import "glossary.typ": glossary
|
||||
#import "pages/titlepage.typ": new_title_page
|
||||
#import "pages/declaration-of-authorship.typ": new_declaration_of_authorship
|
||||
#import "pages/confidentiality-statement.typ": new_confidentiality_statement_page
|
||||
#import "pages/prerelease-note.typ": new_prerelease_note
|
||||
#import "pages/outline.typ": new_outline
|
||||
#import "pages/abstract.typ": new_abstract
|
||||
#import "pages/preface.typ": new-preface
|
||||
#import "pages/appendix.typ": show-appendix
|
||||
#import "conf.typ": validate-config, default-config
|
||||
#import "branding.typ": *
|
||||
#import "style.typ": global_styled_doc, content_styled, end_styled
|
||||
#import "glossary.typ": glossary
|
||||
#import "pages/titlepage.typ": new_title_page
|
||||
#import "pages/declaration-of-authorship.typ": new_declaration_of_authorship
|
||||
#import "pages/confidentiality-statement.typ": new_confidentiality_statement_page
|
||||
#import "pages/prerelease-note.typ": new_prerelease_note
|
||||
#import "pages/outline.typ": new_outline
|
||||
#import "pages/abstract.typ": new_abstract
|
||||
#import "pages/preface.typ": new-preface
|
||||
#import "pages/appendix.typ": show-appendix
|
||||
|
||||
#let group-break()= {
|
||||
#let group-break() = {
|
||||
[#pagebreak()]
|
||||
}
|
||||
|
||||
|
@ -51,12 +51,14 @@
|
|||
#set document(
|
||||
author: config.author.name,
|
||||
keywords: config.thesis.keywords,
|
||||
title: config.thesis.title)
|
||||
title: config.thesis.title,
|
||||
)
|
||||
|
||||
// configure text locale
|
||||
#set text(
|
||||
lang: config.lang,
|
||||
region: config.region)
|
||||
region: config.region,
|
||||
)
|
||||
|
||||
// preppend title page
|
||||
#new_title_page(config)
|
||||
|
@ -83,7 +85,8 @@
|
|||
print-glossary(
|
||||
disable-back-references: true,
|
||||
enable-group-pagebreak: true,
|
||||
glossary(config.thesis.glossary))
|
||||
glossary(config.thesis.glossary),
|
||||
)
|
||||
|
||||
pagebreak(weak: true)
|
||||
}
|
||||
|
|
|
@ -6,22 +6,24 @@
|
|||
// Edited: 28.06.2024
|
||||
// License: MIT
|
||||
|
||||
#let new_abstract(config) = context {
|
||||
#let new_abstract(config) = (
|
||||
context {
|
||||
|
||||
set align(center + horizon)
|
||||
set align(center + horizon)
|
||||
|
||||
// only include summary when a language other than english is used
|
||||
if text.lang == "de" [
|
||||
// Summary is supposed to be on separate page
|
||||
#pagebreak(weak: true)
|
||||
// only include summary when a language other than english is used
|
||||
if text.lang == "de" [
|
||||
// Summary is supposed to be on separate page
|
||||
#pagebreak(weak: true)
|
||||
|
||||
= Zusammenfassung
|
||||
#config.thesis.summary
|
||||
]
|
||||
= Zusammenfassung
|
||||
#config.thesis.summary
|
||||
]
|
||||
|
||||
// abstract is supposed to be on separate page
|
||||
pagebreak(weak: true)
|
||||
// abstract is supposed to be on separate page
|
||||
pagebreak(weak: true)
|
||||
|
||||
heading("Abstract")
|
||||
config.thesis.abstract
|
||||
}
|
||||
heading("Abstract")
|
||||
config.thesis.abstract
|
||||
}
|
||||
)
|
||||
|
|
|
@ -6,39 +6,41 @@
|
|||
// Edited: 28.06.2024
|
||||
// License: MIT
|
||||
|
||||
#let show-appendix(config: dictionary) = context {
|
||||
counter(heading).update(0)
|
||||
#let show-appendix(config: dictionary) = (
|
||||
context {
|
||||
counter(heading).update(0)
|
||||
|
||||
let title = if text.lang == "en" {
|
||||
"Appendix"
|
||||
} else {
|
||||
"Anhang"
|
||||
}
|
||||
|
||||
if "appendices" in config.thesis {
|
||||
pagebreak(weak: true)
|
||||
|
||||
// appendix will be invisible on the appendecies page
|
||||
// but still listed in the ToC
|
||||
show heading: it => []
|
||||
heading(level: 1, numbering: none, title)
|
||||
|
||||
// APA style appendix
|
||||
show heading: it => {
|
||||
let number = if it.numbering != none {
|
||||
counter(heading).display(it.numbering)
|
||||
}
|
||||
block()[
|
||||
#title #number - #it.body
|
||||
]
|
||||
let title = if text.lang == "en" {
|
||||
"Appendix"
|
||||
} else {
|
||||
"Anhang"
|
||||
}
|
||||
|
||||
show heading.where(level: 1): it => v(2em) + it + v(1em)
|
||||
show heading.where(level: 2): it => v(1em) + it + v(0.5em)
|
||||
show heading.where(level: 3): it => v(0.5em) + it + v(0.25em)
|
||||
if "appendices" in config.thesis {
|
||||
pagebreak(weak: true)
|
||||
|
||||
set heading(numbering: "A.1", supplement: title)
|
||||
// appendix will be invisible on the appendecies page
|
||||
// but still listed in the ToC
|
||||
show heading: it => []
|
||||
heading(level: 1, numbering: none, title)
|
||||
|
||||
config.thesis.appendices
|
||||
// APA style appendix
|
||||
show heading: it => {
|
||||
let number = if it.numbering != none {
|
||||
counter(heading).display(it.numbering)
|
||||
}
|
||||
block()[
|
||||
#title #number - #it.body
|
||||
]
|
||||
}
|
||||
|
||||
show heading.where(level: 1): it => v(2em) + it + v(1em)
|
||||
show heading.where(level: 2): it => v(1em) + it + v(0.5em)
|
||||
show heading.where(level: 3): it => v(0.5em) + it + v(0.25em)
|
||||
|
||||
set heading(numbering: "A.1", supplement: title)
|
||||
|
||||
config.thesis.appendices
|
||||
}
|
||||
}
|
||||
}
|
||||
)
|
||||
|
|
|
@ -6,51 +6,52 @@
|
|||
// Edited: 28.06.2024
|
||||
// License: MIT
|
||||
|
||||
#let new_confidentiality_statement_page(config) = context {
|
||||
#let new_confidentiality_statement_page(config) = (
|
||||
context {
|
||||
|
||||
pagebreak(weak: true)
|
||||
pagebreak(weak: true)
|
||||
|
||||
let thesis = config.thesis
|
||||
let author = config.author
|
||||
let thesis = config.thesis
|
||||
let author = config.author
|
||||
|
||||
if text.lang == "de" [
|
||||
#heading(level: 1, "Sperrvermerk", supplement: [special])
|
||||
] else if text.lang == "en" [
|
||||
#heading(level: 1, "Confidentiality Statement", supplement: [special])
|
||||
]
|
||||
if text.lang == "de" [
|
||||
#heading(level: 1, "Sperrvermerk", supplement: [special])
|
||||
] else if text.lang == "en" [
|
||||
#heading(level: 1, "Confidentiality Statement", supplement: [special])
|
||||
]
|
||||
|
||||
if text.lang == "de" [
|
||||
Der Inhalt der dieser Arbeit mit dem Thema
|
||||
] else if text.lang == "en" [
|
||||
The content of this work with the topic
|
||||
]
|
||||
if text.lang == "de" [
|
||||
Der Inhalt der dieser Arbeit mit dem Thema
|
||||
] else if text.lang == "en" [
|
||||
The content of this work with the topic
|
||||
]
|
||||
|
||||
v(1em)
|
||||
v(1em)
|
||||
|
||||
set align(center)
|
||||
set align(center)
|
||||
|
||||
text(weight: "bold", thesis.title)
|
||||
text(weight: "bold", thesis.title)
|
||||
|
||||
if thesis.subtitle != none {
|
||||
linebreak()
|
||||
thesis.subtitle
|
||||
}
|
||||
if thesis.subtitle != none {
|
||||
linebreak()
|
||||
thesis.subtitle
|
||||
}
|
||||
|
||||
set align(left)
|
||||
set align(left)
|
||||
|
||||
v(1em)
|
||||
v(1em)
|
||||
|
||||
set par(justify: true)
|
||||
set par(justify: true)
|
||||
|
||||
if text.lang == "de" [
|
||||
darf weder als Ganzes noch in Auszügen Personen außerhalb des Prüfungsprozesses und des Evalua-tionsverfahrens zugänglich gemacht werden, sofern keine anderslautende Genehmigung der Ausbildungsstätte vorliegt.
|
||||
] else if text.lang == "en" [
|
||||
may not be made accessible to persons outside the examination process and the evaluation procedure, either as a whole or in excerpts, unless otherwise authorized by the training institution.
|
||||
]
|
||||
if text.lang == "de" [
|
||||
darf weder als Ganzes noch in Auszügen Personen außerhalb des Prüfungsprozesses und des Evalua-tionsverfahrens zugänglich gemacht werden, sofern keine anderslautende Genehmigung der Ausbildungsstätte vorliegt.
|
||||
] else if text.lang == "en" [
|
||||
may not be made accessible to persons outside the examination process and the evaluation procedure, either as a whole or in excerpts, unless otherwise authorized by the training institution.
|
||||
]
|
||||
|
||||
set align(horizon)
|
||||
set align(horizon)
|
||||
|
||||
grid(
|
||||
grid(
|
||||
// set width of columns
|
||||
// we need two, so make both half the page width
|
||||
columns: (50%, 50%),
|
||||
|
@ -59,4 +60,5 @@
|
|||
align(left, {line(length: 6cm)}),
|
||||
align(left, if text.lang == "de" [ Ort, Datum ] else if text.lang == "en" [ Place, Date ] else { panic("no translation for language: ", text.lang) }),
|
||||
align(left, if text.lang == "de" [ Unterschrift ] else if text.lang == "en" [ Signature ] else { panic("no translation for language: ", text.lang) }))
|
||||
}
|
||||
}
|
||||
)
|
||||
|
|
|
@ -6,53 +6,54 @@
|
|||
// Edited: 28.06.2024
|
||||
// License: MIT
|
||||
|
||||
#let new_declaration_of_authorship(config) = context {
|
||||
#let new_declaration_of_authorship(config) = (
|
||||
context {
|
||||
|
||||
pagebreak(weak: true)
|
||||
pagebreak(weak: true)
|
||||
|
||||
let thesis = config.thesis
|
||||
let author = config.author
|
||||
let thesis = config.thesis
|
||||
let author = config.author
|
||||
|
||||
if text.lang == "de" [
|
||||
#heading("Selbständigkeitserklärung")
|
||||
] else if text.lang == "en" [
|
||||
#heading("Declaration of Authorship")
|
||||
]
|
||||
if text.lang == "de" [
|
||||
#heading("Selbständigkeitserklärung")
|
||||
] else if text.lang == "en" [
|
||||
#heading("Declaration of Authorship")
|
||||
]
|
||||
|
||||
v(1em)
|
||||
v(1em)
|
||||
|
||||
if text.lang == "de" [
|
||||
Ich versichere hiermit, dass ich meine Prüfung mit dem Thema
|
||||
] else if text.lang == "en" [
|
||||
I hereby confirm that I have written this thesis with the subject
|
||||
]
|
||||
if text.lang == "de" [
|
||||
Ich versichere hiermit, dass ich meine Prüfung mit dem Thema
|
||||
] else if text.lang == "en" [
|
||||
I hereby confirm that I have written this thesis with the subject
|
||||
]
|
||||
|
||||
v(1em)
|
||||
v(1em)
|
||||
|
||||
set align(center)
|
||||
set align(center)
|
||||
|
||||
text(weight: "bold", thesis.title)
|
||||
text(weight: "bold", thesis.title)
|
||||
|
||||
if thesis.subtitle != none {
|
||||
linebreak()
|
||||
thesis.subtitle
|
||||
}
|
||||
if thesis.subtitle != none {
|
||||
linebreak()
|
||||
thesis.subtitle
|
||||
}
|
||||
|
||||
set align(left)
|
||||
set align(left)
|
||||
|
||||
v(1em)
|
||||
v(1em)
|
||||
|
||||
set par(justify: true)
|
||||
set par(justify: true)
|
||||
|
||||
if text.lang == "de" [
|
||||
selbständig verfasst und keine anderen als die angegebenen Quellen und Hilfsmittel benutzt habe. Ich versichere zudem, dass die eingereichte elektronische Fassung mit der gedruckten Fassung übereinstimmt.
|
||||
] else if text.lang == "en" [
|
||||
independently and have not used any sources or aids other than those specified. I also confirm that the electronic version submitted is identical to the printed version.
|
||||
]
|
||||
if text.lang == "de" [
|
||||
selbständig verfasst und keine anderen als die angegebenen Quellen und Hilfsmittel benutzt habe. Ich versichere zudem, dass die eingereichte elektronische Fassung mit der gedruckten Fassung übereinstimmt.
|
||||
] else if text.lang == "en" [
|
||||
independently and have not used any sources or aids other than those specified. I also confirm that the electronic version submitted is identical to the printed version.
|
||||
]
|
||||
|
||||
set align(horizon)
|
||||
set align(horizon)
|
||||
|
||||
grid(
|
||||
grid(
|
||||
// set width of columns
|
||||
// we need two, so make both half the page width
|
||||
columns: (50%, 50%),
|
||||
|
@ -61,4 +62,5 @@
|
|||
align(left, {line(length: 6cm)}),
|
||||
align(left, if text.lang == "de" [ Ort, Datum ] else if text.lang == "en" [ Place, Date ] else { panic("no translation for language: ", text.lang) }),
|
||||
align(left, if text.lang == "de" [ Unterschrift ] else if text.lang == "en" [ Signature ] else { panic("no translation for language: ", text.lang) }))
|
||||
}
|
||||
}
|
||||
)
|
||||
|
|
|
@ -10,92 +10,105 @@
|
|||
// with a specific title and filter by a specifc kind of figure
|
||||
// can optionally insert a pagebreak after the outline
|
||||
// NOTE: will not render in case the listing is empty
|
||||
#let render_filtered_outline(title: str, kind: selector) = context {
|
||||
#let render_filtered_outline(title: str, kind: selector) = (
|
||||
context {
|
||||
|
||||
let elems = query(figure.where(kind: kind), here())
|
||||
let count = elems.len()
|
||||
let elems = query(figure.where(kind: kind), here())
|
||||
let count = elems.len()
|
||||
|
||||
// only show outline if there is something to list
|
||||
if count > 0 {
|
||||
pagebreak(weak: true)
|
||||
outline(
|
||||
title: title,
|
||||
target: figure.where(kind: kind))
|
||||
// only show outline if there is something to list
|
||||
if count > 0 {
|
||||
pagebreak(weak: true)
|
||||
outline(
|
||||
title: title,
|
||||
target: figure.where(kind: kind),
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
#let render_figures_outline() = context {
|
||||
let title = if (text.lang == "de") {
|
||||
#let render_figures_outline() = (
|
||||
context {
|
||||
let title = if (text.lang == "de") {
|
||||
"Abbildungsverzeichnis"
|
||||
} else if text.lang == "en" {
|
||||
"List of Figures"
|
||||
}
|
||||
|
||||
render_filtered_outline(title: title, kind: image)
|
||||
}
|
||||
render_filtered_outline(title: title, kind: image)
|
||||
}
|
||||
)
|
||||
|
||||
#let render_table_outline() = context {
|
||||
let title = if (text.lang == "de") {
|
||||
#let render_table_outline() = (
|
||||
context {
|
||||
let title = if (text.lang == "de") {
|
||||
"Tabellenverzeichnis"
|
||||
} else if text.lang == "en" {
|
||||
"List of Tables"
|
||||
}
|
||||
|
||||
render_filtered_outline(title: title, kind: table)
|
||||
}
|
||||
render_filtered_outline(title: title, kind: table)
|
||||
}
|
||||
)
|
||||
|
||||
#let render_raw_outline() = context {
|
||||
let title = if (text.lang == "de") {
|
||||
#let render_raw_outline() = (
|
||||
context {
|
||||
let title = if (text.lang == "de") {
|
||||
"Quelltextverzeichnis"
|
||||
} else if text.lang == "en" {
|
||||
"Code Snippets"
|
||||
}
|
||||
|
||||
render_filtered_outline(title: title, kind: raw)
|
||||
}
|
||||
render_filtered_outline(title: title, kind: raw)
|
||||
}
|
||||
)
|
||||
|
||||
#let render_heading_outline() = context {
|
||||
let title = if (text.lang == "de") {
|
||||
#let render_heading_outline() = (
|
||||
context {
|
||||
let title = if (text.lang == "de") {
|
||||
"Inhaltsverzeichnis"
|
||||
} else if text.lang == "en" {
|
||||
"Table of Contents"
|
||||
}
|
||||
|
||||
pagebreak(weak: true)
|
||||
outline(
|
||||
target: heading.where(supplement: [chapter]),
|
||||
title: title,
|
||||
indent: auto)
|
||||
}
|
||||
|
||||
#let render_appendix_outline() = context {
|
||||
let supplement = if text.lang == "en" {
|
||||
[Appendix]
|
||||
} else {
|
||||
[Anhang]
|
||||
}
|
||||
|
||||
if query(heading.where(supplement: supplement)).len() > 0 {
|
||||
let title = if (text.lang == "de") {
|
||||
"Anhangsverzeichnis"
|
||||
} else if text.lang == "en" {
|
||||
"Table of Appendices"
|
||||
}
|
||||
|
||||
pagebreak(weak: true)
|
||||
outline(
|
||||
target: heading.where(supplement: [chapter]),
|
||||
title: title,
|
||||
indent: auto,
|
||||
)
|
||||
}
|
||||
)
|
||||
|
||||
#let render_appendix_outline() = (
|
||||
context {
|
||||
let supplement = if text.lang == "en" {
|
||||
[Appendix]
|
||||
} else {
|
||||
[Anhang]
|
||||
}
|
||||
|
||||
if query(heading.where(supplement: supplement)).len() > 0 {
|
||||
let title = if (text.lang == "de") {
|
||||
"Anhangsverzeichnis"
|
||||
} else if text.lang == "en" {
|
||||
"Table of Appendices"
|
||||
}
|
||||
|
||||
pagebreak(weak: true)
|
||||
outline(
|
||||
target: heading.where(supplement: supplement),
|
||||
title: title,
|
||||
indent: auto)
|
||||
indent: auto,
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
#let new_outline() = {
|
||||
pagebreak(weak: true)
|
||||
|
||||
show outline.entry.where(
|
||||
level: 1,
|
||||
): it => {
|
||||
show outline.entry.where(level: 1): it => {
|
||||
v(1.5em, weak: true)
|
||||
strong(it)
|
||||
}
|
||||
|
|
|
@ -6,51 +6,53 @@
|
|||
// Edited: 28.06.2024
|
||||
// License: MIT
|
||||
|
||||
#let new_prerelease_note(config) = context {
|
||||
#let new_prerelease_note(config) = (
|
||||
context {
|
||||
|
||||
pagebreak(weak: true)
|
||||
pagebreak(weak: true)
|
||||
|
||||
let thesis = config.thesis
|
||||
let author = config.author
|
||||
let thesis = config.thesis
|
||||
let author = config.author
|
||||
|
||||
if text.lang == "de" [
|
||||
#heading("Vorabfassung")
|
||||
] else if text.lang == "en" [
|
||||
#heading("Preliminary Version")
|
||||
]
|
||||
if text.lang == "de" [
|
||||
#heading("Vorabfassung")
|
||||
] else if text.lang == "en" [
|
||||
#heading("Preliminary Version")
|
||||
]
|
||||
|
||||
v(1em)
|
||||
v(1em)
|
||||
|
||||
if text.lang == "de" [
|
||||
Bei dieser Ausgabe der Arbeit mit dem Thema
|
||||
] else if text.lang == "en" [
|
||||
This edition of the work with the subject
|
||||
]
|
||||
if text.lang == "de" [
|
||||
Bei dieser Ausgabe der Arbeit mit dem Thema
|
||||
] else if text.lang == "en" [
|
||||
This edition of the work with the subject
|
||||
]
|
||||
|
||||
v(1em)
|
||||
v(1em)
|
||||
|
||||
set align(center)
|
||||
set align(center)
|
||||
|
||||
text(weight: "bold", thesis.title)
|
||||
text(weight: "bold", thesis.title)
|
||||
|
||||
if thesis.subtitle != none {
|
||||
linebreak()
|
||||
thesis.subtitle
|
||||
if thesis.subtitle != none {
|
||||
linebreak()
|
||||
thesis.subtitle
|
||||
}
|
||||
|
||||
set align(left)
|
||||
|
||||
v(1em)
|
||||
|
||||
set par(justify: true)
|
||||
|
||||
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 #author.university nicht zur Bewertung freigegeben und ein anderer Verwendungszweck als eine Vorschau ist nicht gestattet.
|
||||
] 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 #author.university as part of the assignment, and any use other than a preview is not permitted.
|
||||
]
|
||||
|
||||
v(1em)
|
||||
h(1em)
|
||||
[#author.name, #datetime.today().display()]
|
||||
}
|
||||
|
||||
set align(left)
|
||||
|
||||
v(1em)
|
||||
|
||||
set par(justify: true)
|
||||
|
||||
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 #author.university nicht zur Bewertung freigegeben und ein anderer Verwendungszweck als eine Vorschau ist nicht gestattet.
|
||||
] 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 #author.university as part of the assignment, and any use other than a preview is not permitted.
|
||||
]
|
||||
|
||||
v(1em)
|
||||
h(1em)
|
||||
[#author.name, #datetime.today().display()]
|
||||
}
|
||||
)
|
||||
|
|
|
@ -6,110 +6,88 @@
|
|||
// Edited: 28.06.2024
|
||||
// License: MIT
|
||||
|
||||
#let new_title_page(config) = context [
|
||||
#let new_title_page(config) = (
|
||||
context [
|
||||
|
||||
#let thesis = config.thesis
|
||||
#let author = config.author
|
||||
#let thesis = config.thesis
|
||||
#let author = config.author
|
||||
|
||||
#set align(center)
|
||||
#set align(center)
|
||||
|
||||
// title
|
||||
#v(2cm)
|
||||
#text(size: 2em, weight: "semibold", thesis.title)
|
||||
// title
|
||||
#v(2cm)
|
||||
#text(size: 2em, weight: "semibold", thesis.title)
|
||||
|
||||
// subtitle
|
||||
#text(size: 1.5em, thesis.subtitle)
|
||||
// subtitle
|
||||
#text(size: 1.5em, thesis.subtitle)
|
||||
|
||||
// type of paper
|
||||
#v(1cm)
|
||||
#text(size: 1.5em, weight: "bold", thesis.kind)
|
||||
// type of paper
|
||||
#v(1cm)
|
||||
#text(size: 1.5em, weight: "bold", thesis.kind)
|
||||
|
||||
// faculty
|
||||
#pad(top: 0.5cm)[
|
||||
#if text.lang == "de" [
|
||||
Praxisphase des #author.semester Studienjahrs an der Fakultät für #author.faculty
|
||||
#linebreak()
|
||||
im Studiengang #author.program
|
||||
] else if text.lang == "en" [
|
||||
Practical phase of the #author.semester academic year at the Faculty of #author.faculty
|
||||
#linebreak()
|
||||
in the degree program #author.program
|
||||
] else [
|
||||
#context panic("no translation for language: ", text.lang)
|
||||
]
|
||||
]
|
||||
|
||||
// university
|
||||
#pad(top: 0.5cm)[
|
||||
#if text.lang == "de" [
|
||||
an der
|
||||
] else if text.lang == "en" [
|
||||
at
|
||||
] else [
|
||||
#context panic("no translation for language: ", text.lang)
|
||||
]
|
||||
#linebreak()
|
||||
#author.university
|
||||
]
|
||||
|
||||
#set align(horizon + left)
|
||||
|
||||
// faculty
|
||||
#pad(top: 0.5cm)[
|
||||
#if text.lang == "de" [
|
||||
Praxisphase des #author.semester Studienjahrs an der Fakultät für #author.faculty
|
||||
#linebreak()
|
||||
im Studiengang #author.program
|
||||
#table(
|
||||
columns: 2,
|
||||
column-gutter: 1cm,
|
||||
align: left,
|
||||
stroke: none,
|
||||
[*Verfasser:*], author.name,
|
||||
[*Bearbeitungszeitraum:*], thesis.timeframe,
|
||||
[*Matrikelnummer, Kurs:*], str(author.matriculation-number) + ", " + author.course,
|
||||
[*Ausbildungsbetrieb:*], author.company,
|
||||
[*Betrieblicher Betreuer:*], author.supervisor,
|
||||
[*Abgabedatum:*], thesis.submission-date,
|
||||
)
|
||||
] else if text.lang == "en" [
|
||||
Practical phase of the #author.semester academic year at the Faculty of #author.faculty
|
||||
#linebreak()
|
||||
in the degree program #author.program
|
||||
#table(
|
||||
columns: 2,
|
||||
column-gutter: 1cm,
|
||||
align: left,
|
||||
stroke: none,
|
||||
[*Author:*], author.name,
|
||||
[*Editing period:*], thesis.timeframe,
|
||||
[*Matriculation number, course:*], str(author.matriculation-number) + ", " + author.course,
|
||||
[*Training company:*], author.company,
|
||||
[*Company supervisor:*], author.supervisor,
|
||||
[*Submission date:*], thesis.submission-date,
|
||||
)
|
||||
] else [
|
||||
#context panic("no translation for language: ", text.lang)
|
||||
]
|
||||
]
|
||||
|
||||
// university
|
||||
#pad(top: 0.5cm)[
|
||||
#if text.lang == "de" [
|
||||
an der
|
||||
] else if text.lang == "en" [
|
||||
at
|
||||
] else [
|
||||
#context panic("no translation for language: ", text.lang)
|
||||
]
|
||||
#linebreak()
|
||||
#author.university
|
||||
]
|
||||
|
||||
#set align(horizon + left)
|
||||
|
||||
#if text.lang == "de" [
|
||||
#table(
|
||||
columns: 2,
|
||||
column-gutter: 1cm,
|
||||
align: left,
|
||||
stroke: none,
|
||||
|
||||
[*Verfasser:*],
|
||||
author.name,
|
||||
|
||||
[*Bearbeitungszeitraum:*],
|
||||
thesis.timeframe,
|
||||
|
||||
[*Matrikelnummer, Kurs:*],
|
||||
str(author.matriculation-number) + ", " + author.course,
|
||||
|
||||
[*Ausbildungsbetrieb:*],
|
||||
author.company,
|
||||
|
||||
[*Betrieblicher Betreuer:*],
|
||||
author.supervisor,
|
||||
|
||||
[*Abgabedatum:*],
|
||||
thesis.submission-date
|
||||
)
|
||||
] else if text.lang == "en" [
|
||||
#table(
|
||||
columns: 2,
|
||||
column-gutter: 1cm,
|
||||
align: left,
|
||||
stroke: none,
|
||||
|
||||
[*Author:*],
|
||||
author.name,
|
||||
|
||||
[*Editing period:*],
|
||||
thesis.timeframe,
|
||||
|
||||
[*Matriculation number, course:*],
|
||||
str(author.matriculation-number) + ", " + author.course,
|
||||
|
||||
[*Training company:*],
|
||||
author.company,
|
||||
|
||||
[*Company supervisor:*],
|
||||
author.supervisor,
|
||||
|
||||
[*Submission date:*],
|
||||
thesis.submission-date
|
||||
)
|
||||
] else [
|
||||
#context panic("no translation for language: ", text.lang)
|
||||
]
|
||||
|
||||
#align(bottom,
|
||||
grid(
|
||||
#align(
|
||||
bottom,
|
||||
grid(
|
||||
// set width of columns
|
||||
// we need two, so make both half the page width
|
||||
columns: (60%, 40%),
|
||||
|
@ -121,7 +99,9 @@
|
|||
#context panic("no translation for language: ", text.lang)
|
||||
]
|
||||
),
|
||||
align(right, {line(length: 6cm)})))
|
||||
align(right, {line(length: 6cm)})),
|
||||
)
|
||||
|
||||
#counter(page).update(0)
|
||||
]
|
||||
#counter(page).update(0)
|
||||
]
|
||||
)
|
||||
|
|
148
src/style.typ
148
src/style.typ
|
@ -18,9 +18,10 @@
|
|||
#let watermark(config) = if config.draft {
|
||||
rotate(-22.5deg)[
|
||||
#rect(
|
||||
radius: 1em,
|
||||
inset: 1em,
|
||||
stroke: watermark-color)[
|
||||
radius: 1em,
|
||||
inset: 1em,
|
||||
stroke: watermark-color,
|
||||
)[
|
||||
#text(size: 4em, weight: "bold", fill: watermark-pattern, "DRAFT")
|
||||
#linebreak()
|
||||
#text(size: 1.25em, weight: "bold", fill: watermark-color)[
|
||||
|
@ -28,13 +29,14 @@
|
|||
#linebreak()
|
||||
document version.
|
||||
#linebreak()
|
||||
#text(size: 0.75em, "Further usage without the authors consent is not permitted.")]]]}
|
||||
|
||||
#let numberingH(c)={
|
||||
return numbering(c.numbering,..counter(heading).at(c.location()))
|
||||
#text(size: 0.75em, "Further usage without the authors consent is not permitted.")]]]
|
||||
}
|
||||
|
||||
#let currentH(level: 1)={
|
||||
#let numberingH(c) = {
|
||||
return numbering(c.numbering, ..counter(heading).at(c.location()))
|
||||
}
|
||||
|
||||
#let currentH(level: 1) = {
|
||||
let elems = query(selector(heading.where(level: level)).after(here()))
|
||||
|
||||
if elems.len() != 0 and elems.first().location().page() == here().page() {
|
||||
|
@ -59,11 +61,13 @@
|
|||
hyphenate: true,
|
||||
dir: ltr,
|
||||
font: style.text.font,
|
||||
fill: ABB-BLACK)
|
||||
fill: ABB-BLACK,
|
||||
)
|
||||
|
||||
show heading: set text(
|
||||
font: style.heading.font,
|
||||
weight: "semibold")
|
||||
weight: "semibold",
|
||||
)
|
||||
|
||||
set heading(supplement: [chapter])
|
||||
|
||||
|
@ -75,9 +79,15 @@
|
|||
show heading.where(level: 3): it => v(0.5em) + it + v(0.25em)
|
||||
|
||||
// set theme for code blocks
|
||||
set raw(
|
||||
tab-size: style.code.tab-size)
|
||||
show raw.where(block: false): it => box(stroke: 1pt + ABB-GRAY-05, radius: 2pt, inset: (left: 2pt, right: 2pt), outset: (top: 4pt, bottom: 4pt), fill: ABB-GRAY-06, text(font: style.code.font, size: style.code.size, it.text))
|
||||
set raw(tab-size: style.code.tab-size)
|
||||
show raw.where(block: false): it => box(
|
||||
stroke: 1pt + ABB-GRAY-05,
|
||||
radius: 2pt,
|
||||
inset: (left: 2pt, right: 2pt),
|
||||
outset: (top: 4pt, bottom: 4pt),
|
||||
fill: ABB-GRAY-06,
|
||||
text(font: style.code.font, size: style.code.size, it.text),
|
||||
)
|
||||
show figure.where(kind: raw): it => align(left)[
|
||||
#let content = it.body
|
||||
#let lang = if content.has("lang") {
|
||||
|
@ -86,51 +96,55 @@
|
|||
none
|
||||
}
|
||||
#block(
|
||||
width: 100%,
|
||||
fill: ABB-GRAY-06,
|
||||
stroke: 1pt + ABB-GRAY-05,
|
||||
radius: 0.5em,
|
||||
inset: 0.75em,
|
||||
clip: false,
|
||||
{
|
||||
let (columns, align, make_row) = {
|
||||
if style.code.lines {(
|
||||
width: 100%,
|
||||
fill: ABB-GRAY-06,
|
||||
stroke: 1pt + ABB-GRAY-05,
|
||||
radius: 0.5em,
|
||||
inset: 0.75em,
|
||||
clip: false,
|
||||
{
|
||||
let (columns, align, make_row) = {
|
||||
if style.code.lines {
|
||||
(
|
||||
(auto, 1fr),
|
||||
(right + top, left),
|
||||
e => {
|
||||
let (i, l) = e
|
||||
let n = i + 1
|
||||
let n_str = if (calc.rem(n, 1) == 0) or (true and i == 0) { text(font: style.code.font, size: style.code.size, fill: ABB-BLACK, str(n)) } else { none }
|
||||
let n_str = if (calc.rem(n, 1) == 0) or (true and i == 0) {
|
||||
text(font: style.code.font, size: style.code.size, fill: ABB-BLACK, str(n))
|
||||
} else {
|
||||
none
|
||||
}
|
||||
(n_str + h(0.5em), raw(block: true, lang: lang, l))
|
||||
})
|
||||
}
|
||||
else {
|
||||
( ( 1fr, ),
|
||||
( left, ),
|
||||
e => {
|
||||
let (i, l) = e
|
||||
raw(block: true, lang: lang, l)
|
||||
}
|
||||
)
|
||||
}
|
||||
},
|
||||
)
|
||||
} else {
|
||||
(
|
||||
(1fr,),
|
||||
(left,),
|
||||
e => {
|
||||
let (i, l) = e
|
||||
raw(block: true, lang: lang, l)
|
||||
},
|
||||
)
|
||||
}
|
||||
grid(
|
||||
stroke: none,
|
||||
columns: columns,
|
||||
rows: (auto,),
|
||||
gutter: 0pt,
|
||||
inset: 0.25em,
|
||||
align: (col, _) => align.at(col),
|
||||
fill: ABB-GRAY-06,
|
||||
..content
|
||||
.text
|
||||
.split("\n")
|
||||
.enumerate()
|
||||
.map(make_row)
|
||||
.flatten()
|
||||
.map(c => if c.has("text") and c.text == "" { v(1em) } else { c })
|
||||
)
|
||||
}
|
||||
}
|
||||
grid(
|
||||
stroke: none,
|
||||
columns: columns,
|
||||
rows: (auto,),
|
||||
gutter: 0pt,
|
||||
inset: 0.25em,
|
||||
align: (col, _) => align.at(col),
|
||||
fill: ABB-GRAY-06,
|
||||
..content.text.split("\n").enumerate().map(make_row).flatten().map(c => if c.has("text") and c.text == "" {
|
||||
v(1em)
|
||||
} else {
|
||||
c
|
||||
})
|
||||
)
|
||||
},
|
||||
)
|
||||
#v(-1em)
|
||||
#align(center + top, it.caption)
|
||||
|
@ -167,8 +181,20 @@
|
|||
stroke: (x, y) => (
|
||||
left: none,
|
||||
right: none,
|
||||
top: if y == 0 { 1.5pt } else if y < 2 { 1pt } else { 0.5pt },
|
||||
bottom: if y == 0 { 1pt } else { 1.5pt } ))
|
||||
top: if y == 0 {
|
||||
1.5pt
|
||||
} else if y < 2 {
|
||||
1pt
|
||||
} else {
|
||||
0.5pt
|
||||
},
|
||||
bottom: if y == 0 {
|
||||
1pt
|
||||
} else {
|
||||
1.5pt
|
||||
},
|
||||
),
|
||||
)
|
||||
|
||||
// make table header bold
|
||||
show table.cell.where(y: 0): set text(weight: "bold")
|
||||
|
@ -177,7 +203,8 @@
|
|||
set par(
|
||||
justify: true,
|
||||
first-line-indent: 1em,
|
||||
leading: 1em)
|
||||
leading: 1em,
|
||||
)
|
||||
|
||||
// give links a color
|
||||
show link: set text(fill: style.link.color)
|
||||
|
@ -193,10 +220,11 @@
|
|||
top: style.page.margin.top + style.header.underline-top-padding + style.header.content-padding,
|
||||
bottom: style.page.margin.bottom + style.footer.content-padding,
|
||||
left: style.page.margin.left,
|
||||
right: style.page.margin.right),
|
||||
right: style.page.margin.right,
|
||||
),
|
||||
numbering: (..nums) => {
|
||||
let current-page = here().page()
|
||||
if current-page == 1{
|
||||
if current-page == 1 {
|
||||
[]
|
||||
} else if query(<end-of-prelude>).first().location().page() > current-page {
|
||||
numbering("I", nums.pos().first())
|
||||
|
@ -237,7 +265,10 @@
|
|||
// right align logo of DHBW
|
||||
align(right, image("res/DHBW.svg", height: style.header.logo-height)))
|
||||
|
||||
} else if query(<end-of-content>).first().location().page() >= current-page and query(<end-of-prelude>).first().location().page() < current-page + 1 {
|
||||
} else if query(<end-of-content>).first().location().page() >= current-page and query(<end-of-prelude>)
|
||||
.first()
|
||||
.location()
|
||||
.page() < current-page + 1 {
|
||||
let heading = currentH()
|
||||
|
||||
heading.at(0)
|
||||
|
@ -250,7 +281,8 @@
|
|||
v(style.header.underline-top-padding - 1em)
|
||||
line(length: 100%)
|
||||
}
|
||||
})
|
||||
},
|
||||
)
|
||||
|
||||
body
|
||||
}
|
||||
|
|
|
@ -8,7 +8,5 @@
|
|||
|
||||
#lorem(50)
|
||||
|
||||
#figure(
|
||||
```
|
||||
```
|
||||
)
|
||||
#figure(```
|
||||
```)
|
||||
|
|
|
@ -15,7 +15,8 @@
|
|||
university: "DHBW Mannheim",
|
||||
company: "ABB AG",
|
||||
supervisor: "Benny Goodman",
|
||||
matriculation-number: 123456789),
|
||||
matriculation-number: 123456789,
|
||||
),
|
||||
thesis: (
|
||||
title: "Unofficial ABB/DHBW Typst template",
|
||||
subtitle: "for reports and thesises",
|
||||
|
@ -25,10 +26,12 @@
|
|||
summary: summary,
|
||||
abstract: abstract,
|
||||
preface: include "preface.typ",
|
||||
keywords: ( "IT", "other stuff" ),
|
||||
keywords: ("IT", "other stuff"),
|
||||
bibliography: bibliography("refs.bib"),
|
||||
glossary: yaml("glossary.yml"),
|
||||
appendices: include "appendix.typ")))
|
||||
appendices: include "appendix.typ",
|
||||
),
|
||||
))
|
||||
|
||||
#import "@preview/wrap-it:0.1.0": wrap-content
|
||||
|
||||
|
@ -54,15 +57,16 @@
|
|||
|
||||
$
|
||||
angle.l a, b angle.r &= arrow(a) dot arrow(b) \
|
||||
&= a_1 b_1 + a_2 b_2 + ... a_n b_n \
|
||||
&= sum_(i=1)^n a_i b_i.
|
||||
&= a_1 b_1 + a_2 b_2 + ... a_n b_n \
|
||||
&= sum_(i=1)^n a_i b_i.
|
||||
$
|
||||
|
||||
#lorem(140)
|
||||
|
||||
#wrap-content(
|
||||
figure(image("assets/digitaldog.jpg", width: 200pt), caption: [ Some image caption ]),
|
||||
lorem(200))
|
||||
lorem(200),
|
||||
)
|
||||
|
||||
#figure(
|
||||
table(
|
||||
|
@ -76,8 +80,10 @@ $
|
|||
[2023-03-18], [Yoga], [200],
|
||||
[2023-03-15], [Swimming], [400],
|
||||
[2023-03-17], [Weightlifting], [250],
|
||||
[2023-03-18], [Yoga], [200]),
|
||||
caption: [ Some table ])
|
||||
[2023-03-18], [Yoga], [200],
|
||||
),
|
||||
caption: [ Some table ],
|
||||
)
|
||||
|
||||
#pagebreak()
|
||||
|
||||
|
@ -86,14 +92,16 @@ $
|
|||
|
||||
#figure(
|
||||
```rust
|
||||
use std::env;
|
||||
use std::fs::OpenOptions;
|
||||
use std::io::Write;
|
||||
use std::env;
|
||||
use std::fs::OpenOptions;
|
||||
use std::io::Write;
|
||||
|
||||
fn main() {
|
||||
println!("Hello, World!!!");
|
||||
}
|
||||
```, caption: [Some code])
|
||||
fn main() {
|
||||
println!("Hello, World!!!");
|
||||
}
|
||||
```,
|
||||
caption: [Some code],
|
||||
)
|
||||
|
||||
#lorem(100)
|
||||
|
||||
|
|
Loading…
Reference in New Issue