Files
2026-10-09 01:45:17 +00:00

459 lines
17 KiB
Typst
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// ============================================================================
// ПУБЛИЧНЫЙ КАТАЛОГ ПРИЁМОВ ОФОРМЛЕНИЯ SCIENTIA
// Этот файл можно компилировать отдельно и копировать из него готовые блоки.
// Команда: typst compile --root . docs/examples/formatting/main.typ example.pdf
// ============================================================================
#import "/.template/lib/index.typ": document, profiles, load-company, corp-table, formula, info-block, vref, vrefs, eqref, bullet-list, numbered-list, list-level
#let company = load-company("scientia", logo: auto, signature: none, stamp: none)
#show: document.with(
company: company,
profile: profiles.report(
title: "Каталог элементов оформления",
theme: "Рисунки, таблицы, формулы, ссылки и списки",
udk: none,
director_date: "«01» января 2026 г.",
is_research: false,
is_intermediate: false,
stage_number: none,
volume_number: none,
contract_number: none,
contract_date: none,
city: "Екатеринбург",
year: 2026,
executors: (),
appendices: (),
bibliographies: (),
figure_before: 0.75em,
figure_after: 0.75em,
table_before: 0.75em,
table_after: 0.75em,
figure_caption_before: 0pt,
figure_caption_after: 0pt,
table_caption_before: 0pt,
table_caption_after: 0pt,
),
options: (
mode: "final",
watermark: none,
media-policy: "placeholder",
diagnostics: true,
),
)
#heading(numbering: none)[КАК ПОЛЬЗОВАТЬСЯ КАТАЛОГОМ]
Каждый раздел содержит готовый фрагмент и поясняет параметры, которые обычно меняют. Метки вида `<figure-standard>` нужны для автоматической нумерации и ссылок. Имена меток должны быть уникальными в пределах документа.
= ИНФОРМАЦИОННЫЕ ПЛАШКИ
== Замечание
#info-block(title: [ЗАМЕЧАНИЕ])[
Эта цветная плашка подходит для важных пояснений, ограничений расчёта и вопросов, которые нужно согласовать.
]
= РИСУНКИ
== Обычное изображение
Путь задаётся относительно файла, в котором написан вызов `image`. Ширину удобно указывать в процентах от области текста.
#figure(
image("assets/example-diagram.svg", width: 78%),
caption: [Схема последовательности обработки данных],
) <figure-standard>
Обычная ссылка: @figure-standard. Ссылка с согласованным словом: на #vref(<figure-standard>).
== Изображение заданного размера и выравнивания
#align(left)[
#figure(
image("assets/example-diagram.svg", width: 11cm),
caption: [Схема фиксированной ширины, выровненная влево],
) <figure-left>
]
== Несколько панелей под одной подписью
#figure(
grid(
columns: (1fr, 1fr),
column-gutter: 1.2em,
row-gutter: 0.5em,
align(center)[
#rect(width: 5.2cm, height: 2.4cm, fill: rgb("fff3cf"), stroke: rgb("e39f49"))
#linebreak()
а) исходная геометрия
],
align(center)[
#circle(radius: 1.15cm, fill: rgb("fbb20d"), stroke: rgb("444444"))
#linebreak()
б) область анализа
],
),
caption: [Сравнение двух способов представления модели],
) <figure-grid>
Групповая ссылка: на #vrefs((<figure-standard>, <figure-grid>)). Именительный падеж можно вызвать коротко: #vrefs((<figure-standard>, <figure-grid>), "и").
= ТАБЛИЦЫ
Таблицу помещают внутрь `figure`, чтобы получить подпись, номер и label. Для таблиц подпись автоматически располагается сверху.
== Простая таблица
#figure(
corp-table(
columns: 3,
header: ([Параметр], [Обозначение], [Значение]),
body: (
[Сцепление], [$C$], [0,32 МПа],
[Угол трения], [$phi$], [28°],
[Плотность], [$rho$], [2,45 т/м³],
),
),
caption: [Расчётные характеристики массива],
) <table-simple>
Ссылка в тексте: значения приведены в #vref(<table-simple>).
== Списки в ячейках
Параметр `list-layout` меняет отступы всех маркированных и нумерованных списков только в этой таблице. Для узких ячеек обычно подходит `"compact"`; `"flush"` прижимает маркер или номер к левому полю.
#figure(
corp-table(
columns: (1.2fr, 2fr),
list-layout: "compact",
header: ([Вид списка], [Содержимое]),
body: (
[Маркированный], [
- Исходные данные;
- результаты расчёта.
],
[Нумерованный], [
#numbered-list[
+ Подготовить модель.
+ Проверить результат.
]
],
[Локальное исключение], [
#bullet-list(layout: "normal")[
- Обычный отступ можно вернуть для одной ячейки.
]
],
[Без отступа], [
#bullet-list(layout: "flush")[
- Одноуровневый список можно прижать к левому полю.
]
],
),
),
caption: [Компактные списки внутри таблицы],
) <table-lists>
Если готовый режим не подходит, используйте `list-indent` и `list-body-indent` для точной настройки всей таблицы либо `level-indent` и `body-indent` внутри `bullet-list` или `numbered-list` для одной ячейки.
== Обычная встроенная таблица
Красная строка автоматически отключается и в ячейках обычной `table`, и во всех строках её подписи.
#figure(
table(
columns: (1fr, 2fr),
inset: 5pt,
align: left,
[Параметр], [Описание],
[Устойчивость], [Длинное содержимое ячейки переносится на следующую строку без абзацного отступа в начале первой строки.],
),
caption: [Обычная встроенная таблица с достаточно длинной подписью для проверки переноса без красной строки в первой строке],
) <table-native>
== Управление шириной, текстом и выравниванием
#figure(
corp-table(
columns: (1.6fr, 1fr, 2.2cm),
header: ([Расчётный случай], [Описание], [Коэффициент]),
body: (
[Основной], [Нормальные условия эксплуатации], [1,42],
[Обводнённый], [Повышенный уровень подземных вод], [1,31],
[Сейсмический], [Дополнительное динамическое воздействие], [1,18],
),
align: (left, left, center),
table-align: "center",
text-size: 9pt,
leading: 0.62em,
header-inset: (x: 5pt, y: 4pt),
body-inset: (x: 4pt, y: 3pt),
justify: false,
hyphenate: false,
repeat_header: true,
continuation: true,
continuation_text: "Продолжение таблицы",
),
caption: [Настраиваемая таблица расчётных случаев],
) <table-settings>
`1fr` означает долю доступной ширины, `2.2cm` — фиксированную ширину, `auto` — ширину по содержимому.
== Многострочная шапка и объединение ячеек
#figure(
corp-table(
columns: (2.8cm, 1fr, 1fr, 1fr),
header: (
table.cell(rowspan: 2, align: center + horizon)[Скважина],
table.cell(colspan: 3, align: center + horizon)[Координаты, м],
[X], [Y], [Z],
),
body: (
[GT-01], [1035,4], [2210,8], [456,2],
table.cell(rowspan: 2, align: center + horizon)[GT-02], [1038,1], [2215,0], [452,9],
[1040,3], [2217,2], [449,8],
table.cell(colspan: 3, align: left)[Контрольная точка северного борта], [1],
),
align: (left, right, right, right),
),
caption: [Координаты контрольных скважин],
) <table-merged>
`rowspan` объединяет строки, `colspan` — столбцы. Сумма занятых ячеек в каждой строке должна соответствовать числу столбцов.
== Таблица из CSV
#let csv-data = csv("assets/example.csv", delimiter: "\t")
#figure(
corp-table(
columns: (1fr, 1fr),
..csv-data.flatten(),
),
caption: [Данные, загруженные из TSV-файла],
) <table-csv>
Для CSV с запятыми уберите параметр `delimiter`; для табличного файла TSV используйте `"\t"`.
= ФОРМУЛЫ
== Отдельная нумерованная формула
#formula(
$K = (sum F_("уд"))/(sum F_("сдв"))$,
) <equation-safety>
Ссылка через стандартную метку: @equation-safety. Короткая ссылка helper-функцией: #eqref(<equation-safety>). Ссылка с падежом: согласно #vref(<equation-safety>, "д").
== Формула внутри строки
Короткое выражение $K >= 1.3$ пишется между одиночными знаками `$` и не получает отдельного номера.
== Несколько строк и пояснение символов
#formula(
$cases(
sigma_1 = (sigma_x + sigma_y)/2 + sqrt(((sigma_x - sigma_y)/2)^2 + tau_(x y)^2),
sigma_3 = (sigma_x + sigma_y)/2 - sqrt(((sigma_x - sigma_y)/2)^2 + tau_(x y)^2),
)$,
) <equation-principal>
где $sigma_1$ и $sigma_3$ — главные напряжения; $sigma_x$, $sigma_y$ и $tau_(x y)$ — компоненты тензора напряжений.
#pagebreak()
= СПИСКИ И ТЕКСТ
Маркированный список:
- первый пункт;
- второй пункт;
- вложенное пояснение;
- заключительный пункт.
Локально изменить его отступы можно через `bullet-list`:
#bullet-list(layout: "compact")[
- компактный первый пункт;
- компактный второй пункт.
]
Нумерованный список:
#numbered-list[
+ Подготовить исходные данные.
+ Выполнить расчёт.
+ Проверить результат.
]
== Быстрая многоуровневая схема ГОСТ
Без параметров используется наиболее частая схема: `1.` → `а)` → `1)`.
#numbered-list[
+ Первый уровень.
+ Второй уровень.
+ Третий уровень.
+ Следующий пункт первого уровня.
]
== Полная десятичная нумерация
Схема `decimal` сохраняет номера всех родительских уровней.
#numbered-list(scheme: "decimal")[
+ Раздел списка.
+ Подраздел списка.
+ Вложенный пункт.
+ Следующий раздел списка.
]
== Локальная и полная смешанная нумерация
#grid(
columns: (1fr, 1fr),
gutter: 1cm,
[
*Локальная:*
#numbered-list(scheme: "local-mixed")[
+ Уровень 1.
+ Уровень 2.
+ Уровень 3.
]
],
[
*С сохранением родителей:*
#numbered-list(scheme: "full-mixed")[
+ Уровень 1.
+ Уровень 2.
+ Уровень 3.
]
],
)
== Доступные типы счётчиков
#block(breakable: false)[
#grid(
columns: (1fr, 1fr, 1fr),
gutter: 0.5cm,
[*Римские I* #numbered-list(levels: ("I",), suffixes: ".")[
+ Первый.
+ Второй.
+ Третий.
]],
[*Римские i* #numbered-list(levels: ("i",), suffixes: ".")[
+ Первый.
+ Второй.
+ Третий.
]],
[*Латинские A* #numbered-list(levels: ("A",), suffixes: ".")[
+ Первый.
+ Второй.
+ Третий.
]],
[*Латинские a* #numbered-list(levels: ("a",), suffixes: ".")[
+ Первый.
+ Второй.
+ Третий.
]],
[*С ведущим нулём* #numbered-list(levels: ("01",), suffixes: ".")[
+ Первый.
+ Второй.
+ Третий.
]],
[*Кириллица А* #numbered-list(levels: ("А",), suffixes: ".")[
+ Первый.
+ Второй.
+ Третий.
]],
[*Кириллица а* #numbered-list(levels: ("а",), suffixes: ".")[
+ Первый.
+ Второй.
+ Третий.
]],
)
]
== Произвольные разделители
В этом примере границы уровней различаются: первый разделитель — точка, второй — закрывающая скобка.
#numbered-list(
levels: ("1", "а", "A"),
full: true,
separators: (".", ")"),
suffixes: (".", ")", "."),
)[
+ Первый уровень.
+ Второй уровень: номер имеет вид `1.а)`.
+ Третий уровень получает номер `1.а)A.`
]
Схема `legal` даёт последовательность `A)` → `A)1.`:
#numbered-list(scheme: "legal")[
+ Латинский уровень.
+ Цифровой уровень.
]
`list-level` позволяет отдельно задать prefix, suffix и ширину числа:
#numbered-list(
levels: (list-level("1", prefix: [§ ], suffix: ":", width: 3),),
)[
+ Пользовательский уровень отображается как § 001:
+ Следующий уровень отображается как § 002:
]
== Маркеры вместо чисел
#numbered-list(scheme: "bullets")[
+ Маркер •.
+ Маркер ∙.
+ Маркер ‣.
+ Маркер ⁃.
+ Маркер ◦.
]
== Геометрия и интервалы
Параметры ниже меняют общий отступ списка, шаг вложенности, расстояние от номера до текста, межстрочный интервал внутри пункта и интервал между пунктами.
#numbered-list(
scheme: "decimal",
outer-indent: 0.7cm,
level-indent: 0.8cm,
body-indent: 0.8em,
line-leading: 0.45em,
item-spacing: 1.1em,
)[
+ Длинный первый пункт показывает уменьшенный интервал между строками внутри одного элемента списка и устойчивый висячий отступ при переносе текста на следующую строку.
+ Второй пункт отделён от первого увеличенным межэлементным интервалом.
+ Вложенный пункт использует увеличенный шаг уровня.
]
== Продолжение с нужного номера
Первый номер можно задать стандартным синтаксисом Typst; следующие элементы продолжат счёт автоматически. Формат `01` сохраняется.
#numbered-list(levels: ("01",), suffixes: ".")[
8. Восьмой пункт отображается как 08.
+ Следующий пункт отображается как 09.
]
Доступны *полужирное начертание*, _курсив_, `моноширинный текст` и #link("https://typst.app/docs/")[внешние ссылки].
= РАЗРЫВЫ И ПОДКЛЮЧЕНИЕ ГЛАВ
`#pagebreak()` начинает новую страницу. Большие документы делят на главы и подключают из `main.typ`:
```typst
#include "chapters/10-methods.typ"
#pagebreak()
#include "chapters/20-results.typ"
```
Само наличие файла в `chapters/` не добавляет его в документ: порядок определяют строки `#include`.