main.typ 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406
  1. // ============================================================================
  2. // ПУБЛИЧНЫЙ КАТАЛОГ ПРИЁМОВ ОФОРМЛЕНИЯ SCIENTIA
  3. // Этот файл можно компилировать отдельно и копировать из него готовые блоки.
  4. // Команда: typst compile --root . docs/examples/formatting/main.typ example.pdf
  5. // ============================================================================
  6. #import "/.template/lib/index.typ": document, profiles, load-company, corp-table, formula, vref, vrefs, eqref, numbered-list, list-level
  7. #let company = load-company("scientia", logo: auto, signature: none, stamp: none)
  8. #show: document.with(
  9. company: company,
  10. profile: profiles.report(
  11. title: "Каталог элементов оформления",
  12. theme: "Рисунки, таблицы, формулы, ссылки и списки",
  13. udk: none,
  14. director_date: "«01» января 2026 г.",
  15. is_research: false,
  16. is_intermediate: false,
  17. stage_number: none,
  18. volume_number: none,
  19. contract_number: none,
  20. contract_date: none,
  21. city: "Екатеринбург",
  22. year: 2026,
  23. executors: (),
  24. attachments: (),
  25. bibliographies: (),
  26. figure_before: 0.75em,
  27. figure_after: 0.75em,
  28. table_before: 0.75em,
  29. table_after: 0.75em,
  30. figure_caption_before: 0pt,
  31. figure_caption_after: 0pt,
  32. table_caption_before: 0pt,
  33. table_caption_after: 0pt,
  34. ),
  35. options: (
  36. mode: "final",
  37. watermark: none,
  38. media-policy: "placeholder",
  39. diagnostics: true,
  40. ),
  41. )
  42. #heading(numbering: none)[КАК ПОЛЬЗОВАТЬСЯ КАТАЛОГОМ]
  43. Каждый раздел содержит готовый фрагмент и поясняет параметры, которые обычно меняют. Метки вида `<figure-standard>` нужны для автоматической нумерации и ссылок. Имена меток должны быть уникальными в пределах документа.
  44. = РИСУНКИ
  45. == Обычное изображение
  46. Путь задаётся относительно файла, в котором написан вызов `image`. Ширину удобно указывать в процентах от области текста.
  47. #figure(
  48. image("assets/example-diagram.svg", width: 78%),
  49. caption: [Схема последовательности обработки данных],
  50. ) <figure-standard>
  51. Обычная ссылка: @figure-standard. Ссылка с согласованным словом: на #vref(<figure-standard>).
  52. == Изображение заданного размера и выравнивания
  53. #align(left)[
  54. #figure(
  55. image("assets/example-diagram.svg", width: 11cm),
  56. caption: [Схема фиксированной ширины, выровненная влево],
  57. ) <figure-left>
  58. ]
  59. == Несколько панелей под одной подписью
  60. #figure(
  61. grid(
  62. columns: (1fr, 1fr),
  63. column-gutter: 1.2em,
  64. row-gutter: 0.5em,
  65. align(center)[
  66. #rect(width: 5.2cm, height: 2.4cm, fill: rgb("fff3cf"), stroke: rgb("e39f49"))
  67. #linebreak()
  68. а) исходная геометрия
  69. ],
  70. align(center)[
  71. #circle(radius: 1.15cm, fill: rgb("fbb20d"), stroke: rgb("444444"))
  72. #linebreak()
  73. б) область анализа
  74. ],
  75. ),
  76. caption: [Сравнение двух способов представления модели],
  77. ) <figure-grid>
  78. Групповая ссылка: на #vrefs((<figure-standard>, <figure-grid>)). Именительный падеж можно вызвать коротко: #vrefs((<figure-standard>, <figure-grid>), "и").
  79. = ТАБЛИЦЫ
  80. Таблицу помещают внутрь `figure`, чтобы получить подпись, номер и label. Для таблиц подпись автоматически располагается сверху.
  81. == Простая таблица
  82. #figure(
  83. corp-table(
  84. columns: 3,
  85. header: ([Параметр], [Обозначение], [Значение]),
  86. body: (
  87. [Сцепление], [$C$], [0,32 МПа],
  88. [Угол трения], [$phi$], [28°],
  89. [Плотность], [$rho$], [2,45 т/м³],
  90. ),
  91. ),
  92. caption: [Расчётные характеристики массива],
  93. ) <table-simple>
  94. Ссылка в тексте: значения приведены в #vref(<table-simple>).
  95. == Обычная встроенная таблица
  96. Красная строка автоматически отключается и в ячейках обычной `table`, и во всех строках её подписи.
  97. #figure(
  98. table(
  99. columns: (1fr, 2fr),
  100. inset: 5pt,
  101. align: left,
  102. [Параметр], [Описание],
  103. [Устойчивость], [Длинное содержимое ячейки переносится на следующую строку без абзацного отступа в начале первой строки.],
  104. ),
  105. caption: [Обычная встроенная таблица с достаточно длинной подписью для проверки переноса без красной строки в первой строке],
  106. ) <table-native>
  107. == Управление шириной, текстом и выравниванием
  108. #figure(
  109. corp-table(
  110. columns: (1.6fr, 1fr, 2.2cm),
  111. header: ([Расчётный случай], [Описание], [Коэффициент]),
  112. body: (
  113. [Основной], [Нормальные условия эксплуатации], [1,42],
  114. [Обводнённый], [Повышенный уровень подземных вод], [1,31],
  115. [Сейсмический], [Дополнительное динамическое воздействие], [1,18],
  116. ),
  117. align: (left, left, center),
  118. table-align: "center",
  119. text-size: 9pt,
  120. leading: 0.62em,
  121. header-inset: (x: 5pt, y: 4pt),
  122. body-inset: (x: 4pt, y: 3pt),
  123. justify: false,
  124. hyphenate: false,
  125. repeat_header: true,
  126. continuation: true,
  127. continuation_text: "Продолжение таблицы",
  128. ),
  129. caption: [Настраиваемая таблица расчётных случаев],
  130. ) <table-settings>
  131. `1fr` означает долю доступной ширины, `2.2cm` — фиксированную ширину, `auto` — ширину по содержимому.
  132. == Многострочная шапка и объединение ячеек
  133. #figure(
  134. corp-table(
  135. columns: (2.8cm, 1fr, 1fr, 1fr),
  136. header: (
  137. table.cell(rowspan: 2, align: center + horizon)[Скважина],
  138. table.cell(colspan: 3, align: center + horizon)[Координаты, м],
  139. [X], [Y], [Z],
  140. ),
  141. body: (
  142. [GT-01], [1035,4], [2210,8], [456,2],
  143. table.cell(rowspan: 2, align: center + horizon)[GT-02], [1038,1], [2215,0], [452,9],
  144. [1040,3], [2217,2], [449,8],
  145. table.cell(colspan: 3, align: left)[Контрольная точка северного борта], [1],
  146. ),
  147. align: (left, right, right, right),
  148. ),
  149. caption: [Координаты контрольных скважин],
  150. ) <table-merged>
  151. `rowspan` объединяет строки, `colspan` — столбцы. Сумма занятых ячеек в каждой строке должна соответствовать числу столбцов.
  152. == Таблица из CSV
  153. #let csv-data = csv("assets/example.csv", delimiter: "\t")
  154. #figure(
  155. corp-table(
  156. columns: (1fr, 1fr),
  157. ..csv-data.flatten(),
  158. ),
  159. caption: [Данные, загруженные из TSV-файла],
  160. ) <table-csv>
  161. Для CSV с запятыми уберите параметр `delimiter`; для табличного файла TSV используйте `"\t"`.
  162. = ФОРМУЛЫ
  163. == Отдельная нумерованная формула
  164. #formula(
  165. $K = (sum F_("уд"))/(sum F_("сдв"))$,
  166. ) <equation-safety>
  167. Ссылка через стандартную метку: @equation-safety. Короткая ссылка helper-функцией: #eqref(<equation-safety>). Ссылка с падежом: согласно #vref(<equation-safety>, "д").
  168. == Формула внутри строки
  169. Короткое выражение $K >= 1.3$ пишется между одиночными знаками `$` и не получает отдельного номера.
  170. == Несколько строк и пояснение символов
  171. #formula(
  172. $cases(
  173. sigma_1 = (sigma_x + sigma_y)/2 + sqrt(((sigma_x - sigma_y)/2)^2 + tau_(x y)^2),
  174. sigma_3 = (sigma_x + sigma_y)/2 - sqrt(((sigma_x - sigma_y)/2)^2 + tau_(x y)^2),
  175. )$,
  176. ) <equation-principal>
  177. где $sigma_1$ и $sigma_3$ — главные напряжения; $sigma_x$, $sigma_y$ и $tau_(x y)$ — компоненты тензора напряжений.
  178. #pagebreak()
  179. = СПИСКИ И ТЕКСТ
  180. Маркированный список:
  181. - первый пункт;
  182. - второй пункт;
  183. - вложенное пояснение;
  184. - заключительный пункт.
  185. Нумерованный список:
  186. #numbered-list[
  187. + Подготовить исходные данные.
  188. + Выполнить расчёт.
  189. + Проверить результат.
  190. ]
  191. == Быстрая многоуровневая схема ГОСТ
  192. Без параметров используется наиболее частая схема: `1.` → `а)` → `1)`.
  193. #numbered-list[
  194. + Первый уровень.
  195. + Второй уровень.
  196. + Третий уровень.
  197. + Следующий пункт первого уровня.
  198. ]
  199. == Полная десятичная нумерация
  200. Схема `decimal` сохраняет номера всех родительских уровней.
  201. #numbered-list(scheme: "decimal")[
  202. + Раздел списка.
  203. + Подраздел списка.
  204. + Вложенный пункт.
  205. + Следующий раздел списка.
  206. ]
  207. == Локальная и полная смешанная нумерация
  208. #grid(
  209. columns: (1fr, 1fr),
  210. gutter: 1cm,
  211. [
  212. *Локальная:*
  213. #numbered-list(scheme: "local-mixed")[
  214. + Уровень 1.
  215. + Уровень 2.
  216. + Уровень 3.
  217. ]
  218. ],
  219. [
  220. *С сохранением родителей:*
  221. #numbered-list(scheme: "full-mixed")[
  222. + Уровень 1.
  223. + Уровень 2.
  224. + Уровень 3.
  225. ]
  226. ],
  227. )
  228. == Доступные типы счётчиков
  229. #block(breakable: false)[
  230. #grid(
  231. columns: (1fr, 1fr, 1fr),
  232. gutter: 0.5cm,
  233. [*Римские I* #numbered-list(levels: ("I",), suffixes: ".")[
  234. + Первый.
  235. + Второй.
  236. + Третий.
  237. ]],
  238. [*Римские i* #numbered-list(levels: ("i",), suffixes: ".")[
  239. + Первый.
  240. + Второй.
  241. + Третий.
  242. ]],
  243. [*Латинские A* #numbered-list(levels: ("A",), suffixes: ".")[
  244. + Первый.
  245. + Второй.
  246. + Третий.
  247. ]],
  248. [*Латинские a* #numbered-list(levels: ("a",), suffixes: ".")[
  249. + Первый.
  250. + Второй.
  251. + Третий.
  252. ]],
  253. [*С ведущим нулём* #numbered-list(levels: ("01",), suffixes: ".")[
  254. + Первый.
  255. + Второй.
  256. + Третий.
  257. ]],
  258. [*Кириллица А* #numbered-list(levels: ("А",), suffixes: ".")[
  259. + Первый.
  260. + Второй.
  261. + Третий.
  262. ]],
  263. [*Кириллица а* #numbered-list(levels: ("а",), suffixes: ".")[
  264. + Первый.
  265. + Второй.
  266. + Третий.
  267. ]],
  268. )
  269. ]
  270. == Произвольные разделители
  271. В этом примере границы уровней различаются: первый разделитель — точка, второй — закрывающая скобка.
  272. #numbered-list(
  273. levels: ("1", "а", "A"),
  274. full: true,
  275. separators: (".", ")"),
  276. suffixes: (".", ")", "."),
  277. )[
  278. + Первый уровень.
  279. + Второй уровень: номер имеет вид `1.а)`.
  280. + Третий уровень получает номер `1.а)A.`
  281. ]
  282. Схема `legal` даёт последовательность `A)` → `A)1.`:
  283. #numbered-list(scheme: "legal")[
  284. + Латинский уровень.
  285. + Цифровой уровень.
  286. ]
  287. `list-level` позволяет отдельно задать prefix, suffix и ширину числа:
  288. #numbered-list(
  289. levels: (list-level("1", prefix: [§ ], suffix: ":", width: 3),),
  290. )[
  291. + Пользовательский уровень отображается как § 001:
  292. + Следующий уровень отображается как § 002:
  293. ]
  294. == Маркеры вместо чисел
  295. #numbered-list(scheme: "bullets")[
  296. + Маркер •.
  297. + Маркер ∙.
  298. + Маркер ‣.
  299. + Маркер ⁃.
  300. + Маркер ◦.
  301. ]
  302. == Геометрия и интервалы
  303. Параметры ниже меняют общий отступ списка, шаг вложенности, расстояние от номера до текста, межстрочный интервал внутри пункта и интервал между пунктами.
  304. #numbered-list(
  305. scheme: "decimal",
  306. outer-indent: 0.7cm,
  307. level-indent: 0.8cm,
  308. body-indent: 0.8em,
  309. line-leading: 0.45em,
  310. item-spacing: 1.1em,
  311. )[
  312. + Длинный первый пункт показывает уменьшенный интервал между строками внутри одного элемента списка и устойчивый висячий отступ при переносе текста на следующую строку.
  313. + Второй пункт отделён от первого увеличенным межэлементным интервалом.
  314. + Вложенный пункт использует увеличенный шаг уровня.
  315. ]
  316. == Продолжение с нужного номера
  317. Первый номер можно задать стандартным синтаксисом Typst; следующие элементы продолжат счёт автоматически. Формат `01` сохраняется.
  318. #numbered-list(levels: ("01",), suffixes: ".")[
  319. 8. Восьмой пункт отображается как 08.
  320. + Следующий пункт отображается как 09.
  321. ]
  322. Доступны *полужирное начертание*, _курсив_, `моноширинный текст` и #link("https://typst.app/docs/")[внешние ссылки].
  323. = РАЗРЫВЫ И ПОДКЛЮЧЕНИЕ ГЛАВ
  324. `#pagebreak()` начинает новую страницу. Большие документы делят на главы и подключают из `main.typ`:
  325. ```typst
  326. #include "chapters/10-methods.typ"
  327. #pagebreak()
  328. #include "chapters/20-results.typ"
  329. ```
  330. Само наличие файла в `chapters/` не добавляет его в документ: порядок определяют строки `#include`.