mirror of
https://github.com/JustAnyones/ktu-paper.git
synced 2026-11-04 00:30:18 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ada5bc3f63
|
||
|
|
e5c774f96c
|
||
|
|
b803a906ea
|
||
|
|
71b83ab97f
|
||
|
|
f8a747e6b3
|
||
|
|
dfac289590
|
||
|
|
1740adfc5a
|
||
|
|
55a236fe8b
|
||
|
|
d0d7d2a197
|
||
|
|
9736619563
|
||
|
|
340c5ab92c
|
||
|
|
59d197f291
|
||
|
|
f8001593dd
|
||
|
|
1ff507941d
|
||
|
|
3e91fbfefd
|
||
|
|
2e3f4a890e
|
||
|
|
3040693015
|
||
|
|
67947b07a7
|
||
|
|
cd64907a36
|
||
|
|
920866695c
|
||
|
|
b046a59a89
|
||
|
|
ca96637e50
|
||
|
|
ef3e1f6432
|
||
|
|
e37150fc87
|
||
|
|
f5835937db
|
||
|
|
05da5ad1bf
|
||
|
|
22c9e7df8e
|
||
|
|
2b0406163e
|
||
|
|
39a5959bca
|
No files matched your search
@@ -1 +1,3 @@
|
|||||||
template/*.pdf
|
template/*.pdf
|
||||||
|
|
||||||
|
tests/
|
||||||
+21
@@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2026 Dominykas Svetikas
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
@@ -1,3 +1,12 @@
|
|||||||
# ktu-paper
|
# 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.
|
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.4.1/`
|
||||||
|
|
||||||
|
And then initiate a new project:
|
||||||
|
```sh
|
||||||
|
typst init @local/ktu-paper:0.4.1
|
||||||
|
```
|
||||||
@@ -1,3 +1,16 @@
|
|||||||
|
/// Whether to number figures per section or not.
|
||||||
|
/// If true, figures will be numbered like "1.1", "1.2", "2.1", etc.
|
||||||
|
/// If false, figures will be numbered like "1", "2", "3", etc.
|
||||||
|
///
|
||||||
|
/// TODO: figure out how to deal with numbering on sections such as
|
||||||
|
/// 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 = state("$ktu-template-DEBUG_AUTHOR_TABLE", false)
|
||||||
#let debug-author-table() = {
|
#let debug-author-table() = {
|
||||||
__DEBUG_AUTHOR_TABLE.update(true)
|
__DEBUG_AUTHOR_TABLE.update(true)
|
||||||
|
|||||||
+354
@@ -0,0 +1,354 @@
|
|||||||
|
// 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
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
// Figure kinds
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/// Localizations for the recognized referenceable figure kinds, keyed by `repr(func)`.
|
||||||
|
/// - supplement: used in captions (the caption adds the separator, e.g. "1 pav.").
|
||||||
|
/// - ref-name: used in references, e.g. "(žr. 1 pav.)".
|
||||||
|
/// - single-name: full word used when the figure is the only one of its kind and
|
||||||
|
/// therefore unnumbered, e.g. "Paveikslas. ..." and "(žr. paveikslas)".
|
||||||
|
#let __figure-kinds = (
|
||||||
|
table: (supplement: "lentelė", ref-name: "lentelė", single-name: "lentelė"),
|
||||||
|
image: (supplement: "pav", ref-name: "pav.", single-name: "paveikslas"),
|
||||||
|
raw: (supplement: "kodo frag", ref-name: "kodo frag.", single-name: "kodo fragmentas"),
|
||||||
|
equation: (supplement: "lygtis", ref-name: "formulė", single-name: "lygtis"),
|
||||||
|
)
|
||||||
|
|
||||||
|
/// Figure kinds registered by the document author via `ktu-paper(figureKinds: ...)`.
|
||||||
|
#let __USER_FIGURE_KINDS = state("ktu-user-figure-kinds", (:))
|
||||||
|
|
||||||
|
/// Validates author-supplied kinds and fills in defaults (`ref-name` falls back
|
||||||
|
/// to `supplement`).
|
||||||
|
#let __normalize-figure-kinds(kinds) = {
|
||||||
|
let normalized = (:)
|
||||||
|
for (key, spec) in kinds {
|
||||||
|
assert(
|
||||||
|
"supplement" in spec,
|
||||||
|
message: "figure kind `" + key + "` needs a `supplement`",
|
||||||
|
)
|
||||||
|
normalized.insert(key, (
|
||||||
|
supplement: spec.supplement,
|
||||||
|
ref-name: spec.at("ref-name", default: spec.supplement),
|
||||||
|
single-name: spec.at("single-name", default: spec.supplement),
|
||||||
|
))
|
||||||
|
}
|
||||||
|
normalized
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Recognized kinds merged with the author's. Must be called in a context.
|
||||||
|
#let __all-figure-kinds() = __figure-kinds + __USER_FIGURE_KINDS.get()
|
||||||
|
|
||||||
|
/// Resets all figure and equation counters (used when numbering per section).
|
||||||
|
/// Must be called in a context.
|
||||||
|
#let __reset-figure-counters() = {
|
||||||
|
let custom = (..__USER_FIGURE_KINDS.get().keys(),)
|
||||||
|
for kind in (image, table, raw, ..custom) {
|
||||||
|
counter(figure.where(kind: kind)).update(0)
|
||||||
|
}
|
||||||
|
counter(math.equation).update(0)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns the caption supplement text for a figure kind (e.g. `table`, `math.equation`).
|
||||||
|
#let __fig-supplement(func) = __figure-kinds.at(repr(func)).supplement
|
||||||
|
|
||||||
|
/// Finds the first recognized kind ("table", "image", "raw" or "equation") inside
|
||||||
|
/// `node`, descending through wrappers (align, block, grid, stack, ...).
|
||||||
|
/// Returns the key into `__figure-kinds`, or `none` if nothing is recognized.
|
||||||
|
#let __find-figure-kind(node) = {
|
||||||
|
if type(node) != content { return none }
|
||||||
|
|
||||||
|
let key = repr(node.func())
|
||||||
|
if key in __figure-kinds { return key }
|
||||||
|
|
||||||
|
// Single-child wrappers
|
||||||
|
for field in ("body", "child") {
|
||||||
|
if node.has(field) {
|
||||||
|
let found = __find-figure-kind(node.at(field))
|
||||||
|
if found != none { return found }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Multi-child containers
|
||||||
|
if node.has("children") {
|
||||||
|
for child in node.children {
|
||||||
|
let found = __find-figure-kind(child)
|
||||||
|
if found != none { return found }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
none
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Resolves the `__figure-kinds` key of a figure element. An explicit custom
|
||||||
|
/// (string) kind always wins; otherwise the kind is detected from the body.
|
||||||
|
#let __figure-key(fig) = {
|
||||||
|
if type(fig.kind) == str { return fig.kind }
|
||||||
|
let found = __find-figure-kind(fig.body)
|
||||||
|
if found != none { found } else { repr(fig.kind) }
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns the caption supplement of a figure element.
|
||||||
|
#let __figure-supplement-of(fig) = {
|
||||||
|
let key = __figure-key(fig)
|
||||||
|
let kinds = __all-figure-kinds()
|
||||||
|
assert(
|
||||||
|
key in kinds,
|
||||||
|
message: "unregistered figure kind `" + key + "`: register it with ktu-paper(figureKinds: ...)",
|
||||||
|
)
|
||||||
|
kinds.at(key).supplement
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
// Numbering
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/// Resolves a figure's number (global "1" or section-based "1.1") at `loc`,
|
||||||
|
/// returned as a string.
|
||||||
|
#let __get-figure-number(fig-item, loc) = {
|
||||||
|
assert(
|
||||||
|
type(fig-item) == content and fig-item.func() == figure,
|
||||||
|
message: "can only get figure number for figure elements",
|
||||||
|
)
|
||||||
|
|
||||||
|
let fig-counter = counter(figure.where(kind: fig-item.kind))
|
||||||
|
|
||||||
|
if __FIG_PER_SECTION.at(loc) {
|
||||||
|
let chapter = counter(heading).at(loc).at(0, default: 0)
|
||||||
|
let fig-num = fig-counter.at(loc).at(0, default: 1)
|
||||||
|
str(chapter) + "." + str(fig-num)
|
||||||
|
} else {
|
||||||
|
str(fig-counter.at(loc).at(0))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Resolves an equation's number (global "2" or section-based "1.2") at `loc` without parentheses.
|
||||||
|
/// `loc` is the location of the equation.
|
||||||
|
#let __get-equation-number(loc) = {
|
||||||
|
let number = counter(math.equation).at(loc).at(0)
|
||||||
|
if __FIG_PER_SECTION.at(loc) {
|
||||||
|
let chapter = counter(heading).at(loc).at(0, default: 0)
|
||||||
|
str(chapter) + "." + str(number)
|
||||||
|
} else {
|
||||||
|
str(number)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Numbering function for `math.equation`: "(2)" or, when numbering per
|
||||||
|
/// section, "(1.2)".
|
||||||
|
#let __equation-numbering(..nums) = context {
|
||||||
|
let number = nums.pos().first()
|
||||||
|
if __FIG_PER_SECTION.get() {
|
||||||
|
let chapter = counter(heading).get().at(0, default: 0)
|
||||||
|
// TODO: this is a hack to prevent the numbers from being completely
|
||||||
|
// part of a regex match against math.equation.
|
||||||
|
// It would be better to render math equation numbers as a separate element, so that regexes don't see them at all.
|
||||||
|
[(#box[#chapter].#box[#number])]
|
||||||
|
} else {
|
||||||
|
[(#number)]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns the number of a located figure element as a string, formatted
|
||||||
|
/// according to the current numbering scheme.
|
||||||
|
#let __get-locatable-element-number(element) = context {
|
||||||
|
assert(type(element) == content, message: "can only reference elements of type content")
|
||||||
|
assert(element.func() == figure, message: "referenced element does not have a figure function")
|
||||||
|
__get-figure-number(element, element.location())
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Appendix headings carry an "appendix-heading" metadata marker as their
|
||||||
|
/// first child and are numbered differently from normal headings.
|
||||||
|
#let __is-appendix-heading(item) = {
|
||||||
|
let body = item.body
|
||||||
|
body.has("children") and body.children.at(0, default: none) == metadata("appendix-heading")
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Parses a dotted number such as "12" or "1.12.5" into an array of ints.
|
||||||
|
/// Returns `none` if any part is not purely numeric.
|
||||||
|
#let __parse-number(value) = {
|
||||||
|
let parts = value.split(".")
|
||||||
|
if parts.all(p => p.match(regex("^\\d+$")) != none) {
|
||||||
|
parts.map(int)
|
||||||
|
} else {
|
||||||
|
none
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Sorts `(location, number)` entries. If every number is numeric (optionally
|
||||||
|
/// dotted, e.g. "1.12.5"), sorts component-wise numerically; otherwise falls
|
||||||
|
/// back to plain string ordering.
|
||||||
|
#let __sort-entries(entries) = {
|
||||||
|
let keys = entries.map(e => __parse-number(e.at(1)))
|
||||||
|
if keys.all(k => k != none) {
|
||||||
|
entries.zip(keys).sorted(key: pair => pair.at(1)).map(pair => pair.at(0))
|
||||||
|
} else {
|
||||||
|
entries.sorted(key: e => e.at(1))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
// Single-figure handling
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/// Figure kinds that are left unnumbered when the document contains only one
|
||||||
|
/// captioned figure of that kind: "Lentelė. Aprašas" and "(žr. lentelė)"
|
||||||
|
/// instead of "1 lentelė. Aprašas" and "(žr. 1 lentelė)". The word used comes
|
||||||
|
/// from the kind's `single-name`.
|
||||||
|
/// Keys are `__figure-key` values.
|
||||||
|
#let __UNNUMBERED_WHEN_SINGLE = ("table", "image")
|
||||||
|
|
||||||
|
/// Whether `fig` is the only captioned figure of its kind in the document and
|
||||||
|
/// its kind is listed in `__UNNUMBERED_WHEN_SINGLE`. Must be called in a context.
|
||||||
|
#let __is-single-unnumbered(fig) = {
|
||||||
|
if __figure-key(fig) not in __UNNUMBERED_WHEN_SINGLE { return false }
|
||||||
|
query(figure.where(kind: fig.kind)).filter(f => f.caption != none).len() == 1
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Capitalizes the first letter of `value` ("lentelė" -> "Lentelė").
|
||||||
|
#let __capitalize(value) = {
|
||||||
|
let first = value.first()
|
||||||
|
upper(first) + value.slice(first.len())
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Caption label of a figure element: "1 lentelė." normally, or
|
||||||
|
/// "Lentelė." for a single unnumbered figure.
|
||||||
|
#let __caption-label(fig) = context {
|
||||||
|
let supplement = __figure-supplement-of(fig)
|
||||||
|
if __is-single-unnumbered(fig) {
|
||||||
|
let name = __all-figure-kinds().at(__figure-key(fig)).single-name
|
||||||
|
[#__capitalize(name).]
|
||||||
|
} else {
|
||||||
|
[#__get-figure-number(fig, fig.location()) #supplement.]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
// References
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/// Returns a number for the given reference target.
|
||||||
|
/// Panics for a figure that is the only one of its kind,
|
||||||
|
/// since such figures have no number.
|
||||||
|
/// - target (label): Label to get the reference number for.
|
||||||
|
#let ref-no(target) = context {
|
||||||
|
if type(target) != label {
|
||||||
|
panic("ref-no expects a label as input")
|
||||||
|
}
|
||||||
|
|
||||||
|
let item = query(target).first()
|
||||||
|
let loc = item.location()
|
||||||
|
let kind = item.func()
|
||||||
|
|
||||||
|
let number = if kind == figure {
|
||||||
|
if __is-single-unnumbered(item) {
|
||||||
|
panic(
|
||||||
|
"ref-no: " + str(target) + " is the only " + __figure-key(item)
|
||||||
|
+ " in the document and is therefore unnumbered; "
|
||||||
|
+ "refer to it with @" + str(target) + " (or custom-ref) instead",
|
||||||
|
)
|
||||||
|
}
|
||||||
|
__get-figure-number(item, loc)
|
||||||
|
} else if kind == math.equation {
|
||||||
|
"(" + __get-equation-number(loc) + ")"
|
||||||
|
} else if kind == heading {
|
||||||
|
let numbers = counter(heading).at(loc)
|
||||||
|
if __is-appendix-heading(item) {
|
||||||
|
str(numbers.at(1))
|
||||||
|
} else {
|
||||||
|
numbers.map(str).join(".")
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
panic("referencing unknown type: " + repr(kind))
|
||||||
|
}
|
||||||
|
|
||||||
|
link(loc, number)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Create a custom reference for multiple targets of the same type.
|
||||||
|
/// - targets (label...): Labels to create a custom reference for.
|
||||||
|
#let custom-ref(..targets) = context {
|
||||||
|
let group-name = none
|
||||||
|
let single-name = none // set when the target is a lone, unnumbered figure
|
||||||
|
let entries = () // (location, number) pairs
|
||||||
|
|
||||||
|
for target in targets.pos() {
|
||||||
|
let item = query(target).first()
|
||||||
|
let loc = item.location()
|
||||||
|
|
||||||
|
let (name, number) = if item.func() == math.equation {
|
||||||
|
(__figure-kinds.equation.ref-name, __get-equation-number(loc))
|
||||||
|
} else if item.func() == figure {
|
||||||
|
let kind = __figure-key(item)
|
||||||
|
let kinds = __all-figure-kinds()
|
||||||
|
if kind not in kinds {
|
||||||
|
panic("unregistered figure kind `" + kind + "`: register it with ktu-paper(figureKinds: ...)")
|
||||||
|
}
|
||||||
|
if __is-single-unnumbered(item) { single-name = kinds.at(kind).single-name }
|
||||||
|
(kinds.at(kind).ref-name, __get-figure-number(item, loc))
|
||||||
|
} else {
|
||||||
|
panic("referencing unknown type: " + repr(item.func()))
|
||||||
|
}
|
||||||
|
|
||||||
|
if group-name != none and group-name != name {
|
||||||
|
panic("custom-ref does not support grouping different elements together")
|
||||||
|
}
|
||||||
|
group-name = name
|
||||||
|
entries.push((loc, number))
|
||||||
|
}
|
||||||
|
|
||||||
|
if entries.len() > 0 {
|
||||||
|
if single-name != none {
|
||||||
|
// The only figure of its kind: no number, e.g. "(žr. lentelė)"
|
||||||
|
[(žr. #link(entries.first().at(0), single-name))]
|
||||||
|
} else {
|
||||||
|
let links = __sort-entries(entries).map(e => link(e.at(0), e.at(1)))
|
||||||
|
[(žr. #links.join(", ") #group-name)]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Show rule for `@label` references. Equations render as a bare "(1.2)";
|
||||||
|
/// figures delegate to `custom-ref`, so "(žr. 1 pav.)" is built in one place.
|
||||||
|
/// Anything else (headings, citations, unregistered figure kinds) keeps
|
||||||
|
/// Typst's default rendering.
|
||||||
|
#let __format-ref(it) = {
|
||||||
|
let el = it.element
|
||||||
|
if el == none { return it }
|
||||||
|
|
||||||
|
if el.func() == math.equation {
|
||||||
|
let loc = el.location()
|
||||||
|
link(loc, "(" + __get-equation-number(loc) + ")")
|
||||||
|
} else if el.func() == figure and __figure-key(el) in __all-figure-kinds() {
|
||||||
|
custom-ref(it.target)
|
||||||
|
} else {
|
||||||
|
it
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
// Figure layout
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/// Formats a figure with a caption and number.
|
||||||
|
#let __format-figure(it) = {
|
||||||
|
let caption = it.caption
|
||||||
|
|
||||||
|
// If caption is not provided, just show the figure body
|
||||||
|
if caption == none { return it.body }
|
||||||
|
|
||||||
|
set text(size: 11pt)
|
||||||
|
|
||||||
|
let caption-line = [*#__caption-label(it)* #caption.body]
|
||||||
|
|
||||||
|
// Tables have captions at the top
|
||||||
|
if it.kind == table {
|
||||||
|
align(left, caption-line)
|
||||||
|
it.body
|
||||||
|
} else {
|
||||||
|
it.body
|
||||||
|
align(center, caption-line)
|
||||||
|
}
|
||||||
|
}
|
||||||
+80
-28
@@ -17,6 +17,7 @@
|
|||||||
#let ktu-author-table(
|
#let ktu-author-table(
|
||||||
authors: (),
|
authors: (),
|
||||||
alignment: right,
|
alignment: right,
|
||||||
|
namesFirst: true, // if false, roles will be displayed first
|
||||||
) = context {
|
) = context {
|
||||||
// The layout should be a list of lists whose elements are (name, role) pairs.
|
// The layout should be a list of lists whose elements are (name, role) pairs.
|
||||||
assert(authors.len() > 0, message: "author table must have at least one author")
|
assert(authors.len() > 0, message: "author table must have at least one author")
|
||||||
@@ -51,29 +52,43 @@
|
|||||||
table.header([]),
|
table.header([]),
|
||||||
..for author in authors {
|
..for author in authors {
|
||||||
let (name, role) = author
|
let (name, role) = author
|
||||||
(align(center)[
|
name = [*#name*]
|
||||||
|
if not namesFirst {
|
||||||
|
(role, name) = (name, role)
|
||||||
|
}
|
||||||
|
(
|
||||||
|
align(center)[
|
||||||
#set block(below: 8pt)
|
#set block(below: 8pt)
|
||||||
#block[*#name*]
|
#block[#name]
|
||||||
#block[#role]
|
#block[#role]
|
||||||
|
|
||||||
], [])
|
],
|
||||||
|
[],
|
||||||
|
)
|
||||||
}
|
}
|
||||||
))
|
))
|
||||||
} else {
|
} else {
|
||||||
align(alignment, table(
|
align(alignment, table(
|
||||||
columns: (198.5pt, 56.7pt),
|
columns: (198.5pt, 56.7pt),
|
||||||
table.header(
|
table.header([], []),
|
||||||
[], [],
|
|
||||||
),
|
|
||||||
..for author in authors {
|
..for author in authors {
|
||||||
let (name, role) = author
|
let (name, role) = author
|
||||||
(align(left)[
|
name = [*#name*]
|
||||||
|
if not namesFirst {
|
||||||
|
(role, name) = (name, role)
|
||||||
|
}
|
||||||
|
(
|
||||||
|
align(left)[
|
||||||
#set block(below: 8pt)
|
#set block(below: 8pt)
|
||||||
#block[*#name*]
|
#block[#name]
|
||||||
#block[#role]
|
#block[#role]
|
||||||
|
|
||||||
], [], [], [])
|
],
|
||||||
}
|
[],
|
||||||
|
[],
|
||||||
|
[],
|
||||||
|
)
|
||||||
|
},
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -128,8 +143,9 @@
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
#let ktu-heading-page-centered(
|
#let ktu-heading-page(
|
||||||
faculty: highlight[Fakulteto pavadinimas],
|
faculty: highlight[Fakulteto pavadinimas],
|
||||||
|
department: none, // optional
|
||||||
title: highlight[Rašto darbo pavadinimas],
|
title: highlight[Rašto darbo pavadinimas],
|
||||||
subtitles: highlight[Praktikos ataskaita / referatas ir pan. (įrašyti rašto darbo tipą)],
|
subtitles: highlight[Praktikos ataskaita / referatas ir pan. (įrašyti rašto darbo tipą)],
|
||||||
authors: (
|
authors: (
|
||||||
@@ -138,44 +154,80 @@
|
|||||||
),
|
),
|
||||||
place: highlight[Kaunas],
|
place: highlight[Kaunas],
|
||||||
year: highlight[#datetime.today().year()],
|
year: highlight[#datetime.today().year()],
|
||||||
|
centerAuthors: false,
|
||||||
|
authorNamesFirst: true, // if false, roles will be displayed first
|
||||||
) = {
|
) = {
|
||||||
let isArr = type(subtitles) == array
|
let subHeaders = (faculty,)
|
||||||
if not isArr {
|
if department != none {
|
||||||
|
subHeaders = (faculty, department)
|
||||||
|
}
|
||||||
|
if type(subtitles) != array {
|
||||||
subtitles = (subtitles,)
|
subtitles = (subtitles,)
|
||||||
}
|
}
|
||||||
ktu-title-header-block(
|
ktu-title-header-block(
|
||||||
subHeaders: (faculty,),
|
subHeaders: subHeaders,
|
||||||
bigTitle: title,
|
bigTitle: title,
|
||||||
subTitles: subtitles,
|
subTitles: subtitles,
|
||||||
)
|
)
|
||||||
v(94pt)
|
v(94pt)
|
||||||
ktu-author-table(authors: authors, alignment: center)
|
if centerAuthors {
|
||||||
align(center+bottom, block([*#place, #year*]))
|
ktu-author-table(authors: authors, namesFirst: authorNamesFirst, alignment: center)
|
||||||
|
} else {
|
||||||
|
ktu-author-table(authors: authors, namesFirst: authorNamesFirst)
|
||||||
|
}
|
||||||
|
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: (
|
||||||
|
(highlight[Vardenis Pavardenis], highlight[Projekto autorius]),
|
||||||
|
(highlight[Vardenis Pavardenis], highlight[Vadovas]),
|
||||||
|
),
|
||||||
|
authorNamesFirst: true, // if false, roles will be displayed first
|
||||||
|
place: highlight[Kaunas],
|
||||||
|
year: highlight[#datetime.today().year()],
|
||||||
|
) = {
|
||||||
|
ktu-heading-page(
|
||||||
|
faculty: faculty,
|
||||||
|
department: department,
|
||||||
|
title: title,
|
||||||
|
subtitles: subtitles,
|
||||||
|
authors: authors,
|
||||||
|
place: place,
|
||||||
|
year: year,
|
||||||
|
centerAuthors: true,
|
||||||
|
authorNamesFirst: authorNamesFirst,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
#let ktu-heading-page-normal(
|
#let ktu-heading-page-normal(
|
||||||
faculty: highlight[Fakulteto pavadinimas],
|
faculty: highlight[Fakulteto pavadinimas],
|
||||||
|
department: none, // optional
|
||||||
title: highlight[Rašto darbo pavadinimas],
|
title: highlight[Rašto darbo pavadinimas],
|
||||||
subtitles: highlight[Praktikos ataskaita / referatas ir pan. (įrašyti rašto darbo tipą)],
|
subtitles: highlight[Praktikos ataskaita / referatas ir pan. (įrašyti rašto darbo tipą)],
|
||||||
authors: (
|
authors: (
|
||||||
(highlight[Vardenis Pavardenis], highlight[Projekto autorius]),
|
(highlight[Vardenis Pavardenis], highlight[Projekto autorius]),
|
||||||
(highlight[Vardenis Pavardenis], highlight[Vadovas]),
|
(highlight[Vardenis Pavardenis], highlight[Vadovas]),
|
||||||
),
|
),
|
||||||
|
authorNamesFirst: true, // if false, roles will be displayed first
|
||||||
place: highlight[Kaunas],
|
place: highlight[Kaunas],
|
||||||
year: highlight[#datetime.today().year()],
|
year: highlight[#datetime.today().year()],
|
||||||
) = {
|
) = {
|
||||||
let isArr = type(subtitles) == array
|
ktu-heading-page(
|
||||||
if not isArr {
|
faculty: faculty,
|
||||||
subtitles = (subtitles,)
|
department: department,
|
||||||
}
|
title: title,
|
||||||
ktu-title-header-block(
|
subtitles: subtitles,
|
||||||
subHeaders: (faculty,),
|
authors: authors,
|
||||||
bigTitle: title,
|
place: place,
|
||||||
subTitles: subtitles,
|
year: year,
|
||||||
|
centerAuthors: false,
|
||||||
|
authorNamesFirst: authorNamesFirst,
|
||||||
)
|
)
|
||||||
v(94pt)
|
|
||||||
ktu-author-table(authors: authors)
|
|
||||||
align(center+bottom, block([*#place, #year*]))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#let ktu-academic-honestly-declaration-page(
|
#let ktu-academic-honestly-declaration-page(
|
||||||
@@ -186,7 +238,7 @@
|
|||||||
ktu-title-header-block(
|
ktu-title-header-block(
|
||||||
subHeaders: (faculty, author),
|
subHeaders: (faculty, author),
|
||||||
bigTitle: projectTitle,
|
bigTitle: projectTitle,
|
||||||
subTitles: ("Akademinio sąžiningumo deklaracija",)
|
subTitles: ("Akademinio sąžiningumo deklaracija",),
|
||||||
)
|
)
|
||||||
v(20pt)
|
v(20pt)
|
||||||
[
|
[
|
||||||
|
|||||||
+159
-267
@@ -1,49 +1,56 @@
|
|||||||
#import "@preview/codly:1.3.0": codly, codly-init
|
#import "@preview/codly:1.3.0": codly, codly-init
|
||||||
#import "config.typ": debug-author-table, enable-heading-experiment, __HEADING_EXPERIMENT
|
#import "config.typ": debug-author-table, enable-heading-experiment, __HEADING_EXPERIMENT, __FIG_PER_SECTION, __UPPERCASE_SECTION_TITLES
|
||||||
#import "fragments.typ": (
|
#import "fragments.typ": (
|
||||||
ktu-table,
|
ktu-table,
|
||||||
ktu-heading-page-centered, ktu-heading-page-normal, ktu-academic-honestly-declaration-page
|
|
||||||
|
// building blocks
|
||||||
|
ktu-author-table, ktu-title-header-block,
|
||||||
|
|
||||||
|
ktu-heading-page, ktu-heading-page-centered, ktu-heading-page-normal,
|
||||||
|
ktu-academic-honestly-declaration-page
|
||||||
|
)
|
||||||
|
#import "figures.typ": (
|
||||||
|
ref-no, custom-ref,
|
||||||
|
|
||||||
|
__caption-label,
|
||||||
|
__reset-figure-counters,
|
||||||
|
__equation-numbering,
|
||||||
|
__normalize-figure-kinds,
|
||||||
|
__USER_FIGURE_KINDS,
|
||||||
|
|
||||||
|
__format-ref,
|
||||||
|
__format-figure,
|
||||||
)
|
)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Paruošta pagal "Rašto ..."
|
* Paruošta pagal "Rašto ..."
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Further reading required:
|
* Further reading required:
|
||||||
* - Double line spacing | https://github.com/typst/typst/issues/106
|
* - Double line spacing | https://github.com/typst/typst/issues/106
|
||||||
* - Proposal: change `leading` option to `line-height` | https://github.com/typst/typst/issues/4224
|
* - 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.
|
/// Insert a heading without a number.
|
||||||
///
|
///
|
||||||
/// Usually used for introductory or summary sections at the start and end.
|
/// 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) = {
|
#let unnumbered-heading(headingElement, alignLeft: false) = {
|
||||||
set heading(numbering: none)
|
let fields = headingElement.fields()
|
||||||
[#text]
|
let body = fields.body
|
||||||
}
|
let level = fields.at("level", default: 1)
|
||||||
|
|
||||||
#let figureDefinitions = (
|
if alignLeft {
|
||||||
table: (
|
body = body + __METADATA_HEADING_ALIGN_LEFT
|
||||||
outlineFormat: (number) => [*#number lentelė.*],
|
}
|
||||||
captionFormat: (number) => [*#number lentelė.*],
|
|
||||||
),
|
|
||||||
)
|
|
||||||
|
|
||||||
#let custom-figure(
|
heading(level: level, numbering: none, body)
|
||||||
kind,
|
|
||||||
caption: none,
|
|
||||||
body
|
|
||||||
) = {
|
|
||||||
figure(
|
|
||||||
body,
|
|
||||||
kind: kind,
|
|
||||||
caption: caption,
|
|
||||||
supplement: "CUSTOM-FIGURE"
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#let appendix-item(body) = {
|
#let appendix-item(body) = {
|
||||||
@@ -54,22 +61,13 @@
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Stores localized names for various figure types
|
|
||||||
#let figureNames = (
|
|
||||||
table: ("lentelė"),
|
|
||||||
image: ("pav"),
|
|
||||||
code: ("kodo frag"),
|
|
||||||
equation: ("lygtis"),
|
|
||||||
)
|
|
||||||
|
|
||||||
// Utility function to round numbers with padded zeros
|
// Utility function to round numbers with padded zeros
|
||||||
#let round-and-pad(number, decimals) = {
|
#let round-and-pad(number, decimals) = {
|
||||||
let rounded = calc.round(number, digits: decimals)
|
let rounded = calc.round(number, digits: decimals)
|
||||||
let s = str(rounded)
|
let s = str(rounded)
|
||||||
let parts = s.split(".")
|
let parts = s.split(".")
|
||||||
let integer-part = parts.at(0)
|
let integer-part = parts.at(0)
|
||||||
let decimal-part = if parts.len() == 2 { parts.at(1) } else { ""}
|
let decimal-part = if parts.len() == 2 { parts.at(1) } else { "" }
|
||||||
|
|
||||||
|
|
||||||
let padded-decimal = if decimals > 0 {
|
let padded-decimal = if decimals > 0 {
|
||||||
let current-decimal-length = decimal-part.len()
|
let current-decimal-length = decimal-part.len()
|
||||||
@@ -90,120 +88,6 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// Returns a number for the given reference target.
|
|
||||||
/// - target (label): Label to get the reference number for.
|
|
||||||
#let ref-no(target) = context {
|
|
||||||
let loc = locate(target)
|
|
||||||
let elem = query(target)
|
|
||||||
let item = elem.at(0)
|
|
||||||
|
|
||||||
// If it's a figure, return the figure number
|
|
||||||
if item.func() == figure {
|
|
||||||
link(loc, [#counter(figure.where(kind: item.kind)).at(loc).at(0)])
|
|
||||||
} else if item.func() == heading {
|
|
||||||
let fullValue = counter(heading).at(loc)
|
|
||||||
|
|
||||||
// If the heading has the "appendix-heading" metadata attached,
|
|
||||||
// it means that it's an appendix heading and should be numbered differently
|
|
||||||
if item.body.has("children") and item.body.children.at(0) == metadata("appendix-heading") {
|
|
||||||
link(loc, [#fullValue.at(1)])
|
|
||||||
// Otherwise, show the fully qualified heading numbering
|
|
||||||
} else {
|
|
||||||
link(loc, [#fullValue.map((x) => str(x)).join(".")])
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
panic("referencing unknown type: ", item.func())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#let __ref-no-element(element) = context {
|
|
||||||
// Ensure that we pass an element
|
|
||||||
if type(element) != content {
|
|
||||||
panic("can only reference elements of type content")
|
|
||||||
}
|
|
||||||
let loc = element.location()
|
|
||||||
let elem = query(loc)
|
|
||||||
let fig = elem.at(0)
|
|
||||||
if fig.func() != figure {
|
|
||||||
panic("referencing unknown type: " + fig.func())
|
|
||||||
}
|
|
||||||
fig.caption.counter.at(loc).at(0)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Constructs a reference from multiple targets
|
|
||||||
#let custom-ref(..targets) = context {
|
|
||||||
let collected = (:)
|
|
||||||
|
|
||||||
for target in targets.pos() {
|
|
||||||
let loc = locate(target)
|
|
||||||
let elem = query(target)
|
|
||||||
|
|
||||||
let fig = elem.at(0)
|
|
||||||
if fig.func() != figure {
|
|
||||||
panic("referencing unknown type")
|
|
||||||
}
|
|
||||||
|
|
||||||
// determine what we...
|
|
||||||
let element = fig.body;
|
|
||||||
let elementName = "unknown";
|
|
||||||
let found = false;
|
|
||||||
while not found {
|
|
||||||
|
|
||||||
// If it's a grid
|
|
||||||
if (element.func() == grid) {
|
|
||||||
for cell in element.children {
|
|
||||||
if cell.body.func() == image {
|
|
||||||
elementName = "pav."
|
|
||||||
found = true
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break
|
|
||||||
}
|
|
||||||
|
|
||||||
if (element.func() == table) {
|
|
||||||
elementName = "lentelė"
|
|
||||||
found = true
|
|
||||||
break
|
|
||||||
}
|
|
||||||
|
|
||||||
if (element.func() == raw) {
|
|
||||||
elementName = "kodo frag."
|
|
||||||
found = true
|
|
||||||
break
|
|
||||||
}
|
|
||||||
|
|
||||||
if (element.func() == image) {
|
|
||||||
elementName = "pav."
|
|
||||||
found = true
|
|
||||||
break
|
|
||||||
}
|
|
||||||
|
|
||||||
panic("unknown element", element.func())
|
|
||||||
}
|
|
||||||
|
|
||||||
if elementName not in collected {
|
|
||||||
collected.insert(elementName, ())
|
|
||||||
}
|
|
||||||
|
|
||||||
collected.at(elementName).push(
|
|
||||||
(loc, fig.caption.counter.at(loc).at(0))
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
if collected.len() > 1 {
|
|
||||||
panic("multiple types detected")
|
|
||||||
}
|
|
||||||
|
|
||||||
for type in collected {
|
|
||||||
let name = type.at(0)
|
|
||||||
let arr = type.at(1).sorted(key: k => k.at(1))
|
|
||||||
|
|
||||||
[(žr. #arr.map(x =>link(x.at(0), [#x.at(1)])).join(", ") #name)]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// Returns a KTU template-conformant outline.
|
/// Returns a KTU template-conformant outline.
|
||||||
/// - depth (int | none): Same as outline depth.
|
/// - depth (int | none): Same as outline depth.
|
||||||
/// - indent (auto | function | relative): Same as outline indent.
|
/// - indent (auto | function | relative): Same as outline indent.
|
||||||
@@ -214,7 +98,7 @@
|
|||||||
depth: none,
|
depth: none,
|
||||||
indent: 0em, // Disable the default outline indenting
|
indent: 0em, // Disable the default outline indenting
|
||||||
target: heading,
|
target: heading,
|
||||||
title: auto
|
title: auto,
|
||||||
) = {
|
) = {
|
||||||
// TODO: įtrauka
|
// TODO: įtrauka
|
||||||
set block(spacing: 0em)
|
set block(spacing: 0em)
|
||||||
@@ -222,6 +106,9 @@
|
|||||||
show outline: o => context {
|
show outline: o => context {
|
||||||
// If it's a heading, show the default outline with bold text
|
// If it's a heading, show the default outline with bold text
|
||||||
if (o.target == selector(heading)) {
|
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
|
// Define known target widths based on KTU template
|
||||||
let targets = (0.64cm, 0.96cm, 1.28cm, 1.6cm, 1.92cm)
|
let targets = (0.64cm, 0.96cm, 1.28cm, 1.6cm, 1.92cm)
|
||||||
|
|
||||||
@@ -237,9 +124,25 @@
|
|||||||
target = 0.64cm
|
target = 0.64cm
|
||||||
}
|
}
|
||||||
let newGap = target - measurement.width
|
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(
|
link(
|
||||||
it.element.location(),
|
it.element.location(),
|
||||||
it.indented(prefixContent, it.inner(), gap: newGap),
|
it.indented(prefixContent, formattedInner, gap: newGap),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -252,7 +155,10 @@
|
|||||||
} else if (o.target == figure.where(kind: image)) {
|
} else if (o.target == figure.where(kind: image)) {
|
||||||
show outline.entry: it => link(
|
show outline.entry: it => link(
|
||||||
it.element.location(),
|
it.element.location(),
|
||||||
it.indented([*#__ref-no-element(it.element) #figureNames.image.*], [ #it.inner()], gap: 0pt),
|
it.indented(
|
||||||
|
[*#__caption-label(it.element)*],
|
||||||
|
[ #it.inner()], gap: 0pt
|
||||||
|
),
|
||||||
)
|
)
|
||||||
o
|
o
|
||||||
|
|
||||||
@@ -260,7 +166,10 @@
|
|||||||
} else if (o.target == figure.where(kind: table)) {
|
} else if (o.target == figure.where(kind: table)) {
|
||||||
show outline.entry: it => link(
|
show outline.entry: it => link(
|
||||||
it.element.location(),
|
it.element.location(),
|
||||||
it.indented([*#__ref-no-element(it.element) #figureNames.table.*], [ #it.inner()], gap: 0pt),
|
it.indented(
|
||||||
|
[*#__caption-label(it.element)*],
|
||||||
|
[ #it.inner()], gap: 0pt
|
||||||
|
),
|
||||||
)
|
)
|
||||||
o
|
o
|
||||||
|
|
||||||
@@ -268,7 +177,10 @@
|
|||||||
} else if (o.target == figure.where(kind: raw)) {
|
} else if (o.target == figure.where(kind: raw)) {
|
||||||
show outline.entry: it => link(
|
show outline.entry: it => link(
|
||||||
it.element.location(),
|
it.element.location(),
|
||||||
it.indented([*#__ref-no-element(it.element) #figureNames.code.*], [ #it.inner()], gap: 0pt),
|
it.indented(
|
||||||
|
[*#__caption-label(it.element)*],
|
||||||
|
[ #it.inner()], gap: 0pt
|
||||||
|
),
|
||||||
)
|
)
|
||||||
o
|
o
|
||||||
|
|
||||||
@@ -284,9 +196,13 @@
|
|||||||
#(o.target == selector(heading))
|
#(o.target == selector(heading))
|
||||||
]*/
|
]*/
|
||||||
|
|
||||||
|
// Any other figure kind (generally, user defined kinds)
|
||||||
show outline.entry: it => link(
|
show outline.entry: it => link(
|
||||||
it.element.location(),
|
it.element.location(),
|
||||||
it.indented([*#__ref-no-element(it.element) unknown.*], it.inner(), gap: 0pt),
|
it.indented(
|
||||||
|
[*#__caption-label(it.element)*],
|
||||||
|
[ #it.inner()], gap: 0pt
|
||||||
|
),
|
||||||
)
|
)
|
||||||
o
|
o
|
||||||
}
|
}
|
||||||
@@ -294,19 +210,6 @@
|
|||||||
outline(depth: depth, indent: indent, target: target, title: title)
|
outline(depth: depth, indent: indent, target: target, title: title)
|
||||||
}
|
}
|
||||||
|
|
||||||
#let func-to-name(func) = {
|
|
||||||
if func == table {
|
|
||||||
return "lentelė"
|
|
||||||
}
|
|
||||||
if func == image {
|
|
||||||
return "pav."
|
|
||||||
}
|
|
||||||
if func == grid {
|
|
||||||
return "pav."
|
|
||||||
}
|
|
||||||
return func
|
|
||||||
}
|
|
||||||
|
|
||||||
// Doesn't work in Typst 0.12.0 due to relative paths
|
// Doesn't work in Typst 0.12.0 due to relative paths
|
||||||
#let bibliography-list(path) = {
|
#let bibliography-list(path) = {
|
||||||
bibliography(path, title: "Literatūros sąrašas", full: true)
|
bibliography(path, title: "Literatūros sąrašas", full: true)
|
||||||
@@ -322,7 +225,7 @@
|
|||||||
depth: none,
|
depth: none,
|
||||||
indent: 0em, // Disable the default outline indenting
|
indent: 0em, // Disable the default outline indenting
|
||||||
target: heading,
|
target: heading,
|
||||||
title: auto
|
title: auto,
|
||||||
) = {
|
) = {
|
||||||
__ktu_outline(depth: depth, indent: indent, target: target, title: title)
|
__ktu_outline(depth: depth, indent: indent, target: target, title: title)
|
||||||
}
|
}
|
||||||
@@ -339,6 +242,10 @@
|
|||||||
ktu-outline(title: heading("Paveikslų sąrašas", outlined: true), target: figure.where(kind: image))
|
ktu-outline(title: heading("Paveikslų sąrašas", outlined: true), target: figure.where(kind: image))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#let ktu-code-list() = {
|
||||||
|
ktu-outline(title: heading("Kodo fragmentų sąrašas", outlined: true), target: figure.where(kind: raw))
|
||||||
|
}
|
||||||
|
|
||||||
/// Define a custom outline for a specific figure type.
|
/// Define a custom outline for a specific figure type.
|
||||||
/// This function creates an outline entry with a specified title and figure type.
|
/// This function creates an outline entry with a specified title and figure type.
|
||||||
/// The outline entry will link to the figure of the specified type.
|
/// The outline entry will link to the figure of the specified type.
|
||||||
@@ -361,7 +268,7 @@
|
|||||||
body
|
body
|
||||||
}
|
}
|
||||||
|
|
||||||
#let __page_rules(body) = {
|
#let __page_rules(font: "Times New Roman", body) = {
|
||||||
// Page size and margins
|
// Page size and margins
|
||||||
set page(
|
set page(
|
||||||
paper: "a4",
|
paper: "a4",
|
||||||
@@ -371,8 +278,8 @@
|
|||||||
left: 30mm,
|
left: 30mm,
|
||||||
right: 10mm,
|
right: 10mm,
|
||||||
bottom: 20mm,
|
bottom: 20mm,
|
||||||
top: 20mm
|
top: 20mm,
|
||||||
)
|
),
|
||||||
)
|
)
|
||||||
set page(width: 595pt, height: 842pt)
|
set page(width: 595pt, height: 842pt)
|
||||||
|
|
||||||
@@ -386,11 +293,11 @@
|
|||||||
set heading(numbering: "1.")
|
set heading(numbering: "1.")
|
||||||
|
|
||||||
// Number equations
|
// Number equations
|
||||||
set math.equation(numbering: "(1)")
|
set math.equation(numbering: __equation-numbering)
|
||||||
|
|
||||||
// Set text font
|
// Set text font
|
||||||
set text(
|
set text(
|
||||||
font: "Times New Roman",
|
font: font,
|
||||||
size: 12pt,
|
size: 12pt,
|
||||||
lang: "lt",
|
lang: "lt",
|
||||||
// Change where the bounding box is drawn for the text
|
// Change where the bounding box is drawn for the text
|
||||||
@@ -411,8 +318,13 @@
|
|||||||
body
|
body
|
||||||
}
|
}
|
||||||
|
|
||||||
#let setup-page(body) = {
|
#let setup-page(
|
||||||
show: __page_rules.with()
|
font: "Times New Roman",
|
||||||
|
uppercaseSectionTitles: false,
|
||||||
|
unnumberedHeadingAlignment: center,
|
||||||
|
body,
|
||||||
|
) = {
|
||||||
|
show: __page_rules.with(font: font)
|
||||||
|
|
||||||
// Pagal formaliuosius rašto darbų reikalavimus
|
// Pagal formaliuosius rašto darbų reikalavimus
|
||||||
|
|
||||||
@@ -424,6 +336,14 @@
|
|||||||
set par(justify: true)
|
set par(justify: true)
|
||||||
set linebreak(justify: true)
|
set linebreak(justify: true)
|
||||||
|
|
||||||
|
let maybe-uppercase(body) = {
|
||||||
|
if uppercaseSectionTitles {
|
||||||
|
upper(body)
|
||||||
|
} else {
|
||||||
|
body
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Antraštės
|
// Antraštės
|
||||||
// Force them into blocks so they don't count as paragraphs
|
// Force them into blocks so they don't count as paragraphs
|
||||||
show heading: it => {
|
show heading: it => {
|
||||||
@@ -441,25 +361,37 @@
|
|||||||
|
|
||||||
// Antraštė be nr.
|
// Antraštė be nr.
|
||||||
if it.numbering == none {
|
if it.numbering == none {
|
||||||
// Centruota lygiuotė
|
// Centruota lygiuotė by default, but can be overridden by the user
|
||||||
set align(center)
|
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
|
// atstumas prieš ir po antraštės - 10 pt
|
||||||
block[#it.body]
|
block[#maybe-uppercase(it.body)]
|
||||||
if useExperiment {
|
if useExperiment {
|
||||||
v(10pt)
|
v(10pt)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Skyrius
|
// Skyrius
|
||||||
if it.numbering != none and it.level == 1 {
|
if it.numbering != none and it.level == 1 {
|
||||||
// abipusė lygiuotė
|
// abipusė lygiuotė
|
||||||
set par(justify: true)
|
set par(justify: true)
|
||||||
//set align
|
|
||||||
|
// Reset figure counters if numbering per section is enabled
|
||||||
|
if __FIG_PER_SECTION.get() {
|
||||||
|
__reset-figure-counters()
|
||||||
|
}
|
||||||
|
|
||||||
// po antraštės - 10 pt
|
// po antraštės - 10 pt
|
||||||
block[#counter(heading).display() #it.body]
|
block[#counter(heading).display() #maybe-uppercase(it.body)]
|
||||||
if useExperiment {
|
if useExperiment {
|
||||||
v(10pt)
|
v(10pt)
|
||||||
}
|
}
|
||||||
@@ -487,94 +419,54 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Override references for equations
|
// Reference style and numbering
|
||||||
show ref: it => {
|
show ref: it => __format-ref(it)
|
||||||
let el = it.element
|
|
||||||
|
|
||||||
if el == none {
|
// Figure captions and numbering
|
||||||
return it
|
show figure: it => __format-figure(it)
|
||||||
}
|
|
||||||
|
|
||||||
// Override equation references
|
// Bibliography citing style
|
||||||
if el.func() == math.equation {
|
|
||||||
link(
|
|
||||||
el.location(),
|
|
||||||
numbering(el.numbering, ..counter(math.equation).at(el.location()))
|
|
||||||
)
|
|
||||||
// Override references to figures
|
|
||||||
} else if el.func() == figure {
|
|
||||||
let fig = el.body
|
|
||||||
let figType = fig.func()
|
|
||||||
link(el.location(), [
|
|
||||||
(žr. #numbering(el.numbering, ..counter(figure.where(kind: figType)).at(el.location())) #func-to-name(figType))
|
|
||||||
])
|
|
||||||
} else {
|
|
||||||
it
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Change captions for figures
|
|
||||||
show figure: it => {
|
|
||||||
let separator = [.]
|
|
||||||
let caption = it.caption
|
|
||||||
|
|
||||||
// If caption is not provided, just show the figure body
|
|
||||||
if caption == none {
|
|
||||||
it.body
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
let counter = caption.counter
|
|
||||||
let supplement = caption.supplement
|
|
||||||
|
|
||||||
if it.body.func() == math.equation {
|
|
||||||
supplement = figureNames.equation
|
|
||||||
} else if it.kind == image {
|
|
||||||
supplement = figureNames.image
|
|
||||||
} else if it.kind == table {
|
|
||||||
supplement = figureNames.table
|
|
||||||
} else if it.kind == raw {
|
|
||||||
supplement = figureNames.code
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Tables have captions at the top
|
|
||||||
set text(size: 11pt)
|
|
||||||
if it.kind == table {
|
|
||||||
{set align(left)
|
|
||||||
[*#context counter.display(caption.numbering) #supplement#separator* #caption.body]}
|
|
||||||
it.body
|
|
||||||
} else {
|
|
||||||
it.body
|
|
||||||
[*#context counter.display(caption.numbering) #supplement#separator* #caption.body]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Lentelės pirma eilutė
|
|
||||||
/*
|
|
||||||
show table.cell.where(y: 0): it => context {
|
|
||||||
set align(left)
|
|
||||||
set par(justify: false)
|
|
||||||
set text(size: TableHeadSize.get()) // Šrifto dydis
|
|
||||||
v(3pt)
|
|
||||||
// Paryškintas
|
|
||||||
[*#it*]
|
|
||||||
v(3pt)
|
|
||||||
}
|
|
||||||
|
|
||||||
show table.cell: it => context {
|
|
||||||
set align(left)
|
|
||||||
set par(justify: false)
|
|
||||||
set text(size: TableCellSize.get())
|
|
||||||
v(3pt)
|
|
||||||
[#it]
|
|
||||||
v(3pt)
|
|
||||||
}*/
|
|
||||||
|
|
||||||
// Set bibliography and citing style
|
|
||||||
set bibliography(style: "assets/iso690-numeric-lt.csl")
|
set bibliography(style: "assets/iso690-numeric-lt.csl")
|
||||||
|
|
||||||
// Return the body
|
// Block equations are left-aligned
|
||||||
|
show math.equation.where(block: true): it => {
|
||||||
|
align(left, it)
|
||||||
|
}
|
||||||
|
|
||||||
body
|
body
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Configure the template for a KTU 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.
|
||||||
|
/// - figureKinds (dictionary): Extra figure kinds, e.g.
|
||||||
|
/// `(command: (supplement: "komanda", ref-name: "komanda", single-name: "komanda"))`.
|
||||||
|
/// Use them with `figure(kind: "command", ...)`. Keys:
|
||||||
|
/// - `supplement` (required): text after the number in captions, e.g. "1 komanda.".
|
||||||
|
/// - `ref-name`: text used in references, e.g. "(žr. 1 komanda)". Defaults to `supplement`.
|
||||||
|
/// - `single-name`: full word used when the figure is the only one of its kind
|
||||||
|
/// and is left unnumbered, e.g. "Komanda." and "(žr. komanda)". Defaults to `supplement`.
|
||||||
|
/// Currently only tables and images are left unnumbered when single, so this only matters for kinds added there.
|
||||||
|
#let ktu-paper(
|
||||||
|
font: "Times New Roman",
|
||||||
|
figureNumberingPerSection: false,
|
||||||
|
figureKinds: (:),
|
||||||
|
// 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,
|
||||||
|
uppercaseSectionTitles: uppercaseSectionTitles,
|
||||||
|
unnumberedHeadingAlignment: unnumberedHeadingAlignment,
|
||||||
|
)
|
||||||
|
__FIG_PER_SECTION.update(figureNumberingPerSection)
|
||||||
|
__USER_FIGURE_KINDS.update(__normalize-figure-kinds(figureKinds))
|
||||||
|
__UPPERCASE_SECTION_TITLES.update(uppercaseSectionTitles)
|
||||||
|
body
|
||||||
|
}
|
||||||
@@ -0,0 +1,150 @@
|
|||||||
|
#import "../src/lib.typ": (
|
||||||
|
ktu-paper, setup-code,
|
||||||
|
ktu-table-of-contents, ktu-picture-list, ktu-table-list, ktu-code-list,
|
||||||
|
ktu-heading-page-normal,
|
||||||
|
ktu-table,
|
||||||
|
unnumbered-heading,
|
||||||
|
custom-ref, ref-no
|
||||||
|
)
|
||||||
|
|
||||||
|
#show: ktu-paper.with(
|
||||||
|
font: "Times New Roman", // or Arial
|
||||||
|
figureNumberingPerSection: true,
|
||||||
|
figureKinds: (
|
||||||
|
veryCustomKind: (supplement: "komanda", ref-name: "komanda"),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
#show: setup-code.with()
|
||||||
|
|
||||||
|
#show math.equation: it => {
|
||||||
|
show regex("\d+\.\d+"): it => {show ".": {","+h(0pt)}
|
||||||
|
it}
|
||||||
|
it
|
||||||
|
}
|
||||||
|
|
||||||
|
#ktu-heading-page-normal(
|
||||||
|
faculty: highlight[Informatikos fakultetas],
|
||||||
|
title: highlight[Laboratorinio darbo ataskaitos pavadinimas],
|
||||||
|
subtitles: (
|
||||||
|
"Laboratorinio darbo ataskaita",
|
||||||
|
highlight[Studijų modulio pavadinimas (kodas)]
|
||||||
|
),
|
||||||
|
authors: (
|
||||||
|
(highlight[Vardenis Pavardenis], "Ataskaitą parengė"),
|
||||||
|
(highlight[Pareigų ir mokslo laipsnio sutrumpinimas Vardenis Pavardenis], "Laboratoriniam darbui vadovavo"),
|
||||||
|
),
|
||||||
|
authorNamesFirst: false,
|
||||||
|
place: "Kaunas",
|
||||||
|
year: datetime.today().year(),
|
||||||
|
)
|
||||||
|
#pagebreak()
|
||||||
|
#set page(numbering: "1")
|
||||||
|
|
||||||
|
#ktu-table-of-contents()
|
||||||
|
#pagebreak()
|
||||||
|
|
||||||
|
#ktu-picture-list()
|
||||||
|
#pagebreak()
|
||||||
|
|
||||||
|
#ktu-table-list()
|
||||||
|
#pagebreak()
|
||||||
|
|
||||||
|
#ktu-code-list()
|
||||||
|
#pagebreak()
|
||||||
|
|
||||||
|
#unnumbered-heading[= Įvadas]
|
||||||
|
#lorem(50)
|
||||||
|
|
||||||
|
#pagebreak()
|
||||||
|
= Skyrius
|
||||||
|
#lorem(50)
|
||||||
|
|
||||||
|
== Poskyrius
|
||||||
|
#lorem(50)
|
||||||
|
|
||||||
|
=== Dalis
|
||||||
|
#lorem(50)
|
||||||
|
|
||||||
|
#pagebreak()
|
||||||
|
= Komponentai
|
||||||
|
|
||||||
|
== Paveikslai
|
||||||
|
Galima gauti paveikslo numerį #ref-no(<image-label>) arba visą paveikslo nuorodą #custom-ref(<image-label>).
|
||||||
|
|
||||||
|
#figure(
|
||||||
|
image("images/santaka.png", width: 70%),
|
||||||
|
caption: [
|
||||||
|
Paveikslo pavadinimas
|
||||||
|
],
|
||||||
|
) <image-label>
|
||||||
|
|
||||||
|
|
||||||
|
== Paveikslų "grid" išdėstymas
|
||||||
|
Paveikslus taip pat galima sudėti į "grid" išdėstymą, į jį kreiptis kaip numerį #ref-no(<image-grid-label>) arba visą nuorodą #custom-ref(<image-grid-label>).
|
||||||
|
|
||||||
|
#figure(grid(
|
||||||
|
columns: 2,
|
||||||
|
gutter: 2mm,
|
||||||
|
image("images/santaka.png", width: 100%),
|
||||||
|
image("images/santaka.png", width: 100%),
|
||||||
|
), caption: [
|
||||||
|
Paveikslėliai "grid'e"
|
||||||
|
]) <image-grid-label>
|
||||||
|
|
||||||
|
|
||||||
|
== Lentelės
|
||||||
|
|
||||||
|
Galima gauti lentelės numerį /*#ref-no(<table-label>)*/ arba visą lentelės nuorodą #custom-ref(<table-label>).
|
||||||
|
|
||||||
|
#figure(
|
||||||
|
ktu-table(
|
||||||
|
columns: (auto, 1fr, 1fr, 1fr),
|
||||||
|
align: (x, y) => { horizon + left },
|
||||||
|
table.header([*Stulpelio pavadinimas*], [*Stulpelio pavadinimas*], [*Stulpelio pavadinimas*], [*Stulpelio pavadinimas*]),
|
||||||
|
[Eilutė 1], [...], [...], [...],
|
||||||
|
[Eilutė 2], [...], [...], [...],
|
||||||
|
[Eilutė 3], [...], [...], [...],
|
||||||
|
[Eilutė 4], [...], [...], [...],
|
||||||
|
),
|
||||||
|
caption: [Lentelės pavadinimas],
|
||||||
|
) <table-label>
|
||||||
|
|
||||||
|
|
||||||
|
== Formulės
|
||||||
|
Formules galima išreikšti eilutėje, pavyzdžiui $E = m c^2$ arba atskiroje eilutėje, pavyzdžiui:
|
||||||
|
$
|
||||||
|
E = m c^2
|
||||||
|
$ <formula-label>
|
||||||
|
|
||||||
|
// TODO: fix
|
||||||
|
Formulės atskiroje eilutėje numeruojamos besąlygiškai, galima gauti formulės numerį #ref-no(<formula-label>) arba visą formulės nuorodą #custom-ref(<formula-label>).
|
||||||
|
|
||||||
|
== Kodo fragmentai
|
||||||
|
Kodo fragmentus galima išreikšti eilutėje, pavyzdžiui `print("Hello, world!")` arba atskiroje eilutėje, pavyzdžiui:
|
||||||
|
#figure(```python
|
||||||
|
def main():
|
||||||
|
print("Hello, world!")
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
|
```, caption: [
|
||||||
|
Python kodas
|
||||||
|
]) <code-label>
|
||||||
|
|
||||||
|
Galima gauti kodo fragmento numerį #ref-no(<code-label>) arba visą kodo fragmento nuorodą #custom-ref(<code-label>).
|
||||||
|
|
||||||
|
== Naudotojo apibrėžtos figūros
|
||||||
|
|
||||||
|
Naudotojai tai pat gali apibrėžti savo figūras, pavyzdžiui, komandų fragmentus. Pavyzdžiui, galima apibrėžti komandų fragmentą su papildoma informacija ir naudoti jį dokumente. Galima gauti kodo fragmento numerį #ref-no(<custom-figure-label>) arba visą kodo fragmento nuorodą #custom-ref(<custom-figure-label>).
|
||||||
|
|
||||||
|
#figure(
|
||||||
|
```sh
|
||||||
|
npm install foo
|
||||||
|
```,
|
||||||
|
kind: "veryCustomKind",
|
||||||
|
supplement: "...",
|
||||||
|
caption: [Diegimo komanda],
|
||||||
|
) <custom-figure-label>
|
||||||
|
|
||||||
|
#pagebreak()
|
||||||
|
= Išvados
|
||||||
|
#lorem(50)
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 593 KiB |
File renamed without changes.
+14
-12
@@ -1,12 +1,14 @@
|
|||||||
#import "@local/ktu-paper:0.1.0": (
|
#import "@local/ktu-paper:0.4.1": (
|
||||||
setup-page, setup-code,
|
ktu-paper, setup-code,
|
||||||
ktu-table-of-contents, ktu-picture-list, ktu-table-list,
|
ktu-table-of-contents, ktu-picture-list, ktu-table-list,
|
||||||
ktu-heading-page-normal,
|
ktu-heading-page-normal,
|
||||||
ktu-table,
|
ktu-table,
|
||||||
custom-ref, ref-no
|
custom-ref, ref-no
|
||||||
)
|
)
|
||||||
|
|
||||||
#show: setup-page.with()
|
#show: ktu-paper.with(
|
||||||
|
font: "Times New Roman",
|
||||||
|
)
|
||||||
#show: setup-code.with()
|
#show: setup-code.with()
|
||||||
|
|
||||||
#show math.equation: it => {
|
#show math.equation: it => {
|
||||||
@@ -92,7 +94,7 @@ show table.cell: set text(size: 8pt)
|
|||||||
Duomenų sklaidą yra patogu pavaizduoti ir stačiakampe diagrama:
|
Duomenų sklaidą yra patogu pavaizduoti ir stačiakampe diagrama:
|
||||||
|
|
||||||
#figure(
|
#figure(
|
||||||
image("image.jpeg", width: 70%),
|
image("images/santaka.png", width: 70%),
|
||||||
caption: [
|
caption: [
|
||||||
Skaitinių atributų stačiakampė diagrama
|
Skaitinių atributų stačiakampė diagrama
|
||||||
],
|
],
|
||||||
@@ -134,8 +136,8 @@ Paveikslėlius galima grupuoti į "grid" #custom-ref(<image-grid-2>, <image-grid
|
|||||||
#figure(grid(
|
#figure(grid(
|
||||||
columns: 2,
|
columns: 2,
|
||||||
gutter: 2mm,
|
gutter: 2mm,
|
||||||
image("image.jpeg", width: 100%),
|
image("images/santaka.png", width: 100%),
|
||||||
image("image.jpeg", width: 100%),
|
image("images/santaka.png", width: 100%),
|
||||||
), caption: [
|
), caption: [
|
||||||
Paveikslėliai "grid'e" 1
|
Paveikslėliai "grid'e" 1
|
||||||
]) <image-grid-2>
|
]) <image-grid-2>
|
||||||
@@ -143,11 +145,11 @@ Paveikslėlius galima grupuoti į "grid" #custom-ref(<image-grid-2>, <image-grid
|
|||||||
#figure(grid(
|
#figure(grid(
|
||||||
columns: 3,
|
columns: 3,
|
||||||
gutter: 2mm,
|
gutter: 2mm,
|
||||||
image("image.jpeg", width: 100%),
|
image("images/santaka.png", width: 100%),
|
||||||
image("image.jpeg", width: 100%),
|
image("images/santaka.png", width: 100%),
|
||||||
image("image.jpeg", width: 100%),
|
image("images/santaka.png", width: 100%),
|
||||||
image("image.jpeg", width: 100%),
|
image("images/santaka.png", width: 100%),
|
||||||
image("image.jpeg", width: 100%),
|
image("images/santaka.png", width: 100%),
|
||||||
), caption: [
|
), caption: [
|
||||||
Paveikslėliai "grid'e" 2
|
Paveikslėliai "grid'e" 2
|
||||||
]) <image-grid-3>
|
]) <image-grid-3>
|
||||||
@@ -188,7 +190,7 @@ $
|
|||||||
čia $X$ -- imtis, $mu$ -- imties vidurkis, $sigma$ -- imties standartinis nuokrypis. Fragmentas pateikiamas #ref-no(<image-1>) paveikslėlyje.
|
čia $X$ -- imtis, $mu$ -- imties vidurkis, $sigma$ -- imties standartinis nuokrypis. Fragmentas pateikiamas #ref-no(<image-1>) paveikslėlyje.
|
||||||
|
|
||||||
#figure(
|
#figure(
|
||||||
image("image.jpeg", width: 90%),
|
image("images/santaka.png", width: 90%),
|
||||||
caption: [
|
caption: [
|
||||||
Paveikslėlio pavadinimas
|
Paveikslėlio pavadinimas
|
||||||
],
|
],
|
||||||
|
|||||||
+6
-4
@@ -1,5 +1,5 @@
|
|||||||
#import "@local/ktu-paper:0.1.0": (
|
#import "@local/ktu-paper:0.4.0": (
|
||||||
setup-page, setup-code,
|
ktu-paper, setup-code,
|
||||||
ktu-table-of-contents, ktu-picture-list, ktu-table-list,
|
ktu-table-of-contents, ktu-picture-list, ktu-table-list,
|
||||||
ktu-heading-page-normal,
|
ktu-heading-page-normal,
|
||||||
ktu-table,
|
ktu-table,
|
||||||
@@ -7,7 +7,9 @@
|
|||||||
custom-ref, ref-no
|
custom-ref, ref-no
|
||||||
)
|
)
|
||||||
|
|
||||||
#show: setup-page.with()
|
#show: ktu-paper.with(
|
||||||
|
font: "Times New Roman",
|
||||||
|
)
|
||||||
#show: setup-code.with()
|
#show: setup-code.with()
|
||||||
|
|
||||||
#show figure: it => {
|
#show figure: it => {
|
||||||
@@ -189,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.
|
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(
|
#figure(
|
||||||
image("Picture.png", width: 11.2cm, height: 8cm),
|
image("images/santaka.png", width: 11.2cm, height: 8cm),
|
||||||
caption: [
|
caption: [
|
||||||
Kauno technologijos universiteto „Santakos“ slėnio fasadas
|
Kauno technologijos universiteto „Santakos“ slėnio fasadas
|
||||||
],
|
],
|
||||||
|
|||||||
Executable
+43
@@ -0,0 +1,43 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Clean up previous test results
|
||||||
|
if [ -d "tests/original-res" ]; then
|
||||||
|
rm -r tests/original-res
|
||||||
|
fi
|
||||||
|
if [ -d "tests/modified-res" ]; then
|
||||||
|
rm -r tests/modified-res
|
||||||
|
fi
|
||||||
|
if [ -d "tests/modified" ]; then
|
||||||
|
rm -r tests/modified
|
||||||
|
fi
|
||||||
|
if [ -d "tests/original/src" ]; then
|
||||||
|
rm -r tests/original/src
|
||||||
|
fi
|
||||||
|
|
||||||
|
mkdir -p tests/original-res
|
||||||
|
mkdir -p tests/modified-res
|
||||||
|
|
||||||
|
# Copy current template
|
||||||
|
cp -r src/ tests/original/src
|
||||||
|
|
||||||
|
cp -r tests/original tests/modified
|
||||||
|
# replace the "#import "@local/ktu-paper:0.1.0""
|
||||||
|
# with "#import "./src/lib.typ"" in the modified files
|
||||||
|
find tests/modified -type f -name "*.typ" -exec \
|
||||||
|
sed -i 's/#import "@local\/ktu-paper:0.1.0"/#import ".\/src\/lib.typ"/g' {} \;
|
||||||
|
find tests/modified -type f -name "ataskaita.typ" -exec \
|
||||||
|
sed -i 's/setup-page/ktu-paper/g' {} \;
|
||||||
|
|
||||||
|
# Compile the original document
|
||||||
|
typst compile --root tests/original tests/original/ataskaita.typ "tests/original-res/{0p}.png"
|
||||||
|
# Compile the modified document
|
||||||
|
typst compile --root tests/modified tests/modified/ataskaita.typ "tests/modified-res/{0p}.png"
|
||||||
|
typst compile --root tests/modified tests/modified/ataskaita.typ "tests/modified.pdf"
|
||||||
|
|
||||||
|
# Compare the results
|
||||||
|
diff -r tests/original-res tests/modified-res
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo "No differences found between original and modified results."
|
||||||
|
else
|
||||||
|
echo "Differences found between original and modified results."
|
||||||
|
fi
|
||||||
+3
-3
@@ -1,9 +1,9 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "ktu-paper"
|
name = "ktu-paper"
|
||||||
version = "0.1.0"
|
version = "0.4.1"
|
||||||
compiler = "0.12.0"
|
compiler = "0.15.0"
|
||||||
entrypoint = "src/lib.typ"
|
entrypoint = "src/lib.typ"
|
||||||
repository = "https://git.svetikas.lt/JustAnyone/dotfiles"
|
repository = "https://github.com/svetikas/ktu-paper"
|
||||||
authors = ["Dominykas Svetikas <https://svetikas.lt>"]
|
authors = ["Dominykas Svetikas <https://svetikas.lt>"]
|
||||||
license = "MIT"
|
license = "MIT"
|
||||||
description = "KTU report template to use for writing lab reports or final thesis."
|
description = "KTU report template to use for writing lab reports or final thesis."
|
||||||
|
|||||||
Reference in new issue
Block a user