summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorДанила Григорьев <65398685+danilasar@users.noreply.github.com>2025-01-03 01:12:24 +0400
committerGitHub <noreply@github.com>2025-01-03 01:12:24 +0400
commit3a916bcd16433deafb85bd62b86d7da2e721be9f (patch)
tree8b319f2eb9379370f892e748c75bfb6bb2c5cdef
parent100ae6d9d9a0451f9c3ca049e8b9028c3fc431f2 (diff)
parentda5aa87b1e7ce9e3caf0ed6fa72471c24e9f9c4d (diff)
Тотальный и абсолютный рефакторинг #9
Тотальный и абсолютный рефакторинг
-rw-r--r--conf.typ788
-rw-r--r--gost-7-1-2003.csl519
-rw-r--r--template/main.typ25
-rw-r--r--test (2).typ46
-rw-r--r--test.bib28
-rw-r--r--test.typ77
-rw-r--r--typst.toml11
7 files changed, 1245 insertions, 249 deletions
diff --git a/conf.typ b/conf.typ
index fa97841..eb03436 100644
--- a/conf.typ
+++ b/conf.typ
@@ -1,265 +1,555 @@
-#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 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 "студентов"
- }
-}
-#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 otchet_title(info) = {
- 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 make_toc(
- info: ()
-) = {
+#let strings = (
+ title: (
+ minobrnauki: "МИНОБРНАУКИ РОССИИ\nФедеральное государственное бюджетное образовательное учреждение\nвысшего образования\n",
+ sgu: "«САРАТОВСКИЙ НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ
+ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
+ИМЕНИ Н. Г. ЧЕРНЫШЕВСКОГО»\n",
+ city: "Саратов",
+ worktypes: (
+ referat: [РЕФЕРАТ],
+ coursework: [КУРСОВАЯ РАБОТА],
+ diploma: [Выпускная квалификационная работа],
+ autoref: [работа],
+ nir: [работа],
+ pract: [Отчёт о практике]
+ ),
+ from_course: "курса",
+ from_group: "группы",
+ from_speciality: "направления"
+ ),
+ student: (
+ male: "студента",
+ female: "студентки",
+ plural: "студентов",
+ ),
+ caps_headings: (
+ [Содержание],
+ [Введение],
+ [Заключение],
+ [Список использованных источников],
+ [Определения, обозначения и сокращения],
+ [Обозначения и сокращения]
+ ),
+ 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 КоАП РФ*],
+ undefined_spec: [*НЕИЗВЕСТНАЯ СПЕЦИАЛЬНОСТЬ*]
+ )
+)
+#let indent = 1cm
+#let styled = [#set text(red)].func()
+#let space = [ ].func()
+#let sequence = [].func()
- outline(indent: 2%, title: [Содержание])
- pagebreak(weak: true)
-}
-#let aboba(settings: ()) = {
-
-}
+#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
+ )
+ },
+ /*
+ * Определяет курс автора (по номеру группы)
+ * Принимает:
+ * - 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 {
+ 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
+ }
+ ),
-#let conf(
- title: none,
- info: (),
- type: "referat",
- settings: (),
- doc
-) = {
- info.title = title
- settings.title_page = settings.at("title_page", default: (:))
+ /*
+ * Модуль титульного листа
+ * Здесь происходит генерация титульного листа и
+ * определяются все необходимые для этого методы.
+ * Поскольку его создание --- задача не такая уж
+ * и тривиальная, здесь есть много приватных методов
+ * и ваш покорный слуга ещё раз напоминает о
+ * нежелательности их вызова извне. Если такая необходимость
+ * всё же возникает, лучше переименовать метод и убрать
+ * подчёркивание: впоследствии это можно будет хотя бы как-то
+ * отладить.
+ *
+ * Изначально задумывалось, что единственный доступный
+ * для вызова извне метод --- make, а в остальных не
+ * должно возникнуть необходимости.
+ */
+ title: (
+ /*
+ * Отвечает за вывод названия министерства и
+ * университета на титульном листе
+ */
+ _default_header:
+ () => {
+ set align(center)
+ set text(font: "Tempora")
+ text(strings.title.minobrnauki)
+ v(0.2em)
+ 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)
+ },
+ /*
+ * Отвечает за вывод города и года на титульном листе
+ */
+ _default_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),
+ 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)
+ 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)
+ return result
+ },
+ /*
+ * Получает заголовок титульного листа.
+ * Принимает:
+ * - info - информация о документе
+ * Возвращает:
+ * - В зависимости от типа:
+ * - Тему работы, если это не автореферат и не отчёт по НИРу
+ * - В противном случае названия соответствующих типов работ
+ */
+ _get_title_string:
+ (info) => {
+ if info.type == "autoref" {
+ return [АВТОРЕФЕРАТ]
+ }
+ if info.type == "nir" {
+ return [ОТЧЁТ О НАУЧНО-ИССЛЕДОВАТЕЛЬСКОЙ РАБОТЕ]
+ }
+ return info.at("title", default: [Тема работы])
+ },
+ /*
+ * Генерирует строки текста для вывода на титульном листе
+ * Принимает:
+ * - info - информация о документе
+ * Возвращает:
+ * - Словарь:
+ * title: Заголовок
+ * worktype: Тип работы
+ * group: студент(а|ки|ов) s курса sex группы
+ * specialty: направления 69.14.88 --- Специальность
+ * faculty: факультета XXX
+ * author: автор(ы)? работы
+ */
+ _get_strings:
+ (self, info) => {
+ let author = info.at("author", 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,
+ (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
+ )
+ },
+ /*
+ * Генерирует титульный лист
+ * Принимает:
+ * - info - информация о документе
+ */
+ make:
+ (self, info) => {
+ let strs = (self.title._get_strings)(self, info)
+ (self.title._default_header)()
+ (self.title._default_body)(strs)
+ v(1fr)
+ (self.title._signature)(info.inspector.degree, info.inspector.name)
+ (self.title._default_footer)()
+ },
+ ),
- set text(
- size: 14pt
- )
+ /*
+ * Модуль генерации документа
+ * Здесь содержатся методы, влияющие на вид всего
+ * документа в целом. Главный из них --- make ---
+ * вызывается из точки входа в стилевой файл и
+ * отвечает за всё оформление выходного документа.
+ */
+ 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))
+ },
+ /*
+ * Генерирует страницу содержания
+ * Принимает:
+ * - 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: [Содержание])
+ },
+ /*
+ * Генерирует весь документ
+ * Принимает:
+ * - info - информация о документе
+ * - doc - содержимое документа
+ */
+ make:
+ (
+ self,
+ info: (),
+ settings,
+ doc
+ ) => {
+ set page(
+ paper: "a4",
+ margin: (
+ top: 2cm,
+ bottom: 2cm,
+ left: 2.5cm,
+ right: 1.5cm
+ )
+ )
+ 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) {
+ (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
+
+ show heading: self.document.apply_heading_styles
+
+ // Отступ начала абазаца 1.25 см и выравнивание по ширине
+ set par(
+ justify: true
+ )
- /*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)
- ]),
- )
+ // Вывод содержания
+ if settings.contents_page.enabled {
+ (self.document.make_toc)(info: info)
+ }
- par(justify: false)[
- *Abstract* \
- #abstract
- ]*/
-}
+ // Оформление элементов содержимого документа
+ 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: "Рис.")
+ set quote(block: true)
+ // Вывод самого документа
+ (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
+ }
+ }
+ }
+ ),
-#let indent = 1cm
-#let styled = [#set text(red)].func()
-#let space = [ ].func()
-#let sequence = [].func()
+ /*
+ * Помощник
+ * Модуль-помощник не содержит особой
+ * функциональности и не имеет конкретного
+ * назначения, но содержащиеся в нём методы
+ * могут быть полезны где угодно и не
+ * привязаны к конкретной части документа
+ */
+ utils: (
+ /*
+ * Склеивает строки, игнорируя пустые
+ * Принимает:
+ * - divider - разделитель (по умолчанию пробел)
+ * - соединяемые строки в неограниченном количестве
+ * Примечание: метод похож по своей сути
+ * на join, но отличается от него наличием проверки
+ * на пустые строки: рядом с ними разделитель не
+ * ставится, что исключает присутствие двух разделителей
+ * подряд.
+ */
+ strglue:
+ (
+ divider: " ",
+ ..strings
+ ) => {
+ let result = ""
+ for string in strings.pos() {
+ if(
+ (result.len() > 0)
+ and
+ ((type(string) != str) or (string.len() > 0))
+ ) {
+ result = result + " "
+ }
+ // TODO: string было бы неплохо обернуть
+ // в str(), но баг в системе типов Typst
+ // не позволяет этого сделать
+ result = result + string
+ }
+ return result
+ }
+ )
+)
-#let turn-on-first-line-indentation(
- doc,
- last-is-heading: false, // space and parbreak are ignored
- indent-already-added: false,
+/*
+ * Точка входа, просто вызывает modules.document.make
+ */
+#let conf(
+ title: none,
+ info: (),
+ type: "referat",
+ settings: (),
+ doc
) = {
- 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
- }
- }
-}
+ info.title = title
+ info.type = type
+ settings.title_page = settings.at("title_page", default: (:))
+ (modules.document.make)(modules, info: info, settings, doc)
+} \ No newline at end of file
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 @@
+<?xml version="1.0" encoding="utf-8"?>
+<style xmlns="http://purl.org/net/xbiblio/csl" class="in-text" version="1.0">
+ <info>
+ <title>Russian GOST R 7.0.5-2008 numeric citations with aplhabetic sorting</title>
+ <id>http://www.zotero.org/styles/GOST-R-7.0.5-2008%20numeric%20alphabetic</id>
+ <link href="http://chetvericov.ru/stil-oformleniya-dlya-mendeley-i-zotero-csl-po-gost-r-705-2008/" rel="self"/>
+ <author>
+ <name>Roman Raspopov</name>
+ <email>romanraspopov@gmail.com</email>
+ <uri></uri>
+ </author>
+ <category citation-format="numeric"/>
+ <category field="generic-base"/>
+ <updated>2013-05-24T01:12:50+00:00</updated>
+ <summary>
+ Russian GOST-2008 style.
+
+ За основу были взяты стили Андрея Четверикова с разными видами сортировки (в порядке появления, в алфавитном порядке и с отображением фамилий вместо номеров ссылок), которые прекрасно работали, но не могли обеспечить многих требований ГОСТ 7.0.5-2008 "Библиографическая ссылка", ГОСТ 7.1-2003 "Библиографическая запись и описание" и ГОСТ 7.82-2001 "Библиографическая запись. Библиографическое описание электронных ресурсов". В данном стиле введен большой перечень усовершенствований, который позволил дополнить функционал стилей А. Четверикова.
+
+ Теперь стиль решает следующие задачи в соответствии с требованиями ГОСТов:
+ - Сортировка библиографии: а) по языку (сначала русскоязычные источники, затем иностранные), а затем в алфавитном порядке, б) в порядке появления ссылок.
+ - Локализация стандартных обозначений ([et al.] / [и др.]; Vol. / Т.; P. / С. и другие), которые зависят от поля "Язык" ("Language"): для русскоязычных пусто, для иностранных "en" (без ковычек).
+ -
+ -
+
+ Примечания:
+ - Составитель (сост.) в Zotero обозначается как "Редактор серии" (Series Editor).
+
+ Так как возможности локализации в текущей версии Zotero (4.0.8) довольно ограничены, иногда библиографическое описание источников оказывается вынужденно стандартизованным (не всегда можно учесть все нюансы оригинального библиографического описания), а также приходится идти на разного рода ухищрения при использовании полей в программе. Однако результат стоит того - в итоге список литературы автоматически формируется, сортируется и форматируется в соответствии с большинством требований ГОСТ.
+
+ Выражаю искреннюю благодарность Андрею Петровичу Фоту за его пособие с очень подробным описанием всех нюансов составления библиографических списков (Фот А.П. Оформление библиографических ссылок на использованные источники в научных работах : методические рекомендации соискателям ученых степеней. – Оренбург: ГОУ «ОГУ», 2005. – 24 с.), а также Андрею Четверикову за разработку основы стилей ГОСТ и их поддержку на сайте (http://chetvericov.ru/stil-oformleniya-dlya-mendeley-i-zotero-csl-po-gost-r-705-2008).
+
+ </summary>
+ <link href="http://protect.gost.ru/document.aspx?control=7&amp;id=173511" rel="documentation"/>
+ <rights>This work is licensed under a Creative Commons Attribution-Share Alike 3.0 Unported License http://creativecommons.org/licenses/by-sa/3.0/</rights>
+ </info>
+
+<!--_______________________________________________________________________________
+ ___________________________ ЛОКАЛИЗАЦИЯ ТЕРМИНОВ ______________________________
+ _______________________________________________________________________________ -->
+
+ <locale xml:lang="en">
+ <terms>
+ <term name="et-al"> [et al.]</term>
+ <term name="and others"></term>
+ <term name="page" form="short">p.</term>
+ <term name="number-of-pages" form="short">p.</term>
+ <term name="number-of-volumes" form="short">vols.</term>
+ <term name="note" form="long"></term>
+ <term name="note" form="short"></term>
+ <term name="collection-editor" form="short">coll.</term>
+ <term name="editortranslator" form="short">
+ <single>ed. &amp; trans.</single>
+ <multiple>eds. &amp; trans.</multiple>
+ </term>
+ </terms>
+ </locale>
+
+ <locale xml:lang="ru">
+ <terms>
+ <term name="et-al"> [и др.]</term>
+ <term name="and others"></term>
+ <term name="page" form="short">с.</term>
+ <term name="number-of-pages" form="short">с.</term>
+ <term name="number-of-volumes" form="short">т.</term>
+ <term name="note" form="long"></term>
+ <term name="note" form="short"></term>
+ <term name="collection-editor" form="short">сост.</term>
+ <term name="collection-number" form="short">вып.</term>
+ <term name="translator" form="short">
+ <single>пер.</single>
+ <multiple>пер.</multiple>
+ </term>
+ <term name="editortranslator" form="short">
+ <single>ред. и пер.</single>
+ <multiple>ред. и пер.</multiple>
+ </term>
+
+ <!-- SHORT MONTH FORMS -->
+ <term name="month-01" form="short">янв.</term>
+ <term name="month-02" form="short">февр.</term>
+ <term name="month-03" form="short">марта</term>
+ <term name="month-04" form="short">апр.</term>
+ <term name="month-05" form="short">мая</term>
+ <term name="month-06" form="short">июня</term>
+ <term name="month-07" form="short">июля</term>
+ <term name="month-08" form="short">авг.</term>
+ <term name="month-09" form="short">сент.</term>
+ <term name="month-10" form="short">окт.</term>
+ <term name="month-11" form="short">нояб.</term>
+ <term name="month-12" form="short">дек.</term>
+ </terms>
+ </locale>
+
+ <locale>
+ <terms>
+ <term name="page-range-delimiter">-</term> <!-- Если между номерами страниц нужно тире, а не дефис [С. 56-59], то эту строку нужно закомментировать -->
+ </terms>
+ </locale>
+
+ <macro name="number-of-volumes">
+ <choose>
+ <if variable="note">
+ <text variable="number-of-volumes" prefix="in&#160;"/>
+ <label variable="number-of-volumes" form="short" prefix="&#160;"/>
+ </if>
+ <else>
+ <text variable="number-of-volumes" prefix="в&#160;"/>
+ <label variable="number-of-volumes" form="short" prefix="&#160;"/>
+ </else>
+ </choose>
+ </macro>
+
+ <macro name="language-sort"> <!-- Макрос сортировки по полю "Language" (сначала русскоязычные источники, затем иностранные) -->
+ <choose>
+ <if variable="note">
+ <text value="B000"/>
+ </if>
+ <else>
+ <text value="A000"/>
+ </else>
+ </choose>
+ </macro>
+
+<!--_______________________________________________________________________________
+ _____________________________________ АВТОРЫ __________________________________
+ _______________________________________________________________________________ -->
+
+ <macro name="author_short"> <!-- Макрос для ненумерованных ссылок вида [Иванов, 2013] -->
+ <choose>
+ <if type="webpage">
+ <names variable="author">
+ <name form="short" name-as-sort-order="all" sort-separator="&#160;" delimiter=", " delimiter-precedes-last="always"/>
+ <substitute>
+ <text variable="title"/>
+ <text variable="container-title"/>
+ </substitute>
+ </names>
+ </if>
+ <else>
+ <names variable="author">
+ <name form="short" name-as-sort-order="all" sort-separator="&#160;" delimiter=", " delimiter-precedes-last="always"/>
+ <substitute>
+ <text variable="title"/>
+ </substitute>
+ </names>
+ </else>
+ </choose>
+ </macro>
+
+ <macro name="author-title">
+ <names variable="author" suffix=". ">
+ <!-- Добавить запятую между фамилией и инициалами автора: sort-separator=",&#160;", иначе sort-separator="&#160;" -->
+ <!-- Сделать шрифт фамилий и инициалов авторов наклонным: font-style="italic", иначе font-style="normal" -->
+ <name et-al-min="2" et-al-use-first="1" initialize-with="." font-style="normal" name-as-sort-order="first" sort-separator="&#160;"/>
+ <et-al term="and others"/>
+ </names>
+ <text variable="title"/>
+ </macro>
+
+ <macro name="author-title-medium">
+ <choose>
+ <if variable="medium">
+ <text macro="author-title" suffix=" [Электронный ресурс]"/>
+ </if>
+ <else>
+ <text macro="author-title"/>
+ </else>
+ </choose>
+ </macro>
+
+<macro name="second-position-creators">
+<group delimiter="; ">
+<names variable="author collection-editor" delimiter="; ">
+<label form="short" prefix=" " suffix=". " text-case="lowercase" strip-periods="true"/>
+<name et-al-min="4" et-al-use-first="1" delimiter=", " initialize-with="."/>
+</names>
+<names variable="editor translator" delimiter="; ">
+<label form="short" prefix=" " suffix=". " text-case="lowercase" strip-periods="true"/>
+<name et-al-min="4" et-al-use-first="1" delimiter=", " initialize-with="."/>
+</names>
+</group>
+</macro>
+
+ <macro name="second-position-authors-only">
+ <names variable="author">
+ <label form="short" prefix=" " suffix=". " text-case="lowercase" strip-periods="true"/>
+ <name et-al-min="4" et-al-use-first="1" delimiter=", " initialize-with="."/>
+ </names>
+ </macro>
+
+ <macro name="second-position-creators-no-authors">
+ <names variable="collection-editor editor translator" delimiter="; ">
+ <label form="short" prefix=" " suffix=". " text-case="lowercase" strip-periods="true"/>
+ <name et-al-min="4" et-al-use-first="1" delimiter=", " initialize-with="."/>
+ </names>
+ </macro>
+
+
+
+<!--_______________________________________________________________________________
+ _________________________ ВСПОМОГАТЕЛЬНЫЕ МАКРОСЫ _____________________________
+ _______________________________________________________________________________ -->
+
+ <macro name="citation-number">
+ <text variable="citation-number" suffix=".&#9;"/>
+ </macro>
+
+ <macro name="publisher">
+ <group prefix=" " delimiter=": " suffix=", ">
+ <text variable="publisher-place"/>
+ <text variable="publisher"/>
+ </group>
+ <text macro="year-date" suffix="."/>
+ </macro>
+
+ <macro name="day-month">
+ <date variable="issued">
+ <date-part name="day" form="numeric" suffix="&#160;"/>
+ <date-part name="month" form="short"/>
+ </date>
+ </macro>
+
+ <macro name="year-date">
+ <date variable="issued">
+ <date-part name="year"/>
+ </date>
+ </macro>
+
+ <macro name="page">
+ <label variable="page" form="short" prefix="" suffix="&#160;" text-case="capitalize-first"/>
+ <text variable="page"/>
+ </macro>
+
+ <macro name="number-of-pages">
+ <text variable="number-of-pages"/>
+ <label variable="number-of-pages" form="short" prefix="&#160;" suffix=""/>
+ </macro>
+
+ <macro name="pages-or-volumes">
+ <choose>
+ <if variable="volume">
+ <text macro="number-of-pages"/>
+ </if>
+ <else-if variable="number-of-volumes">
+ <text macro="volumes"/>
+ </else-if>
+ <else>
+ <text macro="number-of-pages"/>
+ </else>
+ </choose>
+ </macro>
+
+ <macro name="volume">
+ <choose>
+ <if variable="volume">
+ <label variable="volume" form="short" prefix="" suffix="&#160;" text-case="capitalize-first"/>
+ <text variable="volume"/>
+ </if>
+ </choose>
+ </macro>
+
+ <macro name="volumes">
+ <label variable="volume" form="short" suffix="&#160;1-" text-case="capitalize-first"/>
+ <text variable="number-of-volumes"/>
+ </macro>
+
+ <macro name="collection-number"> <!-- Номер выпуска (Вып. N) -->
+ <choose>
+ <if variable="collection-number">
+ <label variable="collection-number" form="short" prefix="" suffix="&#160;" text-case="capitalize-first"/>
+ <text variable="collection-number"/>
+ </if>
+ </choose>
+ </macro>
+
+<!--_______________________________________________________________________________
+ ______________________________ ССЫЛКИ В ТЕКСТЕ ________________________________
+ _______________________________________________________________________________ -->
+
+<!-- Формат цитат для ненумерованных ссылок вида [Иванов, 2013] или [Иванов, 2013, с. 55].
+Сортировка библиографии в этом случае должна быть в алфавитном порядке.
+Для включения этого вида форматирования расскомментировать этот блок, закомментировать следующий (для нумерованных ссылок) и изменить, если требуется правило сортировки библиографии.-->
+
+<!--
+ <citation et-al-min="4" et-al-use-first="1" disambiguate-add-year-suffix="true" collapse="year" et-al-subsequent-use-first="1" disambiguate-add-names="false" disambiguate-add-givenname="false">
+ <sort>
+ <key macro="language-sort"/>
+ <key macro="author-title"/>
+ <key variable="issued"/>
+ </sort>
+ <layout prefix="[" suffix="]" delimiter="; " page-range-format="">
+ <group delimiter=", ">
+ <text macro="author_short" suffix=""/>
+ <text macro="year-date"/>
+ </group>
+ <choose>
+ <if variable="locator">
+ <label variable="locator" form="short" prefix=",&#160;" suffix="&#160;"/>
+ <text variable="locator"/>
+ </if>
+ </choose>
+ </layout>
+ </citation> -->
+
+<!-- Формат цитат для нумерованных ссылок вида [1] или [1, с. 55].
+Сортировка библиографии в этом случае должна быть в алфавитном порядке.
+Для включения этого вида форматирования расскомментировать этот блок, закомментировать следующий (для цитат) и изменить, если требуется правило сортировки библиографии.-->
+
+ <citation et-al-min="4" et-al-use-first="1" collapse="citation-number">
+ <sort>
+ <key variable="citation-number"/>
+ </sort>
+ <layout prefix="[" suffix="]" delimiter="; ">
+ <text variable="citation-number"/>
+ <choose>
+ <if variable="locator">
+ <label variable="locator" form="short" prefix=",&#160;" suffix="&#160;"/>
+ <text variable="locator"/>
+ </if>
+ </choose>
+ </layout>
+ </citation>
+
+<!--_______________________________________________________________________________
+ ________________________________ БИБЛИОГРАФИЯ _________________________________
+ _______________________________________________________________________________ -->
+
+ <macro name="bibliography">
+ <text macro="citation-number"/>
+ <choose>
+<!--_______________________________________________________________________________
+ _______________ КНИГА (в т.ч. многотомник или отдельный том, а также __________
+ Электронный ресурс локального доступа (CD-ROM, компьютерная программа и др.))__
+ _______________________________________________________________________________ -->
+ <if type="book">
+ <group delimiter=". – ">
+ <group delimiter=" / ">
+ <group delimiter=". ">
+ <group delimiter=" : ">
+ <text macro="author-title-medium"/>
+ <text variable="collection-title"/>
+ <text macro="number-of-volumes"/>
+ </group>
+ <text macro="volume"/>
+ <text variable="title-short"/>
+ </group>
+ <group delimiter=" ">
+ <text macro="second-position-creators"/>
+ <text variable="note"/>
+ </group>
+ </group>
+ <text macro="publisher"/>
+ <text macro="collection-number"/>
+ <text macro="pages-or-volumes"/>
+ <text variable="medium"/>
+ </group>
+ </if>
+<!--_______________________________________________________________________________
+ _________________________ ДИССЕРТАЦИЯ или АВТОРЕФЕРАТ _________________________
+ _______________________________________________________________________________ -->
+ <else-if type="thesis" match="any">
+ <group delimiter=". – " prefix="">
+ <group delimiter=" / ">
+ <group delimiter=" : ">
+ <text macro="author-title"/>
+ <text variable="genre"/>
+ </group>
+ <text macro="second-position-authors-only"/>
+ </group>
+ <text macro="publisher"/>
+ <text macro="number-of-pages"/>
+ </group>
+ </else-if>
+<!--_______________________________________________________________________________
+ ___________ РАЗДЕЛ КНИГИ, СТАТЬЯ В СБОРНИКЕ, СТАТЬЯ В ЭНЦИКЛОПЕДИИ ____________
+ _______________________________________________________________________________ -->
+ <else-if type="chapter paper-conference entry-encyclopedia" match="any">
+ <group delimiter=". – ">
+ <group delimiter=" // ">
+ <group delimiter=" / ">
+ <text macro="author-title"/>
+ <text macro="second-position-authors-only"/>
+ </group>
+ <group delimiter=" / ">
+ <group delimiter=" : ">
+ <text variable="container-title"/>
+ <text variable="collection-title"/>
+ <text macro="number-of-volumes"/>
+ </group>
+ <group delimiter=" ">
+ <text macro="second-position-creators-no-authors"/>
+ <text variable="note"/>
+ </group>
+ </group>
+ </group>
+ <text macro="publisher"/>
+ <text macro="volume"/>
+ <text macro="collection-number"/>
+ <text variable="title-short"/>
+ <text macro="page"/>
+ </group>
+ </else-if>
+<!--_______________________________________________________________________________
+ _________________________ СТАТЬЯ В ПЕРИОДИКЕ, ЖУРНАЛЕ _________________________
+ _______________________________________________________________________________ -->
+ <else-if type="article-journal article-magazine" match="any">
+ <group delimiter=". – ">
+ <group delimiter=" // ">
+ <group delimiter=" / ">
+ <group delimiter=" : ">
+ <text macro="author-title"/>
+ <text variable="collection-title"/>
+ </group>
+ <text macro="second-position-authors-only"/>
+ </group>
+ <text variable="container-title"/>
+ </group>
+ <text macro="year-date"/>
+ <text macro="volume"/>
+ <text variable="title-short"/>
+ <text variable="issue" prefix="№&#160;"/>
+ <text macro="page"/>
+ </group>
+ </else-if>
+<!--_______________________________________________________________________________
+ ______________________________ СТАТЬЯ В ГАЗЕТЕ ________________________________
+ _______________________________________________________________________________ -->
+ <else-if type="article-newspaper">
+ <group delimiter=". – ">
+ <group delimiter=" // ">
+ <group delimiter=" / ">
+ <group delimiter=" : ">
+ <text macro="author-title"/>
+ <text variable="section"/>
+ </group>
+ <text macro="second-position-authors-only"/>
+ </group>
+ <text variable="container-title"/>
+ </group>
+ <text macro="year-date"/>
+ <text macro="day-month"/>
+ <text macro="page"/>
+ </group>
+ </else-if>
+<!--_______________________________________________________________________________
+ ___________ ЭЛЕКТРОННЫЙ РЕСУРС УДАЛЕННОГО ДОСТУПА (ВЕБ-СТРАНИЦА)_______________
+ _______________________________________________________________________________ -->
+ <else-if type="webpage">
+ <group delimiter=". – " prefix="">
+ <group delimiter=" / ">
+ <group delimiter=" : ">
+ <text macro="author-title" suffix=" [Электронный ресурс]"/>
+ <text variable="genre"/>
+ </group>
+ <group delimiter=" ">
+ <text macro="second-position-authors-only"/>
+ <text variable="note"/>
+ </group>
+ </group>
+ <text variable="URL" prefix="URL: "/>
+ <text variable="accessed" prefix="(дата обращения:" suffix=")"/>
+ <date variable="accessed">
+ <date-part name="day" suffix="." form="numeric-leading-zeros"/>
+ <date-part name="month" suffix="." form="numeric-leading-zeros"/>
+ <date-part name="year"/>
+ </date>
+ </group>
+ </else-if>
+<!--_______________________________________________________________________________
+ _____________________________ Другие типы источников __________________________
+ _______________________________________________________________________________ -->
+ <else>
+ <group delimiter=". – ">
+ <group delimiter=" / ">
+ <group delimiter=". ">
+ <group delimiter=" : ">
+ <text macro="author-title"/>
+ <text variable="collection-title"/>
+ <text macro="number-of-volumes"/>
+ </group>
+ <text macro="volume"/>
+ <text variable="title-short"/>
+ </group>
+ <group delimiter=" ">
+ <text macro="second-position-creators"/>
+ <text variable="note"/>
+ </group>
+ </group>
+ <text macro="publisher"/>
+ <text macro="collection-number"/>
+ <text macro="pages-or-volumes"/>
+ </group>
+ </else>
+
+ </choose>
+ </macro>
+
+<!--_______________________________________________________________________________
+ _________ Непосредтсвенно БИБЛИОГРАФИЯ с сортировкой и локализацией ___________
+ _______________________________________________________________________________ -->
+
+ <bibliography et-al-min="4" et-al-use-first="1">
+ <sort>
+ <!-- Строка для сортировки в порядке появления ссылок, а не в алфавитном. Чтобы задействовать, нужно ее раскомментировать, а следующие три закомментировать-->
+ <key variable="citation-number"/>
+
+<!-- Сортировка по полю "Language" (сначала русскоязычные источники, затем иностранные) -->
+ <!-- <key macro="language-sort"/> -->
+ <!-- <key macro="author-title"/> -->
+ <!-- <key variable="issued"/> -->
+ </sort>
+
+ <layout suffix=".">
+ <text macro="bibliography"/>
+ </layout>
+
+ </bibliography>
+</style>
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 (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(<search_8>)
+
+Some cite #cite(<search_11>)
+
+Some cite #cite(<eichten1984supercollider>)
+
+= Список использованных источников
+#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
new file mode 100644
index 0000000..59c4c13
--- /dev/null
+++ b/test.typ
@@ -0,0 +1,77 @@
+#import "conf.typ" : conf
+#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
+ )
+ )
+)
+
+= Введение
+Шаблон автоматически определяет и оформляет особенным образом соответствующие секции:
+- Содержание
+- Введение
+- Заключение
+- Список использованных источников
+- Определения, обозначения и сокращения
+- Обозначения и сокращения
+
+= Пример работы шаблона
+== Основные элементы
+Все прочие же выделяются иначе и нумеруются.
+
+=== Виды документов
+
+Шаблон на момент написания документации работает со следующими типами работ:
++ Автореферат
++ Отчёт о научно-исследовательской работе
++ Выпускная квалификационная работа
++ Отчёт о практике
++ Реферат
+
+
+Мы будем сопоставлять русский и английский язык. Будут задания, за которые будут присуждаться баллы. Они будут основаны на материале английского языка. Посещаемость является одним из ключевых моментов при вычислении баллов. Если возникает уважительная причина пропуска, нужно заранее предупредить препода.
+
+
+== Предложение. Классификация предложений
+/ Предложение: --- центральная единица синтаксиса, которая служит главным средством формирования, выражения и сообщения мысли. Каждое предложение состоит из каких-то элементов, в частности, из словосочетаний, которые, в свою очередь, состоят из слов.
+
+
+== Повествовательные предложения
+/ Повествовательные предложения: сообщают определённую информацию.
+
+Например: #quote[I don't want to go anywhere else.]
+
+=== Типы вопросов
+
+#quote(attribution: [Даня])[Если я прямо на паре начну изучать новый вариант русской раскладки, пожалею ли я об этом?]
+
+
+
+/*= Введение
+Абоба
+= Часть первая
+== Глава первая
+=== Пункт первый
+=== Пункт Второй
+== Глава вторая
+= Часть вторая
+
+= Заключение*/
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 <danila.sar@yandex.ru>"]
+license = "MIT-0"
+description = "Unofficial Saratov State University typst template"
+
+[template]
+path = "template"
+entrypoint = "main.typ"