You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: CHANGELOG.md
+14-1Lines changed: 14 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -2,6 +2,18 @@
2
2
3
3
Releases sind momentan sehr willkürlich und können immer mal _zwischendurch_ stattfinden.
4
4
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
+
5
17
## [v0.6.0] – 2026-01-01
6
18
### Added
7
19
- 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
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
114
121
== Kenngrößen auslagern
115
122
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.
116
123
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.
118
125
119
126
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:
120
127
```typ
@@ -132,8 +139,7 @@ Und in dieser Datei `_lib.typ` stecken allerlei Funktionen, set-Regeln, show-Reg
132
139
date: datetime(year: 2025, month: 12, day: 22),
133
140
version: "0.2.251222",
134
141
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.]
137
143
)
138
144
```
139
145
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
152
158
```
153
159
Das gibt den zuvor gesetzten Titel aus.
154
160
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.
156
162
Will man einen anderen Titel im Dokument haben, als in den #nameref(<metadata>), dann gibt man einfach einen anderen Titel aus:
157
163
```typ
158
164
// Die Titel-Eigenschaft des Dokuments festlegen:
@@ -169,7 +175,7 @@ Will man einen anderen Titel im Dokument haben, als in den #nameref(<metadata>),
169
175
`#title[Mein Titel]` ist also eine Kurzschreibweise für `#title([Mein Titel])`.
170
176
]
171
177
172
-
Einen Hinweis zur Verwendung des \#Zeichens gibt es in @hash-character.
178
+
Einen Hinweis zur Verwendung des \#-Zeichens gibt es in @hash-character.
173
179
174
180
== Zusammenfassung
175
181
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 {
189
195
}
190
196
```
191
197
]
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
193
201
194
202
== PDF Metadaten <metadata>
195
203
Ü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
239
247
```
240
248
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.
241
249
242
-
== Noch mehr Abstraktion
250
+
== Noch mehr Abstraktion<config>
243
251
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.
244
252
245
253
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
284
292
285
293
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.
286
294
287
-
#pagebreak(weak: true)
295
+
//#pagebreak(weak: true)
288
296
= Das Zeichen \# in Typst <hash-character>
289
297
Wir müssen kurz über das Zeichen \# sprechen.
290
298
@@ -322,14 +330,14 @@ So ein Zitat fügt man übrigens über die Funktion `#quote()` ein. Dass es hier
322
330
)
323
331
```
324
332
325
-
#pagebreak(weak: true)
333
+
//#pagebreak(weak: true)
326
334
= Bilder mit `image()`<bilder>
327
335
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.
328
336
329
337
== Bilddateien
330
338
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)_:
331
339
332
-
#image("img/cm5.jpeg", width: 85%)
340
+
#image("img/cm5.jpeg", width: 75%)
333
341
334
342
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.
335
343
@@ -419,7 +427,7 @@ Was geht da genau vor?
419
427
)
420
428
]
421
429
422
-
#line(length: 100%, stroke: 0.5pt+gray)
430
+
//#line(length: 100%, stroke: 0.5pt + gray)
423
431
424
432
Ein Experiment mit Farbe gefällig? Gern. Wir fangen mit leichter Kost an:
425
433
#align(center)[
@@ -448,9 +456,9 @@ Dazu der Code:
448
456
449
457
Schließlich noch ein blaues Pixel, ihr wisst schon, warum es blau ($0,0,255$) ist.
450
458
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 …
452
460
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".
454
462
455
463
Der Rest ist bekannt.
456
464
@@ -552,7 +560,7 @@ Unser nächstes Beispiel wird etwas komplexer – und ein wenig mathematischer:
552
560
caption: "ggT-modulo-Grafik"
553
561
) <ggt-modulo>
554
562
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)]
556
564
557
565
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_:
558
566
@@ -608,25 +616,25 @@ Das Einbauen als Bild ins Dokument erfolgt dann über die schon gelernte `image(
608
616
scaling: "pixelated"
609
617
),
610
618
caption: "ggT-modulo-Grafik"
611
-
)
619
+
) <ggt-modulo>
612
620
```
613
621
614
622
Und fertig ist die Laube.
615
623
616
624
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>)").
617
625
618
-
#pagebreak(weak: true)
626
+
//#pagebreak(weak: true)
619
627
//--------------------
620
628
621
629
= 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:
623
631
624
632
#figure(
625
-
image("img/output_plot-02.png", width: 90%),
633
+
image("img/output_plot-02.png", width: 89%),
626
634
caption: [Gedämpfte Schwingung, errechnet auf dem Analogcomputer THAT]
627
635
) <abb_hybrid>
628
636
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.
630
638
631
639
#figure(
632
640
image("img/that_arduino.jpeg", width: 30%),
@@ -644,7 +652,7 @@ Im Bild sieht man übrigens eine gedämpfte Schwingung, wie sie vom Analogrechne
644
652
+ Man kann jede Info-Box neu mit Code schreiben.
645
653
+ Man definiert sich einmal eine neue Funktion inklusive Parametern und nutzt diese immer wieder, wenn man eine Info-Box einfügen will.
646
654
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`.
648
656
]
649
657
650
658
#code-box[
@@ -728,21 +736,49 @@ Erzeugt wurde diese Tabelle dynamisch im Typst Quelldokument mittels dieses Code
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.
736
744
]
737
745
746
+
#letbreite= 4
747
+
#lethoehe= 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:
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)
738
774
= Diagramme
739
775
== Typsts eigene Methoden <typst-grafik>
740
776
741
777
Man kann in Typst auch direkt zeichnen und somit (einfache) Illustrationen wie z.B. die in @hue-kreis-quadrate erstellen.
742
778
743
779
#letn= 18
744
-
#letradius= 2.5cm
745
-
#letsq-size= 0.7cm
780
+
#letradius= 1.4cm
781
+
#letsq-size= 0.4cm
746
782
// Wir berechnen die benötigte Gesamtgröße (Durchmesser + Quadratgröße)
747
783
#lettotal-size= 2*radius+sq-size
748
784
@@ -759,7 +795,7 @@ Man kann in Typst auch direkt zeichnen und somit (einfache) Illustrationen wie z
759
795
width: sq-size,
760
796
height: sq-size,
761
797
fill: color.hsv(angle, 100%, 100%),
762
-
stroke: 1.5pt+black.lighten(0%),
798
+
stroke: 1.0pt+black.lighten(0%),
763
799
radius: 4pt
764
800
)
765
801
]
@@ -1220,7 +1256,7 @@ Aber vor der $16$ kann neben der $32$ auch die $5$ kommen, denn $3*5+1$ ist $15$
1220
1256
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:
1221
1257
1222
1258
#figure(
1223
-
collatz_tree(level, scale: 1.0),
1259
+
collatz_tree(level, scale: 0.7),
1224
1260
caption: [Collatz Baum mit den ersten #level Ebenen]
1225
1261
)
1226
1262
@@ -1229,7 +1265,7 @@ So bauen wir rückwärts denkend einen Baum auf, in dem wir Vorgängerzahlen seh
1229
1265
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:
0 commit comments