From 23b4960c491eac6264ae766c7aecca2c53679472 Mon Sep 17 00:00:00 2001 From: danilasar Date: Wed, 1 Jan 2025 15:39:04 +0400 Subject: =?UTF-8?q?=D1=80=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE=D1=80:=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=BB=D0=BD=D0=B0=D1=8F=20=D0=BF=D0=B5=D1=80=D0=B5?= =?UTF-8?q?=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA=D0=B0=20=D0=BA=D0=BE=D0=B4?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf.typ | 551 +++++++++++++++++++++++++++++++++++++-------------------------- 1 file changed, 322 insertions(+), 229 deletions(-) (limited to 'conf.typ') diff --git a/conf.typ b/conf.typ index fa97841..bf19069 100644 --- a/conf.typ +++ b/conf.typ @@ -1,216 +1,309 @@ -#let header() = { - set align(center) - set text(font: "Cambria") - text("МИНОБРНАУКИ РОССИИ\nФедеральное государственное бюджетное образовательное учреждение\nвысшего образования\n") - v(0.2em) - text(weight: "bold", "«САРАТОВСКИЙ НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ - ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ - ИМЕНИ Н. Г. ЧЕРНЫШЕВСКОГО»\n") - set align(left) -} +/* + * Примечания: + * - Код разбит по модулям, каждый из которых объявляется и инициализируется + * в переменной modules. Методы именуются в змеином стиле, при этом + * приватные начинаются с подчёркивания. + * + * В силу отсутствия адекватной реализации приватных методов в Typst + * приватность --- лишь условное соглашение: такие методы не предназначены + * для вызова извне, хотя фактически такая возможность имеется. + * Не делайте так! + * + * - Чтобы не засорять кодовую базу, строковые константы вынесены в + * переменную strings. + */ +#let strings = ( + title: ( + minobrnauki: "МИНОБРНАУКИ РОССИИ\nФедеральное государственное бюджетное образовательное учреждение\nвысшего образования\n", + sgu: "«САРАТОВСКИЙ НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ +ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ +ИМЕНИ Н. Г. ЧЕРНЫШЕВСКОГО»\n", + city: "Саратов" + ), + student: ( + male: "студента", + female: "студентки", + plural: "студентов", + ), + specialities: ( + spec_kb: [10.05.01 --- Компьютерная безопасность], + bac_ivt: [09.03.01 --- Информатика и вычислительная техника], + bac_moais: [02.03.03 --- Математическое обеспечение и администрирование информационных систем], + bac_fiit: [02.03.02 --- Фундаментальная информатика и информационные технологии], + bac_pi: [09.03.04 --- Программная инженерия], + mag_ivt: [09.04.01 --- Информатика и вычислительная техника], + mag_moais: [02.04.03 --- Математическое обеспечение и администрирование информационных систем], + ), + error: ( + no_sex: [*6.21 КоАП РФ*] + ) +) + -#let signature(post, name) = { - grid( - columns: (1fr,) * 3, - align: (left, center, right), - row-gutter: 5pt, - post, block(inset: (y: 13pt), line(length: 3cm, stroke: .4pt)), name - ) -} #let get_student_word(sex) = { - if sex == "male" { - return "студента" - } else if sex == "female" { - return "студентки" - } else if sex == "plural" { - return "студентов" - } + return strings.student.at(sex, default: strings.error.no_sex) } #let get_speciality(group) = { - let specialities = ( - [02.03.02 --- Фундаментальная информатика и информационные технологии], - [09.03.01 --- Информатика и вычислительная техника], - [10.05.01 --- Компьютерная безопасность], - [02.03.03 --- Математическое обеспечение и администрирование информационных систем], - [09.03.04 --- Программная инженерия], - [], // x6x - [09.04.01 --- Информатика и вычислительная техника], - [02.04.03 --- Математическое обеспечение и администрирование информационных систем], - [], // x8x - ) - if group.at(1) == "7" { // x7x - if group.at(2) == "1" { // x71 - return specialities.at(6) // ивт - } else if group.at(2) == "3" { // x73 - return specialities.at(7) // моаис - } - return [] - } - let id = int(group.at(1)) - 1; - - if id < 0 or id > 8 { - return [] - } - return specialities.at(id) -} - -#let default_title(type, info) = { - let author = info.at("author", default: (:)) - set align(center) - v(3cm) - if type == "autoref" { - info.title = [АВТОРЕФЕРАТ] - } - if type == "nir" { - info.title = [ОТЧЁТ О НАУЧНО-ИССЛЕДОВАТЕЛЬСКОЙ РАБОТЕ] - } - text(weight: "bold", upper(info.at("title", default: [Тема работы]))) - let worktypes = ( - referat: [РЕФЕРАТ], - coursework: [КУРСОВАЯ РАБОТА], - diploma: [Выпускная квалификационная работа], - autoref: [работа], - nir: [работа], - pract: [Отчёт о практике] - ) - par(worktypes.at(type, default: [])) - v(1.5cm) - set align(left) - let author_string = get_student_word(author.at("sex", default: "male")) - author_string = author_string + " " + author.group.at(0) + " курса " + author.group + " группы\n" - if author.faculty == [КНиИТ] { - author_string = author_string + "направления " + get_speciality(author.group) + "\n" - } else if author.at("speciality", default: []) != [] { - author_string = author_string + "направления " + author.speciality + "\n" - } - - text(author_string + "факультета " + author.faculty + "\n" + author.name) - v(1fr) - text("Проверено:\n") - signature(info.inspector.degree, info.inspector.name) + let specialities = ( + strings.specialities.bac_fiit, + strings.specialities.bac_ivt, + strings.specialities.spec_kb, + strings.specialities.bac_moais, + strings.specialities.bac_pi, + [], // x6x + strings.specialities.mag_ivt, + strings.specialities.mag_moais, + [], // x8x + ) + if group.at(1) == "7" { // x7x + if group.at(2) == "1" { // x71 + return specialities.at(6) // ивт + } else if group.at(2) == "3" { // x73 + return specialities.at(7) // моаис + } + return [] + } + let id = int(group.at(1)) - 1; + + if id < 0 or id > 8 { + return [] + } + return specialities.at(id) } #let otchet_title(info) = { - let author = info.at("author", default: (:)) - set align(center) + let author = info.at("author", default: (:)) + set align(center) } -#let make_title( - type: str, - info: () -) = { - set page( - paper: "a4", - margin: ( - top: 2cm, - bottom: 2cm, - left: 2.5cm, - right: 1.5cm - ) - ) - - header() - default_title(type, info) - - v(1fr) - set align(center) - text("Саратов 2024") -} + +#let modules = ( + author_info: ( + get_author_sex: + (author) => { + return strings.student.at(author.at("sex"), default: strings.error.no_sex) + }, + get_author_course: + (author) => { + return author.group.at(0) + }, + get_author_group: + (author) => { + return author.group + } + ), + title: ( + /* + * Отвечает за вывод названия университета + * на титульном листе + */ + _header: + () => { + set align(center) + set text(font: "Tempora") + text(strings.title.minobrnauki) + v(0.2em) + text(weight: "bold", strings.title.sgu) + set align(left) + }, + + /* + * Подпись "Проверено:" для титульного листа + */ + _signature: + (post, name) => { + grid( + columns: (1fr,) * 3, + align: (left, center, right), + row-gutter: 5pt, + post, block(inset: (y: 13pt), line(length: 3cm, stroke: .4pt)), name + ) + }, + _get_author_string: + (self, author) => { + let sex = self.author_info.get_author_sex(author) + let course = self.author_info.get_author_course(author) + let group = self.author_info.get_author_group(author) + let result = "" + if (type(sex) == str) and (sex.len() > 0) { + result = result + sex + } + + author_string = author_string + " " + author.group.at(0) + " курса " + author.group + " группы\n" + }, + _default_title: + (self, type, info) => { + let author = info.at("author", default: (:)) + set align(center) + v(3cm) + if type == "autoref" { + info.title = [АВТОРЕФЕРАТ] + } + if type == "nir" { + info.title = [ОТЧЁТ О НАУЧНО-ИССЛЕДОВАТЕЛЬСКОЙ РАБОТЕ] + } + text(weight: "bold", upper(info.at("title", default: [Тема работы]))) + let worktypes = ( + referat: [РЕФЕРАТ], + coursework: [КУРСОВАЯ РАБОТА], + diploma: [Выпускная квалификационная работа], + autoref: [работа], + nir: [работа], + pract: [Отчёт о практике] + ) + par(worktypes.at(type, default: [])) + v(1.5cm) + set align(left) + let author_string = get_student_word(author.at("sex")) + author_string = author_string + " " + author.group.at(0) + " курса " + author.group + " группы\n" + if author.faculty == [КНиИТ] { + author_string = author_string + "направления " + get_speciality(author.group) + "\n" + } else if author.at("speciality", default: []) != [] { + author_string = author_string + "направления " + author.speciality + "\n" + } + + text(author_string + "факультета " + author.faculty + "\n" + author.name) + v(1fr) + text("Проверено:\n") + (self.title._signature)(info.inspector.degree, info.inspector.name) + }, + make: + ( + self, + type: str, + info: () + ) => { + set page( + paper: "a4", + margin: ( + top: 2cm, + bottom: 2cm, + left: 2.5cm, + right: 1.5cm + ) + ) + + (self.title._header)() + (self.title._default_title)(self, type, info) + + v(1fr) + set align(center) + text(strings.title.city + " " + str(datetime.today().year())) + } + ), + utils: ( + strglue: + ( + divider: " ", + ..strings + ) => { + let result = str(strings[0]) + let i = 1 + while i < strings.len() { + if( + (type(strings[i]) != str) + or + ((result.len() > 0) and (strings[i].len() > 0)) + ) { + result = result + " " + } + result = result = str(strings[i]) + } + } + ) +) + #let make_toc( - info: () + info: () ) = { - outline(indent: 2%, title: [Содержание]) - pagebreak(weak: true) -} - -#let aboba(settings: ()) = { - + outline(indent: 2%, title: [Содержание]) + pagebreak(weak: true) } #let conf( - title: none, - info: (), - type: "referat", - settings: (), - doc + title: none, + info: (), + type: "referat", + settings: (), + doc ) = { - info.title = title - settings.title_page = settings.at("title_page", default: (:)) + info.title = title + settings.title_page = settings.at("title_page", default: (:)) - set text( - size: 14pt - ) + set text( + size: 14pt + ) - if settings.title_page.at("enabled", default: true) { - make_title(type: type, info: info) - } - set align(left) + if settings.title_page.at("enabled", default: true) { + (modules.title.make)(modules, type: type, info: info) + } + set align(left) - set page(footer: context [ - #h(1fr) - #counter(page).display( - "1" - ) - ]) - - - let caps_headings = ( - [Содержание], - [Введение], - [Заключение], - [Список использованных источников], - [Определения, обозначения и сокращения], - [Обозначения и сокращения] - ) - show heading: it => { - set text(size: 14pt) - if it.depth == 1 { - pagebreak(weak: true) - v(4.3pt * (3 + 1 - 0.2)) - } - if caps_headings.contains(it.body) { - set align(center) - counter(heading).update(i => i - 1) - upper(it.body) - } else { - it - } - v(4.3pt * (0.4 + 0.2)) - } - set heading(numbering: "1.1") - set page(numbering: "1") - // Отступ начала абазаца 1.25 см и выравнивание по ширине - set par( - justify: true - ) - if settings.contents_page.enabled { - make_toc(info: info) - } - set math.equation(numbering: "(1)", supplement: []) - set figure(supplement: "Рис.") - doc + set page(footer: context [ + #h(1fr) + #counter(page).display( + "1" + ) + ]) + + + let caps_headings = ( + [Содержание], + [Введение], + [Заключение], + [Список использованных источников], + [Определения, обозначения и сокращения], + [Обозначения и сокращения] + ) + show heading: it => { + set text(size: 14pt) + if it.depth == 1 { + pagebreak(weak: true) + v(4.3pt * (3 + 1 - 0.2)) + } + if caps_headings.contains(it.body) { + set align(center) + counter(heading).update(i => i - 1) + upper(it.body) + } else { + it + } + v(4.3pt * (0.4 + 0.2)) + } + set heading(numbering: "1.1") + set page(numbering: "1") + // Отступ начала абазаца 1.25 см и выравнивание по ширине + set par( + justify: true + ) + if settings.contents_page.enabled { + make_toc(info: info) + } + set math.equation(numbering: "(1)", supplement: []) + set figure(supplement: "Рис.") + doc - /*let count = authors.len() - let ncols = calc.min(count, 3) - grid( - columns: (1fr,) * ncols, - row-gutter: 24pt, - ..authors.map(author => [ - #author.name \ - #author.affiliation \ - #link("mailto:" + author.email) - ]), - ) + /*let count = authors.len() + let ncols = calc.min(count, 3) + grid( + columns: (1fr,) * ncols, + row-gutter: 24pt, + ..authors.map(author => [ + #author.name \ + #author.affiliation \ + #link("mailto:" + author.email) + ]), + ) - par(justify: false)[ - *Abstract* \ - #abstract - ]*/ + par(justify: false)[ + *Abstract* \ + #abstract + ]*/ } @@ -220,46 +313,46 @@ #let sequence = [].func() #let turn-on-first-line-indentation( - doc, - last-is-heading: false, // space and parbreak are ignored - indent-already-added: false, + doc, + last-is-heading: false, // space and parbreak are ignored + indent-already-added: false, ) = { - for (i, elem) in doc.children.enumerate() { - let element = elem.func() - if element == text { - let previous-elem = doc.children.at(i - 1) - if i == 0 or last-is-heading or previous-elem.func() == parbreak { - if not indent-already-added { - indent-already-added = true - h(indent) - } - } - elem - } else if element == heading { - indent-already-added = false - last-is-heading = true - elem - } else if element == space { - elem - } else if element == parbreak { - indent-already-added = false - elem - } else if element == sequence { - turn-on-first-line-indentation( - elem, - last-is-heading: last-is-heading, - indent-already-added: indent-already-added, - ) - } else if element == styled { - styled(turn-on-first-line-indentation( - elem.child, - last-is-heading: last-is-heading, - indent-already-added: indent-already-added, - ), elem.styles) - } else { - indent-already-added = false - last-is-heading = false - elem - } - } + for (i, elem) in doc.children.enumerate() { + let element = elem.func() + if element == text { + let previous-elem = doc.children.at(i - 1) + if i == 0 or last-is-heading or previous-elem.func() == parbreak { + if not indent-already-added { + indent-already-added = true + h(indent) + } + } + elem + } else if element == heading { + indent-already-added = false + last-is-heading = true + elem + } else if element == space { + elem + } else if element == parbreak { + indent-already-added = false + elem + } else if element == sequence { + turn-on-first-line-indentation( + elem, + last-is-heading: last-is-heading, + indent-already-added: indent-already-added, + ) + } else if element == styled { + styled(turn-on-first-line-indentation( + elem.child, + last-is-heading: last-is-heading, + indent-already-added: indent-already-added, + ), elem.styles) + } else { + indent-already-added = false + last-is-heading = false + elem + } + } } -- cgit v1.2.3 From 2ba62d0d2fd6d1158f003eaf0250dae0a2e6f130 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=B0=D0=BD=D0=B8=D0=B4=D0=BB=D0=B0=20=D0=93=D1=80?= =?UTF-8?q?=D0=B8=D0=B3=D0=BE=D1=80=D1=8C=D0=B5=D0=B2?= Date: Wed, 1 Jan 2025 13:19:57 +0000 Subject: =?UTF-8?q?=D1=80=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE=C3=90=D1=80:?= =?UTF-8?q?=20=D1=81=D1=82=D1=80=D0=BE=D0=BA=C3=90=D0=B0=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=BB=D1=82=C3=90=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D1=82=D0=B5?= =?UTF-8?q?=D0=BB=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf.typ | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) (limited to 'conf.typ') diff --git a/conf.typ b/conf.typ index bf19069..615aca1 100644 --- a/conf.typ +++ b/conf.typ @@ -126,12 +126,14 @@ let sex = self.author_info.get_author_sex(author) let course = self.author_info.get_author_course(author) let group = self.author_info.get_author_group(author) - let result = "" - if (type(sex) == str) and (sex.len() > 0) { - result = result + sex - } - - author_string = author_string + " " + author.group.at(0) + " курса " + author.group + " группы\n" + if course.len() > 0 { + course = self.uitls.strglue(course, "курса") + } + if group.len() > 0 { + group = self.utils.strglue(group, "группа") + } + let result = self.utils.strglue(sex, course, group) + "\n" + return result }, _default_title: (self, type, info) => { -- cgit v1.2.3 From ca0a5231eef01e72e8a038cab0f14b978b7a6966 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=B0=D0=BD=D0=B8=D0=B4=D0=BB=D0=B0=20=D0=93=D1=80?= =?UTF-8?q?=D0=B8=D0=B3=D0=BE=D1=80=D1=8C=D0=B5=D0=B2?= Date: Wed, 1 Jan 2025 13:59:55 +0000 Subject: =?UTF-8?q?=D1=80=D1=83=D1=82=D0=B8=D0=BD=D0=B0:=20=D0=B4=D0=BE?= =?UTF-8?q?=D0=BA=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D0=B8=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf.typ | 3 +++ 1 file changed, 3 insertions(+) (limited to 'conf.typ') diff --git a/conf.typ b/conf.typ index 615aca1..6aa8d0f 100644 --- a/conf.typ +++ b/conf.typ @@ -121,6 +121,9 @@ post, block(inset: (y: 13pt), line(length: 3cm, stroke: .4pt)), name ) }, + /* + * Строка "студента такой-то группы" для титульного листа + */ _get_author_string: (self, author) => { let sex = self.author_info.get_author_sex(author) -- cgit v1.2.3 From cdc894b15cf97939d61fb7a52e04c93c2be8a084 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=B0=D0=BD=D0=B8=D0=B4=D0=BB=D0=B0=20=D0=93=D1=80?= =?UTF-8?q?=D0=B8=D0=B3=D0=BE=D1=80=D1=8C=D0=B5=D0=B2?= Date: Wed, 1 Jan 2025 14:38:47 +0000 Subject: =?UTF-8?q?=D1=84=D0=B8=D1=87=D0=B0:=20=D1=82=D0=B8=D0=BF=D1=8B=20?= =?UTF-8?q?=D1=80=D0=B0=D0=B1=D0=BE=D1=82=20=D0=B2=D1=8B=D0=BD=D0=B5=D1=81?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20=D0=B2=20=D1=81=D0=BB=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D1=80=C3=91=D1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf.typ | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) (limited to 'conf.typ') diff --git a/conf.typ b/conf.typ index 6aa8d0f..18be1ee 100644 --- a/conf.typ +++ b/conf.typ @@ -18,7 +18,16 @@ sgu: "«САРАТОВСКИЙ НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ИМЕНИ Н. Г. ЧЕРНЫШЕВСКОГО»\n", - city: "Саратов" + city: "Саратов", + worktypes: ( + referat: [РЕФЕРАТ], + coursework: [КУРСОВАЯ РАБОТА], + diploma: [Выпускная квалификационная работа], + autoref: [работа], + nir: [работа], + pract: [Отчёт о практике] + ), + ), student: ( male: "студента", @@ -150,15 +159,7 @@ info.title = [ОТЧЁТ О НАУЧНО-ИССЛЕДОВАТЕЛЬСКОЙ РАБОТЕ] } text(weight: "bold", upper(info.at("title", default: [Тема работы]))) - let worktypes = ( - referat: [РЕФЕРАТ], - coursework: [КУРСОВАЯ РАБОТА], - diploma: [Выпускная квалификационная работа], - autoref: [работа], - nir: [работа], - pract: [Отчёт о практике] - ) - par(worktypes.at(type, default: [])) + par(strings.title.worktypes.at(type, default: [])) v(1.5cm) set align(left) let author_string = get_student_word(author.at("sex")) -- cgit v1.2.3 From b8614c828074b480cd2925da5cf7e814bd825ed2 Mon Sep 17 00:00:00 2001 From: danilasar Date: Thu, 2 Jan 2025 16:19:40 +0400 Subject: =?UTF-8?q?=D1=84=D0=B8=D1=87=D0=B0:=20strglue?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf.typ | 105 ++++++++++++++++++++++++++++++++++----------------------------- 1 file changed, 56 insertions(+), 49 deletions(-) (limited to 'conf.typ') diff --git a/conf.typ b/conf.typ index 18be1ee..de3806b 100644 --- a/conf.typ +++ b/conf.typ @@ -19,15 +19,16 @@ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ИМЕНИ Н. Г. ЧЕРНЫШЕВСКОГО»\n", city: "Саратов", - worktypes: ( + worktypes: ( referat: [РЕФЕРАТ], coursework: [КУРСОВАЯ РАБОТА], - diploma: [Выпускная квалификационная работа], + diploma: [Выпускная квалификационная работа], autoref: [работа], nir: [работа], pract: [Отчёт о практике] - ), - + ), + from_course: "курса", + from_group: "группы" ), student: ( male: "студента", @@ -117,12 +118,23 @@ text(weight: "bold", strings.title.sgu) set align(left) }, + /* + * Отвечает за вывод города и года на + * титульном листе + */ + _footer: + () => { + v(1fr) + set align(center) + text(strings.title.city + " " + str(datetime.today().year())) + }, /* * Подпись "Проверено:" для титульного листа */ _signature: (post, name) => { + text("Проверено:\n") grid( columns: (1fr,) * 3, align: (left, center, right), @@ -130,25 +142,35 @@ post, block(inset: (y: 13pt), line(length: 3cm, stroke: .4pt)), name ) }, - /* - * Строка "студента такой-то группы" для титульного листа - */ + /* + * Строка "студента такой-то группы" для титульного листа + */ _get_author_string: (self, author) => { - let sex = self.author_info.get_author_sex(author) - let course = self.author_info.get_author_course(author) - let group = self.author_info.get_author_group(author) - if course.len() > 0 { - course = self.uitls.strglue(course, "курса") - } - if group.len() > 0 { - group = self.utils.strglue(group, "группа") - } - let result = self.utils.strglue(sex, course, group) + "\n" - return result + let sex = (self.author_info.get_author_sex)(author) + let course = (self.author_info.get_author_course)(author) + let group = (self.author_info.get_author_group)(author) + if course.len() > 0 { + course = (self.utils.strglue)(course, strings.title.from_course) + } + if group.len() > 0 { + group = (self.utils.strglue)(group, strings.title.from_group) + } + let result = (self.utils.strglue)(sex, course, group) + "\n" + return result }, _default_title: (self, type, info) => { + set page( + paper: "a4", + margin: ( + top: 2cm, + bottom: 2cm, + left: 2.5cm, + right: 1.5cm + ) + ) + (self.title._header)() let author = info.at("author", default: (:)) set align(center) v(3cm) @@ -162,41 +184,26 @@ par(strings.title.worktypes.at(type, default: [])) v(1.5cm) set align(left) - let author_string = get_student_word(author.at("sex")) - author_string = author_string + " " + author.group.at(0) + " курса " + author.group + " группы\n" + (self.title._get_author_string)(self, author) if author.faculty == [КНиИТ] { - author_string = author_string + "направления " + get_speciality(author.group) + "\n" + text("направления " + get_speciality(author.group) + "\n") } else if author.at("speciality", default: []) != [] { - author_string = author_string + "направления " + author.speciality + "\n" + text("направления " + author.speciality + "\n") } - - text(author_string + "факультета " + author.faculty + "\n" + author.name) + text("факультета " + author.faculty + "\n" + author.name) v(1fr) - text("Проверено:\n") (self.title._signature)(info.inspector.degree, info.inspector.name) + (self.title._footer)() }, + ), + document: ( make: ( self, type: str, info: () ) => { - set page( - paper: "a4", - margin: ( - top: 2cm, - bottom: 2cm, - left: 2.5cm, - right: 1.5cm - ) - ) - - (self.title._header)() - (self.title._default_title)(self, type, info) - - v(1fr) - set align(center) - text(strings.title.city + " " + str(datetime.today().year())) + (self.title._default_title)(self, type, info) } ), utils: ( @@ -205,18 +212,18 @@ divider: " ", ..strings ) => { - let result = str(strings[0]) - let i = 1 - while i < strings.len() { + let result = "" + for string in strings.pos() { if( - (type(strings[i]) != str) - or - ((result.len() > 0) and (strings[i].len() > 0)) + (result.len() > 0) + and + ((type(string) != str) or (string.len() > 0)) ) { result = result + " " } - result = result = str(strings[i]) + result = result + string } + return result } ) ) @@ -246,7 +253,7 @@ ) if settings.title_page.at("enabled", default: true) { - (modules.title.make)(modules, type: type, info: info) + (modules.document.make)(modules, type: type, info: info) } set align(left) -- cgit v1.2.3 From 7e980a07537655d1ba4c677f6fff75be29e77bec Mon Sep 17 00:00:00 2001 From: danilasar Date: Thu, 2 Jan 2025 20:49:41 +0400 Subject: =?UTF-8?q?=D1=80=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE=D1=80:=20?= =?UTF-8?q?=D1=81=D1=82=D1=80=D1=83=D0=BA=D1=82=D1=83=D1=80=D0=B8=D0=B7?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8F=20=D0=BA=D0=BE=D0=B4=D0=B0=20=D1=82?= =?UTF-8?q?=D0=B8=D1=82=D1=83=D0=BB=D1=8C=D0=BD=D0=BE=D0=B9=20=D1=81=D1=82?= =?UTF-8?q?=D1=80=D0=B0=D0=BD=D0=B8=D1=86=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf.typ | 163 ++++++++++++++++++++++++++++++++++++++------------------------- 1 file changed, 98 insertions(+), 65 deletions(-) (limited to 'conf.typ') diff --git a/conf.typ b/conf.typ index de3806b..4442e83 100644 --- a/conf.typ +++ b/conf.typ @@ -12,6 +12,9 @@ * - Чтобы не засорять кодовую базу, строковые константы вынесены в * переменную strings. */ + + + #let strings = ( title: ( minobrnauki: "МИНОБРНАУКИ РОССИИ\nФедеральное государственное бюджетное образовательное учреждение\nвысшего образования\n", @@ -28,7 +31,8 @@ pract: [Отчёт о практике] ), from_course: "курса", - from_group: "группы" + from_group: "группы", + from_speciality: "направления" ), student: ( male: "студента", @@ -45,7 +49,8 @@ mag_moais: [02.04.03 --- Математическое обеспечение и администрирование информационных систем], ), error: ( - no_sex: [*6.21 КоАП РФ*] + no_sex: [*6.21 КоАП РФ*], + undefined_spec: [*НЕИЗВЕСТНАЯ СПЕЦИАЛЬНОСТЬ*] ) ) @@ -55,34 +60,6 @@ return strings.student.at(sex, default: strings.error.no_sex) } -#let get_speciality(group) = { - let specialities = ( - strings.specialities.bac_fiit, - strings.specialities.bac_ivt, - strings.specialities.spec_kb, - strings.specialities.bac_moais, - strings.specialities.bac_pi, - [], // x6x - strings.specialities.mag_ivt, - strings.specialities.mag_moais, - [], // x8x - ) - if group.at(1) == "7" { // x7x - if group.at(2) == "1" { // x71 - return specialities.at(6) // ивт - } else if group.at(2) == "3" { // x73 - return specialities.at(7) // моаис - } - return [] - } - let id = int(group.at(1)) - 1; - - if id < 0 or id > 8 { - return [] - } - return specialities.at(id) -} - #let otchet_title(info) = { let author = info.at("author", default: (:)) set align(center) @@ -102,6 +79,39 @@ get_author_group: (author) => { return author.group + }, + get_speciality: + (author) => { + if author.at("speciality", default: none) != none { + return author.speciality + } else if author.faculty == [КНиИТ] { + let specialities = ( + strings.specialities.bac_fiit, + strings.specialities.bac_ivt, + strings.specialities.spec_kb, + strings.specialities.bac_moais, + strings.specialities.bac_pi, + [], // x6x + strings.specialities.mag_ivt, + strings.specialities.mag_moais, + [], // x8x + ) + if author.group.at(1) == "7" { // x7x + if author.group.at(2) == "1" { // x71 + return specialities.at(6) // ивт + } else if author.group.at(2) == "3" { // x73 + return specialities.at(7) // моаис + } + return [] + } + let id = int(author.group.at(1)) - 1; + + if id < 0 or id > 8 { + return [] + } + return specialities.at(id) + } + return strings.error.undefined_spec } ), title: ( @@ -109,7 +119,7 @@ * Отвечает за вывод названия университета * на титульном листе */ - _header: + _default_header: () => { set align(center) set text(font: "Tempora") @@ -118,11 +128,22 @@ text(weight: "bold", strings.title.sgu) set align(left) }, + _default_body: + (data) => { + set align(center) + v(3cm) + text(weight: "bold", upper(data.title)) + par(data.worktype) + v(1.5cm) + set align(left) + text(data.group + "\n") + text(data.speciality + "\n") + text(data.faculty + "\n" + data.author) + }, /* - * Отвечает за вывод города и года на - * титульном листе + * Отвечает за вывод города и года на титульном листе */ - _footer: + _default_footer: () => { v(1fr) set align(center) @@ -156,44 +177,47 @@ if group.len() > 0 { group = (self.utils.strglue)(group, strings.title.from_group) } - let result = (self.utils.strglue)(sex, course, group) + "\n" + let result = (self.utils.strglue)(sex, course, group) return result }, - _default_title: - (self, type, info) => { - set page( - paper: "a4", - margin: ( - top: 2cm, - bottom: 2cm, - left: 2.5cm, - right: 1.5cm - ) - ) - (self.title._header)() - let author = info.at("author", default: (:)) - set align(center) - v(3cm) + _get_title_string: + (info, type) => { if type == "autoref" { - info.title = [АВТОРЕФЕРАТ] + return [АВТОРЕФЕРАТ] } if type == "nir" { - info.title = [ОТЧЁТ О НАУЧНО-ИССЛЕДОВАТЕЛЬСКОЙ РАБОТЕ] + return [ОТЧЁТ О НАУЧНО-ИССЛЕДОВАТЕЛЬСКОЙ РАБОТЕ] } - text(weight: "bold", upper(info.at("title", default: [Тема работы]))) - par(strings.title.worktypes.at(type, default: [])) - v(1.5cm) - set align(left) - (self.title._get_author_string)(self, author) - if author.faculty == [КНиИТ] { - text("направления " + get_speciality(author.group) + "\n") - } else if author.at("speciality", default: []) != [] { - text("направления " + author.speciality + "\n") - } - text("факультета " + author.faculty + "\n" + author.name) + return info.at("title", default: [Тема работы]) + }, + _get_strings: + (self, type, info) => { + let author = info.at("author", default: (:)) + let title_string = (self.title._get_title_string)(info, type) + let worktype = strings.title.worktypes.at(type, default: []) + let group_string = (self.title._get_author_string)(self, author) + let speciality_string = (self.utils.strglue)( + strings.title.from_speciality, + (self.author_info.get_speciality)(author) + ) + let faculty_string = "факультета " + author.faculty + return ( + title: title_string, + worktype: worktype, + group: group_string, + speciality: speciality_string, + faculty: faculty_string, + author: author.name + ) + }, + make: + (self, type, info) => { + let strs = (self.title._get_strings)(self, type, info) + (self.title._default_header)() + (self.title._default_body)(strs) v(1fr) (self.title._signature)(info.inspector.degree, info.inspector.name) - (self.title._footer)() + (self.title._default_footer)() }, ), document: ( @@ -203,7 +227,16 @@ type: str, info: () ) => { - (self.title._default_title)(self, type, info) + set page( + paper: "a4", + margin: ( + top: 2cm, + bottom: 2cm, + left: 2.5cm, + right: 1.5cm + ) + ) + (self.title.make)(self, type, info) } ), utils: ( -- cgit v1.2.3 From 068191e86f1d85b86b510025422f3b6e107c61f1 Mon Sep 17 00:00:00 2001 From: danilasar Date: Thu, 2 Jan 2025 21:44:09 +0400 Subject: =?UTF-8?q?=D1=80=D1=83=D1=82=D0=B8=D0=BD=D0=B0:=20=D0=B4=D0=BE?= =?UTF-8?q?=D0=BA=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D0=B8=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=BA=D0=BE=D0=B4=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf.typ | 152 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 149 insertions(+), 3 deletions(-) (limited to 'conf.typ') diff --git a/conf.typ b/conf.typ index 4442e83..6d286b5 100644 --- a/conf.typ +++ b/conf.typ @@ -67,19 +67,73 @@ #let modules = ( + /* + * Модуль информации об авторе + * Позволяет получать более полную и отформатированную + * информацию об авторе: студент/студентки/студентов (get_author_sex), + * номер курса, группы и так далее. + * Конечно, некоторые из этих вещей в открытом виде + * лежат в словаре author, но некоторые данные + * нуждаются в постобработке или вовсе получаются + * косвенным путём. Необходимость в постобработке + * может возникнуть и позднее, поэтому настоятельно + * рекомендуется пользоваться именно этими методами, а + * не получать код напрямую. + */ author_info: ( + /* + * Определяет студенческо-половую сущность автора. + * Принимает: + * - author - словарь про автора + * Возвращает: + * - В зависимости от пола: "студента", "студентки", "студентов" + */ get_author_sex: (author) => { - return strings.student.at(author.at("sex"), default: strings.error.no_sex) + return strings.student.at( + author.at("sex"), + default: strings.error.no_sex + ) }, + /* + * Определяет курс автора (по номеру группы) + * Принимает: + * - author - словарь про автора + * Возвращает: + * - Номер курса в строковом формате + */ get_author_course: (author) => { return author.group.at(0) }, + /* + * Определяет группу автора + * Принимает: + * - author - словарь про автора + * Возвращает: + * - Номер группы в строковом формате + * Примечание: на текущий момент функция + * ничего не делает, но, возможно, это + * не навсегда и в будущем здесь что-то + * может появиться. Чтобы потом не мучиться + * с рефакторингом, лучше получать номер группы + * через неё. + */ get_author_group: (author) => { return author.group }, + /* + * Определяет код и название направления автора + * Принимает: + * - author - словарь про автора + * Возвращает: + * - author.speciality, если таковой указан + * - В противном случае, если студент учится на КНиИТе, + * для студента работает аттракцион невиданной + * технологичности: код и название специальности + * определяются автоматически + */ get_speciality: (author) => { if author.at("speciality", default: none) != none { @@ -114,10 +168,27 @@ return strings.error.undefined_spec } ), + + /* + * Модуль титульного листа + * Здесь происходит генерация титульного листа и + * определяются все необходимые для этого методы. + * Поскольку его создание --- задача не такая уж + * и тривиальная, здесь есть много приватных методов + * и ваш покорный слуга ещё раз напоминает о + * нежелательности их вызова извне. Если такая необходимость + * всё же возникает, лучше переименовать метод и убрать + * подчёркивание: впоследствии это можно будет хотя бы как-то + * отладить. + * + * Изначально задумывалось, что единственный доступный + * для вызова извне метод --- make, а в остальных не + * должно возникнуть необходимости. + */ title: ( /* - * Отвечает за вывод названия университета - * на титульном листе + * Отвечает за вывод названия министерства и + * университета на титульном листе */ _default_header: () => { @@ -128,6 +199,14 @@ text(weight: "bold", strings.title.sgu) set align(left) }, + /* + * Отвечает за вывод тела титульного листа: + * заголовок (название работы, если не определено иное), + * тип работы, информация об авторе + * + * Информация о проверяющем преподавателе + * генерируется не здесь по историческим причинам. + */ _default_body: (data) => { set align(center) @@ -180,6 +259,16 @@ let result = (self.utils.strglue)(sex, course, group) return result }, + /* + * Получает заголовок титульного листа. + * Принимает: + * - info - информация о документе + * - type - тип документа + * Возвращает: + * - В зависимости от типа: + * - Тему работы, если это не автореферат и не отчёт по НИРу + * - В противном случае названия соответствующих типов работ + */ _get_title_string: (info, type) => { if type == "autoref" { @@ -190,6 +279,20 @@ } return info.at("title", default: [Тема работы]) }, + /* + * Генерирует строки текста для вывода на титульном листе + * Принимает: + * - type - тип документа + * - info - информация о документе + * Возвращает: + * - Словарь: + * title: Заголовок + * worktype: Тип работы + * group: студент(а|ки|ов) s курса sex группы + * specialty: направления 69.14.88 --- Специальность + * faculty: факультета XXX + * author: автор(ы)? работы + */ _get_strings: (self, type, info) => { let author = info.at("author", default: (:)) @@ -210,6 +313,12 @@ author: author.name ) }, + /* + * Генерирует титульный лист + * Принимает: + * - type - тип документа + * - info - информация о документе + */ make: (self, type, info) => { let strs = (self.title._get_strings)(self, type, info) @@ -220,7 +329,21 @@ (self.title._default_footer)() }, ), + + /* + * Модуль генерации документа + * Здесь содержатся методы, влияющие на вид всего + * документа в целом. Главный из них --- make --- + * вызывается из точки входа в стилевой файл и + * отвечает за всё оформление выходного документа. + */ document: ( + /* + * Генерирует весь документ + * Принимает: + * - type - тип документа + * - info - информация о документе + */ make: ( self, @@ -239,7 +362,27 @@ (self.title.make)(self, type, info) } ), + + /* + * Помощник + * Модуль-помощник не содержит особой + * функциональности и не имеет конкретного + * назначения, но содержащиеся в нём методы + * могут быть полезны где угодно и не + * привязаны к конкретной части документа + */ utils: ( + /* + * Склеивает строки, игнорируя пустые + * Принимает: + * - divider - разделитель (по умолчанию пробел) + * - соединяемые строки в неограниченном количестве + * Примечание: метод похож по своей сути + * на join, но отличается от него наличием проверки + * на пустые строки: рядом с ними разделитель не + * ставится, что исключает присутствие двух разделителей + * подряд. + */ strglue: ( divider: " ", @@ -254,6 +397,9 @@ ) { result = result + " " } + // TODO: string было бы неплохо обернуть + // в str(), но баг в системе типов Typst + // не позволяет этого сделать result = result + string } return result -- cgit v1.2.3 From 5410a26074fac0134b8438f406070a6f74ce0f73 Mon Sep 17 00:00:00 2001 From: danilasar Date: Thu, 2 Jan 2025 22:14:39 +0400 Subject: =?UTF-8?q?=D1=80=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE=D1=80:=20?= =?UTF-8?q?=D1=82=D0=B8=D0=BF=20=D0=B4=D0=BE=D0=BA=D1=83=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=D0=B0=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BD=D0=B5=D1=81=D1=91?= =?UTF-8?q?=D0=BD=20=D0=B2=20=D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D1=8E=20=D0=BE=20=D0=B4=D0=BE=D0=BA=D1=83=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D1=82=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf.typ | 173 ++++++++++++++++++++++++++++----------------------------------- 1 file changed, 78 insertions(+), 95 deletions(-) (limited to 'conf.typ') diff --git a/conf.typ b/conf.typ index 6d286b5..9afcf75 100644 --- a/conf.typ +++ b/conf.typ @@ -66,6 +66,15 @@ } +#let make_toc( + info: () +) = { + + outline(indent: 2%, title: [Содержание]) + pagebreak(weak: true) +} + + #let modules = ( /* * Модуль информации об авторе @@ -263,18 +272,17 @@ * Получает заголовок титульного листа. * Принимает: * - info - информация о документе - * - type - тип документа * Возвращает: * - В зависимости от типа: * - Тему работы, если это не автореферат и не отчёт по НИРу * - В противном случае названия соответствующих типов работ */ _get_title_string: - (info, type) => { - if type == "autoref" { + (info) => { + if info.type == "autoref" { return [АВТОРЕФЕРАТ] } - if type == "nir" { + if info.type == "nir" { return [ОТЧЁТ О НАУЧНО-ИССЛЕДОВАТЕЛЬСКОЙ РАБОТЕ] } return info.at("title", default: [Тема работы]) @@ -282,7 +290,6 @@ /* * Генерирует строки текста для вывода на титульном листе * Принимает: - * - type - тип документа * - info - информация о документе * Возвращает: * - Словарь: @@ -294,10 +301,10 @@ * author: автор(ы)? работы */ _get_strings: - (self, type, info) => { + (self, info) => { let author = info.at("author", default: (:)) - let title_string = (self.title._get_title_string)(info, type) - let worktype = strings.title.worktypes.at(type, default: []) + let title_string = (self.title._get_title_string)(info) + let worktype = strings.title.worktypes.at(info.type, default: []) let group_string = (self.title._get_author_string)(self, author) let speciality_string = (self.utils.strglue)( strings.title.from_speciality, @@ -316,12 +323,11 @@ /* * Генерирует титульный лист * Принимает: - * - type - тип документа * - info - информация о документе */ make: - (self, type, info) => { - let strs = (self.title._get_strings)(self, type, info) + (self, info) => { + let strs = (self.title._get_strings)(self, info) (self.title._default_header)() (self.title._default_body)(strs) v(1fr) @@ -341,14 +347,15 @@ /* * Генерирует весь документ * Принимает: - * - type - тип документа * - info - информация о документе + * - doc - содержимое документа */ make: ( self, - type: str, - info: () + info: (), + settings, + doc ) => { set page( paper: "a4", @@ -359,7 +366,58 @@ right: 1.5cm ) ) - (self.title.make)(self, type, info) + set text( + size: 14pt + ) + + if settings.title_page.at("enabled", default: true) { + (self.title.make)(self, info) + } + set align(left) + + set page(footer: context [ + #h(1fr) + #counter(page).display( + "1" + ) + ]) + + + let caps_headings = ( + [Содержание], + [Введение], + [Заключение], + [Список использованных источников], + [Определения, обозначения и сокращения], + [Обозначения и сокращения] + ) + show heading: it => { + set text(size: 14pt) + if it.depth == 1 { + pagebreak(weak: true) + v(4.3pt * (3 + 1 - 0.2)) + } + if caps_headings.contains(it.body) { + set align(center) + counter(heading).update(i => i - 1) + upper(it.body) + } else { + it + } + v(4.3pt * (0.4 + 0.2)) + } + set heading(numbering: "1.1") + set page(numbering: "1") + // Отступ начала абазаца 1.25 см и выравнивание по ширине + set par( + justify: true + ) + if settings.contents_page.enabled { + make_toc(info: info) + } + set math.equation(numbering: "(1)", supplement: []) + set figure(supplement: "Рис.") + doc } ), @@ -407,15 +465,9 @@ ) ) - -#let make_toc( - info: () -) = { - - outline(indent: 2%, title: [Содержание]) - pagebreak(weak: true) -} - +/* + * Точка входа, просто вызывает modules.document.make + */ #let conf( title: none, info: (), @@ -424,78 +476,9 @@ doc ) = { info.title = title + info.type = type settings.title_page = settings.at("title_page", default: (:)) - - - set text( - size: 14pt - ) - - if settings.title_page.at("enabled", default: true) { - (modules.document.make)(modules, type: type, info: info) - } - set align(left) - - set page(footer: context [ - #h(1fr) - #counter(page).display( - "1" - ) - ]) - - - let caps_headings = ( - [Содержание], - [Введение], - [Заключение], - [Список использованных источников], - [Определения, обозначения и сокращения], - [Обозначения и сокращения] - ) - show heading: it => { - set text(size: 14pt) - if it.depth == 1 { - pagebreak(weak: true) - v(4.3pt * (3 + 1 - 0.2)) - } - if caps_headings.contains(it.body) { - set align(center) - counter(heading).update(i => i - 1) - upper(it.body) - } else { - it - } - v(4.3pt * (0.4 + 0.2)) - } - set heading(numbering: "1.1") - set page(numbering: "1") - // Отступ начала абазаца 1.25 см и выравнивание по ширине - set par( - justify: true - ) - if settings.contents_page.enabled { - make_toc(info: info) - } - set math.equation(numbering: "(1)", supplement: []) - set figure(supplement: "Рис.") - doc - - /*let count = authors.len() - let ncols = calc.min(count, 3) - grid( - columns: (1fr,) * ncols, - row-gutter: 24pt, - ..authors.map(author => [ - #author.name \ - #author.affiliation \ - #link("mailto:" + author.email) - ]), - ) - - par(justify: false)[ - *Abstract* \ - #abstract - ]*/ + (modules.document.make)(modules, info: info, settings, doc) } -- cgit v1.2.3 From 02d227ab4b81b6e67c2b87cc24aaf8bdf6b54f56 Mon Sep 17 00:00:00 2001 From: danilasar Date: Fri, 3 Jan 2025 00:52:44 +0400 Subject: =?UTF-8?q?=D1=84=D0=B8=D0=BA=D1=81:=20=D0=B2=D0=B2=D0=B5=D0=B4?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B2=20=D1=81=D0=BE=D0=B4=D0=B5?= =?UTF-8?q?=D1=80=D0=B6=D0=B0=D0=BD=D0=B8=D0=B8=20=D0=B1=D0=BE=D0=BB=D1=8C?= =?UTF-8?q?=D1=88=D0=B5=20=D0=BD=D0=B5=20=D0=BD=D1=83=D0=BC=D0=B5=D1=80?= =?UTF-8?q?=D1=83=D0=B5=D1=82=D1=81=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf.typ | 201 +++++++++++++++++++++++++++++++++++++-------------------------- 1 file changed, 117 insertions(+), 84 deletions(-) (limited to 'conf.typ') diff --git a/conf.typ b/conf.typ index 9afcf75..77610f3 100644 --- a/conf.typ +++ b/conf.typ @@ -39,6 +39,14 @@ female: "студентки", plural: "студентов", ), + caps_headings: ( + [Содержание], + [Введение], + [Заключение], + [Список использованных источников], + [Определения, обозначения и сокращения], + [Обозначения и сокращения] + ), specialities: ( spec_kb: [10.05.01 --- Компьютерная безопасность], bac_ivt: [09.03.01 --- Информатика и вычислительная техника], @@ -69,12 +77,37 @@ #let make_toc( info: () ) = { + show outline.entry.where( + level: 1 + ): it => { + let heading = it.at("element", default: (:)).at("body", default: "") + if not strings.caps_headings.contains(heading) { + it + return + } + grid( + columns: (auto,1pt, 1fr,1pt, auto), + align: (left, center, right), + row-gutter: 0pt, + rows: (auto), + inset: 0pt, + heading, none, it.fill, none, it.page + ) + v(-28pt) // TODO разобраться, откуда такой отступ после grid + } + outline(indent: 2%, title: [Содержание]) pagebreak(weak: true) } +#let indent = 1cm +#let styled = [#set text(red)].func() +#let space = [ ].func() +#let sequence = [].func() + + #let modules = ( /* * Модуль информации об авторе @@ -344,6 +377,22 @@ * отвечает за всё оформление выходного документа. */ document: ( + apply_heading_styles: + (it) => { + set text(size: 14pt) + if it.depth == 1 { + pagebreak(weak: true) + v(4.3pt * (3 + 1 - 0.2)) + } + if strings.caps_headings.contains(it.body) { + set align(center) + counter(heading).update(i => i - 1) + upper(it.body) + } else { + it + } + v(4.3pt * (0.4 + 0.2)) + }, /* * Генерирует весь документ * Принимает: @@ -375,49 +424,84 @@ } set align(left) - set page(footer: context [ - #h(1fr) - #counter(page).display( - "1" - ) - ]) + show heading: self.document.apply_heading_styles - let caps_headings = ( - [Содержание], - [Введение], - [Заключение], - [Список использованных источников], - [Определения, обозначения и сокращения], - [Обозначения и сокращения] - ) - show heading: it => { - set text(size: 14pt) - if it.depth == 1 { - pagebreak(weak: true) - v(4.3pt * (3 + 1 - 0.2)) - } - if caps_headings.contains(it.body) { - set align(center) - counter(heading).update(i => i - 1) - upper(it.body) - } else { - it - } - v(4.3pt * (0.4 + 0.2)) - } - set heading(numbering: "1.1") - set page(numbering: "1") // Отступ начала абазаца 1.25 см и выравнивание по ширине set par( justify: true ) + + // Вывод содержания if settings.contents_page.enabled { make_toc(info: info) } + + // Оформление элементов содержимого документа + set heading(numbering: "1.1") + set page(footer: context [ + #h(1fr) + #counter(page).display( + "1" + ) + ]) + set page(numbering: "1") set math.equation(numbering: "(1)", supplement: []) set figure(supplement: "Рис.") - doc + + // Вывод самого документа + (self.document.first_line_indentation)(self, doc) + }, + /* + * Подставляет красные строки в начала абзацев + */ + first_line_indentation: + ( + self, + doc, + last-is-heading: false, // space and parbreak are ignored + indent-already-added: false, + ) => { + for (i, elem) in doc.children.enumerate() { + let element = elem.func() + if element == text { + let previous-elem = doc.children.at(i - 1) + if i == 0 or last-is-heading or previous-elem.func() == parbreak { + if not indent-already-added { + indent-already-added = true + h(indent) + } + } + elem + } else if element == heading { + indent-already-added = false + last-is-heading = true + elem + } else if element == space { + elem + } else if element == parbreak { + indent-already-added = false + elem + } else if element == sequence { + (self.document.first_line_indentation)( + self, + elem, + last-is-heading: last-is-heading, + indent-already-added: indent-already-added, + ) + } else if element == styled { + styled((self.document.first_line_indentation)( + self, + elem.child, + last-is-heading: last-is-heading, + indent-already-added: indent-already-added, + ), elem.styles) + } else { + indent-already-added = false + last-is-heading = false + elem + } + } } ), @@ -479,55 +563,4 @@ info.type = type settings.title_page = settings.at("title_page", default: (:)) (modules.document.make)(modules, info: info, settings, doc) -} - - -#let indent = 1cm -#let styled = [#set text(red)].func() -#let space = [ ].func() -#let sequence = [].func() - -#let turn-on-first-line-indentation( - doc, - last-is-heading: false, // space and parbreak are ignored - indent-already-added: false, -) = { - for (i, elem) in doc.children.enumerate() { - let element = elem.func() - if element == text { - let previous-elem = doc.children.at(i - 1) - if i == 0 or last-is-heading or previous-elem.func() == parbreak { - if not indent-already-added { - indent-already-added = true - h(indent) - } - } - elem - } else if element == heading { - indent-already-added = false - last-is-heading = true - elem - } else if element == space { - elem - } else if element == parbreak { - indent-already-added = false - elem - } else if element == sequence { - turn-on-first-line-indentation( - elem, - last-is-heading: last-is-heading, - indent-already-added: indent-already-added, - ) - } else if element == styled { - styled(turn-on-first-line-indentation( - elem.child, - last-is-heading: last-is-heading, - indent-already-added: indent-already-added, - ), elem.styles) - } else { - indent-already-added = false - last-is-heading = false - elem - } - } -} +} \ No newline at end of file -- cgit v1.2.3 From 4b6e5e25c236c09075d93b4a29afcf2e50529646 Mon Sep 17 00:00:00 2001 From: danilasar Date: Fri, 3 Jan 2025 01:04:42 +0400 Subject: =?UTF-8?q?=D1=84=D0=B8=D0=BA=D1=81:=20=D1=82=D0=B8=D1=82=D1=83?= =?UTF-8?q?=D0=BB=D1=8C=D0=BD=D1=8B=D0=B9=20=D0=BB=D0=B8=D1=81=D1=82=20?= =?UTF-8?q?=D1=83=D1=87=D0=B8=D1=82=D1=8B=D0=B2=D0=B0=D0=B5=D1=82=D1=81?= =?UTF-8?q?=D1=8F=20=D0=B2=20=D1=81=D1=87=D1=91=D1=82=D1=87=D0=B8=D0=BA?= =?UTF-8?q?=D0=B5=20=D1=81=D1=82=D1=80=D0=B0=D0=BD=D0=B8=D1=86=20=D0=BF?= =?UTF-8?q?=D0=BE=20=D0=BF=D1=80=D0=BE=D1=81=D1=8C=D0=B1=D0=B5=20=D0=95?= =?UTF-8?q?=D0=B3=D0=BE=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf.typ | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'conf.typ') diff --git a/conf.typ b/conf.typ index 77610f3..c5f857e 100644 --- a/conf.typ +++ b/conf.typ @@ -386,7 +386,7 @@ } if strings.caps_headings.contains(it.body) { set align(center) - counter(heading).update(i => i - 1) + //counter(heading).update(i => i - 1) upper(it.body) } else { it @@ -448,6 +448,7 @@ set page(numbering: "1") set math.equation(numbering: "(1)", supplement: []) set figure(supplement: "Рис.") + set quote(block: true) // Вывод самого документа (self.document.first_line_indentation)(self, doc) -- cgit v1.2.3 From 0251cc8fc020aff793a2df31e6a6f08a20516d22 Mon Sep 17 00:00:00 2001 From: danilasar Date: Fri, 3 Jan 2025 01:07:15 +0400 Subject: =?UTF-8?q?=D1=80=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE=D1=80:=20?= =?UTF-8?q?=D1=83=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=BD=D0=B5=D0=B8?= =?UTF-8?q?=D1=81=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D1=83=D0=B5=D0=BC=D1=8B?= =?UTF-8?q?=D0=B5=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf.typ | 12 ------------ 1 file changed, 12 deletions(-) (limited to 'conf.typ') diff --git a/conf.typ b/conf.typ index c5f857e..313cef4 100644 --- a/conf.typ +++ b/conf.typ @@ -62,18 +62,6 @@ ) ) - - -#let get_student_word(sex) = { - return strings.student.at(sex, default: strings.error.no_sex) -} - -#let otchet_title(info) = { - let author = info.at("author", default: (:)) - set align(center) -} - - #let make_toc( info: () ) = { -- cgit v1.2.3 From da5aa87b1e7ce9e3caf0ed6fa72471c24e9f9c4d Mon Sep 17 00:00:00 2001 From: danilasar Date: Fri, 3 Jan 2025 01:10:11 +0400 Subject: =?UTF-8?q?=D1=80=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE=D1=80:=20?= =?UTF-8?q?=D0=B3=D0=B5=D0=BD=D0=B5=D1=80=D0=B0=D1=82=D0=BE=D1=80=20=D1=81?= =?UTF-8?q?=D0=BE=D0=B4=D0=B5=D1=80=D0=B6=D0=B0=D0=BD=D0=B8=D1=8F=20=D0=B7?= =?UTF-8?q?=D0=B0=D0=BD=D0=B5=D1=81=D1=91=D0=BD=20=D0=B2=20=D0=BC=D0=BE?= =?UTF-8?q?=D0=B4=D1=83=D0=BB=D1=8C=20=D0=B4=D0=BE=D0=BA=D1=83=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf.typ | 60 ++++++++++++++++++++++++++++++------------------------------ 1 file changed, 30 insertions(+), 30 deletions(-) (limited to 'conf.typ') diff --git a/conf.typ b/conf.typ index 313cef4..eb03436 100644 --- a/conf.typ +++ b/conf.typ @@ -61,35 +61,6 @@ undefined_spec: [*НЕИЗВЕСТНАЯ СПЕЦИАЛЬНОСТЬ*] ) ) - -#let make_toc( - info: () -) = { - show outline.entry.where( - level: 1 - ): it => { - let heading = it.at("element", default: (:)).at("body", default: "") - if not strings.caps_headings.contains(heading) { - it - return - } - grid( - columns: (auto,1pt, 1fr,1pt, auto), - align: (left, center, right), - row-gutter: 0pt, - rows: (auto), - inset: 0pt, - heading, none, it.fill, none, it.page - ) - v(-28pt) // TODO разобраться, откуда такой отступ после grid - } - - - outline(indent: 2%, title: [Содержание]) - pagebreak(weak: true) -} - - #let indent = 1cm #let styled = [#set text(red)].func() #let space = [ ].func() @@ -381,6 +352,35 @@ } v(4.3pt * (0.4 + 0.2)) }, + /* + * Генерирует страницу содержания + * Принимает: + * - info - информация о документе + */ + make_toc: + ( + info: () + ) => { + show outline.entry.where( + level: 1 + ): it => { + let heading = it.at("element", default: (:)).at("body", default: "") + if not strings.caps_headings.contains(heading) { + it + return + } + grid( + columns: (auto,1pt, 1fr,1pt, auto), + align: (left, center, right), + row-gutter: 0pt, + rows: (auto), + inset: 0pt, + heading, none, it.fill, none, it.page + ) + v(-28pt) // TODO разобраться, откуда такой отступ после grid + } + outline(indent: 2%, title: [Содержание]) + }, /* * Генерирует весь документ * Принимает: @@ -422,7 +422,7 @@ // Вывод содержания if settings.contents_page.enabled { - make_toc(info: info) + (self.document.make_toc)(info: info) } // Оформление элементов содержимого документа -- cgit v1.2.3