Skip to content

Commit 4f8d973

Browse files
committed
allerlei kleine Anpassungen und eine neue, dynamische Tabelle. Die meisten harten pagebreaks erstmal wieder entfernt (Layout später).
1 parent 7f85730 commit 4f8d973

File tree

4 files changed

+93
-40
lines changed

4 files changed

+93
-40
lines changed

CHANGELOG.md

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,18 @@
22

33
Releases sind momentan sehr willkürlich und können immer mal _zwischendurch_ stattfinden.
44

5+
## [v0.6.1] – 2026-01-11
6+
### Added
7+
- Weitere dynamisch erzeugte Tabelle (i/Spalte/Zeile)
8+
9+
### Changed
10+
- Allerlei kleinere, textuelle Optimierungen
11+
- Farbe der Zitat-Blöcke geändert
12+
- Zahlreiche harte pagebreaks entfernt; Layout macht erst später Sinn
13+
14+
### Fixed
15+
- Die Regel für das Setzen der Vor- und Nach-Abstände bei Überschriften anhand [dieses Learnings](https://www.reddit.com/r/typst/comments/1q8gbyc/comment/nys4qer/) in `_lib.typ` korrigiert
16+
517
## [v0.6.0] – 2026-01-01
618
### Added
719
- Collatz Bäume Funktion (mit Hilfe von Claude) und Text
@@ -81,4 +93,5 @@ Releases sind momentan sehr willkürlich und können immer mal _zwischendurch_ s
8193
[v0.3.0]: https://github.com/metawops/typst/compare/v0.2.1...v0.3.0
8294
[v0.4.0]: https://github.com/metawops/typst/compare/v0.3.0...v0.4.0
8395
[v0.5.0]: https://github.com/metawops/typst/compare/v0.4.0...v0.5.0
84-
[v0.6.0]: https://github.com/metawops/typst/compare/v0.5.0...v0.6.0
96+
[v0.6.0]: https://github.com/metawops/typst/compare/v0.5.0...v0.6.0
97+
[v0.6.1]: https://github.com/metawops/typst/compare/v0.6.0...v0.6.1

Erste-Schritte-in-Typst.typ

Lines changed: 63 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,15 @@
1414
// alle Setups für unser Dokument enthält:
1515

1616
#let raw-changelog = read("CHANGELOG.md")
17+
18+
// Die folgende regex holt sich aus der CHANGELOG.md Datei aus dem ersten
19+
// Vorkommen einer Versionsnummer, die mit [v beginnt, eben diese Versions-
20+
// nummer heraus. Die Versionsnummer entspricht dem Schema a.b.c und bis
21+
// inkl. c, aber ohne die eckigen Klammern wird gematcht.
1722
#let version-pattern = regex("(?m)^##\s+\[?v?([\d\.]+)\]?")
23+
1824
#let match = raw-changelog.match(version-pattern)
25+
1926
#let doc-version = if match != none {
2027
match.captures.first()
2128
} else {
@@ -28,7 +35,7 @@
2835
description: [Ein kleines Beispiel-Dokument, was die Nutzung von Typst demonstrieren soll.],
2936
location: "Bonn, Germany",
3037
keywords: ("Typst", "Demonstration", "Sample", "Beispiel"),
31-
date: datetime(year: 2026, month: 1, day: 1),
38+
date: datetime(year: 2026, month: 1, day: 11),
3239
version: doc-version,
3340
bib-path: "literatur.bib",
3441
abstract: [Typst ist ein Satzsystem, mit dem man vor allem PDF Dokumente sehr ordentlich setzen kann. Man kann Typst im einfachsten Fall ähnlich wie Markdown benutzen. Es bietet aber weit mehr Möglichkeiten und man kann extrem komplexe Dokumente damit schreiben. Von der Hausarbeit über die Masterarbeit bis zum Buch. Dabei kann es analog zu LaTeX den wissenschaftlichen Satz inklusive mathematischer Formeln perfekt abbilden und ist darüber hinaus über 3rd party Pakete erweiterbar. Typst ist sogar eine Programmiersprache und so kann man zum Beispiel Grafiken algorithmisch direkt innerhalb des Dokuments erstellen.
@@ -114,7 +121,7 @@ Bevor wir jetzt schnell direkt im Dokument einige Einstellungen machen, sei auf
114121
== Kenngrößen auslagern
115122
Bei sehr kurzen Dokumenten spielt das sicher keine Rolle, aber je größer die Typst Dokumente werden, desto mehr "Setup Daten" wird man haben: Farben, Abstände, Maße, Schriftgrößen etc. Diese kann man zwar alle auch direkt im Dokument hinterlegen – entweder direkt mit den Funktionsaufrufen oder als Variablen zusammengefasst an einer Stelle und diese dann in den Funktionsaufrufen. Aber die Erfahrung zeigt, dass das Herausziehen und an einer Stelle Zusammenfassen derlei Daten sinnvoll ist.
116123

117-
Auch ist zu empfehlen, dass alle selbst geschriebenen Funktionen aus der Haupt-Text-Datei herausgenommen und in eine andere `.typ` Datei ausgelagert werden.
124+
Auch ist zu empfehlen, dass alle (oder zumindest die meisten) selbst geschriebenen Funktionen aus der Haupt-Text-Datei herausgenommen und in eine andere `.typ` Datei ausgelagert werden.
118125

119126
Ziel ist es, am Ende in seiner Haupt-Text-Datei nur oben einmal einen Import einer weiteren `.typ` Datei zu haben. Zum Beispiel beginnt _dieses_ Dokument, was Du gerade liest, so:
120127
```typ
@@ -132,8 +139,7 @@ Und in dieser Datei `_lib.typ` stecken allerlei Funktionen, set-Regeln, show-Reg
132139
date: datetime(year: 2025, month: 12, day: 22),
133140
version: "0.2.251222",
134141
bib-path: "literatur.bib",
135-
abstract: [Typst ist ein Satzsystem, mit dem man ... zum Beispiel VSCode mit der Erweiterung "Tinymist Typst" benutzen.
136-
]
142+
abstract: [Typst ist ein Satzsystem, mit dem man ... zum Beispiel VSCode mit der Erweiterung "Tinymist Typst" benutzen.]
137143
)
138144
```
139145
Die in der `_lib.typ` definierte Funktion `project()` bekommt also allerlei Parameter als Input, führt alle Setups durch (Seitenformat einstellen, Schriftart einstellen, Abstände einstellen, Fußzeile definieren, Metadaten setzen, Literaturverzeichnis anhängen etc.), bekommt dann als letztes Argument noch all das, was hier im Haupt-Dokument nach ihrem Aufruf folgt (also quasi den gesamten Inhalt) und erzeugt als Output dann das gesamte, finale Dokument mit all seinen Einstellungen.
@@ -152,7 +158,7 @@ Damit erscheint aber der Titel noch nicht im PDF Dokument. Um den Titel auch _au
152158
```
153159
Das gibt den zuvor gesetzten Titel aus.
154160

155-
Man kann aber unterscheiden zwischen den #nameref(<metadata>) eines Dokuments – die man nämlich über die `#set document` Regel setzt und die lediglich ins PDF eingebettet werden – und dem im PDF sichtbaren Titel.
161+
Man kann aber unterscheiden zwischen den #nameref(<metadata>) eines Dokuments – die man nämlich über die `#set document` Regel setzt und die lediglich ins PDF eingebettet werden – und dem im PDF _sichtbaren_ Titel.
156162
Will man einen anderen Titel im Dokument haben, als in den #nameref(<metadata>), dann gibt man einfach einen anderen Titel aus:
157163
```typ
158164
// Die Titel-Eigenschaft des Dokuments festlegen:
@@ -169,7 +175,7 @@ Will man einen anderen Titel im Dokument haben, als in den #nameref(<metadata>),
169175
`#title[Mein Titel]` ist also eine Kurzschreibweise für `#title([Mein Titel])`.
170176
]
171177

172-
Einen Hinweis zur Verwendung des \# Zeichens gibt es in @hash-character.
178+
Einen Hinweis zur Verwendung des \#-Zeichens gibt es in @hash-character.
173179

174180
== Zusammenfassung
175181
Die Zusammenfassung (oder auch der _Abstract_) taucht oft bei wissenschaftlichen Arbeiten unter dem Titel und den Autoren auf, so wie auch in diesem Dokument.
@@ -189,7 +195,9 @@ if #abstract != none {
189195
}
190196
```
191197
]
192-
Ich habe manuell ein paar \# Zeichen eingefügt, damit das Syntax Highlighting besser funktioniert. In der `_lib.typ` steht es also nicht genau 1:1 so wie hier, denn dort ist es Teil eines _code blocks_ und das `#abstract` direkt zu Beginn nach dem `if` meint den an die `project()` Funktion übergebenen Parameter mit diesem Namen.
198+
Ich habe manuell ein paar \# Zeichen eingefügt, damit das Syntax Highlighting besser funktioniert. In der `_lib.typ` steht es nicht genau 1:1 so wie hier, denn dort ist es Teil eines _code blocks_ und das `#abstract` direkt zu Beginn nach dem `if` meint den an die `project()` Funktion übergebenen Parameter mit diesem Namen.
199+
200+
Warum hinter dem Parameter `x` der `pad()` Funktion keine konkrete Zahl steht, sondern `config.distances.abstract-pad-x`, dazu steht im @config mehr. #emoji.face.wink
193201

194202
== PDF Metadaten <metadata>
195203
Über PDF Metadaten haben wir schon etwas im @dokument-titel ("#nameref(<dokument-titel>)") gelernt. Um also ins PDF Metadaten einzubetten, geht man so vor:
@@ -239,7 +247,7 @@ Blocksatz ("Justification") stellt man ebenfalls über eine _set rule_ ein. Und
239247
```
240248
Für Paragraphs, also Absätze, gibt es noch allerlei mehr Einstellungen. Auch da sei wieder die gute #link("https://typst.app/docs/reference/model/par/")[Original-Doku] empfohlen. Man kann z.B. das Blocksatzverhalten sehr differenziert feintunen.
241249

242-
== Noch mehr Abstraktion
250+
== Noch mehr Abstraktion <config>
243251
Das Auslagern des Aussehens des Dokuments in die `_lib.typ` ist ja schonmal gut. Aber wenn dann auch diese _Library-_ (oder _Template-_) Datei langsam wächst, wird es immer schwieriger, hin und wieder mal die Abstände, Schriftgrößen und Farben anzupassen. Die stecken halt als konkrete Werte irgendwo verstreut in der Datei.
244252

245253
Das ist dann der Zeitpunkt, all diese Zahlen mit ihren Einheiten auch nochmal auszulagern: in eine Art _Theme-_ oder _Config-_Datei.
@@ -284,7 +292,7 @@ Das mag zunächst umständlich aussehen, ist aber schnell praktisch, weil man da
284292

285293
Dass diese Zusatzdateien übrigens alle mit einem `_` Zeichen beginnen, das hat mit den automatischen Build- und Release-Workflows zu tun, die ich für #link("https://github.com/metawops/typst")[mein GitHub Repository] eingerichtet habe. Denn diese Dateien enthalten ja keinen zu setzenden Text, sondern nur Funktionen und Variablen. Da würde also ein leeres PDF Dokument entstehen, wenn man sie mit Typst kompilieren würde. Daher werden alle Dateien, die mit einem `_` beginnen beim Build-Prozess ignoriert.
286294

287-
#pagebreak(weak: true)
295+
// #pagebreak(weak: true)
288296
= Das Zeichen \# in Typst <hash-character>
289297
Wir müssen kurz über das Zeichen \# sprechen.
290298

@@ -322,14 +330,14 @@ So ein Zitat fügt man übrigens über die Funktion `#quote()` ein. Dass es hier
322330
)
323331
```
324332

325-
#pagebreak(weak: true)
333+
// #pagebreak(weak: true)
326334
= Bilder mit `image()` <bilder>
327335
Natürlich kann man in sein Typst Dokument auch Bilder einbetten. Im einfachsten Fall sind es Bilder, die aus Dateien kommen. Aber es geht auch anders, wie @images-raw zeigt.
328336

329337
== Bilddateien
330338
Bilder können im einfachsten Fall über die Funktion `#image()` eingebettet werden. Dabei werden viele Formate unterstützt. Neben den Bitmap-Formaten *PNG*, *JPG*, *GIF*, *WebP* auch das Vektorformat *SVG* und sogar *PDF*. Hier ein auf 50% verkleinertes, eingebettetes JPG Foto des Raspberry Pi _Compute Module 5 (CM5)_:
331339

332-
#image("img/cm5.jpeg", width: 85%)
340+
#image("img/cm5.jpeg", width: 75%)
333341

334342
Die Funktion `#image()` eignet sich für das schnelle Einbetten eines Bildes, hat aber zunächst ein paar Nachteile, allen voran: linksbündig, keine Bildunterschrift.
335343

@@ -419,7 +427,7 @@ Was geht da genau vor?
419427
)
420428
]
421429

422-
#line(length: 100%, stroke: 0.5pt + gray)
430+
//#line(length: 100%, stroke: 0.5pt + gray)
423431

424432
Ein Experiment mit Farbe gefällig? Gern. Wir fangen mit leichter Kost an:
425433
#align(center)[
@@ -448,9 +456,9 @@ Dazu der Code:
448456

449457
Schließlich noch ein blaues Pixel, ihr wisst schon, warum es blau ($0,0,255$) ist.
450458

451-
Aus dem neun Zahlen _Integer_ Array machen wir mit `bytes()` drumherum ein neun Zahlen _Bytes_ Array.
459+
Aus dem Neun-Zahlen-_Integer_-Array machen wir mit `bytes()` drumherum ein Neun-Zahlen-_Bytes_-Array, denn …
452460

453-
/ Zeile 3: Jetzt brauchen wir als `encoding` auch `rgb8`. Und die `width`-Angabe $3$ sorgt für die Organisation / Zusammenfassung von jeweils drei Zahlen zu einem "Pixel".
461+
/ Zeile 3: … jetzt brauchen wir als `encoding` auch `rgb8`, wobei die $8$ darin eben für Bytes steht. Und die `width`-Angabe $3$ sorgt für die Organisation / Zusammenfassung von jeweils drei Zahlen zu einem "Pixel".
454462

455463
Der Rest ist bekannt.
456464

@@ -552,7 +560,7 @@ Unser nächstes Beispiel wird etwas komplexer – und ein wenig mathematischer:
552560
caption: "ggT-modulo-Grafik"
553561
) <ggt-modulo>
554562

555-
Jede Pixelspalte und -zeile steht hier für eine natürliche Zahl, beginnend mit jeweils $1$ in der Ecke links oben. Wenn der $gcd(x,y)$#footnote[#link("https://de.wikipedia.org/wiki/Größter_gemeinsamer_Teiler")[größter gemeinsamer Teiler]] $1$ ist, wird das Pixel dunkelgrau gemalt.
563+
Jede Pixelspalte $x$ und -zeile $y$ steht hier für eine natürliche Zahl, beginnend mit jeweils $1$ in der Ecke links oben. Wenn der $gcd(x,y)=1$ ist, wird das Pixel dunkelgrau gemalt.#footnote[gcd = greatest common devisor = #link("https://de.wikipedia.org/wiki/Größter_gemeinsamer_Teiler")[größter gemeinsamer Teiler] (ggT)]
556564

557565
Ist er das nicht, schauen wir, was bei der Division des ggT durch 2, 3, 5 als Rest rauskommt und färben die Pixel mehr oder weniger rot ($gcd(x,y) mod 2$), grün ($gcd(x,y) mod 3$) oder blau ($gcd(x,y) mod 5$). Die Transparenz der Farben verrechnen wir und achten darauf, dass der finale Transparenzwert nicht größer als 255 wird. Hier ist der Quellcode für das Erzeugen des _raw bytes Arrays_:
558566

@@ -608,25 +616,25 @@ Das Einbauen als Bild ins Dokument erfolgt dann über die schon gelernte `image(
608616
scaling: "pixelated"
609617
),
610618
caption: "ggT-modulo-Grafik"
611-
)
619+
) <ggt-modulo>
612620
```
613621

614622
Und fertig ist die Laube.
615623

616624
Natürlich kann man dies alles auch durch das Zeichnen von Rechtecken in einem Block machen und diese Art der Grafik-Erzeugung sehen wir im @typst-grafik ("#nameref(<typst-grafik>)").
617625

618-
#pagebreak(weak: true)
626+
// #pagebreak(weak: true)
619627
//--------------------
620628

621629
= Abbildungen mit `#figure()` <abbildungen>
622-
Mächtiger als `#image()` ist die Funktion `#figure()`. Mit ihr kann man u.a. das Alignment steuern und auch Bildunterschriften realisieren, wie hier in @abb_hybrid:
630+
Mächtiger als `#image()` ist die Funktion `#figure()` – ich habe sie heimlich gerade schon bei @ggt-modulo verwendet. Mit ihr kann man u.a. das Alignment steuern und auch Bildunterschriften realisieren, wie hier in @abb_hybrid:
623631

624632
#figure(
625-
image("img/output_plot-02.png", width: 90%),
633+
image("img/output_plot-02.png", width: 89%),
626634
caption: [Gedämpfte Schwingung, errechnet auf dem Analogcomputer THAT]
627635
) <abb_hybrid>
628636

629-
Im Bild sieht man übrigens eine gedämpfte Schwingung, wie sie vom Analogrechner THAT errechnet wurde. Das Auslesen der Werte erfolgte mittels eines Arduino, wie es in @ulmann2021github vorgeschlagen wurde.
637+
Im Bild sieht man übrigens eine gedämpfte Schwingung, wie sie vom #link("https://the-analog-thing.org")[Analogrechner THAT] errechnet wurde. Das Auslesen der Werte erfolgte mittels eines Arduino, wie es in @ulmann2021github vorgeschlagen wurde.
630638

631639
#figure(
632640
image("img/that_arduino.jpeg", width: 30%),
@@ -644,7 +652,7 @@ Im Bild sieht man übrigens eine gedämpfte Schwingung, wie sie vom Analogrechne
644652
+ Man kann jede Info-Box neu mit Code schreiben.
645653
+ Man definiert sich einmal eine neue Funktion inklusive Parametern und nutzt diese immer wieder, wenn man eine Info-Box einfügen will.
646654

647-
So wie im zweiten Punkt wurde es hier gemacht. Dadurch reduziert sich das Erzeugen dieser Info-Box auf einen Aufruf der selbst definierten Funktion `#info-box` (siehe Quellcode dieses Dokuments).
655+
So wie im zweiten Punkt wurde es hier gemacht. Dadurch reduziert sich das Erzeugen dieser Info-Box auf einen Aufruf der selbst definierten Funktion `#info-box`.
648656
]
649657

650658
#code-box[
@@ -728,21 +736,49 @@ Erzeugt wurde diese Tabelle dynamisch im Typst Quelldokument mittels dieses Code
728736
columns: count,
729737
fill: (_, row) => if row == 0 { luma(230) } else { none },
730738
..nums.map(n => $F_#n$),
731-
..nums.map(n => text(purple)[#str(fib(n))]),
739+
..nums.map(n => text(purple)[#str(fib(n))])
732740
)
733741
)
734742
```
735743
Die Funktion `fib()` wurde natürlich auch im Typst Dokument implementiert, ist hier aber nicht abgedruckt. Ein Blick in den Quellcode im Repository bringt Erhellung, falls gewünscht.
736744
]
737745

746+
#let breite = 4
747+
#let hoehe = 3
748+
749+
Hier ist noch ein anderes Beispiel: Wir haben oben im Code zur @ggt-modulo mit einem Range, also lediglich einer Liste von aufeinanderfolgenden Zahlen angefangen und daraus unsere Spalten- und Zeilen-Koordinaten erzeugt. Für eine Breite von #breite Spalten und eine Höhe von #hoehe Zeilen könnte man das Mapping der einen Laufvariable _i_ auch tabellarisch folgendermaßen darstellen:
750+
751+
#let feld = range(breite * hoehe)
752+
#show table.cell.where(y: 0): set text(fill: white)
753+
754+
#show table.header: set table.cell(fill: maroon)
755+
#figure(
756+
table(
757+
columns: 3,
758+
fill: (x, y) => if y == 0 { maroon } else { none },
759+
760+
[_i_], [_Spalte_], [_Zeile_],
761+
// [_i_], [_Spalte_], [_Zeile_],
762+
..feld.map(i => (
763+
[#i], [#calc.rem(i, breite)], [#calc.div-euclid(i, breite)]
764+
)).flatten()
765+
),
766+
caption: [Wie man aus einer Laufvariablen (_i_) zwei x/y-Koordinaten (_Spalte, Zeile_) machen kann]
767+
)
768+
769+
Dabei wurden die Werte für die _Spalte_ so berechnet: `calc.rem(i, breite)` und die Werte für die _Zeile_ so: `calc.div-euclid(i, breite)`.
770+
771+
Oben in @ggt-modulo haben wir natürlich deutlich mehr Spalten und Zeilen, aber dann würde die Tabelle hier nicht hin passen.
772+
773+
// #pagebreak(weak: true)
738774
= Diagramme
739775
== Typsts eigene Methoden <typst-grafik>
740776

741777
Man kann in Typst auch direkt zeichnen und somit (einfache) Illustrationen wie z.B. die in @hue-kreis-quadrate erstellen.
742778

743779
#let n = 18
744-
#let radius = 2.5cm
745-
#let sq-size = 0.7cm
780+
#let radius = 1.4cm
781+
#let sq-size = 0.4cm
746782
// Wir berechnen die benötigte Gesamtgröße (Durchmesser + Quadratgröße)
747783
#let total-size = 2 * radius + sq-size
748784

@@ -759,7 +795,7 @@ Man kann in Typst auch direkt zeichnen und somit (einfache) Illustrationen wie z
759795
width: sq-size,
760796
height: sq-size,
761797
fill: color.hsv(angle, 100%, 100%),
762-
stroke: 1.5pt + black.lighten(0%),
798+
stroke: 1.0pt + black.lighten(0%),
763799
radius: 4pt
764800
)
765801
]
@@ -1220,7 +1256,7 @@ Aber vor der $16$ kann neben der $32$ auch die $5$ kommen, denn $3*5+1$ ist $15$
12201256
So bauen wir rückwärts denkend einen Baum auf, in dem wir Vorgängerzahlen sehen. Das beginnt also so für einen Baum der Höhe #level:
12211257

12221258
#figure(
1223-
collatz_tree(level, scale: 1.0),
1259+
collatz_tree(level, scale: 0.7),
12241260
caption: [Collatz Baum mit den ersten #level Ebenen]
12251261
)
12261262

@@ -1229,7 +1265,7 @@ So bauen wir rückwärts denkend einen Baum auf, in dem wir Vorgängerzahlen seh
12291265
Nun denken wir das weiter und vervollständigen den Baum nach oben. Exemplarisch – und aus Platzgründen – sei hier der Baum der Ebene #level dargestellt:
12301266

12311267
#figure(
1232-
collatz_tree(level, scale: 0.8),
1268+
collatz_tree(level, scale: 0.7),
12331269
caption: [Collatz Baum der Ebene #level]
12341270
)
12351271

_config.typ

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@
1717
frame: gray
1818
),
1919
quote: (
20-
fill: gray.lighten(80%),
21-
stroke: gray
20+
fill: maroon.lighten(80%),
21+
stroke: maroon
2222
),
2323
code: (
2424
inline-fill: luma(240)
@@ -47,13 +47,14 @@
4747
margin-x: 1.5cm,
4848
margin-y: 1.5cm
4949
),
50+
line-spacing: 0.52em,
5051
figure: (
5152
above: 2.0em,
5253
below: 3.0em
5354
),
5455
heading: (
55-
above: 1.0em,
56-
below: 0.8em
56+
above: 1.8em,
57+
below: 1.2em
5758
),
5859
abstract-pad-x: 4em,
5960
list: (

0 commit comments

Comments
 (0)