diff options
Diffstat (limited to 'conf.typ')
| -rw-r--r-- | conf.typ | 151 |
1 files changed, 116 insertions, 35 deletions
@@ -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 ], ) |