From 1848dad8d2c79367b9fe924f095af9462ae757b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ernesto=20Mart=C3=ADnez=20Garc=C3=ADa?= Date: Tue, 18 Feb 2025 14:22:21 +0000 Subject: [PATCH] definitely-not-isec-thesis:1.0.0 (#1548) --- .../definitely-not-isec-thesis/1.0.0/LICENSE | 21 + .../1.0.0/README.md | 52 ++ .../1.0.0/src/assets/tuglogo.svg | 47 ++ .../1.0.0/src/helper.typ | 34 ++ .../1.0.0/src/lib.typ | 478 ++++++++++++++++++ .../1.0.0/src/packages/acrostiche.typ | 261 ++++++++++ .../1.0.0/src/packages/notations.typ | 255 ++++++++++ .../1.0.0/src/pages/abstract.typ | 20 + .../1.0.0/src/pages/acknowledgements.typ | 9 + .../1.0.0/src/pages/acronyms.typ | 52 ++ .../1.0.0/src/pages/affidavit.typ | 44 ++ .../1.0.0/src/pages/kurzfassung.typ | 17 + .../1.0.0/src/pages/notations.typ | 57 +++ .../1.0.0/src/pages/table-of-contents.typ | 235 +++++++++ .../1.0.0/src/pages/title.typ | 121 +++++ .../1.0.0/template/bibliography.bib | 13 + .../1.0.0/template/thesis.typ | 182 +++++++ .../1.0.0/thumbnail.png | Bin 0 -> 99825 bytes .../1.0.0/typst.toml | 17 + 19 files changed, 1915 insertions(+) create mode 100644 packages/preview/definitely-not-isec-thesis/1.0.0/LICENSE create mode 100644 packages/preview/definitely-not-isec-thesis/1.0.0/README.md create mode 100644 packages/preview/definitely-not-isec-thesis/1.0.0/src/assets/tuglogo.svg create mode 100644 packages/preview/definitely-not-isec-thesis/1.0.0/src/helper.typ create mode 100644 packages/preview/definitely-not-isec-thesis/1.0.0/src/lib.typ create mode 100644 packages/preview/definitely-not-isec-thesis/1.0.0/src/packages/acrostiche.typ create mode 100644 packages/preview/definitely-not-isec-thesis/1.0.0/src/packages/notations.typ create mode 100644 packages/preview/definitely-not-isec-thesis/1.0.0/src/pages/abstract.typ create mode 100644 packages/preview/definitely-not-isec-thesis/1.0.0/src/pages/acknowledgements.typ create mode 100644 packages/preview/definitely-not-isec-thesis/1.0.0/src/pages/acronyms.typ create mode 100644 packages/preview/definitely-not-isec-thesis/1.0.0/src/pages/affidavit.typ create mode 100644 packages/preview/definitely-not-isec-thesis/1.0.0/src/pages/kurzfassung.typ create mode 100644 packages/preview/definitely-not-isec-thesis/1.0.0/src/pages/notations.typ create mode 100644 packages/preview/definitely-not-isec-thesis/1.0.0/src/pages/table-of-contents.typ create mode 100644 packages/preview/definitely-not-isec-thesis/1.0.0/src/pages/title.typ create mode 100644 packages/preview/definitely-not-isec-thesis/1.0.0/template/bibliography.bib create mode 100644 packages/preview/definitely-not-isec-thesis/1.0.0/template/thesis.typ create mode 100644 packages/preview/definitely-not-isec-thesis/1.0.0/thumbnail.png create mode 100644 packages/preview/definitely-not-isec-thesis/1.0.0/typst.toml diff --git a/packages/preview/definitely-not-isec-thesis/1.0.0/LICENSE b/packages/preview/definitely-not-isec-thesis/1.0.0/LICENSE new file mode 100644 index 000000000..f6f6c5efd --- /dev/null +++ b/packages/preview/definitely-not-isec-thesis/1.0.0/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 Ernesto Martínez García + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/preview/definitely-not-isec-thesis/1.0.0/README.md b/packages/preview/definitely-not-isec-thesis/1.0.0/README.md new file mode 100644 index 000000000..50df5b4d1 --- /dev/null +++ b/packages/preview/definitely-not-isec-thesis/1.0.0/README.md @@ -0,0 +1,52 @@ +# ISEC Master's Thesis Template + +An unofficial ISEC TUGraz Master's Thesis template + +Author: Ernesto Martínez García <[ecomaikgolf.com](https://ecomaikgolf.com)> + +> [!NOTE] +> If you are an ISEC or TUGraz employee and want it renamed to `isec-thesis` or +> `tugraz-thesis` I would need an approval to allocate the name :) + +## Design + +Template closely follows [Maria's LaTeX +Template](https://extgit.isec.tugraz.at/castle/student/templates/master-thesis/-/tree/main/thesis) +design from the institute. + +There's a few differences between the original and the Typst version that won't +be changed as I prefer as it is here. Nothing reallty important, just small +typesetting/design choices. Check the reported differences +[here](https://github.com/ecomaikgolf/typst-iaik-master-thesis-template/issues?q=is%3Aissue+is%3Aopen+label%3Adiff) + +## Contributing + +Contribute to the template in the [upstream repository](https://github.com/ecomaikgolf/typst-isec-master-thesis-template) + +Check for [open issues](https://github.com/ecomaikgolf/typst-isec-master-thesis-template/issues) + +## Samples + +![title](https://github.com/user-attachments/assets/62d3eff1-93db-42c7-ae24-8562eea2948e) +![affidavit](https://github.com/user-attachments/assets/b02843dc-507b-4108-9f9f-00a4be13b92e) +![acknowledgements](https://github.com/user-attachments/assets/8ab9dde7-678b-4b59-8a2c-14dc5b0305e2) +![abstract](https://github.com/user-attachments/assets/ca700eb5-3c88-4fef-a62f-c2c6cb81a6a5) +![kurzfassung](https://github.com/user-attachments/assets/ffde8e2d-d3d5-45bd-a188-b4c6b9b5175d) +![contents](https://github.com/user-attachments/assets/6edf6084-2f88-4b61-966d-eec6af2ae403) +![text-content](https://github.com/user-attachments/assets/95d90667-b203-4004-bb73-5f4ca5dc7cd0) +![dummy-content](https://github.com/user-attachments/assets/25db8ec5-05a5-43b5-b649-0bbe0eca4459) +![listings-content](https://github.com/user-attachments/assets/527f041f-3f85-447e-bf8e-f4e6059a0242) +![notation](https://github.com/user-attachments/assets/030cc805-4745-42f7-b404-6f00a66c8442) +![acronyms](https://github.com/user-attachments/assets/96199ddf-4929-4948-b431-78a0d84d431f) +![bibliography](https://github.com/user-attachments/assets/f5afef77-4897-466b-8f38-1a92fc2f8b26) +![appendix](https://github.com/user-attachments/assets/c6e2b758-bb9d-4808-a0cb-3386e5aba9d2) + +## License `src/assets/tuglogo.svg` + +According to Wikipedia: + +> This logo image consists only of simple geometric shapes or text. It does not +> meet the threshold of originality needed for copyright protection, and is +> therefore in the public domain. [...] + +https://en.m.wikipedia.org/wiki/File:TU_Graz.svg diff --git a/packages/preview/definitely-not-isec-thesis/1.0.0/src/assets/tuglogo.svg b/packages/preview/definitely-not-isec-thesis/1.0.0/src/assets/tuglogo.svg new file mode 100644 index 000000000..e5d11afc5 --- /dev/null +++ b/packages/preview/definitely-not-isec-thesis/1.0.0/src/assets/tuglogo.svg @@ -0,0 +1,47 @@ + + + + + + + + + + diff --git a/packages/preview/definitely-not-isec-thesis/1.0.0/src/helper.typ b/packages/preview/definitely-not-isec-thesis/1.0.0/src/helper.typ new file mode 100644 index 000000000..90f912b58 --- /dev/null +++ b/packages/preview/definitely-not-isec-thesis/1.0.0/src/helper.typ @@ -0,0 +1,34 @@ +// -------------------------------------------------------------------------- +// Extra helper functions + +// Fix for typst #311 "Behavior of first line indentation in paragraphs ..." +// https://github.com/typst/typst/issues/311#issuecomment-2023038611 +#let fix-311 = context { + set par.line(numbering: none) + let a = par(box()) + a + v(-0.8 * measure(2 * a).width) +} + +// Transforms content into string +#let content-to-string(content) = { + if content.has("text") { + content.text + } else if content.has("children") { + content.children.map(content-to-string).join("") + } else if content.has("body") { + content-to-string(content.body) + } else if content == [ ] { + " " + } +} + +// partitle simulates \paragraph{title} (more or less) +#let partitle(title: [Title], body) = context [ + #block(above: 0.8cm)[ + *#title* #h(0.3cm) #body + ] + #fix-311 +] + +//vim:tabstop=2 softtabstop=2 shiftwidth=2 noexpandtab colorcolumn=81 diff --git a/packages/preview/definitely-not-isec-thesis/1.0.0/src/lib.typ b/packages/preview/definitely-not-isec-thesis/1.0.0/src/lib.typ new file mode 100644 index 000000000..76bae9408 --- /dev/null +++ b/packages/preview/definitely-not-isec-thesis/1.0.0/src/lib.typ @@ -0,0 +1,478 @@ +#import "pages/title.typ": * +#import "pages/affidavit.typ": * +#import "pages/abstract.typ": * +#import "pages/table-of-contents.typ": * +#import "pages/acknowledgements.typ": * +#import "pages/acronyms.typ": * +#import "pages/notations.typ": * +#import "pages/kurzfassung.typ": * +#import "helper.typ": * + +// Downstream package with extra functionalities +// #import "@preview/acrostiche:0.5.0": * +#import "packages/acrostiche.typ": * // 0.5.0 + patches (untouched API) +#import "packages/notations.typ": * // 0.5.0 + patches (untouched API) + +#let thesis( + title: none, + author: none, + curriculum: none, + supervisors: none, + institute: none, + date: none, + acknowledgements: none, + abstract: none, + kurzfassung: none, + keywords: none, + notations: none, + acronyms: none, + list-of-figures: none, + list-of-tables: none, + list-of-listings: none, + debug: none, + body +) = [ + + // -------------------------------------------------------------------------- + // Debug Options + + #show: rest => if debug { + set par.line(numbering: n => { + text(size: 7pt, red)[#n] + }) + show figure: set par.line(numbering: none) + show figure.caption: set par.line(numbering: n => { + text(size: 7pt, red)[#n] + }) + show raw.where(block: true): set par.line(numbering: none) + show outline: set par.line(numbering: none) + show math.equation: set par.line(numbering: none) + + // Highlight TODOs + show regex("TODO"): m => { highlight(m) } + rest + } else { + rest + } + + // -------------------------------------------------------------------------- + // Citation Hotfix + + // Hotfix to properly cite in abstract + #set cite(style: "alphanumeric") + + // -------------------------------------------------------------------------- + // Acronyms + + #if acronyms != none [ #init-acronyms(acronyms) ] + + #if notations != none [ #init-notations(notations) ] + + // -------------------------------------------------------------------------- + // Text + + #set text(font: "New Computer Modern", lang: "en", region: "US") + + // -------------------------------------------------------------------------- + // PDF Metadata + + // Set document metadata + #set document( + title: title, + author: if type(author) == content { author.text } else { author.at(0).text }, + keywords: content-to-string(keywords.join(", ")) + ) + + // -------------------------------------------------------------------------- + // [CONTENT] Title Page + // - Title page + + #title-page( + title: title, + author: author, + curriculum: curriculum, + supervisors: supervisors, + institute: institute, + date: date + ) + + // -------------------------------------------------------------------------- + // Paragraph + #set par( + justify: true, + leading: 0.54em, + spacing: 0.6em, + first-line-indent: 0.35cm, + linebreaks: "optimized" + ) + + // -------------------------------------------------------------------------- + // Page Header & Footer + // - Show "Chapter 1: Title" and page number in footer + + // Number in page footer + #let page_footer = context [ + #align(center)[ + #counter(page).display("1") + ] + ] + + // Number in page footer (roman numerals) + #let page_footer_roman = context [ + #align(center)[ + #counter(page).display("i") + ] + ] + #let page_footer_descent = 1.4cm + + // Chapter in header if not first page of it + // TODO: probably its much better if it can be reworked into a lambda instead + // of context + queries + #let page_header = context [ + + // "Chapters" that shouldn't show "Chapter 1." counter + #let whtlt = ([Bibliography], [Contents], [List of Figures], + [List of Tables], [List of Listings],) + + // Get the real document page (not page counter) + #let pageNumber = here().page() + // Get all the level 1 headings in the document + #let headings = query(heading.where(level: 1)) + // Match if this page has a level 1 heading + #let isSectionPage = headings.any(it => it.location().page() == pageNumber) + // Get its section name + #let sectionName = query(selector(heading.where(level: 1)) + .before(here())) + + // If it doesn't have a level 1 heading, print text + #if not isSectionPage [ + #align(center)[ + #if sectionName == none or sectionName == () [ + ] else if not whtlt.contains(sectionName.last().body) [ + _Chapter #counter(heading.where(level: 1)).display("1") + #sectionName.last().body _ + ] else [ + _ #sectionName.last().body _ + ] + ] + ] + ] + #let page_header_ascent = 0.85cm + + // -------------------------------------------------------------------------- + // Page + #set page( + numbering: "1", + margin: ( + bottom: 5.33cm, + left: 3.15cm, + right: 3.15cm, + top: 3.7cm, + ), + footer-descent: page_footer_descent, + footer: context [ #page_footer ], + header-ascent: page_header_ascent, + header: context [ #page_header ], + ) + + // -------------------------------------------------------------------------- + // Sections + + // Level 1 heading (Chapter) + #show heading.where(level: 1): set heading(supplement: "Chapter") // for @ref + #show heading.where(level: 1): set text(size: 20pt) + #show heading.where(level: 1): set heading(numbering: "1.") + #show heading.where(level: 1): set par(first-line-indent: 0pt) + #show heading.where(level: 1): it => [ + // TODO: come with a better solution... + #let whtl = ([Bibliography], [Abstract], [Contents], [List of Figures], + [List of Tables], [List of Listings], [Acknowledgements], + [Acronyms], [Notation], + if kurzfassung != none [#kurzfassung.at("title")]) + + // Forced page break (new chapter) + #pagebreak() + + #block(sticky: true)[ + #v(weak: false, 1.75cm) + // Show Chapter + X + #if not whtl.contains(it.body) [ + #it.supplement #counter(heading).display(it.numbering) + #v(0.38cm) + ] + + #it.body + #v(0.65cm) + ] + ] + + // Level 2 heading + #show heading.where(level: 2): set block(above: 0.86cm, below: 0.6cm, + sticky: true) + #show heading.where(level: 2): set text(size: 14pt) + #show heading.where(level: 2): set heading(numbering: "1.1.") + + // Level 3 heading + #show heading.where(level: 3): set block(above: 0.8cm, below: 0.6cm, + sticky: true) + #show heading.where(level: 3): set text(size: 12pt) + #show heading.where(level: 3): set heading(numbering: "1.1.1.") + + // Level 4 heading + #show heading.where(level: 4): set block(above: 0.6cm, below: 0.6cm, + sticky: true) + #show heading.where(level: 4): set text(size: 11pt) + + // -------------------------------------------------------------------------- + // [CONTENT] Document (pre) + // - Affidavit + // - Acknowledgements + // - Abstract + // - Kurzfassung + // - Outline(s): Sections, Figures, Tables, Listings + + #context [ + // Disable showing sections in the outline + #set heading(outlined: false) + // Page footer is in roman numbers + #set page(footer: page_footer_roman) + + // Show affidavit (authoring) page on the second page + #affidavit-page() + + // Show acknowledgements page (starts on page 3) + #acknowledgements-page(acknowledgements) + + // Show abstract page + #abstract-page(abstract, keywords) + + // Show kurzfassung page + #if kurzfassung != none [ + #kurzfassung-page( + kurzfassung.at("title"), + kurzfassung.at("abstract"), + kurzfassung.at("ktitle"), + kurzfassung.at("keywords"), + ) + ] + + // Table of Contents + #toc-page( + list-of-figures: list-of-figures, + list-of-tables: list-of-tables, + list-of-listings: list-of-listings, + ) + ] + + // -------------------------------------------------------------------------- + + #set text(size: 11pt) + #set page(footer: context [ #page_footer ] ) + + // -------------------------------------------------------------------------- + // Figures, Tables, Listings, Equations + + // Figures (General) + + // Reset the counter H per heading: Figure H.N: caption + #show heading.where(level: 1): it => { + counter(figure.where(kind: image)).update(0) + counter(figure.where(kind: table)).update(0) + counter(figure.where(kind: raw)).update(0) + it + } + // Change the nubering to H.N (section.counter) + #set figure(numbering: num => + numbering("1.1", counter(heading).get().first(), num) + ) + // Spacing from next/prev content + #show figure: set block(above: 0.4cm, below: 0.3cm) + // Caption style + #show figure.caption: it => context [ + #v(0.3cm) + #grid( + columns: 2, + gutter: 0cm, + align: left, + box[ + #it.supplement~#it.counter.display()#it.separator + ], + box[ + #align(left)[#it.body] + ], + ) + ] + // Special case for listings (less marging + // TODO: these negative spaces are a bit spaghetti I recognize + #show figure.caption.where(kind: raw): it => context [ + #v(-0.32cm) + #grid( + columns: 2, + gutter: 0cm, + align: left, + box[ + #it.supplement~#it.counter.display()#it.separator + ], + box[ + #align(left)[#it.body] + ], + ) + ] + // Fix #311 issue (paragraph indent) + #show figure: it => context [ + #it + #fix-311 + ] + + // Listings + + #show raw: set text(size: 8pt) + + // Do you want tree-sitter powered syntax highlighting in code blocks? + // Get https://github.com/RubixDev/syntastica-typst :) + + // Set default tab-size (2 for documents) + #set raw(tab-size: 2) + // Code blocks taking full width and with a black border + //#show raw.where(block: true): set block(stroke: black + 0.5pt, + // inset: 0.25cm, width: 100%) + // Show line numbers in gray + #show raw.where(block: true): code => { + show raw.line: line => { + + // Create a box with the size of `size` + let boxsize(size) = [ + #box(width: size)[ + #align(right + horizon)[ + #text(fill: gray)[#line.number] + ] + ] + #line.body + ] + + // Decide the size of the box depending on the numbers of lines of code + context { + let loc = code.lines.first().count + let l1 = measure(text(fill: gray)[0]).width // Get size of a digit + boxsize(l1 * calc.ceil(loc / 10)) // Pad 0 (1 digit) 00 (2 digits) ... + } + } + + v(0.2cm) + grid(gutter: 0pt, align: left, inset: 0pt, columns: (3%, 1fr, 3%), + box[], + block(stroke: 0.5pt + black, inset: 0.25cm, width: 100%, clip: true)[ + #code + ], + box[], + ) + fix-311 + v(0.2cm) + } + + // Equations + + // Reset equation counter per section + #show heading.where(level: 1): it => { + counter(math.equation).update(0) + it + } + + // Set equation counter style + #set math.equation(numbering: num => + (numbering("1.1", counter(heading).get().first(), num)) + ) + + // Style to display the equation block (just to add parenthesis): + // |equation| (S.N) + #show math.equation: eq => { + if eq.block and eq.numbering != none { + let eqCounter = counter(math.equation).at(eq.location()) + let eqNumbering = numbering(eq.numbering, ..eqCounter) + + grid( + // TODO: change this 0pt as its fake. The (1.1) numbering takes more + // space. The issue is that with `auto` the centering of the equation + // will be based on the grid's cell width and not the page width. + columns: (1fr, 0pt), + math.equation(eq.body, block: true, numbering: none), + align(right+ horizon)[(#eqNumbering)], + ) + } else { + eq + } + } + + // -------------------------------------------------------------------------- + // Footnote + + #set footnote.entry( + separator: move(dy: 0.05cm)[#line(length: 40%, stroke: 0.5pt)] + ) + + // -------------------------------------------------------------------------- + // Bibliography & Citations + + #set bibliography(title: "Bibliography") + #set cite(style: "alphanumeric") + #show bibliography: set par(spacing: 0.4cm) + + // -------------------------------------------------------------------------- + // Lists, Enumeration, etc + + // General listing config + #set list(spacing: 1.15em, indent: 0.48cm, body-indent: 0.2em) + // Padding before/after a listing + #show list: set block(above: 0.7cm, below: 0.55cm) + // Thicker bullet points + //#set list(marker: text(15pt, [•], baseline: -5pt)) + //#show list.where(level: 1): set list(marker: text(15pt, [#sym.bullet])) + #set list(marker: ( + move(dy: -0.08cm, text(size: 15pt)[#sym.bullet]), + box[#move(dy: 0.04cm, text(size: 7pt)[#sym.bar.h #h(0.12cm)])], + box[#move(dy: -0.04cm, text(size: 11pt)[#sym.convolve #h(0.12cm)])], + )) + + #show list: l => { + l + fix-311 + } + //#set list(marker: (level) => { + // // move is a hotfix for #1204. Won't work with different sizes/objects, so + // // listing can only be used for regular text for now. + // // https://github.com/typst/typst/issues/1204 + // move(dy: -0.08cm, text(size: 15pt)[#sym.bullet]) + //}) + + + // -------------------------------------------------------------------------- + // [CONTENT] Document (cont) + // - User Sections + // - Acronyms + // - Bibliography + // - User Acronyms + + // Reset counters to start user part of the document + #counter(heading).update(0) + #counter(heading.where(level: 1)).update(0) + #counter(page).update(1) + + #body +] + +#let appendix(body) = { + show heading.where(level: 1): set heading(supplement: "Appendix") + show heading.where(level: 1): set heading(numbering: "A.") + show heading.where(level: 2): set heading(numbering: "A.1.") + show heading.where(level: 3): set heading(numbering: "A.1.1.") + set figure(numbering: num => + numbering("A.1", counter(heading).get().first(), num) + ) + set math.equation(numbering: num => + (numbering("A.1", counter(heading).get().first(), num)) + ) + counter(heading).update(0) + body +} + +//vim:tabstop=2 softtabstop=2 shiftwidth=2 noexpandtab colorcolumn=81 diff --git a/packages/preview/definitely-not-isec-thesis/1.0.0/src/packages/acrostiche.typ b/packages/preview/definitely-not-isec-thesis/1.0.0/src/packages/acrostiche.typ new file mode 100644 index 000000000..c7a8a2301 --- /dev/null +++ b/packages/preview/definitely-not-isec-thesis/1.0.0/src/packages/acrostiche.typ @@ -0,0 +1,261 @@ +// Acrostiche package for Typst +// Author: Grizzly +// License: MIT +// https://typst.app/universe/package/acrostiche + +// Downstream version with extra patches +// TODO: upstream patches +// Patches: ecomaikgolf + +#let acros = state("acronyms",none) +#let init-acronyms(acronyms) = { + let states = (:) + for (acr, defs) in acronyms{ + // Add metadata to each entry. + // first boolean is "is it already defined?", used to know if expansion is needed. + // second boolean is "was it used before in the document?", used for the used-only filtering in the index. + let data = (defs, false, false) + states.insert(acr,data) + } + acros.update(states) +} + +#let display-short(acr, plural: false) = { + // Display the short version of the requested acronym. + // In most cases, the short version is the passed acronym itself. + // In the case of advanced dictionary definitions, the short version is defined with the 'short' and 'short-pl' keys. + context{ + let acronyms = acros.get() + if acr in acronyms{ + let defs = acronyms.at(acr).at(0) + if type(defs) == "dictionary"{ + if plural { + if "short-pl" in defs{ + defs.at("short-pl") + }else{ + [#acr\s] + } + }else{ + if "short" in defs{ + defs.at("short") + }else{acr} + } + }else{ + if plural{ + [#acr\s] + } + else{acr} + } + }else{ + panic("Could not display the short version of an acronym not defined: "+acr) + } + } +} + +#let display-def(acr, plural: false) = { + // Display the definition of an acronym by fetching it in the "acronyms" state's value (should be a dictionary). + // + // First, grab the dictionary of definitions of acronyms from the "acronyms" state + context{ + let acronyms = acros.get() + if acr in acronyms{ + let defs = acronyms.at(acr).at(0) + + // The Definition is a string============ + if type(defs) == "string"{ // If user defined only one version and forgot the trailing comma the type is string + if plural{panic("You requested the plural version of the acronym but it seems like you only provided the singular version in #init-acronyms(dict)")} + else{defs} // All is good, we return the definition found as the singular version + } + + // The Definition is an array ============ + else if type(defs) == "array"{ + if defs.len() == 0{ // The user could have provided an empty array, unlikely but possible. + panic("No definitions found for acronym "+acr+". Make sure it is defined in the dictionary passed to #init-acronyms(dict)") + }else if defs.len() == 1{ // User provided only one version, we make the plural by adding an "s" at the end. + if plural{defs.at(0)+"s"} + else{defs.at(0)} + }else{ // User provided more than one version. We assume the first is singular and the second is plural. All other are useless. + if plural{defs.at(1)} + else{defs.at(0)} + } + + // The Definition is a dictionary ============ + }else if type(defs) == "dictionary"{ + if plural{ + if "long-pl" in defs{ + defs.at("long-pl") + }else{ + panic("The dictionary of definitions supplied for the key "+acr+" does not contain a plural definition with the key 'long-pl'.") + } + }else{ + if "long" in defs{ + defs.at("long") + }else{ + panic("The dictionary of definitions supplied for the key "+acr+" does not contain a cingular definition with the key 'long'.") + } + } + }else{ + panic("Definitions should be a string, an array, or a dictionary. Definition of "+acr+ " is of type: "+type(defs)) + } + }else{ + panic(acr+" is not a key in the acronyms dictionary.") + } + } + +} + +#let mark-acr-used(acr) = { + // Mark an acronym as used. + + // Generate the key associated with this acronym + let state-key = "acronym-state-" + acr + acros.update(data => { + let ndata = data + // Change both booleans to mark it used until reset AND in the overall document. + ndata.at(acr).at(1) = true + ndata.at(acr).at(2) = true + ndata + } + ) +} + +#let acr(acr, plural:false) = { + // Display an acronym in the singular form by default. Expands it if used for the first time. + + // Generate the key associated with this acronym + let state-key = "acronym-state-" + acr + // Test if the state for this acronym already exists and if the acronym was already used + // to choose what to display. + context{ + let data = acros.get() + if acr in data{ + let short = display-short(acr, plural: plural) + if data.at(acr).at(1){ + [#short#label(state-key)] + }else{ + [#display-def(acr, plural: plural)~(#short)#label(state-key)] + } + }else{ + panic("You requested the acronym "+acr+" that you did not define first.") + } + } + mark-acr-used(acr) +} + +#let acrpl(acronym) = {acr(acronym,plural:true)} // argument renamed acronym to differentiate with function acr + +#let acrfull(acr) = { + //Intentionally display an acronym in its full form. Do not update state. + [#display-def(acr, plural: false) (#display-short(acr))] +} + +#let acrfullpl(acr) = { + //Intentionally display an acronym in its full form in plural. Do not update state. + [#display-def(acr, plural: true) (#display-short(acr,plural:true))] +} + +// define shortcuts + + +#let reset-acronym(acr) = { + // Reset a specific acronym. It will be expanded on next use. + context{ + let data = acros.get() + if not acr in data{ + panic("Cannot reset "+acr+", not in the list.") + } + } + + acros.update(data => { + let ndata = data + ndata.at(acr).at(1) = false + ndata + } + ) +} + +#let reset-all-acronyms() = { + // Reset all acronyms. They will all be expanded on the next use. + context{ + let acronyms = acros.get() + for acr in acronyms.keys(){ + reset-acronym(acr) + } + } +} + + +// Define shortcuts +#let acrf(acr) = {acrfull(acr)} +#let acrfpl(acr) = {acrfullpl(acr)} +#let racr(acr) = {reset-acronym(acr)} +#let raacr() = reset-all-acronyms() + +// Define some functions as in the "acronym" package for LaTeX by Tobias Oetiker +// https://ctan.org/pkg/acronym + +#let acresetall = reset-all-acronyms +#let ac = acr +#let acf(acro) = acrf(acro) +#let acfp(acro) = acrfpl(acro) +#let acs(acro) = display-short(acro,plural:false) +#let acsp(acro) = display-short(acro,plural:true) +#let acused(acr) = mark-acr-used(acr) + + + +#let print-index(level: 1, numbering: none, outlined: false, sorted:"", + title:"Acronyms Index", delimiter:":", row-gutter: 2pt, used-only: false) = { + //Print an index of all the acronyms and their definitions. + // Args: + // level: level of the heading. Default to 1. + // outlined: make the index section outlined. Default to false + // sorted: define if and how to sort the acronyms: "up" for alphabetical order, "down" for reverse alphabetical order, "" for no sort (print in the order they are defined). Default to "". + // title: set the title of the heading. Default to "Acronyms Index". Passing an empty string will result in removing the heading. + // delimiter: String to place after the acronym in the list. Defaults to ":" + // used-only: if true, only include in the index the acronyms that are used in the document. Warning, if you reset acronyms and don't used them after, they may not appear. + + // assert on input values to avoid cryptic error messages + assert(sorted in ("","up","down"), message:"Sorted must be a string either \"\", \"up\" or \"down\"") + + if title != ""{ + heading(level: level, numbering: numbering, outlined: outlined)[#title] + } + + context{ + let acronyms = acros.get() + let acr-list = acronyms.keys() + + if used-only{ + // Select only acronyms where state is true at the end of the document. + let acronyms = acros.final() + let used-acr-list = () + for acr in acr-list{ + if acros.final().at(acr).at(2) { + used-acr-list.push(acr) + } + } + acr-list = used-acr-list + } + + // FEATURE: allow ordering by occurences position in the document. Not sure if possible yet. + + // order list depending on the sorted argument + if sorted=="down"{ + acr-list = acr-list.sorted().rev() + }else if sorted=="up"{ + acr-list = acr-list.sorted() + } + + // print the acronyms + grid( + columns: (20%,80%), + row-gutter: row-gutter, + ..for acr in acr-list{ + ([*#display-short(acr, plural:false)#delimiter*], display-def(acr,plural:false)) + } + ) + } +} + +//vim:tabstop=2 softtabstop=2 shiftwidth=2 noexpandtab colorcolumn=81 diff --git a/packages/preview/definitely-not-isec-thesis/1.0.0/src/packages/notations.typ b/packages/preview/definitely-not-isec-thesis/1.0.0/src/packages/notations.typ new file mode 100644 index 000000000..41690ccb8 --- /dev/null +++ b/packages/preview/definitely-not-isec-thesis/1.0.0/src/packages/notations.typ @@ -0,0 +1,255 @@ +// Acrostiche package for Typst +// Author: Grizzly +// License: MIT +// https://typst.app/universe/package/acrostiche + +// Downstream version with extra patches and rename to notation +// Patches: ecomaikgolf + +#let notat = state("notations",none) +#let init-notations(notations) = { + let states = (:) + for (acr, defs) in notations{ + // Add metadata to each entry. + // first boolean is "is it already defined?", used to know if expansion is needed. + // second boolean is "was it used before in the document?", used for the used-only filtering in the index. + let data = (defs, false, false) + states.insert(acr,data) + } + notat.update(states) +} + +#let display-ntt-short(acr, plural: false) = { + // Display the short version of the requested notation. + // In most cases, the short version is the passed notation itself. + // In the case of advanced dictionary definitions, the short version is defined with the 'short' and 'short-pl' keys. + context{ + let notations = notat.get() + if acr in notations{ + let defs = notations.at(acr).at(0) + if type(defs) == "dictionary"{ + if plural { + if "short-pl" in defs{ + defs.at("short-pl") + }else{ + [#acr\s] + } + }else{ + if "short" in defs{ + defs.at("short") + }else{acr} + } + }else{ + if plural{ + [#acr\s] + } + else{acr} + } + }else{ + panic("Could not display the short version of an notation not defined: "+acr) + } + } +} + +#let display-ntt-def(acr, plural: false) = { + // Display the definition of an notation by fetching it in the "notations" state's value (should be a dictionary). + // + // First, grab the dictionary of definitions of notations from the "notations" state + context{ + let notations = notat.get() + if acr in notations{ + let defs = notations.at(acr).at(0) + + // The Definition is a string============ + if type(defs) == "string"{ // If user defined only one version and forgot the trailing comma the type is string + if plural{panic("You requested the plural version of the notation but it seems like you only provided the singular version in #init-notations(dict)")} + else{defs} // All is good, we return the definition found as the singular version + } + + // The Definition is an array ============ + else if type(defs) == "array"{ + if defs.len() == 0{ // The user could have provided an empty array, unlikely but possible. + panic("No definitions found for notation "+acr+". Make sure it is defined in the dictionary passed to #init-notations(dict)") + }else if defs.len() == 1{ // User provided only one version, we make the plural by adding an "s" at the end. + if plural{defs.at(0)+"s"} + else{defs.at(0)} + }else{ // User provided more than one version. We assume the first is singular and the second is plural. All other are useless. + if plural{defs.at(1)} + else{defs.at(0)} + } + + // The Definition is a dictionary ============ + }else if type(defs) == "dictionary"{ + if plural{ + if "long-pl" in defs{ + defs.at("long-pl") + }else{ + panic("The dictionary of definitions supplied for the key "+acr+" does not contain a plural definition with the key 'long-pl'.") + } + }else{ + if "long" in defs{ + defs.at("long") + }else{ + panic("The dictionary of definitions supplied for the key "+acr+" does not contain a cingular definition with the key 'long'.") + } + } + }else{ + panic("Definitions should be a string, an array, or a dictionary. Definition of "+acr+ " is of type: "+type(defs)) + } + }else{ + panic(acr+" is not a key in the notations dictionary.") + } + } + +} + +#let mark-att-used(acr) = { + // Mark an notation as used. + + // Generate the key associated with this notation + let state-key = "notation-state-" + acr + notat.update(data => { + let ndata = data + // Change both booleans to mark it used until reset AND in the overall document. + ndata.at(acr).at(1) = true + ndata.at(acr).at(2) = true + ndata + } + ) +} + +#let ntt(acr, plural:false) = { + // Display an notation in the singular form by default. Expands it if used for the first time. + + // Generate the key associated with this notation + let state-key = "notation-state-" + acr + // Test if the state for this notation already exists and if the acronym was already used + // to choose what to display. + context{ + let data = notat.get() + if acr in data{ + text(size: 11pt)[#data.at(acr).at(0).at(0)#label(state-key)] + }else{ + panic("You requested the notation "+acr+" that you did not define first.") + } + } + mark-att-used(acr) +} + +#let nttpl(notation) = {acr(acronym,plural:true)} // argument renamed acronym to differentiate with function acr + +#let nttfull(acr) = { + //Intentionally display an notation in its full form. Do not update state. + [#display-def(acr, plural: false) (#display-ntt-short(acr))] +} + +#let nttfullpl(acr) = { + //Intentionally display an notation in its full form in plural. Do not update state. + [#display-def(acr, plural: true) (#display-ntt-short(acr,plural:true))] +} + +// define shortcuts + + +#let reset-notation(acr) = { + // Reset a specific notation. It will be expanded on next use. + context{ + let data = notat.get() + if not acr in data{ + panic("Cannot reset "+acr+", not in the list.") + } + } + + notat.update(data => { + let ndata = data + ndata.at(acr).at(1) = false + ndata + } + ) +} + +#let reset-all-notations() = { + // Reset all notations. They will all be expanded on the next use. + context{ + let notations = notat.get() + for acr in notations.keys(){ + reset-notation(acr) + } + } +} + + +// Define shortcuts +#let nttf(acr) = {acrfull(acr)} +#let nttfpl(acr) = {acrfullpl(acr)} +#let rntt(acr) = {reset-notation(acr)} +#let rantt() = reset-all-notations() + +// Define some functions as in the "notation" package for LaTeX by Tobias Oetiker +// https://ctan.org/pkg/notation + +#let acresetall = reset-all-notations +#let ac = ntt +#let acf(acro) = acrf(acro) +#let acfp(acro) = acrfpl(acro) +#let acs(acro) = display-ntt-short(acro,plural:false) +#let acsp(acro) = display-ntt-short(acro,plural:true) +#let acused(acr) = mark-att-used(acr) + + + +#let print-index-ntt(level: 1, numbering: none, outlined: false, sorted:"", + title:"notations Index", delimiter:":", row-gutter: 2pt, used-only: false) = { + //Print an index of all the notations and their definitions. + // Args: + // level: level of the heading. Default to 1. + // outlined: make the index section outlined. Default to false + // sorted: define if and how to sort the notations: "up" for alphabetical order, "down" for reverse alphabetical order, "" for no sort (print in the order they are defined). Default to "". + // title: set the title of the heading. Default to "notations Index". Passing an empty string will result in removing the heading. + // delimiter: String to place after the notation in the list. Defaults to ":" + // used-only: if true, only include in the index the notations that are used in the document. Warning, if you reset notations and don't used them after, they may not appear. + + // assert on input values to avoid cryptic error messages + assert(sorted in ("","up","down"), message:"Sorted must be a string either \"\", \"up\" or \"down\"") + + if title != ""{ + heading(level: level, numbering: numbering, outlined: outlined)[#title] + } + + context{ + let notations = notat.get() + let acr-list = notations.keys() + + if used-only{ + // Select only notations where state is true at the end of the document. + let notations = notat.final() + let used-acr-list = () + for acr in acr-list{ + if notat.final().at(acr).at(2) { + used-acr-list.push(acr) + } + } + acr-list = used-acr-list + } + + // FEATURE: allow ordering by occurences position in the document. Not sure if possible yet. + + // order list depending on the sorted argument + if sorted=="down"{ + acr-list = acr-list.sorted().rev() + }else if sorted=="up"{ + acr-list = acr-list.sorted() + } + + // print the notations + grid( + columns: (20%,80%), + row-gutter: row-gutter, + ..for acr in acr-list{ + ([*#display-ntt-short(acr, plural:false)#delimiter*], display-def(acr,plural:false)) + } + ) + } +} + +//vim:tabstop=2 softtabstop=2 shiftwidth=2 noexpandtab colorcolumn=81 diff --git a/packages/preview/definitely-not-isec-thesis/1.0.0/src/pages/abstract.typ b/packages/preview/definitely-not-isec-thesis/1.0.0/src/pages/abstract.typ new file mode 100644 index 000000000..474faca2c --- /dev/null +++ b/packages/preview/definitely-not-isec-thesis/1.0.0/src/pages/abstract.typ @@ -0,0 +1,20 @@ +#let abstract-page(abstract, keywords) = [ + + = Abstract + + // TODO add first-line-indent: 1em? + // In LaTeX the fist one doesn't have it, the rest yes + // but the first line in the latex one I think its not intended to stay there + #abstract + + #v(0.53cm) + + // TODO improve the spacing between keywords and the actual keywords + // TODO mayube + #par(first-line-indent:0pt)[ + *Keywords:* #h(0.3cm) #keywords.join(" · ") + ] + +] + +// vim:tabstop=2 softtabstop=2 shiftwidth=2 noexpandtab colorcolumn=81 diff --git a/packages/preview/definitely-not-isec-thesis/1.0.0/src/pages/acknowledgements.typ b/packages/preview/definitely-not-isec-thesis/1.0.0/src/pages/acknowledgements.typ new file mode 100644 index 000000000..fe38bd837 --- /dev/null +++ b/packages/preview/definitely-not-isec-thesis/1.0.0/src/pages/acknowledgements.typ @@ -0,0 +1,9 @@ +#let acknowledgements-page(acknowledgements) = [ + + = Acknowledgements + + #acknowledgements + +] + +// vim:tabstop=2 softtabstop=2 shiftwidth=2 noexpandtab colorcolumn=81 diff --git a/packages/preview/definitely-not-isec-thesis/1.0.0/src/pages/acronyms.typ b/packages/preview/definitely-not-isec-thesis/1.0.0/src/pages/acronyms.typ new file mode 100644 index 000000000..69c3f5638 --- /dev/null +++ b/packages/preview/definitely-not-isec-thesis/1.0.0/src/pages/acronyms.typ @@ -0,0 +1,52 @@ +#let acronyms-page(acros) = context [ + #let acronym = acros.get() + #if acronym != none [ + + = Acronyms + + #v(0.4cm) + #context [ + #show grid: set block(above: 0cm, below: 0.5cm) + + #let pad = acronym.keys().map(a => { + (measure(a).width).cm() + }).sorted().last() * 1cm + + #for a in acronym [ + #let acr = a.at(0) + + #let state-key = "acronym-state-" + acr + #let locs = query(label(state-key)) + + #let cmp = a.at(1).at(0) + #grid(gutter: 0pt, columns: (1.4cm, pad, 0.4cm, 8.6cm, 0.65cm, auto), + block[ + // Spacing + ], + block[ + #acr + ], + block[ + // Spacing + ], + block[ + #cmp + ], + block[ + + ], + block[ + #if not (locs == none or locs == ()) [ + #locs.map( + l => counter(page).at(l.location())).flatten().map( + l => str(l) + ).join(", ") + ] + ], + ) + ] + ] + ] +] + +// vim:tabstop=2 softtabstop=2 shiftwidth=2 noexpandtab colorcolumn=81 diff --git a/packages/preview/definitely-not-isec-thesis/1.0.0/src/pages/affidavit.typ b/packages/preview/definitely-not-isec-thesis/1.0.0/src/pages/affidavit.typ new file mode 100644 index 000000000..af9bc4cda --- /dev/null +++ b/packages/preview/definitely-not-isec-thesis/1.0.0/src/pages/affidavit.typ @@ -0,0 +1,44 @@ +#let affidavit-page() = [ + #set page( + margin: ( + bottom: 2.6cm, + left: 4.1cm, + right: 4.1cm, + top: 10.25cm, + ), + footer: none, + header: none, + ) + + #align(center)[ + #text(size: 12pt)[ + *AFFIDAVIT* + ] + ] + + #v(0.95cm) + #block[ + #par[ + I declare that I have authored this thesis independently, that I have not + used other than the declared sources/resources, and that I have explicitly + indicated all material which has been quoted either literally or by content + from the sources used. The text document uploaded to TUGRAZonline is + identical to the present master's thesis. + ] + ] + + #v(3.07cm) + + #line(length: 100%, stroke: 0.5pt) + + #v(-0.1cm) // TODO: refactor + + #align(center)[ + #text(size: 8pt)[ + Date, Signature + ] + ] + +] + +// vim:tabstop=2 softtabstop=2 shiftwidth=2 noexpandtab colorcolumn=81 diff --git a/packages/preview/definitely-not-isec-thesis/1.0.0/src/pages/kurzfassung.typ b/packages/preview/definitely-not-isec-thesis/1.0.0/src/pages/kurzfassung.typ new file mode 100644 index 000000000..e766b195c --- /dev/null +++ b/packages/preview/definitely-not-isec-thesis/1.0.0/src/pages/kurzfassung.typ @@ -0,0 +1,17 @@ +#let kurzfassung-page(ku-title, ku-abstract, ku-ktitle, ku-keywords) = [ + + = #ku-title + + #ku-abstract + + #v(0.53cm) + + // TODO improve the spacing between keywords and the actual keywords + // TODO mayube + #par(first-line-indent:0pt)[ + *#ku-ktitle:* #h(0.3cm) #ku-keywords.join(" · ") + ] + +] + +// vim:tabstop=2 softtabstop=2 shiftwidth=2 noexpandtab colorcolumn=81 diff --git a/packages/preview/definitely-not-isec-thesis/1.0.0/src/pages/notations.typ b/packages/preview/definitely-not-isec-thesis/1.0.0/src/pages/notations.typ new file mode 100644 index 000000000..78960f813 --- /dev/null +++ b/packages/preview/definitely-not-isec-thesis/1.0.0/src/pages/notations.typ @@ -0,0 +1,57 @@ +#let notations-page(notat) = context [ + #let notation = notat.get() + #if notation != none [ + + = Notation + + #v(0.2cm) + #context [ + #show grid: set block(above: 0cm, below: 0.5cm) + + #let pad = notation.keys().map(a => { + (measure(a).width).cm() + }).sorted().last() * 1cm + + #for a in notation [ + #let acr = a.at(0) + + #let state-key = "notation-state-" + acr + #let locs = query(label(state-key)) + + #let cmp = a.at(1).at(0) + #grid(gutter: 0pt, columns: (1.4cm, pad, 0.4cm, 8.6cm, 0.65cm, auto), + block[ + // Spacing + ], + block(height: 0.5cm, width: 100%)[ + #align(center + horizon)[ + #cmp.at(0) + ] + ], + block[ + // Spacing + ], + block(height: 0.5cm)[ + #align(left + horizon)[ + #cmp.at(1) + ] + ], + block[ + + ], + block(height: 0.5cm)[ + #if not (locs == none or locs == ()) [ + #locs.map( + l => counter(page).at(l.location())).flatten().map( + l => str(l) + ).join(", ") + ] + ], + ) + #v(-0.3cm) + ] + ] + ] +] + +// vim:tabstop=2 softtabstop=2 shiftwidth=2 noexpandtab colorcolumn=81 diff --git a/packages/preview/definitely-not-isec-thesis/1.0.0/src/pages/table-of-contents.typ b/packages/preview/definitely-not-isec-thesis/1.0.0/src/pages/table-of-contents.typ new file mode 100644 index 000000000..308a61dbf --- /dev/null +++ b/packages/preview/definitely-not-isec-thesis/1.0.0/src/pages/table-of-contents.typ @@ -0,0 +1,235 @@ +#import "../helper.typ": * + +// Sections that shouldn't show the section number +#let whtl = ([Bibliography], [Acronyms], [Notation],) +#let ruler = context box(width: 1fr)[ + + #let spacing = 8 + + #let x = here().position().x.pt() + #let d = calc.trunc((x / spacing) + 1) * spacing + #let p = (d - x) * 1pt + + #grid(gutter: 0pt, columns: (p, auto), + box[ + ], + repeat[ + #box(width: spacing * 1pt)[ + #box(width: (spacing/2) * 1pt)[.] #h((spacing/2) * 1pt) + ] + ], + ) +] + +#let print-trimmed(cap) = [ + #let num = 55 + #let c = cap //content-to-string(cap) + #if c.len() > num [ + #let tr = c.slice(0, num).split(" ").slice(0, -1).join(" ") + #tr #text(size: 9pt, "(...)") + ] else [ + #c + ] +] + +#let toc-page( + list-of-figures: true, + list-of-tables: true, + list-of-listings: true, +) = [ + + // Disable spacing between grid & content + #show grid: set block(above: 0cm, below: 0cm) + + // --------------------------------------------------------------------------- + // Sections + + // Style of Level 1 Sections + #show outline.entry.where(level: 1): it => [ + + #show grid: set block(above: 0.38cm, below: 0cm) + + #let loc = it.element.location() + #let sec = it.body.children.slice(0).at(0) + #let name = it.body.children.slice(0).at(2) + #let page = it.page + + // 1. Section Name 12 + #link(loc, + strong[ + #grid(columns: (if whtl.contains(name) {-0.3cm} else {0.3cm}, + 0.28cm, 1fr, auto), gutter: 0pt, rows: 1, + box[ + #if not whtl.contains(name) [ #sec ] + ], + box[ + // Spacing + ], + box[ + #name + ], + box[ + #page + ], + ) + ] + ) + ] + + // Style of Level 2 Sections + #show outline.entry.where(level: 2): it => [ + + #show grid: set block(above: -0.06cm, below: 0cm) + + #let loc = it.element.location() + #let sec = it.body.children.slice(0).at(0) + #let name = it.body.children.slice(0).at(2) + #let page = it.page + + // 1.1. Subsection Name . . . . . . . . . . . . . . . . . . . . . . 12 + #link(loc, + grid(columns: (0.65cm, auto, 0.3cm, auto, 0.1cm, 1fr, 0.35cm, auto), + gutter: 0pt, rows: 1, + box[ + // Spacing + ], + box[ + #sec + ], + box[ + // Spacing + ], + box[ + #name + ], + box[ + + ], + box[ + #ruler + ], + box[ + // Spacing + ], + box[ + #page + ] + ) + ) + ] + + // Style of Level 3 Sections + #show outline.entry.where(level: 3): it => [ + + #show grid: set block(above: -0.06cm, below: 0cm) + + #let loc = it.element.location() + #let sec = it.body.children.slice(0).at(0) + #let name = it.body.children.slice(0).at(2) + #let page = it.page + + #link(loc, + grid(columns: (1.6cm, auto, 0.3cm, auto, 0.1cm, 1fr, 0.45cm, auto), + gutter: 0pt, rows: 1, + box[ + // Spacing + ], + box[ + #sec + ], + box[ + // Spacing + ], + box[ + #name + ], + box[ + // Spacing + ], + box[ + #ruler + ], + box[ + // Spacing + ], + box[ + #page + ] + ) + ) + ] + + // Show it in the document + #outline( + title: "Contents", + depth: 3 + ) + + // ----------------------------------------------------------------------------- + // Figures + + // Style of Level 1 Figures + #show outline.entry.where(level: 1): it => [ + #let loc = it.element.location() + #let sec = it.body.children.slice(0).at(2) + #let cap = it.body.children.slice(0).slice(4) + #let page = it.page + + // 1.1. Figure Caption . . . . . . . . . . . . . . . . . . . . . . . . . 12 + #link(loc, + grid(columns: (0.6cm, auto, 0.2cm, auto, 0.15cm, 1fr, 0.2cm, auto), + gutter: 0pt, rows: 1, + box[ + // Spacing + ], + box[ + #sec. + ], + box[ + // Spacing + ], + box[ + #print-trimmed(cap.map(content-to-string).join("")) + ], + box[ + // Spacing + ], + box[ + #ruler + ], + box[ + // Spacing + ], + box[ + #page + ], + ) + ) + ] + + #if list-of-figures [ + // Outline (of Figures) + #outline( + title: "List of Figures", + target: figure.where(kind: image) + ) + ] + + #if list-of-tables [ + // Outline (of Tables) + #outline( + title: "List of Tables", + target: figure.where(kind: table), + ) + ] + + #if list-of-listings [ + // Outline (of Tables) + #outline( + title: "List of Listings", + target: figure.where(kind: raw), // Code has to be wrapped in a figure + ) + ] +] + +// vim:tabstop=2 softtabstop=2 shiftwidth=2 noexpandtab colorcolumn=81 diff --git a/packages/preview/definitely-not-isec-thesis/1.0.0/src/pages/title.typ b/packages/preview/definitely-not-isec-thesis/1.0.0/src/pages/title.typ new file mode 100644 index 000000000..3616bfe2b --- /dev/null +++ b/packages/preview/definitely-not-isec-thesis/1.0.0/src/pages/title.typ @@ -0,0 +1,121 @@ +#let title-page( + title: [], + author: (), + curriculum: [], + supervisors: (), + institute: [], + date: [], +) = [ + + #set page( + margin: ( + // Original LaTeX is 2.7 but with 2.6 we get "Graz, Month Date" lower to + // get a perfect visual match + bottom: 2.6cm, + left: 2.5cm, + right: 2.5cm, + top: 1.5cm, + ), + header: none, + footer: none, + ) + + #set align(center) + + #set par( + leading: 12pt, // \linespread{1.2} + ) + + // TODO maybe use absolute positioning + #v(0.26cm) + #image( + // TODO get the proper coloring of the logo, looks different + "../assets/tuglogo.svg", + width: 3.2cm, + height: 1.1cm, + ) + + #set text(font: "New Computer Modern") + + // TODO: impleent the baseline skip + // Author: 14pt 16pt + #v(2.83cm) + #text(size: 14pt)[ + #if type(author) == content [ #author ] else [ #author.join(", ") ] + ] + + + // TODO set only for title + #set par( + leading: 12pt, // \linespread{1.2} + ) + // TODO: this text is smaller than in the template! + // Author: 16pt 20pt + #v(1.15cm) + #box(width: 100%, height: 3cm)[ + #par(leading: 12.5pt)[ + #text(size: 17pt)[ + *#title* + ] + ] + ] + + #set par(spacing: 0.80em) + + #v(5.05cm) + #text(size: 12pt)[*MASTER'S THESIS*] + + #par[ + to achieve the university degree of + + Diplom-Ingenieur(in) + + Master's degree programme: #curriculum + ] + + #v(1.15cm) + + #text(size: 10pt)[ + submitted to + ] + + #v(0.1cm) + + #text(size: 12pt)[ + *Graz University of Technology* + ] + + #v(1.23cm) + + // Display Supervisor/Supervisors text dynamically + #text(size: 10pt)[ + #if supervisors.len() <= 1 [ *Supervisor* ] else [ *Supervisors* ] + ] + + #v(0.05cm) + + // Display suppervisors dynamically + #box(width: 100%, height: 0.81cm)[ + #set text(size: 10pt) + #for sup in supervisors [ + #if type(sup) == content [ #sup ] else [ #sup.join(", ") ] + #parbreak() + ] + ] + + #v(0.14cm) + + #text(size: 10pt)[ + #institute + ] + + #v(1.51cm) + + #text(size: 8pt)[ + Graz, #date + ] + + #pagebreak() +] + +// vim:tabstop=2 softtabstop=2 shiftwidth=2 noexpandtab colorcolumn=81 diff --git a/packages/preview/definitely-not-isec-thesis/1.0.0/template/bibliography.bib b/packages/preview/definitely-not-isec-thesis/1.0.0/template/bibliography.bib new file mode 100644 index 000000000..84978600b --- /dev/null +++ b/packages/preview/definitely-not-isec-thesis/1.0.0/template/bibliography.bib @@ -0,0 +1,13 @@ +// You can use LaTeX's bibliography format per default +// or +// Typst's Hayagriva: +// https://github.com/typst/hayagriva/blob/main/docs/file-format.md + +@software{emg25template, + author = {Ernesto Martínez García}, + year = {2025}, + month = {1}, + title = {{Typst ISEC Master's Thesis Template}}, + url = {https://github.com/ecomaikgolf/typst-isec-master-thesis-template}, + urldate = {2025-01-01} +} // Update urldate! diff --git a/packages/preview/definitely-not-isec-thesis/1.0.0/template/thesis.typ b/packages/preview/definitely-not-isec-thesis/1.0.0/template/thesis.typ new file mode 100644 index 000000000..75af39076 --- /dev/null +++ b/packages/preview/definitely-not-isec-thesis/1.0.0/template/thesis.typ @@ -0,0 +1,182 @@ +#import "@preview/definitely-not-isec-thesis:1.0.0": * + +// ---------------------------------------------------------------------------- +// Configuration +// ---------------------------------------------------------------------------- +#show: thesis.with( + title: [ + Title and #linebreak() + Subtitle #linebreak() + of the Thesis #linebreak() + (up to 4 Lines) #linebreak() + ], + author: ([Firstname Lastname], [BSc]), + curriculum: [Computer Science], + supervisors: ( + ([Firstname Lastname], [Academic Degrees]), + ([Firstname Lastname], [Academic Degrees]) + ), + institute: [Institute of Information Security], + date: [Month Year], + acknowledgements: [ + Thanks everyone who made this thesis possible + ], + abstract: [ + English abstract of your thesis (at most one page) + + The abstract usually consists of two main parts: a motivational background + and your contribution. Start with a few sentences of general introduction + and background information to motivate your main research + question/challenge. Then, summarize what your paper contributes and + describe its (potential) impact. This includes a very short summary of all + your important results and core performance numbers that characterize your + approach/attack/countermeasure/implementation. Finally, summarize any key + conclusions and calls to action that you have, e.g., apply the idea more + broadly, get rid of some technology, find a countermeasure, or similar. + ], + kurzfassung: ( // Multi-language support. Set to none to disable. + "title": [Kurzfassung], + "abstract": [ + Deutsche Kurzfassung der Abschlussarbeit (maximal eine Seite) + ], + "ktitle": [Schlagwörter], + "keywords": ([Einige Stichwörter...],), + ), + keywords: ([Broad keyword], [Keyword], [Specific Keyword], + [Another specific keyword]), + notations: (( + "xor": ([#sym.xor.big], "exclusive-or (Xor)"), + )), + acronyms: (( + "ISEC": "Institute of Information Security", + )), + list-of-figures: true, + list-of-tables: true, + list-of-listings: true, // Wrap code in #figure + debug: false, // Enable once before a revision (slow) +) + +// -------------------------------[[ CUT HERE ]]-------------------------------- +// +// Welcome to the starting point of your final Master Thesis :) Congrats! +// +// Typst quickstart: +// +// - $ typst watch thesis.typ (Incremental build, recommended) +// - $ typst compile thesis.typ (Plain build, not recommended for editing) +// - * tinymist :TypstPreview (neovim) or VSCode plugin (Best for live preview) +// +// Typst documentation, guides & help: +// +// - https://typst.app/docs/ +// - https://sitandr.github.io/typst-examples-book/book/about.html +// - https://discord.gg/2uDybryKPe +// - https://forum.typst.app/ +// +// Typst LSP: +// +// - https://github.com/Myriad-Dreamin/tinymist +// - https://marketplace.visualstudio.com/items?itemName=myriad-dreamin.tinymist +// +// Typst plugins: +// +// - https://typst.app/universe/ +// - https://github.com/qjcg/awesome-typst +// +// Recommendations: +// +// - Keep code/text formatted at 80 cols as in this example +// - Use tinymist for previewing changes (faster than typst watch) +// - Force #pagebreak() if your document is long. This triggers multithr. builds +// - Keep in mind Typst breaks API for now (still 0.X.X), so update or freeze +// +// Bugs, limitations, differences: +// +// - Upstream: https://github.com/ecomaikgolf/typst-isec-masterthesis-template +// - Check "Issues" in the upstream, report bugs there +// - Feel free to send patches +// +// Now that you know everything important, I recommend removing this comment +// +// Happy writing and good luck defending! +// Ernesto - ecomaikgolf.com +// +// -------------------------------[[ CUT HERE ]]-------------------------------- + + +// ---------------------------------------------------------------------------- +// Introduction +// ---------------------------------------------------------------------------- + += Introduction + + +// ---------------------------------------------------------------------------- +// Background +// ---------------------------------------------------------------------------- + += Background + + +// ---------------------------------------------------------------------------- +// Attack +// ---------------------------------------------------------------------------- + += Attack + + +// ---------------------------------------------------------------------------- +// Evaluation +// ---------------------------------------------------------------------------- + += Evaluation + + +// ---------------------------------------------------------------------------- +// Discussion +// ---------------------------------------------------------------------------- + += Discussion + + +// ---------------------------------------------------------------------------- +// Notation +// ---------------------------------------------------------------------------- + +// - Set notations: none in thesis.with to disable this page (or remove this) +// - TLDR: #ntt("xor") from thesis.with notations +// - Downstream "acrostiche" package with patches for notations + page numbers + +#notations-page(notat) + +// ---------------------------------------------------------------------------- +// Acronyms +// ---------------------------------------------------------------------------- + +// - Set acronyms: none in thesis.with to disable this page (or remove this) +// - TLDR: #acr("AES") from the thesis.with acronyms +// - Downstream "acrostiche" package with patches for listing page numbers +// - See https://typst.app/universe/package/acrostiche/ for documentation + +#acronyms-page(acros) + +// ---------------------------------------------------------------------------- +// Bibliography +// ---------------------------------------------------------------------------- + +// - Use bibtex (LaTeX) or hayagriva YAML (Typst) bibliography files +// - See https://typst.app/docs/reference/model/cite/ +// - See https://typst.app/docs/reference/model/bibliography/ +// - TLDR: @biblabel OR #cite(form: ..., biblabel) + +#bibliography("bibliography.bib") + +// ---------------------------------------------------------------------------- +// Appendix (Optional) +// ---------------------------------------------------------------------------- +#show: appendix + += Code Listings + + +// vim:tabstop=2 softtabstop=2 shiftwidth=2 noexpandtab colorcolumn=81 diff --git a/packages/preview/definitely-not-isec-thesis/1.0.0/thumbnail.png b/packages/preview/definitely-not-isec-thesis/1.0.0/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..c865493ea03f6a92ea1eb652e491c8853deb9e29 GIT binary patch literal 99825 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 ff4x`V1u4ATr@idmBcYfur"] +license = "MIT" +description = "An unofficial ISEC TUGraz Master's Thesis template" +repository = "https://github.com/ecomaikgolf/typst-isec-master-thesis-template/" +categories = ["thesis"] +disciplines = ["computer-science", "engineering"] +keywords = ["ISEC", "Institute of Information Security", "IAIK", "TUGraz", "Graz University of Technology", "thesis", "template", "Master Thesis"] +compiler = "0.12.0" + +[template] +path = "template" +entrypoint = "thesis.typ" +thumbnail = "thumbnail.png"