ГОСТ Typst
Набор для отчётов по ГОСТ 7.32 в Typst. Оформление страницы — пакет modern-g7-32. Сюда входит раскладка файлов, хелперы и скрипты.
Пример работы с Typst.typ — синтаксис элементов ГОСТ в одном файле. Корень отчёта только собирает, текст — в каталоге этого отчёта.
Установка в проект
Архив gost-typst-Report-vX.Y.Z.zip с тега v* распаковывается в Report/ рядом с исходниками.
mkdir -p Report && unzip -o gost-typst-Report-v1.0.0.zip -d Report
Пример работы с Typst.typ — справочник синтаксиса ГОСТ (figure + table); таблицы в includes/common.typ устроены так же. extras/ — преамбула практики и обёртка короткого PDF.
В архиве нет .git, .gitea, dist/, *.pdf, __pycache__ и listings/generated/.
Report/
includes/ ← один раз на проект
common.typ ← таблицы, рисунки, заголовки
title-page-mop-evm.typ ← бланк кафедры МОП ЭВМ (ЮФУ+ИКТИБ+МОП ЭВМ)
title-page-prikladnaya-informatika.typ ← бланк ПИ (ЮФУ+ИКТИБ)
title-page-common.typ ← общие куски бланков (подписи, оценка, шапка)
title-page.typ ← реэкспорт МОП ЭВМ
pz-pagination.typ
pz-page-offset.typ ← счётчик страниц при склейке PDF-титула
listings-appendix.typ
reports/
primer/ ← один отчёт; следующий — соседний каталог
report.typ ← корень: gost, include, bibliography
meta.typ ← тема, УДК, студент, кафедра
intro.typ, ch01.typ, … ← разделы: один файл — один заголовок уровня 1
references.bib
appendices/
extras/ ← практика и короткий PDF
Пример работы с Typst.typ ← синтаксис элементов ГОСТ
listings/listings.config.yaml
images/ ← файлы для pz-fig
images/logos/ ← sfedu, iktib, mop-evm (SOURCES.md)
puml/fig_*.puml
scripts/
Хелперы и бланки общие. Новый отчёт — каталог reports/<имя>/ со своим report.typ и meta.typ. Главы primer/ — текст примера.
Правила
- В
reports/<имя>/report.typнет абзацев глав — только#show: gost.with,#include,#outline(),#bibliography, приложения. - Глава начинается с
= …. Введение и заключение:#heading(numbering: none, outlined: true)[Введение]. - Аннотация и «Обозначения» —
pz-front-heading, не= …(иначеgostвставит разрыв страницы). - Рисунки:
#pz-fig("fig_01.png", [Подпись], "fig-01")→images/fig_01.png. Диаграммы сначала вpuml/, затемrender_puml.sh. - Таблицы:
pz-table/pz-test-table. В тексте среднее тире «–», не «—» (scripts/check_gost_dashes.pyпроверяет все*.typ, кромеlistings/,extras/,puml/,scripts/и файла-примера). - Большую главу дробите include из файла главы, не из корня.
- Листинги не писать вручную —
listings.config.yaml+gen_listings.py.
Корень отчёта — reports/<имя>/report.typ. Образец reports/primer на бланке ПИ: hide-title: true и #pz-title-page(meta). Бланк МОП ЭВМ — другой #import и поле department в meta.typ. Другая кафедра — скопировать title-page-mop-evm.typ → title-page-<кафедра>.typ, сменить ряд логотипов и #import в корне отчёта. Типовой ГОСТ-титул пакета: hide-title: false без вызова бланка. Готовый PDF-титул кафедры: hide-title: true, #include page-offset, FRONT_PDF=… ./scripts/build.sh.
В common.typ есть pz-biblio-strip-en (английская библиографическая полоска). Образца abstract-en.typ в наборе нет — при необходимости добавьте сами по образцу abstract-ru.typ.
Сборка
cd Report
./scripts/build.sh
python3 scripts/gen_listings.py # если есть приложение с кодом
./scripts/render_puml.sh # если есть puml/fig_*.puml
python3 scripts/compress_screenshots.py # опционально: сжать скриншоты
build.sh сначала вызывает check_gost_dashes.py, затем typst compile. Переменные окружения:
| Переменная | По умолчанию | Назначение |
|---|---|---|
REPORT_TYP |
reports/primer/report.typ |
Корневой .typ |
OUT_PDF |
PDF рядом с этим .typ |
Итоговый PDF |
FRONT_PDF |
(пусто) | PDF титула для склейки через qpdf; без неё — обычная компиляция |
FRONT_PAGES |
3 |
Сколько страниц взять из FRONT_PDF (совпадает с pz-page-offset.typ) |
compress_screenshots.py жмёт все JPEG/PNG в images/, кроме файлов, чьи стемы совпадают с puml/*.puml (диаграммы не трогает). Пустой набор — не ошибка.
Зависимости
- Typst, Times New Roman
- диаграммы: Java, PlantUML
- склейка титула:
qpdf - листинги: PyYAML (
pip install pyyaml) - сжатие скриншотов: ImageMagick (
magickилиconvert),pngquant
listings.config.yaml
Образец короче полного набора ключей. Скрипт понимает в том числе:
scan_root— корень обхода исходников (относительноReport/)include_extensions— суффикс → языкrawinclude_filenames— имя файла → язык (без расширения в ключе не требуется)root_build_files— файлы корня репозитория в группуrootexclude_dirs,exclude_globsmodules_order,module_titlespagebreak_per_module,pagebreak_per_file,pagebreak_after_listingonly_path_substrings,only_test_filenamesgenerated_subdir,appendix_filename,caption_prefix
Релиз
Тег v* запускает .gitea/workflows/release.yml: скрипт scripts/pack-report-release.sh собирает zip и workflow публикует его в Releases.
git tag v1.0.0
git push origin v1.0.0
Локально, без публикации: ./scripts/pack-report-release.sh 1.0.0 → dist/gost-typst-Report-v1.0.0.zip.
Публикация идёт секретом ACCOUNT_TOKEN: личный токен доступа (Настройки → Приложения). Ему нужно одно разрешение: repository — Read and Write (write:repository). Им создаётся релиз и загружается zip. Разрешения package, admin и all не нужны. Если репозиторий закрытый, у токена снимают «Public only». Учётная запись токена должна иметь право записи в репозиторий.
extras/
Короткие PDF отдельно от пояснительной записки:
practice-preamble.typ— преамбула отчёта по практике: поляpractice_meta(вид, сроки, организация, студент, группа, направление, проект) и заголовокpractice_titlefragment-doc.typ— обёртка фрагмента/методички без ГОСТ-титула: параметрыtitle,criterion,work-title; шрифт 14 pt, отступ 1,25 см, заголовки уровней 1–2
Новый отчёт
- Скопировать
reports/primer/вreports/<имя>/. - Заполнить
meta.typиgost.withвreport.typэтого каталога. - Заменить главы и строку
#include. Текст разделов остаётся рядом сreport.typ. - Собрать:
REPORT_TYP=reports/<имя>/report.typ ./scripts/build.sh. - Синтаксис таблицы и рисунка — в
Пример работы с Typst.typ.
Общими остаются includes/, scripts/ и images/logos/.