// ============================================================================ // ПУБЛИЧНЫЙ КАТАЛОГ ПРИЁМОВ ОФОРМЛЕНИЯ SCIENTIA // Этот файл можно компилировать отдельно и копировать из него готовые блоки. // Команда: typst compile --root . docs/examples/formatting/main.typ example.pdf // ============================================================================ #import "/.template/lib/index.typ": document, profiles, load-company, corp-table, formula, vref, vrefs, eqref, 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: (), attachments: (), 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)[КАК ПОЛЬЗОВАТЬСЯ КАТАЛОГОМ] Каждый раздел содержит готовый фрагмент и поясняет параметры, которые обычно меняют. Метки вида `` нужны для автоматической нумерации и ссылок. Имена меток должны быть уникальными в пределах документа. = РИСУНКИ == Обычное изображение Путь задаётся относительно файла, в котором написан вызов `image`. Ширину удобно указывать в процентах от области текста. #figure( image("assets/example-diagram.svg", width: 78%), caption: [Схема последовательности обработки данных], ) Обычная ссылка: @figure-standard. Ссылка с согласованным словом: на #vref(). == Изображение заданного размера и выравнивания #align(left)[ #figure( image("assets/example-diagram.svg", width: 11cm), caption: [Схема фиксированной ширины, выровненная влево], ) ] == Несколько панелей под одной подписью #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: [Сравнение двух способов представления модели], ) Групповая ссылка: на #vrefs((, )). Именительный падеж можно вызвать коротко: #vrefs((, ), "и"). = ТАБЛИЦЫ Таблицу помещают внутрь `figure`, чтобы получить подпись, номер и label. Для таблиц подпись автоматически располагается сверху. == Простая таблица #figure( corp-table( columns: 3, header: ([Параметр], [Обозначение], [Значение]), body: ( [Сцепление], [$C$], [0,32 МПа], [Угол трения], [$phi$], [28°], [Плотность], [$rho$], [2,45 т/м³], ), ), caption: [Расчётные характеристики массива], ) Ссылка в тексте: значения приведены в #vref(). == Обычная встроенная таблица Красная строка автоматически отключается и в ячейках обычной `table`, и во всех строках её подписи. #figure( table( columns: (1fr, 2fr), inset: 5pt, align: left, [Параметр], [Описание], [Устойчивость], [Длинное содержимое ячейки переносится на следующую строку без абзацного отступа в начале первой строки.], ), caption: [Обычная встроенная таблица с достаточно длинной подписью для проверки переноса без красной строки в первой строке], ) == Управление шириной, текстом и выравниванием #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: [Настраиваемая таблица расчётных случаев], ) `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: [Координаты контрольных скважин], ) `rowspan` объединяет строки, `colspan` — столбцы. Сумма занятых ячеек в каждой строке должна соответствовать числу столбцов. == Таблица из CSV #let csv-data = csv("assets/example.csv", delimiter: "\t") #figure( corp-table( columns: (1fr, 1fr), ..csv-data.flatten(), ), caption: [Данные, загруженные из TSV-файла], ) Для CSV с запятыми уберите параметр `delimiter`; для табличного файла TSV используйте `"\t"`. = ФОРМУЛЫ == Отдельная нумерованная формула #formula( $K = (sum F_("уд"))/(sum F_("сдв"))$, ) Ссылка через стандартную метку: @equation-safety. Короткая ссылка helper-функцией: #eqref(). Ссылка с падежом: согласно #vref(, "д"). == Формула внутри строки Короткое выражение $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), )$, ) где $sigma_1$ и $sigma_3$ — главные напряжения; $sigma_x$, $sigma_y$ и $tau_(x y)$ — компоненты тензора напряжений. #pagebreak() = СПИСКИ И ТЕКСТ Маркированный список: - первый пункт; - второй пункт; - вложенное пояснение; - заключительный пункт. Нумерованный список: #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`.