Initial commit

This commit is contained in:
malysheva committed 2026-10-09 04:24:38 +00:00
commit c534d5ce80
163 files changed
+11500

No files matched your search

@@ -0,0 +1,49 @@
#import "/.template/lib/api.typ": document, recipient, attachment, attachment-set
#import "/.template/lib/presentation/profiles/commercial-offer.typ": commercial-offer-profile
#let addressee = recipient(
company: "АО «Заказчик»",
title: "Руководителю службы автоматизации",
name: "С.С. Заказчикову",
)
#let appendices = attachment-set(items: (
attachment(
"scope",
"Техническое задание",
[
Поставка, настройка и ввод в эксплуатацию тестового комплекса.
],
),
))
#show: document.with(
company: "test-company",
profile: commercial-offer-profile(
recipient: addressee,
subject: "Поставка и внедрение тестового комплекса",
amount: "1 250 000",
currency: "руб.",
tax_note: "включая НДС 20 %",
delivery_term: "45 рабочих дней",
validity: "30 календарных дней",
payment_terms: "30 % аванс, 70 % после приёмки",
date: "26.08.2026",
reference: "ТКП-001",
note: "Контактное лицо: А.А. Автор",
attachments: appendices,
),
)
Уважаемый Сергей Сергеевич!
Предлагаем выполнить комплекс работ по поставке и внедрению оборудования.
== Состав работ
- обследование объекта;
- поставка оборудования;
- монтаж и пусконаладка;
- обучение персонала заказчика.
Гарантийный срок составляет 12 месяцев с даты подписания акта приёмки.
+85
View File
@@ -0,0 +1,85 @@
#import "/.template/lib/api.typ": document, party, signer, attachment, attachment-set, load-company
#import "/.template/lib/presentation/profiles/contract.typ": contract-profile, contract-section
#let company = load-company("test-company")
#let contractor = party(
"contractor",
"Исполнитель",
company.legal.name,
legal: company.legal,
contacts: company.contacts,
banking: company.banking,
representative: signer(
company.director.name,
company.director.title,
basis: "Устава",
signature: company.resources.signature,
stamp: company.resources.stamp,
),
)
#let customer = party(
"customer",
"Заказчик",
"ООО «Заказчик»",
legal: (
inn: "1111111111",
kpp: "111111111",
address: "г. Пример, ул. Договорная, 2",
),
contacts: (email: "customer@example.invalid"),
banking: (
bank: "Банк заказчика",
account: "11111111111111111111",
bik: "111111111",
),
representative: signer(
"П.П. Заказчиков",
"Генеральный директор",
basis: "Устава",
),
)
#let sections = (
contract-section(
"subject",
"Предмет договора",
[Исполнитель обязуется выполнить работы, а Заказчик — принять и оплатить их на условиях настоящего договора.],
),
contract-section(
"price",
"Цена и порядок расчётов",
[Цена договора составляет 1 250 000 рублей, включая НДС 20 %.],
),
contract-section(
"liability",
"Ответственность сторон",
[Стороны несут ответственность в соответствии с законодательством Российской Федерации.],
),
)
#let appendices = attachment-set(items: (
attachment(
"specification",
"Спецификация",
[
Перечень работ и оборудования согласуется сторонами в настоящем приложении.
],
),
))
#show: document.with(
company: "test-company",
profile: contract-profile(
number: "Д-001/2026",
date: "26 августа 2026 г.",
place: "г. Пример",
title: "Договор оказания услуг",
parties: (contractor, customer),
sections: sections,
attachments: appendices,
),
)
Настоящий договор вступает в силу с момента подписания обеими сторонами.
@@ -0,0 +1,26 @@
#import "/.template/lib/api.typ": document, document-profile
#let smoke-renderer(body, ctx) = [
#set text(font: "Arial", size: 11pt, lang: "ru")
#set page(paper: "a4")
#text(weight: "bold")[DDD CORE SMOKE]
Компания: #ctx.company.legal.name
Профиль: #ctx.at("profile-id")
#body
]
#let smoke-profile = document-profile(
"smoke",
smoke-renderer,
metadata: (:),
)
#show: document.with(
company: "test-company",
profile: smoke-profile,
)
Изолированное ядро успешно собрано.
@@ -0,0 +1,7 @@
#import "/.template/lib/index.typ": document
#show: document.with(company: "test-company")
#heading(numbering: none)[ПРОВЕРКА ПРОФИЛЯ ПО УМОЛЧАНИЮ]
Корневой фасад формирует отчёт без явной передачи profile.
@@ -0,0 +1,15 @@
#import "/.template/lib/index.typ": document, profiles, recipient, info-block
#show: document.with(
company: "test-company",
profile: profiles.letter(
recipient: recipient(company: "ООО «Проверка фасада»"),
title: "Публичный фасад",
show_stamp: false,
),
options: (mode: "clean-copy", media-policy: "hide"),
)
#info-block(title: [ПРОВЕРКА КОМПОНЕНТА])[
Корневой файл экспортирует единый фасад и namespace профилей.
]
+38
View File
@@ -0,0 +1,38 @@
#import "/.template/lib/api.typ": document, recipient, attachment, attachment-set
#import "/.template/lib/presentation/profiles/letter.typ": letter-profile
#let addressee = recipient(
company: "ООО «Получатель»",
title: "Генеральному директору",
name: "П.П. Получателю",
address: "г. Пример, ул. Адресная, 10",
)
#let appendices = attachment-set(items: (
attachment(
"specification",
"Краткая спецификация",
[
Состав приложения задаётся пользователем независимо от профиля письма.
],
),
))
#show: document.with(
company: "test-company",
profile: letter-profile(
recipient: addressee,
date: "26.08.2026",
reference: "Л-001",
title: "О направлении материалов",
note: "Исполнитель: А.А. Автор, +7 (000) 000-00-01",
attachments: appendices,
render_attachments: true,
),
)
Уважаемый Пётр Петрович!
Направляем материалы для рассмотрения. Профиль письма использует единый источник данных компании и самостоятельно формирует шапку, подвал, список приложений и блок подписи.
Просим подтвердить получение документов.
@@ -0,0 +1,90 @@
#import "/.template/lib/index.typ": numbered-list
#set page("a4", margin: 1cm)
#set text(size: 9pt)
#set par(first-line-indent: 0pt, leading: 0.4em)
= SCIENTIA LIST COUNTERS
#let compact-list(style, body) = numbered-list(
levels: (style,),
suffixes: ".",
line-leading: 0.4em,
item-spacing: 0pt,
body,
)
== Арабские числа
#compact-list("1")[
+ Арабские: первый
+ Арабские: второй
+ Арабские: третий
]
== Кириллица
#grid(
columns: (1fr, 1fr),
gutter: 1cm,
[
#compact-list("А")[
+ Кириллица верхняя: первый
+ Кириллица верхняя: второй
+ Кириллица верхняя: третий
]
],
[
#compact-list("а")[
+ Кириллица нижняя: первый
+ Кириллица нижняя: второй
+ Кириллица нижняя: третий
]
],
)
== Латиница
#grid(
columns: (1fr, 1fr),
gutter: 1cm,
[
#compact-list("A")[
+ Латиница верхняя: первый
+ Латиница верхняя: второй
+ Латиница верхняя: третий
]
],
[
#compact-list("a")[
+ Латиница нижняя: первый
+ Латиница нижняя: второй
+ Латиница нижняя: третий
]
],
)
== Ведущий ноль
#compact-list("01")[
+ Ведущий ноль: первый
+ Ведущий ноль: второй
+ Ведущий ноль: третий
]
== Вложенные счётчики
#numbered-list(
levels: ("1", "а", "A"),
full: true,
separators: ".",
suffixes: ".",
line-leading: 0.4em,
item-spacing: 0pt,
)[
+ Корневой уровень
+ Второй уровень: первый
+ Второй уровень: второй
+ Третий уровень: первый
+ Третий уровень: второй
]
+60
View File
@@ -0,0 +1,60 @@
#import "/.template/lib/index.typ": document, profiles, recipient, party, signer, load-company
#let profile-id = sys.inputs.at("profile", default: "letter")
#let mode = sys.inputs.at("mode", default: "draft")
#let company-id = sys.inputs.at("company", default: "test-company")
#let company = load-company(company-id)
#let addressee = recipient(company: "ООО «Проверка режима»")
#let left = party(
"left",
"Исполнитель",
company.legal.name,
legal: company.legal,
contacts: company.contacts,
banking: company.banking,
representative: signer(
company.director.name,
company.director.title,
signature: company.resources.signature,
stamp: company.resources.stamp,
),
)
#let right = party(
"right",
"Заказчик",
"ООО «Проверка режима»",
representative: signer("П.П. Проверяющий", "Директор"),
)
#let selected-profile = if profile-id == "report" {
profiles.report(title: "Проверка режима выпуска", year: 2026)
} else if profile-id == "letter" {
profiles.letter(recipient: addressee, title: "Проверка режима выпуска")
} else if profile-id == "commercial-offer" {
profiles.commercial_offer(
recipient: addressee,
subject: "Проверка режима выпуска",
amount: "100 000",
currency: "руб.",
)
} else if profile-id == "contract" {
profiles.contract(
number: "MODE-1",
date: "26.08.2026",
parties: (left, right),
sections: (
profiles.contract_section("subject", "Предмет договора", [Проверка режима выпуска.]),
),
)
} else {
panic("Неизвестный тестовый profile: " + profile-id)
}
#show: document.with(
company: company,
profile: selected-profile,
options: (mode: mode, watermark: if mode == "draft" { "ЧЕРНОВИК" } else { none }),
)
Документ собран в режиме #mode для профиля #profile-id.
@@ -0,0 +1,5 @@
#import "/.template/lib/index.typ": document
#show: document.with(company: "unknown-company")
Этот текст не должен попасть в PDF.
@@ -0,0 +1,13 @@
#import "/.template/lib/index.typ": document, profiles, party
#let duplicate = (
party("same", "Исполнитель", "ООО «Первый»"),
party("same", "Заказчик", "ООО «Второй»"),
)
#show: document.with(
company: "test-company",
profile: profiles.contract(number: "1", parties: duplicate),
)
Этот текст не должен попасть в PDF.
@@ -0,0 +1,8 @@
#import "/.template/lib/index.typ": document, profiles
#show: document.with(
company: "test-company",
profile: profiles.letter(),
)
Этот текст не должен попасть в PDF.
@@ -0,0 +1,5 @@
#import "/.template/lib/index.typ": numbered-list
#numbered-list(scheme: "неизвестная-схема")[
+ Тестовый пункт
]
@@ -0,0 +1,11 @@
#import "/.template/lib/index.typ": document, profiles, recipient
#show: document.with(
company: "test-company",
profile: profiles.commercial_offer(
recipient: recipient(company: "ООО «Адресат»"),
subject: "Предложение без стоимости",
),
)
Этот текст не должен попасть в PDF.
@@ -0,0 +1,3 @@
#import "/.template/lib/index.typ": vref
#vref(<missing-reference>, grammatical-case: "мест")
@@ -0,0 +1,5 @@
#import "/.template/lib/index.typ": vrefs
#vrefs((<valid-label>, "not-a-label"))
#figure(rect(width: 1cm, height: 1cm), caption: [Элемент]) <valid-label>
@@ -0,0 +1,11 @@
#import "/.template/lib/index.typ": document, profiles
#show: document.with(
company: "test-company",
profile: profiles.report(
title: "Ошибка пути приложения",
appendices: ("appendix.typ",),
),
)
Проверка понятной ошибки для строкового пути.
+39
View File
@@ -0,0 +1,39 @@
#import "/.template/lib/index.typ": document, profiles, recipient, company-profile
#let policy = sys.inputs.at("policy", default: "placeholder")
#let company = company-profile(
"no-media",
(
name: "ООО «Компания без встроенных графических ресурсов»",
short-name: "Без ресурсов",
jurisdiction: "RU",
inn: "0000000000",
),
contacts: (
email: "no-media@example.invalid",
phone: "+7 (000) 000-00-00",
address: "г. Пример, очень длинный адрес для проверки переноса строк в деловом документе, дом 100, офис 200",
),
banking: (:),
brand: (color: rgb("e39f49")),
director: (title: "Генеральный директор", name: "И.И. Подписант"),
resources: (logo: none, signature: none, stamp: none),
)
#show: document.with(
company: company,
profile: profiles.letter(
recipient: recipient(
company: "Акционерное общество «Организация с длинным наименованием для проверки устойчивости вёрстки»",
title: "Заместителю генерального директора по техническим и коммерческим вопросам",
name: "П.П. Получателю",
address: "г. Пример, проспект Испытательный, дом 123, строение 45",
),
date: "26.08.2026",
reference: "NO-MEDIA-001",
title: "Проверка формирования документа без логотипа, подписи и печати",
),
options: (mode: "final", media-policy: policy),
)
Документ без графических ресурсов собран с политикой #policy.
@@ -0,0 +1,49 @@
#import "/.template/lib/api.typ": load-company, recipient, signer
#import "/.template/lib/presentation/foundation.typ": apply-foundation, render-media-slot
#import "/.template/lib/presentation/components.typ": corp_table, company-footer, letter-header, signature-block
#let company = load-company("test-company")
#let addressee = recipient(
company: "ООО «Получатель»",
title: "Руководителю проекта",
name: "П.П. Примерову",
)
#let director = signer(
company.director.name,
company.director.title,
signature: company.resources.signature,
stamp: company.resources.stamp,
)
#let ctx = (
company: company,
options: (watermark: none),
)
#show: apply-foundation.with(
ctx: ctx,
page-options: (margin: (x: 2cm, y: 1.5cm)),
)
#letter-header(
company,
addressee,
date: "26.08.2026",
reference: "TEST-1",
title: "Проверка компонентов",
)
#v(0.8cm)
Общая presentation-основа не зависит от конкретного профиля документа.
#v(0.8cm)
#corp_table(
columns: 2,
[Компонент], [Состояние],
[Таблица], [Работает],
[Media slot], [#render-media-slot(none, width: 3cm, height: 1cm)],
)
#v(1cm)
#signature-block(director, company: company)
#place(bottom + left, dy: 0.5cm, company-footer(company))
@@ -0,0 +1,49 @@
#import "/.template/lib/index.typ": vref, vrefs
#set page(paper: "a4", margin: 15mm)
#set text(lang: "ru", size: 9pt)
#set heading(numbering: "1.")
#set figure(numbering: "1")
#figure(
rect(width: 12mm, height: 6mm),
caption: [Первый рисунок],
) <case-figure-a>
#figure(
rect(width: 12mm, height: 6mm),
caption: [Второй рисунок],
) <case-figure-b>
#figure(
table(columns: 1, [Значение]),
caption: [Тестовая таблица],
) <case-table>
#math.equation(block: true, numbering: "(1)")[$x = 1$] <case-equation>
= Тестовый раздел <case-section>
Предложный по умолчанию: на #vref(<case-figure-a>).
Именительный коротко: #vref(<case-figure-a>, "и").
Родительный коротко: без #vref(<case-figure-a>, "р").
Дательный коротко: к #vref(<case-figure-a>, "д").
Винительный коротко: вижу #vref(<case-figure-a>, "в").
Творительный коротко: перед #vref(<case-figure-a>, "т").
Предложный коротко: на #vref(<case-figure-a>, "п").
Явная строчная форма: на #vref(<case-figure-a>, capitalized: false).
Полное название: на #vref(<case-table>, "предложный").
Формула: согласно #vref(<case-equation>, "дательный").
Раздел: в #vref(<case-section>).
Группа по умолчанию: на #vrefs((<case-figure-a>, <case-figure-b>)).
@@ -0,0 +1,8 @@
= Исходные данные <test-appendix-source>
Первое приложение подключено отдельным файлом.
#figure(
rect(width: 4cm, height: 1.5cm, fill: luma(235), stroke: 0.5pt),
caption: [Схема первого приложения],
) <test-appendix-figure>
@@ -0,0 +1,12 @@
= Проверочные расчёты <test-appendix-calculations>
Второе приложение автоматически продолжает кириллическую нумерацию.
#figure(
table(
columns: (1fr, 1fr),
[Параметр], [Значение],
[Коэффициент], [1,3],
),
caption: [Таблица второго приложения],
) <test-appendix-table>
@@ -0,0 +1,38 @@
#import "/.template/lib/index.typ": document, profiles, vref, vrefs
#show: document.with(
company: "test-company",
profile: profiles.report(
title: "Проверка файловых приложений",
year: 2026,
executors: (),
appendices: (
path("appendices/01-source-data.typ"),
path("appendices/02-calculations.typ"),
),
appendix_numbering: "cyrillic",
appendix_start: 1,
show_title_page: false,
show_executors: false,
show_outline: true,
),
options: (mode: "clean-copy", media-policy: "hide"),
)
= ОСНОВНОЙ ТЕКСТ
Стандартная ссылка: @test-appendix-source.
Именительный: #vref(<test-appendix-source>, "и").
Родительный: без #vref(<test-appendix-source>, "р").
Дательный: к #vref(<test-appendix-source>, "д").
Винительный: вижу #vref(<test-appendix-source>, "в").
Творительный: перед #vref(<test-appendix-source>, "т").
Предложный по умолчанию: в #vref(<test-appendix-source>).
Группа приложений: в #vrefs((<test-appendix-source>, <test-appendix-calculations>)).
@@ -0,0 +1,71 @@
#import "/.template/lib/report.typ": report
#import "/.template/lib/company.typ": company-defaults
#import "/.template/lib/components.typ": corp_table, formula
#import "/.template/lib/appendices.typ": make_appendices
#import "/.template/lib/references.typ": vref, eqref
#show: report.with(
..company-defaults(company-id: "test-company"),
udk: "000.000",
director_date: "«26» августа 2026 г.",
is_research: true,
title: "Тестовый отчёт",
theme: "Регрессионная проверка шаблона",
is_intermediate: true,
stage_num: 1,
vol_num: 1,
contract_num: "TEST-001",
contract_date: "«26» августа 2026",
year: 2026,
executors: (
("Ответственный исполнитель", "Тестов И.И.", path("/.template/companies/test-company/sign.svg"), 0.5cm),
("Инженер", "Примеров П.П.", path("/.template/companies/test-company/sign.svg"), 0.5cm),
),
)
#heading(numbering: none)[ВВЕДЕНИЕ]
Этот документ фиксирует исходное поведение шаблона перед архитектурным рефакторингом.
= ОСНОВНОЙ РАЗДЕЛ
Сложные элементы должны сохранять нумерацию, подписи и ссылки.
#figure(
image("/.template/companies/test-company/logo.svg", width: 35%),
caption: [Синтетический логотип для визуального теста],
) <baseline-figure>
Ссылка на рисунок: #vref(<baseline-figure>, grammatical-case: "вин").
#figure(
corp_table(
columns: (1fr, 1fr, 1fr),
table.cell(rowspan: 2, align: center + horizon)[Параметр],
table.cell(colspan: 2, align: center + horizon)[Значения],
[Минимум], [Максимум],
[Тестовая строка], [10], [20],
[Вторая строка], [30], [40],
),
caption: [Таблица с многострочной шапкой],
) <baseline-table>
Ссылка на таблицу: #vref(<baseline-table>, grammatical-case: "предл").
#formula($a^2 + b^2 = c^2$) <baseline-equation>
Ссылка на формулу: #eqref(<baseline-equation>).
#pagebreak()
#heading(numbering: none)[ЗАКЛЮЧЕНИЕ]
Компиляция и визуальное сравнение подтверждают стабильность ключевых элементов.
#pagebreak()
#heading(numbering: none)[СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ]
#bibliography("/assets/references.bib", title: none, style: "gost-r-705-2008-numeric")
#show: make_appendices
= ТЕСТОВОЕ ПРИЛОЖЕНИЕ
Содержимое приложения используется для проверки кириллической нумерации.
@@ -0,0 +1,3 @@
= Тестовое приложение <new-test-appendix>
Приложение создано как самостоятельный Typst-файл.
@@ -0,0 +1,87 @@
#import "/.template/lib/api.typ": document, bibliography-section
#import "/.template/lib/presentation/profiles/report.typ": report-profile
#import "/.template/lib/presentation/components.typ": corp_table, formula
#import "/.template/lib/presentation/references.typ": vref, vrefs, eqref
#let appendices = (
path("appendix.typ"),
)
#let bibliographies = (
bibliography-section(
"normative",
path("normative.bib"),
title: [НОРМАТИВНЫЕ ИСТОЧНИКИ],
group: "report-sources",
),
bibliography-section(
"science",
path("science.bib"),
title: [НАУЧНЫЕ ИСТОЧНИКИ],
group: "report-sources",
),
)
#show: document.with(
company: "test-company",
profile: report-profile(
title: "Новый модульный отчёт",
theme: "Проверка DDD-профиля",
udk: "000.000",
director_date: "«26» августа 2026 г.",
is_research: true,
is_intermediate: true,
stage_number: 1,
volume_number: 1,
contract_number: "DDD-001",
contract_date: "«26» августа 2026",
city: "Пример",
year: 2026,
executors: (
("Ответственный исполнитель", "Тестов И.И.", path("/.template/companies/test-company/sign.svg"), 0.5cm),
),
appendices: appendices,
appendix_numbering: "cyrillic",
appendix_start: 1,
bibliographies: bibliographies,
),
)
#heading(numbering: none)[ВВЕДЕНИЕ]
Профиль отчёта использует нормативный источник @normative-test и научную публикацию @science-test.
Тестовое содержимое вынесено в #vref(<new-test-appendix>).
= ПРОВЕРКА ССЫЛОК
#figure(
rect(width: 3cm, height: 1.5cm, fill: rgb("fbb20d")),
caption: [Первый тестовый рисунок],
) <new-figure-a>
#figure(
circle(radius: 0.7cm, fill: rgb("e39f49")),
caption: [Второй тестовый рисунок],
) <new-figure-b>
Одна ссылка: #vref(<new-figure-a>, grammatical-case: "предл").
Несколько ссылок: #vrefs((<new-figure-a>, <new-figure-b>), grammatical-case: "вин").
#figure(
corp_table(
columns: 2,
[Параметр], [Значение],
[Архитектура], [Изолированная],
),
caption: [Проверочная таблица],
)
#formula($x^2 + y^2 = z^2$) <new-equation>
Формула: #eqref(<new-equation>).
#heading(numbering: none)[ЗАКЛЮЧЕНИЕ]
Новый отчёт собирается через `document` и `report-profile`.
@@ -0,0 +1,6 @@
@book{normative-test,
title={Синтетический нормативный источник},
author={{Тестовый регулятор}},
year={2026},
publisher={Тестовое издательство}
}
@@ -0,0 +1,8 @@
@article{science-test,
title={Синтетическое исследование устойчивости шаблонов},
author={Тестов, И. И.},
year={2026},
journal={Журнал тестовых данных},
volume={1},
pages={1--10}
}
@@ -0,0 +1,31 @@
#import "/.template/lib/index.typ": document, profiles, load-company
#let enabled(name) = sys.inputs.at(name, default: "true") == "true"
#let company = load-company("test-company", signature: none, stamp: none)
#let executors = (
("Ответственный исполнитель", "Тестов И.И.", none, 0cm),
)
#show: document.with(
company: company,
profile: profiles.report(
title: "Контрольный отчёт",
theme: "Независимые служебные страницы",
city: "Екатеринбург",
year: 2026,
executors: executors,
show_title_page: enabled("title"),
show_executors: enabled("executors"),
show_outline: enabled("outline"),
),
options: (
mode: "clean-copy",
watermark: none,
media-policy: "hide",
diagnostics: true,
),
)
= ОСНОВНОЙ ТЕКСТ
Основной текст контрольного отчёта начинается без пустой промежуточной страницы.
@@ -0,0 +1,136 @@
#import "/.template/lib/index.typ": document, profiles, corp-table, formula, vref, vrefs, eqref
#let stress-rows = range(1, 73).map(index => (
[#index],
[
#if index == 3 {
[Составной параметр:
- первый вложенный пункт;
- второй вложенный пункт с длинным пояснением внутри ячейки.]
} else {
[Параметр #index с достаточно длинным наименованием для проверки переноса строк]
}
],
[
#if index == 4 {
[Значение #index. #link("https://example.invalid/table-cell")[Ссылка внутри ячейки] сохраняет кликабельность и не меняет отступы.]
} else {
[Значение #index. Текст ячейки переносится, но сохраняет одинаковые внутренние поля и межстрочный интервал.]
}
],
)).flatten()
#show: document.with(
company: "test-company",
profile: profiles.report(
title: "Стресс-тест типографики",
theme: "Таблицы, списки, формулы и грамматические ссылки",
year: 2026,
executors: (),
),
)
= КОНТЕКСТНЫЕ ИНТЕРВАЛЫ
== Заголовок перед абзацем
Обычный абзац после заголовка должен иметь устойчивую красную строку, нормативный межстрочный интервал и не зависеть от элемента, который находился перед заголовком.
== Заголовок перед маркированным списком
- Первый уровень маркированного списка;
- второй уровень с длинным текстом, который переносится на новую строку без смещения маркера;
- третий уровень.
- Возврат на первый уровень.
== Заголовок перед нумерованным списком
+ Основной пункт
+ Второй уровень
+ Третий уровень
+ Следующий основной пункт
== Соседние заголовки
=== Заголовок третьего уровня
==== Заголовок четвёртого уровня
Текст после цепочки заголовков.
= ССЫЛКИ С ПАДЕЖАМИ <stress-section>
#figure(
rect(width: 3cm, height: 1.3cm, fill: rgb("fbb20d")),
caption: [Первый контрольный рисунок],
) <stress-figure-a>
#figure(
circle(radius: 0.65cm, fill: rgb("e39f49")),
caption: [Второй контрольный рисунок],
) <stress-figure-b>
#formula($a^2 + b^2 = c^2$) <stress-equation>
Именительный: #vref(<stress-figure-a>, grammatical-case: "имен").
Родительный: без #vref(<stress-figure-a>, grammatical-case: "род").
Дательный: к #vref(<stress-figure-a>, grammatical-case: "дат").
Винительный: см. #vref(<stress-figure-a>, grammatical-case: "вин").
Творительный: перед #vref(<stress-figure-a>, grammatical-case: "тв").
Предложный: на #vref(<stress-figure-a>, grammatical-case: "предл").
Групповая ссылка: на #vrefs(
(<stress-figure-a>, <stress-figure-b>),
grammatical-case: "предл",
).
Формула в дательном падеже: к #vref(<stress-equation>, grammatical-case: "дат"); короткая ссылка #eqref(<stress-equation>).
Ссылка на раздел: в #vref(<stress-section>, grammatical-case: "предл").
Внешняя ссылка: #link("https://example.invalid/specification")[контрольная спецификация].
= МНОГОСТРАНИЧНАЯ ТАБЛИЦА
#figure(
corp-table(
columns: (1.2cm, 1.7fr, 2.3fr),
header: (
table.cell(rowspan: 2, align: center + horizon)[№],
table.cell(colspan: 2, align: center + horizon)[Контрольные данные],
[Параметр],
[Описание и значение],
),
body: stress-rows,
repeat_header: true,
continuation: true,
continuation_text: "Продолжение таблицы",
body-leading: 0.65em,
body-inset: (x: 4pt, y: 3pt),
justify: false,
hyphenate: false,
),
caption: [Таблица, переходящая через несколько страниц],
) <stress-table>
= ПРОВЕРКА ПОСЛЕ ТАБЛИЦЫ
Текст после таблицы не должен прилипать к последней строке. Ссылка на #vref(<stress-table>, grammatical-case: "вин") остаётся рабочей.
#pagebreak()
= ВЫСОКАЯ СТРОКА ТАБЛИЦЫ
#let tall-cell = range(1, 66).map(index => [Строка высокой ячейки #index. Содержимое одной строки таблицы продолжается без потери границ.]).join(linebreak())
#figure(
corp-table(
columns: (3cm, 1fr),
header: ([Идентификатор], [Высокая ячейка]),
body: ([ROW-ONE], tall-cell),
row_breakable: true,
page_break: "fit",
repeat_header: true,
continuation: true,
continuation_text: "Продолжение высокой таблицы",
justify: false,
),
caption: [Одна высокая строка, переходящая через страницы],
) <tall-row-table>