diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..a9d620e --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +*.pdf filter=lfs diff=lfs merge=lfs -text +Thesis/Pictures/** filter=lfs diff=lfs merge=lfs -text diff --git a/.gitignore b/.gitignore index 74b2665..8724bee 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,5 @@ xcuserdata/ .build/ .DS_Store +Thesis/title_page.pdf +Thesis/style.pdf diff --git a/Thesis/Pictures/zut.png b/Thesis/Pictures/zut.png new file mode 100644 index 0000000..90168bb --- /dev/null +++ b/Thesis/Pictures/zut.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:935a57483de5063bb7975c02a0670d16e774e03bbba9a47a64a8c118f8a3eefc +size 102672 diff --git a/Thesis/main.pdf b/Thesis/main.pdf index 7e744ad..7d07f16 100644 Binary files a/Thesis/main.pdf and b/Thesis/main.pdf differ diff --git a/Thesis/main.typ b/Thesis/main.typ index 02ff8b8..8d6b8af 100644 --- a/Thesis/main.typ +++ b/Thesis/main.typ @@ -1,8 +1,9 @@ -#import "title-page.typ": title-page +#import "style.typ": zut-template, theorem, definition, example -#title-page( - title: "Implementacja aplikacji do współtworzenia notatek z wykorzystaniem technologii peer to peer", - author: "Oskar Marcin Chybowski", - supervisor: "dr inż. Mirosław Mościcki", - year: "2026" -) +#show: zut-template.with(shorttitle: "Krótki tytuł") +#include "title_page.typ" + +#pagebreak() + +#set page(numbering: "1") +#counter(page).update(1) diff --git a/Thesis/style.typ b/Thesis/style.typ new file mode 100644 index 0000000..7efa6ee --- /dev/null +++ b/Thesis/style.typ @@ -0,0 +1,374 @@ +// ========================================================= +// style.typ – Szablon Pracy Dyplomowej +// Wydział Informatyki, ZUT w Szczecinie +// Typst 0.12+ +// ========================================================= +// ╔═══════════════════════════════════════════════════════╗ +// ║ 1. KOLORY ║ +// ╚═══════════════════════════════════════════════════════╝ + +#let blue-wi = cmyk(60%, 20%, 0%, 0%) // blueWI – jasny niebieski WI +#let blue-zut = cmyk(100%, 75%, 0%, 20%) // blueZUT – granatowy ZUT +#let gray-zut = cmyk(0%, 0%, 0%, 40%) // grayZUT – szary ZUT + +// Pochodne (odpowiedniki blueWI!20, blueZUT!60 itp.) +#let blue-wi-20 = blue-wi.lighten(80%) +#let blue-zut-60 = blue-zut.lighten(40%) +#let gray-zut-10 = gray-zut.lighten(90%) + +// Kolory kodu źródłowego +#let code-green = rgb(0, 154, 0) +#let code-gray = rgb(128, 128, 128) +#let code-violet = rgb(148, 0, 211) + +#let theorem(title: none, body) = block( + width: 100%, + fill: luma(97%), + stroke: (top: 1.2pt + blue-zut, bottom: 1.2pt + blue-zut, + left: 1.2pt + blue-zut, right: 1.2pt + blue-zut), + inset: 8pt, + above: 8pt, + below: 8pt, +)[ + #text(size: 10pt, weight: "bold", font: "Fira Sans", fill: blue-zut)[ + Twierdzenie#if title != none [ — #title] + ] + #parbreak() + #body +] + +/// Definicja – lewa kreska 2pt blueZUT (dBox) +#let definition(title: none, body) = block( + width: 100%, + stroke: (left: 2pt + blue-zut), + inset: (left: 10pt, right: 8pt, top: 4pt, bottom: 4pt), + above: 8pt, + below: 8pt, +)[ + #text(size: 10pt, weight: "bold", font: "Fira Sans")[ + Definicja#if title != none [ — #title] + ] + #parbreak() + #body +] + +#let example(title: none, body) = block( + above: 6pt, + below: 6pt, +)[ + #text(size: 10pt, weight: "bold", font: "Fira Sans", fill: blue-zut)[ + Przykład#if title != none [ — #title] + ] + #parbreak() + #body #h(1fr) $blacksquare$ +] + + +// ╔═══════════════════════════════════════════════════════╗ +// ║ 3. GŁÓWNA FUNKCJA SZABLONU ║ +// ╚═══════════════════════════════════════════════════════╝ + +/// Główna funkcja opakowująca dokument. +/// +/// Parametry: +/// shorttitle – krótki tytuł pracy wyświetlany w nagłówku parzystych stron +/// body – treść dokumentu +#let zut-template( + shorttitle: "", + body, +) = { + + // ── 3.1 STRONA ────────────────────────────────────────── + set page( + paper: "a4", + margin: ( + top: 3.2cm, + bottom: 3.5cm, + inside: 3.5cm, // 2.5cm tekst + 1cm bindingoffset + outside: 2.5cm, + ), + + // ── Nagłówek ───────────────────────────────────────── + // Strony nieparzyste (prawe): tytuł rozdziału + numer strony + // Strony parzyste (lewe): numer strony + shorttitle + // Strony otwierające rozdział: nagłówek ukryty (styl "plain") + header: context { + let pg = counter(page).get().first() + let is-odd = calc.odd(pg) + + // Czy ta strona otwiera rozdział? (→ plain style: brak nagłówka) + let chapter-locs = query(heading.where(level: 1)) + let is-chapter-page = chapter-locs.any(h => + counter(page).at(h.location()).first() == pg + ) + + if not is-chapter-page { + // Tytuł bieżącego rozdziału do nagłówka + let prev = query(heading.where(level: 1).before(here())) + let ch-label = if prev.len() > 0 { + let h = prev.last() + let num = counter(heading).at(h.location()) + [#num.first().#h.body] + } else { [] } + + set text(font: "Fira Sans", size: 10pt) + + if is-odd { + // ── Nieparzysta (prawa) ────────────────────────── + grid( + columns: (1fr, auto), + align: horizon, + box( + fill: blue-wi-20, + width: 100%, + inset: (x: 7pt, y: 4pt), + )[#ch-label], + box( + fill: blue-zut, + inset: (x: 7pt, y: 4pt), + )[#text(fill: white, weight: "bold")[#pg]], + ) + } else { + // ── Parzysta (lewa) ────────────────────────────── + grid( + columns: (auto, 1fr), + align: horizon, + box( + fill: blue-zut, + inset: (x: 7pt, y: 4pt), + )[#text(fill: white, weight: "bold")[#pg]], + box( + fill: blue-wi-20, + width: 100%, + inset: (x: 7pt, y: 4pt), + )[#shorttitle], + ) + } + } + }, // /header + + // ── Stopka ─────────────────────────────────────────── + // Widoczna tylko na stronach otwierających rozdział (plain style). + footer: context { + let pg = counter(page).get().first() + let chapter-locs = query(heading.where(level: 1)) + let is-chapter-page = chapter-locs.any(h => + counter(page).at(h.location()).first() == pg + ) + if is-chapter-page { + set text(font: "Fira Sans", size: 10pt) + align(right, + box(fill: blue-zut, inset: (x: 7pt, y: 4pt))[ + #text(fill: white, weight: "bold")[#pg] + ] + ) + } + }, + + numbering: "1", + ) // /set page + + + // ── 3.2 TEKST ─────────────────────────────────────────── + set text(font: "Fira Sans", size: 12pt, lang: "pl") + set par(justify: true, leading: 0.65em) + + + // ── 3.3 LISTY ─────────────────────────────────────────── + // \setlist{nolistsep} → spacing: 0.4em + // \setlist[itemize]{label=--} + set list(marker: [--], spacing: 0.4em, indent: 1em) + set enum(spacing: 0.4em, indent: 1em) + + + // ── 3.4 NAGŁÓWKI ──────────────────────────────────────── + + // Rozdział (\chapter) – level 1 + // {\huge\sffamily\color{blueZUT}} + numer wysuniẹty o \hspace{-3ex} + show heading.where(level: 1): it => { + pagebreak(weak: true) + v(1cm) + context { + set text(size: 24pt, weight: "bold", font: "Fira Sans", fill: blue-zut) + if it.numbering != none { + block(below: 0.6em)[ + // Numer wysuniẹty w lewo (odpowiednik \hspace{-3ex}) + #box(width: 0pt)[ + #place(dx: -2em)[#counter(heading).display().] + ] + #h(1.2em) + #it.body + ] + } else { + block(below: 0.6em)[#it.body] + } + } + } + + // Sekcja (\section) – level 2, wiszący numer w marginesie + // \large\sffamily\bfseries + \llap{\color{blueZUT}{numer}\hspace{1em}} + show heading.where(level: 2): it => { + v(1.5em, weak: true) + context { + block(below: 0.5em, above: 0pt)[ + #set text(size: 13pt, weight: "bold", font: "Fira Sans") + #if it.numbering != none { + // Numer wysuniẹty w lewo (llap) + box(width: 0pt)[ + #place(dx: -3em)[ + #text(fill: blue-zut)[#counter(heading).display()] + ] + ] + } + #it.body + ] + } + v(0.4em, weak: true) + } + + // Podsekcja (\subsection) – level 3 + show heading.where(level: 3): it => { + v(1.2em, weak: true) + context { + block(below: 0.4em, above: 0pt)[ + #set text(size: 12pt, weight: "bold", font: "Fira Sans") + #if it.numbering != none { + box(width: 0pt)[ + #place(dx: -3em)[ + #text(fill: blue-zut)[#counter(heading).display()] + ] + ] + } + #it.body + ] + } + v(0.3em, weak: true) + } + + // Podpodsekcja (\subsubsection) – level 4 + show heading.where(level: 4): it => { + v(1em, weak: true) + context { + block(below: 0.3em, above: 0pt)[ + #set text(size: 11pt, weight: "bold", font: "Fira Sans") + #if it.numbering != none { + box(width: 0pt)[ + #place(dx: -3em)[ + #text(fill: blue-zut)[#counter(heading).display()] + ] + ] + } + #it.body + ] + } + } + + // Paragraf (\paragraph) – level 5, inline + show heading.where(level: 5): it => { + v(0.8em, weak: true) + text(size: 11pt, weight: "bold", font: "Fira Sans")[#it.body] + v(0.15em, weak: true) + } + + + // ── 3.5 SPIS TREŚCI ───────────────────────────────────── + // \titlecontents – numery, wcięcia, kolory, linie kropkowane + + set outline(indent: auto) + + show outline.entry: it => { + if it.level == 1 { + // Rozdział: +12pt przerwy, \large, blueZUT, pogrubiony + v(12pt, weak: true) + text(size: 11pt, weight: "bold", font: "Fira Sans", fill: blue-zut)[ + #h(1.25cm) + #it + ] + } else if it.level == 2 { + // Sekcja: wcięcie 1.25cm, normalny + v(3pt, weak: true) + text(size: 10pt, font: "Fira Sans")[ + #h(1.25cm) + #it + ] + } else if it.level == 3 { + // Podsekcja: wcięcie 2.5cm, small + v(1pt, weak: true) + text(size: 9pt, font: "Fira Sans")[ + #h(2.5cm) + #it + ] + } else { + it + } + } + + + // ── 3.6 BLOKI KODU ────────────────────────────────────── + // Odpowiednik lstdefinestyle{mystyle}: + // • małe litery, font monospace + // • lewa kreska w kolorze blueWI + // • wcięcia x: 5ex + // • numery linii (Typst 0.12+: set raw(numbering: "1")) + + show raw.where(block: true): it => { + block( + width: 100%, + fill: gray-zut.lighten(93%), + stroke: (left: 2pt + blue-wi), + inset: (x: 12pt, y: 9pt), + above: 9pt, + below: 9pt, + radius: (right: 2pt), + )[ + #set text(size: 9.5pt, font: ("Fira Mono", "Courier New", "monospace")) + #it + ] + } + + // Kod inline – dyskretne tło + show raw.where(block: false): it => { + box( + fill: gray-zut.lighten(93%), + inset: (x: 3pt, y: 1pt), + radius: 2pt, + )[ + #set text(size: 10pt, font: ("Fira Mono", "Courier New", "monospace")) + #it + ] + } + + + // ── 3.7 PODPISY RYSUNKÓW I TABEL ──────────────────────── + // \captionsetup[figure]{name={\small\sffamily\color{blueZUT} Rysunek}} + // \captionsetup[table] {name={\small\sffamily\color{blueZUT} Tabela}} + set figure(gap: 0.8em) + + show figure.caption: it => { + set text(size: 9.5pt, font: "Fira Sans") + let kind-label = if it.kind == image { [Rysunek] } + else if it.kind == table { [Tabela] } + else { [Algorytm] } + [ + #text(fill: blue-zut, weight: "bold")[ + #kind-label #it.counter.display() + ]#it.separator#it.body + ] + } + + + // ── 3.8 TABELE ────────────────────────────────────────── + // \usepackage{booktabs} – poziome linie tabel + set table( + stroke: none, + inset: (x: 8pt, y: 5pt), + ) + // Linie nagłówka i dołu tabeli (booktabs-style) + show table.cell.where(y: 0): set text(weight: "bold") + show table: set block(above: 8pt, below: 8pt) + + + // ── Treść dokumentu ───────────────────────────────────── + body + +} // /zut-template diff --git a/Thesis/title-page.typ b/Thesis/title-page.typ deleted file mode 100644 index ce6d843..0000000 --- a/Thesis/title-page.typ +++ /dev/null @@ -1,24 +0,0 @@ -#let title-page( - title: "", - author: "", - supervisor: "", - year: "", - faculty: "Wydział Informatyki", - university: "Zachodniopomorski Uniwersytet Technologiczny w Szczecinie" -) = { - page(footer: none, header: none)[ - #set align(center + horizon) - #university \ - #faculty \ - #v(2cm) - #text(size: 16pt, weight: "bold")[Praca inżynierska] \ - #v(1cm) - #text(size: 14pt, title) \ - #v(3cm) - #author \ - #v(1cm) - Promotor: #supervisor \ - #v(2cm) - Szczecin #year - ] -} diff --git a/Thesis/title_page.typ b/Thesis/title_page.typ new file mode 100644 index 0000000..28ec584 --- /dev/null +++ b/Thesis/title_page.typ @@ -0,0 +1,68 @@ +#let field = "Informatyka" +#let speciality = "Inżynieria Oprogramowania" +#let degreename = "Praca dyplomowa inżynierska" +#let ttitle = "Implementacja aplikacji do współtworzenia notatek z wykorzystaniem technologii peer to peer" +#let ttitle-eng = "Implementation of a collaborative note-taking application using peer-to-peer technology" +#let authornames = "Oskar Chybowski" +#let noalbum = "54941" +#let supname = "dr inż. Mirosław Mościcki" +#let departmentname = "Katedra Inżynierii Oprogramowania" +#let sup-ext = none +#let departmentname-ext = none +#let placesubmit = "Szczecin" +#let yearsubmit = "2026" + +#set page( + paper: "a4", + margin: (x: 2.5cm, y: 2.5cm), + header: none, + footer: none, + numbering: none, +) + +#set text(font: "Fira Sans", size: 12pt, lang: "pl") + + +#align(center)[ + #v(0.6cm) + #image("Pictures/zut.png", width: 40%) + #v(0.75cm) + + Wydział Informatyki \ + #v(0.0cm) + kierunek studiów: #field \ + #v(0.0cm) + specjalność: #speciality + #v(1.25cm) + + // degree + #text(size: 16pt)[#degreename] + #v(1cm) + + // Polish title + #text(size: 16pt, weight: "bold")[#upper(ttitle)] + #v(0.5cm) + + // English title + #text(size: 13pt, weight: "bold")[#upper(ttitle-eng)] + #v(0.5cm) + + // Author + #text(size: 13pt, weight: "bold")[#authornames] + #v(0cm) + + // album number + nr albumu: #text(weight: "bold")[#noalbum] + #v(1cm) + + // Supervisor + #text(size: 13pt)[Opiekun:] + #v(0cm) + #text(size: 13pt, weight: "bold")[#supname] + #v(0cm) + #departmentname + #v(1cm) + + #v(1fr) + #placesubmit, #yearsubmit +]