24 Commits

Author SHA1 Message Date
c8d42664a9 switch to relative font sizing 2025-10-10 23:04:00 +02:00
497dbd270d adjust noto sans mono's size to match merriweather 2025-10-10 22:43:33 +02:00
c63864159a make abbreviations clickable 2025-10-10 20:17:55 +02:00
0ae7db2cd3 call bp/dp definitions only where necessary 2025-10-10 19:53:40 +02:00
79df0d4dd9 make bp and dp definitions cleaner 2025-10-10 19:41:12 +02:00
6e5604705e extract arguments and add title pages disabling 2025-10-10 17:42:03 +02:00
3822ce3a98 add footnote example 2025-10-10 14:45:22 +02:00
bfa2fedefb change to square brackets for citations according to consultation 2025-10-10 11:58:55 +02:00
8666604e8c change bundling system to allow for different language example theses 2025-10-10 09:04:31 +02:00
a0eb5f4ed0 remove breaks for certain terms 2025-10-10 09:04:23 +02:00
5397c85397 allow content in acknowledgement 2025-10-08 10:06:53 +02:00
72f5dd8372 make acknowledgement optional for bp and dp 2025-10-08 09:44:51 +02:00
Matej-Zucha-TUL
72c450c547 Add WIP English template for bp 2025-10-08 09:17:24 +02:00
Matej-Zucha-TUL
c398485af8 Develop cs template 2025-10-08 09:17:23 +02:00
Matej-Zucha-TUL
bcb3882254 Fix abstract language order for different lang settings 2025-10-08 09:17:23 +02:00
d9ab5e8ab1 include citation examples for templategen 2025-10-08 08:30:37 +02:00
b8502b5466 fix naming for study specialization 2025-10-07 22:34:19 +02:00
ca46ff32a8 update bp and dp examples 2025-10-07 22:23:29 +02:00
f7737687db prepare for tultemplategen bundling 2025-10-07 21:54:18 +02:00
6850224e84 stop versioning pdfs directly in git 2025-10-07 21:30:43 +02:00
Matej-Zucha-TUL
08bcc0672b Develop templates 2025-10-07 21:09:04 +02:00
211bdc54db Made DP and BP lowercase 2025-10-07 19:13:30 +02:00
Matej-Zucha-TUL
f8ebdfe1f8 Add makeshift command to run BP and DP example using the --root hack 2025-10-07 18:19:39 +02:00
Matej-Zucha-TUL
b5e1f1d663 Add BP and DP example in Czech 2025-10-07 18:12:23 +02:00
19 changed files with 1391 additions and 263 deletions

1
.gitattributes vendored
View File

@@ -1,2 +1,3 @@
*.ttf filter=lfs diff=lfs merge=lfs -text
*.otf filter=lfs diff=lfs merge=lfs -text
*.pdf filter=lfs diff=lfs merge=lfs -text

View File

@@ -1,11 +1,19 @@
.PHONY: view_example
view_example: documentation.pdf
.PHONY: view_documentation
view_documentation: documentation.pdf
xdg-open $<
.PHONY: watch_documentation
watch_documentation:
typst watch --font-path template/fonts documentation.typ & xdg-open documentation.pdf
.PHONY: watch_bp_cs
watch_bp_cs: bp.pdf
xdg-open bp.pdf & typst watch --root . --font-path template/fonts theses/bp.typ bp.pdf
.PHONY: watch_dp_cs
watch_dp_cs: dp.pdf
xdg-open dp.pdf & typst watch --root . --font-path template/fonts theses/dp.typ dp.pdf
.PHONY: documentation
documentation: documentation.pdf
@@ -13,7 +21,8 @@ PACKDIR := pack/tultemplate2
BUNDLEDIR := pack/bundle
TO_PACK := $(shell find template -type f) template/LICENSE
BUNDLE_TARGETS := $(TO_PACK:%=$(BUNDLEDIR)/%) $(BUNDLEDIR)/citations.bib $(BUNDLEDIR)/Makefile
BUNDLE_TARGETS := $(TO_PACK:%=$(BUNDLEDIR)/%) $(BUNDLEDIR)/citations.bib $(BUNDLEDIR)/bp_cs.typ \
$(BUNDLEDIR)/bp_en.typ $(BUNDLEDIR)/dp_cs.typ $(BUNDLEDIR)/Makefile
PACK_TARGETS := $(TO_PACK:%=$(PACKDIR)/%) $(PACKDIR)/documentation.typ \
$(PACKDIR)/documentation.pdf $(PACKDIR)/citations.bib
@@ -22,11 +31,12 @@ pack: pack/tultemplate2.zip
.PHONY: bundle
bundle: $(BUNDLE_TARGETS)
@echo "!! Bundles are made for tultemplategen and not for direct use !!"
.PHONY: clean
clean:
rm -rf pack
rm -f documentation.pdf
rm -f documentation.pdf bp.pdf dp.pdf
pack/tultemplate2.zip: $(PACK_TARGETS)
@mkdir -p $(@D)
@@ -37,9 +47,13 @@ $(PACKDIR)/%: %
@mkdir -p $(@D)
ln -f $< $@
$(BUNDLEDIR)/citations.bib:
$(BUNDLEDIR)/citations.bib: citations.bib
@mkdir -p $(@D)
touch $@
ln -f $< $@
$(BUNDLEDIR)/%.typ: theses/%.typ
@mkdir -p $(@D)
awk 'BEGIN{RS=""; ORS="\n\n"} NR>2{print}' $< | sed 's/\.\.\/template\//template\//' > $@
$(BUNDLEDIR)/Makefile: templategen.mk
@mkdir -p $(@D)
@@ -53,7 +67,11 @@ $(BUNDLEDIR)/template/LICENSE: LICENSE
@mkdir -p $(@D)
ln -f $< $@
$(PACKDIR)/template/tul_citace.csl $(BUNDLEDIR)/template/tul_citace.csl: template/tul_citace.csl
$(PACKDIR)/template/tul_citace.csl: template/tul_citace.csl
@mkdir -p $(@D)
cat $< | sed 's/^\s*\(.*\)$$/\1/' | tr -d '\n' > $@
$(BUNDLEDIR)/template/tul_citace.csl: template/tul_citace.csl
@mkdir -p $(@D)
cat $< | sed 's/^\s*\(.*\)$$/\1/' | tr -d '\n' > $@
@@ -75,6 +93,12 @@ $(BUNDLEDIR)/template/%: template/%
TEMPLATE_SRCS := $(shell find template -type f)
bp.pdf: theses/bp.typ
typst compile --font-path template/fonts --root . $< $@
dp.pdf: theses/dp.typ
typst compile --font-path template/fonts --root . $< $@
documentation.pdf: documentation.typ $(TEMPLATE_SRCS)
typst compile --font-path template/fonts $<

View File

@@ -222,6 +222,19 @@ zrakovým postižením).
Tabulky se zobrazí na začátku dokumentu v seznamu (pokud to daný typ dokumentu vyžaduje).
== Poznámky pod čarou
Poznámky pod čarou jsou způsob sdělení dodatečných informácí, které pro čtenáře běžně nebudou velmi
podstatné. Mohou sloužit například k upřesnění informací. #footnote[Nebo k doplnění technikálií]
Poznámka pod čarou se vytvoří následovně:
```typst
#footnote[Moje poznámka]
```
Šablona automaticky vytvoří čáru s barvou vaší fakulty a pod vloží poznámky na dané straně.
== Citace
Šablona podporuje správu citací pomocí standardního BibTeX @bibtex souboru, stejně jako
@@ -356,7 +369,7 @@ Zvýrazněné hodnoty jsou základní -- pokud vynecháte parametr, pak bude pou
- Je vyžadován jazyk, který je vybrán pro celou šablonu -- tohle je pojistka, aby uživatel šablony
nevynechal vybraný jazyk
#line()
- `branch` (studijní obor)
- `specialization` (specializace)
- Stejně jako #link(<arg_programme>, [`programme`])
#line()
- `abstract` (abstrakt)

View File

@@ -18,10 +18,11 @@
}
"(" + abbrs.pairs().map((v) => { v.at(0) + ":\"" + v.at(1) + "\"" }).join(",") + ")"
});
let target_label = label("abbr_" + abbreviation);
if type(text) != type(none) {
text + " (" + abbreviation + ")";
link(target_label, text + " (" + abbreviation + ")");
} else {
abbreviation;
link(target_label, abbreviation)
}
}

174
template/arguments.typ Normal file
View File

@@ -0,0 +1,174 @@
#import "utils.typ": assert_type_signature, is_none, map_none, deref
#let arguments_structure = (
document: (
visual_style: "string",
faculty: "string",
language: "string",
type: "string",
),
title_pages: "string | boolean | none",
title: "dictionary[string : string] | none",
author: (
name: "string | none",
pronouns: "string | none",
programme: "dictionary[string : string] | none",
specialization: "dictionary[string : string] | none",
year_of_study: "integer | none",
),
project: (
supervisor: "string | dictionary[string : string] | none",
consultant: "string | dictionary[string : string] | none",
),
abstract: (
content: "dictionary[string : string | content] | none",
keywords: "dictionary[string : array[string]] | none",
),
acknowledgement: "dictionary[string : string | content] | none",
assignment: "string | none",
citations: "string",
);
#let check_arguments(args) = {
let check_arguments_dict(structure, args, argument_path) = {
for (key, value) in structure.pairs() {
argument_path.push(str(key).replace("_", " "));
if not key in args {
panic("invalid arguments definition");
}
let arg = args.at(key);
if type(value) == dictionary {
check_arguments_dict(value, arg, argument_path);
} else if type(value) == str {
assert_type_signature(arg, value, argument_path.join(" "));
} else {
panic("invalid arguments definition");
}
let _ = argument_path.pop();
}
}
check_arguments_dict(arguments_structure, args, ());
}
#let get_arg_single(args, path) = {
let args = args;
for segment in path.split(".") {
if segment not in args {
panic("invalid argument query path: " + str(path));
}
args = args.at(segment);
}
args
}
#let get_arg(args, path) = {
if type(path) == array {
let res = ();
for path in path {
res.push(get_arg_single(args, path));
}
res
} else if type(path) == str {
get_arg_single(args, path)
} else {
panic("invalid argument path");
}
}
#let req_arg_single(args, path) = {
let arg = get_arg_single(args, path);
if is_none(arg) {
let panic_message = path.split(".").join(" ").replace("_", " ") + " is missing";
panic(panic_message);
}
arg
}
#let req_arg(args, path) = {
if type(path) == array {
let res = ();
for path in path {
res.push(req_arg_single(args, path));
}
res
} else if type(path) == str {
req_arg_single(args, path)
} else {
panic("invalid argument path");
}
}
#let map_arg_single(args, path, mapper) = {
let arg = get_arg(args, path);
map_none(arg, mapper)
}
#let map_arg(args, path, mapper) = {
if type(path) == array {
let res = ();
for path in path {
res.push(map_arg_single(args, path, mapper));
}
res
} else if type(path) == str {
map_arg_single(args, path, mapper)
} else {
panic("invalid argument path");
}
}
#let arguments(
document_info,
title_pages,
title,
author_info,
project_info,
abstract_info,
acknowledgement,
assignment,
citations,
) = {
(
document: document_info,
title_pages: title_pages,
title: title,
author: author_info,
project: project_info,
abstract: abstract_info,
acknowledgement: acknowledgement,
assignment: assignment,
citations: citations,
)
}
#let document_info(visual_style, faculty_abbreviation, language_abbreviation, document_type) = {
(
visual_style: visual_style,
faculty: faculty_abbreviation,
language: language_abbreviation,
type: document_type,
)
}
#let author_info(name, pronouns, programme, specialization, year_of_study) = {
(
name: name,
pronouns: pronouns,
programme: programme,
specialization: specialization,
year_of_study: year_of_study,
)
}
#let project_info(supervisor, consultant) = {
(supervisor: supervisor, consultant: consultant)
}
#let abstract_info(abstract, keywords) = {
(content: abstract, keywords: keywords)
}

View File

@@ -1,69 +1,19 @@
#import "../lang.typ": get_lang_item
#import "common.typ": (
mainpage,
default_styling,
assignment,
disclaimer,
abstract,
acknowledgement,
toc,
abbrlist,
imagelist,
tablelist,
bibliogr
)
#import "../attachments.typ": attachment_list
#import "../utils.typ": is_none, assert_dict_has, assert_not_none, assert_type_signature
#import "../arguments.typ": req_arg, get_arg
#import "../utils.typ": assert_dict_has, is_none
#import "common.typ": mainpage, assignment, external_title_pages
#import "thesis_base.typ": thesis_base
#let bp(
// general settings
faculty_id, faculty_color, language, assignment_document, citation_file,
// document info
title, author, author_pronouns, supervisor, consultant, study_programme, study_branch,
year_of_study, abstract_content, acknowledgement_content, keywords,
content
) = {
let force_langs = ("cs", "en");
assert_not_none(title, "title");
assert_dict_has(force_langs, title, "title");
assert_not_none(study_programme, "study programme");
assert_dict_has((language,), study_programme, "study programme");
assert_not_none(study_branch, "study branch");
assert_dict_has((language,), study_branch, "study branch");
assert_not_none(abstract_content, "abstract");
assert_dict_has(force_langs, abstract_content, "abstract");
if not is_none(keywords) {
assert_dict_has(force_langs, keywords, "keywords");
}
assert_not_none(acknowledgement_content, "acknowledgement content");
#let bp(args, content) = {
let language = req_arg(args, "document.language");
let programme = req_arg(args, "author.programme");
assert_dict_has((language,), programme, "study programme");
let specialization = req_arg(args, "author.specialization");
assert_dict_has((language,), specialization, "study specialization");
if language == "cs" {
assert_not_none(author_pronouns, "author gender");
let _ = req_arg(args, "author.pronouns");
}
assert_type_signature(supervisor, "string | none", "supervisor");
assert_type_signature(consultant, "string | none", "consultant");
mainpage(
faculty_id, language, "bp", title, author, supervisor, consultant, study_programme,
study_branch, year_of_study,
);
assignment(language, assignment_document);
default_styling(false, faculty_color, {
disclaimer(language, faculty_id, "bp", author, author_pronouns);
abstract("cs", title, abstract_content, keywords);
abstract("en", title, abstract_content, keywords);
acknowledgement(language, author, acknowledgement_content);
toc(language);
tablelist(language);
imagelist(language);
abbrlist(language);
pagebreak(weak: true);
content;
bibliogr(language, citation_file);
attachment_list(language);
});
mainpage(args);
assignment(args);
thesis_base(args, content);
}

View File

@@ -1,53 +1,43 @@
// tools & utils
#import "../theme.typ": faculty_logotype, tul_logomark, faculty_color
#import "../lang.typ": lang_id, get_lang_item
#import "../utils.typ": assert_in_dict, assert_in_arr, map_none, assert_dict_has
#import "../utils.typ": assert_in_dict, assert_in_arr, map_none, assert_dict_has, is_none
#import "../arguments.typ": req_arg, map_arg, get_arg
#import "common.typ": default_styling, external_title_pages
// thesis types
#import "bp.typ": bp
#import "dp.typ": dp
#import "other.typ": other
#import "thesis_base.typ": thesis_base
#let template_classic(
// general settings
language, faculty_id, document_type, citation_file, assignment_document,
#let template_classic(args, content) = {
let language = req_arg(args, "document.language");
// document info
title, author, author_pronouns, supervisor, consultant, study_programme, study_branch,
year_of_study, abstract, acknowledgement, keywords,
// content
content,
) = {
// argument pre-checking
let document_types = (
"bp": bp,
"dp": dp,
"other": other,
)
assert_in_dict(document_type, document_types, "document type");
map_none(title, (v) => assert_dict_has((language,), v, "title"));
map_none(study_programme, (v) => assert_dict_has((language,), v, "study programme"));
map_none(study_branch, (v) => assert_dict_has((language,), v, "study branch"));
map_none(acknowledgement, (v) => assert_dict_has((language,), v, "acknowledgement content"));
document_types.at(document_type)(
faculty_id,
faculty_color(faculty_id),
language,
map_none(assignment_document, (v) => "../../" + v),
map_none(citation_file, (v) => "../../" + v),
title,
author,
author_pronouns,
supervisor,
consultant,
study_programme,
study_branch,
year_of_study,
abstract,
acknowledgement,
keywords,
content,
assert_in_dict(req_arg(args, "document.type"), document_types, "document type");
map_arg(args, "title", (v) => assert_dict_has((language,), v, "title"));
map_arg(args, "author.programme", (v) => assert_dict_has((language,), v, "study programme"));
map_arg(
args, "author.specialization", (v) => assert_dict_has((language,), v, "study specialization")
);
map_arg(
args, "acknowledgement", (v) => assert_dict_has((language,), v, "acknowledgement content")
);
args.assignment = map_arg(args, "assignment", (v) => "../../" + v);
args.citations = map_arg(args, "citations", (v) => "../../" + v);
args.title_pages = map_arg(args, "title_pages", (v) => "../../" + v);
if not is_none(get_arg(args, "title_pages")) and not req_arg(args, "document.type") == "other" {
external_title_pages(req_arg(args, "title_pages"));
thesis_base(args, content);
} else {
document_types.at(req_arg(args, "document.type"))(args, content);
}
}

View File

@@ -1,10 +1,11 @@
#import "../theme.typ": faculty_logotype, tul_logomark, faculty_color
#import "../lang.typ": get_lang_item
#import "../utils.typ": is_none, assert_dict_has, map_none
#import "../lang.typ": get_lang_item, set_czech_nonbreakable_terms
#import "../utils.typ": is_none, assert_dict_has, has_all_none, map_none
#import "../arguments.typ": req_arg, get_arg
#let base_font = "Inter";
#let mono_font = "Noto Sans Mono";
#let mono_font_compensation = 1.3em;
#let mono_font_compensation = 1.3010575323879552;
#let serif_font = "Merriweather";
#let tul_logomark_size = 6.5em;
@@ -15,7 +16,7 @@
// TYPST ELEMENT STYLING
#let default_styling(flip_bonding, faculty_color, content) = {
#let default_styling(flip_bonding, faculty_color, content, language) = {
// page
set page(
margin: if flip_bonding {
@@ -37,6 +38,9 @@
// text
set text(font: serif_font);
set par(justify: true, first-line-indent: 0.63cm);
if language == "cs" {
content = set_czech_nonbreakable_terms(content);
}
// figures
let figure_numbering(realcount, c) = {
@@ -79,7 +83,7 @@
}
// other
show raw: set text(font: mono_font, size: mono_font_compensation);
show raw: set text(font: mono_font, size: mono_font_compensation * 1em);
show raw.where(block: true): it => {
block(it, fill: rgb("#eee"), inset: 1em)
};
@@ -135,14 +139,14 @@
faculty_id,
language,
document_type,
title, author, supervisor, consultant, study_programme, study_branch, year_of_study,
title, author, supervisor, consultant, study_programme, study_specialization, year_of_study,
) = {
let info_name_value_padding = 5em;
let info_name_min_width = 10em;
let gutter = .7em;
// document type
if type(document_type) != type(none) {
if document_type != "other" {
text(get_lang_item(language, document_type), weight: "bold", font: base_font);
v(0em);
}
@@ -161,7 +165,7 @@
("supervisor", person_info(supervisor, "supervisor"), false),
("consultant", person_info(consultant, "consultant"), false),
("study_programme", study_programme, false),
("study_branch", study_branch, false),
("study_specialization", study_specialization, false),
("year_of_study", map_none(year_of_study, (v) => str(v) + "."), false),
)
context {
@@ -193,26 +197,34 @@
// MAINPAGE
#let mainpage(
faculty_id,
language,
document_type,
title, author, supervisor, consultant, study_programme, study_branch, year_of_study,
) = {
import "../utils.typ": has_all_none, map_none
let nonetype = type(none);
#let mainpage(args) = {
let (
language, document_type, faculty,
title, author, supervisor, consultant, study_programme, study_specialization, year_of_study,
) = get_arg(args, (
"document.language",
"document.type",
"document.faculty",
"title",
"author.name",
"project.supervisor",
"project.consultant",
"author.programme",
"author.specialization",
"author.year_of_study",
));
page({
if has_all_none((
document_type, title, author, supervisor, consultant, study_programme,
)) {
place(center + horizon, align(left, faculty_logotype(faculty_id, language)));
} else {
header(faculty_id, language);
header(faculty, language);
align({
info(
faculty_id, language, document_type, map_none(title, (v) => v.at(language)),
faculty, language, document_type, map_none(title, (v) => v.at(language)),
author, supervisor, consultant, map_none(study_programme, (v) => v.at(language)),
map_none(study_branch, (v) => v.at(language)), year_of_study,
map_none(study_specialization, (v) => v.at(language)), year_of_study,
);
v(5em);
}, bottom);
@@ -220,13 +232,21 @@
}, margin: 2cm);
}
// _ EMBEDDED
#let pdfembed(path) = {
import "@preview/muchpdf:0.1.1": muchpdf
set page(margin: 0em);
muchpdf(read(path, encoding: none));
}
// ASSIGNMENT PAGE
#let assignment(language, document) = {
if type(document) == type(none) {
#let assignment(args) = {
if is_none(get_arg(args, "assignment")) {
page(
place(center + horizon, text(
get_lang_item(language, "place_assignment"),
get_lang_item(req_arg(args, "document.language"), "place_assignment"),
fill: red,
size: 3em,
font: base_font,
@@ -237,15 +257,26 @@
);
return;
}
import "@preview/muchpdf:0.1.1": muchpdf
set page(margin: 0em);
muchpdf(read(document, encoding: none));
pdfembed(req_arg(args, "assignment"))
}
// EXTERNAL TITLE PAGES
#let external_title_pages(path) = {
pdfembed(path);
}
// DISCLAIMER PAGE
#let disclaimer(language, faculty_id, disclaimer_type, author, author_pronouns) = {
#let disclaimer(args) = {
import "../lang.typ": disclaimer
let (language, faculty, disclaimer_type, author, author_pronouns) = req_arg(args, (
"document.language",
"document.faculty",
"document.type",
"author.name",
"author.pronouns",
));
heading(get_lang_item(language, "disclaimer"), numbering: none, outlined: false);
par(
text(disclaimer(language, disclaimer_type, author_pronouns))
@@ -263,7 +294,9 @@
// ACKNOWLEDGEMENT PAGE
#let acknowledgement(language, author, content) = {
#let acknowledgement(args) = {
let content = get_arg(args, "acknowledgement");
let (language, author) = req_arg(args, ("document.language", "author.name"));
if is_none(content) {
return;
}
@@ -275,8 +308,10 @@
// ABSTRACT
#let abstract(language, title, content, keywords) = {
heading(text(title.at(language), font: base_font), numbering: none, outlined: false);
#let abstract(language, args) = {
heading(
text(req_arg(args, "title").at(language), font: base_font), numbering: none, outlined: false
);
v(2em);
heading(
level: 2,
@@ -284,7 +319,8 @@
numbering: none,
outlined: false,
);
text(content.at(language));
text(req_arg(args, "abstract.content").at(language));
let keywords = get_arg(args, "abstract.keywords");
if not is_none(keywords) and type(keywords.at(language)) != type(none) {
linebreak();
linebreak();
@@ -364,7 +400,12 @@
gutter: 1em,
..abbrs.pairs().map((a) => {
(
align(left, block(text(a.at(0), weight: "bold"), width: max_abbr_width + 1em)),
align(left, {
[
#block(text(a.at(0), weight: "bold"), width: max_abbr_width + 1em)
#label("abbr_" + a.at(0))
]
}),
text(a.at(1))
)
}).flatten()
@@ -384,7 +425,8 @@
// BIBLIOGRAPHY
#let bibliogr(language, citations_file) = {
#let bibliogr(args) = {
let (language, citations_file) = req_arg(args, ("document.language", "citations"));
if language == "cs" {
bibliography(
citations_file, style: "../tul_citace.csl", title: get_lang_item(language, "bibliography"),

View File

@@ -1,68 +1,20 @@
#import "../lang.typ": get_lang_item
#import "common.typ": (
mainpage,
default_styling,
assignment,
disclaimer,
abstract,
acknowledgement,
toc,
abbrlist,
imagelist,
tablelist,
bibliogr
)
#import "../attachments.typ": attachment_list
#import "../utils.typ": is_none, assert_dict_has, assert_not_none, assert_type_signature, map_none
#import "../arguments.typ": req_arg, get_arg, map_arg
#import "../utils.typ": assert_dict_has, is_none
#import "common.typ": mainpage, assignment, external_title_pages
#import "thesis_base.typ": thesis_base
#let dp(
// general settings
faculty_id, faculty_color, language, assignment_document, citation_file,
// document info
title, author, author_pronouns, supervisor, consultant, study_programme, study_branch,
year_of_study, abstract_content, acknowledgement_content, keywords,
content
) = {
let force_langs = ("cs", "en");
assert_not_none(title, "title");
assert_dict_has(force_langs, title, "title");
assert_not_none(study_programme, "study programme");
assert_dict_has((language,), study_programme, "study programme");
map_none(study_branch, (v) => assert_dict_has((language,), v, "study branch"));
assert_not_none(abstract_content, "abstract");
assert_dict_has(force_langs, abstract_content, "abstract");
if not is_none(keywords) {
assert_dict_has(force_langs, keywords, "keywords");
}
assert_not_none(acknowledgement_content, "acknowledgement content");
if language == "cs" {
assert_not_none(author_pronouns, "author gender");
}
assert_type_signature(supervisor, "string | none", "supervisor");
assert_type_signature(consultant, "string | none", "consultant");
mainpage(
faculty_id, language, "dp", title, author, supervisor, consultant, study_programme,
study_branch, year_of_study,
);
assignment(language, assignment_document);
default_styling(false, faculty_color, {
disclaimer(language, faculty_id, "dp", author, author_pronouns);
abstract("cs", title, abstract_content, keywords);
abstract("en", title, abstract_content, keywords);
acknowledgement(language, author, acknowledgement_content);
toc(language);
tablelist(language);
imagelist(language);
abbrlist(language);
pagebreak(weak: true);
content;
bibliogr(language, citation_file);
attachment_list(language);
#let dp(args, content) = {
let language = req_arg(args, "document.language");
let programme = req_arg(args, "author.programme");
assert_dict_has((language,), programme, "study programme");
map_arg(args, "author.specialization", (v) => {
assert_dict_has((language,), v, "study specialization");
});
if language == "cs" {
let _ = req_arg(args, "author.pronouns");
}
mainpage(args);
assignment(args);
thesis_base(args, content);
}

View File

@@ -13,32 +13,22 @@
)
#import "../attachments.typ": attachment_list
#import "../utils.typ": is_none, assert_not_none, assert_dict_has, assert_in_arr
#import "../arguments.typ": req_arg
#import "../theme.typ": faculty_color
#let other(
// general settings
faculty_id, faculty_color, language, assignment_document, citation_file,
// document info
title, author, _, supervisor, consultant, study_programme, study_branch, year_of_study,
abstract_content, _, keywords,
content
) = {
assert_not_none(title, "title");
#let other(args, content) = {
let (language, title) = req_arg(args, ("document.language", "title"));
assert_dict_has((language,), title, "title");
mainpage(
faculty_id, language, none, title, author, supervisor, consultant, study_programme,
study_branch, year_of_study,
);
default_styling(true, faculty_color, {
mainpage(args);
default_styling(true, faculty_color(req_arg(args, "document.faculty")), {
toc(language);
tablelist(language);
imagelist(language);
abbrlist(language);
pagebreak(to: "even", weak: true);
content;
bibliogr(language, citation_file);
bibliogr(args);
attachment_list(language);
});
}, language);
}

View File

@@ -0,0 +1,40 @@
#import "../theme.typ": faculty_color
#import "../arguments.typ": get_arg, req_arg
#import "../utils.typ": is_none, assert_dict_has
#import "common.typ": (
default_styling,
disclaimer,
abstract,
acknowledgement,
toc,
tablelist,
imagelist,
abbrlist,
bibliogr,
)
#import "../attachments.typ": attachment_list
#let thesis_base(args, content) = {
let force_langs = ("cs", "en");
assert_dict_has(force_langs, req_arg(args, "title"), "title");
assert_dict_has(force_langs, req_arg(args, "abstract.content"), "abstract");
assert_dict_has(force_langs, req_arg(args, "abstract.keywords"), "keywords");
let language = req_arg(args, "document.language");
default_styling(false, faculty_color(req_arg(args, "document.faculty")), {
if is_none(get_arg(args, "title_pages")) {
disclaimer(args);
}
abstract("cs", args);
abstract("en", args);
acknowledgement(args);
toc(language);
tablelist(language);
imagelist(language);
abbrlist(language);
pagebreak(weak: true);
content;
bibliogr(args);
attachment_list(language);
}, language);
}

View File

@@ -5,7 +5,7 @@
"supervisor": "Vedoucí práce",
"consultant": "Konzultant práce",
"study_programme": "Studijní program",
"study_branch": "Studijní obor",
"study_specialization": "Specializace",
"year_of_study": "Ročník",
"bp": "Bakalářská práce",
@@ -73,7 +73,7 @@
"supervisor": "Supervisor",
"consultant": "Consultant",
"study_programme": "Study programme",
"study_branch": "Study branch",
"study_specialization": "Specialization",
"year_of_study": "Year of study",
"bp": "Bachelor thesis",

View File

@@ -45,6 +45,34 @@
});
}
#let set_czech_nonbreakable_terms(content) = {
let space_after = (
"[kosuvzai]",
"(tj|tzv|tzn)\.",
);
show regex("\b((?i)(" + space_after.join("|") + ") )+\w+\b"): match => {
box(match);
}
let nonbreaking_abbreviations = (
"a. s",
"s. r. o",
"v. o. s",
"k. s",
"n. p",
"p. o",
"č. ([pe]|ev)",
"ev?. č",
);
show regex(
"(?i)\b(" + nonbreaking_abbreviations.map((v) => { v.replace(".", "\\.") }).join("|") + ")\."
): match => {
box(match);
}
content
}
#let disclaimer(language, document_type, author_pronouns) = {
let disclaimer = get_lang_item(language, "disclaimer_content");
let replacements = get_lang_item(language, "disclaimer_replace").at(document_type);

View File

@@ -26,13 +26,14 @@
// - faculty (str): Factulty abbreviation. One of "fs", "ft", "fp", "ef", "fua", "fm", "fzs", "cxi".
// - lang (str): Language code. This can be "cs" or "en".
// - document (str): Type of document. This can be "bp" or "other".
// - title_pages (str): The title pages exported from STAG (supported for some document types)
// - title (dictionary): The title of the document.
// - author (str): The name of the document's author.
// - author_pronouns (str): The gender of the document's author. Needed only for the `cs` language.
// - supervisor (str): The name of the document's supervisor.
// - consultant (str): The name of the document's consultant.
// - programme (dictionary): Study programme.
// - branch (disctionary): Study branch
// - specialization (disctionary): Study specialization
// - abstract (dictionary): The abstract.
// - keywords (dictionary): The abstract keywords.
// - assignment (str): Filepath of the assignment document/page.
@@ -45,9 +46,10 @@
style: "classic", faculty: "tul", lang: "cs", document: "other",
// document info
title_pages: none,
title: none, keywords: none, abstract: none, acknowledgement: none, author: none,
author_pronouns: none, supervisor: none, consultant: none, programme: none,
branch: none, year_of_study: none,
specialization: none, year_of_study: none,
// links
assignment: none, citations: "citations.bib",
@@ -55,36 +57,30 @@
// content
content,
) = {
import "utils.typ": assert_in_dict, assert_type_signature
import "arguments.typ": (
arguments,
document_info,
author_info,
project_info,
abstract_info,
check_arguments,
req_arg,
)
// argument checking
assert_type_signature(style, "string", "visual style argument");
assert_type_signature(faculty, "string", "faculty id argument");
assert_type_signature(lang, "string", "language abbreviation argument");
assert_type_signature(document, "string | none", "document kind argument");
assert_type_signature(title, "dictionary[string : string] | none", "title argument");
assert_type_signature(keywords, "dictionary[string : array[string]] | none", "keywords argument");
assert_type_signature(
abstract, "dictionary[string : string | content] | none", "abstract argument"
let args = arguments(
document_info(style, faculty, lang, document),
title_pages,
title,
author_info(author, author_pronouns, programme, specialization, year_of_study),
project_info(supervisor, consultant),
abstract_info(abstract, keywords),
acknowledgement,
assignment,
citations,
);
assert_type_signature(
acknowledgement, "dictionary[string : string] | none", "acknowledgement content"
);
assert_type_signature(author, "string | none", "author argument");
assert_type_signature(author_pronouns, "string | none", "author gender argument");
assert_type_signature(
supervisor, "string | dictionary[string : string] | none", "supervisor argument"
);
assert_type_signature(
consultant, "string | dictionary[string : string] | none", "consultant argument"
);
assert_type_signature(
programme, "dictionary[string : string] | none", "study programme argument"
);
assert_type_signature(branch, "dictionary[string : string] | none", "study branch argument");
assert_type_signature(year_of_study, "integer | none", "year of study");
assert_type_signature(assignment, "string | none", "assignment document argument");
assert_type_signature(citations, "string", "citations file argument");
check_arguments(args);
import "utils.typ": assert_in_dict, assert_type_signature
// templates
import "classic/classic.typ": template_classic
@@ -99,11 +95,7 @@
set text(lang: lang);
// template call
templates.at(style)(
lang, faculty, document, citations, assignment,
title, author, author_pronouns, supervisor, consultant,
programme, branch, year_of_study, abstract, acknowledgement, keywords, content
);
templates.at(style)(args, content);
import "prototyping.typ": assert_release_ready
assert_release_ready();

View File

@@ -297,7 +297,7 @@
<sort>
<key variable="citation-number"/>
</sort>
<layout prefix="(" suffix=")" delimiter=", ">
<layout prefix="[" suffix="]" delimiter=", ">
<group delimiter=", ">
<text variable="citation-number"/>
<group>
@@ -312,7 +312,7 @@
<key variable="citation-number"/>
</sort>
<layout>
<text variable="citation-number" display="left-margin" suffix=". "/>
<text variable="citation-number" display="left-margin" prefix="[" suffix="] "/>
<choose>
<if type="book map" match="any">
<group display="right-inline">

View File

@@ -309,3 +309,11 @@
}
mapper(value)
}
#let deref(arr) = {
if arr.len() == 0 {
arr.at(0)
} else {
arr
}
}

312
theses/bp_cs.typ Normal file
View File

@@ -0,0 +1,312 @@
#import "../template/template.typ": *
#show: tultemplate2.with(
style: "classic",
faculty: "fm",
lang: "cs",
document: "bp",
title: (
cs: "Ukázka dokumentu typu Bakalářská práce pro FM TUL v češtině",
en: "Example document for a Bachelor's thesis for FM TUL in Czech",
),
author: "Matěj Žucha",
author_pronouns: "masculine",
supervisor: "Ondřej Mekina",
consultant: "Michal Procházka (nepovinný údaj)",
programme: (cs: "Můj krásný studijní program"),
specialization: (cs: "Moje krásná studijní specializace"),
abstract: (
cs: [
Tento dokument slouží jako praktická ukázka všech důležitcýh funkcí šablony _tultemplate2_,
s názornými příklady použítí a jejich podrobným popisem.
],
en: [
This document serves as a practical demonstration of all the important features of the
_tultemplate2_ template, with useful examples and their respective descriptions.
],
),
keywords: (
cs: ("Ukázka", "Klíčových", "Slov", "Česky"),
en: ("Example", "Keywords", "In", "English"),
),
acknowledgement: (cs: "Lorem ipsum dolor sit amet."),
citations: "citations.bib",
)
= Co najdete v této šabloně
Tato šablona sloužit jako ukázková bakalářská práce napsaná pomocí jazyka *Typst* a šablony
*tultemplate2*. Může posloužit jako jednoduchý základ i pro vaši práci, stačí se naučit používat
pár užitečných funkcí, jako např. vkládání obrázků, tabulek, citací nebo odkazů.
Na rozdíl od souboru _documentation.typ_, který je dostupný ke stažení na stránkách projektu, obsahuje
tento dokument jenom to nejpotřebnější ze znalostí, co postačí k úspěšnému napsání práce. Pokud vám budou nějaké funkce chybět, můžete se podívat do zmíněného souboru, anebo kontaktovat některého z autorů, kteří se vám pokusí pomoct. Jen pro úplnost je zde ve zkratce něco málo o jazyce typst a motivaci k tvorbě této šablony:
Typst je profesionální sázecí nástroj podobný markdownu, LaTeXu/TeXu, groffu, atd.
Typst je moderní obdobou starších nástrojů, které postrádají spoustu důležitých funkcí, bez kterých
se v dnešní době prakticky nedá fungovat. Uživatel často musí importovat nepřeberné množství
balíčků, které poskytují (podle mě) naprosto základní funkcionalitu - jako například správná podpora
UTF-8 znaků, formátování prvků na základě jazykového lokálu, apod.
= Začínáme se šablonou
Tuto šablonu jste si pravděpodobně stáhli z generátoru na webu www.tulsablona.cz a vložili ji do Typst
online editoru. Tím pádem vidíte kromě zdrojového kódu také výsledný PDF soubor. Jak asi víte, hlavní
rozdíl mezi tradičními textovými procesory jako Microsoft Word nebo LibreOffice Writer a mezi sázecími
programy jako LaTeX nebo Typst je právě způsob, kterým se upravuje vzhled a obsah dokumentu.
Zatímco ve Wordu jsou uživatelé zvyklí, že pomocí tlačítek a klávesových zkratek mění dokument napřímo,
Typst (a i LaTeX) používají tzv. zdrojový soubor, který není ničím jiným než obyčejným textovým souborem,
a následně na vyžádání umí tento zdrojový soubor zkompilovat tj. proměnit na výsledný dokument, např. ve formátu PDF.
Proto zde najdete popis všech důležitých funkcí nikoliv jako galerii obrázků toho, na která tlačítka se
klikat, nýbrž jako ukázka a návod všech speciálních sekvencí textu, které Typst podporuje a které šablona vyhodnocuje jinak než obsah zprávy.
== Odstavce
Jak jsou někteří z vás možná zvyklí z Markdownu, odstavce, nadpisy a vlastně pro přehlednost všechny
logicky oddělené bloky se oddělují prázným řádkem. Toho jste si jistě mohli při prohlížení tohoto souboru
všimnout. Můžete si vyzkoušet, co se stane, když
použijete jenom ukončení řádku enterem,
nebo když použijete zmíněný prázdný řádek,
anebo co se stane při použití dvou a více prázdných řádků. (spoiler: 1 a více prázdných řádků mají identické
chování, pouze ukončení řádku je interpretováno stejně jako např. mezerník nebo tabulátor)
Uživatel tím pádem svobodu v tom, jestli ve zdrojovém souboru používá dlouhé řádky plné textu,
nebo
raději
přehlednější
formátování
a sám si obsah dělí na řádky, protože ve výsledném PDF souboru se stejně spojí do jednoho celistvého odstavce.
Musí akorát ručně dbát na to, aby odstavce nebyly příliš krátké, ani příliš dlouhé.
S souvislosti s odstavci bych ještě zmínil, že Typst se za vás stará také o zarovnávání písma a slov do bloků
a dělení slov mezi řádky, když se na něj nevejdou. Chováním odpovídá pravidlům českého pravopisu a typografie, takže se o to nemusíte vůbec starat.
== Nadpisy
První důležitá funkce kromě psaní samotného textu, k čemuž není zapotřebí žádná speciální syntax, jsou nadpisy.
Stejně jako v jiných programech, i Typst podporuje nadpisy více úrovní. Pro nadpis první úrovně se používá znaménko
rovná se a mezera na začátku řádku, čili ve zdrojovém souboru Typstu je používán takto:
```typst
= Můj nadpis první úrovně
```
Pro nadpis druhé úrovně pak použijeme dvě rovná se, pro nadpis třetí úrovně tři rovná se.
Šablona *tultemplate2* Vám ovšem bohužel nedovolí nadpis čtvrté a další úrovně, protože by takový
nadpis porušoval směrnice TUL o formátování dokumentů. Ale nemusíte se bát. Pokud takový nadpis
uděláte -- šablona vyhodí chybu, aby vás na to upozornila.
```typst
= Nadpis
== Podnadpis
=== Podpodnadpis
A pak obsah
```
== Číslování kapitol
Asi jste si všimli, že každý nadpis začíná číslem dané kapitoly. Toto číslování provádí Typst automaticky, promítne se následně i v sekci Obsah na začátku souboru, nemusíte se tak opět o nic starat.
= Používání funkcí
Používání většiny funkcionalit Typstu je prováděno pomocí tzv. volání funkce. Je to velmi podobné předchozím ukázkám,
akorát místo toho, aby se text obalil pouze jedním symbolem či podobnou jednoduchou značkou, obalíme text jménem dané funkce. Syntaxe vypadá nějak takto:
```typst
#Název_funkce[samotný text nebo jiné parametry]
```
Pokud v editoru napíšete symbol hashtagu, začne vám automaticky našeptávat všechny možné funkce a jejich popisy. Přejdeme rovnou k dalším praktickým příkladům.
== Zvýrazňování textu
Syntaxe základního zvýraznění je velmi podobná například Markdownu. Stačí použít následující symboly:
```typst
*tučně*
_kurzívou_
```
Další stylování lze dělat právě přes funkce, viz třeba:
```typst
#underline[podtrženo]
#strike[přeškrtnuto]
#highlight[zvýrazněno]
```
Pro úplnost a ukázku je zde přímo v textu *tučný text*, _text kurzívou_, #underline[podtržený text], #strike[přeškrtnutý text] a #highlight[text zvýrazněný podle barvy příslušící vaší fakultě].
== Odkazy<links>
Odkazy je možné dělat na URL/URI zdroje, e-maily, telefony, atd...
Odkázat URL (URI) je možné bez zavolání funkce, odkaz stačí prostě a jednodušše napsat:
https://git.zumepro.cz/tul/tultemplate2
```typst
https://git.zumepro.cz/tul/tultemplate2
```
Tohle interně volá funkci `link`.
Pokud odkazujeme na méně časté věci (jako e-maily), můžeme použít funkci `link` přímo.
```typst
#link("mailto:ondrej@mekina.cz")
```
Dalši předpony (URI schémata) můžete najít třeba na Wikipedii
https://en.wikipedia.org/wiki/List_of_URI_schemes.
== Obrázky
Obrázky je možné vkládat samotné, nebo i s popiskem.
Obrázek se vloží pomocí funkce `image`.
Přidání popisku a zároveň zalistování obrázku v indexu (aby se na ně třeba dalo odkazovat) lze
udělat pomocí funkce `figure`.
#block([
```typst
#figure(
image("mujobrazek.jpg"),
caption: [
*Krásný* obrázek, který vypadá jako obrázek.
]
)
```
], breakable: false)
Tady je praktická ukázka jednoduchého vložení obrázku s popiskem:
#figure(image("../template/assets/tul_logo.svg", width: 25%), caption: [
Logo *TUL*
])
První parametr funkce je zobrazovaný obsah, v našem případě zmíněný `image`. K němu můžeme psát různé parametry, v příkladu máme třeba nastavení šířky obrázku v procentech. Jako poslední je parametr `caption`, s jehož pomocí můžeme nastavit popisek obrázku/figury.
Obrázky se zobrazí na začátku dokumentu v seznamu (pokud to daný typ dokumentu vyžaduje). I toto za vás Typst dělá automaticky, vám tak stačí do textu přidávat obrázky, jak se to hodí, a všechny se poté korektně zobrazí v Seznamu obrázků s odkazem i správně uvedenou stránkou, na které se obrázek nachází. Obrázky jsou také automaticky číslovány podle předepsaného způsobu, podobně jako kapitoly.
== Tabulky
Tabulky lze vytvářet takto:
```typst
#figure(table(
columns: 3,
table.header([], [*Sloupec 1*], [*Sloupec 2*]),
[*Řádek 1*], [a], [b],
[*Řádek 2*], [c], [d],
), caption: "Moje krásná tabulka")
```
Parametr `columns` udává počet sloupců tabulky. Poté následuje libovolný počet buněk tabulky, pro lepší přehlednost jsou v příkladu jednotlivé řádky oddělené. Nakonec je zde opět parametr `caption` sloužící k zadání popisku tabulky.
#highlight[Hlavičku tabulky (první řádek) je dobré zabalit do funkce header (viz. výše)], to je
kvůli tomu, že Typst do vygenerovaného PDF souboru poté přidá metadata (například pro osoby se
zrakovým postižením).
#figure(table(
columns: 3,
table.header([], [*Sloupec 1*], [*Sloupec 2*]),
[*Řádek 1*], [a], [b],
[*Řádek 2*], [c], [d],
), caption: "Moje krásná tabulka")
Tabulky se zobrazí na začátku dokumentu v seznamu (pokud to daný typ dokumentu vyžaduje). Jak jste asi pochopili, i toto provede šablona automaticky.
== Citace
Šablona podporuje správu citací pomocí standardního BibTeX @bibtex souboru, stejně jako
například LaTeX. Generování citací v BibTeX zápisu umí téměř každá stránka nebo program, které mají pro citace podporu.
Kód takovéto citace ve vhodném formátu stačí přidat do souboru _citations.bib_, poté je možné se
na odkazovat pomocí `@jmeno_citace`, nebo `#cite(<jmeno_citace>)`. Můžu se tak třeba odkázat na
citaci Typstu #cite(<typst>).
Formát souboru _citations.bib_ je naprosto stejný jako pro LaTeX. Tyto citace lze přímo vložit
třeba z webu https://www.citace.com ve formátu BibTeX -- Typst tento formát také umí přečíst.
Můžete se do souboru s příponou .bib podívat, zjistíte, že je to opravdu jen obyčejný textový soubor se specifickou strukturou.
V přiloženém ukázkovém souboru nějaké citace jsou - např. již použitá citace se jménem `typst`.
Soubor, ze kterého se načtou citace lze změnit pomocí argumentu šablony (tj. struktura na začátku souboru):
```typst
#show: tultemplate2.with(
...
citations: "jinysoubor.bib",
...
)
```
== Vnitřní odkazy a kotvy<ukazka_odkazu>
Trochu navážeme na Odkazy (@links).
Můžete dělat i vnitřní odkazy třeba na kapitoly, stránky nebo obrázky s popiskem (zabalené ve
`figure`).
```typst
= Dobrá kapitola<dobra_kapitola>
Podívejme se na Dobrou kapitolu (@dobra_kapitola).
```
Takhle vypadá kotva:
```typst
<nazev_kotvy>
```
Kotvu dáte někam do souboru a můžete na odkazovat stejně jako na citace:
```typst
@nazev_kotvy
```
Můžeme se podívat na názornou ukázku odkazu (@ukazka_odkazu).
== Zkratky
LaTeX TUL šablona k začátku dokumentu seznam zkratek. Proto jsme ho přidali i do této šablony.
Seznam zkratek je v této šabloně nastaven tak, aby se zobrazoval pouze pokud je v něm alespoň jedna
zkratka (přišlo nám to poměrně logické).
Zkratku #abbr("ABC", "Abeceda") vytvoříte (definujete) pomocí:
```typst
#abbr("ABC", "Abeceda")
```
Potom zkratku #abbr("ABC") můžete použít přímo (bez opakované definice):
```typst
#abbr("ABC")
```
Šablona zajistí následující věci:
- Zkratka se zobrazí v seznamu zkratek
- Při prvním použití zkratky vás šablona donutí zkratku definovat
- Definice zkratky bude použita právě jednou (poprvé)
Při prvním použití zkratky (při definici) bude zkratka v textu vypadat takto:
#abbr("ZK", "Zkratka").
Při dalších použití bude vypadat takto: #abbr("ZK").
#highlight[
Tedy zkratku _nepřidáváte_ přímo do seznamu zkratek, ale elegantně používáte přímo v textu.
]
== Přílohy
Na konec souboru (nebo klidně doprostřed či na začátek, hlavní je, že pouze jednou) je také možné dát strukturu generující přílohy. Momentálně jsou podporované čtyři typy příloh: odkaz, obsah, PDF soubor vložený na konec dokumentu a odkaz na externí soubor (například přiložený do systému s bakalářskou prací).
Jako demonstrace by měla postačit praktická ukázka, která ve zdrojovém kódu následuje hned za tímto odstavcem, a která generuje přílohy tohoto dokumentu.
#attachments(
attach_link("Zdrojový kód této šablony", "https://git.zumepro.cz/tul/tultemplate2"),
attach_content("Testovací obsah vygenerovaný Typstem", [Sem lze psát _stylovaný_ obsah.]),
)

299
theses/bp_en.typ Normal file
View File

@@ -0,0 +1,299 @@
#import "../template/template.typ": *
#show: tultemplate2.with(
style: "classic",
faculty: "fm",
lang: "en",
document: "bp",
title: (
en: "Example document for a Bachelor's thesis for FM TUL in English",
cs: "Ukázka dokumentu typu Bakalářská práce pro FM TUL v angličtině",
),
author: "Matěj Žucha",
author_pronouns: "me",
supervisor: "Ondřej Mekina",
consultant: "Michal Procházka (nepovinný údaj)",
programme: (en: "My beautiful study programme"),
branch: (en: "My beautiful study branch"),
abstract: (
en: [
This document serves as a practical demonstration of all the important features of the
_tultemplate2_ template, with useful examples and their respective descriptions.
],
cs: [
Tento dokument slouží jako praktická ukázka všech důležitcýh funkcí šablony _tultemplate2_,
s názornými příklady použítí a jejich podrobným popisem.
],
),
keywords: (
en: ("Example", "Keywords", "In", "English"),
cs: ("Ukázka", "Klíčových", "Slov", "Česky"),
),
acknowledgement: (en: "Lorem ipsum dolor sit amet."),
citations: "citations.bib",
)
= A quick few words about this template
This template should serve as an example Bachelor thesis written with the help of the *Typst* programming language and the *tultemplate2* template. It can be used as a starting point for your own report, you just have to learn a few of its useful functions, e.g. how to insert images, tables, citacions or links.
In contrast with the _documentation.typ_ file, which is available for download on the project's page, this document only contains the most necessary knowledge to complete most reports. If you find this document lacking in features, you can look at the aforementioned docs or contact one of the authors, who will try to help you. Just for the sake of completeness, here is a few words about the Typst programming aanguage and about Typst, as well as about the motivation behind the creation of this template:
Typst is a professional typesetting language similar to markdown, LaTeX/TeX, groff, etc.
Typst is the modern equivalent of older typesetting tools, which often lack a lot of important features, such that make it next to impossible to work without today. The user must often import an incountable number of packages, which only provide only the most basic of functionalities - for example proper UTF-8 character support, formatting of elements based on the set locale, etc.
= Getting Started with the Template
You have probably downloaded this template from the generator on the website www.tulsablona.cz and inserted it into the Typst online editor. Therefore, besides the source code, you can also see the resulting PDF file. As you probably know, the main difference between traditional word processors like Microsoft Word or LibreOffice Writer and typesetting programs like LaTeX or Typst is the way in which the appearance and content of the document are edited.
While Word users are used to changing the document directly using buttons and keyboard shortcuts, Typst (and also LaTeX) use a so-called source file, which is nothing more than an ordinary text file, and can then, on request, compile this source file i.e., turn it into the final document, for example in PDF format.
Thats why here you will find a description of all the important functions not as a gallery of images showing which buttons to click, but rather as an example and guide to all the special text sequences that Typst supports and that the template interprets differently from the main content of the report.
== Paragraphs
Some of you might know this concept from using Markdown, where paragraphs, headings and for the sake of clarity all logically coherent blocks are separated by an empty line. You might have already spotted this while reading through this document. You can try for yourself what happens when
you just end the line
or when you properly use an empty line,
or maybe what happens if you use two or more empty rows. (spoiler: 1 or more empty lines share identical behavior, while newlining only is interpreted the same as using spaces or tabs)
Therefore, the user has freedom of choosing whether he uses long lines full of text,
or
if
he
prefers
a
cleaner
formatting
and manages the separation of content to lines, because it all gets concatenated into a nice consice paragraph.
The user has to manually watch out for the length of the paragraphs, so that they are neither too short or too long.
In the context of paragraphs, it should be mentioned that Typst also manages the alignment of text and words into blocks and the division of words between lines when they don't fit.
This behavior complies with the English grammar and typography rules fully, so you don't have to think about that at all.
== Headings
První důležitá funkce kromě psaní samotného textu, k čemuž není zapotřebí žádná speciální syntax, jsou nadpisy.
Stejně jako v jiných programech, i Typst podporuje nadpisy více úrovní. Pro nadpis první úrovně se používá znaménko
rovná se a mezera na začátku řádku, čili ve zdrojovém souboru Typstu je používán takto:
```typst
= Můj nadpis první úrovně
```
Pro nadpis druhé úrovně pak použijeme dvě rovná se, pro nadpis třetí úrovně tři rovná se... Úrovní podnadpisů je dost na to, že vám pravděpodobně nedojdou.
```typst
= Nadpis
== Podnadpis
=== Podpodnadpis
==== už tomu asi rozumíte ...
A pak obsah
```
== Číslování kapitol
Asi jste si všimli, že každý nadpis začíná číslem dané kapitoly. Toto číslování provádí Typst automaticky, promítne se následně i v sekci Obsah na začátku souboru, nemusíte se tak opět o nic starat.
= Používání funkcí
Používání většiny funkcionalit Typstu je prováděno pomocí tzv. volání funkce. Je to velmi podobné předchozím ukázkám,
akorát místo toho, aby se text obalil pouze jedním symbolem či podobnou jednoduchou značkou, obalíme text jménem dané funkce. Syntaxe vypadá nějak takto:
```typst
#Název_funkce[samotný text nebo jiné parametry]
```
Pokud v editoru napíšete symbol hashtagu, začne vám automaticky našeptávat všechny možné funkce a jejich popisy. Přejdeme rovnou k dalším praktickým příkladům.
== Zvýrazňování textu
Syntaxe základního zvýraznění je velmi podobná například Markdownu. Stačí použít následující symboly:
```typst
*tučně*
_kurzívou_
```
Další stylování lze dělat právě přes funkce, viz třeba:
```typst
#underline[podtrženo]
#strike[přeškrtnuto]
#highlight[zvýrazněno]
```
Pro úplnost a ukázku je zde přímo v textu *tučný text*, _text kurzívou_, #underline[podtržený text], #strike[přeškrtnutý text] a #highlight[text zvýrazněný podle barvy příslušící vaší fakultě].
== Odkazy<links>
Odkazy je možné dělat na URL/URI zdroje, e-maily, telefony, atd...
Odkázat URL (URI) je možné bez zavolání funkce, odkaz stačí prostě a jednodušše napsat:
https://git.zumepro.cz/tul/tultemplate2
```typst
https://git.zumepro.cz/tul/tultemplate2
```
Tohle interně volá funkci `link`.
Pokud odkazujeme na méně časté věci (jako e-maily), můžeme použít funkci `link` přímo.
```typst
#link("mailto:ondrej@mekina.cz")
```
Dalši předpony (URI schémata) můžete najít třeba na Wikipedii
https://en.wikipedia.org/wiki/List_of_URI_schemes.
== Obrázky
Obrázky je možné vkládat samotné, nebo i s popiskem.
Obrázek se vloží pomocí funkce `image`:
Přidání popisku a zároveň zalistování obrázku v indexu (aby se na ně třeba dalo odkazovat) lze
udělat pomocí funkce `figure`.
#block([
```typst
#figure(
image("mujobrazek.jpg"),
caption: [
*Krásný* obrázek, který vypadá jako obrázek.
]
)
```
], breakable: false)
Tady je praktická ukázka jednoduchého vložení obrázku s popiskem:
#figure(image("../template/assets/tul_logo.svg", width: 25%), caption: [
Logo *TUL*
])
První parametr funkce je zobrazovaný obsah, v našem případě zmíněný `image`. K němu můžeme psát různé parametry, v příkladu máme třeba nastavení šířky obrázku v procentech. Jako poslední je parametr `caption`, s jehož pomocí můžeme nastavit popisek obrázku/figury.
Obrázky se zobrazí na začátku dokumentu v seznamu (pokud to daný typ dokumentu vyžaduje). I toto za vás Typst dělá automaticky, vám tak stačí do textu přidávat obrázky, jak se to hodí, a všechny se poté korektně zobrazí v Seznamu obrázků s odkazem i správně uvedenou stránkou, na které se obrázek nachází. Obrázky jsou také automaticky číslovány podle předepsaného způsobu, podobně jako kapitoly.
== Tabulky
Tabulky lze vytvářet takto:
```typst
#figure(table(
columns: 3,
table.header([], [*Sloupec 1*], [*Sloupec 2*]),
[*Řádek 1*], [a], [b],
[*Řádek 2*], [c], [d],
), caption: "Moje krásná tabulka")
```
Parametr `columns` udává počet sloupců tabulky. Poté následuje libovolný počet buněk tabulky, pro lepší přehlednost jsou v příkladu jednotlivé řádky oddělené. Nakonec je zde opět parametr `caption` sloužící k zadání popisku tabulky.
#highlight[Hlavičku tabulky (první řádek) je dobré zabalit do funkce header (viz. výše)], to je
kvůli tomu, že Typst do vygenerovaného PDF souboru poté přidá metadata (například pro osoby se
zrakovým postižením).
#figure(table(
columns: 3,
table.header([], [*Sloupec 1*], [*Sloupec 2*]),
[*Řádek 1*], [a], [b],
[*Řádek 2*], [c], [d],
), caption: "Moje krásná tabulka")
Tabulky se zobrazí na začátku dokumentu v seznamu (pokud to daný typ dokumentu vyžaduje). Jak jste asi pochopili, i toto provede šablona automaticky.
== Citace
Šablona podporuje správu citací pomocí standardního BibTeX @bibtex souboru, stejně jako
například LaTeX. Generování citací v BibTeX zápisu umí téměř každá stránka nebo program, které mají pro citace podporu.
Kód takovéto citace ve vhodném formátu stačí přidat do souboru _citations.bib_, poté je možné se
na odkazovat pomocí `@jmeno_citace`, nebo `#cite(<jmeno_citace>)`. Můžu se tak třeba odkázat na
citaci Typstu #cite(<typst>).
Formát souboru _citations.bib_ je naprosto stejný jako pro LaTeX. Tyto citace lze přímo vložit
třeba z webu https://www.citace.com ve formátu BibTeX -- Typst tento formát také umí přečíst.
Můžete se do souboru s příponou .bib podívat, zjistíte, že je to opravdu jen obyčejný textový soubor se specifickou strukturou.
V přiloženém ukázkovém souboru nějaké citace jsou - např. již použitá citace se jménem `typst`.
Soubor, ze kterého se načtou citace lze změnit pomocí argumentu šablony (tj. struktura na začátku souboru):
```typst
#show: tultemplate2.with(
...
citations: "jinysoubor.bib",
...
)
```
== Vnitřní odkazy a kotvy<ukazka_odkazu>
Trochu navážeme na Odkazy (@links).
Můžete dělat i vnitřní odkazy třeba na kapitoly, stránky nebo obrázky s popiskem (zabalené ve
`figure`).
```typst
= Dobrá kapitola<dobra_kapitola>
Podívejme se na Dobrou kapitolu (@dobra_kapitola).
```
Takhle vypadá kotva:
```typst
<nazev_kotvy>
```
Kotvu dáte někam do souboru a můžete na odkazovat stejně jako na citace:
```typst
@nazev_kotvy
```
Můžeme se podívat na názornou ukázku odkazu (@ukazka_odkazu).
== Zkratky
LaTeX TUL šablona k začátku dokumentu seznam zkratek. Proto jsme ho přidali i do této šablony.
Seznam zkratek je v této šabloně nastaven tak, aby se zobrazoval pouze pokud je v něm alespoň jedna
zkratka (přišlo nám to poměrně logické).
Zkratku #abbr("ABC", "Abeceda") vytvoříte (definujete) pomocí:
```typst
#abbr("ABC", "Abeceda")
```
Potom zkratku #abbr("ABC") můžete použít přímo (bez opakované definice):
```typst
#abbr("ABC")
```
Šablona zajistí následující věci:
- Zkratka se zobrazí v seznamu zkratek
- Při prvním použití zkratky vás šablona donutí zkratku definovat
- Definice zkratky bude použita právě jednou (poprvé)
Při prvním použití zkratky (při definici) bude zkratka v textu vypadat takto:
#abbr("ZK", "Zkratka").
Při dalších použití bude vypadat takto: #abbr("ZK").
#highlight[
Tedy zkratku _nepřidáváte_ přímo do seznamu zkratek, ale elegantně používáte přímo v textu.
]
== Přílohy
Na konec souboru (nebo klidně doprostřed či na začátek, hlavní je, že pouze jednou) je také možné dát strukturu generující přílohy. Momentálně jsou podporované dva typy příloh, odkaz a obsah.
Jako demonstrace by měla postačit praktická ukázka, která ve zdrojovém kódu následuje hned za tímto odstavcem, a která generuje přílohy tohoto dokumentu.
#attachments(
attach_link("Zdrojový kód této šablony", "https://git.zumepro.cz/tul/tultemplate2"),
attach_content("Testovací obsah vygenerovaný Typstem", [Sem lze psát _stylovaný_ obsah.]),
)

312
theses/dp_cs.typ Normal file
View File

@@ -0,0 +1,312 @@
#import "../template/template.typ": *
#show: tultemplate2.with(
style: "classic",
faculty: "fm",
lang: "cs",
document: "dp",
title: (
cs: "Ukázka dokumentu typu Diplomová práce pro FM TUL v češtině",
en: "Example document for a Master's thesis for FM TUL in Czech",
),
author: "Matěj Žucha",
author_pronouns: "masculine",
supervisor: "Ondřej Mekina",
consultant: "Michal Procházka (nepovinný údaj)",
programme: (cs: "Můj krásný studijní program"),
abstract: (
cs: [
Tento dokument slouží jako praktická ukázka všech důležitcýh funkcí šablony _tultemplate2_,
s názornými příklady použítí a jejich podrobným popisem.
],
en: [
This document serves as a practical demonstration of all the important features of the
_tultemplate2_ template, with useful examples and their respective descriptions.
]
),
keywords: (
cs: ("Ukázka", "Klíčových", "Slov", "Česky"),
en: ("Example", "Keywords", "In", "English"),
),
acknowledgement: (cs: "Lorem ipsum dolor sit amet."),
citations: "citations.bib",
)
= Co najdete v této šabloně
Tato šablona sloužit jako ukázková bakalářská práce napsaná pomocí jazyka *Typst* a šablony
*tultemplate2*. Může posloužit jako jednoduchý základ i pro vaši práci, stačí se naučit používat
pár užitečných funkcí, jako např. vkládání obrázků, tabulek, citací nebo odkazů.
Na rozdíl od souboru _example.typ_, který je dostupný ke stažení na stránkách projektu, obsahuje
tento dokument jenom to nejpotřebnější ze znalostí, co postačí k úspěšnému napsání práce. Jen pro
úplnost je zde ve zkratce něco málo o jazyce typst a motivaci k tvorbě této šablony:
Typst je profesionální sázecí nástroj podobný markdownu, LaTeXu/TeXu, groffu, atd.
Typst je moderní obdobou starších nástrojů, které postrádají spoustu důležitých funkcí, bez kterých
se v dnešní době prakticky nedá fungovat. Uživatel často musí importovat nepřeberné množství
balíčků, které poskytují (podle mě) naprosto základní funkcionalitu - jako například správná podpora
UTF-8 znaků, formátování prvků na základě jazykového lokálu, apod.
= Začínáme se šablonou
Tuto šablonu jste si pravděpodobně stáhli z generátoru na webu www.tulsablona.cz a vložili ji do Typst
online editoru. Tím pádem vidíte kromě zdrojového kódu také výsledný PDF soubor. Jak asi víte, hlavní
rozdíl mezi tradičními textovými procesory jako Microsoft Word nebo LibreOffice Writer a mezi sázecími
programy jako LaTeX nebo Typst je právě způsob, kterým se upravuje vzhled a obsah dokumentu.
Zatímco ve Wordu jsou uživatelé zvyklí, že pomocí tlačítek a klávesových zkratek mění dokument napřímo,
Typst (a i LaTeX) používají tzv. zdrojový soubor, který není ničím jiným než obyčejným textovým souborem,
a následně na vyžádání umí tento zdrojový soubor zkompilovat tj. proměnit na výsledný dokument, např. ve formátu PDF.
Proto zde najdete popis všech důležitých funkcí nikoliv jako galerii obrázků toho, na která tlačítka se
klikat, nýbrž jako ukázka a návod všech speciálních sekvencí textu, které Typst podporuje a které šablona vyhodnocuje jinak než obsah zprávy.
== Odstavce
Jak jsou někteří z vás možná zvyklí z Markdownu, odstavce, nadpisy a vlastně pro přehlednost všechny
logicky oddělené bloky se oddělují prázným řádkem. Toho jste si jistě mohli při prohlížení tohoto souboru
všimnout. Můžete si vyzkoušet, co se stane, když
použijete jenom ukončení řádku enterem,
nebo když použijete zmíněný prázdný řádek,
anebo co se stane při použití dvou a více prázdných řádků. (spoiler: 1 a více prázdných řádků mají identické
chování, pouze ukončení řádku je interpretováno stejně jako např. mezerník)
Uživatel tím pádem svobodu v tom, jestli ve zdrojovém souboru používá dlouhé řádky plné textu,
nebo
raději
přehlednější
formátování
a sám si obsah dělí na řádky, protože ve výsledném PDF souboru se stejně spojí do jednoho celistvého odstavce.
Musí akorát ručně dbát na to, aby odstavce nebyly příliš krátké, ani příliš dlouhé.
S souvislosti s odstavci bych ještě zmínil, že Typst se za vás stará také o zarovnávání písma a slov do bloků
a dělení slov mezi řádky. Chováním odpovídá pravidlům českého pravopisu a typografie, takže se o to nemusíte vůbec starat.
== Nadpisy
První důležitá funkce kromě psaní samotného textu, k čemuž není zapotřebí žádná speciální syntax, jsou nadpisy.
Stejně jako v jiných programech, i Typst podporuje nadpisy více úrovní. Pro nadpis první úrovně se používá znaménko
rovná se a mezera na začátku řádku, čili ve zdrojovém souboru Typstu je používán takto:
```typst
= Můj nadpis první úrovně
```
Pro nadpis druhé úrovně pak použijeme dvě rovná se, pro nadpis třetí úrovně tři rovná se.
Šablona *tultemplate2* Vám ovšem bohužel nedovolí nadpis čtvrté a další úrovně, protože by takový
nadpis porušoval směrnice TUL o formátování dokumentů. Ale nemusíte se bát. Pokud takový nadpis
uděláte -- šablona vyhodí chybu, aby vás na to upozornila.
```typst
= Nadpis
== Podnadpis
=== Podpodnadpis
A pak obsah
```
== Číslování kapitol
Asi jste si všimli, že každý nadpis začíná číslem dané kapitoly. Toto číslování provádí Typst automaticky, promítne se následně i v sekci Obsah na začátku souboru, nemusíte se tak opět o nic starat.
= Používání funkcí
Používání většiny funkcionalit Typstu je prováděno pomocí tzv. volání funkce. Je to velmi podobné předchozím ukázkám,
akorát místo toho, aby se text obalil pouze jedním symbolem či podobnou jednoduchou značkou, obalíme text jménem dané funkce. Syntaxe vypadá nějak takto:
```typst
#Název_funkce[samotný text nebo jiné parametry]
```
Pokud v editoru napíšete symbol hashtagu, začne vám automaticky našeptávat všechny možné funkce a jejich popisy. Přejdeme rovnou k dalším praktickým příkladům.
== Zvýrazňování textu
Syntaxe základního zvýraznění je velmi podobná například Markdownu. Stačí použít následující symboly:
```typst
*tučně*
_kurzívou_
```
Další stylování lze dělat právě přes funkce, viz třeba:
```typst
#underline[podtrženo]
#strike[přeškrtnuto]
#highlight[zvýrazněno]
```
Pro úplnost a ukázku je zde přímo v textu *tučný text*, _text kurzívou_, #underline[podtržený text], #strike[přeškrtnutý text] a #highlight[text zvýrazněný podle barvy příslušící vaší fakultě].
== Odkazy<links>
Odkazy je možné dělat na URL/URI zdroje, e-maily, telefony, atd...
Odkázat URL (URI) je možné bez zavolání funkce, odkaz stačí prostě a jednodušše napsat:
https://git.zumepro.cz/tul/tultemplate2
```typst
https://git.zumepro.cz/tul/tultemplate2
```
Tohle interně volá funkci `link`.
Pokud odkazujeme na méně časté věci (jako e-maily), můžeme použít funkci `link` přímo.
```typst
#link("mailto:ondrej@mekina.cz")
```
Dalši předpony (URI schémata) můžete najít třeba na Wikipedii
https://en.wikipedia.org/wiki/List_of_URI_schemes.
== Obrázky
Obrázky je možné vkládat samotné, nebo i s popiskem.
Obrázek se vloží pomocí funkce `image`.
Přidání popisku a zároveň zalistování obrázku v indexu (aby se na ně třeba dalo odkazovat) lze
udělat pomocí funkce `figure`.
#block([
```typst
#figure(
image("mujobrazek.jpg"),
caption: [
*Krásný* obrázek, který vypadá jako obrázek.
]
)
```
], breakable: false)
Tady je praktická ukázka jednoduchého vložení obrázku s popiskem:
#figure(image("../template/assets/tul_logo.svg", width: 25%), caption: [
Logo *TUL*
])
První parametr funkce je zobrazovaný obsah, v našem případě zmíněný `image`. K němu můžeme psát různé parametry, v příkladu máme třeba nastavení šířky obrázku v procentech. Jako poslední je parametr `caption`, s jehož pomocí můžeme nastavit popisek obrázku/figury.
Obrázky se zobrazí na začátku dokumentu v seznamu (pokud to daný typ dokumentu vyžaduje). I toto za vás Typst dělá automaticky, vám tak stačí do textu přidávat obrázky, jak se to hodí, a všechny se poté korektně zobrazí v Seznamu obrázků s odkazem i správně uvedenou stránkou, na které se obrázek nachází. Obrázky jsou také automaticky číslovány podle předepsaného způsobu, podobně jako kapitoly.
== Tabulky
Tabulky lze vytvářet takto:
```typst
#figure(table(
columns: 3,
table.header([], [*Sloupec 1*], [*Sloupec 2*]),
[*Řádek 1*], [a], [b],
[*Řádek 2*], [c], [d],
), caption: "Moje krásná tabulka")
```
Parametr `columns` udává počet sloupců tabulky. Poté následuje libovolný počet buněk tabulky, pro lepší přehlednost jsou v příkladu jednotlivé řádky oddělené. Nakonec je zde opět parametr `caption` sloužící k zadání popisku tabulky.
#highlight[Hlavičku tabulky (první řádek) je dobré zabalit do funkce header (viz. výše)], to je
kvůli tomu, že Typst do vygenerovaného PDF souboru poté přidá metadata (například pro osoby se
zrakovým postižením).
#figure(table(
columns: 3,
table.header([], [*Sloupec 1*], [*Sloupec 2*]),
[*Řádek 1*], [a], [b],
[*Řádek 2*], [c], [d],
), caption: "Moje krásná tabulka")
Tabulky se zobrazí na začátku dokumentu v seznamu (pokud to daný typ dokumentu vyžaduje). Jak jste asi pochopili, i toto provede šablona automaticky.
== Citace
Šablona podporuje správu citací pomocí standardního BibTeX @bibtex souboru, stejně jako
například LaTeX. Generování citací v BibTeX zápisu umí téměř každá stránka nebo program, které mají pro citace podporu.
Kód takovéto citace ve vhodném formátu stačí přidat do souboru _citations.bib_, poté je možné se
na odkazovat pomocí `@jmeno_citace`, nebo `#cite(<jmeno_citace>)`. Můžu se tak třeba odkázat na
citaci Typstu #cite(<typst>).
Formát souboru _citations.bib_ je naprosto stejný jako pro LaTeX. Tyto citace lze přímo vložit
třeba z webu https://www.citace.com ve formátu BibTeX -- Typst tento formát také umí přečíst.
Můžete se do souboru s příponou .bib podívat, zjistíte, že je to opravdu jen obyčejný textový soubor se specifickou strukturou.
V přiloženém ukázkovém souboru nějaké citace jsou - např. již použitá citace se jménem `typst`.
Soubor, ze kterého se načtou citace lze změnit pomocí argumentu šablony (tj. struktura na začátku souboru):
```typst
#show: tultemplate2.with(
...
citations: "jinysoubor.bib",
...
)
```
== Vnitřní odkazy a kotvy<ukazka_odkazu>
Trochu navážeme na Odkazy (@links).
Můžete dělat i vnitřní odkazy třeba na kapitoly, stránky nebo obrázky s popiskem (zabalené ve
`figure`).
```typst
= Dobrá kapitola<dobra_kapitola>
Podívejme se na Dobrou kapitolu (@dobra_kapitola).
```
Takhle vypadá kotva:
```typst
<nazev_kotvy>
```
Kotvu dáte někam do souboru a můžete na odkazovat stejně jako na citace:
```typst
@nazev_kotvy
```
Můžeme se podívat na názornou ukázku odkazu (@ukazka_odkazu).
== Zkratky
LaTeX TUL šablona k začátku dokumentu seznam zkratek. Proto jsme ho přidali i do této šablony.
Seznam zkratek je v této šabloně nastaven tak, aby se zobrazoval pouze pokud je v něm alespoň jedna
zkratka (přišlo nám to poměrně logické).
Zkratku #abbr("ABC", "Abeceda") vytvoříte (definujete) pomocí:
```typst
#abbr("ABC", "Abeceda")
```
Potom zkratku #abbr("ABC") můžete použít přímo (bez opakované definice):
```typst
#abbr("ABC")
```
Šablona zajistí následující věci:
- Zkratka se zobrazí v seznamu zkratek
- Při prvním použití zkratky vás šablona donutí zkratku definovat
- Definice zkratky bude použita právě jednou (poprvé)
Při prvním použití zkratky (při definici) bude zkratka v textu vypadat takto:
#abbr("ZK", "Zkratka").
Při dalších použití bude vypadat takto: #abbr("ZK").
#highlight[
Tedy zkratku _nepřidáváte_ přímo do seznamu zkratek, ale elegantně používáte přímo v textu.
]
== Přílohy
Na konec souboru (nebo klidně doprostřed či na začátek, hlavní je, že pouze jednou) je také možné dát strukturu generující přílohy. Momentálně jsou podporované čtyři typy příloh: odkaz, obsah, PDF soubor vložený na konec dokumentu a odkaz na externí soubor (například přiložený do systému s diplomovou prací).
Jako demonstrace by měla postačit praktická ukázka, která ve zdrojovém kódu následuje hned za tímto odstavcem, a která generuje přílohy tohoto dokumentu.
#attachments(
attach_link("Zdrojový kód této šablony", "https://git.zumepro.cz/tul/tultemplate2"),
attach_content("Testovací obsah vygenerovaný Typstem", [Sem lze psát _stylovaný_ obsah.]),
)