30 Commits

Author SHA1 Message Date
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
d8dc47e3b0 improve compliance with guidelines 2025-10-07 17:52:31 +02:00
3beac874c1 add dp to documentation 2025-10-07 14:05:05 +02:00
0dc0ed4249 make study branch optional for dp 2025-10-07 14:03:24 +02:00
5d763827e8 chagne document identifier for dp 2025-10-07 14:01:06 +02:00
7b3831f5fb add language entries for dp 2025-10-07 13:59:50 +02:00
89c3be0bf0 add base for dp 2025-10-07 13:56:16 +02:00
6e17d96b8b improve building and add example watcher to bundle 2025-10-07 12:57:00 +02:00
6d27bd5df5 add non-zipped bundling for templategen 2025-10-07 12:25:52 +02:00
178be2e174 colorize external links 2025-10-06 18:32:36 +02:00
a90543cdbd compensate mono font size 2025-10-06 18:21:55 +02:00
aeb112f5a1 give example.typ a better name 2025-10-06 18:02:36 +02:00
bf63657df3 add font tip to readme 2025-10-06 17:34:42 +02:00
3f53ed89ba minify data files 2025-10-06 17:26:57 +02:00
da11cd88fa rename author gender to author pronouns 2025-10-06 13:16:01 +02:00
d915b8cf27 add year of study to document info 2025-10-06 11:52:28 +02:00
afc1ee372f add author to acknowledgement 2025-10-06 11:24:25 +02:00
d478d63812 implement acknowledgement 2025-10-06 11:12:00 +02:00
527534f885 update example.typ 2025-10-03 21:19:37 +02:00
5c35389dca add attachments to example.typ 2025-10-03 19:28:00 +02:00
f22b16a803 add optional institute for supervisor and consultant entries 2025-10-03 19:02:31 +02:00
Matej-Zucha-TUL
f66f36d560 Add missing argument describtions 2025-10-03 12:01:14 +02:00
011ef2c950 add absolute url for mirror repo 2025-10-03 11:34:14 +02:00
2787bed48d fix Matěj damage 2025-10-03 11:09:23 +02:00
a691d84e1b implement attachments 2025-10-03 11:07:22 +02:00
16 changed files with 1201 additions and 78 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,45 +1,109 @@
.PHONY: view_example
view_example: example.pdf
.PHONY: view_documentation
view_documentation: documentation.pdf
xdg-open $<
.PHONY: watch_example
watch_example:
typst watch --font-path template/fonts example.typ & xdg-open example.pdf
.PHONY: watch_documentation
watch_documentation:
typst watch --font-path template/fonts documentation.typ & xdg-open documentation.pdf
.PHONY: example
example: example.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
PACKDIR := pack/tultemplate2
BUNDLEDIR := pack/bundle
TO_PACK := $(shell find template -type f) template/LICENSE
PACK_TARGETS := $(TO_PACK:%=pack/tultemplate2/%) pack/tultemplate2/example.typ \
pack/tultemplate2/citations.bib
BUNDLE_TARGETS := $(TO_PACK:%=$(BUNDLEDIR)/%) $(BUNDLEDIR)/citations.bib $(BUNDLEDIR)/bp.typ \
$(BUNDLEDIR)/dp.typ $(BUNDLEDIR)/Makefile
PACK_TARGETS := $(TO_PACK:%=$(PACKDIR)/%) $(PACKDIR)/documentation.typ \
$(PACKDIR)/documentation.pdf $(PACKDIR)/citations.bib
.PHONY: pack
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 example.pdf
rm -f documentation.pdf bp.pdf dp.pdf
pack/tultemplate2.zip: $(PACK_TARGETS)
@mkdir -p $(@D)
rm -f $@
cd pack && zip -r tultemplate2.zip tultemplate2
pack/tultemplate2/%: %
ln -f $< $@
pack/tultemplate2/template/LICENSE: LICENSE
$(PACKDIR)/%: %
@mkdir -p $(@D)
ln -f $< $@
pack/tultemplate2/template/%: template/%
$(BUNDLEDIR)/citations.bib:
@mkdir -p $(@D)
touch $@
$(BUNDLEDIR)/bp.typ: theses/bp.typ
@mkdir -p $(@D)
awk 'BEGIN{RS=""; ORS="\n\n"} NR>2{print}' $< | sed 's/\.\.\/template\//template\//' > $@
$(BUNDLEDIR)/dp.typ: theses/dp.typ
@mkdir -p $(@D)
awk 'BEGIN{RS=""; ORS="\n\n"} NR>2{print}' $< | sed 's/\.\.\/template\//template\//' > $@
$(BUNDLEDIR)/Makefile: templategen.mk
@mkdir -p $(@D)
ln -f $< $@
$(PACKDIR)/template/LICENSE: LICENSE
@mkdir -p $(@D)
ln -f $< $@
$(BUNDLEDIR)/template/LICENSE: LICENSE
@mkdir -p $(@D)
ln -f $< $@
$(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' > $@
$(PACKDIR)/template/lang.json: template/lang.json
@mkdir -p $(@D)
cat $< | jq -c > $@
$(BUNDLEDIR)/template/lang.json: template/lang.json
@mkdir -p $(@D)
cat $< | jq -c > $@
$(PACKDIR)/template/%: template/%
@mkdir -p $(@D)
ln -f $< $@
$(BUNDLEDIR)/template/%: template/%
@mkdir -p $(@D)
ln -f $< $@
TEMPLATE_SRCS := $(shell find template -type f)
%.pdf: %.typ $(TEMPLATE_SRCS)
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 $<
include tests/make.mk

View File

@@ -6,6 +6,7 @@ Easy Typst template for TUL documents. Begin by compiling `example.typ` and read
It is recommended to use either:
- The on-line Typst editor (https://typst.app/play/) - use some zip build from releases
(https://git.zumepro.cz/tul/tultemplate2/releases).
- The `typst` CLI tool (available in Arch repos and Snap)
On Linux, with the `typst` command available, you can just run:
@@ -20,3 +21,5 @@ That will compile the example document and view it.
> [!IMPORTANT]
> This repo uses git lfs to pull fonts. Please set it up (or download a packed build from releases).
> When running in CLI - you'll want to include the embedded fonts:
> `typst compile --font-path template/fonts example.typ`

View File

@@ -2,9 +2,8 @@
#show: tultemplate2.with(
title: (cs: "Návod na použití Typst TUL šablony"),
author: "Ondřej Mekina",
author: "Ondřej Mekina, Matěj Žucha",
supervisor: "Ondřej Mekina",
consultant: "Matěj Žucha"
)
= Lehký úvod do Typstu a této šablony
@@ -92,7 +91,7 @@ opravdu hodně vám to usnadní práci.
// tohle je podnadpis :)
#heading(
level: 3,
level: 2,
range(1, 6).map((v) => range(1, v).map((_) => "pod").join("") + "nadpisy").join(", ") + ", ..."
)<chained_subheading>
@@ -106,6 +105,10 @@ Velmi jednoduché. Stačí na začátek řádku dát znak `=` kolikrát chcete.
A pak obsah
```
#highlight[
V rámci šablony classic lze použít nadpisy *maximálně* třetí úrovně -- jinak šablona vyhodí chybu.
]
== Zvýrazňování textu
Syntaxe je velmi podobná například markdownu. Stačí:
@@ -169,8 +172,7 @@ A některé funkce berou klasický obsah -- v těch je možné psát obsah jako
== Obrázky
Obrázky je možné vkládat samotné i třeba s popiskem.
Obrázek se vloží pomocí funkce `image`:
Obrázek se vloží pomocí funkce `image`.
Přidání popisku a zároveň zalistování obrázku v indexu (aby se na třeba dalo odkazovat) lze
udělat pomocí funkce `figure`.
@@ -324,26 +326,42 @@ Zvýrazněné hodnoty jsou základní -- pokud vynecháte parametr, pak bude pou
- `document` (typ dokumentu)
- *`"other"`* - nespecifikovaný (neformální) typ dokumentu
- `bp` - Bakalářská práce
- `dp` - Diplomová práce
#line()
- `title` (nadpis dokumentu)
- Ve formátu `(<zkratka_jazyka>: "<nadpis>")`, například `(cs: "Můj nadpis")`
- Pro většinu dokumentů (kromě `other`) jsou vyžadovány verze _cs_ a _en_ (kvůli abstraktu).
#line()
- `author` (autor/autoři dokumentu)
- Příklad: `"Pavel Novák"` nebo `"Petra Velká, Jindřich Peterka"`
#line()
- `author_gender` (rod autora v českém jazyce - není potřeba pro angličtinu)
- `"masculine"` - Mužský rod
- `"feminine"` - Ženský rod
- `"we"` - Množné číslo
- `author_pronouns` (jazykový rod autora - není potřeba pro angličtinu, která základní hodnotu)
- Pro vybraný jazyk _cs_:
- `"masculine"` - Mužský rod
- `"feminine"` - Ženský rod
- `"we"` - Množné číslo
- Pro vybraný jazyk _en_:
- *`"me"`* - První osoba jednotného čísla
- `"we"` - První osoba množného čísla
#line()
- `supervisor` (vedoucí práce)
- Příklad: `"prof. Jindřich Jindřich"`
- `supervisor` (vedoucí práce) <arg_supervisor>
- V podobě textového řetězce, příklad: `"prof. Jindřich Jindřich"`
- Ve formátu `(name: "<jméno>", institute: "<institut>")` (toto lze využít například při DP)
#line()
- `programme` (studijní program autora)
- `consultant` (konzultant práce)
- Stejně jako u #link(<arg_supervisor>, [`supervisor`])
#line()
- `programme` (studijní program) <arg_programme>
- Ve formátu `(<zkratka_jazyka>: "<název_programu>")`
- 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)
- Stejně jako #link(<arg_programme>, [`programme`])
#line()
- `abstract` (abstrakt)
- Ve formátu `(<zkratka_jazyka>: [<abstrakt>])`, například `(cs: [Můj *krásný* abstrakt.])`
- Dokumenty vyžadují _cs_ i _en_ abstrakt (kromě typu dokumentu `other`).
#line()
- `keywords` (klíčová slova zobrazovaná pod abstraktem)
- Ve formátu `(<zkratka_jazyka>: ("slovo1", "slovo2", ...))`
@@ -389,6 +407,36 @@ Při dalších použití bude vypadat takto: #abbr("ZK").
Tedy zkratku _nepřidáváte_ přímo do seznamu zkratek, ale elegantně používáte přímo v textu.
]
== Přílohy
V některých typech dokumentů budete chtít přidat přílohy. Přílohy se přikládají v různých podobách:
- Jako odkaz (URL/URI adresa)
- Zmínka externího souboru (například další soubor nahraný do systému)
- Přiložený obsah (vygenerovaný Typstem v tomto dokumentu -- je tedy součástí tohoto kódu)
- Externí PDF soubor přiložený jako obsah (jiný PDF dokument, vložený do příloh v kompletní
podobě -- to je dobré například do tisku, kde můžete přílohy vytisknout s dokumentem)
#highlight[
Přílohy lze definovat *pouze na jednom* místě v dokumentu, aby se zabránilo omylnému opakování
příloh. Přílohy doporučujeme definovat *na konci* souboru pro přehlednost.
]
Zde je ukázka definice příloh (je také použita na konci tohoto ukázkového souboru):
```typst
#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.]
),
)
```
= Workflow a jak si zjednoduššit práci
Tyhle věci používat _nemusíte_, aby vám šablona fungovala. Nicméně často jsou poměrně fajn.
@@ -451,3 +499,8 @@ Takhle si můžete předpřipravit délku odstavců a vyzkoušet si, jestli se r
do požadavků. Pak můžete postupně přepisovat/vyplňovat.
Funkce `todo` vám zároveň zabrání v tom, aby se text Lorem Ipsum vyskytl ve výsledném 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.]),
)

171
template/attachments.typ Normal file
View File

@@ -0,0 +1,171 @@
#import "utils.typ": assert_type_signature, is_none
#import "lang.typ": get_lang_item
#let attachment_data = state("attachment_data");
#let attach_link(name, link) = {
assert_type_signature(link, "string", "attach link argument");
assert_type_signature(name, "string", "attach link name argument");
("link", link, name)
}
#let attach_content(name, inner_content) = {
assert_type_signature(inner_content, "content", "attach content argument");
assert_type_signature(name, "string", "attach content name argument");
("content", inner_content, name)
}
#let attach_pdf(name, filepath) = {
assert_type_signature(filepath, "string", "attach pdf argument");
assert_type_signature(name, "string", "attach pdf name argument");
("pdf", filepath, name)
}
#let attach_file_reference(name, filename) = {
assert_type_signature(filename, "string", "attach file reference filename argument");
assert_type_signature(name, "string", "attach file reference name argument");
("ref", filename, name)
}
#let make_content_anchor(idx) = {
"attachment_" + str(idx + 1)
}
#let generate_attachment_content(attachment, idx) = {
let attachment_type = attachment.at(0);
if attachment_type == "content" {
let anchor = make_content_anchor(idx);
[#metadata(attachment.at(1)) #label(anchor)];
}
}
#let generate_attachment_info(attachment, idx) = {
let attachment_type = attachment.at(0);
if type(attachment_type) != str {
panic("invalid attachment - wrap the attach using: attach_content, attach_pdf, ...");
}
if attachment_type == "content" {
let anchor = make_content_anchor(idx);
"(\"content\",\"" + anchor + "\",\"" + attachment.at(2) + "\")"
} else if attachment_type == "pdf" {
"(\"pdf\",\"" + attachment.at(1) + "\",\"" + attachment.at(2) + "\")"
} else if (
attachment_type == "pdf" or
attachment_type == "link" or
attachment_type == "ref"
) {
"(" + attachment.map((v) => { "\"" + v + "\"" }).join(",") + ",)"
} else {
panic("unknown attachment type '" + attachment_type + "'");
}
}
#let attachments(..attachments) = {
let attachments = attachments.pos();
assert_type_signature(
attachments, "array[array[string | content]] | array[string | content]", "attachments"
);
context {
if not is_none(attachment_data.get()) {
panic("re-definition of attachments - attachments must only be defined once");
}
if attachments.len() == 0 {
attachment_data.update("false");
} else {
attachment_data.update({
"(" + if type(attachments) == array and type(attachments.at(0)) == array {
for (idx, attachment) in attachments.enumerate() {
(generate_attachment_info(attachment, idx),)
}.join(", ")
} else {
generate_attachment_info(attachments, 0)
} + ",)"
})
if type(attachments) == array and type(attachments.at(0)) == array {
for (idx, attachment) in attachments.enumerate() {
generate_attachment_content(attachment, idx);
}
} else {
generate_attachment_content(attachments, 0);
}
}
}
}
#let list_entry(language, entry, is_embedded) = {
let entry_type = entry.at(0);
entry.at(2);
if entry_type == "link" {
": ";
link(entry.at(1));
} else if entry_type == "ref" {
": soubor ";
raw(entry.at(1));
}
if is_embedded {
text(
" (" + get_lang_item(language, "attached_bellow") + ")",
style: "italic",
fill: black.lighten(50%),
);
}
}
#let attachment_list(language) = {
context {
let data = attachment_data.get();
if is_none(data) {
return;
}
let data = eval(data);
if data == false {
return;
}
heading(get_lang_item(language, "attachments"), numbering: none);
// listing
let has_embedded = false;
let enum_items = ();
for attachment in data {
let attachment_type = attachment.at(0);
let is_embedded = false;
if attachment_type == "content" or attachment_type == "pdf" {
has_embedded = true;
is_embedded = true;
}
enum_items.push(list_entry(language, attachment, is_embedded));
}
enum(..enum_items.map((v) => { enum.item(v) }), spacing: 1em);
if has_embedded {
pagebreak(weak: true);
}
// embedded
set page(footer: none);
for (idx, attachment) in data.enumerate() {
let attachment_type = attachment.at(0);
if attachment_type == "content" {
heading(
level: 2,
get_lang_item(language, "attachment") + " " + str(idx + 1),
numbering: none,
outlined: false,
);
query(label(attachment.at(1))).at(0).value;
} else if attachment_type == "pdf" {
import "@preview/muchpdf:0.1.1": muchpdf
page(place(center + horizon, heading(
level: 2,
get_lang_item(language, "attachment") + " " +
str(idx + 1) + " " +
get_lang_item(language, "next_page_attachment"),
numbering: none,
outlined: false,
)), margin: 0em);
set page(margin: 0em);
muchpdf(read("../" + attachment.at(1), encoding: none), width: 100%);
}
}
}
}

View File

@@ -5,21 +5,23 @@
assignment,
disclaimer,
abstract,
acknowledgement,
toc,
abbrlist,
imagelist,
tablelist,
bibliogr
)
#import "../utils.typ": is_none, assert_dict_has, assert_not_none
#import "../attachments.typ": attachment_list
#import "../utils.typ": is_none, assert_dict_has, assert_not_none, assert_type_signature
#let bp(
// general settings
faculty_id, faculty_color, language, assignment_document, citation_file,
// document info
title, author, author_gender, supervisor, consultant, study_programme, study_branch, abstract_content,
keywords,
title, author, author_pronouns, supervisor, consultant, study_programme, study_branch,
year_of_study, abstract_content, acknowledgement_content, keywords,
content
) = {
@@ -37,22 +39,31 @@
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_gender, "author gender");
assert_not_none(author_pronouns, "author gender");
}
mainpage(faculty_id, language, "bp", title, author, supervisor, consultant, study_programme, study_branch);
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_gender);
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);
abbrlist(language);
imagelist(language);
tablelist(language);
imagelist(language);
abbrlist(language);
pagebreak(weak: true);
content
content;
bibliogr(language, citation_file);
attachment_list(language);
});
}

View File

@@ -5,6 +5,7 @@
// thesis types
#import "bp.typ": bp
#import "dp.typ": dp
#import "other.typ": other
#let template_classic(
@@ -12,7 +13,8 @@
language, faculty_id, document_type, citation_file, assignment_document,
// document info
title, author, author_gender, supervisor, consultant, study_programme, study_branch, abstract, keywords,
title, author, author_pronouns, supervisor, consultant, study_programme, study_branch,
year_of_study, abstract, acknowledgement, keywords,
// content
content,
@@ -20,28 +22,31 @@
// 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,
assignment_document,
map_none(assignment_document, (v) => "../../" + v),
map_none(citation_file, (v) => "../../" + v),
title,
author,
author_gender,
author_pronouns,
supervisor,
consultant,
study_programme,
study_branch,
year_of_study,
abstract,
acknowledgement,
keywords,
content,
);

View File

@@ -1,9 +1,10 @@
#import "../theme.typ": faculty_logotype, tul_logomark, faculty_color
#import "../lang.typ": get_lang_item
#import "../utils.typ": is_none
#import "../utils.typ": is_none, assert_dict_has, map_none
#let base_font = "Inter";
#let mono_font = "Noto Sans Mono";
#let mono_font_compensation = 1.3em;
#let serif_font = "Merriweather";
#let tul_logomark_size = 6.5em;
@@ -35,7 +36,7 @@
// text
set text(font: serif_font);
set par(justify: true);
set par(justify: true, first-line-indent: 0.63cm);
// figures
let figure_numbering(realcount, c) = {
@@ -69,13 +70,28 @@
v(2cm);
it
};
show heading.where(): it => {
if it.level > 3 {
panic("maximum allowed heading level is 3");
} else {
it
}
}
// other
show raw: set text(font: mono_font);
show raw: set text(font: mono_font, size: mono_font_compensation);
show raw.where(block: true): it => {
block(it, fill: rgb("#eee"), inset: 1em)
};
show link: it => {
if type(it.dest) == label or type(it.dest) == location {
it;
} else {
text(it, fill: faculty_color);
}
}
set highlight(fill: faculty_color.lighten(90%));
set line(stroke: (paint: faculty_color, thickness: .7pt), length: 100%);
content
}
@@ -90,16 +106,40 @@
);
}
// DOCUMENT INFO
// DOCUMENT INFO
#let person_info(record, item_name) = {
if is_none(record) {
none
} else if type(record) == str {
record
} else if type(record) == dictionary {
if "name" in record {
record.at("name");
if "institute" in record {
text("\n " + record.at("institute"), style: "italic")
}
} else {
let panic_message = (
item_name + " name is required (or try not specifying " + item_name + " at all)"
);
panic(panic_message);
}
} else {
let panic_message = "invalid " + item_name + " - expected a string or a dictionary";
panic(panic_message);
}
}
#let info(
faculty_id,
language,
document_type,
title, author, supervisor, consultant, study_programme, study_branch,
title, author, supervisor, consultant, study_programme, study_branch, 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) {
@@ -117,11 +157,12 @@
// other info
// [field_name, field_value, bold]
let info_fields = (
("author", author, true),
("supervisor", person_info(supervisor, "supervisor"), false),
("consultant", person_info(consultant, "consultant"), false),
("study_programme", study_programme, false),
("study_branch", study_branch, false),
("author", author, true),
("supervisor", supervisor, false),
("consultant", consultant, false),
("year_of_study", map_none(year_of_study, (v) => str(v) + "."), false),
)
context {
let max_field_name_width = calc.max(..info_fields.map((v) => {
@@ -133,7 +174,7 @@
}), info_name_min_width.to-absolute());
grid(
columns: 2,
gutter: .5em,
gutter: gutter,
..info_fields.filter((v) => { type(v.at(1)) != type(none) }).map((v) => {
(
align(top, block(
@@ -145,7 +186,7 @@
}).flatten(),
);
v(1em);
h(max_field_name_width + info_name_value_padding);
h(max_field_name_width + info_name_value_padding + gutter);
text(get_lang_item(language, "city") + " " + str(datetime.today().year()), font: base_font);
}
}
@@ -156,7 +197,7 @@
faculty_id,
language,
document_type,
title, author, supervisor, consultant, study_programme, study_branch
title, author, supervisor, consultant, study_programme, study_branch, year_of_study,
) = {
import "../utils.typ": has_all_none, map_none
let nonetype = type(none);
@@ -171,7 +212,7 @@
info(
faculty_id, 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)),
map_none(study_branch, (v) => v.at(language)), year_of_study,
);
v(5em);
}, bottom);
@@ -203,11 +244,11 @@
// DISCLAIMER PAGE
#let disclaimer(language, faculty_id, disclaimer_type, author, author_gender) = {
#let disclaimer(language, faculty_id, disclaimer_type, author, author_pronouns) = {
import "../lang.typ": disclaimer
heading(get_lang_item(language, "disclaimer"), numbering: none, outlined: false);
par(
text(disclaimer(language, disclaimer_type, author_gender))
text(disclaimer(language, disclaimer_type, author_pronouns))
);
v(5em);
grid(
@@ -220,6 +261,18 @@
);
}
// ACKNOWLEDGEMENT PAGE
#let acknowledgement(language, author, content) = {
if is_none(content) {
return;
}
heading(get_lang_item(language, "acknowledgement"), numbering: none, outlined: false);
par(content.at(language));
v(2em);
align(right, author);
}
// ABSTRACT
#let abstract(language, title, content, keywords) = {
@@ -251,7 +304,7 @@
stack(
dir: ltr,
text(numbering(
"1. 1",
"1.1",
counter(heading).at(element.location()).at(0),
counter(selector).at(element.location()).at(0),
)),
@@ -263,7 +316,7 @@
),
)
}
heading(title, numbering: none, outlined: false);
heading(title, numbering: none);
for el in query(figure.where(kind: selector)) {
if is_none(el.caption) {
continue;
@@ -333,9 +386,13 @@
#let bibliogr(language, citations_file) = {
if language == "cs" {
bibliography(citations_file, style: "../tul_citace.csl");
bibliography(
citations_file, style: "../tul_citace.csl", title: get_lang_item(language, "bibliography"),
);
} else if language == "en" {
bibliography(citations_file, style: "iso-690-numeric");
bibliography(
citations_file, style: "iso-690-numeric", title: get_lang_item(language, "bibliography"),
);
} else {
panic("unknown language for bibliography '" + language + "'");
}

68
template/classic/dp.typ Normal file
View File

@@ -0,0 +1,68 @@
#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
#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);
});
}

View File

@@ -9,7 +9,9 @@
abbrlist,
imagelist,
tablelist,
bibliogr,
)
#import "../attachments.typ": attachment_list
#import "../utils.typ": is_none, assert_not_none, assert_dict_has, assert_in_arr
#let other(
@@ -17,23 +19,26 @@
faculty_id, faculty_color, language, assignment_document, citation_file,
// document info
title, author, _, supervisor, consultant, study_programme, study_branch, abstract_content, keywords,
title, author, _, supervisor, consultant, study_programme, study_branch, year_of_study,
abstract_content, _, keywords,
content
) = {
assert_not_none(title, "title");
assert_dict_has((language,), title, "title");
mainpage(faculty_id, language, none, title, author, supervisor, consultant, study_programme, study_branch);
mainpage(
faculty_id, language, none, title, author, supervisor, consultant, study_programme,
study_branch, year_of_study,
);
default_styling(true, faculty_color, {
toc(language);
abbrlist(language);
imagelist(language);
tablelist(language);
imagelist(language);
abbrlist(language);
pagebreak(to: "even", weak: true);
content
// bibliography
bibliography(citation_file, style: "../tul_citace.csl");
content;
bibliogr(language, citation_file);
attachment_list(language);
});
}

View File

@@ -6,12 +6,15 @@
"consultant": "Konzultant práce",
"study_programme": "Studijní program",
"study_branch": "Studijní obor",
"year_of_study": "Ročník",
"bp": "Bakalářská práce",
"dp": "Diplomová práce",
"city": "Liberec",
"toc": "Obsah",
"bibliography": "Použitá literatura",
"disclaimer": "Prohlášení",
"disclaimer_content": "Prohlašuj{g:i|i|eme}, že {svůj} {práce:tu} js{g:em|em|me} vypracoval{g:|a|i} samostatně jako původní dílo s použitím uvedené literatury a na základě konzultací s vedoucím {{g:mé|mé|naší}} bakalářské práce a konzultantem.\n\nJs{g:em|em|me} si vědom{g:|a|i} toho, že na {{g:moji|moji|naši}} {práce:tu} se plně vztahuje zákon č. 121/2000 Sb., o právu autorském, zejména § 60 školní dílo.\n\nBer{g:u|u|eme} na vědomí, že Technická univerzita v Liberci nezasahuje do {g:mých|mých|našich} autorských práv užitím {{g:mé|mé|naší}} {práce:té} pro vnitřní potřebu Technické univerzity v Liberci.\n\nUžij{g:i|i|eme}-li {práce:tu} nebo poskytn{g:u|u|eme}-li licenci k {jejímu} využití, js{g:em|em|me} si vědom{g:|a|i} povinnosti informovat o této skutečnosti Technickou univerzitu v Liberci; v tomto případě má Technická univerzita v Liberci právo od{g:e|e|} {g:mne|mne|nás} požadovat úhradu nákladů, které vynaložila na vytvoření díla, až do jejich skutečné výše.\n\nSoučasně čestně prohlašuj{g:i|i|eme}, že text elektronické podoby práce vložený do IS/STAG se shoduje s textem tištěné podoby práce.\n\nBer{g:u|u|eme} na vědomí, že {{g:můj|můj|naše}} {práce:ta} bude {zveřejněn} Technickou univerzitou v Liberci v souladu s § 47b zákona č. 111/1998 Sb., o vysokých školách a o změně a doplnění dalších zákonů (zákon o vysokých školách), ve znění pozdějších předpisů.\n\nJs{g:em|em|me} si vědom{g:|a|i} následků, které podle zákona o vysokých školách mohou vyplývat z porušení tohoto prohlášení.",
@@ -30,16 +33,36 @@
"svůj": "svoji",
"jejímu": "jejímu",
"zveřejněn": "zveřejněna"
},
"dp": {
"práce:ta": "diplomová práce",
"práce:tu": "diplomovou práci",
"práce:té": "diplomové práce",
"moji": "moji",
"naše": "naše",
"naši": "naši",
"naší": "naší",
"mé": "mé",
"můj": "moje",
"svůj": "svoji",
"jejímu": "jejímu",
"zveřejněn": "zveřejněna"
}
},
"date": "[day]. [month]. [year]",
"abstract": "Abstrakt",
"acknowledgement": "Poděkování",
"keywords": "Klíčová slova",
"abbrs": "Seznam zkratek",
"image_list": "Seznam obrázků",
"table_list": "Seznam tabulek",
"attachments": "Přílohy",
"attachment": "Příloha",
"next_page_attachment": "začíná na další straně",
"attached_bellow": "dále přiloženo",
"place_assignment": "Sem vložte zadání"
},
@@ -51,12 +74,15 @@
"consultant": "Consultant",
"study_programme": "Study programme",
"study_branch": "Study branch",
"year_of_study": "Year of study",
"bp": "Bachelor thesis",
"dp": "Diploma thesis",
"city": "Liberec",
"toc": "Contents",
"bibliography": "Bibliography",
"disclaimer": "Declaration",
"disclaimer_content": "{g:I|We} hereby certify, {g:I|we}, {g:myself|ourselves}, have written {g:my|our} {thesis} as an original and primary work using the literature listed below and consulting it with {g:my|our} thesis supervisor and {g:my|our} thesis counsellor.\n\n{g:I|We} acknowledge that {g:my|our} {thesis} is fully governed by Act No. 121/2000 Coll., the Copyright Act, in particular Article 60 School Work.\n\n{g:I|We} acknowledge that the Technical University of Liberec does not infringe {g:my|our} copyrights by using {g:my|our} {thesis} for internal purposes of the Technical University of Liberec.\n\n{g:I|We} {g:am|are} aware of {g:my|our} obligation to inform the Technical University of Liberec on having used or granted license to use the results of {g:my|our} {thesis}; in such a case the Technical University of Liberec may require reimbursement of the costs incurred for creating the result up to their actual amount.\n\nAt the same time, {g:I|we} honestly declare that the text of the printed version of {g:my|our} {thesis} is identical with the text of the electronic version uploaded into the IS STAG.\n\n{g:I|We} acknowledge that the Technical University of Liberec will make {g:my|our} {thesis} public in accordance with paragraph 47b of Act No. 111/1998 Coll., on Higher Education Institutions and on Amendment to Other Acts (the Higher Education Act), as amended.\n\n{g:I|We} {g:am|are} aware of the consequences which may under the Higher Education Act result from a breach of this declaration.",
@@ -64,16 +90,25 @@
"disclaimer_replace": {
"bp": {
"thesis": "bachelor thesis"
},
"dp": {
"thesis": "diploma thesis"
}
},
"date": "[year]-[month]-[day]",
"abstract": "Abstract",
"acknowledgement": "Acknowledgement",
"keywords": "Keywords",
"abbrs": "List of abbreviations",
"image_list": "List of images",
"table_list": "List of tables",
"attachments": "Attachments",
"attachment": "Attachment",
"next_page_attachment": "begins on the next page",
"attached_bellow": "attached bellow",
"place_assignment": "Insert your assignment here"
}

View File

@@ -45,13 +45,13 @@
});
}
#let disclaimer(language, document_type, author_gender) = {
#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);
if language == "cs" {
disclaimer = replace_czech_gender(disclaimer, author_gender);
disclaimer = replace_czech_gender(disclaimer, author_pronouns);
} else if language == "en" {
disclaimer = replace_english_pronounce(disclaimer, author_gender);
disclaimer = replace_english_pronounce(disclaimer, author_pronouns);
}
for (key, value) in replacements.pairs() {
disclaimer = disclaimer.replace("{" + key + "}", value);

View File

@@ -7,6 +7,9 @@
// Git: https://git.zumepro.cz/tul/tultemplate2
#import "prototyping.typ": todo, profile
#import "attachments.typ": (
attachments, attach_content, attach_pdf, attach_link, attach_file_reference
)
// TUL Template 2
//
@@ -25,9 +28,11 @@
// - document (str): Type of document. This can be "bp" or "other".
// - title (dictionary): The title of the document.
// - author (str): The name of the document's author.
// - author_gender (str): The gender of the document's author. Needed only for the `cs` language.
// - 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
// - abstract (dictionary): The abstract.
// - keywords (dictionary): The abstract keywords.
// - assignment (str): Filepath of the assignment document/page.
@@ -40,8 +45,9 @@
style: "classic", faculty: "tul", lang: "cs", document: "other",
// document info
title: none, keywords: none, abstract: none, author: none, author_gender: none,
supervisor: none, consultant: none, programme: none, branch: 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,
// links
assignment: none, citations: "citations.bib",
@@ -61,14 +67,22 @@
assert_type_signature(
abstract, "dictionary[string : string | content] | none", "abstract argument"
);
assert_type_signature(
acknowledgement, "dictionary[string : string] | none", "acknowledgement content"
);
assert_type_signature(author, "string | none", "author argument");
assert_type_signature(author_gender, "string | none", "author gender argument");
assert_type_signature(supervisor, "string | none", "supervisor argument");
assert_type_signature(consultant, "string | none", "consultant 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");
@@ -87,8 +101,8 @@
// template call
templates.at(style)(
lang, faculty, document, citations, assignment,
title, author, author_gender, supervisor, consultant,
programme, branch, abstract, keywords, content
title, author, author_pronouns, supervisor, consultant,
programme, branch, year_of_study, abstract, acknowledgement, keywords, content
);
import "prototyping.typ": assert_release_ready

13
templategen.mk Normal file
View File

@@ -0,0 +1,13 @@
THESIS_FILE := thesis
TYPST_FONTPATH := --font-path template/fonts
.PHONY: watch
watch: $(THESIS_FILE).pdf
xdg-open $< & typst watch $(TYPST_FONTPATH) $(THESIS_FILE).typ
.PHONY: view
view: $(THESIS_FILE).pdf
xdg-open $<
%.pdf: %.typ
typst compile $(TYPST_FONTPATH) $<

312
theses/bp.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"),
branch: (cs: "Můj krásný studijní obor"),
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... Ú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.]),
)

311
theses/dp.typ Normal file
View File

@@ -0,0 +1,311 @@
#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... Ú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.]),
)