60 Commits
v1.2.2 ... v2.0

Author SHA1 Message Date
bdb12e887c add pack target to nix 2025-12-02 23:19:33 +01:00
de81180623 rename attachments to appendix in en 2025-12-02 23:19:23 +01:00
670d7f7340 compensate font sizes in presentations 2025-12-02 20:32:43 +01:00
ac87b6393e add presentation_cs to the build system and readme 2025-12-02 17:27:40 +01:00
Matej-Zucha-TUL
957bbc0060 Expand czech presentation example 2025-12-02 16:20:41 +00:00
97dfd40542 add fullpage heading support for presentation 2025-12-02 16:20:41 +00:00
Matej-Zucha-TUL
9cdb4cc9c2 Add aspect ratio switching 2025-12-02 16:20:41 +00:00
07a7170fb8 add presentation base 2025-12-02 16:20:41 +00:00
d9392b0fa2 add target for building theses to nix flake 2025-12-02 13:17:29 +01:00
613329c6ae fix typo in theses content 2025-12-01 22:29:42 +01:00
2bb4e4e87c Paritally revert "Add remaining appendix examples"
This partially reverts commit 9ceaea2594.
2025-11-28 11:16:01 +01:00
62155e014c allow for parallel make runs 2025-11-28 09:40:20 +01:00
290020cf6f bump flake 2025-11-27 19:01:04 +01:00
ae74b4f0b9 add generated assignment to bundles 2025-11-27 18:43:44 +01:00
af99873b1c make title pages wording clearer 2025-11-27 18:36:54 +01:00
b58492fdcd add generated title pages to bundles 2025-11-27 18:33:33 +01:00
d74d55dbff fix make build for tultemplategen 2025-11-27 18:32:46 +01:00
7c86295693 fix example appendix 2025-11-27 18:30:39 +01:00
76f72131c5 add bundle target for templategen 2025-11-27 12:03:05 +01:00
c5187d8620 add support for multi-page pdfs from stag 2025-11-26 23:45:50 +01:00
Matěj Žucha
90c0e28187 Refactor file structure 2025-11-26 08:26:12 +01:00
09dc48a98f fix pdf embed sizing issues 2025-11-25 18:08:36 +01:00
Matej-Zucha-TUL
9ceaea2594 Add remaining appendix examples 2025-11-25 13:22:04 +01:00
2d8722516b swap example email in theses content 2025-11-24 23:17:58 +01:00
7ccfe1cfe3 develop example theses content 2025-11-24 14:25:25 +01:00
de4f72aa54 add even more examples to theses examples 2025-11-22 21:20:14 +01:00
f871c5f7af add more formatting examples to theses examples 2025-11-22 20:23:05 +01:00
149bca950e reformat example theses content 2025-11-22 19:30:26 +01:00
d0f1f3c041 colorize rectangle border by default 2025-11-22 19:30:02 +01:00
67ca761fe7 add pack nix build target 2025-11-18 18:31:58 +01:00
f588ea1e3f add sp to templategen bundles 2025-11-18 18:17:52 +01:00
f79fcd51e1 corrections for thesis example content in cs and en 2025-11-17 23:01:40 +01:00
5694c95042 add non-breaking term 2025-11-17 22:53:40 +01:00
26f8326782 fix outline and bookmarking display logic 2025-11-17 22:21:03 +01:00
4562048de0 corrections for sp examples 2025-11-17 21:51:39 +01:00
6fbe20abfd update readme 2025-11-17 21:43:13 +01:00
c881b53ac6 add default nix build target 2025-11-17 21:38:34 +01:00
76cf70ec0c make no longer removes the target PDF when running thesis_% target 2025-11-17 20:57:26 +01:00
b4406bfd77 add nix build 2025-11-17 16:00:29 +01:00
24fbf789b9 change readme wording 2025-11-17 15:23:23 +01:00
cda7245997 fix datetime issues in nix envs 2025-11-17 15:22:08 +01:00
69272f6a35 add pdf embedding to documentation attachements examples 2025-11-17 14:16:06 +01:00
d038c7de14 switch to own pdf embedding implementation 2025-11-17 14:16:05 +01:00
a4643419ef implement tests for multipage pdf embedding 2025-11-17 14:16:05 +01:00
ab0c992dc0 add multipage pdf embedding 2025-11-17 14:16:02 +01:00
Matěj Žucha
5f17ee6f5c Fix title in English examples 2025-11-15 09:13:55 +01:00
Matěj Žucha
5b610ebd75 Add seminar thesis examples 2025-11-15 09:13:29 +01:00
3e5da83b08 remove nix build from readme 2025-11-14 19:03:10 +01:00
fc32808531 further detail the 'Building your own thesis' in readme 2025-11-14 19:00:05 +01:00
ae65a19a99 add makefile for packed builds 2025-11-14 18:52:50 +01:00
e77cc73f14 update thesis examples in readme 2025-11-14 18:43:58 +01:00
4d4f227a4f deduplicate content for example theses 2025-11-14 18:38:33 +01:00
6a187d775a clean up the build system 2025-11-14 17:44:47 +01:00
8c3fbce8a0 implement sp 2025-11-14 17:02:50 +01:00
da23dd94fc allow generating documents without abstract or disclaimer 2025-11-14 17:02:23 +01:00
b846fb2b7d Revert improved argument checking
It should not be in master yet (in an incomplete state).

This reverts commits d19a30a24a, 071696a786 and 7a2290c00e.
2025-11-11 21:37:04 +01:00
f8971eabe6 update makefile to bundle new thesis types 2025-11-11 21:22:53 +01:00
74df4253ca do some polishing on example documents 2025-11-11 21:21:12 +01:00
Matej-Zucha-TUL
aca613995e Update theses example content 2025-11-11 19:06:51 +01:00
d19a30a24a add automatically generated argument list to documentation 2025-11-11 18:38:23 +01:00
38 changed files with 2481 additions and 1341 deletions

3
.gitignore vendored
View File

@@ -1,3 +1,6 @@
/*.pdf
/pack
/result
/target
/template/lib/
/template/example_appendix.pdf

258
Makefile
View File

@@ -1,98 +1,208 @@
TYPST_PACKAGES ?=
BUILD_DIR := target
PACKS_ROOT := $(BUILD_DIR)/pack
PACKDIR := $(PACKS_ROOT)/tultemplate2
BUNDLEDIR := $(PACKS_ROOT)/bundle
LIBDIR := template/lib
LIB_MUCHPDFTOOLS := $(LIBDIR)/much_pdf_tools
LIB_TARGETS_MUCHPDFTOOLS := lib.typ much_pdf_tools.wasm
LIB_URL_MUCHPDFTOOLS := https://tulsablona.zumepro.cz/lib/much_pdf_tools
TEMPLATE_SRCS := $(shell find template -type f) \
$(LIB_TARGETS_MUCHPDFTOOLS:%=$(LIB_MUCHPDFTOOLS)/%) template/example_appendix.pdf
TO_PACK := $(TEMPLATE_SRCS) template/LICENSE
BUNDLE_THESES := bp_cs bp_en dp_cs dp_en prj_cs prj_en sp_cs sp_en presentation_cs
BUNDLE_TARGETS := $(TO_PACK:%=$(BUNDLEDIR)/%) $(BUNDLEDIR)/citations.bib $(BUNDLEDIR)/bp_cs.typ \
$(BUNDLE_THESES:%=$(BUNDLEDIR)/%.typ) $(BUNDLEDIR)/Makefile \
$(BUNDLEDIR)/title-pages.pdf $(BUNDLEDIR)/assignment.pdf
PACK_TARGETS := $(TO_PACK:%=$(PACKDIR)/%) $(PACKDIR)/documentation.typ \
$(PACKDIR)/documentation.pdf $(PACKDIR)/citations.bib $(PACKDIR)/Makefile
# == MAIN TARGETS ==
.PRECIOUS: $(BUILD_DIR)/%.pdf
.PHONY: view_documentation
view_documentation: documentation.pdf
view_documentation: $(BUILD_DIR)/documentation.pdf
xdg-open $<
.PHONY: watch_documentation
watch_documentation:
typst watch --font-path template/fonts documentation.typ & xdg-open documentation.pdf
.PHONY: watch_%
watch_%: %.pdf
xdg-open $< & typst watch --root . --font-path template/fonts theses/$*.typ $<
.PHONY: documentation
documentation: documentation.pdf
PACKDIR := pack/tultemplate2
BUNDLEDIR := pack/bundle
TO_PACK := $(shell find template -type f) template/LICENSE
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
.PHONY: pack
pack: pack/tultemplate2.zip
pack: $(PACKDIR)/tultemplate2.zip
.PHONY: bundle
bundle: $(BUNDLE_TARGETS)
@echo "!! Bundles are made for tultemplategen and not for direct use !!"
.PHONY: watch_documentation
watch_documentation: $(BUILD_DIR)/documentation.pdf
xdg-open $< & typst watch --font-path template/fonts documentation.typ $<
.PHONY: thesis_%
thesis_%: $(BUILD_DIR)/%.pdf
xdg-open $<
.PHONY: documentation
documentation: $(BUILD_DIR)/documentation.pdf
.PHONY: clean
clean:
rm -rf pack
rm -f ./*.pdf
rm -rf target
rm -rf template/lib
pack/tultemplate2.zip: $(PACK_TARGETS)
# == ROOTS ==
$(BUILD_DIR):
mkdir $@
$(PACKS_ROOT): | $(BUILD_DIR)
mkdir $@
$(PACKDIR): | $(PACKS_ROOT)
mkdir $@
$(BUNDLEDIR): | $(PACKS_ROOT)
mkdir $@
# == UTILS ==
define minify_csl
cat $(1) | sed 's/^\s*\(.*\)$$/\1/' | tr -d '\n' > $(2)
endef
define minify_json
cat $(1) | jq -c > $(2)
endef
define replace_with_file_line
sed "s/$(1)/$$(sed '$(3)q;d' $(2))/g"
endef
define typst_pkgs
$(if $(TYPST_PACKAGES), --package-cache-path $(TYPST_PACKAGES))
endef
define typst_compile
typst compile --font-path template/fonts$(call typst_pkgs) --root .
endef
# == LIBS ==
$(LIBDIR):
mkdir $@
$(LIB_MUCHPDFTOOLS): | $(LIBDIR)
mkdir $@
template/lib/much_pdf_tools/lib.typ: | $(LIB_MUCHPDFTOOLS)
cd $(LIB_MUCHPDFTOOLS) && wget "$(LIB_URL_MUCHPDFTOOLS)/lib.typ"
template/lib/much_pdf_tools/much_pdf_tools.wasm: | $(LIB_MUCHPDFTOOLS)
cd $(LIB_MUCHPDFTOOLS) && wget "$(LIB_URL_MUCHPDFTOOLS)/much_pdf_tools.wasm"
# == DOCUMENTATION ==
$(BUILD_DIR)/documentation.pdf: documentation.typ $(TEMPLATE_SRCS) | $(BUILD_DIR)
$(call typst_compile) $< $@
# == THESES EXAMPLES ==
$(BUILD_DIR)/presentation_%.typ: theses/presentation_%.typ | $(BUILD_DIR)
ln -f $< $@
$(BUILD_DIR)/subs_%.txt: theses/%.typ | $(BUILD_DIR)
awk 'BEGIN{RS=""; ORS="\n\n"} NR>2{print}' $< > $@
$(BUILD_DIR)/header_%.txt: theses/%.typ
awk 'BEGIN{RS=""; ORS="\n\n"} NR<3{print}' $< > $@
$(BUILD_DIR)/content_%_cs.txt: $(BUILD_DIR)/subs_%_cs.txt theses/content_cs.typ
cat theses/content_cs.typ | \
$(call replace_with_file_line,{{ta}},$<,1) | $(call replace_with_file_line,{{tou}},$<,2) | \
awk 'BEGIN{RS=""; ORS="\n\n"} NR>2{print}' > $@
$(BUILD_DIR)/content_%_en.txt: $(BUILD_DIR)/subs_%_en.txt theses/content_en.typ
cat theses/content_en.typ | \
$(call replace_with_file_line,{{what}},$<,1) | \
awk 'BEGIN{RS=""; ORS="\n\n"} NR>2{print}' > $@
$(BUILD_DIR)/%.typ: $(BUILD_DIR)/header_%.txt $(BUILD_DIR)/content_%.txt | $(BUILD_DIR)
cat $^ > $@
$(BUILD_DIR)/%.pdf: $(BUILD_DIR)/%.typ $(TEMPLATE_SRCS) | $(BUILD_DIR)
$(call typst_compile) $< $@
template/example_appendix.pdf: theses/example_appendix.typ
$(call typst_compile) $< $@
# == PACKS - clean builds for direct use ==
$(PACKDIR)/%: % | $(PACKDIR)
ln -f $< $@
$(PACKDIR)/template: | $(PACKDIR)
mkdir $@
$(PACKDIR)/template/LICENSE: LICENSE | $(PACKDIR)/template
ln -f $< $@
$(PACKDIR)/Makefile: packed.mk | $(PACKDIR)
ln -f $< $@
$(PACKDIR)/template/tul_citace.csl: template/tul_citace.csl | $(PACKDIR)/template
$(call minify_csl,$<,$@)
$(PACKDIR)/template/lang.json: template/lang.json | $(PACKDIR)/template
$(call minify_json,$<,$@)
$(PACKDIR)/template/%: template/% | $(PACKDIR)/template
@mkdir -p $(@D)
ln -f $< $@
$(PACKDIR)/%.pdf: $(BUILD_DIR)/%.pdf | $(PACKDIR)
ln -f $< $@
$(PACKDIR)/tultemplate2.zip: $(PACK_TARGETS) | $(PACKDIR)
rm -f $@
cd pack && zip -r tultemplate2.zip tultemplate2
cd $(PACKS_ROOT) && zip -r tultemplate2.zip tultemplate2
$(PACKDIR)/%: %
# == BUNDLES - packs for tultemplategen ==
$(BUNDLEDIR)/template: | $(BUNDLEDIR)
mkdir $@
$(BUNDLEDIR)/template/LICENSE: LICENSE | $(BUNDLEDIR)/template
ln -f $< $@
$(BUNDLEDIR)/Makefile: templategen.mk | $(BUNDLEDIR)
ln -f $< $@
$(BUNDLEDIR)/template/tul_citace.csl: template/tul_citace.csl | $(BUNDLEDIR)/template
$(call minify_csl,$<,$@)
$(BUNDLEDIR)/template/lang.json: template/lang.json | $(BUNDLEDIR)/template
$(call minify_json,$<,$@)
$(BUNDLEDIR)/citations.bib: citations.bib | $(BUNDLEDIR)
ln -f $< $@
$(BUNDLEDIR)/template/%: template/% | $(BUNDLEDIR)/template
@mkdir -p $(@D)
ln -f $< $@
$(BUNDLEDIR)/citations.bib: citations.bib
@mkdir -p $(@D)
ln -f $< $@
$(BUNDLEDIR)/presentation_%.typ: theses/presentation_%.typ | $(BUNDLEDIR)
cat $< | awk 'BEGIN{RS=""; ORS="\n\n"} NR>2{print}' > $@
$(BUNDLEDIR)/%.typ: theses/%.typ
@mkdir -p $(@D)
awk 'BEGIN{RS=""; ORS="\n\n"} NR>2{print}' $< | sed 's/\.\.\/template\//template\//' > $@
$(BUNDLEDIR)/%.typ: $(BUILD_DIR)/content_%.txt | $(BUNDLEDIR)
sed 's/\.\.\/template\//template\//' $< > $@
$(BUNDLEDIR)/Makefile: templategen.mk
@mkdir -p $(@D)
ln -f $< $@
$(BUNDLEDIR)/title-pages.pdf: theses/title_pages.typ | $(BUNDLEDIR)
$(call typst_compile) $< $@
$(PACKDIR)/template/LICENSE: LICENSE
@mkdir -p $(@D)
ln -f $< $@
$(BUNDLEDIR)/assignment.pdf: theses/assignment.typ | $(BUNDLEDIR)
$(call typst_compile) $< $@
$(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)
documentation.pdf: documentation.typ $(TEMPLATE_SRCS)
typst compile --font-path template/fonts $<
%.pdf: theses/%.typ
typst compile --font-path template/fonts --root . $< $@
# == TESTS ==
include tests/make.mk

View File

@@ -20,10 +20,11 @@ to the maintainer:
Ondřej Mekina <ondrej@mekina.cz>
## Our goals and dreams
## The goals of this template
We dream of a simple way for students to make documents. Of a workflow revolving not around
citations, fonts, paragraphs and other formal bs, but around the actual content of the document.
citations, fonts, paragraphs and other formal nonsense, but around the actual content of the
document.
We aim to provide a robust (but simple) framework to build official documents at TUL.
@@ -77,6 +78,38 @@ sadly, Typst does not yet support emitting multiple errors or warnings at once).
It will also give you some tips (like to upload the assignment PDF from STAG) on how to structure
the thesis. And at the end, it will generate a whole example document for you.
Now, if you don't want to use the generator, drop into the repo directory and run:
```sh
make pack
```
This will generate outputs at `target/pack/tultemplate2` and `target/pack/tultemplate2.zip`.
We recommend copying the files (either from the zip or the directory) somewhere else and (in there)
running:
```sh
make view_documentation
```
After you have created your own `filename.typ` you can run:
```sh
make view_filename
```
or
```sh
make watch_filename
```
The `Makefile` provided in the packed build is just an example... feel free to adjust it according
to your needs.
The packed builds also provide `documentation.pdf` such that you can jump into it straight away
or keep it around during the writing of your own thesis.
### Building documentation
The documentation PDF explains different concepts in Typst and in this template.
@@ -90,26 +123,24 @@ make
This will compile it once and open it using `xdg-open`.
Or when using Nix:
```sh
nix build
```
That will output `result/documentation.pdf` which you can view.
### Building thesis examples
Thesis examples are in `theses`. They also have assignments pulled from an external file.
Thesis examples are in `theses`. In the files with names like `bp_en.typ` you can find the example
header for each thesis (and after that some spelling substitutions for the build system).
And in `theses/content_cs.typ` and `theses/content_en.typ` is the content for the theses.
Using:
```sh
make bp_cs.pdf
make thesis_bp_cs
```
Will generate an example bachelor's thesis in czech.
Will make and view an example bachelor's thesis in czech.
We also have:
- `bp_en.pdf` (only partially translated - if you wish to help translating, we'll gladly welcome it)
- `dp_cs.pdf`
We also have (at the moment):
- `bp_en`
- `dp_cs`
- `dp_en`
- `prj_cs`
- `prj_en`
- `presentation_cs`

View File

@@ -102,7 +102,6 @@ Velmi jednoduché. Stačí na začátek řádku dát znak `=` kolikrát chcete.
= Nadpis
== Podnadpis
=== Podpodnadpis
==== už tomu asi rozumíte ...
A pak obsah
```
@@ -364,12 +363,6 @@ Zde je ukázka definice příloh (je také použita na konci tohoto ukázkového
)
```
#pagebreak(weak: true)
== Argumenty šablony
#import "template/arguments.typ": print_argument_docs
#print_argument_docs()
= 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.
@@ -436,4 +429,5 @@ Funkce `todo` vám zároveň zabrání v tom, aby se text Lorem Ipsum vyskytl ve
#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.]),
attach_pdf("Ukázkový PDF soubor s dvěma stranami", "template/example_appendix.pdf"),
)

95
flake.lock generated
View File

@@ -1,12 +1,81 @@
{
"nodes": {
"flake-parts": {
"inputs": {
"nixpkgs-lib": "nixpkgs-lib"
},
"locked": {
"lastModified": 1743550720,
"narHash": "sha256-hIshGgKZCgWh6AYJpJmRgFdR3WUbkY04o82X05xqQiY=",
"owner": "hercules-ci",
"repo": "flake-parts",
"rev": "c621e8422220273271f52058f618c94e405bb0f5",
"type": "github"
},
"original": {
"owner": "hercules-ci",
"repo": "flake-parts",
"type": "github"
}
},
"much_pdf_tools": {
"inputs": {
"flake-parts": "flake-parts",
"nixpkgs": "nixpkgs",
"systems": "systems"
},
"locked": {
"lastModified": 1764192868,
"narHash": "sha256-0h4Fqg3C+VMS2+gvJUKKEjJJDWEeRcMCFkXerl9kPc0=",
"ref": "refs/heads/master",
"rev": "bf65c77e3b0e02b6f22bd20840277c603cd9c2bf",
"revCount": 1,
"type": "git",
"url": "https://git.zumepro.cz/ondrej.mekina/much_pdf_tools.git"
},
"original": {
"type": "git",
"url": "https://git.zumepro.cz/ondrej.mekina/much_pdf_tools.git"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1762482733,
"narHash": "sha256-g/da4FzvckvbiZT075Sb1/YDNDr+tGQgh4N8i5ceYMg=",
"lastModified": 1745804731,
"narHash": "sha256-v/sK3AS0QKu/Tu5sHIfddiEHCvrbNYPv8X10Fpux68g=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "e1ebeec86b771e9d387dd02d82ffdc77ac753abc",
"rev": "29335f23bea5e34228349ea739f31ee79e267b88",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixpkgs-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs-lib": {
"locked": {
"lastModified": 1743296961,
"narHash": "sha256-b1EdN3cULCqtorQ4QeWgLMrd5ZGOjLSLemfa00heasc=",
"owner": "nix-community",
"repo": "nixpkgs.lib",
"rev": "e4822aea2a6d1cdd36653c134cacfd64c97ff4fa",
"type": "github"
},
"original": {
"owner": "nix-community",
"repo": "nixpkgs.lib",
"type": "github"
}
},
"nixpkgs_2": {
"locked": {
"lastModified": 1764167966,
"narHash": "sha256-nXv6xb7cq+XpjBYIjWEGTLCqQetxJu6zvVlrqHMsCOA=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "5c46f3bd98147c8d82366df95bbef2cab3a967ea",
"type": "github"
},
"original": {
@@ -18,7 +87,8 @@
},
"root": {
"inputs": {
"nixpkgs": "nixpkgs",
"much_pdf_tools": "much_pdf_tools",
"nixpkgs": "nixpkgs_2",
"utils": "utils"
}
},
@@ -37,9 +107,24 @@
"type": "github"
}
},
"systems_2": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "default",
"type": "github"
}
},
"utils": {
"inputs": {
"systems": "systems"
"systems": "systems_2"
},
"locked": {
"lastModified": 1731533236,

109
flake.nix
View File

@@ -2,34 +2,113 @@
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
utils.url = "github:numtide/flake-utils";
much_pdf_tools.url = "git+https://git.zumepro.cz/ondrej.mekina/much_pdf_tools.git";
};
outputs = { self, nixpkgs, utils }:
outputs = { self, nixpkgs, utils, much_pdf_tools }:
utils.lib.eachDefaultSystem (system:
let
pkgs = import nixpkgs { inherit system; };
dependencies = with pkgs; [ typst gnumake jq xdg-utils zip ];
in
{
packages.documentation = pkgs.stdenv.mkDerivation {
pname = "documentation";
version = "1.2";
buildInputs = with pkgs; [ typst gnumake jq xdg-utils zip wget ];
name = "tultemplate2";
envSetup = ''
unset SOURCE_DATE_EPOCH
LIB=template/lib
if [ ! -e $LIB ]; then mkdir $LIB; fi
if [ ! -e $LIB/much_pdf_tools ]
then
cp -R ${much_pdf_tools.packages.${system}.much_pdf_tools} $LIB/much_pdf_tools
chmod +w $LIB/much_pdf_tools
fi
'';
typstPkgs = [
{
name = "alchemist";
version = "0.1.8";
hash = "18ckw65wq7q8ksayp1g86c9j6d9l1kfg9m100q0gddaw7ksqjqqq";
}
{
name = "cetz";
version = "0.4.1";
hash = "18xinq5agk6zi0r064l6qg09far170n9965a9z2zznz3zsv1h6is";
}
{
name = "oxifmt";
version = "1.0.0";
hash = "0bqc5ahiavjds966a8v5llw9imqqaa43x89ha9dl5nlp51vqmla6";
}
];
pull_typst_package = pkg: pkgs.stdenv.mkDerivation {
name = "typst_package-${pkg.name}-${pkg.version}";
src = fetchTarball {
url = "https://packages.typst.org/preview/${pkg.name}-${pkg.version}.tar.gz";
sha256 = pkg.hash;
};
installPath = "${pkg.name}/${pkg.version}";
installPhase = ''
mkdir -p $out/$installPath
cp -R . $out/$installPath
'';
};
pull_typst_packages = pkgList: pkgs.stdenv.mkDerivation {
name = "typst-packages";
src = null;
dontUnpack = true;
buildInputs = builtins.map (pkg: pull_typst_package pkg) pkgList;
installPhase = ''
mkdir -p $out/preview
for input in $buildInputs
do
ln -s $input/$(ls $input) $out/preview
done
'';
};
build_with_targets = id: targets: buildOutputs: typstPkgs: pkgs.stdenv.mkDerivation {
inherit buildInputs targets buildOutputs;
name = name + "-" + id;
src = ./.;
buildInputs = dependencies;
buildPhase = ''
make documentation.pdf
${envSetup}
${
if builtins.length typstPkgs > 0
then
"ln -s ${pull_typst_packages typstPkgs} typst_packages"
else ""
}
for target in $targets
do
make $target ${
if builtins.length typstPkgs > 0 then "TYPST_PACKAGES=typst_packages" else ""
}
done
'';
installPhase = ''
mkdir -p $out
cp -r documentation.pdf $out/ || true
mkdir $out
for buildOutput in $buildOutputs
do
cp -R $buildOutput $out
done
'';
};
packages.default = self.packages.${system}.documentation;
build = id: targets: typstPkgs: (let
targetFiles = builtins.map (target: "target/${target}") targets;
in
build_with_targets id [targetFiles] [targetFiles] typstPkgs);
in
{
devShell = with pkgs; mkShell {
buildInputs = dependencies;
inherit buildInputs;
shellHook = envSetup;
};
packages.bundle = build_with_targets "bundle" ["bundle"] ["target/pack/bundle/."] [];
packages.theses = build "theses" (builtins.map (file: "${file}.pdf") [
"bp_cs" "bp_en"
"dp_cs" "dp_en"
"prj_cs" "prj_en"
"sp_cs" "sp_en"
"presentation_cs"
]) typstPkgs;
packages.pack = build_with_targets "pack" ["pack"] ["target/pack/."] [];
}
);
}

13
packed.mk Normal file
View File

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

View File

@@ -26,6 +26,7 @@
),
acknowledgement: "dictionary[string : string | content] | none",
assignment: "dictionary[string : any] | content | string | none",
presentation_info: "dictionary[string: any] | none",
citations: "string",
);
@@ -36,6 +37,12 @@
content: "content",
);
#let presentation_structure = (
append_thanks: "boolean",
wide: "boolean",
first_heading_is_fullpage: "boolean",
)
#let check_arguments(args, structure: arguments_structure, namespace: none) = {
let check_arguments_dict(structure, args, argument_path) = {
@@ -137,6 +144,13 @@
assignment
}
#let presentation_info(presentation) = {
if not is_none(presentation) {
check_arguments(presentation, structure: presentation_structure, namespace: "presentation")
}
presentation
}
#let arguments(
document_info,
title_pages,
@@ -146,6 +160,7 @@
abstract_info,
acknowledgement,
assignment,
presentation,
citations,
) = {
(
@@ -157,6 +172,7 @@
abstract: abstract_info,
acknowledgement: acknowledgement,
assignment: assignment_info(assignment),
presentation_info: presentation_info(presentation),
citations: citations,
)
}

View File

@@ -154,7 +154,7 @@
);
query(label(attachment.at(1))).at(0).value;
} else if attachment_type == "pdf" {
import "@preview/muchpdf:0.1.1": muchpdf
import "./pdf.typ": embed_full
page(place(center + horizon, heading(
level: 2,
get_lang_item(language, "attachment") + " " +
@@ -164,7 +164,7 @@
outlined: false,
)), margin: 0em);
set page(margin: 0em);
muchpdf(read("../" + attachment.at(1), encoding: none), width: 100%);
embed_full(read("../" + attachment.at(1), encoding: none));
}
}
}

View File

@@ -9,14 +9,21 @@
#import "bp.typ": bp
#import "dp.typ": dp
#import "prj.typ": prj
#import "sp.typ": sp
#import "other.typ": other_title_page, other_base
#import "thesis_base.typ": thesis_base, thesis_base_title_pages
#import "presentation.typ": presentation
#let document_types = (
"bp": (bp, thesis_base, thesis_base_title_pages),
"dp": (dp, thesis_base, thesis_base_title_pages),
"prj": (prj, thesis_base, thesis_base_title_pages),
"other": (other_title_page, other_base, (args) => {}),
"bp": (root: bp, base: thesis_base, title_pages: thesis_base_title_pages),
"dp": (root: dp, base: thesis_base, title_pages: thesis_base_title_pages),
"prj": (root: prj, base: thesis_base, title_pages: thesis_base_title_pages),
"sp": (root: sp, base: thesis_base.with(
show_disclaimer: false,
require_abstract: false,
), title_pages: thesis_base_title_pages),
"other": (root: other_title_page, base: other_base),
"presentation": (base: presentation,),
)
#let prep_args(args) = {
@@ -49,18 +56,31 @@
#let template_classic(args, content) = {
let args = prep_args(args);
if not is_none(get_arg(args, "title_pages")) {
external_title_pages(req_arg(args, "title_pages"));
document_types.at(req_arg(args, "document.type")).at(1)(args, content);
let doctype = req_arg(args, "document.type");
let doc = document_types.at(doctype);
if "root" in doc {
if not is_none(get_arg(args, "title_pages")) {
external_title_pages(req_arg(args, "title_pages"));
doc.at("base")(args, content);
} else {
doc.at("root")(args);
doc.at("base")(args, content);
}
} else {
document_types.at(req_arg(args, "document.type")).at(0)(args);
document_types.at(req_arg(args, "document.type")).at(1)(args, content);
doc.at("base")(args, content);
}
}
#let title_pages_classic(args) = {
let args = prep_args(args);
document_types.at(req_arg(args, "document.type")).at(0)(args);
document_types.at(req_arg(args, "document.type")).at(2)(args);
let doctype = req_arg(args, "document.type");
let doc = document_types.at(doctype);
if "title_pages" in doc {
doc.at("root")(args);
doc.at("title_pages")(args);
} else {
let panic_message = "document of type '" + doctype + "' can't generate title pages";
panic(panic_message);
}
}

View File

@@ -6,7 +6,6 @@
#let base_font = "Inter";
#let mono_font = "Noto Sans Mono";
#let serif_font = "Merriweather";
#let tul_logomark_size = 6.5em;
// COUNTERS
@@ -15,6 +14,39 @@
// TYPST ELEMENT STYLING
#let common_styling(faculty_color, language, content) = {
// text
set text(font: base_font);
set par(justify: true);
if language == "cs" {
content = set_czech_nonbreakable_terms(content);
}
// headings
show heading: it => {
set par(justify: false);
text(it, faculty_color, font: "TUL Mono", size: 1.2em)
};
// other
show raw.where(block: false): set text(font: mono_font, size: 1.25em);
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%);
set rect(stroke: (paint: faculty_color, thickness: .7pt));
content
}
#let default_styling(flip_bonding, faculty_color, content, language) = {
// page
set page(
@@ -34,13 +66,6 @@
}
});
// text
set text(font: base_font);
set par(justify: true);
if language == "cs" {
content = set_czech_nonbreakable_terms(content);
}
// figures
let figure_numbering(realcount, c) = {
context realcount.step();
@@ -56,14 +81,6 @@
// heading
set heading(numbering: "1.1.1 ");
show heading: it => {
set par(justify: false);
block(
above: 2em,
below: 2em,
text(it, faculty_color, font: "TUL Mono", size: 1.2em)
);
};
show heading.where(level: 1): it => {
// reset figure counters
context counter(figure.where(kind: image)).update(0);
@@ -71,7 +88,11 @@
pagebreak(weak: true);
v(2cm);
it
block(
above: 2em,
below: 2em,
it,
);
};
show heading.where(): it => {
if it.level > 3 {
@@ -81,22 +102,7 @@
}
}
// other
show raw.where(block: false): set text(font: mono_font, size: 1.25em);
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
common_styling(faculty_color, language, content);
}
@@ -104,7 +110,7 @@
let logotype = faculty_logotype(faculty_id, language);
grid(
block(logotype, width: 100%),
block(align(right, block(tul_logomark(faculty_id), height: tul_logomark_size))),
block(align(right, tul_logomark(faculty_id))),
columns: 2
);
}
@@ -261,6 +267,7 @@
let (personal_number, department, academical_year) = req_arg(args, (
"personal_number", "department", "academical_year",
));
set heading(bookmarked: false, outlined: false);
set text(font: base_font);
set page(margin: 2cm);
pagebreak(weak: true);
@@ -278,9 +285,8 @@
// _ EMBEDDED
#let pdfembed(path) = {
import "@preview/muchpdf:0.1.1": muchpdf
set page(margin: 0em);
muchpdf(read(path, encoding: none));
import "../pdf.typ": embed_full
embed_full(read(path, encoding: none));
}
// ASSIGNMENT PAGE
@@ -376,7 +382,10 @@
}
}
#let abstract(language, args) = {
#let abstract(language, args, require: true) = {
if not require and is_none(get_arg(args, "abstract.content")) {
return;
}
heading(
text(req_arg(args, "title").at(language), font: base_font), numbering: none, outlined: false
);
@@ -489,7 +498,7 @@
block(text(it, weight: "bold", size: 1.2em), above: 1.5em);
};
context {
if query(heading.where(bookmarked: true)).len() > 0 {
if query(heading.where(outlined: true)).len() > 0 {
outline(title: get_lang_item(language, "toc"));
}
}

View File

@@ -0,0 +1,133 @@
#import "../arguments.typ": req_arg
#import "../utils.typ": assert_dict_has, is_none
#import "../theme.typ": faculty_color, faculty_logotype, faculty_logotype_text, tul_logomark
#import "../lang.typ": get_lang_item
#import "common.typ": common_styling, bibliogr, base_font
#let header_margin = 20pt
#let footer_margin = header_margin
#let paper_compensation = (
presentation-4-3: 1.2570145903479237,
presentation-16-9: 1,
)
#let set_page_style(lang, faculty, faculty_color, paper, content) = {
context {
let footer_logotype = faculty_logotype(faculty, lang, long: false)
let footer_height = measure(footer_logotype).height + footer_margin
set page(paper: paper, margin: (bottom: footer_height, rest: 1cm), footer-descent: 0%, footer: {
text(box(outset: (top: footer_margin, bottom: footer_margin), {
footer_logotype
h(1fr)
context text(
str(counter(page).get().at(0)) + " / " + str(counter(page).final().at(0)),
font: "TUL Mono",
faculty_color,
)
}), size: 11pt)
})
set text(size: 1.5em * paper_compensation.at(paper))
content
}
}
#let set_heading_styles(first_heading_is_fullpage, faculty_color, content) = {
let slide_title = (it) => {
pagebreak(weak: true)
box(it, inset: (top: 1em, bottom: 1em))
}
show heading.where(level: 1): it => {
if first_heading_is_fullpage {
page(place(center + horizon, it), header: none, margin: (top: 0em))
} else {
slide_title(it)
}
}
if first_heading_is_fullpage {
show heading.where(level: 2): it => {
slide_title(it)
}
content
} else {
content
}
}
#let apply_style(language, faculty, faculty_color, paper, first_heading_fullpage, content) = {
common_styling(
faculty_color, language,
set_page_style(
language, faculty, faculty_color, paper,
set_heading_styles(first_heading_fullpage, faculty_color, content)
)
)
}
#let fullpage(language, faculty, faculty_color, content, paper) = {
page(
background: rect(fill: faculty_color, width: 100%, height: 100%), paper: paper, margin: 1cm,
{
grid(
columns: 3,
faculty_logotype(faculty, language, color: white),
h(1fr),
tul_logomark(faculty, color: white),
)
content
}
)
}
#let signedpage(language, faculty, faculty_color, author, content, paper) = {
fullpage(language, faculty, faculty_color, {
content
place(center + bottom, text(author, white.transparentize(30%), size: 1.25em, font: base_font))
}, paper)
}
#let mainpage(language, faculty, faculty_color, title, author, paper) = {
signedpage(language, faculty, faculty_color, author, {
place(center + horizon, text(
title, size: 2em * paper_compensation.at(paper), font: "TUL Mono", white
))
}, paper)
}
#let thankspage(language, faculty, faculty_color, author, paper) = {
signedpage(language, faculty, faculty_color, author, {
place(center + horizon, text(
get_lang_item(language, "thanks_for_attention"),
size: 2em * paper_compensation.at(paper),
font: "TUL Mono",
white,
))
}, paper)
}
#let presentation(args, content) = {
let language = req_arg(args, "document.language")
let faculty = req_arg(args, "document.faculty")
let faculty_color = faculty_color(faculty)
let presentation_args = req_arg(args, "presentation_info")
let author = req_arg(args, "author.name")
let paper = if presentation_args.at("wide") {
"presentation-16-9"
} else {
"presentation-4-3"
}
mainpage(
language, faculty, faculty_color,
req_arg(args, "title").at(language), author, paper,
)
apply_style(language, faculty, faculty_color, paper,
presentation_args.at("first_heading_is_fullpage"), {
content
bibliogr(args)
},
)
if presentation_args.at("append_thanks") {
thankspage(language, faculty, faculty_color, author, paper)
}
}

19
template/classic/sp.typ Normal file
View File

@@ -0,0 +1,19 @@
#import "../arguments.typ": req_arg, get_arg, map_arg
#import "../utils.typ": assert_dict_has
#import "common.typ": mainpage, assignment
#let sp(args) = {
let language = req_arg(args, "document.language");
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");
});
if language == "cs" {
let _ = req_arg(args, "author.pronouns");
}
mainpage(args);
assignment(args, show_fallback: false);
}

View File

@@ -16,18 +16,20 @@
#let force_langs = ("cs", "en");
#let thesis_base(args, content) = {
#let thesis_base(args, content, show_disclaimer: true, require_abstract: true) = {
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");
if require_abstract {
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")) {
if show_disclaimer and is_none(get_arg(args, "title_pages")) {
disclaimer(args);
}
abstract("cs", args);
abstract("en", args);
abstract("cs", args, require: require_abstract);
abstract("en", args, require: require_abstract);
acknowledgement(args);
toc(language);
tablelist(language);

View File

@@ -18,6 +18,8 @@
"dp_asgn": "Zadání diplomové práce",
"prj": "Projekt",
"prj_asgn": "Zadání projektu",
"sp": "Semestrální práce",
"sp_asgn": "Zadání semestrální práce",
"city": "Liberec",
@@ -89,10 +91,12 @@
"place_assignment": "Sem vložte zadání",
"thanks_for_attention": "Děkuji za pozornost",
"break_rules": {
"space_after": [
"((?i)[kosuvzai])",
"(tj|tzv|tzn)\\."
"(tj|tzv|tzn|např)\\."
],
"nonbreaking_terms": [
"(s\\. r\\. o|a\\. s|v\\. o\\. s)\\.",
@@ -123,6 +127,8 @@
"dp_asgn": "Diploma thesis assignment",
"prj": "Project",
"prj_asgn": "Project assignment",
"sp": "Term paper",
"sp_asgn": "Term paper assignment",
"city": "Liberec",
@@ -154,11 +160,13 @@
"abbrs": "List of abbreviations",
"image_list": "List of images",
"table_list": "List of tables",
"attachments": "Attachments",
"attachment": "Attachment",
"attachments": "Appendix",
"attachment": "Appendix",
"next_page_attachment": "begins on the next page",
"attached_bellow": "attached bellow",
"place_assignment": "Insert your assignment here"
"place_assignment": "Insert your assignment here",
"thanks_for_attention": "Thank you for your attention"
}
}

12
template/pdf.typ Normal file
View File

@@ -0,0 +1,12 @@
#let embed_full(src) = {
import "./lib/much_pdf_tools/lib.typ": pdf_count_pages;
let page_count = pdf_count_pages(src);
for idx in range(0, page_count) {
page(
place(center + horizon, image(src, page: idx + 1, fit: "contain", width: auto, height: auto)),
margin: 0cm,
footer: none,
header: none,
);
}
}

View File

@@ -2,7 +2,7 @@
// | TULTemplate 2 |
// +---------------+
//
// Unofficial TUL template for all kinds of documents.
// Typst TUL template for all kinds of documents.
//
// Git: https://git.zumepro.cz/tul/tultemplate2
@@ -39,6 +39,7 @@
// - keywords (dictionary): The abstract keywords.
// - assignment (str): Filepath of the assignment document/page.
// - citations (str): The location of the citation file.
// - presentation (dictionary): Arguments for the presentation
// - content (content): The content of the document
//
//-> none
@@ -52,8 +53,10 @@
author_pronouns: none, supervisor: none, consultant: none, programme: none,
specialization: none, year_of_study: none,
// links
assignment: none, citations: "citations.bib",
// nested
assignment: none, presentation: none,
citations: "citations.bib",
// content
content,
@@ -77,6 +80,7 @@
abstract_info(abstract, keywords),
acknowledgement,
assignment,
presentation,
citations,
);
check_arguments(args);
@@ -129,6 +133,7 @@
abstract_info(none, none),
none,
assignment,
none,
"",
);
check_arguments(args);

View File

@@ -9,6 +9,10 @@
"TECHNICKÁ UNIVERZITA V LIBERCI&",
"TECHNICAL UNIVERSITY OF LIBEREC&",
),
(
"TUL&",
"TUL&",
),
),
fs: (
@@ -17,6 +21,10 @@
"FAKULTA STROJNÍ TUL&",
"FACULTY OF MECHANICAL ENGINEERING TUL&",
),
(
"FS TUL&",
"FME TUL&",
),
),
ft: (
@@ -25,6 +33,10 @@
"FAKULTA TEXTILNÍ TUL&",
"FACULTY OF TEXTILE ENGINEERING TUL&",
),
(
"FT TUL&",
"FT TUL&",
),
),
fp: (
@@ -33,6 +45,10 @@
"FAKULTA\nPŘÍRODOVĚDNĚ-HUMANITNÍ\nA PEDAGOGICKÁ TUL&",
"FACULTY OF SCIENCE,\nHUMANITIES AND\nEDUCATION TUL&",
),
(
"FP TUL&",
"FED TUL&",
),
),
ef: (
@@ -41,6 +57,10 @@
"EKONOMICKÁ FAKULTA TUL&",
"FACULTY OF ECONOMICS TUL&",
),
(
"EF TUL&",
"FE TUL&",
),
),
fua: (
@@ -49,6 +69,10 @@
"FAKULTA UMĚNÍ A ARCHITEKTURY TUL&",
"FACULTY OF ARTS AND ARCHITECTURE TUL&",
),
(
"FUA TUL&",
"FAA TUL&",
),
),
fm: (
@@ -57,6 +81,10 @@
"FAKULTA MECHATRONIKY,\nINFORMATIKY A MEZIOBOROVÝCH\nSTUDIÍ TUL&",
"FACULTY OF MECHATRONICS,\nINFORMATICS AND\nINTERDISCIPLINARY STUDIES TUL&",
),
(
"FM TUL&",
"FM TUL&",
),
),
fzs: (
@@ -65,6 +93,10 @@
"FAKULTA ZDRAVOTNICKÝCH STUDIÍ TUL&",
"FACULTY OF HEALTH STUDIES TUL&",
),
(
"FZS TUL&",
"FHS TUL&",
),
),
cxi: (
@@ -73,6 +105,10 @@
"ÚSTAV PRO NANOMATERIÁLY,\nPOKROČILÉ TECHNOLOGIE\nA INOVACE TUL&",
"INSTITUTE FOR NANOMATERIALS,\nADVANCED TECHNOLOGY\nAND INNOVATION TUL&",
),
(
"CXI TUL&",
"CXI TUL&",
),
),
);
@@ -89,21 +125,29 @@
return theme_color;
}
#let faculty_logotype_text(faculty_id, lang) = {
#let faculty_logotype_text(faculty_id, lang, long: true) = {
let theme = faculty_theme(faculty_id);
let logotype_text = theme.at(1).at(lang_id(lang));
let logotype_text = theme.at(if long { 1 } else { 2 }).at(lang_id(lang));
assert(type(logotype_text) == str);
return logotype_text;
}
#let faculty_logotype(faculty_id, lang) = {
let theme_color = faculty_color(faculty_id);
let logotype_text = faculty_logotype_text(faculty_id, lang);
#let faculty_logotype(faculty_id, lang, color: none, long: true) = {
let theme_color = if type(color) == type(none) {
faculty_color(faculty_id)
} else {
color
};
let logotype_text = faculty_logotype_text(faculty_id, lang, long: long);
text(logotype_text, font: "TUL Mono", theme_color, weight: "black");
}
#let tul_logomark(faculty_id) = {
let theme_color = faculty_color(faculty_id);
#let tul_logomark(faculty_id, color: none) = {
let theme_color = if type(color) == type(none) {
faculty_color(faculty_id)
} else {
color
};
let image_raw = bytes(read("./assets/tul_logo.svg").replace("black", theme_color.to-hex()));
image(image_raw, fit: "contain")
image(image_raw, fit: "contain", height: 6.5em)
}

View File

@@ -1,298 +0,0 @@
#let doc(inner, argument_name, explanation) = {
inner.doc = (argname: argument_name, expl: explanation);
inner
}
#let type_primitive(id, name, cs_name) = {
(type: "primitive", type_id: id, type_name: name, type_name_cs: cs_name)
}
#let int = type_primitive("integer", "an 'integer'", "celé číslo");
#let float = type_primitive("float", "a 'float'", "desetinné číslo");
#let bool = type_primitive("boolean", "a 'boolean'", "pravdivostní hodnota");
#let string = type_primitive("string", "a 'string'", "textový řetězec");
#let content = type_primitive("content", "a 'content'", "obsah generovaný Typst syntaxí");
#let literal(value) = {
(type: "literal", value: value)
}
#let variants(..variants) = {
(type: "variants", variants: variants.pos())
}
#let slice(items) = {
(type: "slice", items: items)
}
#let tuple(..items) = {
(type: "tuple", items: items.pos())
}
#let keyval(key, val) = {
(type: "keyval", key: key, val: val)
}
#let dict(keyval) = {
(type: "dictionary", key: keyval.key, val: keyval.val)
}
#let struct(..keyvals) = {
let copy_doc(from, to) = {
if "doc" in from {
let to = to;
to.doc = from.doc;
to
} else {
to
}
}
let keyvals = keyvals.pos();
let res = ().to-dict();
for keyval in keyvals {
if keyval.key.type != "literal" {
panic("invalid type signature, struct keys must be literals");
}
res.insert(keyval.key.value, copy_doc(keyval, keyval.val));
}
(type: "struct", pairs: res)
}
#let signature_check(value, signature, name_prefix) = {
let error_target_name(target, name_prefix) = {
name_prefix + if "doc" in target { " ('" + target.doc.argname + "')" } else { "" }
}
let error_value_name(value) = {
str(type(value))
}
let dbg_literal(literal) = {
if type(literal) == str {
"\"" + literal + "\""
} else {
"'" + str(literal) + "'"
}
}
let error_expected_type(target) = {
if target.type == "variants" {
let variants = target.variants;
let last = variants.pop();
let res = (variants.map((v) => { error_expected_type(v) })).join(", ");
if type(last) != type(none) {
if type(res) != type(none) {
res + " or " + error_expected_type(last)
} else {
error_expected_type(last)
}
} else {
res
}
} else if target.type == "slice" or target.type == "tuple" {
"an array"
} else if target.type == "dictionary" or target.type == "struct" {
"a dictionary/hashmap"
} else if target.type == "primitive" {
target.type_name
} else if target.type == "literal" {
dbg_literal(target.value)
} else {
panic();
}
}
let error(target, name_prefix, value, is_value: false, target_doc: none) = {
if type(target_doc) != type(none) {
error_target_name(target_doc)
} else {
error_target_name(target, name_prefix)
} + " " + if is_value {
"is unexpected"
} else {
"has an unexpected type '" + error_value_name(value) + "'"
} + ", expected " + error_expected_type(target)
}
let in_variants(value, variants, matcher) = {
for variant in variants {
if matcher(value, variant).at(0) == true {
return true;
}
}
false
}
let matches_type(value, target, name_prefix: "") = {
if target.type == "variants" {
return if in_variants(value, target.variants, matches_type.with(name_prefix: name_prefix)) {
(true,)
} else {
(false, error(target, name_prefix, value, is_value: true))
}
} else if target.type == "literal" {
return if value != target.value {
(false, error(target, name_prefix, value, is_value: true))
} else {
(true,)
}
}
if type(value) == dictionary {
if target.type == "struct" {
for key in target.pairs.keys() {
if key not in value {
return (false, (
error_target_name(target, name_prefix) +
" is missing an entry for key " +
dbg_literal(key)
));
}
}
for (key, val) in value.pairs() {
if key not in target.pairs {
return (
false, name_prefix + " contains an unexpected key " + dbg_literal(key)
);
}
matches_type(
val, target.pairs.at(key), name_prefix: name_prefix + " " + str(key)
)
}
} else if target.type == "dictionary" {
for (key, val) in value.pairs() {
let cur = matches_type(key, target.key, name_prefix: name_prefix + " key");
if not cur.at(0) {
return cur;
}
let cur = matches_type(
val, target.val, name_prefix: name_prefix + " value"
);
if not cur.at(0) {
return cur;
}
}
(true,)
} else {
(false, error(target, name_prefix, value))
}
} else if type(value) == array {
if target.type == "slice" {
for (idx, val) in value.enumerate() {
let cur = matches_type(
val, target.items, name_prefix: name_prefix + " item at index " + str(idx)
);
if not cur.at(0) {
return cur;
}
}
(true,)
} else if target.type == "tuple" {
for (idx, target) in target.items.enumerate() {
if idx >= value.len() {
return (false, name_prefix + " is missing an item: " + error_expected_type(target))
}
let cur = matches_type(
value.at(idx), target, name_prefix: name_prefix + " item at index " + str(idx)
);
if not cur.at(0) {
return cur;
}
}
(true,)
} else {
(false, error(target, name_prefix, value))
}
} else {
if target.type != "primitive" or str(type(value)) != target.type_id {
(false, error(target, name_prefix, value))
} else {
(true,)
}
}
}
matches_type(value, signature, name_prefix: name_prefix)
}
#let signature_docs(target, is_nested: false) = {
let typeinfo(target, flatten: false, disable_doc: false) = {
let try_doc(target, mapper: (v) => { v }) = {
if "doc" in target and not disable_doc {
mapper(target.doc.expl);
} else {
""
}
}
if target.type == "struct" {
if not flatten {
[slovník s přesnými atributy (_dictionary_)];
try_doc(target, mapper: (v) => { [ -- ]; v; });
":";
}
list(
..target.pairs.pairs().map(((key, val)) => {
raw(key);
try_doc(val, mapper: (v) => { [ -- ]; text(v); });
": "
typeinfo(val, disable_doc: true);
})
);
} else if target.type == "dictionary" {
[slovník (_dictionary_)];
try_doc(target, mapper: (v) => { [ -- ]; v; });
":";
list(
{
"S klíči typu ";
typeinfo(target.val);
},
{
"S hodnotami typu ";
typeinfo(target.key);
},
);
} else if target.type == "slice" {
} else if target.type == "tuple" {
} else if target.type == "primitive" {
text(target.type_name_cs + " (");
text(target.type_id, style: "italic");
text(")");
try_doc(target, mapper: (v) => { [ -- ]; text(v); });
} else if target.type == "variants" {
list(
..target.variants.map((v) => {
list.item({
typeinfo(v);
});
})
);
} else {
panic();
}
}
let args = ();
if target.type == "struct" {
for val in target.pairs.values() {
args.push(signature_docs(val, is_nested: true));
}
} else {
if "doc" in target and type(target.doc.argname) != type(none) {
args.push({
raw(target.doc.argname);
[: ]
typeinfo(target, flatten: true)
});
}
}
if not is_nested {
list(..args.flatten());
} else {
args.flatten()
}
}

View File

@@ -9,5 +9,6 @@ watch: $(THESIS_FILE).pdf
view: $(THESIS_FILE).pdf
xdg-open $<
.PHONY: %.pdf
%.pdf: %.typ
typst compile $(TYPST_FONTPATH) $<

17
tests/pdf_embedding.typ Normal file
View File

@@ -0,0 +1,17 @@
#import "../template/pdf.typ": number_of_pages, embed_full
#let pdfinfo(src, target_pagecount) = {
let pdf = read(src, encoding: none);
let pagecount = number_of_pages(pdf);
[
= #src
Pagecount: #pagecount
];
place(bottom + right, [Starting on next page]);
assert(pagecount == target_pagecount);
embed_full(pdf);
}
#pdfinfo("./pdf_embedding_01.pdf", 1)
#pdfinfo("./pdf_embedding_02.pdf", 2)
#pdfinfo("./pdf_embedding_03.pdf", 1)

BIN
tests/pdf_embedding_01.pdf (Stored with Git LFS) Normal file

Binary file not shown.

BIN
tests/pdf_embedding_02.pdf (Stored with Git LFS) Normal file

Binary file not shown.

BIN
tests/pdf_embedding_03.pdf (Stored with Git LFS) Normal file

Binary file not shown.

37
theses/assignment.typ Normal file
View File

@@ -0,0 +1,37 @@
#let color = red
#set text(font: "Inter")
#set page(foreground: rect(
width: 90%,
height: 90%,
stroke: (paint: color, thickness: .03em, dash: (.5em, .5em))
))
#set text(lang: "cs")
#align(center + horizon, text([
*Nahraďte soubor "`assignment.pdf`"* souborem se zadáním.
], color, 2em))
#text([
To můžete v online Typst editoru udělat takto:
+ Soubor se zadáním stáhněte ze systému. Pokud vaše fakulta nemá žádný systém, požádejte svého vedoucího o PDF soubor se zadáním.
+ Přejmenujte ho na "`assignment.pdf`".
+ Otevřete v online Typst editoru prohlížeč souborů.
+ Přetáhněte svůj přejmenovaný soubor do prohlížeče souborů.
+ Pokud jste vše udělali správně, vyskočí vám okno, které se vás ptá, jestli chcete soubor přepsat -- klikněte na přepsat (v angličtině overwrite).
], black, 11pt)
#pagebreak()
#set text(lang: "en")
#align(center + horizon, text([
*Replace file "`assignment.pdf`"* with your assignment document.
], color, 2em))
#text([
In the online Typst editor you can do it as follows:
+ Download the assignment file from the system. If your faculty doesn't have a system, ask your supervisor for a PDF file with the assignment.
+ Rename it to "`assignment.pdf`".
+ Open the file browser in the online Typst editor.
+ Drag and drop your renamed file into the file browser.
+ If you did everything correctly, a window will popup, asking you if you want to overwrite the file --- click on overwrite.
], black, 11pt)

View File

@@ -36,7 +36,7 @@
supervisor: [Ondřej Mekina],
abstract: (
cs: [
Tento dokument slouží jako praktická ukázka všech důležitcýh funkcí šablony _tultemplate2_,
Tento dokument slouží jako praktická ukázka všech důležitých funkcí šablony _tultemplate2_,
s názornými příklady použítí a jejich podrobným popisem.
],
en: [
@@ -52,280 +52,5 @@
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
#strike[přeškrtnuto]
#highlight[zvýrazněno]
#underline[podtrženo] // podtržení by se NEMĚLO používat
```
Pro úplnost a ukázku je zde přímo v textu *tučný text*, _text kurzívou_, #strike[přeškrtnutý text] a #highlight[text zvýrazněný podle barvy příslušící vaší fakultě], #underline[podtržený text] (ačkoli typografové doporučují podtržení nepoužívat).
== 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.]),
)
Bakalářská práce
bakalářskou práci

View File

@@ -5,291 +5,51 @@
faculty: "fm",
lang: "en",
document: "bp",
title_pages: "bp_en_assignment.pdf",
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ě",
assignment: (
personal_number: [A00000007],
department: [Department of templates],
academical_year: [2025/2026],
content: [
= Principles for drafting:
+ Familiarize yourself with available templates
+ Design several possible template styles
+ Learn to use Typst
+ Implement the template
+ Review the template
+ Fix many issues
+ Review the template
+ Fix many issues
+ Review the template
+ Hopefully nothing more needs fixing
= List of professional literature:
_Top secret_
],
),
author: "Matěj Žucha",
title: (
cs: [Ukázka dokumentu typu Bakalářská práce pro FM TUL v angličtině],
en: [Example document for a Bachelor's thesis for FM TUL in English],
),
author: [Matěj Žucha],
author_pronouns: "me",
programme: (en: [MI6000000007 Top secret]),
specialization: (en: [Creation of templates]),
supervisor: [Ondřej Mekina],
abstract: (
cs: [
Tento dokument slouží jako praktická ukázka všech důležitých 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.
],
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"),
cs: [Ukázka, Klíčových, Slov, Česky],
en: [Example, Keywords, In, English],
),
acknowledgement: (en: "Lorem ipsum dolor sit amet."),
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
#strike[přeškrtnuto]
#highlight[zvýrazněno]
#underline[podtrženo] // underline SHOULD NOT be used
```
Pro úplnost a ukázku je zde přímo v textu *tučný text*, _text kurzívou_, #strike[přeškrtnutý text] a #highlight[text zvýrazněný podle barvy příslušící vaší fakultě], #underline[podtržený text] (ačkoli typografové doporučují podtržení nepoužívat).
== 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.]),
)
Bachelor thesis

616
theses/content_cs.typ Normal file
View File

@@ -0,0 +1,616 @@
#import "../template/template.typ": *
#show: tultemplate2
= Úvod do této šablony
Tato šablona sloužit jako ukázka práce typu `{{ta}}` v nástroji *Typst* a šabloně *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 nástroji 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 pracovat
Tuto šablonu jste si pravděpodobně stáhli z generátoru na webu https://tulsablona.zumepro.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 v tomto dokumentu 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.
#rect[
*TIP*:
Uložte si tento dokument pro pozdější použití.
budete hledat nějakou specifickou funkci, můžete se k prokliknout přes seznam obsahu nahoře.
]
== Hlavička a obsah
Když se podíváte na zdroj dokumentu (vlevo, pokud jste v online editoru), tak si můžete všimnout, že zdroj se skládá z dvou hlavních části: hlavičku (ta na první pohled může vypadat docela strašidelně) a obsah.
=== Hlavička
Hlavička definuje všechny potřebné informace pro úspěšné vygenerování dokumentu -- například fakultu, název práce, atd.
Údaje v hlavičce buď můžete upravit rovnou ručně, nebo se k obsahu prokliknout a začít psát.
Na to navážeme hned v další kapitole.
=== Obsah
Obsah je z většiny samotný text vaší práce.
Zdroj dokumentu, kromě samotného textu, také obsahuje speciální znaky (odborně tomu říkáme syntaxe), které Typstu vysvětlí jak si dokument přejete naformátovat.
== Klikatelný obsah v hlavičce
Pokud používáte oficiální Typst online editor, můžete jednoduše klepnout na téměř jakýkoliv text na pravé půlce obrazovky (náhledové PDF), a editor podle toho automaticky přesune váš kurzor na správné místo.
Je to sice drobná, ale zato velmi užitečná funkce.
#rect[
*TIP*:
Zkuste například dvakrát poklepat na obsah abstraktu (nebo název práce u projektů a semestrálních prací -- pokud nemáte titulní strany ze STAGu) a začít psát.
]
== Kontrola šablony při kompilaci
Tato šablona je vytvořena tak, že když se ji pokusíte zkompilovat s nesprávnou syntaxí nebo s nějakou chybějící důležitou částí hlavičky, nenechá vás to provést.
Vždy se podívejte na chybové hlášky, které šablona vypisuje, protože vás snadno navedou k opravě všech chyb.
Můžete to vyzkoušet tak, že smažete něco z hlavičky nebo že např. použijete funkci, která není nikde definovaná.
Pokud jste hlavičku vygenerovali z generátoru -- neměli byste s mít žádné problémy.
Generátor je nastaven tak, aby vás nenechal vygenerovat špatnou hlavičku.
= Základní formátování obsahu
Formátování (sázení) textu v Typstu je ve většině případů velice jednoduché.
V této kapitole vám ukážeme nějaké základy, které budete běžně používat.
== 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é.
V 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.
== Nadpisy
První důležitá funkce kromě psaní samotného textu, k čemuž není zapotřebí žádná černá magie, 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 ve výstupu 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.
#rect[
*TIP*:
Schválně si zkuste napsat nadpis čtvrté úrovně.
Alespoň se tak jednodušše seznámíte se způsobem, jakým vám tato šablona skrz Typst hlásí chyby.
Pokud se při poklikání na error ocitnete v jiném souboru -- prostě se jednodušše vraťte přes menu souborů.
]
== 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_
#highlight[zvýrazněno]
```
Další stylování lze dělat právě přes funkce, viz třeba:
```typst
#strike[přeškrtnuto]
```
Pro úplnost a ukázku je zde přímo v textu *tučný text*, _text kurzívou_, #strike[přeškrtnutý text] a #highlight[text zvýrazněný podle barvy příslušící vaší fakultě].
Lze sázet také #underline[podtržený text] (ačkoli typografové doporučují podtržení nepoužívat).
== Zalamování řádků
Typst vám nějak zalomil řádek a vám se to nelíbí? Pojďme to vyřešit.
=== Nucené zalomení rádku
Pokud chcete vynutit zalomení, stačí na konec řádku ve zdrojovém souboru napsat znak "`\`".
Například:
```typst
*Alice*: Jak napsat skvělou práci? \
*Bob*: Pomocí Typstu!
```
V příkladu výše bude otazník posledním znakem prvního řádku -- Typst nám tady řádky nespojí.
=== Nezalomitelná mezera
Možná jste tento pojem někdy slyšeli.
Pokud chcete například napsat nějaký název a nemá v něm být zalomení řádku, můžete použít znak "`~`".
Ukázka:
```typst
Ano, chodím na Technickou univerzitu v~Liberci.
```
V ukázce výše ve výstupu Typst nikdy neukončí řádek mezi písmenem "v" a slovem "Liberci".
Vlnovka se ve výstupu nezobrazí -- místo bude mezera.
== Jak napsat speciální znak
Znaky jako `_`, `*`, `~`, ... jsou speciální (jak nyní víte).
Ale co když je chcete napsat... jako opravdu napsat (do své práce).
Stačí před jakýkoliv znak napsat zpětné lomítko (AltGr / Pravý Alt + Q na české klávesnici na Windows/Linuxu, Na Macu klávesa vedle levého shiftu) a stane se z něj znak normální.
```typst
Takhle tedy můžete například zapsat znak podtržítka: \_
```
Takhle tedy můžete například zapsat znak podtržítka: \_
Chcete napsat samotné zpětné lomítko?
Uhádnete jak se to dělá? ... Dáte před něj zpětné lomítko.
```typst
Nějak takhle: \\
```
Nějak takhle: \\
== Pomlčky
Možná jste někdy slyšeli, že pokud napíšete na klávesnici pomlčku, tak to není skutečná pomlčka.
Píšete totiž ve skutečnosti spojovník, který se má používat na slovo-spojování.
Jak napsat pomlčku? Stačí napsat víc spojovníků za sebou.
```typst
-- // Krátká pomlčka
--- // Dlouhá pomlčka
```
#highlight[
V češtině se k účelům spojování logických celků používá výhradně krátká pomlčka -- tedy "--".
]
#rect[
*TIP*:
Zkuste si znaky zkopírovat a vložit například do #link("https://apps.timwhitlock.info/unicode/inspect")[Unicode Inspektoru] -- ten vám ukáže podrobnosti o nějakém znaku.
]
== Odkazy<links>
Odkazy je možné dělat na URL/URI zdroje, emaily, telefony, atd...
Odkázat na 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 emaily), můžeme použít funkci `link` přímo:
```typst
#link("mailto:info@tul.cz")[Email TUL informací]
```
Funkci link nejprve v kulatých závorkách dáte cíl odkazu (například URL adresu) a dále v hranatých závorkách obsah, který se zobrazí v dokumentu.
Dalši předpony (URI schémata) můžete najít třeba na Wikipedii
https://en.wikipedia.org/wiki/List_of_URI_schemes.
== Citace
Šablona podporuje správu citací pomocí standardního BibLaTeX @bibtex souboru, stejně jako například LaTeX.
Generování citací v BibLaTeX zápisu umí téměř každá stránka nebo program, které mají pro citace podporu -- doporučujeme použít buď #link("https://www.zotero.org/")[Zotero] nebo #link("https://www.citacepro.com/")[Citace.com].
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 BibLaTeX -- 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 na zalistovaný obsah (například za nadpis nebo obrázek) 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 na 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) v textu například takto:
```typst
Zkratka #abbr("ABC", "Abeceda") je zkratka pro abecedu písmen.
```
Potom zkratku #abbr("ABC") použijete přímo (bez opakované definice):
```typst
První písmeno #abbr("ABC") je písmeno "A".
```
Š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
- Zkratka bude definována pouze jednou (poprvé), jinak na vás šablona začne červeně křičet
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.
]
= Specifická použití
V této kapitole se podíváme na některá specifická použití.
Můžete zde tedy najít věci, které nebudete vůbec potřebovat.
Pokud vás z této kapitoly nic nezajímá, tak ji klidně přeskočte -- zlobit se nebudeme.
== Rovnice, vzorečky a matematika
Pokud vaše práce bude obsahovat matematické značení, pak je tato kapitola pro vás.
V této kapitole vám představíme nějaké základy -- pokud vám tyto základy stačit nebudou, doporučujeme se obrátit na dokumentaci Typstu: https://typst.app/docs/reference/math/
=== Matematický režim
Matematický režim speciální syntaxi pro zápis matematických výrazů.
V matematickém režimu tato šablona použije jiný font -- vhodný pro zápis čísel a speciálních matematických znaků.
Pokud chcete vstoupit do matematického režimu, obklopte výraz znaky dolaru "`$`".
```typst
$1 + 1 = 42$
```
Ukázka: $1 + 1 = 42$
Jak sami vidíte, v matematickém režimu používáte poměrně srozumitelný způsob zápisu.
Dále si ukážeme nějaké specifické zápisy.
=== Sčítání
Součet zapíšete pomocí znaku "`+`".
```typst
$1 + 2 = 3$
```
Ukázka: $1 + 2 = 3$
=== Odčítání
Rozdíl zapíšete pomocí znaku "`-`".
```typst
$3 - 2 = 1$
```
Ukázka: $3 - 2 = 1$
=== Násobení<nasobeni>
Součin zapíšete pomocí příkazu "`dot`". Jedná se o ekvivalent LaTeXového "`cdot`".
#highlight[Narozdíl od LaTeXu před příkazy v matematickém režimu nepřidáváte zpětné lomítko "`\`".]
```typst
$2 dot 3 = 6$
```
Ukázka: $2 dot 3 = 6$
=== Dělení
Podíl zapíšete pomocí znaku "`/`".
```typst
$1 / 2 = 0.5$
```
Ukázka: $1 / 2 = 0.5$
Pokud chcete do zlomku dát výraz, a ne pouhé číslo, zabalte čitatel / jmenovatel do kulatých závorek.
```typst
$(1 + 1) / (4 - 2) = 2 / 2 = 1$
```
Ukázka: $(1 + 1) / (4 - 2) = 2 / 2 = 1$
=== Text
Jak můžeme vidět u Násobení (@nasobeni), pokud napíšeme v matematickém režimu slovo, Typst ho bude interpretovat jako příkaz.
Pokud ale chceme napsat skutečně text, který se vykreslí do dokumentu, obklopíme text uvozovkami.
```typst
$69 "cm"$
```
Ukázka: $69 "cm"$
= 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.
== 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 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 výše (kde zobrazujeme logomark TUL) máme třeba nastavení šířky obrázku v procentech -- tedy v procentech šířky stránky.
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.
= Pokročilé formátování obsahu
Dále si ukážeme neobvyklé (ale stále užitečné) způsoby formátování obsahu.
== Speciální znaky v textu
Díky Typstu speciální znaky neusíte kopírovat z internetu.
Typst na speciální znaky funkci "`sym`".
V online editoru stačí napsat "`#sym.`" a editor vám začne našeptávat velkou spoustu znaků.
Například znak #sym.pi (pí) lze zapsat takto:
```typst
#sym.pi
```
Další znaky lze najít v dokumentaci Typstu: https://typst.app/docs/reference/symbols/sym/
== Horní / spodní text
Občas můžete chtít napsat text v menší velikosti a zarovnat ho na horní nebo spodní okraj řádku.
=== Horní text
Horní#super[text] lze napsat takto:
```typst
Horní#super[text]
```
=== Spodní text
Spodní#sub[text] lze napsat takto:
```typst
Spodní#sub[text]
```
== Ještě stále nemáte dost?
V tomto dokumentu naleznete vše, co v drtivé většině případů budete potřebovat ke psaní své práce.
Pokud se ale chcete dozvědět _ještě_ víc, pak vám doporučujeme se podívat na dokumentaci formátování obsahu přímo od vývojářů Typstu.
https://typst.app/docs/reference/text/
= Balíčky
Nenašli jste nějakou funkci v tomto dokumentu ani v Typst dokumentaci?
Žádný problém. Je naprosto možné, že na to bude existovat nějaký pěkný balíček.
Stejně jako například LaTeX, Typst na výběr velké množství balíčků, které vám poskytnou dodatečné funkce.
Tyto balíčky stáhnete pomocí velmi jednoduchého příkazu "`import`".
_Po_ příkazu import můžete používat naimportované funkce z balíčku.
== Ukázka balíčku
Pokud bych tak chtěl stáhnout například balíček "`alchemist`" na vykreslování chemických struktur, použiji následující import:
```typst
#import "@preview/alchemist:0.1.8": skeletize, fragment, branch, double, single
```
Textový řetězec (text v uvozovkách) je název balíčku a jeho verze -- název a verzi najdete na seznamu balíčků viz. @seznam_balicku.
Všechno za dvojtečkou jsou funkce, které chcete importovat (oddělené čárkami).
Pokud budete chtít naimportovat úplně všechny funkce balíčku, pak použijete hvězdičku:
```typst
#import "@preview/alchemist:0.1.8": *
```
Ukázka použití balíčku alchemist (podívejte se do zdroje dokumentu):
// ___ Ukázka balíčku Alchemist ___
#import "@preview/alchemist:0.1.8": skeletize, fragment, branch, double, single
#skeletize({ // příkaz na vykreslení chemické struktury
fragment(name: "S", "S") // síra uprostřed
// kyslíky
branch({
double(angle: 3, atom-sep: 1.422) // dvojná vazba
fragment(name: "O1", "O") // kyslík (name musí být unikátní -- proto ta jednička)
})
branch({
double(angle: 1, atom-sep: 1.422)
fragment(name: "O2", "O")
})
branch({
single(angle: -1, atom-sep: 1.574) // jednoduchá vazba
fragment(name: "O3", "O")
branch({
single(angle: 1, atom-sep: .97)
fragment(name: "H1", "H") // vodík
})
})
branch({
single(angle: -3, atom-sep: 1.574)
fragment(name: "O4", "O")
branch({
single(angle: -2, atom-sep: .97)
fragment(name: "H2", "H")
})
})
})
// __ Konec ukázky ___
== Seznam balíčků<seznam_balicku>
Balíčků je opravdu mnoho a všechny je v tomto dokumentu ukázat nemůžeme.
Vy si ale nějaký můžete vybrat a ten vyzkoušet.
Doporučujeme balíčky hledat pomocí vyhledávání v Typst Universe.
Seznam balíčků v Typst Universe je dostupný na URL: https://typst.app/universe/search/?kind=packages
Když si z tohoto seznamu nějaký balíček rozkliknete a budete ho chtít naimportovat -- stačí si v sekci "How to add" zkopírovat příkaz import pomocí tlačítka a tento příkaz vložit někam do obsahu vašeho dokumentu (například před první použití jeho funkcí).
Balíček stačí naimportovat pouze jednou. Pokud chcete naimportovat další funkce, jednodušše je přidejte oddělené čárkou za příkaz import.
= Přílohy
Na konec souboru je také možné přidat seznam příloh.
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 {{tou}}).
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.]),
attach_pdf("Vložení PDF přílohy přímo do práce", "template/example_appendix.pdf"),
attach_file_reference("Reference na externí soubor", "example-file-appendix.zip"),
)

620
theses/content_en.typ Normal file
View File

@@ -0,0 +1,620 @@
#import "../template/template.typ": *
#show: tultemplate2
= Introduction to this template
This template should serve as an example {{what}} written with the help of the tool *Typst* 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 language 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
You have probably downloaded this template from the generator on the website https://tulsablona.zumepro.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.
That's why in this document you'll 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.
#rect[
*TIP*:
Save this document for later use.
When you'll search for a specific function, you can jump right to it through the table of contents above.
]
== The header and the content
If you look at the document's source (on the right side, if you're in the online editor), you can notice that the source is consisting of two main parts: the header (which can look quite scary on the first look) and the content.
=== Header
The header defines some important information for the document to successfully generate --- for example: the faculty, thesis title, etc.
The information in the header can be either changed manually or by clicking on the content and typing.
More on that right in the next chapter.
=== Content
The content is marginally the actual text of your thesis.
The source of the document, besides the text, also contains some special characters (we call it syntax), which instruct Typst on how you wish to format your thesis.
== Clickable content in the header
When using the official Typst online editor, you can simply click on almost any text on the right half of your screen (the preview PDF), and your cursor will jump directly to that text in the source file.
A small but very practical feature.
#rect[
*TIP*:
Try double-tapping the content of the abstract (or the thesis title for projects and term papers --- when you don't have the title pages from STAG) and then start typing.
]
== Template compile-time checks
This template is created in such a way that when you try to compile it with incorrect syntax or an imoportant part of the header missing, it won't let you.
Always see the error messages the template provides, as they will simply guide you to fix your mistakes.
You can try this by deleting something from the header, or by using e.g. a function that ins't defined anywhere.
If you generated the header from the generator -- you should have no problem with it.
The generator is configured to only generate valid headers.
= Basic content formatting
Formatting (typesetting) text in Typst is very easy in the majority of cases.
In this chapter we'll show you some basics that you'll use all the time.
== 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 they use long lines full of text,
or
if
they
prefer
a
cleaner
formatting
and manage 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.
== Headings
The first important feature, apart from writing the text itself (which requires no black magic), is the usage of headings.
Just like in other programs, Typst also supports multi-level headings. For a first-level heading, an equals sign followed by a space is used at the beginning of a line, meaning that in a Typst source file it is written like this:
```typst
= My first level heading
```
For a second-level heading, we then use two equals signs; for a third-level heading, three equals signs...
However, the *tultemplate2* template will not allow a heading of fourth or deeper level, because such a heading would violate TUL's guidelines for writing reports.
But don't worry --- if you try to use fourth-level or deeper heading, the template will warn you not to do that and will refuse to compile until you fix this. More on this behavior later.
```typst
= Heading
== Subheading
=== Subsubheading
And then your content
```
== Chapter Numbering
You've probably noticed that each heading begins with the number of its respective chapter in the output. Typst handles this numbering automatically, and it's also reflected in the *Contents* section at the start of the document, so you don't have to worry about it yourself.
#rect[
*TIP*:
As a test, try to write a heading with level four.
At least you'll familiarize yourself with the way that this template gives you errors through Typst.
If you'll find yourself in a different file after double-tapping the error --- just simply return to this file through the file menu.
]
== Text Highlighting
The syntax for basic highlighting is very similar to Markdown. You just need to use the following symbols:
```typst
*bold*
_italic_
#highlight[highlighted]
```
More styling options can be applied through functions, for example:
```typst
#strike[struck through]
```
For completeness and demonstration, here in the text we have *bold text*, _italic text_, #strike[struck-through text],
and #highlight[text highlighted with your faculty's color].
It's also possible to typeset #underline[underlined text] (although typographers generally advise against using underlining).
== Breaking lines
Did Typst break your line and you don't like it? Let's solve it.
=== Forced linebreak
If you want to break a line somewhere precisely, you can just append the character "`\`" at the end of the line.
Like so:
```typst
*Alice*: How to write a good thesis? \
*Bob*: Using Typst!
```
In the example above the question mark will be the last symbol on the first line --- Typst won't merge the lines here.
=== Unbreakable space
You may have heard this term before.
Perhaps you wish to write some name that shouldn't have a linebreak in it, you can use the symbol "`~`".
```typst
Yes, I go to the Technical University of~Liberec.
```
Above, Typst will never break the line between the word "of" and the word "Liberec".
The tilde symbol won't appear in the output file --- there will be a space instead.
== How to write a special character
Some characters like `_`, `*`, `~`, ... are special (as you know by now).
But what if you want to write them... like really write them (in your thesis).
All you need to do is to prepend a backslash before the character and it becomes a normal character.
```typst
You can write underscore like so: \_
```
You can write underscore like so: \_
Do you want to write a backslash itself?
Can you guess how to do it? ... You prepend a backslash before it.
```typst
Like so: \\
```
Like so: \\
== Dashes
You may have heard that if you write a dash on a keyboard --- it's really a hyphen.
How to actually write a dash then?
```typst
-- // En dash
--- // Em dash
```
#highlight[
To join logical groups in English, we strictly use the em dash --- so "---".
]
#rect[
*TIP*:
Try copy-pasting symbols to #link("https://apps.timwhitlock.info/unicode/inspect")[Unicode Inspector] --- it will show you the details of a symbol.
]
== Links<links>
You can create links to URLs/URIs, emails, phone numbers, and more.
A URL (URI) link can be written directly, without calling any function --- just type it in:
https://git.zumepro.cz/tul/tultemplate2
```typst
https://git.zumepro.cz/tul/tultemplate2
```
Internally, this automatically calls the `link` function.
If we want to link to less common things (like email addresses), we can call the `link` function explicitly:
```typst
#link("mailto:info@tul.cz")[Email of TUL informations]
```
First, you pass the link target (perhaps a URL address) in parentheses to the link function and then you follow up with the content that will be displayed in the document enclosed in brackets.
You can find other prefixes (URI schemes) on Wikipedia:
https://en.wikipedia.org/wiki/List_of_URI_schemes.
== Citations
The template supports citation management using a standard BibLaTeX file @bibtex, just like LaTeX.
Almost every website or program that supports citations can generate BibLaTeX-formatted entries --- we recommend using either #link("https://www.zotero.org/")[Zotero] or #link("https://www.citacepro.com/")[Citace.com].
You simply add the code for such a citation, in the proper format, to the file _citations.bib_.
Once added, you can reference it using `@citation_name` or `#cite(<citation_name>)`.
For example, I can reference the Typst citation as #cite(<typst>).
The format of the _citations.bib_ file is exactly the same as in LaTeX.
You can even copy entries directly from sites like in BibLaTeX format --- Typst understands that format, too.
If you open a `.bib` file, you'll see that it's simply a plain text file with a specific structure.
The provided sample file already contains several citations --- for instance, the one named `typst`, which was already used above.
You can change the file from which citations are loaded using a template argument (i.e., in the structure at the beginning of your Typst document):
```typst
#show: tultemplate2.with(
...
citations: "anotherfile.bib",
...
)
```
== Internal Links and Anchors<example_anchor>
Let's continue from the *Links* section (@links).
You can also create internal links --- for instance, to chapters, pages, or labeled images (those wrapped with the `figure` function).
```typst
= A Good Chapter<good_chapter>
Let's take a look at A Good Chapter (@good_chapter).
```
Here's what an anchor looks like:
```typst
<anchor_name>
```
You place the anchor on a listed item (after a heading or an image for example), and you can reference it the same way you reference citations:
```typst
@anchor_name
```
We can take a look at this illustrative reference (@example_anchor).
== Abbreviations
The LaTeX TUL template includes a list of abbreviations at the beginning of the document --- therefore, we've included one here as well.
This list is configured to appear only if there is *at least one* abbreviation defined --- which seemed quite logical.
You can create (define) the abbreviation #abbr("ABC", "Alphabet") in a text like this:
```typst
The shortcut #abbr("ABC", "Alphabet") is a shortcut for the alphabet of letters.
```
After that, you'll you the abbreviation #abbr("ABC") directly without redefining it:
```typst
The first letter of #abbr("ABC") is the letter "A".
```
The template automatically ensures the following:
- The abbreviation appears in the list of abbreviations
- When you use an abbreviation for the first time, the template requires you to define it
- The abbreviation is only defined once (the first time) or the template will scream in red at you
When used for the first time (definition), the abbreviation will look like this: #abbr("ABR", "Abbreviation")
In subsequent uses, it will appear as: #abbr("ABR")
#highlight[
In other words, you do _not_ add abbreviations directly to the abbreviation list.
You simply use them elegantly within the text itself.
]
= Specific usage
In this chapter you'll find some specific concepts.
You can find things that you might not need at all.
If nothing of this chapter interests you, go right ahead and skip it --- we won't be angry.
== Equations, formulas and maths
If your thesis will contain some mathematical notation, this chapter is for you.
In this chapter we'll cover some basics --- if the basics in this document won't be enough for you, we recommend checking out the Typst documentation: https://typst.app/docs/reference/math/
=== Math mode
The math mode has a special syntax for typesetting mathematics.
In the math mode, the template will use a different font --- a font suitable for typing numbers and special mathematical symbols.
If you want to enter the math mode, surround the content with the dollar sign "`$`".
```typst
$1 + 1 = 42$
```
Shown as: $1 + 1 = 42$
As you can see, in the math mode you use a pretty understandable syntax.
Let's get to some specific expressiosn now.
=== Addition
Addition can be written using the "`+`" sign.
```typst
$1 + 2 = 3$
```
Shown as: $1 + 2 = 3$
=== Subtraction
Subtraction can be written using the "`-`" symbol.
```typst
$3 - 2 = 1$
```
Shown as: $3 - 2 = 1$
=== Multiplication<multiplication>
Multiplication can be written using the command "`dot`". It's an equivalent of the LaTeX command "`cdot`".
#highlight[Contrary to LaTeX, you don't add the backslash "`\`" to call a command in the math mode.]
```typst
$2 dot 3 = 6$
```
Shown as: $2 dot 3 = 6$
=== Division
Division can be written using the "`/`" symbol.
```typst
$1 / 2 = 0.5$
```
Shown as: $1 / 2 = 0.5$
If you want to put an expression in the fraction, and not just a number, wrap the numerator / denominator in parentheses.
```typst
$(1 + 1) / (4 - 2) = 2 / 2 = 1$
```
Shown as: $(1 + 1) / (4 - 2) = 2 / 2 = 1$
=== Text
As you can see in Multiplication (@multiplication), if we write a word in the math mode, Typst will interpret it as a command.
If you want to write real text, shown in the document, instead, we must surround the text with double-quotes.
```typst
$69 "cm"$
```
Shown as: $69 "cm"$
= Using Functions
Most Typst features are used through what's called function calls.
This is quite similar to the previous examples, except that instead of wrapping text with a single symbol or a simple marker, we wrap it with the name of the function.
The syntax looks like this:
```typst
#function_name[text itself or other parameters]
```
When you type the hashtag symbol in the editor, it will automatically start suggesting all available functions and their descriptions.
Let's move on to some practical examples.
== Images
Images can be inserted either by themselves or with a caption.
An image is inserted using the `image` function:
To add a caption and also include the image in the index (so you can reference it later), use the `figure` function:
#block([
```typst
#figure(
image("myimage.jpg"),
caption: [
*A beautiful* picture that looks like a picture.
]
)
```
], breakable: false)
Here's a practical example of inserting an image with a caption:
#figure(image("../template/assets/tul_logo.svg", width: 25%), caption: [
Logo of *TUL*
])
The first parameter of the function is the displayed content --- in our case, the mentioned `image`.
You can then specify various parameters for it; in the example above (where we display the TUL logomark), we define the image width as a percentage --- a percentage of the page's width.
The last parameter is `caption`, which lets us set the figure's (or image's) caption text.
If the document type requires it, images will automatically appear in a list at the beginning of the document.
Typst handles this automatically for you --- all you need to do is add images wherever appropriate, and they'll show up correctly in the *List of images*, complete with references and page numbers.
Images are also numbered automatically according to the predefined style, similar to chapters.
== Tables
Tables can be created like this:
```typst
#figure(table(
columns: 3,
table.header([], [*Column 1*], [*Column 2*]),
[*Row 1*], [a], [b],
[*Row 2*], [c], [d],
), caption: "My beautiful table")
```
The `columns` parameter specifies the number of columns in the table.
Then comes any number of table cells --- for clarity, the rows are separated in the example.
Finally, there's again a `caption` parameter, used to provide a caption for the table.
#highlight[It's a good idea to wrap the table header (the first row) in the `header` function (as shown above)] --- this ensures Typst includes extra metadata in the generated PDF (for example, for people with visual impairments).
#figure(table(
columns: 3,
table.header([], [*Column 1*], [*Column 2*]),
[*Row 1*], [a], [b],
[*Row 2*], [c], [d],
), caption: "My beautiful table")
Tables also appear at the beginning of the document in a list (if required by the document type).
As you've probably noticed by now, this template takes care of this automatically too.
= Advanced content formatting
Now we'll look into some uncommon (but still useful) ways of content formatting.
== Special symbols in text
Thanks to Typst, you can quit copy-pasting symbols from the internet.
Typst has a function for special symbols --- function "`sym`".
In the online editor, you can just type "`#sym.`" and the editor will start autocompleting a load of symbols.
The symbol #sym.pi (pi), for example, can be written as so:
```typst
#sym.pi
```
You can find more symbols in the Typst reference documentation: https://typst.app/docs/reference/symbols/sym/
== Superscript / subscript
You may wish to write a smaller text aligned to the top of the line or to the bottom of the line.
=== Superscript
Super#super[script] can be written as:
```typst
Super#super[script]
```
=== Subscript
Sub#sub[script] can be written as:
```typst
Sub#sub[script]
```
== You want more?
In this document you'll find all the stuff that you will, in the majority of cases, need to write your thesis.
However, if you want to know _even more_, we recommend checking out the documentation on how to format content from the Typst developers.
https://typst.app/docs/reference/text/
= Packages
You want some function but you couldn't find it in this document nor in the Typst documentation?
No problem. Chances are, there is a package for it.
Similarly to LaTeX, Typst has a broad range of packages with additional functions.
You can download and use those packages with the very simple "`import`" command.
_After_ the import you can directly use the imported functions from the package.
== Package example
If I wish to download the package "`alchemist`" (for drawing chemical structures) for example, I will use the following import:
```typst
#import "@preview/alchemist:0.1.8": skeletize, fragment, branch, double, single
```
The text string (text in the double-quotes) is the package name and it's version --- you can find the name and the version in the package list in @package_list.
After the colon are the functions which you wish to import (comma-separated).
If you wish to import everything from the package, use an asterisk:
```typst
#import "@preview/alchemist:0.1.8": *
```
Example usage of the alchemist package (look at the document source):
// ___ Example with the Alchemist package ___
#import "@preview/alchemist:0.1.8": skeletize, fragment, branch, double, single
#skeletize({ // the command to render the chemical structure
fragment(name: "S", "S") // sulfur in the middle
// oxygens
branch({
double(angle: 3, atom-sep: 1.422) // double bond
fragment(name: "O1", "O") // oxygen (name must be unique --- hence the one)
})
branch({
double(angle: 1, atom-sep: 1.422)
fragment(name: "O2", "O")
})
branch({
single(angle: -1, atom-sep: 1.574) // simple bond
fragment(name: "O3", "O")
branch({
single(angle: 1, atom-sep: .97)
fragment(name: "H1", "H") // hydrogen
})
})
branch({
single(angle: -3, atom-sep: 1.574)
fragment(name: "O4", "O")
branch({
single(angle: -2, atom-sep: .97)
fragment(name: "H2", "H")
})
})
})
// __ Example end ___
== Package list<package_list>
There is a load of packages and we can't show all of them in this document.
But you can pick one and go try it.
We recommend searching for packages through the Typst Universe.
The package list in Typst Universe is available at: https://typst.app/universe/search/?kind=packages
If you pick some package from this list, open it in the listing and will wish to import it --- just use the copy button in the section "How to add" and paste the command in your document (before the first usage of it's functions for example).
You need to import the package just once. If you'll want to import more functions, just add them after the import comma-separated.
= Attachments
At the end of the file, you can add the list of attachments.
Currently, we support four types of attachments: links, content, PDF file attached at the end of the document and a reference to an external file (perhaps attached to the system with your {{what}}).
As a demonstration, there's a practical example included right after this paragraph in the source code, which generates the attachments for this document.
#attachments(
attach_link("Source code of this template", "https://git.zumepro.cz/tul/tultemplate2"),
attach_content("Test content generated by Typst", [Here you can write _styled_ content.]),
attach_pdf("Insert a PDF file directly into the thesis", "template/example_appendix.pdf"),
attach_file_reference("Reference to an external file", "example-file-appendix.zip"),
)

View File

@@ -5,305 +5,52 @@
faculty: "fm",
lang: "cs",
document: "dp",
title_pages: "dp_cs_assignment.pdf",
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",
assignment: (
personal_number: [A00000007],
department: [Ústav šablon],
academical_year: [2025/2026],
content: [
= Zásady pro vypracování:
+ Seznamte se s možnostmi šablon
+ Navrhněte několik možných stylů šablon
+ Seznamte se s nástrojem Typst
+ Implementujte šablonu
+ Zkonzultujte šablonu
+ Opravte spoustu věcí
+ Zkonzultujte šablonu
+ Opravte spoustu věcí
+ Zkonzultujte šablonu
+ Snad nebude nic potřeba opravit
= Seznam odborné literatury:
_Přísně tajné_
],
),
author: "Matěj Žucha",
title: (
cs: [Ukázka dokumentu typu Diplomová práce pro FM TUL v češtině],
en: [Example document for a Diploma thesis for FM TUL in Czech],
),
author: [Matěj Žucha],
author_pronouns: "masculine",
programme: (cs: [MI6000000007 Přísně tajné]),
specialization: (cs: [Vytváření šablon]),
supervisor: [Ondřej Mekina],
abstract: (
cs: [
Tento dokument slouží jako praktická ukázka všech důležitcýh funkcí šablony _tultemplate2_,
Tento dokument slouží jako praktická ukázka všech důležitých 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"),
cs: [Ukázka, Klíčových, Slov, Česky],
en: [Example, Keywords, In, English],
),
acknowledgement: (cs: "Lorem ipsum dolor sit amet."),
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
#strike[přeškrtnuto]
#highlight[zvýrazněno]
#underline[podtrženo] // podtržení by se NEMĚLO používat
```
Pro úplnost a ukázku je zde přímo v textu *tučný text*, _text kurzívou_, #strike[přeškrtnutý text], #highlight[text zvýrazněný podle barvy příslušící vaší fakultě] a #underline[podtržený text] (ačkoli typografové doporučují podtržení nepoužívat).
== 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.]),
)
Diplomová práce
diplomovou prací

View File

@@ -0,0 +1,55 @@
#import "../template/template.typ": *
#show: tultemplate2.with(
style: "classic",
faculty: "fm",
lang: "en",
document: "dp",
assignment: (
personal_number: [A00000007],
department: [Department of templates],
academical_year: [2025/2026],
content: [
= Principles for drafting:
+ Familiarize yourself with available templates
+ Design several possible template styles
+ Learn to use Typst
+ Implement the template
+ Review the template
+ Fix many issues
+ Review the template
+ Fix many issues
+ Review the template
+ Hopefully nothing more needs fixing
= List of professional literature:
_Top secret_
],
),
title: (
cs: [Ukázka dokumentu typu Diplomová práce pro FM TUL v angličtině],
en: [Example document for a Diploma thesis for FM TUL in English],
),
author: [Matěj Žucha],
author_pronouns: "me",
programme: (en: [MI6000000007 Top secret]),
specialization: (en: [Creation of templates]),
supervisor: [Ondřej Mekina],
abstract: (
cs: [
Tento dokument slouží jako praktická ukázka všech důležitých 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: (en: [Lorem ipsum dolor sit amet.]),
citations: "citations.bib",
)
Diploma thesis

View File

@@ -0,0 +1,18 @@
#let color = red.lighten(50%)
#set align(center + horizon)
#set text(font: "Inter", 2em, color)
#set page(foreground: rect(
width: 90%,
height: 90%,
stroke: (paint: color, thickness: .03em, dash: (.5em, .5em)),
place(center + bottom, context {
text(str(counter(page).get().at(0)) + "/" + str(counter(page).final().at(0)), 15pt)
v(1em)
}),
))
Toto je ukázkový PDF dokument přiložený k práci jako příloha.
#pagebreak()
This is a sample PDF document attached to the thesis as an appendix.

View File

@@ -0,0 +1,48 @@
#import "../template/template.typ": *
#show: tultemplate2.with(
style: "classic",
faculty: "fm",
lang: "cs",
document: "presentation",
author: [Ondřej Mekina],
title: (
cs: [Ukázka prezentace v šabloně tultemplate2],
),
presentation: (
append_thanks: true,
wide: false,
first_heading_is_fullpage: true,
),
citations: "citations.bib",
)
= Úvod
== Jak použít prezentaci
- tato šablona slouží jako ukázka použití Typst TUL šablony k tvorbě prezentace
- můžete zde používat všechny funkcionality Typstu, stejně jako u ostatních dokumentů
- slajdy fungují podobně jako v Latexu - každý nadpis je nový slajd
- v případě použití _first_heading_is_fullpage_ neplatí - viz dále
- možno používat i nadpisy druhé úrovně
= Možnosti šablony
== Argumenty funkce šablony
- _append_thanks_: Jestli na závěr přidat slajd s poděkováním
- _wide_: Použití formátu 16:9 místo 4:3 na všechny slajdy
- _first_heading_is_fullpage_: V případě použití vloží každý nadpis 1. úrovně na samostatný slajd, takže logicky rozčlení prezentaci
- zároveň tvoří nový slajd pro každý nadpis 2. úrovně
== Struktura
- prezentace začíná titulní stranou - nastaveno pomocí generátoru
- na začátku není automaticky generovaný obsah - uživatel ho může snadno vytvořit pomocí odrážek či číslovaného seznamu
- po samotném obsahu přichází slajd s citacemi - automaticky generováno
- volitelně poděkování
== Použití citací
- tady jsou citace: Citace 1 @typst a citace 2 @bibtex

View File

@@ -5,18 +5,38 @@
faculty: "fm",
lang: "cs",
document: "prj",
title: (
cs: "Ukázka dokumentu typu Projekt pro FM TUL v češtině",
en: "Example document of type Project for FM TUL in Czech",
assignment: (
personal_number: [A00000007],
department: [Ústav šablon],
academical_year: [2025/2026],
content: [
= Zásady pro vypracování:
+ Seznamte se s možnostmi šablon
+ Navrhněte několik možných stylů šablon
+ Seznamte se s nástrojem Typst
+ Implementujte šablonu
+ Zkonzultujte šablonu
+ Opravte spoustu věcí
+ Zkonzultujte šablonu
+ Opravte spoustu věcí
+ Zkonzultujte šablonu
+ Snad nebude nic potřeba opravit
= Seznam odborné literatury:
_Přísně tajné_
],
),
author: "Matěj Žucha",
title: (
cs: [Ukázka dokumentu typu Projekt pro FM TUL v češtině],
en: [Example document for a Project report for FM TUL in Czech],
),
author: [Matěj Žucha],
author_pronouns: "masculine",
programme: (cs: "MI6000000007 Přísně tajné"),
specialization: (cs: "Vytváření šablon"),
supervisor: "Ondřej Mekina",
programme: (cs: [MI6000000007 Přísně tajné]),
specialization: (cs: [Vytváření šablon]),
supervisor: [Ondřej Mekina],
abstract: (
cs: [
Tento dokument slouží jako praktická ukázka všech důležitcýh funkcí šablony _tultemplate2_,
Tento dokument slouží jako praktická ukázka všech důležitých funkcí šablony _tultemplate2_,
s názornými příklady použítí a jejich podrobným popisem.
],
en: [
@@ -25,9 +45,12 @@
],
),
keywords: (
cs: ("Ukázka", "Klíčových", "Slov", "Česky"),
en: ("Example", "Keywords", "In", "English"),
cs: [Ukázka, Klíčových, Slov, Česky],
en: [Example, Keywords, In, English],
),
acknowledgement: (cs: "Lorem ipsum dolor sit amet."),
acknowledgement: (cs: [Lorem ipsum dolor sit amet.]),
citations: "citations.bib",
)
Ročníkový projekt
ročníkovým projektem

View File

@@ -0,0 +1,55 @@
#import "../template/template.typ": *
#show: tultemplate2.with(
style: "classic",
faculty: "fm",
lang: "en",
document: "prj",
assignment: (
personal_number: [A00000007],
department: [Department of templates],
academical_year: [2025/2026],
content: [
= Principles for drafting:
+ Familiarize yourself with available templates
+ Design several possible template styles
+ Learn to use Typst
+ Implement the template
+ Review the template
+ Fix many issues
+ Review the template
+ Fix many issues
+ Review the template
+ Hopefully nothing more needs fixing
= List of professional literature:
_Top secret_
],
),
title: (
cs: [Ukázka dokumentu typu Projekt pro FM TUL v angličtině],
en: [Example document for a Project report for FM TUL in English],
),
author: [Matěj Žucha],
author_pronouns: "me",
programme: (en: [MI6000000007 Top secret]),
specialization: (en: [Creation of templates]),
supervisor: [Ondřej Mekina],
abstract: (
cs: [
Tento dokument slouží jako praktická ukázka všech důležitých 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: (en: [Lorem ipsum dolor sit amet.]),
citations: "citations.bib",
)
Project

View File

@@ -0,0 +1,40 @@
#import "../template/template.typ": *
#show: tultemplate2.with(
style: "classic",
faculty: "fm",
lang: "cs",
document: "sp",
assignment: (
personal_number: [A00000007],
department: [Ústav šablon],
academical_year: [2025/2026],
content: [
= Zásady pro vypracování:
+ Seznamte se s možnostmi šablon
+ Navrhněte několik možných stylů šablon
+ Seznamte se s nástrojem Typst
+ Implementujte šablonu
+ Zkonzultujte šablonu
+ Opravte spoustu věcí
+ Zkonzultujte šablonu
+ Opravte spoustu věcí
+ Zkonzultujte šablonu
+ Snad nebude nic potřeba opravit
= Seznam odborné literatury:
_Přísně tajné_
],
),
title: (
cs: [Ukázka dokumentu typu Semestrální práce pro FM TUL v češtině],
en: [Example document for a Term paper for FM TUL in Czech],
),
author: [Matěj Žucha],
author_pronouns: "masculine",
programme: (cs: [MI6000000007 Přísně tajné]),
specialization: (cs: [Vytváření šablon]),
citations: "citations.bib",
)
Semestrální práce
vaší semestrální prací

View File

@@ -0,0 +1,39 @@
#import "../template/template.typ": *
#show: tultemplate2.with(
style: "classic",
faculty: "fm",
lang: "en",
document: "sp",
assignment: (
personal_number: [A00000007],
department: [Department of templates],
academical_year: [2025/2026],
content: [
= Principles for drafting:
+ Familiarize yourself with available templates
+ Design several possible template styles
+ Learn to use Typst
+ Implement the template
+ Review the template
+ Fix many issues
+ Review the template
+ Fix many issues
+ Review the template
+ Hopefully nothing more needs fixing
= List of professional literature:
_Top secret_
],
),
title: (
cs: [Ukázka dokumentu typu Semestrální práce pro FM TUL v češtině],
en: [Example document for a Term paper for FM TUL in Czech],
),
author: [Matěj Žucha],
author_pronouns: "me",
programme: (en: [MI6000000007 Top secret]),
specialization: (en: [Creation of templates]),
citations: "citations.bib",
)
Term paper

45
theses/title_pages.typ Normal file
View File

@@ -0,0 +1,45 @@
#let color = red
#set text(font: "Inter")
#set page(foreground: rect(
width: 90%,
height: 90%,
stroke: (paint: color, thickness: .03em, dash: (.5em, .5em))
))
#set text(lang: "cs")
#align(center + horizon, text([
*Nahraďte soubor "`title-pages.pdf`"* souborem se zadáním vygenerovaným *ze~STAGu*.
], color, 2em))
#text([
To můžete v online Typst editoru udělat takto:
+ *Počkejte až budete mít oficiálně schválené zadání práce.*
+ Soubor s titulními stranami se vám pak ukáže ve STAGu -- stáhněte soubor ze STAGu.
+ Přejmenujte ho na "`title-pages.pdf`".
+ Otevřete v online Typst editoru prohlížeč souborů.
+ Přetáhněte svůj přejmenovaný soubor do prohlížeče souborů.
+ Pokud jste vše udělali správně, vyskočí vám okno, které se vás ptá, jestli chcete soubor přepsat -- klikněte na přepsat (v angličtině overwrite).
Oficiálně *není doporučeno soubor vytvářet manuálně*, ale opravdu ho stáhnout ho ze STAGu.
Soubor ze STAGu navíc obsahuje důležitá metadata.
], black, 11pt)
#pagebreak()
#set text(lang: "en")
#align(center + horizon, text([
*Replace file "`title-pages.pdf`"* with the title pages document with assignment genenerated *from~STAG*.
], color, 2em))
#text([
In the online Typst editor you can do it as follows:
+ *Wait until you have your assignment officially approved.*
+ The file with the title pages will then appear in STAG for you --- download the file from STAG.
+ Rename it to "`title-pages.pdf`".
+ Open the file browser in the online Typst editor.
+ Drag and drop your renamed file into the file browser.
+ If you did everything correctly, a window will popup, asking you if you want to overwrite the file --- click on overwrite.
Officially, it is *not recommended to create the file manually*, but, indeed, download it from STAG.
The file from STAG also includes some important metadata.
], black, 11pt)