title-page.typ 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. // Титульный лист практической работы (СФУ).
  2. // Компилируется отдельно: typst compile title-page.typ
  3. // Подключается первой страницей в main.typ.
  4. // ── Данные работы (менять только здесь) ────────────────────────────────
  5. #let task = (
  6. ministry: "Министерство науки и высшего образования РФ",
  7. university_prename: "Федеральное государственное автономное\nобразовательное учреждение высшего образования\n",
  8. university_shorten: "«СИБИРСКИЙ ФЕДЕРАЛЬНЫЙ УНИВЕРСИТЕТ»",
  9. institute: "Институт цветных металлов",
  10. department: "Шахтное и подземное строительство",
  11. work_type: "ПРАКТИЧЕСКАЯ РАБОТА №1",
  12. topic: "Горные предприятия как объект исследования экономики\nи менеджмента горного производства",
  13. teacher: "Г. С. Курчин",
  14. group: "ГГ21-10",
  15. student_short_name: "А.С. Ткаченко",
  16. city: "Красноярск",
  17. year: "2026 г.",
  18. )
  19. // ── Страница ───────────────────────────────────────────────────────────
  20. // Поля симметричные: центр текстовой колонки совпадает с центром листа,
  21. // поэтому для центрирования достаточно обычного align(center).
  22. #set page(paper: "a4", margin: (x: 20mm, y: 20mm))
  23. #set text(font: "Times New Roman", size: 14pt, lang: "ru")
  24. #set par(justify: false, first-line-indent: 0pt, leading: 0.65em)
  25. // ── Поле: значение на черте + подпись под чертой ───────────────────────
  26. // Одна и та же геометрия у всех полей листа: черта значения — underline
  27. // на базовой линии текста, пустая черта — line на той же высоте
  28. // (blank-line-dy). Оба варианта лежат в слоте фиксированной высоты,
  29. // поэтому подписи всегда на одинаковом расстоянии от своих черт, а
  30. // черты соседних полей — на одной горизонтали.
  31. // value = none → пустая черта (для подписи), требуется width.
  32. #let label-size = 10pt
  33. #let field-stroke = 0.7pt + black
  34. #let slot-height = 16pt // высота слота со значением
  35. #let blank-line-dy = 11.5pt // уровень пустой черты = уровень underline
  36. #let label-gap = 2.8mm // зазор от черты до подписи
  37. #let label-lift = 10.5pt // компенсация верхнего интервала строки подписи
  38. // ── Личная подпись студента ─────────────────────────────────────────────
  39. // Файл лежит в .private/ (исключён в .gitignore) и в git не попадает.
  40. // Картинка уже повёрнута на 10° по часовой и с прозрачным фоном.
  41. #let student-signature = ".private/signature.png"
  42. #let signature-height = 10mm // высота картинки подписи
  43. #let signature-gap = -1mm // зазор до черты; < 0 — подпись заходит на черту
  44. // Единый помощник. Одна и та же геометрия у всех полей листа:
  45. // черты соседних полей всегда лежат на одной горизонтали, подпись —
  46. // всегда под чертой на одинаковом расстоянии.
  47. // value = none → пустая черта (для подписи), требуется width;
  48. // signature → картинка подписи над пустой чертой.
  49. #let field(value, label, width: 100%, signature: none) = box(width: width)[
  50. #grid(
  51. columns: 100%,
  52. inset: 0pt,
  53. align: center + top,
  54. rows: (0pt, slot-height, auto),
  55. // строка нулевой высоты: подпись висит над чертой, ничего не сдвигая
  56. [
  57. #if signature != none [
  58. #move(dy: blank-line-dy - signature-gap - signature-height)[
  59. #align(center)[#image(signature, height: signature-height)]
  60. ]
  61. ]
  62. ],
  63. // черта со значением (или пустая черта для подписи)
  64. [
  65. #if value == none [
  66. #move(dy: blank-line-dy)[#line(length: 100%, stroke: field-stroke)]
  67. ] else [
  68. #underline(offset: 2pt, stroke: field-stroke)[#value]
  69. ]
  70. ],
  71. // подпись под чертой
  72. [
  73. #v(label-gap + slot-height - blank-line-dy - label-lift)
  74. #text(size: label-size)[#label]
  75. ],
  76. )
  77. ]
  78. // ── Шапка ──────────────────────────────────────────────────────────────
  79. #align(center)[
  80. #text(size: 14pt)[#task.ministry]
  81. #linebreak()
  82. #text(size: 12pt)[#task.university_prename]
  83. *#task.university_shorten*
  84. ]
  85. #v(5mm)
  86. // ── Институт ───────────────────────────────────────────────────────────
  87. #align(center)[#field(task.institute, [институт], width: 135mm)]
  88. #v(4mm)
  89. // ── Кафедра ────────────────────────────────────────────────────────────
  90. #align(center)[#field(task.department, [кафедра], width: 145mm)]
  91. #v(25mm)
  92. // ── Тип работы ─────────────────────────────────────────────────────────
  93. #align(center)[#text(size: 16pt, weight: "bold")[#task.work_type]]
  94. #v(8mm)
  95. // ── Тема ───────────────────────────────────────────────────────────────
  96. #align(center)[
  97. #grid(
  98. columns: 100%,
  99. inset: 0pt,
  100. align: center + top,
  101. [
  102. #underline(offset: 2pt, stroke: field-stroke)[#task.topic]
  103. ],
  104. [
  105. #v(label-gap + 2pt)
  106. #text(size: label-size)[тема]
  107. ],
  108. )
  109. ]
  110. #v(35mm)
  111. // ── Подписи ────────────────────────────────────────────────────────────
  112. // Колонки: роль | группа | зазор | подпись | зазор | ФИО.
  113. // Черты для подписи и подчёркнутые значения в одной строке таблицы
  114. // находятся на одном уровне благодаря общей геометрии field().
  115. #table(
  116. columns: (34mm, 49mm, 8mm, 27mm, 11mm, 41mm),
  117. stroke: none,
  118. inset: (x: 0pt, y: 5.5mm),
  119. align: (left, center, center, center, center, center),
  120. table.cell(colspan: 2)[Преподаватель],
  121. [],
  122. field(none, [подпись, дата], width: 27mm),
  123. [],
  124. field(task.teacher, [инициалы, фамилия]),
  125. [Студент],
  126. field(task.group, [номер группы, зачетной книжки]),
  127. [],
  128. field(none, [подпись, дата], width: 27mm, signature: student-signature),
  129. [],
  130. field(task.student_short_name, [инициалы, фамилия]),
  131. )
  132. // ── Город, год — по центру листа, у нижнего поля ───────────────────────
  133. #place(bottom + center)[#task.city #task.year]