Blockst ist ein Typst-Paket, das es ermöglicht, Scratch-Programmierblöcke direkt in Typst-Dokumenten zu erstellen. Perfekt für Programmier-Tutorials, Bildungsmaterialien und Dokumentationen von visuellen Programmierkonzepten.
⚠️ Work in Progress
Dieses Projekt befindet sich noch in aktiver Entwicklung. Die Blöcke sind funktional, aber es gibt noch Raum für Verbesserungen bei der pixel-genauen Anpassung an die Original-Scratch-Blöcke. Hilfe ist herzlich willkommen! Besonders bei:
- 🎨 Feintuning der Block-Geometrie und Farben
- 🌍 Lokalisierung in weitere Sprachen (aktuell: Deutsch & Englisch)
- 📚 Ergänzung fehlender Blöcke oder Features
- 🐛 Bug-Reports und Feedback
- ✅ Alle Scratch-Kategorien: Bewegung, Aussehen, Klang, Ereignisse, Steuerung, Fühlen, Operatoren, Variablen, Listen und eigene Blöcke
- ✅ Originalgetreue Farben: Normal- und High-Contrast-Modi
- ✅ Verschachtelte Strukturen: Schleifen, Bedingungen (falls-dann-sonst), eigene Blöcke
- ✅ Reporter & Operatoren: Ovale und runde Pills, Diamant-Bedingungen
- ✅ Mehrsprachig: Deutsche und englische Blöcke verfügbar
- ✅ Moderne API: Schema-basiertes Rendering mit sauberer Sprachabstraktion
Kopiere die Dateien in dein Projekt-Verzeichnis und importiere das Paket:
#import "lib.typ": blockst, scratch#blockst[
#import scratch.de: *
#wenn-gruene-flagge-geklickt[
#wiederhole(anzahl: 100)[
#gehe()
]
]
]#blockst[
#import scratch.de: *
#wenn-taste-gedrueckt("Leertaste")[
#falls-sonst(
taste-gedrueckt("Pfeil nach oben"),
[#gehe()],
[#drehe-rechts()],
)
]
]#blockst[
#import scratch.de: *
#wenn-diese-figur-angeklickt[
#setze-variable("Punkte", 0)
#aendere-variable("Punkte", 10)
#zeige-variable("Punkte")
]
]#blockst[
#import scratch.de: *
#wenn-gruene-flagge-geklickt[
#entferne-alles-aus-liste("Namen")
#fuege-zu-liste-hinzu("Anna", "Namen")
#fuege-zu-liste-hinzu("Ben", "Namen")
#fuege-zu-liste-hinzu("Clara", "Namen")
#zeige-liste("Namen")
]
]#blockst[
#import scratch.de: *
#wenn-gruene-flagge-geklickt[
#falls-sonst(
und(
groesser-als(maus-x(), 0),
kleiner-als(maus-y(), 100),
),
[#sage-fuer-sekunden("Maus im Bereich!", sekunden: 2)],
[#sage-fuer-sekunden("Außerhalb", sekunden: 2)],
)
]
]#blockst[
#import scratch.de: *
#wenn-gruene-flagge-geklickt[
#setze-variable("Ergebnis", addiere(multipliziere(3, 2), 5))
#sage-fuer-sekunden(eigene-eingabe("Ergebnis"), sekunden: 2)
]
]#blockst[
#import scratch.de: *
#wenn-gruene-flagge-geklickt[
#wiederhole(anzahl: 50)[
#gehe()
#falls(
wird-farbe-beruehrt(rgb("#FF0000")),
[#drehe-rechts(grad: 180)],
)
]
]
]#blockst[
#import scratch.de: *
#let mein-block = eigener-block("Springe 5 mal")
#definiere(mein-block)[
#wiederhole(anzahl: 5)[
#aendere-y(dy: 10)
]
]
#wenn-gruene-flagge-geklickt[
#mein-block
]
]#blockst[
#import scratch.de: * // Für deutsche Blöcke
// oder
#import scratch.en: * // Für englische Blöcke
// Dein Scratch-Code hier
]#set-blockst(
theme: "normal", // oder "high-contrast"
scale: 100%, // Skalierung der Blöcke
)gehe(schritte: 10)– Gehe Schrittedrehe-rechts(grad: 15),drehe-links(grad: 15)– Drehe um Gradegehe-zu(x: 0, y: 0),gehe-zu-position(zu)– Gehe zu Positiongleite-zu(sekunden: 1, x: 0, y: 0)– Gleite zu Positionsetze-richtung(richtung: 90),drehe-dich-zu(zu)– Setze Richtungaendere-x(dx: 10),setze-x(x: 0)– Ändere/Setze Xaendere-y(dy: 10),setze-y(y: 0)– Ändere/Setze Ypralle-vom-rand-ab()– Pralle vom Rand ab
sage(nachricht),sage-fuer-sekunden(nachricht, sekunden: 2)– Sage etwasdenke(nachricht),denke-fuer-sekunden(nachricht, sekunden: 2)– Denke etwaswechsle-zu-kostuem(kostuem),naechstes-kostuem()– Kostüm wechselnzeige-dich(),verstecke-dich()– Zeige/Verstecke Figur
wenn-gruene-flagge-geklickt[body]– Wenn grüne Flagge angeklicktwenn-taste-gedrueckt(taste)[body]– Wenn Taste gedrücktwenn-diese-figur-angeklickt[body]– Wenn Figur angeklickt
wiederhole(anzahl: 10)[body]– Wiederhole n-malwiederhole-fortlaufend[body]– Wiederhole fortlaufendfalls(bedingung)[body]– Falls (nur dann)falls-sonst(bedingung, dann, sonst)– Falls-dann-sonst
frage(frage)– Frage und warteantwort()– Antwort (Reporter)taste-gedrueckt(taste)– Taste gedrückt? (Bedingung)maus-x(),maus-y()– Maus-Position (Reporter)wird-beruehrt(objekt)– Wird berührt? (Bedingung)wird-farbe-beruehrt(farbe)– Wird Farbe berührt? (Bedingung)
- Arithmetik:
addiere(zahl1, zahl2),subtrahiere(zahl1, zahl2),multipliziere(zahl1, zahl2),dividiere(zahl1, zahl2) - Vergleiche:
groesser-als(op1, op2),kleiner-als(op1, op2),gleich(op1, op2) - Logik:
und(op1, op2),oder(op1, op2),nicht(operand) - Text:
verbinde(string1, string2),zeichen-von(position, text),laenge-von(text),enthaelt(text1, text2) - Mathematik:
zufallszahl(von: 1, bis: 10),runde(zahl),modulo(zahl1, zahl2),mathematik(operator, zahl)
setze-variable(variable, wert)– Setze Variable auf Wertaendere-variable(variable, wert)– Ändere Variable um Wertzeige-variable(variable),verstecke-variable(variable)– Zeige/Verstecke Variable- Reporter:
eigene-eingabe(text)– Variable als Reporter
fuege-zu-liste-hinzu(element, liste)– Füge zu Liste hinzuentferne-aus-liste(index, liste)– Entferne aus Listeentferne-alles-aus-liste(liste)– Lösche alle aus Listefuege-bei-ein(element, index, liste)– Füge bei Index einersetze-element(index, liste, element)– Ersetze Element- Reporter:
element-von-liste(index, liste),nummer-von-element(element, liste),laenge-von-liste(liste) - Bedingung:
liste-enthaelt(liste, element) zeige-liste(liste),verstecke-liste(liste)– Zeige/Verstecke Liste
Es gibt zwei Wege, eigene Blöcke zu erstellen:
#blockst[
#import scratch.de: *
#let mein-block = eigener-block("Springe 5 mal")
#definiere(mein-block)[
#wiederhole(anzahl: 5)[
#aendere-y(dy: 10)
]
]
#wenn-gruene-flagge-geklickt[
#mein-block
]
]#blockst[
#import scratch.de: *
#let zeichne = eigener-block("zeichne", (name: "n"), "-Eck in der ", (name: "Größe"))
#definiere(zeichne)[
#wiederhole(anzahl: parameter("n"))[
#gehe(schritte: parameter("Größe"))
#drehe-rechts(grad: dividiere(360, parameter("n")))
]
]
#wenn-gruene-flagge-geklickt[
#zeichne(6, 50) // Sechseck mit Größe 50
#zeichne(4, 30) // Viereck mit Größe 30
]
]Verfügbare Funktionen:
eigener-block(...)– Erstellt einen eigenen Block mit beliebig vielen Parameterndefiniere(label)[body]– Definitionsblock für eigene Blöckeparameter(name)– Liest den Wert eines Parameters im eigenen Blockeigene-eingabe(text)– Variable/Input als Reporter
Für umfangreichere Beispiele siehe:
examples.typ– Komplexe Algorithmen (Quiz, Bubble Sort, Timer, Polygon-Zeichnung) auf Deutschexamples-short.typ– Kurze, prägnante Beispiele für alle Kategorien auf Deutschexamples-short-en.typ– Kurze Beispiele auf Englisch
#set-blockst(theme: "high-contrast") // oder "normal"#set-blockst(scale: 80%) // Verkleinere auf 80%Das Paket unterstützt mehrere Sprachen:
// Deutsche Blöcke
#blockst[
#import scratch.de: *
#wenn-gruene-flagge-geklickt[...]
]
// Englische Blöcke
#blockst[
#import scratch.en: *
#when-green-flag-clicked[...]
]Dieses Projekt steht unter der MIT-Lizenz.
Beiträge sind herzlich willkommen! 🎉
Dieses Projekt ist ein Work in Progress, und wir freuen uns über jede Unterstützung:
- 🐛 Bug-Reports: Wenn etwas nicht funktioniert oder die Blöcke nicht korrekt dargestellt werden
- 🎨 Design-Verbesserungen: Hilf dabei, die Blöcke noch näher an die Original-Scratch-Blöcke anzupassen
- 🌍 Lokalisierung: Übersetze die Blöcke in weitere Sprachen
- 📚 Dokumentation: Erweitere die Beispiele, schreibe Tutorials oder verbessere die README
- ✨ Features: Füge fehlende Blöcke hinzu oder schlage neue Funktionen vor
Erstelle einfach ein Issue oder einen Pull Request auf GitHub!
Erstellt mit ❤️ für die Scratch- und Typst-Community







