From 8b86abb24467a1abe988086ca83ee7b3d746d47b Mon Sep 17 00:00:00 2001 From: unexplrd Date: Fri, 23 Jan 2026 20:55:48 +0200 Subject: [PATCH] 1769194548 --- src/helpers.typ | 6 +- src/lib.typ | 267 ++-------------------- src/title-pages/coursework/coursework.typ | 261 +++++++++++++++++++++ src/title-pages/coursework/main.typ | 1 + src/title-pages/main.typ | 1 + src/title-pages/pz-lb/minimal.typ | 6 +- 6 files changed, 285 insertions(+), 257 deletions(-) create mode 100644 src/title-pages/coursework/coursework.typ create mode 100644 src/title-pages/coursework/main.typ diff --git a/src/helpers.typ b/src/helpers.typ index dd87b8e..9ba00fb 100644 --- a/src/helpers.typ +++ b/src/helpers.typ @@ -25,7 +25,11 @@ .at(if gender == "m" or gender == "f" { gender } else { "p" }, default: "p") } #let gender-get(dict) = if "gender" in dict.keys() { dict.gender } else { "p" } -#let gender-form(verb, dict) = gender-verb(verb, gender: gender-get(dict)) +#let gender-form(verb, dict: none) = if type(dict) == "dictionary" { + gender-verb(verb, gender: gender-get(dict)) +} else { + gender-verb(verb, gender: none) +} #let degree-get(m) = if "degree" in m.keys() and m.degree != none { [#m.degree\ ] } diff --git a/src/lib.typ b/src/lib.typ index 37f9677..2413241 100644 --- a/src/lib.typ +++ b/src/lib.typ @@ -36,250 +36,16 @@ show: style.dstu.with(skip: 1) - let bib-count = state("citation-counter", ()) - show cite: it => { - it - bib-count.update(((..c)) => (..c, it.key)) - } - show bibliography: it => { - set text(size: 0pt) - it - } - - let author = authors.first() - let head_mentor = mentors.first() - let uni = universities.at(university) - let edu_prog = uni.edu_programs.at(author.edu_program) - - // page 1 {{{2 - [ - #set align(center) - МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ\ - #upper(uni.name) - - \ - - Кафедра #edu_prog.department_gen - - \ - - ПОЯСНЮВАЛЬНА ЗАПИСКА\ - ДО КУРСОВОЇ РОБОТИ\ - з дисципліни: "#uni.subjects.at(subject, default: subject)"\ - Тема роботи: "#title" - - \ \ \ - - #columns(2, gutter: 4cm)[ - #set align(left) - #set par(first-line-indent: 0pt) - - #gender-form("author", author) ст. гр. #author.edu_program\-#author.group - - \ - Керівник:\ - #head_mentor.degree - - \ - Робота захищена на оцінку - - \ - Комісія:\ - #for m in mentors { degree-get(m) } - - #colbreak() - #set align(left) - - - #author.name - - \ \ - #head_mentor.name - - \ - #underline(" " * 35) - - \ \ - #for m in mentors { [#m.name\ ] } - ] - - #v(1fr) - - Харків -- #task_list.done_date.display("[year]") - - #pagebreak() - ] - - // page 2 {{{2 - { - uline[#uni.name] - - linebreak() - linebreak() - - grid( - columns: (100pt, 1fr), - bold[ - Кафедра - Дисципліна - Спеціальність - ], - { - uline(align: left, edu_prog.department_gen) - linebreak() - uline(align: left, uni.subjects.at(subject, default: subject)) - linebreak() - uline(align: left, [#edu_prog.code #edu_prog.name_long]) - }, - ) - grid( - columns: (1fr, 1fr, 1fr), - gutter: 0.3fr, - [#bold[Курс] #uline(author.course)], - [#bold[Група] #uline([#author.edu_program\-#author.group])], - [#bold[Семестр] #uline(author.semester)], - ) - - linebreak() - linebreak() - linebreak() - - align(center, bold[ЗАВДАННЯ \ на курсову роботу студента]) - - linebreak() - - uline(align: left)[_#author.full_name_gen _] - - linebreak() - linebreak() - - bold[\1. Тема роботи:] - uline[#title.] - - linebreak() - - { - bold[\2. Строк здачі закінченої роботи:] - uline(task_list.done_date.display("[day].[month].[year]")) - hfill(10fr) - } - - linebreak() - - bold[\3. Вихідні дані для роботи:] - uline(task_list.source) - - linebreak() - - bold[\4. Зміст розрахунково-пояснювальної записки:] - uline(task_list.content) - - linebreak() - - bold[\5. Перелік графічного матеріалу:] - uline(task_list.graphics) - - linebreak() - - { - bold[\6. Дата видачі завдання:] - uline(task_list.initial_date.display("[day].[month].[year]")) - hfill(10fr) - } - - pagebreak() - } - - // page 3 {{{2 - { - align(center, bold[КАЛЕНДАРНИЙ ПЛАН]) - set par(first-line-indent: 0pt) - - linebreak() - - calendar_plan.plan_table - - linebreak() - - grid( - columns: (5fr, 5fr), - grid( - columns: (1fr, 2fr, 1fr), - gutter: 0.2fr, - [ - Студент \ - Керівник \ - #align(center)["#underline[#calendar_plan.approval_date.day()]"] - ], - [ - #uline(align: center, []) \ - #uline(align: center, []) \ - #uline(align: center, month-gen(calendar_plan.approval_date.month())) - ], - [ - \ \ - #underline[#calendar_plan.approval_date.year()] р. - ], - ), - [ - #author.name, \ - #head_mentor.degree - #head_mentor.name. - ], - ) - - pagebreak() - } - - // page 4 {{{2 - [ - #align(center, bold[РЕФЕРАТ]) \ - - #context [ - #let pages = counter(page).final().at(0) - #let images = query(figure.where(kind: image)).len() - #let tables = query(figure.where(kind: table)).len() - #let bibs = bib-count.final().dedup().len() - /* TODO: why this stopped working? - #let tables = counter(figure.where(kind: table)).final().at(0) - #let images = counter(figure.where(kind: image)).final().at(0)*/ - - #let counters = () - - #if pages != 0 { counters.push[#pages с.] } - #if tables != 0 { counters.push[#tables табл.] } - #if images != 0 { counters.push[#images рис.] } - #if bibs != 0 { counters.push[#bibs джерел] } - - Пояснювальна записка до курсової роботи: #counters.join(", "). - ] - - \ - - #( - abstract - .keywords - .map(upper) - .sorted(by: (a, b) => { - if is-cyr(a) != is-cyr(b) { true } else { a < b } - }) - .join(", ") - ) - - - \ - - #abstract.text - ] - - // page 5 {{{2 - outline( - title: [ - ЗМІСТ - #v(spacing * 2, weak: true) - ], - depth: 2, - indent: auto, + tp.cw.coursework( + university, + subject, + type, + title, + authors, + mentors, + task_list, + calendar_plan, + abstract, ) doc @@ -308,9 +74,9 @@ [#c.title. #c.author. URL: #c.url.value (дата звернення: #date.display("[day].[month].[year]")).] } else if ( c.type == "Book" - ) [#c.author #c.title. #c.publisher, #c.date. #c.page-total c. ] else [ - UNSUPPORTED BIBLIOGRAPHY ENTRY TYPE, PLEASE OPEN AN ISSUE - ] + ) [#c.author #c.title. #c.publisher, #c.date. #c.page-total c. ] else { + panic("Unsupported bibliography entry type") + } } show enum.item: it => { @@ -325,12 +91,7 @@ for (i, citation) in query(ref.where(element: none)) .map(r => str(r.target)) .dedup() - .enumerate() { - enum.item( - i + 1, - format-entry(bib_data.at(citation)), - ) - } + .enumerate() { enum.item(i + 1, format-entry(bib_data.at(citation))) } } } diff --git a/src/title-pages/coursework/coursework.typ b/src/title-pages/coursework/coursework.typ new file mode 100644 index 0000000..0dd1f4a --- /dev/null +++ b/src/title-pages/coursework/coursework.typ @@ -0,0 +1,261 @@ +#import "../../shared.typ": universities +#import "../../helpers.typ": * +#import "../../style.typ": * +#import "../../utils.typ": bold, hfill, uline + +#let coursework( + university, + subject, + type, + title, + authors, + mentors, + task_list, + calendar_plan, + abstract, +) = { + let bib-count = state("citation-counter", ()) + show cite: it => { + it + bib-count.update(((..c)) => (..c, it.key)) + } + show bibliography: it => { + set text(size: 0pt) + it + } + + let author = authors.first() + let head_mentor = mentors.first() + + let uni = universities.at(university) + let edu_prog = uni.edu_programs.at(author.edu_program) + + // page 1 {{{2 + [ + #set align(center) + МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ\ + #upper(uni.name) + + \ + + Кафедра #edu_prog.department_gen + + \ + + ПОЯСНЮВАЛЬНА ЗАПИСКА\ + ДО КУРСОВОЇ РОБОТИ\ + з дисципліни: "#uni.subjects.at(subject, default: subject)"\ + Тема роботи: "#title" + + \ \ \ + + #columns(2, gutter: 4cm)[ + #set align(left) + #set par(first-line-indent: 0pt) + + #gender-form("author", author) ст. гр. #author.edu_program\-#author.group + + \ + Керівник:\ + #head_mentor.degree + + \ + Робота захищена на оцінку + + \ + Комісія:\ + #for m in mentors { degree-get(m) } + + #colbreak() + #set align(left) + + + #author.name + + \ \ + #head_mentor.name + + \ + #underline(" " * 35) + + \ \ + #for m in mentors { [#m.name\ ] } + ] + + #v(1fr) + + Харків -- #task_list.done_date.display("[year]") + + #pagebreak() + ] + + // page 2 {{{2 + { + uline[#uni.name] + + linebreak() + linebreak() + + grid( + columns: (100pt, 1fr), + bold[ + Кафедра + Дисципліна + Спеціальність + ], + { + uline(align: left, edu_prog.department_gen) + linebreak() + uline(align: left, uni.subjects.at(subject, default: subject)) + linebreak() + uline(align: left, [#edu_prog.code #edu_prog.name_long]) + }, + ) + grid( + columns: (1fr, 1fr, 1fr), + gutter: 0.3fr, + [#bold[Курс] #uline(author.course)], + [#bold[Група] #uline([#author.edu_program\-#author.group])], + [#bold[Семестр] #uline(author.semester)], + ) + + linebreak() + linebreak() + linebreak() + + align(center, bold[ЗАВДАННЯ \ на курсову роботу студента]) + + linebreak() + + uline(align: left)[_#author.full_name_gen _] + + linebreak() + linebreak() + + bold[\1. Тема роботи:] + uline[#title.] + + linebreak() + + { + bold[\2. Строк здачі закінченої роботи:] + uline(task_list.done_date.display("[day].[month].[year]")) + hfill(10fr) + } + + linebreak() + + bold[\3. Вихідні дані для роботи:] + uline(task_list.source) + + linebreak() + + bold[\4. Зміст розрахунково-пояснювальної записки:] + uline(task_list.content) + + linebreak() + + bold[\5. Перелік графічного матеріалу:] + uline(task_list.graphics) + + linebreak() + + { + bold[\6. Дата видачі завдання:] + uline(task_list.initial_date.display("[day].[month].[year]")) + hfill(10fr) + } + + pagebreak() + } + + // page 3 {{{2 + { + align(center, bold[КАЛЕНДАРНИЙ ПЛАН]) + set par(first-line-indent: 0pt) + + linebreak() + + calendar_plan.plan_table + + linebreak() + + grid( + columns: (5fr, 5fr), + grid( + columns: (1fr, 2fr, 1fr), + gutter: 0.2fr, + [ + Студент \ + Керівник \ + #align(center)["#underline[#calendar_plan.approval_date.day()]"] + ], + [ + #uline(align: center, []) \ + #uline(align: center, []) \ + #uline(align: center, month-gen(calendar_plan.approval_date.month())) + ], + [ + \ \ + #underline[#calendar_plan.approval_date.year()] р. + ], + ), + [ + #author.name, \ + #head_mentor.degree + #head_mentor.name. + ], + ) + + pagebreak() + } + + // page 4 {{{2 + [ + #align(center, bold[РЕФЕРАТ]) \ + + #context [ + #let pages = counter(page).final().at(0) + #let images = query(figure.where(kind: image)).len() + #let tables = query(figure.where(kind: table)).len() + #let bibs = bib-count.final().dedup().len() + /* TODO: why this stopped working? + #let tables = counter(figure.where(kind: table)).final().at(0) + #let images = counter(figure.where(kind: image)).final().at(0)*/ + + #let counters = () + + #if pages != 0 { counters.push[#pages с.] } + #if tables != 0 { counters.push[#tables табл.] } + #if images != 0 { counters.push[#images рис.] } + #if bibs != 0 { counters.push[#bibs джерел] } + + Пояснювальна записка до курсової роботи: #counters.join(", "). + ] + + \ + + #( + abstract + .keywords + .map(upper) + .sorted(by: (a, b) => { + if is-cyr(a) != is-cyr(b) { true } else { a < b } + }) + .join(", ") + ) + + \ + #abstract.text + ] + + // page 5 {{{2 + outline( + title: [ + ЗМІСТ + #v(spacing * 2, weak: true) + ], + depth: 2, + indent: auto, + ) +} diff --git a/src/title-pages/coursework/main.typ b/src/title-pages/coursework/main.typ new file mode 100644 index 0000000..4882b50 --- /dev/null +++ b/src/title-pages/coursework/main.typ @@ -0,0 +1 @@ +#import "coursework.typ": * diff --git a/src/title-pages/main.typ b/src/title-pages/main.typ index 8081184..f28c162 100644 --- a/src/title-pages/main.typ +++ b/src/title-pages/main.typ @@ -1 +1,2 @@ #import "pz-lb/main.typ" as pz-lb +#import "coursework/main.typ" as cw diff --git a/src/title-pages/pz-lb/minimal.typ b/src/title-pages/pz-lb/minimal.typ index f5bc0e1..f93659e 100644 --- a/src/title-pages/pz-lb/minimal.typ +++ b/src/title-pages/pz-lb/minimal.typ @@ -19,7 +19,7 @@ #if authors.len() == 1 { let a = authors.first() - [#gender-form("author", a)):\ ] + [#gender-form("author", dict: a):\ ] [ст. гр. #a.edu_program\-#a.group\ ] [#a.name\ ] if a.variant != none [Варіант: №#a.variant] @@ -33,11 +33,11 @@ #if mentors.len() == 1 { let m = mentors.first() - [#gender-form("mentor", m)):\ ] + [#gender-form("mentor", dict: m):\ ] degree-get(m) [#m.name\ ] } else if mentors.len() > 1 [ - #gender-form("mentor", m)):\ + #gender-form("mentor"):\ #for m in mentors { degree-get(m) [#m.name\ ]