Compare commits

21 Commits

Author SHA1 Message Date
f36b513a2d docs(README): fix installation instructions 2025-03-01 10:53:53 +02:00
d7c26debfd fix: package entry point 2025-03-01 01:26:50 +02:00
f940d16e06 fix: imports 2025-03-01 01:26:38 +02:00
09b4d3aa44 feat(README): added instructions for local typst package setup 2025-03-01 01:15:13 +02:00
0d526d4f58 feat: restructured files accrording to typst package format
- added typst.toml
- moved templates to "template" folder
- renamed files according to convention
2025-03-01 01:10:05 +02:00
efa56f1fec feat(style func): added show rules for heading(level: 3) 2025-02-27 11:54:31 +02:00
0e6f2ce25e docs: improve code examples 2025-02-27 08:49:47 +02:00
394d4b1fcf minor syntactic changes 2025-02-25 10:20:20 +02:00
09fc15a8c9 reimplement appendices 2025-02-21 15:06:28 +02:00
a761f36a02 removed typst-13 warning from readme 2025-02-20 00:19:23 +02:00
b12627d888 fixed calendar plan signature indent 2025-02-19 16:08:24 +02:00
2d67b11f48 pass named arguments for img to image 2025-02-17 18:23:36 +02:00
c2fd8f6ad0 fix image and table count 2025-02-16 21:43:16 +02:00
63720d0068 remove italics from bibliography 2025-02-15 12:06:01 +02:00
8cabd1c779 fix bibliography indent 2025-02-15 10:02:04 +02:00
a6ec38abee reorganize a bit 2025-02-15 09:26:27 +02:00
bc78371fce add fold-markers 2025-02-15 00:30:50 +02:00
612e70a897 fixed authors list 2025-02-14 23:48:59 +02:00
67dc761845 updated readme and lab template to 0.13 2025-02-14 23:48:47 +02:00
b3c0a466f7 make img func source arg optional 2025-02-14 15:53:22 +02:00
e1354921f3 update README.md 2025-02-14 11:44:18 +02:00
8 changed files with 229 additions and 144 deletions

View File

@ -1,14 +1,5 @@
# Typst Template for NURE Works # Typst Template for NURE Works
> [!WARNING]
> This branch is using the Typst v0.13.0-rc1. To install it use the following command:
> ```bash
> cargo install --git https://github.com/typst/typst --branch 0.13 --locked typst-cli
> ```
## TODO
- Add more information about the template.
## General Info ## General Info
This project contains two template functions and some utilities for writing NURE works. All functions include documentation comments inside them, so you can explore all possibilities using LSP. This project contains two template functions and some utilities for writing NURE works. All functions include documentation comments inside them, so you can explore all possibilities using LSP.
@ -35,19 +26,31 @@ This template:
## Usage ## Usage
To use the template, include it in your project and utilize the provided functions: ### As a local typst package
1. Clone this repository into ~/.local/share/typst/packages/:
```bash
git clone https://gitea.linerds.us/pencelheimer/typst_nure_template.git ~/.local/share/typst/packages/local/nure/0.0.0
```
2. Init your project with Typst:
```bash
typst init @local/nure:0.0.0 project-name
```
### As a file in your project
Include lib.typ in your project and utilize the provided functions:
```typst ```typst
// Import the template // Import the template
#import "path/to/template.typ": * #import "lib.typ": *
// Setup the document // Setup the document
#show: pz-lb-template.with( #show: lab-pz-template.with(
title: "Some title", title: "Some title",
) )
// this template automatically inserts a `=title`
// Write your content // Write your content
#v(-spacing) #v(-spacing) // remove spacing between headings
== Purpose == Purpose
Some text Some text
``` ```

Binary file not shown.

Binary file not shown.

View File

@ -1,4 +1,26 @@
// Academic aliases {{{1
/// subject abbreviations to full names
#let subjects = (
"БД": "Бази даних",
"ОПНJ": "Основи програмування на Java",
"ОС": "Операційні системи",
"ПП": "Проектний практикум",
"СПМ": "Скриптові мови програмування",
"Ф": "Філософія",
)
/// education program abbreviations to name & number
#let edu_programs = (
"ПЗПІ": (
name: "Інженерія програмного забезпечення",
number: 121, // TODO: ПЗПІ is "F2" now
),
)
// Template formatting functions {{{1
/// numberless heading /// numberless heading
#let nheading(title) = heading(depth: 1, numbering: none, title) #let nheading(title) = heading(depth: 1, numbering: none, title)
@ -15,47 +37,7 @@
/// bold text /// bold text
#let bold(content) = text(weight: "bold")[#content] #let bold(content) = text(weight: "bold")[#content]
/// captioned image with label derived from path: /// month name from its number
/// - `image.png` = @image
/// - `img/image.png` = @image
/// - `img/foo/image.png` = @foo_image
/// - `img/foo/foo_image.png` = @foo_image
/// if source is specified, it will be appended to the caption as " (за даними `source`)"
/// otherwise " (рисунок виконано самостійно)" will be appended to the caption
#let img(path, caption, source: none) = {
let parts = path.split(".").first().split("/")
let label_string = if parts.len() <= 2 or parts.at(-1).starts-with(parts.at(-2)) {
// ("image",), (_, "image") and (.., "img", "img_image")
parts.last()
} else {
// (.., "img", "image") = "img_image"
parts.at(-2) + "_" + parts.at(-1)
}.replace(" ", "_")
caption = [#caption #if source != none [(за даними #source)] else [(рисунок виконано самостійно)]]
[#figure(image(path), caption: caption) #label(label_string)]
}
/// subjects list
#let subjects = (
"БД": "Бази даних",
"ОПНJ": "Основи програмування на Java",
"ОС": "Операційні системи",
"ПП": "Проектний практикум",
"СПМ": "Скриптові мови програмування",
"Ф": "Філософія",
)
/// education programs list
#let edu_programs = (
"ПЗПІ": (
name: "Інженерія програмного забезпечення",
number: 121,
),
)
#let month_gen(month) = ( #let month_gen(month) = (
"січня", "січня",
"лютого", "лютого",
@ -71,7 +53,46 @@
"грудня", "грудня",
).at(month - 1) ).at(month - 1)
/// spacing between lines // Helper functions {{{1
/// captioned image with label derived from path:
/// - "image.png" = @image
/// - "img/image.png" = @image
/// - "img/foo/image.png" = @foo_image
/// - "img/foo/foo_image.png" = @foo_image
/// the caption will be modified based on a conditional positional value:
/// - `none`: no change
/// - some value: "`caption` (за даними `value`)"
/// - no value: "`caption` (рисунок виконано самостійно)"
/// additional named arguments will be passed to original `image` function
#let img(path, caption, ..sink) = {
let parts = path.split(".").first().split("/")
let label_string = if parts.len() <= 2 or parts.at(-1).starts-with(parts.at(-2)) {
// ("image",), (_, "image") and (.., "img", "img_image")
parts.last()
} else {
// (.., "img", "image") = "img_image"
parts.at(-2) + "_" + parts.at(-1)
}.replace(" ", "_")
let caption = if sink.pos().len() == 0 {
caption + " (рисунок виконано самостійно)"
} else if sink.pos().first() == none {
caption
} else {
[#caption (за даними #sink.pos().first())]
}
[#figure(image(path, ..sink.named()), caption: caption) #label(label_string)]
}
// Styling {{{1
/// NOTE: may be wrong
#let ua_alpha_numbering = "абвгдежиклмнпрстуфхцшщюя".split("") // 0 = "", 1 = "а"
// general outlook {{{2
// spacing between lines
#let spacing = 0.95em #let spacing = 0.95em
#let style(it) = { #let style(it) = {
@ -95,17 +116,8 @@
set par(spacing: spacing) set par(spacing: spacing)
set par(leading: spacing) set par(leading: spacing)
// enums and lists // enums and lists {{{2
let ua_alph_numbering() = { set enum(numbering: i => { ua_alpha_numbering.at(i) + ")" }, indent: 1.25cm, body-indent: 0.5cm)
// INFO: This alphabet is not full, maybe it should be extended or maybe not.
// I cant remember nor find proper formatting rules.
// "абвгґдеєжзиіїйклмнопрстуфхцчшщьюя" (full alphabet)
let alphabet = "абвгдежиклмнпрстуфхцшщюя".split("")
i => { alphabet.at(i) + ")" }
}
set enum(numbering: ua_alph_numbering(), indent: 1.25cm, body-indent: 0.5cm)
show enum: it => { show enum: it => {
set enum(indent: 0em, numbering: "1)") set enum(indent: 0em, numbering: "1)")
it it
@ -113,7 +125,7 @@
set list(indent: 1.35cm, body-indent: 0.5cm, marker: [--]) set list(indent: 1.35cm, body-indent: 0.5cm, marker: [--])
// figures // figures {{{2
show figure: it => { show figure: it => {
v(spacing * 2, weak: true) v(spacing * 2, weak: true)
it it
@ -135,7 +147,7 @@
set math.equation(numbering: (..num) => numbering("(1.1)", counter(heading).get().at(0), num.pos().first())) set math.equation(numbering: (..num) => numbering("(1.1)", counter(heading).get().at(0), num.pos().first()))
set figure(numbering: (..num) => numbering("1.1", counter(heading).get().at(0), num.pos().first())) set figure(numbering: (..num) => numbering("1.1", counter(heading).get().at(0), num.pos().first()))
// appearance of references to images and tables // appearance of references to images and tables {{{2
set ref( set ref(
supplement: it => { supplement: it => {
if it == none or not it.has("kind") { if it == none or not it.has("kind") {
@ -162,7 +174,7 @@
[(#it)] [(#it)]
} }
// headings // headings {{{2
set heading(numbering: "1.1") set heading(numbering: "1.1")
show heading.where(level: 1): it => { show heading.where(level: 1): it => {
@ -185,7 +197,19 @@
v(spacing * 2, weak: true) v(spacing * 2, weak: true)
} }
// listings show heading.where(level: 3): it => {
set text(size: 14pt, weight: "regular")
v(spacing * 2, weak: true)
block(width: 100%, spacing: 0em)[
#h(1.25cm)
#counter(heading).display(it.numbering)
#it.body
]
v(spacing * 2, weak: true)
}
// listings {{{2
show raw: it => { show raw: it => {
let new_spacing = 0.5em let new_spacing = 0.5em
set block(spacing: new_spacing) set block(spacing: new_spacing)
@ -203,6 +227,8 @@
it it
} }
// Coursework template {{{1
/// DSTU 3008:2015 Template for NURE /// DSTU 3008:2015 Template for NURE
/// -> content /// -> content
/// - doc (content): Content to apply the template to. /// - doc (content): Content to apply the template to.
@ -216,7 +242,7 @@
/// - calendar_plan ( plan_table: (content | str), approval_date: datetime): Calendar plan object. /// - calendar_plan ( plan_table: (content | str), approval_date: datetime): Calendar plan object.
/// - abstract (keywords: (str, ), text: (content | str)): Abstract object. /// - abstract (keywords: (str, ), text: (content | str)): Abstract object.
/// - bib_path path: Path to the bibliography yaml file. /// - bib_path path: Path to the bibliography yaml file.
/// - appendices ((title: str, content: content, ): List of appendices objects. /// - appendices (content): Content with appendices.
#let cw-template( #let cw-template(
doc, doc,
title: "NONE", title: "NONE",
@ -249,7 +275,7 @@
let head_mentor = mentors.at(0) let head_mentor = mentors.at(0)
let edu_program = edu_programs.at(edu_program_shorthand) let edu_program = edu_programs.at(edu_program_shorthand)
// page 1 // page 1 {{{2
[ [
#set align(center) #set align(center)
МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
@ -316,22 +342,21 @@
#pagebreak() #pagebreak()
] ]
//
// page 2 // page 2 {{{2
{ {
uline([Харківський національний університет радіоелектроніки]) uline[Харківський національний університет радіоелектроніки]
linebreak() linebreak()
linebreak() linebreak()
grid( grid(
columns: (100pt, 1fr), columns: (100pt, 1fr),
bold([ bold[
Кафедра Кафедра
Дисципліна Дисципліна
Спеціальність Спеціальність
]), ],
{ {
uline(align: left, department_gen) uline(align: left, department_gen)
linebreak() linebreak()
@ -343,7 +368,7 @@
grid( grid(
columns: (1fr, 1fr, 1fr), columns: (1fr, 1fr, 1fr),
gutter: 0.3fr, gutter: 0.3fr,
[#bold("Курс") #uline(2)], [#bold("Група") #uline(author.group)], [#bold("Семестр") #uline(3)], [#bold[Курс] #uline(2)], [#bold[Група] #uline(author.group)], [#bold[Семестр] #uline(3)],
) )
linebreak() linebreak()
@ -396,9 +421,10 @@
pagebreak() pagebreak()
} }
// page 3 // page 3 {{{2
{ {
align(center, bold[КАЛЕНДАРНИЙ ПЛАН]) align(center, bold[КАЛЕНДАРНИЙ ПЛАН])
set par(first-line-indent: 0pt)
linebreak() linebreak()
@ -436,23 +462,25 @@
pagebreak() pagebreak()
} }
// page 4 {{{ // page 4 {{{2
[ [
#align(center, bold([РЕФЕРАТ])) \ #align(center, bold[РЕФЕРАТ]) \
#context [ #context [
#let pages = counter(page).final().at(0) #let pages = counter(page).final().at(0)
#let tables = counter(figure.where(kind: table)).final().at(0) #let images = query(figure.where(kind: image)).len()
// alternative: query(figure.where(kind: image)).len() #let tables = query(figure.where(kind: table)).len()
#let images = counter(figure.where(kind: image)).final().at(0)
#let bibs = bib-count.final().dedup().len() #let bibs = bib-count.final().dedup().len()
/* TODO: why this stopped working?
#let tables = counter(figure.where(kind: table)).final().at(0)
#let images = counter(figure.where(kind: image)).final().at(0)*/
#let counters = () #let counters = ()
#if pages != 0 { counters.push([#pages с.]) } #if pages != 0 { counters.push[#pages с.] }
#if tables != 0 { counters.push([#tables табл.]) } #if tables != 0 { counters.push[#tables табл.] }
#if images != 0 { counters.push([#images рис.]) } #if images != 0 { counters.push[#images рис.] }
#if bibs != 0 { counters.push([#bibs джерел]) } #if bibs != 0 { counters.push[#bibs джерел] }
Пояснювальна записка до курсової роботи: #counters.join(", "). Пояснювальна записка до курсової роботи: #counters.join(", ").
] ]
@ -484,9 +512,8 @@
#abstract.text #abstract.text
] ]
// }}}
// page 5 // page 5 {{{2
outline( outline(
title: [ title: [
ЗМІСТ ЗМІСТ
@ -498,7 +525,7 @@
doc doc
// bibliography // bibliography {{{2
{ {
heading(depth: 1, numbering: none)[Перелік джерел посилання] heading(depth: 1, numbering: none)[Перелік джерел посилання]
@ -521,7 +548,7 @@
) )
[ [
#citation.title. #citation.title.
_#{citation.author}_. // TODO: remove italic case, issue #7 #citation.author.
URL: #citation.url.value (дата звернення: #date.display("[day].[month].[year]")). URL: #citation.url.value (дата звернення: #date.display("[day].[month].[year]")).
] ]
} else if citation.type == "Book" [ } else if citation.type == "Book" [
@ -536,6 +563,7 @@
} }
show enum.item: it => { show enum.item: it => {
set par(first-line-indent: 0pt)
box(width: 1.25cm) box(width: 1.25cm)
box(width: 1em + 0.5cm)[#it.number.] box(width: 1em + 0.5cm)[#it.number.]
it.body it.body
@ -552,33 +580,48 @@
} }
} }
// appendices // appendices {{{2
{ {
counter(heading).update(0) counter(heading).update(0)
for (i, appendix) in appendices.enumerate() [ set heading(
#set heading( numbering: (i, ..nums) => {
numbering: i => [ let char = upper(ua_alpha_numbering.at(i))
Додаток #"АБВГДЕЖИКЛМНПРСТУФХЦШЩЮЯ".split("").at(i) if nums.pos().len() == 0 { char } else {
], char + "." + nums.pos().map(str).join(".")
}
},
) )
#show heading: it => { show heading.where(level: 1): it => {
set align(center) set align(center)
set text(size: 14pt, weight: "regular") set text(size: 14pt, weight: "regular")
pagebreak(weak: true) pagebreak(weak: true)
bold(upper(counter(heading).display(it.numbering))) bold[ДОДАТОК #counter(heading).display(it.numbering)]
linebreak() linebreak()
it.body it.body
v(spacing * 2, weak: true) v(spacing * 2, weak: true)
} }
#heading(appendix.title)
#appendix.content show heading.where(level: 2): it => {
set text(size: 14pt, weight: "regular")
v(spacing * 2, weak: true)
block(width: 100%, spacing: 0em)[
#h(1.25cm)
#counter(heading).display(it.numbering)
#it.body
] ]
v(spacing * 2, weak: true)
}
appendices
} }
} }
// Laboratory work template {{{1
/// DSTU 3008:2015 Template for NURE /// DSTU 3008:2015 Template for NURE
/// -> content /// -> content
/// - doc (content): Content to apply the template to. /// - doc (content): Content to apply the template to.
@ -605,6 +648,7 @@
context counter(heading).update(worknumber - 1) context counter(heading).update(worknumber - 1)
// page 1 {{{2
align(center)[ align(center)[
МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ \ МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ \
ХАРКІВСЬКИЙ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ РАДІОЕЛЕКТРОНІКИ ХАРКІВСЬКИЙ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ РАДІОЕЛЕКТРОНІКИ
@ -626,14 +670,16 @@
#columns(2)[ #columns(2)[
#set align(left) #set align(left)
#set par(first-line-indent: 0pt)
#if authors.len() == 1 [ #if authors.len() == 1 {
#let author = authors.at(0) let author = authors.at(0)
#if author.gender == "m" { [Виконав:\ ] } else { [Виконала:\ ] } if author.gender == "m" [Виконав:\ ] else [Виконала:\ ]
[
ст. гр. #author.group\ ст. гр. #author.group\
#author.name\ #author.name\
#if author.variant != none { [Варіант: #author.variant] } ]
] else [ if author.variant != none [Варіант: #author.variant]
} else [
Виконали:\ Виконали:\
ст. гр. #authors.at(0).group\ ст. гр. #authors.at(0).group\
#authors.map(a => [ #a.name\ ]) #authors.map(a => [ #a.name\ ])
@ -658,4 +704,4 @@
doc doc
} }
// vim:sts=2:sw=2 // vim:sts=2:sw=2:fdl=0:fdm=marker:cms=/*%s*/

View File

@ -1,4 +1,4 @@
#import "template.typ": * #import "@local/nure:0.0.0": *
#let author = ( #let author = (
name: "Ситник Є. С.", name: "Ситник Є. С.",
@ -77,20 +77,20 @@
], ],
) )
#let appendices = ( #let appendices = [
( = Приклад звіту 1
title: "Приклад звіту 1", #v(-spacing)
content: [test], == Частина 1
), #lorem(100)
( == Частина2
title: "Приклад звіту 2", #lorem(200)
content: [test],
), = Приклад звіту 2
( #lorem(200)
title: "Приклад звіту 3",
content: [test], = Приклад звіту 3
), #lorem(200)
) ]
#show: cw-template.with( #show: cw-template.with(
title: "Інформаційна система «Помічник класного керівника». Керування класом", title: "Інформаційна система «Помічник класного керівника». Керування класом",
@ -105,3 +105,16 @@
bib_path: "bibl.yml", bib_path: "bibl.yml",
appendices: appendices, appendices: appendices,
) )
= Моделювання
#lorem(250)
= Імплементація
#v(-spacing)
== Підоготовка
#lorem(200)
== Процес
#lorem(500)
= Тестування
#lorem(300)

View File

@ -1,5 +1,4 @@
#import "template.typ": * #import "@local/nure:0.0.0": *
#import "@preview/indenta:0.0.3": fix-indent
#show: lab-pz-template.with( #show: lab-pz-template.with(
doctype: "ЛБ", doctype: "ЛБ",
@ -23,17 +22,30 @@
worknumber: 1, worknumber: 1,
) )
#show: fix-indent()
#v(-spacing) #v(-spacing)
== Мета роботи == Мета роботи
Супер важлива мета #lorem(100)
== Висновки
Супер важливий висновок
== Хід роботи == Хід роботи
#v(-spacing)
=== Підготовка
#lorem(150)
=== Виконання дослідження
#lorem(300)
=== Підрахунок результатів
#lorem(250)
== Висновки
#lorem(100)
== Контрольні запитання == Контрольні запитання
Супер важливі контрольні запитання #lorem(100):
- #lorem(20);
- #lorem(30);
- #lorem(15);
- #lorem(25);
- #lorem(42);
- #lorem(27).

11
typst.toml Normal file
View File

@ -0,0 +1,11 @@
[package]
name = "nure"
version = "0.0.0"
entrypoint = "lib.typ"
authors = ["linerds"]
license = "GPL-3.0"
description = "Typst NURE package"
[template]
path = "template"
entrypoint = "lab.typ"