17 Commits

Author SHA1 Message Date
0x1D8 f36b513a2d docs(README): fix installation instructions 2025-03-01 10:53:53 +02:00
pencelheimer d7c26debfd fix: package entry point 2025-03-01 01:26:50 +02:00
pencelheimer f940d16e06 fix: imports 2025-03-01 01:26:38 +02:00
pencelheimer 09b4d3aa44 feat(README): added instructions for local typst package setup 2025-03-01 01:15:13 +02:00
pencelheimer 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
pencelheimer efa56f1fec feat(style func): added show rules for heading(level: 3) 2025-02-27 11:54:31 +02:00
0x1D8 0e6f2ce25e docs: improve code examples 2025-02-27 08:49:47 +02:00
0x1D8 394d4b1fcf minor syntactic changes 2025-02-25 10:20:20 +02:00
0x1D8 09fc15a8c9 reimplement appendices 2025-02-21 15:06:28 +02:00
pencelheimer a761f36a02 removed typst-13 warning from readme 2025-02-20 00:19:23 +02:00
pencelheimer b12627d888 fixed calendar plan signature indent 2025-02-19 16:08:24 +02:00
0x1D8 2d67b11f48 pass named arguments for img to image 2025-02-17 18:23:36 +02:00
0x1D8 c2fd8f6ad0 fix image and table count 2025-02-16 21:43:16 +02:00
0x1D8 63720d0068 remove italics from bibliography 2025-02-15 12:06:01 +02:00
0x1D8 8cabd1c779 fix bibliography indent 2025-02-15 10:02:04 +02:00
0x1D8 a6ec38abee reorganize a bit 2025-02-15 09:26:27 +02:00
0x1D8 bc78371fce add fold-markers 2025-02-15 00:30:50 +02:00
8 changed files with 205 additions and 127 deletions
+15 -12
View File
@@ -1,14 +1,5 @@
# Typst Template for NURE Works # Typst Template for NURE Works
> [!WARNING]
> This template relies on functionality added in [Typst v0.13.0-rc1](https://github.com/typst/typst/releases/tag/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: lab-pz-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.
BIN
View File
Binary file not shown.
+121 -85
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,15 +37,34 @@
/// bold text /// bold text
#let bold(content) = text(weight: "bold")[#content] #let bold(content) = text(weight: "bold")[#content]
/// month name from its number
#let month_gen(month) = (
"січня",
"лютого",
"березня",
"квітня",
"травня",
"червня",
"липня",
"серпня",
"вересня",
"жовтня",
"листопада",
"грудня",
).at(month - 1)
// Helper functions {{{1
/// captioned image with label derived from path: /// captioned image with label derived from path:
/// - "image.png" = @image /// - "image.png" = @image
/// - "img/image.png" = @image /// - "img/image.png" = @image
/// - "img/foo/image.png" = @foo_image /// - "img/foo/image.png" = @foo_image
/// - "img/foo/foo_image.png" = @foo_image /// - "img/foo/foo_image.png" = @foo_image
/// the caption will be modified based on a conditional value: /// the caption will be modified based on a conditional positional value:
/// - `none`: no change /// - `none`: no change
/// - some value: [#caption (за даними #value)] /// - some value: "`caption` (за даними `value`)"
/// - no value: caption + " (рисунок виконано самостійно)" /// - no value: "`caption` (рисунок виконано самостійно)"
/// additional named arguments will be passed to original `image` function
#let img(path, caption, ..sink) = { #let img(path, caption, ..sink) = {
let parts = path.split(".").first().split("/") let parts = path.split(".").first().split("/")
@@ -43,43 +84,15 @@
[#caption (за даними #sink.pos().first())] [#caption (за даними #sink.pos().first())]
} }
[#figure(image(path), caption: caption) #label(label_string)] [#figure(image(path, ..sink.named()), caption: caption) #label(label_string)]
} }
/// subjects list // Styling {{{1
#let subjects = ( /// NOTE: may be wrong
"БД": "Бази даних", #let ua_alpha_numbering = "абвгдежиклмнпрстуфхцшщюя".split("") // 0 = "", 1 = "а"
"ОПНJ": "Основи програмування на Java",
"ОС": "Операційні системи",
"ПП": "Проектний практикум",
"СПМ": "Скриптові мови програмування",
"Ф": "Філософія",
)
/// education programs list // general outlook {{{2
#let edu_programs = ( // spacing between lines
"ПЗПІ": (
name: "Інженерія програмного забезпечення",
number: 121,
),
)
#let month_gen(month) = (
"січня",
"лютого",
"березня",
"квітня",
"травня",
"червня",
"липня",
"серпня",
"вересня",
"жовтня",
"листопада",
"грудня",
).at(month - 1)
/// spacing between lines
#let spacing = 0.95em #let spacing = 0.95em
#let style(it) = { #let style(it) = {
@@ -103,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
@@ -121,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
@@ -143,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") {
@@ -170,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 => {
@@ -193,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)
@@ -211,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.
@@ -224,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",
@@ -257,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)
МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
@@ -324,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()
@@ -351,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()
@@ -404,9 +421,10 @@
pagebreak() pagebreak()
} }
// page 3 // page 3 {{{2
{ {
align(center, bold[КАЛЕНДАРНИЙ ПЛАН]) align(center, bold[КАЛЕНДАРНИЙ ПЛАН])
set par(first-line-indent: 0pt)
linebreak() linebreak()
@@ -444,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(", ").
] ]
@@ -492,9 +512,8 @@
#abstract.text #abstract.text
] ]
// }}}
// page 5 // page 5 {{{2
outline( outline(
title: [ title: [
ЗМІСТ ЗМІСТ
@@ -506,7 +525,7 @@
doc doc
// bibliography // bibliography {{{2
{ {
heading(depth: 1, numbering: none)[Перелік джерел посилання] heading(depth: 1, numbering: none)[Перелік джерел посилання]
@@ -529,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" [
@@ -544,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
@@ -560,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.
@@ -613,6 +648,7 @@
context counter(heading).update(worknumber - 1) context counter(heading).update(worknumber - 1)
// page 1 {{{2
align(center)[ align(center)[
МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ \ МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ \
ХАРКІВСЬКИЙ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ РАДІОЕЛЕКТРОНІКИ ХАРКІВСЬКИЙ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ РАДІОЕЛЕКТРОНІКИ
@@ -668,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)
+21 -6
View File
@@ -1,4 +1,4 @@
#import "template.typ": * #import "@local/nure:0.0.0": *
#show: lab-pz-template.with( #show: lab-pz-template.with(
doctype: "ЛБ", doctype: "ЛБ",
@@ -25,12 +25,27 @@
#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
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"