# Промт: файл стиля оформления для «Оформителя» по методичке

Скопируй этот промт целиком в диалог с ИИ (ChatGPT, Claude, GigaChat…), следом
приложи методичку кафедры (текст, PDF или скан с требованиями к оформлению) и
попроси собрать стиль. ИИ выдаст файл `.yml`, который открывается в «Оформителе»:
**кабинет → «Открыть файл стиля… (.yml)»** или в редакторе **меню «Стиль» →
«Открыть стиль с компьютера…»**.

---

Ты составляешь **файл стиля оформления** для сервиса «Оформитель» (ГОСТ 7.32) на
основе методички, которую пришлёт пользователь. Файл — это YAML, который
задаёт только ВНЕШНИЙ ВИД документа (шрифты, отступы, выравнивание, интервалы,
поля страницы) и правила проверки. Содержание документа тебя не касается.

## Что сервис делает сам (не настраивается стилем)

Нумерацию разделов, подписи «Таблица 1 — …» / «Рисунок 1 — …», номера формул,
маркеры списков, знаки препинания в перечислениях, типографику
(кавычки-«ёлочки», тире, неразрывные пробелы) сервис расставляет сам. Стиль
лишь описывает, КАК это выглядит.

## Главное правило: наследуй от базового стиля, меняй только нужное

Есть два базовых стиля: `gost_7.32` (ГОСТ 7.32-2017, отчёты о НИР, дипломы) и
`gost_2.105` (ЕСКД ГОСТ Р 2.105-2019 — рамка основной надписи по умолчанию,
заголовки обычным регистром, разрядка слова «Таблица», группировка примечаний
«Примечания»/примеров «Примеры»). Возьми базой тот, что ближе к методичке
(обычно `gost_7.32`). Твой файл **наследуется от базы** (`base: gost_7.32` или
`base: gost_2.105`) и содержит **только те поля, которые методичка требует
изменить**. Не переписывай базу целиком, не повторяй значения, которые и так верны.

## Что базовый стиль `gost_7.32` уже задаёт

Переопределяй ТОЛЬКО то, что методичка меняет относительно этого списка:

**Документ:** шрифт Times New Roman 14 пт, чёрный (`#000000`). Типографика
включена: неразрывные пробелы перед единицами и в инициалах, десятичная
запятая (0,75), нормализация тире, кавычки-«ёлочки», перенос слов.

**Основной текст (`body`):** по ширине, красная строка 1,25 см, интервал 1,5.

**Заголовки:** структурные (`heading.0` — Введение, Заключение и т.п.) —
ПРОПИСНЫМИ, по центру, полужирные, с новой страницы, интервал 1,5. Заголовки
разделов/подразделов (`heading.1`, `heading.2`, `heading.3`) — с абзацного
отступа 1,25 см, полужирные, нумеруемые, без точки; раздел — с новой страницы.

**Подписи:** таблиц (`caption.table`) — слева над таблицей, интервал 1,0;
рисунков (`caption.figure`) — по центру под рисунком, интервал 1,0; листингов
(`caption.listing`) — слева. Подпись продолжения таблицы (`caption.table_cont`)
— курсив.

**Перечисления (`list.dash` и др.):** маркеры «–», «а)», «1)» по уровням,
интервал 1,5 — задаёт база; менять маркеры обычно не нужно.

**Таблицы (`table.data`, `table.header`):** шрифт 12 пт, интервал 1,0; шапка —
полужирная по центру.

**Прочие подтипы базы:** `formula_line`/`formula_def` (формулы), `term`/`abbrev`
(термины и сокращения), `abstract_stats`/`keywords` (реферат), `note`, `example`
(примеры), `quote`, `bib_entry` (источники), `toc.entry` (оглавление, отступ
уровня N = 0 + 1,25 см × (N−1)), `list.roman` (перечисление 4-го уровня — римские
маркеры). Заголовок приложения — ДВА раздельных стиля: `appendix_heading` (абзац
шапки: центр, с новой страницы) и `appendix_title` (оформление НАЗВАНИЯ
приложения); строка «Приложение А» берёт оформление у `heading.0`.

**Поля страницы (`sections.default_page.margins`):** левое 30 мм, правое 15 мм,
верхнее 20 мм, нижнее 20 мм. A4, книжная. Номер страницы — внизу по центру, на
титуле не показывается. Рамки ГОСТ 2.104 (основной надписи) нет —
`sections.default_page.frame.kind: none`.

**Правила проверки (`constraints`, `validation`):** реферат — ключевых слов
5–15, без таблиц/рисунков/формул/кода, до ~2400 знаков; введение/заключение —
без таблиц/рисунков, лимиты по знакам; список источников — минимум 15
источников; приложения — своя нумерация «А.1». Правила валидатора
(`ref_unresolved`, `caption_missing`, `manual_numbering`, `table_name_missing`
и др.) включены.

## Формат файла — какие поля бывают

Корень — `style:`. Внутри:

```
style:
  name: "короткое_имя_латиницей"   # обязательно
  base: gost_7.32                  # обязательно — наследование
  description: "Стиль по методичке кафедры X"

  defaults:
    font: {family: "Times New Roman", size: 14, color: "#000000"}
    typography: {decimal_comma: true, quotes: ru, hyphenation: true}

  subtypes:
    ИМЯ_ПОДТИПА: {АТРИБУТЫ}

  counters:      { ... }   # семейства подписей — обычно не трогают
  lists:         { ... }   # маркеры перечислений — обычно не трогают
  sections:      { ... }   # поля/ориентация страницы
  constraints:   { ... }   # лимиты и требования разделов
  validation:    { ... }   # переключатели правил валидатора (true/false)
  notes:         { ... }   # группировка примечаний (опционально, см. ниже)
  examples:      { ... }   # группировка примеров (опционально)
  terms:         { ... }   # оформление статей терминов (опционально, см. ниже)
  abbreviations: { ... }   # оформление статей сокращений (опционально)
  toc:           { ... }   # реферат/само содержание в оглавлении (опционально)
  math:          { ... }   # шрифт формул: cambria / document (опционально)
```

**Группировка примечаний/примеров (`notes`, `examples`)** — опциональные секции.
По умолчанию (нет секции) каждое примечание идёт плоско: «Примечание – …».
Если методичка требует блок «Примечания» с нумерацией — включи группировку:

```
notes:
  word_single: "Примечание"
  word_plural: "Примечания"   # заголовок над группой из 2+ примечаний
  sep: " — "                  # разделитель одиночного: «Примечание — текст»
  letter_spacing: 2pt         # разрядка слова-заголовка (0/нет — без разрядки)
  grouped: true               # включает заголовок «Примечания» + нумерацию «1 …»
```

`examples` — тот же формат для блоков `:::example` (слова «Пример»/«Примеры»).

**Содержание (`toc`)** — включать ли «Реферат» и само «Содержание» в оглавление.
По ГОСТ обычно оба выключены:

```
toc:
  include_abstract: false   # «Реферат» в содержании
  include_self: false       # строка «Содержание» в самом содержании
```

**Шрифт формул (`math`)** — Cambria Math (как в Word по ГОСТ) или гарнитура
документа (так LibreOffice рисует формулы в PDF). Кегль — из строки формулы:

```
math:
  engine: cambria     # или document
```

**Оформление статей терминов/сокращений (`terms`, `abbreviations`)** —
опциональные секции, по одному полю в каждой:

```
terms:
  strip_end_punctuation: false   # по умолчанию true (ГОСТ 6.14): снимать
                                  # хвостовые ;/,/. у статьи термина
abbreviations:
  strip_end_punctuation: false   # то же самое, отдельно для раздела сокращений
```

По умолчанию (нет секции или поле не задано) сервис снимает хвостовую
пунктуацию у статей — это поведение ГОСТ 6.14 «без знаков препинания в
конце». `false` — оставить пунктуацию, как набрал автор.

**Рамка ГОСТ 2.104 (`sections.<страница>.frame`)** — опционально; включи,
если методичка требует основную надпись (форма 2/2а):

```
sections:
  default_page:
    frame:
      kind: gost_form          # none (по умолчанию) — без рамки
      variant: side             # plain (по умолчанию) — без боковых граф 19–25; side — с ними
      font: "Times New Roman"   # шрифт ВСЕХ граф штампа; ДОЛЖЕН БЫТЬ УСТАНОВЛЕН НА СЕРВЕРЕ —
                                 # иначе замечание валидатора FONT_UNAVAILABLE и подмена на Times New Roman
      sizes:
        captions: 10             # кегли граф (пункты, число); не задан — как нарисовано в шаблоне
        people: 9
        organization: 12
        title: 16
        designation: 14           # обозначение, первый лист (форма 2)
        designation_small: 11     # обозначение, последующие листы (форма 2а)
        sheet: 9                  # литера/лист/листов, первый лист
        sheet_number_small: 14    # номер листа, последующие листы
```

Сами значения граф (Разраб./Пров./Обозначение и т.п.) сюда НЕ пишутся — их
задаёт либо служебная таблица `::: frame` в документе (приоритет), либо
`frame.fields` стиля со значениями по умолчанию (те же ключи, что у `::: frame`
— см. базовый промт диалекта, раздел «Рамка (основная надпись)»).

**Разрядка слова подписи** — `counters.table.word_letter_spacing: 2pt` разносит
буквы в слове «Таблица» (аналогично для `figure`/`listing`). `0` — без разрядки.

**Атрибуты подтипа (`subtypes`)** — все необязательны, бери только нужные:

- Абзац: `align: left|right|center|justify`, `first_line` (красная строка),
  `indent_left`, `indent_right`, `hanging`, `space_before`, `space_after`,
  `line_spacing`, `blank_before`, `blank_after`, `page_break_before: true|false`, `keep_with_next: true|false`.
- Символ: `font`, `size` (пункты, число), `bold`, `italic`,
  `underline: none|single|double`, `caps: true` (ПРОПИСНЫЕ), `color`,
  `letter_spacing`.
- `inherit: "другой_подтип"` — наследовать от другого подтипа (см. правило ниже).
- `blank_before` / `blank_after`: N пустых абзацев (0..5) до/после блока, в стиле
  блока; сумма с pt-отступами. Свободная строка у формулы: `formula_line: {blank_before: 1, blank_after: 1}`.
  Крепится к подтипу: рисунок → `blank_after` на `caption.figure` (подпись снизу);
  таблица → `blank_before` на `caption.table` (подпись сверху) и `blank_after` на `table.data`.

**Единицы:** длина — `1.25cm` / `18pt` / `30mm`; размер шрифта — число пунктов
(`14`, `12`); интервал — число (`1.5`, `1.0`); цвет — `#000000`.

**Поля страницы:** `sections: {default_page: {margins: {l: 30mm, r: 15mm, t: 20mm, b: 20mm}}}`.

**Ограничения:** напр. `constraints: {bibliography: {min_sources: 20}}` или
`constraints: {abstract: {keywords_count: {min: 5, max: 10}}}`. Для
`keywords_count` указывай ОБА поля (`min` и `max`) — оно заменяется целиком, не
дополняется, поэтому пропущенное поле сбросит базовое значение.

## Как переопределять — правила

1. **Меняешь существующий подтип базы** (`body`, `heading.1`, `caption.table`
   и т.п.) — пиши ТОЛЬКО изменённые поля, БЕЗ `inherit`. Остальные атрибуты
   доедут из базы сами. Пример: методичка требует интервал 1,5 в подписях →
   ```
   subtypes:
     caption.table:  {line_spacing: 1.5}
     caption.figure: {line_spacing: 1.5}
   ```
2. **`inherit` на самого себя НЕЛЬЗЯ** — `body: {inherit: "body"}` это ошибка
   (цикл). `inherit` нужен только для СВОЕГО НОВОГО подтипа, который наследует
   существующий: `my_note: {inherit: "note", italic: true}`.
3. **Только известные поля.** Неизвестное поле внутри `{}` сломает импорт.
   Свои НАЗВАНИЯ подтипов придумывать можно, чужие ПОЛЯ — нет.
4. **Не повторяй базу.** Если методичка не меняет параметр — не пиши его.

### Примеры типовых переопределений

```
# Шрифт 13 пт вместо 14
defaults: {font: {size: 13}}

# Красная строка 1 см вместо 1,25 см в основном тексте
subtypes: {body: {first_line: 1cm}}

# Поля: левое 25, правое 10, верх/низ 20 мм
sections: {default_page: {margins: {l: 25mm, r: 10mm, t: 20mm, b: 20mm}}}

# Минимум 20 источников
constraints: {bibliography: {min_sources: 20}}

# Отключить предупреждение «таблица без названия»
validation: {table_name_missing: false}
```

## Формат ответа (строго!)

1. Выдай ТОЛЬКО файл стиля — без вступлений, пояснений и «вот ваш стиль».
2. Весь файл — ОДНИМ блоком кода, обёрнутым тройными обратными кавычками с
   пометкой `yaml`.
3. Корень — `style:`, обязательно `name`, `base: gost_7.32`, `description`.
4. Внутри — только переопределения из методички. Если методичка почти ничего
   не меняет — файл будет коротким, это нормально.
5. Ничего после закрывающих кавычек не добавляй.

Пример каркаса ответа:

```yaml
style:
  name: kafedra_x
  base: gost_7.32
  description: "Стиль по методичке кафедры X"
  defaults:
    font: {size: 13}
  subtypes:
    body: {first_line: 1cm}
  constraints:
    bibliography: {min_sources: 20}
```

Если методичку не удаётся прочитать или в ней нет требований к оформлению —
скажи об этом и попроси прислать раздел с требованиями (шрифт, кегль,
интервалы, поля, число источников).
