- registry.py: реестры BLOCK/PATTERNS/INLINE с декораторами @block/@pattern/@inline - render.py: единый диспетчер, слой паттернов, проверка контракта pos (RuntimeError), pending_toc вместо current_heading для единственной вставки СОДЕРЖАНИЯ - handlers/image.py: вики-ссылки ![[путь|ширина]], подпись Рисунок N —— ... , figure-окружение, авто-нумерация, копирование файлов в tmpdir - handlers/inline.py: табличная диспетчеризация вместо if/elif - Все block-обработчики подписаны @block, корректно продвигают pos - parser.py: препроцессинг ![[...]] → , iter_image_sources() - main.py: _copy_assets (emblem+картинки в tmpdir), фикс лога (имя .tex), cwd=tmpdir для xelatex, цикл вместо дублирования, force-include emblem - tests/test_render.py: pytest (10 тестов), pyproject dev-dep, make test - preamble.py: name=Рисунок для figure-caption (было Рис. от babel) - Исправлены баги: мёртвый обработчик, emblem не копировалась, множественный TOC, захардкожен report.log, маскировка pos - README/AGENTS.md обновлены
md2gost
Конвертер Markdown в LaTeX по ГОСТ Р 7.0.5-2008. Генерирует PDF-отчёты с титульным листом, содержанием, нумерацией и форматированием по ГОСТ.
Установка
Требуется Docker. Локальная установка LaTeX не нужна.
docker build -t md2gost .
Использование
./md2gost.sh report.md -o ./build
Скрипт создаст build/report.tex и build/report.pdf.
Флаги
-o dir-- выходная директория (по умолчанию./build)--no-pdf-- только .tex, без компиляции
Формат Markdown
Используется front matter в начале файла:
---
факультет: Информатика и системы управления
кафедра: Программные средства
тип: Отчёт по практике
название: Исследование алгоритмов оптимизации
студент: Иванов И.И.
преподаватель: Петров П.П.
группа: ИУ1-12
год: 2026
---
Обязательные поля: название, тип.
Поддерживаемые элементы
- Заголовки (1-3 уровень) с нумерацией
- Параграфы, списки (маркированные и нумерованные)
- Таблицы
- Код с подсветкой синтаксиса
- Изображения (см. ниже)
- Аббревиатуры (раздел "Перечень принятых сокращений")
- Ссылки, жирный, курсив
Изображения
Рисунок — вики-ссылка отдельным абзацем; подпись — следующий абзац вида
Рисунок N <тире> Название (номер отбрасывается, LaTeX нумерует сам):
![[images/antenna.png]]
Рисунок 1 —— Антенна
Данная антенна используется для ...
Ширина задаётся суффиксом |N (доля от ширины текста):
![[images/scheme.png|50]]
Файлы картинок копируются в каталог компиляции автоматически; эмблема титульного листа ищется рядом со входным файлом или берётся из пакета. Картинка внутри текстового абзаца не поддерживается (по ГОСТ рисунок оформляется отдельным абзацем) и пропускается с предупреждением.
Структура проекта
md2gost/
md2gost/
main.py # точка входа
parser.py # парсинг markdown (+ вики-ссылки картинок)
registry.py # реестры block/pattern/inline обработчиков
render.py # проход по токенам и диспетчеризация
handlers/ # обработчики блоков (декораторы @block/@pattern/@inline)
latex/ # преамбула, титульный лист
tests/ # pytest
md2gost.sh # обёртка для Docker
Dockerfile
Makefile
Команды
make build # сборка Docker-образа
make run # сборка + конвертация report.md
make format # форматирование кода (black + ruff)
make tidy # статический анализ (ruff + mypy)
make test # pytest