459 lines
17 KiB
Typst
459 lines
17 KiB
Typst
// ============================================================================
|
||
// ПУБЛИЧНЫЙ КАТАЛОГ ПРИЁМОВ ОФОРМЛЕНИЯ 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`.
|