diff --git a/src/branding.typ b/src/branding.typ index c80ca6c..079a875 100644 --- a/src/branding.typ +++ b/src/branding.typ @@ -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%) diff --git a/src/conf.typ b/src/conf.typ index c4a7e51..271202e 100644 --- a/src/conf.typ +++ b/src/conf.typ @@ -53,9 +53,9 @@ page: ( format: "a4", margin: ( - left: 3cm, - right: 2.5cm, - top: 2.5cm, + left: 3cm, + right: 2.5cm, + top: 2.5cm, bottom: 2.5cm)), text: ( size: 12pt, @@ -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 } diff --git a/src/glossarium.typ b/src/glossarium.typ index 5fb8bae..3784d18 100644 --- a/src/glossarium.typ +++ b/src/glossarium.typ @@ -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 @@ -49,9 +49,9 @@ SOFTWARE.*/ let __glossary_entries = __glossary_entries.final(here()) if key in __glossary_entries { let entry = __glossary_entries.at(key) - + let gloss = __query_labels_with_key(here(), key, before: true) - + let is_first = gloss == () let entlong = entry.at("long", default: "") let textLink = if display != none { @@ -61,7 +61,7 @@ SOFTWARE.*/ } else { [#entry.short#suffix] } - + [#link(label(entry.key), textLink)#label(__glossary_label_prefix + entry.key)] } else { panic(__not-found-panic-error-msg(key)) @@ -76,14 +76,14 @@ SOFTWARE.*/ let __glossary_entries = __glossary_entries.final(here()) if key in __glossary_entries { let entry = __glossary_entries.at(key) - + 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 { @@ -92,20 +92,20 @@ SOFTWARE.*/ } else { [#entlongplural] } - - let entplural = entry.at("plural", default: ""); + + let entplural = entry.at("plural", default: "") let short = if entplural == [] or entplural == "" { [#entry.short#suffix] } else { [#entplural] } - + let textLink = if (is_first or long == true) and entlong != [] and entlong != "" and long != false { [#entlong (#short)] } else { [#short] } - + [#link(label(entry.key), textLink)#label(__glossary_label_prefix + entry.key)] } else { panic(__not-found-panic-error-msg(key)) @@ -152,42 +152,44 @@ SOFTWARE.*/ for entry in entry_list { x.insert(entry.key, entry) } - + x }) let groups = entries.map(x => x.at("group")).dedup() - + for group in groups.sorted() { if group != "" [#heading(group, level: 1, outlined: false) ] for entry in entries.sorted(key: x => x.key) { 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 != [] + + #block( + par(hanging-indent: 1em)[ + #text(weight: "bold", entry.short) + #if hasLong { + text(entry.long) + } + #if hasLong and hasDesc [:] + #if hasDesc [ #desc ] + #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 +198,29 @@ 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) - #parbreak() + ], + ) + ] + } + }, + )[] #label(entry.key) ] } } - if enable-group-pagebreak { pagebreak(weak: true) } + if enable-group-pagebreak { + pagebreak(weak: true) + } } -}; \ No newline at end of file +}; diff --git a/src/glossary.typ b/src/glossary.typ index 3fb0aef..436b664 100644 --- a/src/glossary.typ +++ b/src/glossary.typ @@ -9,66 +9,86 @@ #let glossary(entries) = { + assert( + type(entries) == dictionary, + message: "The glossary is not a dictionary", + ) + + let processed_glossary = (:) + + 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, + ) } - 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: "") - )) -} \ No newline at end of file + 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 acronym_group = if (context text.lang) == "de" { + "Akronyme" + } else { + "Acronyms" + } + + let glossary_group = if (context text.lang) == "de" { + "Begriffe" + } else { + "Glossary" + } + + let group = if "long" in v { + acronym_group + } else { + glossary_group + } + + // create dedicated entries for + // acronym and glossary + if "long" in v and "desc" in v { + processed_glossary.insert(k, (short: v.short, long: v.long, group: acronym_group)) + processed_glossary.insert(k + "__glossary_entry", (short: v.short, desc: v.desc, group: glossary_group)) + } else { + processed_glossary.insert(k, v) + processed_glossary.at(k).group = group + } + } + } + + return processed_glossary.pairs().map(((key, entry)) => ( + key: key, + short: entry.short, + long: eval(entry.at("long", default: ""), mode: "markup"), + desc: eval(entry.at("desc", default: ""), mode: "markup"), + group: entry.at("group", default: ""), + )) +} diff --git a/src/lib.typ b/src/lib.typ index 905e383..b2c0649 100644 --- a/src/lib.typ +++ b/src/lib.typ @@ -7,23 +7,38 @@ // Edited: 27.06.2024 // License: MIT - #import "conf.typ": validate-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()] } +#let inline-color(color, content) = { + box( + stroke: 1pt + ABB-GRAY-05, + radius: 2pt, + inset: (left: 2pt, right: 2pt), + outset: (top: 4pt, bottom: 4pt), + fill: ABB-GRAY-06, + [#box(fill: rgb(color), radius: 2pt, inset: 0pt, width: 0.75em, height: 0.75em) #text( + font: default-config.style.code.font, + size: default-config.style.code.size, + content, + )], + ) +} + // start of template pages and styles #let dhbw-template(config, body) = [ #let config = validate-config(config) @@ -36,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) @@ -57,7 +74,7 @@ #new-preface(config) #new_outline() - // glossary is built inline here because the links must be + // glossary is built inline here because the links must be // exposed to the entire document #import "glossarium.typ": * #show: make-glossary @@ -66,12 +83,14 @@ #if "glossary" in config.thesis and config.thesis.glossary != none { print-glossary( + show-all: true, disable-back-references: true, enable-group-pagebreak: true, - glossary(config.thesis.glossary)) + glossary(config.thesis.glossary), + ) pagebreak(weak: true) - } + } #counter(page).update(1) // mark end of prelude @@ -94,4 +113,4 @@ #show-appendix(config: config) ] ] -] \ No newline at end of file +] diff --git a/src/pages/abstract.typ b/src/pages/abstract.typ index f2feb5a..8fa3e76 100644 --- a/src/pages/abstract.typ +++ b/src/pages/abstract.typ @@ -6,22 +6,24 @@ // Edited: 28.06.2024 // License: MIT -#let new_abstract(config) = context { - - set align(center + horizon) +#let new_abstract(config) = ( + context { - // 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) + set align(center + horizon) - = Zusammenfassung - #config.thesis.summary - ] + // 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) - // abstract is supposed to be on separate page - pagebreak(weak: true) + = Zusammenfassung + #config.thesis.summary + ] - heading("Abstract") - config.thesis.abstract -} \ No newline at end of file + // abstract is supposed to be on separate page + pagebreak(weak: true) + + heading("Abstract") + config.thesis.abstract + } +) diff --git a/src/pages/appendix.typ b/src/pages/appendix.typ index ce6270c..e066e05 100644 --- a/src/pages/appendix.typ +++ b/src/pages/appendix.typ @@ -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 + } } -} +) diff --git a/src/pages/confidentiality-statement.typ b/src/pages/confidentiality-statement.typ index b020ef7..6c98f53 100644 --- a/src/pages/confidentiality-statement.typ +++ b/src/pages/confidentiality-statement.typ @@ -6,41 +6,42 @@ // 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 Evaluationsverfahrens zugänglich gemacht werden, sofern keine anderslautende Genehmigung der Ausbildungsstätte vorliegt. @@ -48,9 +49,9 @@ 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) })) -} \ No newline at end of file + } +) diff --git a/src/pages/declaration-of-authorship.typ b/src/pages/declaration-of-authorship.typ index c2c3a42..81b0c53 100644 --- a/src/pages/declaration-of-authorship.typ +++ b/src/pages/declaration-of-authorship.typ @@ -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) })) -} \ No newline at end of file + } +) diff --git a/src/pages/outline.typ b/src/pages/outline.typ index 0811949..c09a3da 100644 --- a/src/pages/outline.typ +++ b/src/pages/outline.typ @@ -9,93 +9,106 @@ // render an outline of figures // 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 { +// NOTE: will not render in case the listing is empty +#let render_filtered_outline(title: str, kind: selector) = ( + context { - 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)) + 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), + ) + } } -} +) -#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) } @@ -109,4 +122,4 @@ render_raw_outline() render_appendix_outline() -} \ No newline at end of file +} diff --git a/src/pages/preface.typ b/src/pages/preface.typ index 94474c8..b69aebe 100644 --- a/src/pages/preface.typ +++ b/src/pages/preface.typ @@ -11,4 +11,4 @@ pagebreak(weak: true) config.thesis.preface } -} \ No newline at end of file +} diff --git a/src/pages/prerelease-note.typ b/src/pages/prerelease-note.typ index 86d79a0..d230acd 100644 --- a/src/pages/prerelease-note.typ +++ b/src/pages/prerelease-note.typ @@ -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()] -} \ No newline at end of file +) diff --git a/src/pages/titlepage.typ b/src/pages/titlepage.typ index 24d20b9..46dde55 100644 --- a/src/pages/titlepage.typ +++ b/src/pages/titlepage.typ @@ -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 Semesters an der Fakultät für #author.faculty + #linebreak() + im Studiengang #author.program + ] else if text.lang == "en" [ + Practical phase of the #author.semester semester 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 Semesters 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 semester 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) + ] +) diff --git a/src/requirements.typ b/src/requirements.typ index d3a8824..3eba09f 100644 --- a/src/requirements.typ +++ b/src/requirements.typ @@ -7,4 +7,4 @@ // Edited: 05.07.2024 // License: MIT -#import "glossary.typ": * \ No newline at end of file +#import "glossary.typ": * diff --git a/src/style.typ b/src/style.typ index 1815d2c..f4a5623 100644 --- a/src/style.typ +++ b/src/style.typ @@ -111,46 +111,37 @@ 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 - }) - ) - if lang != none { - place( - top + right, - text(font: style.code.font, size: style.code.size, ligatures: true, fill: ABB-GRAY-03, lang), + 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) @@ -187,20 +178,8 @@ 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") @@ -209,8 +188,7 @@ set par( justify: true, first-line-indent: 1em, - leading: 1em, - ) + leading: 1em) // give links a color show link: set text(fill: style.link.color) @@ -226,11 +204,10 @@ 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().first().location().page() > current-page { numbering("I", nums.pos().first()) @@ -271,10 +248,7 @@ // right align logo of DHBW align(right, image("res/DHBW.svg", height: style.header.logo-height))) - } else if query().first().location().page() >= current-page and query() - .first() - .location() - .page() < current-page + 1 { + } else if query().first().location().page() >= current-page and query().first().location().page() < current-page + 1 { let heading = currentH() heading.at(0) @@ -287,8 +261,7 @@ v(style.header.underline-top-padding - 1em) line(length: 100%) } - }, - ) + }) body } diff --git a/template/appendix.typ b/template/appendix.typ index 51cb42a..880ccd8 100644 --- a/template/appendix.typ +++ b/template/appendix.typ @@ -4,11 +4,9 @@ #lorem(50) -== More raw data +== More raw data #lorem(50) -#figure( - ``` - ``` -) \ No newline at end of file +#figure(``` +```) diff --git a/template/glossary.yml b/template/glossary.yml index c45422f..60c8cfb 100644 --- a/template/glossary.yml +++ b/template/glossary.yml @@ -6,4 +6,8 @@ oidc: potato: short: potato - desc: "#lorem(50)" \ No newline at end of file + desc: "#lorem(50)" + +HTTP: + short: HTTP + long: Hyper Text Transfer Protocol diff --git a/template/main.typ b/template/main.typ index fac607d..6b830a6 100644 --- a/template/main.typ +++ b/template/main.typ @@ -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,23 +80,28 @@ $ [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() #lorem(100) +#inline-color("#ff0000", "red") @HTTP #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) @@ -100,4 +109,4 @@ fn main() { = Conclusion -#lorem(320) \ No newline at end of file +#lorem(320)