Files
Report-showcase/.template/lib/numbering.typ
T
2026-10-09 01:45:17 +00:00

106 lines
2.1 KiB
Typst
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// ==========================================
// НУМЕРАЦИЯ, КИРИЛЛИЦА И ФОРМАТЫ СПИСКОВ
// ==========================================
// Глобальный массив кириллических букв для нумерации по ГОСТ
// (обычно исключают Ё, З, Й, О, Ч, Ь, Ы, Ъ)
#let cyrillic_letters = (
"А",
"Б",
"В",
"Г",
"Д",
"Е",
"Ж",
"И",
"К",
"Л",
"М",
"Н",
"П",
"Р",
"С",
"Т",
"У",
"Ф",
"Х",
"Ц",
"Ш",
"Щ",
"Э",
"Ю",
"Я",
)
#let cyrillic_letters_lower = (
"а",
"б",
"в",
"г",
"д",
"е",
"ж",
"и",
"к",
"л",
"м",
"н",
"п",
"р",
"с",
"т",
"у",
"ф",
"х",
"ц",
"ш",
"щ",
"э",
"ю",
"я",
)
// Фильтр для форматирования счетчика в заглавную букву (Приложение А)
#let cyrillic_numbering = (..nums) => {
let n = nums.pos().first()
if n > 0 and n <= cyrillic_letters.len() {
cyrillic_letters.at(n - 1)
} else {
str(n)
}
}
// Формат 1.1. (наследует всех родителей)
#let num_11 = (..nums) => nums.pos().map(str).join(".") + "."
// Формат 1.а. (наследует всех родителей, чередует цифры и кириллицу)
#let num_1a = (..nums) => {
let pos = nums.pos()
let out = ""
for (i, n) in pos.enumerate() {
if calc.rem(i, 2) == 0 { out += str(n) + "." } else {
let letter = if n > 0 and n <= cyrillic_letters_lower.len() {
cyrillic_letters_lower.at(n - 1)
} else {
str(n)
}
out += letter + "."
}
}
out
}
// Формат 1., а. (без наследования родителей, чередует цифры и кириллицу)
#let num_1_a = (..nums) => {
let pos = nums.pos()
let n = pos.last()
if calc.rem(pos.len() - 1, 2) == 0 { str(n) + "." } else {
let letter = if n > 0 and n <= cyrillic_letters_lower.len() {
cyrillic_letters_lower.at(n - 1)
} else {
str(n)
}
letter + "."
}
}