From 641ebc811739e64c9e9d68242da64a7c280a50f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joshua=20H=C3=BCrzeler?= Date: Sat, 31 Aug 2024 12:45:05 +0200 Subject: [PATCH] First Version of Template --- .DS_Store | Bin 0 -> 6148 bytes .gitattributes | 5 + .github/dependabot.yml | 12 ++ .github/workflows/build-release-thesis.yml | 47 +++++ .github/workflows/build-typst.yml | 18 ++ .gitignore | 1 + LICENSE | 32 +++ README.md | 118 +++++++++++ content/01_content.typ | 5 + content/02_content.typ | 4 + content/abstract.typ | 7 + content/acknowledgement.typ | 7 + content/appendix.typ | 1 + content/transparency_ai_tools.typ | 22 +++ figures/tum_logo.png | 3 + figures/unisg_logo.png | Bin 0 -> 11288 bytes layout/abstract.typ | 27 +++ layout/disclaimer.typ | 38 ++++ layout/thesis_template.typ | 218 +++++++++++++++++++++ layout/titlepage.typ | 54 +++++ layout/transparency_ai_tools.typ | 25 +++ metadata.typ | 9 + thesis.bib | 6 + thesis.typ | 22 +++ utils/feedback.typ | 25 +++ utils/formfield.typ | 9 + utils/pageref.typ | 15 ++ utils/print_page_break.typ | 7 + utils/table.typ | 0 utils/todo.typ | 10 + 30 files changed, 747 insertions(+) create mode 100644 .DS_Store create mode 100644 .gitattributes create mode 100644 .github/dependabot.yml create mode 100644 .github/workflows/build-release-thesis.yml create mode 100644 .github/workflows/build-typst.yml create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 content/01_content.typ create mode 100644 content/02_content.typ create mode 100644 content/abstract.typ create mode 100644 content/acknowledgement.typ create mode 100644 content/appendix.typ create mode 100644 content/transparency_ai_tools.typ create mode 100644 figures/tum_logo.png create mode 100644 figures/unisg_logo.png create mode 100644 layout/abstract.typ create mode 100644 layout/disclaimer.typ create mode 100644 layout/thesis_template.typ create mode 100644 layout/titlepage.typ create mode 100644 layout/transparency_ai_tools.typ create mode 100644 metadata.typ create mode 100644 thesis.bib create mode 100644 thesis.typ create mode 100644 utils/feedback.typ create mode 100644 utils/formfield.typ create mode 100644 utils/pageref.typ create mode 100644 utils/print_page_break.typ create mode 100644 utils/table.typ create mode 100644 utils/todo.typ diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..44f43fcbfb2bc8597ee6f56d2a9412a6d2e7a030 GIT binary patch literal 6148 zcmeHK%Sr=55Ukdq0WUdvoL}${mJq)nKj0%O!oq?{4&L_Ucll|lejtX8c=96E&{H!# zT{BD_wzmP;a=*C&769gSM|}7&HQ#ri*jYs!EzWqu6SkY}WB)KrvQGz`dx>Yf;stwr z;}5+PF3{s1?-;nb%Y$>{^l6Gp0VyB_q<|EV0>3H1n(a2fO4KL?q<|FoQoz3tjqcbL zj*0Q<;1DeUamH{M=g~_Ln+J$p;h4w>&5}w?s#S|&NoTxOURO9KCLI +``` + +5. Commit the Merge +After resolving conflicts and adding the resolved files, commit the merge: +```sh +git commit -m "Merge updates from Typst Thesis Template" +``` + +6. Push the Changes to Your Repository +Finally, push the merged changes to your repository: +```sh +git push origin +``` + +## Working with the Typst Web Editor +If you prefer an integrated IDE-like experience with autocompletion and instant preview, the Typst web editor allows you to import files directly into a new or existing document. Here's how you can do this: + +1. Navigate to the [Typst Web Editor](https://typst.app/). +2. Create a new blank document. +3. Click on "File" on the top left menu, then "Upload File". +4. Select all .typ and .bib files along with the figures provided in this template repository. + +**Note:** You can select multiple files to import. The editor will import and arrange all the files accordingly. Always ensure you have all the necessary .typ, .bib, and figures files you need for your document. + +## Working with VS Code +If you prefer to have a more integrated experience with your favorite code editor, you can use the Typst VS Code extension. The extension provides syntax highlighting, autocompletion, and error checking for Typst files. You can install the extension from the [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=nvarner.typst-lsp). + +1. Open your project in VS Code +2. Set the correct file (`thesis.typ` or `proposal.typ`) as the main file. This can be done by opening the respective file and running the command `Typst: Pin the main file to the currently opened document`. Just hit `CMD + Shift + P` and search for the command. + + +--- +## Further Resources + +- [Typst Documentation](https://typst.app/docs/) +- [Typst Guide for LaTeX Users](https://typst.app/docs/guides/guide-for-latex-users/) +- [Typst VS Code Extension (inofficial)](https://marketplace.visualstudio.com/items?itemName=nvarner.typst-lsp) diff --git a/content/01_content.typ b/content/01_content.typ new file mode 100644 index 0000000..f9a2867 --- /dev/null +++ b/content/01_content.typ @@ -0,0 +1,5 @@ += Heading 1 +== Heading 2 +=== Heading 3 +==== Heading 4 +This is a biblography cite: #cite() \ No newline at end of file diff --git a/content/02_content.typ b/content/02_content.typ new file mode 100644 index 0000000..bf61a12 --- /dev/null +++ b/content/02_content.typ @@ -0,0 +1,4 @@ += Heading 1 +== Heading 2 +=== Heading 3 +==== Heading 4 \ No newline at end of file diff --git a/content/abstract.typ b/content/abstract.typ new file mode 100644 index 0000000..e07e7f0 --- /dev/null +++ b/content/abstract.typ @@ -0,0 +1,7 @@ +#import "/utils/todo.typ": TODO + +#TODO[ + 1. *paragraph:* What is the motivation of your thesis? Why is it interesting from a scientific point of view? Which main problem do you like to solve? + 2. *paragraph:* What is the purpose of the document? What is the main content, the main contribution? + 3. *paragraph:* What is your methodology? How do you proceed? + ] \ No newline at end of file diff --git a/content/acknowledgement.typ b/content/acknowledgement.typ new file mode 100644 index 0000000..8f68fff --- /dev/null +++ b/content/acknowledgement.typ @@ -0,0 +1,7 @@ +First, I'd like to thank coffee for fueling my brain cells and making this thesis possible. + +A big shoutout to my advisor for your patience and for not laughing (too hard) at my wild ideas. + +To my family, your snack supplies and constant reminders to "just finish it already" were invaluable. + +Finally, to my pet, your keyboard sit-ins ensured I took breaks, whether I wanted to or not. \ No newline at end of file diff --git a/content/appendix.typ b/content/appendix.typ new file mode 100644 index 0000000..8623209 --- /dev/null +++ b/content/appendix.typ @@ -0,0 +1 @@ +-- Supplementary Material -- \ No newline at end of file diff --git a/content/transparency_ai_tools.typ b/content/transparency_ai_tools.typ new file mode 100644 index 0000000..c85b8de --- /dev/null +++ b/content/transparency_ai_tools.typ @@ -0,0 +1,22 @@ +#import "/utils/todo.typ": TODO +#import "/utils/pageref.typ": pageref + +#TODO[ + Update this paragraph to reflect the tools you used in your thesis. Please see Guide in #link("https://universitaetstgallen.sharepoint.com/sites/PruefungenDE/SitePages/ChatGPT.aspx")[StudentWeb] for more information. (HSG Account required) +] + +In preparing this thesis, I utilized Grammarly for grammar and style correction across the Abstract, Introduction, and Conclusion sections, ensuring clarity and coherence in my writing. I used DeepL to enhance language quality and translate parts of the Literature Review. I used ChatGPT to generate initial drafts and expand on ideas in the Introduction and Discussion sections, providing valuable suggestions and examples. Additionally, I used GitHub Copilot to generate code snippets for the developed functionality and code snippets in the Methodology section. + +#figure( + caption: "AI Tools used in the thesis", + table( + columns: (1fr, 1fr, 2fr), + "Tool", "Usage", "Affected Sections", + "ChatGPT 3.5", [- Brainstorming Structure + - Mindmaps + - Rewriting Text], [All chapters \ See Promt Dictionary \ \ @chapter1 Page #pageref("chapter1") ], + "Grammarly", [- Grammar and Style Correction + - Clarity and Coherence], [Abstract, Introduction, Conclusion \ \ @chapter1 Page #pageref("chapter1") ], + + ) +) \ No newline at end of file diff --git a/figures/tum_logo.png b/figures/tum_logo.png new file mode 100644 index 0000000..bb172b4 --- /dev/null +++ b/figures/tum_logo.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7c4bed7e3d32252eb74a026450a8c6d676b70063b1885745e8ef4f733ebf1135 +size 4142 diff --git a/figures/unisg_logo.png b/figures/unisg_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f92a263f32002acd7a828eee083695957a7242f9 GIT binary patch literal 11288 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 literal 0 HcmV?d00001 diff --git a/layout/abstract.typ b/layout/abstract.typ new file mode 100644 index 0000000..7a7abcf --- /dev/null +++ b/layout/abstract.typ @@ -0,0 +1,27 @@ +#let abstract(body, lang: "en") = { + let title = (en: "Abstract", de: "Zusammenfassung") + + set page( + margin: (left: 2.5cm, right: 2.5cm, top: 2.5cm, bottom: 2.5cm), + numbering: none, + number-align: center, + ) + + let body-font = "Times new Roman" + + set text( + font: body-font, + size: 12pt, + lang: lang + ) + + set par( + leading: 1em, + justify: true + ) + + // --- Abstract --- + align(top + center, text(font: body-font, 1em, weight: "semibold", title.at(lang))) + + body +} diff --git a/layout/disclaimer.typ b/layout/disclaimer.typ new file mode 100644 index 0000000..58ee764 --- /dev/null +++ b/layout/disclaimer.typ @@ -0,0 +1,38 @@ +#let disclaimer( + title: "", + author: "", + language: "en", + submissionDate: datetime, +) = { + set page( + margin: (left: 30mm, right: 30mm, top: 40mm, bottom: 40mm), + numbering: none, + number-align: center, + ) + + let body-font = "New Computer Modern" + let sans-font = "New Computer Modern Sans" + + set text( + font: body-font, + size: 12pt, + lang: "en" + ) + + set par(leading: 1em) + + + // --- Disclaimer --- + v(75%) + let title = (en: "Declaration of Authorship", de: "Erklärung zur Urheberschaft") + heading(title.at(language), numbering: none) + let disclaimer = (en: "I confirm that this thesis is my own work and I have documented all sources and material used.", de: "Ich versichere, dass ich diese Arbeit selbständig verfasst und alle verwendeten Quellen und Materialien dokumentiert habe.") + text(disclaimer.at(language)) + + v(15mm) + grid( + columns: 2, + gutter: 1fr, + "St. Gallen, " + submissionDate.display("[day]/[month]/[year]"), author + ) +} diff --git a/layout/thesis_template.typ b/layout/thesis_template.typ new file mode 100644 index 0000000..a78314f --- /dev/null +++ b/layout/thesis_template.typ @@ -0,0 +1,218 @@ +#import "/layout/titlepage.typ": * +#import "/layout/disclaimer.typ": * +#import "/layout/transparency_ai_tools.typ": transparency_ai_tools as transparency_ai_tools_layout +#import "/layout/abstract.typ": abstract as abstract_layout +#import "/utils/print_page_break.typ": * + +#let buildHeader(headingContent) = { + [ + #align(end, text(size: 11pt, weight: 400, headingContent)) + #v(2mm) + ] +} + + +#let getHeader() = { + locate(loc => { + // Find if there is a level 1 heading on the current page + let nextMainHeading = query(selector(heading).after(loc), loc).find(headIt => { + headIt.location().page() == loc.page() and headIt.level == 1 + }) + if (nextMainHeading != none) { + return buildHeader(nextMainHeading.body) + } + // Find the last previous level 1 heading -- at this point surely there's one + let lastMainHeading = query(selector(heading).before(loc), loc).filter(headIt => { + headIt.level == 1 + }).last() + + return buildHeader(lastMainHeading.body) + }) +} + +#let thesis( + title: "", + subtitle: "", + type: "", + professor: "", + author: "", + matriculationNumber: "", + submissionDate: datetime, + abstract: "", + language: "en", + acknowledgement: "", + transparency_ai_tools: "", + appendix: "", + is_print: false, + body, +) = { + + assert(language in ("de", "en"), message: "The language supported are only 'de' and 'en'.") + + titlepage( + title: title, + subtitle: subtitle, + type: type, + professor: professor, + author: author, + matriculationNumber: matriculationNumber, + submissionDate: submissionDate, + ) + + print_page_break(print: is_print, to: "even") + + + abstract_layout(lang: language)[#abstract] + + set page( + margin: (left: 2.5cm, right: 2.5cm, top: 2.5cm, bottom: 2.5cm), + numbering: none, + header: getHeader(), + ) + + let body-font = "Times New Roman" + + set text( + font: body-font, + size: 12pt, + lang: language + ) + + show math.equation: set text(weight: 400) + + set table( stroke:(x, y) => ( + y: if y == 1 { 2pt + gray } else { 1pt + gray }, + x: 1pt + gray + ), + + fill: (x, y) => + if y == 0 { rgb(55, 126, 57) } + ) + show table.cell: it => { + if it.y == 0 { + set text(white) + strong(it) + } else { + it + } +} + + // --- Headings --- + show heading: set block(below: 0.85em, above: 1.75em) + show heading: set text(font: body-font) + set heading(numbering: "1.1") + // Reference first-level headings as "chapters" + let chapter = (en: "Chapter", de: "Kapitel") + show ref: it => { + let el = it.element + if el != none and el.func() == heading and el.level == 1 { + chapter.at(language) + " " + numbering( + el.numbering, + ..counter(heading).at(el.location()) + ) + } else { + it + } + } + + // --- Paragraphs --- + set par(leading: 1em) + + // --- Citations --- + set cite(style: "alphanumeric") + + // --- Figures --- + show figure: set text(size: 0.85em) + + // --- Table of Contents --- + let tocTitle = (en: "Table of Contents", de: "Inhaltsverzeichnis") + + show outline.entry.where( + level: 1 + ): it => { + strong(text(size: 12pt, it)) + } + show outline.entry.where( + level: 2 + ): it => { + text(size: 11pt, it) + } + show outline.entry.where( + level: 3 + ): it => { + text(size: 10.5pt, it) + } + show outline.entry.where( + level: 4 + ): it => { + text(size: 10pt, it) + } + + outline( + title: tocTitle.at(language), + indent: 2em + ) + + + v(2.4fr) + pagebreak() + + set page( + margin: (left: 2.5cm, right: 2.5cm, top: 2.5cm, bottom: 2.5cm), + numbering: "1", + number-align: right, + ) + + counter(page).update(1) + + // List of figures. + let figureListTitle = (en: "List of Figures", de: "Abbildungsverzeichnis") + heading(numbering: none)[#figureListTitle.at(language)] + outline( + title:"", + target: figure.where(kind: image), + ) + + // List of tables. + print_page_break(print: is_print) + let tableListTitle = (en: "List of Tables", de: "Tabellenverzeichnis") + heading(numbering: none)[#tableListTitle.at(language)] + outline( + title: "", + target: figure.where(kind: table) + ) + pagebreak() + + + // Main body. + set par(justify: true, first-line-indent: 2em) + + body + + + // Appendix. + pagebreak() + let appendixTitle = (en: "Appendix", de: "Anhang") + heading(numbering: none)[#appendixTitle.at(language)] + appendix + + pagebreak() + let bibliographyTitle = (en: "References", de: "Literaturverzeichnis") + bibliography("/thesis.bib", style: "apa", title: bibliographyTitle.at(language)) + + print_page_break(print: is_print) + + disclaimer( + title: title, + author: author, + language: language, + submissionDate: submissionDate + ) + + + print_page_break(print: is_print) + + transparency_ai_tools_layout(language: language, transparency_ai_tools) + +} diff --git a/layout/titlepage.typ b/layout/titlepage.typ new file mode 100644 index 0000000..027aa02 --- /dev/null +++ b/layout/titlepage.typ @@ -0,0 +1,54 @@ +#let titlepage( + title: "", + subtitle: "", + type: "", + professor: "", + author: "", + matriculationNumber: "", + submissionDate: datetime, + abstract: "", + language: "en", +) = { + + set page( + margin: (left: 2.5cm, right: 2.5cm, top: 2.5cm, bottom: 2.5cm), + numbering: none, + number-align: center, + ) + + let body-font = "Times New Roman" + + set text( + font: body-font, + size: 12pt, + lang: language + ) + + set par(leading: 0.5em) + + + // --- Title Page --- + align(center, image("/figures/unisg_logo.png", width: 15%)) + let universityName = (en: "University of St. Gallen", de: "Universität St. Gallen") + align(center, text(font: body-font, 18pt, weight: 500, upper(universityName.at(language)))) + let universityHeader = (en: "School of Management, Economics,\n Law, Social Sciences, International Affairs and Computer Science", de: "Hochschule für Wirtschafts-, Rechts- und Sozialwissenschaften,\n Internationale Beziehungen und Informatik") + align(center, text(font: body-font, 11pt, weight: 500, universityHeader.at(language))) + + v(1fr) + line(length: 100%, stroke: 0.5pt + gray) + align(center, text(font: body-font, 16pt, weight: 400, type)) + align(center, text(font: body-font, 20pt, weight: 700, title)) + align(center, text(font: body-font, 16pt, weight: 400, subtitle)) + line(length: 100%, stroke: 0.5pt + gray) + v(1fr) + + + let submittedBy = (en: "Submitted by", de: "Eingereicht von") + let approvedBy = (en: "Approved on Application by \n\n Professor:", de: "Genehmigt auf Antrag von \n\n Professor:") + let submissionDateText = (en: "Date of Submission:", de: "Einreichungsdatum:") + align(center, text(font: body-font, 12pt, weight: 400, submittedBy.at(language) + ": \n" + author +"\n" + matriculationNumber)) + align(center, text(font: body-font, 12pt, weight: 400, approvedBy.at(language) + "\n" + professor)) + v(5mm) + align(center, text(font: body-font, 12pt, weight: 400, submissionDateText.at(language) + "\n\n" + submissionDate.display("[day padding:zero]/[month padding:zero]/[year repr:full]"))) + +} diff --git a/layout/transparency_ai_tools.typ b/layout/transparency_ai_tools.typ new file mode 100644 index 0000000..f563886 --- /dev/null +++ b/layout/transparency_ai_tools.typ @@ -0,0 +1,25 @@ +#let transparency_ai_tools(language: "en", body) = { + set page( + margin: (left: 30mm, right: 30mm, top: 40mm, bottom: 40mm), + numbering: none, + number-align: center, + ) + + let body-font = "New Computer Modern" + let sans-font = "New Computer Modern Sans" + + set text( + font: body-font, + size: 12pt, + lang: "en" + ) + + set par(leading: 1em) + + // --- AI Usage --- + let title = (en: "Transparency in the use of AI tools", de: "Transparenz bei der Verwendung von KI-Tools") + heading(title.at(language), numbering: none) + v(12pt) + + body +} \ No newline at end of file diff --git a/metadata.typ b/metadata.typ new file mode 100644 index 0000000..4096f14 --- /dev/null +++ b/metadata.typ @@ -0,0 +1,9 @@ +// Enter your thesis data here: +#let language = "en" // "en" or "de" +#let title = "Title of paper" +#let subtitle = "Subtitle of paper" +#let type = "Type of paper" +#let professor = "Name and full title of professor" +#let author = "First name Last name" +#let matriculationNumber = "Matriculation number" +#let submissionDate = datetime(day: 1, month: 1, year: 2024) \ No newline at end of file diff --git a/thesis.bib b/thesis.bib new file mode 100644 index 0000000..0c66c2f --- /dev/null +++ b/thesis.bib @@ -0,0 +1,6 @@ +@book{bruegge2004object, + title = {Object Oriented Software Engineering Using UML, Patterns, and Java}, + author = {Bruegge, Bernd and Dutoit, Allen H}, + year = {2009}, + publisher = {Prentice Hall} +} \ No newline at end of file diff --git a/thesis.typ b/thesis.typ new file mode 100644 index 0000000..5131d7c --- /dev/null +++ b/thesis.typ @@ -0,0 +1,22 @@ +#import "/layout/thesis_template.typ": * +#import "/metadata.typ": * + +#set document(title: title, author: author) + +#show: thesis.with( + language: language, + title: title, + subtitle: subtitle, + type: type, + professor: professor, + author: author, + matriculationNumber: matriculationNumber, + submissionDate: submissionDate, + abstract: include "/content/abstract.typ", + acknowledgement: include "/content/acknowledgement.typ", + transparency_ai_tools: include "/content/transparency_ai_tools.typ", + appendix: include "/content/appendix.typ", +) + +#include "/content/01_content.typ" +#include "/content/02_content.typ" \ No newline at end of file diff --git a/utils/feedback.typ b/utils/feedback.typ new file mode 100644 index 0000000..d1fa870 --- /dev/null +++ b/utils/feedback.typ @@ -0,0 +1,25 @@ +#let feedback( + feedback: "", + response: "", +) = { + counter("feedback").step() + block( + breakable: false, + ( + par( + justify: true, + text(weight: 700, counter("feedback").display() + ". Feedback: ") + + feedback + + pad( + left: 5%, + top: 2mm, + bottom: 5mm, + text( + fill: blue, + text(weight: 700, "Response: ") + response + ) + ) + ) + ) + ) +} \ No newline at end of file diff --git a/utils/formfield.typ b/utils/formfield.typ new file mode 100644 index 0000000..a21f787 --- /dev/null +++ b/utils/formfield.typ @@ -0,0 +1,9 @@ +#let formField(label, content, length: 5cm) = { + stack( + text(1em, weight: "bold")[#content], + v(2mm), + line(length: length), + v(1mm), + text(0.9em, style: "italic")[#label] + ) +} \ No newline at end of file diff --git a/utils/pageref.typ b/utils/pageref.typ new file mode 100644 index 0000000..7ac7e82 --- /dev/null +++ b/utils/pageref.typ @@ -0,0 +1,15 @@ +#let pageref(labelText) = { + locate(loc => { + let label = label(labelText) + let elems = query(selector(label), loc) + + if elems.len() == 1 { + let loc = elems.at(0).location() + let pageNumber = counter(page).at(loc) + link(label, numbering(loc.page-numbering(), ..pageNumber)) + } else { + let errorMessage = "Label '" + labelText + "' is not defined" + panic(errorMessage) + } + }) +} \ No newline at end of file diff --git a/utils/print_page_break.typ b/utils/print_page_break.typ new file mode 100644 index 0000000..b700a77 --- /dev/null +++ b/utils/print_page_break.typ @@ -0,0 +1,7 @@ +#let print_page_break(print: bool, to: "even") = { + if print { + pagebreak(to: to) + } else { + pagebreak() + } +} \ No newline at end of file diff --git a/utils/table.typ b/utils/table.typ new file mode 100644 index 0000000..e69de29 diff --git a/utils/todo.typ b/utils/todo.typ new file mode 100644 index 0000000..3edbdf0 --- /dev/null +++ b/utils/todo.typ @@ -0,0 +1,10 @@ +#let TODO(body, color: yellow) = { + rect( + width: 100%, + radius: 3pt, + stroke: 0.5pt, + fill: color, + )[ + #body + ] +}