summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordanilasar <danila.sar@yandex.ru>2025-01-01 15:39:04 +0400
committerdanilasar <danila.sar@yandex.ru>2025-01-01 15:39:04 +0400
commit23b4960c491eac6264ae766c7aecca2c53679472 (patch)
treeb3bda9618880e3c35da05f2e52933b71b74bae41
parentecbc4e8c6f9c70346c2380a97fb6e607ecfdaa10 (diff)
рефактор: полная переработка кода
-rw-r--r--conf.typ551
-rw-r--r--gost-7-1-2003.csl519
-rw-r--r--test (2).typ46
-rw-r--r--test.bib28
-rw-r--r--test.typ128
5 files changed, 938 insertions, 334 deletions
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 @@
+<?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/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
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!]
-
/*= Введение