From 22d731e0a7c1c5251cd0e30cfb5b4db5b932c765 Mon Sep 17 00:00:00 2001 From: Andrew Guschin Date: Sun, 22 Jun 2025 15:15:21 +0400 Subject: =?UTF-8?q?feat:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D1=8B=20=D0=BF=D1=80=D0=B8=D0=BB=D0=BE=D0=B6=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=B8=20=D1=81=D0=BF=D0=B5=D1=86=D0=B8=D0=B0?= =?UTF-8?q?=D0=BB=D1=8C=D0=BD=D1=8B=D0=B5=20=D0=B7=D0=B0=D0=B3=D0=BE=D0=BB?= =?UTF-8?q?=D0=BE=D0=B2=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - специальные ненумерованные заголовки создаются отдельными командами - приложение создаётся отдельным show rule - все такие заголовки отдельно обрабатываются при генерации содержания --- conf.typ | 93 ++++++++++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 76 insertions(+), 17 deletions(-) diff --git a/conf.typ b/conf.typ index d932885..24ae5be 100644 --- a/conf.typ +++ b/conf.typ @@ -39,12 +39,11 @@ plural: "студентов", ), caps_headings: ( - [Содержание], + [ОПРЕДЕЛЕНИЯ, ОБОЗНАЧЕНИЯ И СОКРАЩЕНИЯ], + [СОДЕРЖАНИЕ], [ВВЕДЕНИЕ], [ЗАКЛЮЧЕНИЕ], - [Список использованных источников], - [Определения, обозначения и сокращения], - [Обозначения и сокращения], + [СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ], ), specialities: ( spec_kb: [10.05.01 --- Компьютерная безопасность], @@ -331,21 +330,44 @@ */ 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 + let heading-text = it + .at("element", default: (:)) + .at("body", default: "") + + let is-outlined = it.element.outlined + let is-annex = state("annex", false).at(it.element.location()) + let is-caps = heading-text in strings.caps_headings + + // TODO: Хотелось бы запретить создавать ненумерованные заголовки. По + // какой-то причине это не срабаотывает для самого заголовка содержания. Не + // понятно почему оно сюда вообще попадает. + // assert(is-caps or (not is-outlined) or it.element.numbering != none) + + if (not (is-annex or is-caps)) { + return it } - 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(), + + assert(is-annex or is-caps) + let prefix = none + if is-annex { + prefix = [ПРИЛОЖЕНИЕ #it.prefix() #heading-text] + } else if is-caps { + prefix = heading-text + sym.space + } + link( + it.element.location(), + it.indented( + none, + prefix + + sym.space + + box(width: 1fr, it.fill) + + sym.space + + sym.wj + + it.page(), + ), ) } - outline(indent: 2%, title: [Содержание]) + outline(title: [СОДЕРЖАНИЕ]) }, /* * Генерирует весь документ @@ -468,8 +490,16 @@ ), ) +#let defabbr = { + heading( + numbering: none, + outlined: true, + [ОПРЕДЕЛЕНИЯ, ОБОЗНАЧЕНИЯ И СОКРАЩЕНИЯ], + ) +} + #let intro = { - [#heading(numbering: none, outlined: true, [ВВЕДЕНИЕ]) ] + heading(numbering: none, outlined: true, [ВВЕДЕНИЕ]) } @@ -477,6 +507,35 @@ heading(numbering: none, outlined: true, [ЗАКЛЮЧЕНИЕ]) } +#let annex-letters = "АБВГДЕЖЗИКЛМНПРСТУФХЦШЩЭЮЯABCDEFGHJKLMNPQRSTUVWXYZ" +#let annex-numbering(..nums) = { + let number = nums.pos().first() - 1 + annex-letters.clusters().at(number, default: str(number)) +} + +// thx https://github.com/typst-g7-32/modern-g7-32 +#let annexes-start(it) = { + set heading( + numbering: annex-numbering, + outlined: true, + ) + set align(center) + + show heading: it => { + if it.depth == 1 { + pagebreak(weak: true) + } + set text(size: font_size) + let letter = counter(heading).display(annex-numbering) + [ПРИЛОЖЕНИЕ #letter \ #it.body #v(line_spacing / 2)] + } + + state("annex").update(true) + counter(heading).update(0) + + it +} + #let thm-format = thmplain.with( inset: 0em, padding: (y: font_size / 2), -- cgit v1.2.3