From ecbc4e8c6f9c70346c2380a97fb6e607ecfdaa10 Mon Sep 17 00:00:00 2001 From: danilasar Date: Tue, 31 Dec 2024 13:34:24 +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=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=20test.typ?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- template/main.typ | 25 +++++++++ test.typ | 161 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ typst.toml | 11 ++++ 3 files changed, 197 insertions(+) create mode 100644 template/main.typ create mode 100644 test.typ create mode 100644 typst.toml diff --git a/template/main.typ b/template/main.typ new file mode 100644 index 0000000..3bf08df --- /dev/null +++ b/template/main.typ @@ -0,0 +1,25 @@ +#import "@local/sgu-template:0.0.1": conf +#show: conf.with( + title: [Тема работы], + type: "referat", + info: ( + author: ( + name: [Григорьева Данилы Евгеньевича], + faculty: [КНиИТ], + group: "151", + sex: "male" + ), + inspector: ( + degree: "доцент, к. ф.-м. н.", + name: "С. В. Миронов" + ) + ), + settings: ( + title_page: ( + enabled: true + ), + contents_page: ( + enabled: true + ) + ) +) diff --git a/test.typ b/test.typ new file mode 100644 index 0000000..1cdeb3e --- /dev/null +++ b/test.typ @@ -0,0 +1,161 @@ +#import "conf.typ" : conf +#show: conf.with( + title: [Тема работы], + type: "referat", + info: ( + author: ( + name: [Григорьева Данилы Евгеньевича], + faculty: [КНиИТ], + group: "151", + sex: "male" + ), + inspector: ( + degree: "доцент, к. ф.-м. н.", + name: "С. В. Миронов" + ) + ), + settings: ( + title_page: ( + enabled: true + ), + contents_page: ( + enabled: true + ) + ) +) + +#set quote(block: true) + += Введение + += Основы теории изучаемого языка +== Организационные вопросы +Горбункова Елена Николаевна. + +В конце семестра бует итоговая аттестация. Это может быть как зачёт, так и экзамен, точно неизвестно. + +Будет 15 лекций, примерно к середине декабря кончим. + + +В прошлом году мы освоили фонетику, грамматику и морфологию. + +В курсе 3 блока: ++ Синтаксис ++ Теория перевода ++ Стилистика + + +Мы будем сопоставлять русский и английский язык. Будут задания, за которые будут присуждаться баллы. Они будут основаны на материале английского языка. Посещаемость является одним из ключевых моментов при вычислении баллов. Если возникает уважительная причина пропуска, нужно заранее предупредить препода. + +Хорошая посещаемость и полное выполнение заданий предполагают автомат. + +На зачёте один теоретический вопрос и один практический. + +== Предложение. Классификация предложений +/ Предложение: --- центральная единица синтаксиса, которая служит главным средством формирования, выражения и сообщения мысли. Каждое предложение состоит из каких-то элементов, в частности, из словосочетаний, которые, в свою очередь, состоят из слов. + +=== Классификация предложений +По структуре бывают простые и сложные, двусоставные и односоставные. + +Простое и сложное предложения различаются в зависимости от наличия придаточных, осложняющих их. + +Например: +He is smiling. +I got the information. +Nobody knew that he hadn't come. + +В третьем примере есть две основы. Придаточные предложения (clauses) входят в состав сложноподчинённых. + +В основе двусоставных предложений лежит подлежащно-сказуемостная структура. Например: + +My friend John is a clever student. + +Односоставное предложене имеет один главный член. Например: + +Slience, Summer. English spring flowers! + +Слово "есть" опускается в русском языке, вместо него ставится тире или не ставится ничего. + +Двусоставные предложения могут быть распространёнными (наличие второстепенных членов предложения и нераспространёнными (наличие только главных членов). + +=== Классификация по логическому признаку утверждения/отрицания +- Утвердительные (It was difficult for him to do it) +- Отрицательные (It was difficult for him not to do it) + +В английской речи есть тенденция к упрощению, что объясняется мировыми процессами, которые продолжаются на протяжении нескольких десятилетий. Миграционные потоки в США и Великобритании приводят к снижению среднего уровня грамотности населения, что естественным образом ускоряет упрощение языковых норм. + +=== Функциональная классификация предложений +- Поествовательные +- Вопросительные +- Побудительные +- Восклицательные + +== Повествовательные предложения +/ Повествовательные предложения: сообщают определённую информацию. + +Они могут быть утвердительными и отрицательными. Повествовательные предложения --- это двусоставные предложения с прямым порядком слов. + +Например: #quote[I don't want to go anywhere else.] + +Мы можем произнести одно и то же предложение с разной интонацей, повлияв на его смысл. + +== Вопросительные предложения +Вопросительные предложения запрашивают информацию. Они могут быть утвердительными и отрицательными. Это двусоставные предложения с частичной инверсией, когда служебная ычасть сказуемого предшествует подлежащему, а знаменательная часть сказуемого следует за подлежащим. + +Пример: #quote[When did you go to bed?] + +Единственное исключение представляет вопрос к подлежащему, который характеризуется прямым порядком слов: #quote[Who (подлежащее) went (сказуемое) to bed at 11 o'clock?] + +=== Типы вопросов +- Общий +- Специальный +- Альтернативный +- Разделительный + +/ Общий вопрос: имеет целью проверить истинность определённых положений говорящего. Он начинается со служебного глагола и требует ответа "да" или "нет". + +Например: #quote[ Have you got a pen? --- Yes.] + +#quote[Do you want me to come? --- No.] + +/ Специальные вопросы: задаются с целью получения более подробной или более точной информации о событии, известной собеседнику. Они начинаются с вопросительного слова и сопровождаются ответом, раскрывающим содержание вопросительного слова. + +Например #quote[How many pictures did he show? --- He showed many pictures.] + +What? When? Why? Which? Where? Who? Whose? How? How many/how much? + +/ Альтернативный вопрос: предполагает выбор. + +Например: #quote[Do you go to the theatre or to the cinema?] + +/ Разделительный вопрос: представляет собой комбинацию повествовательного и общего вопросительног опредложения. + +Например: #quote[She is pretty, isn't she? You aren't coming with us, are you? I am good at languages, aren't I?] + +#quote(attribution: [Даня])[Если я прямо на паре начну изучать новый вариант русской раскладки, пожалею ли я об этом?] + +== Побудительные предложения +/ Побудительные предложения: выражают побуждение к действиб, просьбу, совет. Побудительные предложения могут быть утвердительными и отрицательными. +Например: #quote[Yankee, go home! Don't go home!] + +В основном побудительные предложения односоставны по структуре: + +#quote[Stop it! Don't be cross. Let the children go to bed.] + +== Восклицательные предложения +- это конструкции, начинающиеся с _what_: #quote[What beatiful weather!] +- конструкции, начинающиеся с _how_: #quote[How clewer he is!] +- конструкции с эмфатическим _do_ в _present simple_, _did_ в _past simple_: #quote[I #underline[do] love him. Do stop crying!] + + + +/*= Введение +Абоба += Часть первая +== Глава первая +=== Пункт первый +=== Пункт Второй +== Глава вторая += Часть вторая + += Заключение*/ diff --git a/typst.toml b/typst.toml new file mode 100644 index 0000000..a19c073 --- /dev/null +++ b/typst.toml @@ -0,0 +1,11 @@ +[package] +name = "sgu-template" +version = "0.0.1" +entrypoint = "conf.typ" +authors = ["Danila Grogirev "] +license = "MIT-0" +description = "Unofficial Saratov State University typst template" + +[template] +path = "template" +entrypoint = "main.typ" -- cgit v1.2.3 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 +++++++++++++++++++++++++++++++----------------------- gost-7-1-2003.csl | 519 ++++++++++++++++++++++++++++++++++++++++++++++++++ test (2).typ | 46 +++++ test.bib | 28 +++ test.typ | 128 +++---------- 5 files changed, 938 insertions(+), 334 deletions(-) create mode 100644 gost-7-1-2003.csl create mode 100644 test (2).typ create mode 100644 test.bib 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 + } + } } diff --git a/gost-7-1-2003.csl b/gost-7-1-2003.csl new file mode 100644 index 0000000..0db1966 --- /dev/null +++ b/gost-7-1-2003.csl @@ -0,0 +1,519 @@ + + diff --git a/test (2).typ b/test (2).typ new file mode 100644 index 0000000..604295e --- /dev/null +++ b/test (2).typ @@ -0,0 +1,46 @@ +#set text(font: "PT Serif") +#import "conf.typ" : conf +#import "conf.typ" : turn-on-first-line-indentation +// Для таблиц и тд +#import "@preview/plotst:0.2.0": * +#import "@preview/fletcher:0.4.5" as fletcher: diagram, node, edge + +#show: conf.with( + title: [Применение шаблона для typst], + type: "referat", + info: ( + author: ( + name: [Григорьева Данилы (danilasar), Смирнова Егора (aragami3070), Толстова Роберта (tolstovrob)], + faculty: [КНиИТ], + group: "251", + sex: "plural" + ), + inspector: ( + degree: "", + name: "" + ) + ), + settings: ( + title_page: ( + enabled: true + ), + contents_page: ( + enabled: true + ) + ) +) + +// Функция добавления красных строк +#show: turn-on-first-line-indentation + + += Test bib + +Some cite #cite() + +Some cite #cite() + +Some cite #cite() + += Список использованных источников +#bibliography("test.bib", style: "gost-7-1-2003.csl", title: none, full: false) diff --git a/test.bib b/test.bib new file mode 100644 index 0000000..4b75d27 --- /dev/null +++ b/test.bib @@ -0,0 +1,28 @@ +@article{search_8, + title={Обзор рынка мобильных приложений}, + author={Теруков, Иван Станиславович}, + journal={Московский экономический журнал}, + number={10}, + pages={594--608}, + year={2021}, + publisher={Общество с ограниченной ответственностью {\guillemotleft}Электронная наука{\guillemotright}}, + language = {russian} +} + +@online{search_11, + title={Сбербанк Онлайн}, + url={https://www.sberbank.com/ru/person/dist_services}, + urldate = {01.05.2024}, + language = {russian} +} +@article{eichten1984supercollider, + title={Supercollider physics}, + author={Eichten, E and Hinchliffe, Ian and Lane, K and Quigg, Chris}, + journal={Reviews of Modern Physics}, + volume={56}, + number={4}, + pages={579}, + year={1984}, + publisher={APS}, + language={english} +} diff --git a/test.typ b/test.typ index 1cdeb3e..67a1c47 100644 --- a/test.typ +++ b/test.typ @@ -1,17 +1,17 @@ #import "conf.typ" : conf #show: conf.with( - title: [Тема работы], + title: [Применение шаблона для typst], type: "referat", info: ( author: ( - name: [Григорьева Данилы Евгеньевича], + name: [Григорьева Данилы (danilasar), Смирнова Егора (aragami3070), Толстова Роберта (tolstovrob)], faculty: [КНиИТ], - group: "151", - sex: "male" + group: "251", + sex: "plural" ), inspector: ( - degree: "доцент, к. ф.-м. н.", - name: "С. В. Миронов" + degree: "", + name: "" ) ), settings: ( @@ -27,126 +27,44 @@ #set quote(block: true) = Введение +Шаблон автоматически определяет и оформляет особенным образом соответствующие секции: +- Содержание +- Введение +- Заключение +- Список использованных источников +- Определения, обозначения и сокращения +- Обозначения и сокращения -= Основы теории изучаемого языка -== Организационные вопросы -Горбункова Елена Николаевна. += Пример работы шаблона +== Основные элементы +Все прочие же выделяются иначе и нумеруются. -В конце семестра бует итоговая аттестация. Это может быть как зачёт, так и экзамен, точно неизвестно. +=== Виды документов -Будет 15 лекций, примерно к середине декабря кончим. - - -В прошлом году мы освоили фонетику, грамматику и морфологию. - -В курсе 3 блока: -+ Синтаксис -+ Теория перевода -+ Стилистика +Шаблон на момент написания документации работает со следующими типами работ: ++ Автореферат ++ Отчёт о научно-исследовательской работе ++ Выпускная квалификационная работа ++ Отчёт о практике ++ Реферат Мы будем сопоставлять русский и английский язык. Будут задания, за которые будут присуждаться баллы. Они будут основаны на материале английского языка. Посещаемость является одним из ключевых моментов при вычислении баллов. Если возникает уважительная причина пропуска, нужно заранее предупредить препода. -Хорошая посещаемость и полное выполнение заданий предполагают автомат. - -На зачёте один теоретический вопрос и один практический. == Предложение. Классификация предложений / Предложение: --- центральная единица синтаксиса, которая служит главным средством формирования, выражения и сообщения мысли. Каждое предложение состоит из каких-то элементов, в частности, из словосочетаний, которые, в свою очередь, состоят из слов. -=== Классификация предложений -По структуре бывают простые и сложные, двусоставные и односоставные. - -Простое и сложное предложения различаются в зависимости от наличия придаточных, осложняющих их. - -Например: -He is smiling. -I got the information. -Nobody knew that he hadn't come. - -В третьем примере есть две основы. Придаточные предложения (clauses) входят в состав сложноподчинённых. - -В основе двусоставных предложений лежит подлежащно-сказуемостная структура. Например: - -My friend John is a clever student. - -Односоставное предложене имеет один главный член. Например: - -Slience, Summer. English spring flowers! - -Слово "есть" опускается в русском языке, вместо него ставится тире или не ставится ничего. - -Двусоставные предложения могут быть распространёнными (наличие второстепенных членов предложения и нераспространёнными (наличие только главных членов). - -=== Классификация по логическому признаку утверждения/отрицания -- Утвердительные (It was difficult for him to do it) -- Отрицательные (It was difficult for him not to do it) - -В английской речи есть тенденция к упрощению, что объясняется мировыми процессами, которые продолжаются на протяжении нескольких десятилетий. Миграционные потоки в США и Великобритании приводят к снижению среднего уровня грамотности населения, что естественным образом ускоряет упрощение языковых норм. - -=== Функциональная классификация предложений -- Поествовательные -- Вопросительные -- Побудительные -- Восклицательные == Повествовательные предложения / Повествовательные предложения: сообщают определённую информацию. -Они могут быть утвердительными и отрицательными. Повествовательные предложения --- это двусоставные предложения с прямым порядком слов. - Например: #quote[I don't want to go anywhere else.] -Мы можем произнести одно и то же предложение с разной интонацей, повлияв на его смысл. - -== Вопросительные предложения -Вопросительные предложения запрашивают информацию. Они могут быть утвердительными и отрицательными. Это двусоставные предложения с частичной инверсией, когда служебная ычасть сказуемого предшествует подлежащему, а знаменательная часть сказуемого следует за подлежащим. - -Пример: #quote[When did you go to bed?] - -Единственное исключение представляет вопрос к подлежащему, который характеризуется прямым порядком слов: #quote[Who (подлежащее) went (сказуемое) to bed at 11 o'clock?] - === Типы вопросов -- Общий -- Специальный -- Альтернативный -- Разделительный - -/ Общий вопрос: имеет целью проверить истинность определённых положений говорящего. Он начинается со служебного глагола и требует ответа "да" или "нет". - -Например: #quote[ Have you got a pen? --- Yes.] - -#quote[Do you want me to come? --- No.] - -/ Специальные вопросы: задаются с целью получения более подробной или более точной информации о событии, известной собеседнику. Они начинаются с вопросительного слова и сопровождаются ответом, раскрывающим содержание вопросительного слова. - -Например #quote[How many pictures did he show? --- He showed many pictures.] - -What? When? Why? Which? Where? Who? Whose? How? How many/how much? - -/ Альтернативный вопрос: предполагает выбор. - -Например: #quote[Do you go to the theatre or to the cinema?] - -/ Разделительный вопрос: представляет собой комбинацию повествовательного и общего вопросительног опредложения. - -Например: #quote[She is pretty, isn't she? You aren't coming with us, are you? I am good at languages, aren't I?] #quote(attribution: [Даня])[Если я прямо на паре начну изучать новый вариант русской раскладки, пожалею ли я об этом?] -== Побудительные предложения -/ Побудительные предложения: выражают побуждение к действиб, просьбу, совет. Побудительные предложения могут быть утвердительными и отрицательными. -Например: #quote[Yankee, go home! Don't go home!] - -В основном побудительные предложения односоставны по структуре: - -#quote[Stop it! Don't be cross. Let the children go to bed.] - -== Восклицательные предложения -- это конструкции, начинающиеся с _what_: #quote[What beatiful weather!] -- конструкции, начинающиеся с _how_: #quote[How clewer he is!] -- конструкции с эмфатическим _do_ в _present simple_, _did_ в _past simple_: #quote[I #underline[do] love him. Do stop crying!] - /*= Введение -- 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(-) 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(+) 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(-) 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(-) 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(-) 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(-) 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(-) 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(-) 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 ++- test.typ | 2 -- 2 files changed, 2 insertions(+), 3 deletions(-) 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) diff --git a/test.typ b/test.typ index 67a1c47..59c4c13 100644 --- a/test.typ +++ b/test.typ @@ -24,8 +24,6 @@ ) ) -#set quote(block: true) - = Введение Шаблон автоматически определяет и оформляет особенным образом соответствующие секции: - Содержание -- 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(-) 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(-) 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