9 Commits
10 changed files with 157 additions and 49 deletions

No files matched your search

+9
View File
@@ -1,3 +1,12 @@
# ktu-paper
This repository contains a Typst template for academic papers at the Kaunas University of Technology, Faculty of Informatics. A final Bachelor's thesis written with this template has successfully passed the formal review.
## Initiating the template
Install the downloaded template under the following directory:
- LINUX: `~/.local/share/typst/packages/local/ktu-paper/0.3.1/`
And then initiate a new project:
```sh
typst init @local/ktu-paper:0.3.1
```
+5
View File
@@ -6,6 +6,11 @@
/// Appendix and other non-standard sections.
#let __FIG_PER_SECTION = state("svetikas.lt/ktu-paper/figure-numbering-per-section", false)
/// Whether to uppercase section titles or not.
/// If true, section titles will be uppercased.
/// If false, section titles will be displayed as-is.
#let __UPPERCASE_SECTION_TITLES = state("svetikas.lt/ktu-paper/uppercase-section-titles", false)
#let __DEBUG_AUTHOR_TABLE = state("$ktu-template-DEBUG_AUTHOR_TABLE", false)
#let debug-author-table() = {
__DEBUG_AUTHOR_TABLE.update(true)
+1 -1
View File
@@ -1,7 +1,7 @@
// This file includes logic for displaying figures in the document, including numbering, captions, and references. It also includes logic for handling figure numbering per section or globally, based on the configuration set in `config.typ`.
#import "config.typ": __FIG_PER_SECTION
/// Localizations for various recognized referencable figure types.
/// Localizations for various recognized referenceable figure types.
/// This is used to provide the correct supplement text for each type of figure
/// when generating references, captions and outlines.
#let __figureNames = (
+54 -22
View File
@@ -128,8 +128,43 @@
]
}
#let ktu-heading-page(
faculty: highlight[Fakulteto pavadinimas],
department: none, // optional
title: highlight[Rašto darbo pavadinimas],
subtitles: highlight[Praktikos ataskaita / referatas ir pan. (įrašyti rašto darbo tipą)],
authors: (
(highlight[Vardenis Pavardenis], highlight[Projekto autorius]),
(highlight[Vardenis Pavardenis], highlight[Vadovas]),
),
place: highlight[Kaunas],
year: highlight[#datetime.today().year()],
centerAuthors: false,
) = {
let subHeaders = (faculty,)
if department != none {
subHeaders = (faculty, department)
}
if type(subtitles) != array {
subtitles = (subtitles,)
}
ktu-title-header-block(
subHeaders: subHeaders,
bigTitle: title,
subTitles: subtitles,
)
v(94pt)
if centerAuthors {
ktu-author-table(authors: authors, alignment: center)
} else {
ktu-author-table(authors: authors)
}
align(center+bottom, block([*#place, #year*]))
}
#let ktu-heading-page-centered(
faculty: highlight[Fakulteto pavadinimas],
department: none, // optional
title: highlight[Rašto darbo pavadinimas],
subtitles: highlight[Praktikos ataskaita / referatas ir pan. (įrašyti rašto darbo tipą)],
authors: (
@@ -139,22 +174,21 @@
place: highlight[Kaunas],
year: highlight[#datetime.today().year()],
) = {
let isArr = type(subtitles) == array
if not isArr {
subtitles = (subtitles,)
}
ktu-title-header-block(
subHeaders: (faculty,),
bigTitle: title,
subTitles: subtitles,
ktu-heading-page(
faculty: faculty,
department: department,
title: title,
subtitles: subtitles,
authors: authors,
place: place,
year: year,
centerAuthors: true,
)
v(94pt)
ktu-author-table(authors: authors, alignment: center)
align(center+bottom, block([*#place, #year*]))
}
#let ktu-heading-page-normal(
faculty: highlight[Fakulteto pavadinimas],
department: none, // optional
title: highlight[Rašto darbo pavadinimas],
subtitles: highlight[Praktikos ataskaita / referatas ir pan. (įrašyti rašto darbo tipą)],
authors: (
@@ -164,18 +198,16 @@
place: highlight[Kaunas],
year: highlight[#datetime.today().year()],
) = {
let isArr = type(subtitles) == array
if not isArr {
subtitles = (subtitles,)
}
ktu-title-header-block(
subHeaders: (faculty,),
bigTitle: title,
subTitles: subtitles,
ktu-heading-page(
faculty: faculty,
department: department,
title: title,
subtitles: subtitles,
authors: authors,
place: place,
year: year,
centerAuthors: false,
)
v(94pt)
ktu-author-table(authors: authors)
align(center+bottom, block([*#place, #year*]))
}
#let ktu-academic-honestly-declaration-page(
+75 -13
View File
@@ -1,8 +1,9 @@
#import "@preview/codly:1.3.0": codly, codly-init
#import "config.typ": debug-author-table, enable-heading-experiment, __HEADING_EXPERIMENT, __FIG_PER_SECTION
#import "config.typ": debug-author-table, enable-heading-experiment, __HEADING_EXPERIMENT, __FIG_PER_SECTION, __UPPERCASE_SECTION_TITLES
#import "fragments.typ": (
ktu-table,
ktu-heading-page-centered, ktu-heading-page-normal, ktu-academic-honestly-declaration-page
ktu-heading-page, ktu-heading-page-centered, ktu-heading-page-normal,
ktu-academic-honestly-declaration-page
)
#import "figures.typ": (
__fig-supplement,
@@ -24,15 +25,25 @@
* - Proposal: change `leading` option to `line-height` | https://github.com/typst/typst/issues/4224
*/
#let __METADATA_HEADING_ALIGN_LEFT = metadata("heading-align-left");
///
/// Insert a heading without a number.
///
/// Usually used for introductory or summary sections at the start and end.
/// - text (str): The heading's title.
/// - headingElement (heading): The heading's title.
/// - alignLeft (bool): Whether the heading should be left-aligned or centered.
/// ->
#let unnumbered-heading(text) = {
set heading(numbering: none)
[#text]
#let unnumbered-heading(headingElement, alignLeft: false) = {
let fields = headingElement.fields()
let body = fields.body
let level = fields.at("level", default: 1)
if alignLeft {
body = body + __METADATA_HEADING_ALIGN_LEFT
}
heading(level: level, numbering: none, body)
}
#let appendix-item(body) = {
@@ -192,6 +203,9 @@
show outline: o => context {
// If it's a heading, show the default outline with bold text
if (o.target == selector(heading)) {
// Determine whether to uppercase section titles based on the global setting
let isUpper = __UPPERCASE_SECTION_TITLES.get()
// Define known target widths based on KTU template
let targets = (0.64cm, 0.96cm, 1.28cm, 1.6cm, 1.92cm)
@@ -207,9 +221,25 @@
target = 0.64cm
}
let newGap = target - measurement.width
// Uppercase body if need be
let bodyContent = it.element.body
if isUpper and (it.level == 1 or it.element.numbering == none) {
bodyContent = upper(bodyContent)
}
// Reconstruct the it.inner content with the new body
let formattedInner = {
bodyContent
[ ] // whitespace is required for backwards compat
box(width: 1fr, it.fill)
[ ] // whitespace is required for backwards compat
it.page()
}
link(
it.element.location(),
it.indented(prefixContent, it.inner(), gap: newGap),
it.indented(prefixContent, formattedInner, gap: newGap),
)
}
@@ -382,6 +412,8 @@
#let setup-page(
font: "Times New Roman",
uppercaseSectionTitles: false,
unnumberedHeadingAlignment: center,
body
) = {
show: __page_rules.with(font: font)
@@ -396,6 +428,14 @@
set par(justify: true)
set linebreak(justify: true)
let maybe-uppercase(body) = {
if uppercaseSectionTitles {
upper(body)
} else {
body
}
}
// Antraštės
// Force them into blocks so they don't count as paragraphs
show heading: it => {
@@ -413,11 +453,16 @@
// Antraštė be nr.
if it.numbering == none {
// Centruota lygiuotė
set align(center)
// Centruota lygiuotė by default, but can be overridden by the user
let explicitlyAlignLeft = it.body.has("children") and it.body.children.len() > 1 and it.body.children.at(1) == __METADATA_HEADING_ALIGN_LEFT
// If the user explicitly set alignLeft to true, we should align left regardless of the global setting
let targetAlign = if explicitlyAlignLeft { left } else { unnumberedHeadingAlignment }
set align(targetAlign)
// atstumas prieš ir po antraštės - 10 pt
block[#it.body]
block[#maybe-uppercase(it.body)]
if useExperiment {
v(10pt)
}
@@ -437,7 +482,7 @@
}
// po antraštės - 10 pt
block[#counter(heading).display() #it.body]
block[#counter(heading).display() #maybe-uppercase(it.body)]
if useExperiment {
v(10pt)
}
@@ -473,19 +518,36 @@
// Bibliography citing style
set bibliography(style: "assets/iso690-numeric-lt.csl")
// Block equations are left-aligned
show math.equation.where(block: true): it => {
align(left, it)
}
body
}
/// Configure the template for a KTU paper.
/// - font (str): Font to use for the paper.
/// - font (str): Text font to use for the paper.
/// - figureNumberingPerSection (bool): Whether to number figures per section rather than globally.
/// - uppercaseSectionTitles (bool): Whether to uppercase section titles.
/// - unnumberedHeadingAlignment (alignment): Alignment for unnumbered headings.
#let ktu-paper(
font: "Times New Roman",
figureNumberingPerSection: false,
// Not sure about formal conformity of deviating
// from the defaults of the next options,
// but some modules may require them
uppercaseSectionTitles: false,
unnumberedHeadingAlignment: center,
body
) = context {
show: setup-page.with(font: font)
show: setup-page.with(
font: font,
uppercaseSectionTitles: uppercaseSectionTitles,
unnumberedHeadingAlignment: unnumberedHeadingAlignment,
)
__FIG_PER_SECTION.update(figureNumberingPerSection)
__UPPERCASE_SECTION_TITLES.update(uppercaseSectionTitles)
body
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 593 KiB

File renamed without changes.
+10 -10
View File
@@ -1,4 +1,4 @@
#import "@local/ktu-paper:0.2.1": (
#import "@local/ktu-paper:0.3.1": (
ktu-paper, setup-code,
ktu-table-of-contents, ktu-picture-list, ktu-table-list,
ktu-heading-page-normal,
@@ -94,7 +94,7 @@ show table.cell: set text(size: 8pt)
Duomenų sklaidą yra patogu pavaizduoti ir stačiakampe diagrama:
#figure(
image("image.jpeg", width: 70%),
image("images/santaka.png", width: 70%),
caption: [
Skaitinių atributų stačiakampė diagrama
],
@@ -136,8 +136,8 @@ Paveikslėlius galima grupuoti į "grid" #custom-ref(<image-grid-2>, <image-grid
#figure(grid(
columns: 2,
gutter: 2mm,
image("image.jpeg", width: 100%),
image("image.jpeg", width: 100%),
image("images/santaka.png", width: 100%),
image("images/santaka.png", width: 100%),
), caption: [
Paveikslėliai "grid'e" 1
]) <image-grid-2>
@@ -145,11 +145,11 @@ Paveikslėlius galima grupuoti į "grid" #custom-ref(<image-grid-2>, <image-grid
#figure(grid(
columns: 3,
gutter: 2mm,
image("image.jpeg", width: 100%),
image("image.jpeg", width: 100%),
image("image.jpeg", width: 100%),
image("image.jpeg", width: 100%),
image("image.jpeg", width: 100%),
image("images/santaka.png", width: 100%),
image("images/santaka.png", width: 100%),
image("images/santaka.png", width: 100%),
image("images/santaka.png", width: 100%),
image("images/santaka.png", width: 100%),
), caption: [
Paveikslėliai "grid'e" 2
]) <image-grid-3>
@@ -190,7 +190,7 @@ $
čia $X$ -- imtis, $mu$ -- imties vidurkis, $sigma$ -- imties standartinis nuokrypis. Fragmentas pateikiamas #ref-no(<image-1>) paveikslėlyje.
#figure(
image("image.jpeg", width: 90%),
image("images/santaka.png", width: 90%),
caption: [
Paveikslėlio pavadinimas
],
+2 -2
View File
@@ -1,4 +1,4 @@
#import "@local/ktu-paper:0.2.1": (
#import "@local/ktu-paper:0.3.1": (
ktu-paper, setup-code,
ktu-table-of-contents, ktu-picture-list, ktu-table-list,
ktu-heading-page-normal,
@@ -191,7 +191,7 @@ Eu eum decore inimicus consetetur, cu usu habeo corpora intellegam. Ut antiopam
Lorem ipsum dolor sit amet, eam ex decore persequeris, sit at illud lobortis atomorum. Sed dolorem quaerendum ne, prompta instructior ne pri. Et mel partiendo suscipiantur, docendi abhorreant ea sit. Recteque imperdiet eum te.
#figure(
image("Picture.png", width: 11.2cm, height: 8cm),
image("images/santaka.png", width: 11.2cm, height: 8cm),
caption: [
Kauno technologijos universiteto „Santakos“ slėnio fasadas
],
+1 -1
View File
@@ -1,6 +1,6 @@
[package]
name = "ktu-paper"
version = "0.2.1"
version = "0.3.1"
compiler = "0.15.0"
entrypoint = "src/lib.typ"
repository = "https://github.com/svetikas/ktu-paper"