summaryrefslogtreecommitdiff
path: root/conf.typ
diff options
context:
space:
mode:
Diffstat (limited to 'conf.typ')
-rw-r--r--conf.typ151
1 files changed, 116 insertions, 35 deletions
diff --git a/conf.typ b/conf.typ
index d907820..29a7e87 100644
--- a/conf.typ
+++ b/conf.typ
@@ -21,7 +21,7 @@
#let strings = (
title: (
minobrnauki: "МИНОБРНАУКИ РОССИИ\nФедеральное государственное бюджетное образовательное учреждение\nвысшего образования\n",
- sgu: ["САРАТОВСКИЙ НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ИМЕНИ Н. Г. ЧЕРНЫШЕВСКОГО"],
+ sgu: "«САРАТОВСКИЙ НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ \n ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ \n ИМЕНИ Н. Г. ЧЕРНЫШЕВСКОГО»",
city: "Саратов",
worktypes: (
referat: [РЕФЕРАТ],
@@ -34,6 +34,9 @@
from_course: "курса",
from_group: "группы",
from_speciality: "направления",
+ scientific_advisor: "Научный руководитель",
+ department_chair: "Заведующий кафедрой",
+ reviewed: "Проверено"
),
student: (
male: "студента",
@@ -64,28 +67,61 @@
// Переменная отвечающая за размер отступа красной строки
#let indent = 1.25cm
+#let toc_number_title_gap = 1em
+// Level-2 numbers should start under the title text of their level-1 parent,
+// not under the parent number.
+#let toc_level_indent = 1.5em
#let font_size = 14pt
+#let main_font = "Tempora"
#let figure_font_size = font_size - 2pt
-// #let linespace = font_size
#let line_spacing = 1.75em / 2
#let styled = [#set text(red)].func()
#let space = [ ].func()
#let sequence = [].func()
-#let code_font_size = font_size - 2pt
-// TODO: надо выяснить сколько нужно приплюсовывать к -indent без хардкода
-#let code_block_move = -indent + 11pt
+#let mono_small_font_size = font_size - 2pt
+// Typst raw internally renders at about 80% of surrounding text size.
+// To get 12pt code, as in LaTeX \small SCVerbatim, set the surrounding
+// size to 15pt before passing raw to zebraw.
+#let code_block_raw_base_size = 15pt
+// Моноширинный шрифт для inline-code, блоков кода и URL.
+// В LaTeX-шаблоне это T2A/cmtt (в PDF: SFTT1200/SFTT1440 из cm-super).
+// Для Typst используем локально сохранённый OpenType-эквивалент:
+// fonts/CMUTypewriterText-Regular.otf.
+#let mono_font = ("CMU Typewriter Text", "Courier New")
+// Номера строк в LaTeX fancyvrb набираются маленьким Computer Modern Roman,
+// а не моноширинным шрифтом.
+#let line_number_font = ("CMU Serif", "Times New Roman")
+#let line_number_font_size = 6pt
+#let line_number_baseline = 1pt
+// Extra left inset for code lines: increases the visual gap between line
+// numbers and code while the whole block is shifted left by the same amount.
+#let code_numbering_gap_extra = 0.75em
+#let code_numbering_outdent = 1.5em + code_numbering_gap_extra
+
+#let code-inline(code) = text(font: mono_font, size: font_size, code.text)
#let code-block-raw(code) = {
- set text(size: code_font_size)
+ show raw: set text(font: mono_font)
+ set text(size: code_block_raw_base_size)
// TODO: нужно выяснить почему нужно переоборачивать raw, чтобы размер был
// правильным
- move(dx: code_block_move, zebraw(raw(block: true, code.text)))
+ // Сам zebraw строит breakable-блок и сохраняет непрерывную нумерацию строк
+ // при разрыве страницы. Внешний block нужен только для расширения ширины
+ // после выноса номеров строк в левое поле.
+ pad(
+ left: -code_numbering_outdent,
+ zebraw(inset: (left: code_numbering_gap_extra), raw(block: true, code.text)),
+ )
}
#let code-block(..args, code) = {
- set text(size: code_font_size)
- move(dx: code_block_move, zebraw(..args, code))
+ show raw: set text(font: mono_font)
+ set text(size: code_block_raw_base_size)
+ pad(
+ left: -code_numbering_outdent,
+ zebraw(inset: (left: code_numbering_gap_extra), ..args, code),
+ )
}
#let modules = (
@@ -198,12 +234,16 @@
* Отвечает за вывод названия министерства и
* университета на титульном листе
*/
- _default_header: () => {
+ _default_header: (chair: none) => {
set align(center)
// set text(font: "Tempora")
text(strings.title.minobrnauki)
v(0.2em)
text(weight: "bold", strings.title.sgu)
+ if chair != none and chair != "" {
+ v(0em)
+ text("Кафедра " + chair)
+ }
set align(left)
},
/*
@@ -233,10 +273,11 @@
text(strings.title.city + " " + str(datetime.today().year()))
},
/*
- * Подпись "Проверено:" для титульного листа
+ * Подпись для титульного листа
*/
- _signature: (post, name) => {
- text("Проверено:\n")
+ _signature: (comment, post, name) => {
+ text(comment)
+ v(-0.5em)
grid(
columns: (1fr,) * 3,
align: (left, center, right),
@@ -317,10 +358,15 @@
*/
make: (self, info) => {
let strs = (self.title._get_strings)(self, info)
- (self.title._default_header)()
+ (self.title._default_header)(chair: info.at("chair", default: none))
(self.title._default_body)(strs)
v(1fr)
- (self.title._signature)(info.inspector.degree, info.inspector.name)
+ if info.type == "referat" {
+ (self.title._signature)(info.inspector.degree, info.inspector.name)
+ } else if info.type == "coursework" {
+ (self.title._signature)(strings.title.scientific_advisor, info.scientific_advisor.degree, info.scientific_advisor.name)
+ (self.title._signature)(strings.title.department_chair, info.department_chair.degree, info.department_chair.name)
+ }
(self.title._default_footer)()
},
),
@@ -348,7 +394,7 @@
* - info - информация о документе
*/
make_toc: (info: ()) => {
- show outline.entry.where(level: 1): it => {
+ show outline.entry: it => {
let heading-text = it
.at("element", default: (:))
.at("body", default: "")
@@ -362,27 +408,44 @@
// понятно почему оно сюда вообще попадает.
// assert(is-caps or (not is-outlined) or it.element.numbering != none)
- if (not (is-annex or is-caps)) {
- return it
+ if is-annex or is-caps {
+ let prefix = none
+ if is-annex {
+ prefix = [ПРИЛОЖЕНИЕ #it.prefix() #heading-text]
+ } else if is-caps {
+ prefix = heading-text + sym.space
+ }
+ return link(
+ it.element.location(),
+ it.indented(
+ none,
+ prefix
+ + sym.space
+ + box(width: 1fr, it.fill)
+ + sym.space
+ + sym.wj
+ + it.page(),
+ ),
+ )
}
- assert(is-annex or is-caps)
- let prefix = none
- if is-annex {
- prefix = [ПРИЛОЖЕНИЕ #it.prefix() #heading-text]
- } else if is-caps {
- prefix = heading-text + sym.space
- }
link(
it.element.location(),
- it.indented(
- none,
- prefix
- + sym.space
- + box(width: 1fr, it.fill)
- + sym.space
- + sym.wj
- + it.page(),
+ pad(
+ left: toc_level_indent * (it.level - 1),
+ grid(
+ columns: (auto, toc_number_title_gap, 1fr),
+ column-gutter: 0pt,
+ align: top,
+ it.prefix(),
+ [],
+ heading-text
+ + sym.space
+ + box(width: 1fr, it.fill)
+ + sym.space
+ + sym.wj
+ + it.page(),
+ ),
),
)
}
@@ -404,7 +467,7 @@
right: 1.5cm,
),
)
- set text(size: font_size, lang: "ru", font: "Times New Roman")
+ set text(size: font_size, lang: "ru", font: main_font)
if settings.title_page.at("enabled", default: true) {
(self.title.make)(self, info)
@@ -412,6 +475,14 @@
show: thmrules.with(qed-symbol: $square$)
show heading: self.document.apply_heading_styles
+ show link: it => {
+ if type(it.dest) == str and it.dest.starts-with("http") {
+ text(font: mono_font, size: mono_small_font_size, it.body)
+ } else {
+ it
+ }
+ }
+ show raw.where(block: false): code-inline
show raw.where(block: true): code-block-raw
set par(
@@ -441,6 +512,7 @@
set math.equation(numbering: "(1)")
set figure.caption(separator: [ -- ])
+ show figure.where(kind: image): set figure(supplement: [Рисунок])
show figure.caption: set text(size: figure_font_size)
show figure.where(kind: table): set figure.caption(position: top)
@@ -580,7 +652,16 @@
info: info,
settings,
[
- #show: zebraw-init.with(background-color: auto, hanging-indent: true)
+ #show: zebraw-init.with(
+ background-color: auto,
+ hanging-indent: true,
+ numbering-font-args: (
+ font: line_number_font,
+ size: line_number_font_size,
+ baseline: line_number_baseline,
+ ),
+ lang-font-args: (font: mono_font),
+ )
#doc
],
)