psi-slides · Präsentationssoftware für Lehrende · This page in English

Folien, Notizen und Handouts aus einer Datei.

Eine einfache Textdatei in Markdown wird zu vier HTML-Dateien: der Projektion für den Raum, einem Presenter-Cockpit auf dem eigenen Bildschirm (die Folie, die eigene Notiz dazu und was als Nächstes kommt) und zwei Handouts – dem vollständigen Text der Vorlesung allein und demselben Text mit den eigenen Notizen darin. Alle vier entstehen aus dieser einen Datei. Sie können nicht auseinanderlaufen, weil es nichts gibt, was man synchron halten müsste, und jede bringt alles mit, was sie zum Öffnen braucht.

Auf die Folie kommt, was der Raum braucht, um zu folgen; ins Handout kommt alles, was man behalten will. Diese Trennung kostet Freiheit im Layout – weniger Möglichkeiten als in PowerPoint – und bringt dafür vier Ausgaben statt einer. Eine Vorlesung kann hervorgehobenen Code, LaTeX-Formeln und Video enthalten, und jeder Link bekommt einen QR-Code, den der Raum von der Wand abscannen kann. Für die Stunde im Hörsaal gibt es Übersichtstafel, Volltextsuche, Live-Annotationen, eine Uhr und sieben Farbschemata. Das alles läuft auf dem eigenen Laptop und funktioniert auch offline, ohne Cloud und ohne Dienstleister.

was der Raum sieht
Die Folie wie projiziert: Überschrift, Unterzeile, der erste Satz jedes Absatzes und die fett markierten Stellen, einspaltig.
was die Lesenden bekommen
Dieselbe Folie ohne Kürzung: alle vier Absätze vollständig, in zwei Spalten.

Dieselben vier Absätze, einmal geschrieben. Zwischen den ersten beiden Bildern liegt ein Tastendruck; das dritte ist eine andere Datei aus derselben Quelle, und der Schalter zeigen: in der Titelzeile des zweiten Bildes holt sie hervor. Ein Klick auf ein Bild öffnet es in voller Größe.

Die Kurzfassung in einer Minute

Das Argument dieser Seite als Film: woraus eine Vorlesung besteht, was aus einer Datei entsteht und wie die Stunde im Hörsaal aussieht. Gut eine Minute, mit Untertiteln. There is an English version, too.

psi-slides in einer Minute

Die Datei liegt auf einem Server des Lehrstuhls an der Universität Bamberg, nicht im Repository, und wird erst geladen, wenn man auf Abspielen drückt.

Jede Vorlesung besteht aus drei Sorten Text

Da ist der Text, der auf die Folie kommt, knapp genug, dass man ihn aus der letzten Reihe lesen kann. Da ist das Skript – die Sätze, die die Sache wirklich erklären und die in ein Handout gehören statt an die Wand. Und da sind die Notizen für einen selbst: erst die Gruppe fragen; das hier weglassen, wenn die Zeit knapp wird; das geht nicht raus.

Die gängigen Präsentationsprogramme bieten Folien und ein Notizfeld. Für das Skript ist darin kein Platz vorgesehen, und ausgerechnet das ist der Teil, den Studierende am meisten wollen. Das Skript nimmt dann einen von zwei Wegen. Entweder übernehmen die Folien seine Aufgabe und werden so voll, dass sie aus der letzten Reihe niemand mehr lesen kann – Death by PowerPoint. Oder das Skript steht in einem zweiten Dokument, das ab der ersten Änderung nicht mehr zu den Folien passt.

Mit psi-slides schreibt man jeden Absatz einmal und markiert den einen Satz, der den Absatz trägt. Die Projektion bekommt nur diesen Satz, das Handout bekommt den ganzen Absatz, und die Zeilen hinter > note: bleiben auf dem eigenen Bildschirm.

alles auf die Folien
Folien, daneben ein Skript
psi-slides
> note:

Was aus dem Markdown wird

Das hier ist das Markdown hinter der Folie auf den Bildern oben. Die Vorlesung, aus der sie stammt, ist eine echte: eine Python-Einführung aus 36 Chunks – ein Chunk ist eine Überschrift mit dem Text darunter, und jeder Chunk wird zu einer Folie. Zwei der vier Absätze sind gekürzt, damit der Ausschnitt auf diese Seite passt; die Vorlesung selbst ist auf Englisch.

## free: Why Playwright | the modern web is rendered, not served {.wide #why-playwright}

::: cols 2

**A lot of the web is rendered by JavaScript in the browser.**
**`requests` and plain `urllib` see only the HTML shell** – often just
`<div id="app"></div>` plus a pile of script tags. Useful text, links, and
titles never arrive.

**Playwright drives a real browser** – Chromium, Firefox, or WebKit – over a
debugging protocol. The page renders, scripts execute, the DOM settles, and
then you query it. You see what a human sees.

**For a link scanner this matters a lot.****The cost is weight.**:::

::: footnote
`requests` is still the right tool for an API that answers in JSON. The
browser is for pages meant to be looked at.
:::

> note: Show the difference live if the room is awake: open a JS-heavy site,
> curl it, and let them find the missing text themselves.

In der Projektion fallen die zwei Spalten zu einer zusammen, weil sich vier gekürzte Absätze nicht ausbalancieren lassen. Ohne Kürzung und im Handout bleiben die beiden Spalten aus der Quelle erhalten.

speaker.html
Das Presenter-Cockpit: oben eine Kapitelleiste, darunter eine Spiegelung der projizierten Folie, die private Sprechnotiz, ein Streifen mit den Nachbarfolien und eine Fußzeile mit Uhr und Tastenlegende.
Das Cockpit, mit S aus der Projektion geöffnet. Die > note: aus der Quelle steht unter der gespiegelten Folie, wo sie sonst niemand sieht, in einer Größe, die man mit den zwei Knöpfen neben der Notiz einstellt; der Streifen zeigt, was kommt. Die beiden Fenster halten sich direkt im Browser im Gleichschritt, ohne Server dazwischen.
audience.html · O
Die Übersichtstafel: die ganze Vorlesung aus 36 Chunks als Raster lesbarer Folien, die aktuelle umrandet.
Die ganze Vorlesung auf einmal. Keine Miniaturen, sondern die echten Folien, immer noch lesbar. Ziehen verschiebt den Ausschnitt, Enter springt zur ausgewählten Folie.
audience.html · /
Das Suchfeld über der Folie: die Anfrage async und fünf Treffer, jeder mit Art, Überschrift und dem passenden Satz.
Volltextsuche, von überall, mitten im Vortrag. Jeder Treffer nennt die Art des Chunks, seine Überschrift und den Satz, in dem der Suchbegriff steht.
print-notes.html
Das Handout: derselbe Chunk als fließender Blocksatz mit Silbentrennung, die Randnotiz als Marginalie und die Sprechnotiz in einem getönten Block darunter.
Das Handout der Lehrperson. Dieselbe Quelle als Dokument gesetzt – mit Silbentrennung, in einer Zeilenlänge zum Lesen, und die Sprechnotiz steht unter ihrem Chunk. Es gibt zwei Handouts: print.html trägt nur das Skript und ist das für die Studierenden, print-notes.html ergänzt die Sprechnotizen und bleibt bei einem selbst.

Titelfolien und Trenner

Die Voreinstellung steht unten, der Rest ist einen Klick entfernt. Anklicken zeigt eine Kachel in voller Größe.

Das hier ist eine Vorschau, wie die Figurensprache weiter unten. Es steckt nicht in Version 1.0.0: Wer ein cover: oder ein section: schreibt, braucht das Repository statt des Downloads auf der Releases-Seite. Loslegen hat beides.

cover: benennt die Titelfolie. Sie sind von leise nach laut sortiert.

Die anderen sieben Titelfolien

cover-align: setzt den Satz nach oben, in die Mitte oder nach unten, bei den Kompositionen, die ihm dort Freiheit lassen. cover-ratio: ist ein Prozentsatz und sagt, wie viel der Folie das Bild bekommt, bei denen, die sie teilen.

section: zeichnet die Trennerfolie, mit der ein neuer Teil der Vorlesung aufmacht. Sie sind alle leiser als jede Titelfolie.

Alles, was eine einzelne Vorlesung gleichzeitig tragen kann – eine Schlussfolie, Trenner mit Zitat, Foto oder Abbildung, Inhalte als Karten gesetzt, ein ganzflächiges Foto, das sich auf Leertaste öffnet – steht in der Dekorations-Vorlesung.

Vorlesungen selbst öffnen

Auf dieser Seite liegen fünf Vorlesungen. python-intro ist die, aus der die Bilder stammen. Das Tutorial ist eine selbstbezügliche Tour, die das Werkzeug erklärt, indem sie es benutzt. Die Figures-Vorlesung zeichnet jede Konstruktion, die die Abbildungssprache kennt, darunter Abbildungen aus einer echten Vorlesung, und ist das ausgearbeitete Beispiel hinter Figures you write. Decoration zeigt jede Konstruktion, die etwas anderes als eine Textspalte auf eine Folie bringt: die Titelfolien, die Trenner, Inhalte als Karten gesetzt, ein Foto, das sich mit Leertaste öffnet. Das Kurzbeispiel ist ein Ausschnitt aus einer Netzwerk-Vorlesung im ersten Semester, auf Deutsch: gut 80 Zeilen Markdown, kurz genug, um sie ganz zu lesen und daneben zu sehen, was daraus wird (Quelle, gesetzt nach den Vorlesungsnotizen unter CC BY-NC-SA 4.0).

python-introTutorialFiguresDecorationKurzbeispiel
Die Projektion audience audience audience audience audience
Das Cockpit speaker speaker speaker speaker
Das Dokument print print print print print
Mit den Notizen print-notes print-notes print-notes print-notes

Dekoration und Figuren zeigen beide, was nicht in Version 1.0.0 steckt – die Titelfolien, die Abschnittstrenner, Karten und Zeilen, Hintergrundbilder, und Abbildungen als ::: draw. Beide Vorlesungen sagen das auf ihrer dritten Folie, und beide brauchen zum Bauen das Repository. Von der Dekoration sind nur die Projektion und das Dokument veröffentlicht.

Am besten mit der Projektion anfangen. Pfeiltasten blättern, Leertaste blendet den nächsten Abschnitt ein, C schaltet zwischen gekürztem und vollem Text um, O (der Buchstabe, nicht die Null) öffnet die Übersichtstafel, / sucht, ? listet alle Tasten auf. Ein Cockpit, das über die Tabelle oben geöffnet wird, zeigt zwar das Layout, ist aber mit nichts verbunden; ein verbundenes Cockpit öffnet man mit S in der Projektion.

Alle vier Dateien sind in sich geschlossen: die Gestaltung, die Skripte, die Bilder, die gesetzten Formeln und die Schriften stecken in der HTML-Datei selbst. Zur Laufzeit wird nichts nachgeladen, und die Dateien lassen sich aus einem Ordner auf der Festplatte (file://) genauso öffnen wie von diesem Server.

Loslegen

Es gibt zwei Fassungen, und sie können unterschiedlich viel.

Das aktuelle Release ist 1.0.0. Sein Quellformat liegt fest, eine Vorlesung baut also später noch genauso wie heute. Die .zip oder die .tar.gz herunterladen und auspacken; Tutorial, python-intro und Kurzbeispiel von oben sind darin schon gebaut, ein Doppelklick auf lectures/tutorial/audience.html startet die Tour ohne jede Installation. Eine Zeile macht dasselbe ohne Klicken:

curl -L https://github.com/UBA-PSI/psi-slides/releases/latest/download/psi-slides.tar.gz \
  | tar xz

Das Repository enthält, was in 1.0.0 noch fehlt: Abbildungen als ::: draw, die Titelfolien und Abschnittstrenner, Karten und Reihen sowie den grafischen Abbildungseditor. Wer wegen einer dieser Sachen hier ist, nimmt diese Fassung. Dafür gilt die Formatzusage nicht – an diesen Teilen kann sich noch etwas ändern, eine damit geschriebene Vorlesung braucht bis zum Release also vielleicht eine Anpassung.

git clone https://github.com/UBA-PSI/psi-slides

Ohne git: Download ZIP unter dem grünen Code-Knopf des Repositorys.

Für eine eigene Vorlesung braucht man Node 20 oder neuer, damit läuft build.js, sonst nichts: kein LaTeX, kein Pandoc, keinen Server, nichts, was systemweit installiert werden müsste.

cd psi-slides

# einmalig: die mitgelieferten Schriften und die wenigen Pakete für den Bau
npm install

# alle vier Ansichten neben source.md bauen, dann die Projektion öffnen
node build.js lectures/tutorial/source.md
open lectures/tutorial/audience.html   # macOS; sonst xdg-open oder der Browser
Falls Node noch nie installiert wurde und das Terminal unbekannt ist

Die folgenden Schritte führen von einem Windows- oder macOS-Rechner, auf dem nichts installiert ist, zu einem gebauten Tutorial.

Node installieren

nodejs.org öffnen. Der Knopf bietet die LTS-Version an – die mit langfristiger Pflege – in der passenden Datei für den jeweiligen Rechner; diesen Download nehmen. Unter macOS kommt ein .pkg: doppelklicken, durch den Installer klicken, das Passwort eingeben, wenn danach gefragt wird. Unter Windows kommt ein .msi: doppelklicken, die Vorgaben übernehmen und das Häkchen für die Werkzeuge für native Module in Ruhe lassen. psi-slides braucht sie nicht.

Wer schon einen Paketmanager benutzt: brew install node unter macOS und winget install OpenJS.NodeJS.LTS unter Windows tun dasselbe.

Ein Terminal öffnen

Unter macOS Command-Leertaste drücken, terminal tippen, Return. Unter Windows das Startmenü öffnen und terminal tippen: Windows Terminal nehmen, falls es erscheint, sonst PowerShell. Es kommt ein Fenster mit einem Cursor darin. Man tippt eine Zeile, drückt Return, und es antwortet.

node --version

Die Antwort ist eine Versionsnummer. Alles ab v20 funktioniert, und ein frischer LTS-Download liegt deutlich darüber. Kommt stattdessen command not found oder is not recognized, das Fenster schließen und ein neues öffnen: ein Terminal, das beim Installieren von Node schon offen war, hat es noch nicht gesehen.

Die Dateien holen

Eine der beiden Fassungen von oben nehmen. Im Zweifel das Release; Download ZIP unter dem grünen Code-Knopf des Repositorys ist dieselbe Art Datei und bringt zusätzlich die Abbildungen, die Titelfolien und die Karten mit. Auspacken wie jeden anderen Download; auf beiden Systemen genügt ein Doppelklick. Es entsteht ein Ordner, dessen Name mit psi-slides beginnt, und dieser Ordner ist das ganze Werkzeug. Ihn irgendwo ablegen, wo er wiederzufinden ist, denn das Terminal muss gleich darauf gerichtet werden.

Unter Windows die .zip wirklich auspacken und nicht per Doppelklick öffnen: Windows zeigt den Inhalt eines ZIP-Archivs wie einen Ordner an, aber darin lassen sich keine Befehle ausführen.

Das Terminal auf den Ordner richten

cd psi-slides

Die cd-Zeile muss benennen, wo der Ordner tatsächlich liegt, unter Windows also etwa cd C:\Users\du\Downloads\psi-slides. Statt den Pfad zu tippen: cd und ein Leerzeichen eingeben und dann den Ordner aus dem Dateimanager ins Terminalfenster ziehen – der Pfad schreibt sich selbst.

Holen, was der Bau braucht

npm install

npm install läuft einmal, in diesem Ordner, und dauert ein paar Sekunden. Es holt die Schriften, die psi-slides in jede Vorlesung einbettet, und die wenigen Pakete, die der Bau benutzt. Alles landet in einem Ordner node_modules neben build.js: systemweit wird nichts installiert, und die gebauten Vorlesungen laden beim Öffnen nichts nach.

Das Tutorial bauen

node build.js lectures/tutorial/source.md

Dieselbe Zeile unter Windows und macOS, Schrägstriche eingeschlossen: Node nimmt sie überall. Sie meldet, was eingebettet wurde – die Bilder, die Schriften, die QR-Codes, die gesetzten Formeln – und endet damit, was geschrieben wurde.

Wrote lectures/tutorial/print.html, lectures/tutorial/print-notes.html, lectures/tutorial/audience.html, lectures/tutorial/speaker.html (11 columns, 59 chunks)

Öffnen

lectures/tutorial/audience.html doppelklicken. Es öffnet sich im Browser, und mehr braucht es nicht: ? listet die Tasten, S öffnet das Cockpit. Die Datei an jemanden mailen, der nichts davon installiert hat, und sie funktioniert trotzdem.

Für Linux: all diese Werkzeuge sind ohnehin da. Die Pakete der Distributionen hängen manchmal mehrere Versionen hinterher, deshalb lohnt sich node --version auch dort.

Das Tutorial erklärt das Werkzeug, indem es das Werkzeug benutzt. ? zeigt die Tastenübersicht, S öffnet das Cockpit. Die source.md des Tutorials ist die Referenz zum Schreiben eigener Vorlesungen, und die vier gebauten Dateien kann man verschieben, mailen oder hochladen – sie tragen alles bei sich, was sie brauchen.

Dann die eigene Vorlesung schreiben

# ein Verzeichnis mit gültigem Frontmatter anlegen
node build.js --new my-lecture

# bei jedem Speichern neu bauen und alle offenen Tabs neu laden
node build.js lectures/my-lecture/source.md --watch

# Chunk-IDs, Wortbudgets, offene Direktiven, zu große Assets
node lint.js lectures/my-lecture/source.md

Editor, Projektion und Cockpit nebeneinander offen halten: --watch baut bei jedem Speichern neu und lädt die beiden Browserfenster nach, sobald der Bau fertig ist. Am Ende sind die vier HTML-Dateien neben der source.md das, was man weitergibt. Mehr muss nicht mitreisen.

Auch eine Abbildung ist Text

Die Abbildungen einer Vorlesung veralten dort, wo sie in einem Zeichenprogramm liegen. psi-slides hat dafür eine kleine Sprache: eine Abbildung besteht aus ein paar Zeilen in derselben Markdown-Datei wie die Folie, auf der sie steht, und der Build zeichnet sie. Außer dem ersten Element sitzt darin nichts auf einem Punkt einer Zeichenfläche – jeder Kasten wird an einen anderen gesetzt – also zieht ein verschobener Kasten mit, was an ihm hängt, und eine Abbildung kann vor dem Publikum Schritt für Schritt entstehen.

Eine Abbildung aus einer Vorlesung zur Netzsicherheit: vier Kästen in einer Reihe, beschriftet Frame Header, Datagram Header, Segment Header und Payload, mit je einer Linie von den ersten drei hinauf zu einer Notiz, welche Adressen dieser Kopf trägt.

Eine Folie aus einer echten Vorlesung, vom Build gezeichnet. Ein Teil ihres Quelltexts steht unten: die vier Kästen, eine der drei Notizen und der Schritt, der diese Notiz hereinholt. Zwei Dinge muss man wissen, um sie zu lesen. Längen zählen in Rasterzellen, nicht in Pixeln – die erste Zeile setzt die Zelle auf 150 mal 54, deshalb ist w 0.88 h 0.85 ein Kasten, der viel breiter als hoch ist, und eine Abbildung behält ihre Proportionen, wenn die Zelle sich ändert. Und -- fh.cx,fh.top ist eine Anschlusslinie: sie richtet die Notiz auf eine Stelle eines anderen Kastens aus, sucht sich ihren Weg selbst und bleibt daran hängen, wenn der Kasten sich bewegt.

::: draw 150x54
default box {.tone-3 .sharp} w 0.88 h 0.85
box fh "Frame\nHeader"    at 0,0
box dh "Datagram\nHeader" right of fh gap 0 same as fh
box sh "Segment\nHeader"  right of dh gap 0 same as fh
box pl "Payload"          right of sh gap 0 same as fh {.paper}
text lmac "Ethernet source\nand destination\naddresses*"       above fh gap 0.5 -- fh.cx,fh.top {.muted @l1}
step ethernet
  show @l1
  emph fh

Das hier ist eine Vorschau. Sie steckt nicht in der Version 1.0.0, der Download auf der Releases-Seite hat sie also nicht. Zum Ausprobieren braucht es das Repository selbst – entweder einen Klon oder Download ZIP im Code-Menü des Repositorys. Das auf einer Release-Seite angebotene Source code (zip) enthält den getaggten Release und damit diese Vorschau gerade nicht.

git clone https://github.com/UBA-PSI/psi-slides
cd psi-slides
npm install
node build.js lectures/diagrams/source.md
open lectures/diagrams/audience.html   # jedes Konstrukt, gezeichnet

Vorschau heißt nicht nur, dass die Verpackung fehlt: das Quellformat kann sich noch ändern, und eine heute geschriebene Abbildung braucht möglicherweise eine Anpassung, wenn es erscheint. Die Zeichnung oben ist eine von sechsunddreißig in lectures/network-security, wo die Sprache am Umfang einer echten Vorlesung erprobt wurde.

Figures you write ist die Begründung für die Sprache – was eine Vorlesungsabbildung leisten muss, woran ein Zeichenprogramm und eine Auto-Layout-Sprache dabei jeweils scheitern. Das Handbuch baut eine Abbildung Zeile für Zeile auf, führt dann jede Anweisung, die Gestaltungsregeln und ausgearbeitete Beispiele auf und zeigt den grafischen Editor, mit dem sich ein Kasten in der laufenden Folie ziehen lässt, während der Quelltext mitgeschrieben wird. Beide Seiten sind auf Englisch.

Dokumentation

  • Der Vergleich mit anderen Werkzeugen – Beamer, reveal.js, Quarto, Marp, Slidev, PowerPoint und Verwandte, in beide Richtungen, samt den Stellen, an denen psi-slides verliert. Auf Englisch.
  • Figures you write – die Begründung für die Figurensprache, die noch eine Vorschau ist: was eine Abbildung in einer Vorlesung leisten muss und woran ein Zeichenprogramm und eine Auto-Layout-Sprache dabei jeweils scheitern. Das Handbuch daneben baut eine Abbildung Zeile für Zeile auf und listet danach jede Anweisung, die Gestaltungsregeln und ausgearbeitete Beispiele. Auf Englisch.
  • Die Tutorial-Vorlesung – jedes Konstrukt des Formats im Betrieb, und daneben ihr Quelltext, der die Referenz dafür ist, wie man es schreibt. Auf Englisch.

Quellcode

github.com/UBA-PSI/psi-slides – die README-Datei erklärt das Format und sagt, wofür das Werkzeug taugt und wofür nicht. Auf Englisch.