From 6db653f961cde8ac487d307ba3aedf3d797426f1 Mon Sep 17 00:00:00 2001 From: StepanovPlaton Date: Sun, 11 Oct 2026 23:34:14 +0400 Subject: [PATCH] Fix title-docx --- AGENTS.md | 24 ++++++- README.md | 7 ++ content/example/PLAN.md | 91 +++++++++++++++++++++++++ content/example/assets/title-page.docx | Bin 31256 -> 24355 bytes 4 files changed, 121 insertions(+), 1 deletion(-) create mode 100644 content/example/PLAN.md diff --git a/AGENTS.md b/AGENTS.md index dba63bd..4db8732 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -24,6 +24,9 @@ - **Создание — только через `--init`.** Новый проект создавайте командами с флагом `--init` (см. ниже): они формируют правильную структуру и общий каталог ресурсов. +- **Сначала план — потом работа.** Прежде чем наполнять проект, составьте план и + сохраните его в `content/<проект>/PLAN.md` (см. раздел «Планирование проекта»). + Работу над содержимым начинайте только после согласования плана с пользователем. - **Имя результата = имя проекта.** Документ и презентация собираются в папку проекта, а имя файла совпадает с именем проекта: `content/<проект>/<проект>.docx` и `content/<проект>/<проект>.pptx`. @@ -43,7 +46,8 @@ ssau-generator/ │ └── example/ │ ├── assets/ # общие ресурсы проекта (для docx и pptx) │ ├── docx/ # config.yaml + *.md -│ └── pptx/ # config.yaml + slides/ +│ ├── pptx/ # config.yaml + slides/ +│ └── PLAN.md # согласованный план проекта ├── AGENTS.md # этот файл └── README.md ``` @@ -59,6 +63,24 @@ ssau-generator/ - Папки `content/*` добавлены в `.gitignore`; в репозитории хранится только `content/example/`. Рабочие проекты пользователя коммитить не нужно. +## Планирование проекта + +Перед наполнением проекта составьте план и сохраните его в +`content/<проект>/PLAN.md`. План создаётся **до** работы над `config.yaml` и +Markdown и согласуется с пользователем. В плане укажите: + +- **реквизиты** — студент (ФИО), группа, дисциплина; +- **тему** работы и её цель; +- **структуру** — разделы и подразделы с названиями и пунктами (для документа — + по `sections`, для презентации — список слайдов); +- **краткое содержание** каждого раздела/слайда; +- **список источников** — если согласован с пользователем; +- **нюансы** — особые требования пользователя (объём, оформление, сроки, + ограничения и т.п.), если они указаны; +- прочие согласованные детали. + +Пример готового плана — `content/example/PLAN.md`. + ## Создание нового проекта Проект создаётся командами с флагом `--init` — они формируют структуру и общие diff --git a/README.md b/README.md index 740b380..e051840 100644 --- a/README.md +++ b/README.md @@ -100,6 +100,8 @@ node docx/src/cli.js --content content/<проект>/docx --init node pptx/src/cli.js -c content/<проект>/pptx/config.yaml --init ``` +`--init` создаёт в общем каталоге ресурсов `content/<проект>/assets/` титульный лист `title-page.docx` (образец), который затем используется при сборке. + ### Сборка ```powershell @@ -114,6 +116,11 @@ node pptx/src/cli.js -c content/<проект>/pptx/config.yaml Результат собирается в папку проекта и называется по имени проекта: `content/<проект>/<проект>.docx` и `content/<проект>/<проект>.pptx`. +### 📄 Титульный лист и оглавление + +- **Титульный лист** берётся из файла `document.titlePage` (по умолчанию `content/<проект>/assets/title-page.docx`) и **приклеивается в начало** сгенерированного документа. Образец, созданный при `--init`, содержит условные данные: **отредактируйте его вручную** под свой проект (ФИО, группа, тема, преподаватель и т. п.) — при повторной сборке используется именно этот файл. +- **Оглавление** вставляется как поле Word и при генерации остаётся пустым. После сборки откройте документ в Word и **нажмите «Обновить поле» / «Обновить оглавление»** — оно заполнится автоматически на основе фактических заголовков. Либо включите `document.features.updateFields: true`, и Word обновит поле при открытии. + --- ## 📚 Документация diff --git a/content/example/PLAN.md b/content/example/PLAN.md new file mode 100644 index 0000000..68a075e --- /dev/null +++ b/content/example/PLAN.md @@ -0,0 +1,91 @@ +# План проекта `example` + +Демонстрационный проект: показывает возможности генераторов DOCX и PPTX на одном +наборе общих ресурсов. План согласован с пользователем до начала наполнения +проекта. + +## Реквизиты + +| Поле | Значение | +|------|----------| +| Студент | Иванов Иван Иванович | +| Группа | 6201-090301D | +| Дисциплина | Технологии подготовки отчётных документов | + +## Тема и цель + +**Тема:** демонстрация возможностей генератора отчётных документов SSAU Generator. + +**Цель:** показать полный набор поддерживаемых элементов оформления в одном +документе и одной презентации, собранных из Markdown-исходников. + +## Структура документа (DOCX) + +Файл: `content/example/example.docx`, исходники — `content/example/docx/`. + +| № | Раздел | Тип (`sections`) | Файл | +|---|--------|------------------|------| +| — | Оглавление | `toc` | — | +| — | Введение | `structural` | `01-introduction.md` | +| 1 | Возможности генератора | `numbered` | `02-features.md` | +| 2 | Примеры таблиц | `numbered` | `03-tables.md` | +| — | Заключение | `structural` | `04-conclusion.md` | +| — | Список использованных источников | `bibliography` | `05-bibliography.md` | +| — | Приложение А. Демонстрационные материалы | `appendix` | `06-appendix-a.md` | + +### Краткое содержание + +- **Введение** — назначение документа, перечень частей и групп возможностей. +- **1 Возможности генератора** — заголовки и абзацы; списки, в том числе + многоуровневые; таблицы обычные и с подписью; рисунки (готовые PNG и схемы + PlantUML); формулы с пояснениями; примечания и определения; перекрёстные ссылки. +- **2 Примеры таблиц** — варианты оформления таблиц и подписей. +- **Заключение** — итоги демонстрации, перечень проверенных возможностей. +- **Список источников** — стандарты оформления и учебное пособие. +- **Приложение А** — сводные демонстрационные материалы, буквенная нумерация + объектов. + +## Структура презентации (PPTX) + +Файл: `content/example/example.pptx`, исходники — `content/example/pptx/slides/`. + +| № | Слайд | Тип | Файл | +|---|-------|-----|------| +| 1 | Титульный | `title` | `00-title.md` | +| 2 | Текст и форматирование | `content` | `01-text.md` | +| 3 | Списки | `content` | `02-lists.md` | +| 4 | Таблица | `content` | `03-table.md` | +| 5 | Изображение | `content` | `04-image.md` | +| 6 | Схема PlantUML | `content` | `05-puml.md` | +| 7 | Метрики | `content` | `06-metrics.md` | +| 8 | Схема-цепочка | `content` | `07-flow.md` | +| 9 | Диаграмма | `content` | `08-chart.md` | +| 10 | Две колонки | `content` | `09-columns.md` | +| 11 | Заметки докладчика | `content` | `10-notes.md` | +| 12 | Разделитель | `section` | `11-section.md` | +| 13 | Завершающий | `final` | `12-final.md` | + +### Краткое содержание + +Презентация повторяет состав документа: титул, основные блоки разметки (текст, +списки, таблица, рисунок, PlantUML, метрики, схема-цепочка, диаграмма, +двухколоночная вёрстка, заметки докладчика), разделитель и финальный слайд. + +## Источники (согласованы) + +1. ГОСТ 7.32-2017. Отчёт о научно-исследовательской работе. Структура и правила + оформления. +2. ГОСТ Р 7.0.5-2008. Библиографическая ссылка. Общие требования и правила + составления. +3. Иванов, И. И. Оформление отчётных документов : учебное пособие. — Самара : + Изд-во Самарского университета, 2019. +4. ГОСТ 8.417-2002. Государственная система обеспечения единства измерений. + Единицы величин. + +## Нюансы + +- Общие ресурсы (титульный лист, задники, изображения, `.puml`) лежат в + `content/example/assets/` и используются обоими генераторами. +- Оформление — по СТО 02068410-004-2018; полужирный и курсив в документе + отключены. +- После правок исходников пересобирать `docx` и `pptx`. diff --git a/content/example/assets/title-page.docx b/content/example/assets/title-page.docx index d37a67555968970710a336351fc8bb82c120b718..f69c40a8e1b502a5e03eb9d7c6f4841366e83f5b 100644 GIT binary patch delta 7902 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 k+i&~do?<$iuuxFQdcULp2S$kZg8%>k delta 15021 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