% !TeX program = lualatex
% karol-doc.tex — Handbuch zum Paket karol
\documentclass[11pt]{article}
\usepackage[margin=2.4cm]{geometry}
\usepackage{fontspec}
\usepackage[provide=*, ngerman]{babel}
\usepackage{robotkarol}
\usepackage{parskip}
\usepackage{listings}
\usepackage{xcolor}
\usepackage{hyperref}
\hypersetup{colorlinks, linkcolor=blue!50!black, urlcolor=blue!50!black}

\lstdefinestyle{tex}{
	language=[LaTeX]TeX, basicstyle=\ttfamily\small,
	keywordstyle=\color{blue!60!black}, commentstyle=\color{gray},
	columns=fullflexible, keepspaces=true, moretexcs={
		karolzeile,karolpaar,karolgitter,karollegende,karolsetup,
		karol,ziegel,marke,quader,wand,bbefehl,bwiederholemal,
		bwiederholesolange,bwiederholeimmer,bwenndann,bwenndannsonst,
		bluecke,bbedingung,bkommentar,baufruf,banweisung,bhauptprogramm,
		ibefehl,iaufruf,ianweisung,ikommentar,ihauptprogramm,
		iwiederholemal,iwiederholesolange,iwiederholeimmer,iwenndann,
		isonst,ibedingung,iluecke,bist,bnichtist,iist,inichtist,
		karolfigur}}
\lstset{style=tex}
\newcommand*{\pkg}[1]{\textsf{#1}}
\newcommand*{\key}[1]{\texttt{#1}}

\title{Das Paket \pkg{robotkarol}\\[2pt]
	\large Robot-Karol-Welten und Blockprogramme für Unterrichtsmaterial}
\author{Anselm Wagner\thanks{\texttt{anselm.wagner@posteo.de}}}
\date{23. August 2026 \quad Version 3.6}

\IfFileExists{hologo.sty}{\usepackage{hologo}}{\newcommand{\hologo}[1]{#1}}

\begin{document}
\maketitle

\begin{abstract}\noindent
Das Paket \pkg{robotkarol} zeichnet Welten und Blockprogramme im Stil von
\emph{Robot Karol Online} (\url{https://karol.arrrg.de/}) für
Arbeitsblätter, Präsentationen und Prüfungen. Welten können als
3D-Schrägbild oder als 2D-Draufsicht ausgegeben werden; Farben und
Formen sind der Weboberfläche nachempfunden. Einzelne Blöcke lassen
sich als Inline-Blöcke in den Fließtext setzen. Das Paket benötigt
\hologo{LuaLaTeX}\footnote{Genauer: eine Engine mit
	\texttt{\textbackslash directlua}; getestet mit LuaLaTeX.}
und expl3. \emph{English:} draws worlds and Blockly-style block
programs of the German teaching environment Robot Karol for worksheets;
3D oblique or 2D top view; single blocks can be set inline in running
text, aligned to the surrounding baseline; requires LuaLaTeX.
\end{abstract}

\tableofcontents

\section{Schnellstart}

\begin{lstlisting}
\usepackage{robotkarol}   % Kompilierung mit LuaLaTeX
\end{lstlisting}

\begin{minipage}[c]{0.52\textwidth}
\begin{lstlisting}
\begin{karolwelt}[breite=5, laenge=3]
  \karol[x=1, y=2, richtung=osten]
  \ziegel[x=2, y=2, bisx=4]
  \marke[x=5, y=2]
\end{karolwelt}
\end{lstlisting}
\end{minipage}\hfill
\begin{minipage}[c]{0.44\textwidth}
\begin{karolwelt}[breite=5, laenge=3, skalierung=0.85]
	\karol[x=1, y=2, richtung=osten]
	\ziegel[x=2, y=2, bisx=4]
	\marke[x=5, y=2]
\end{karolwelt}
\end{minipage}

\section{Die Umgebung \texttt{karolwelt}}

\begin{lstlisting}
\begin{karolwelt}[<Schlüssel>]
  <Objekte>
\end{karolwelt}
\end{lstlisting}

\subsection{Koordinatensystem}

Die Koordinaten folgen Robot Karol Online: \key{x} zählt die
\emph{Spalten} von links (1 bis \key{breite}), \key{y} die
\emph{Zeilen von hinten} (1 bis \key{laenge}). In der 2D-Draufsicht
ist die Zeile $y=1$ folglich die \emph{oberste} Zeile; in der
3D-Ansicht liegt sie am weitesten hinten. \key{hoehe} bezeichnet wie
in Karol Online die \emph{Raumhöhe} (Anzahl Ziegellagen bis zum
oberen Rahmen) und wirkt nur auf den 3D-Rahmen.

\subsection{Schlüssel der Umgebung}

\begin{tabular}{@{}llp{7.6cm}@{}}
\key{breite} & 5 & Anzahl Spalten \\
\key{laenge} & 5 & Anzahl Zeilen \\
\key{hoehe} & 6 & Raumhöhe des 3D-Rahmens in Ziegellagen \\
\key{ansicht} & \key{3d} & \key{3d} (Schrägbild) oder \key{2d}
	(Draufsicht) \\
\key{skalierung} & 1 & Skalierungsfaktor des Bildes \\
\key{titel} & & Beschriftung über dem Bild \\
\key{hinweis} & & kursiver Hinweis unter dem Bild \\
\end{tabular}

\subsection{Objekte}

Alle Objekte werden über Schlüssel platziert. \key{bisx}/\key{bisy}
(auch \key{bisX}/\key{bisY}) füllen rechteckige Bereiche.

\begin{lstlisting}
\karol[x=1, y=1, richtung=osten]  % genau einmal je Welt
\ziegel[x=2, y=3, anzahl=4]       % Stapel aus 4 Ziegeln
\ziegel[x=1, y=5, bisx=5]         % Reihe einzelner Ziegel
\marke[x=3, y=3]                  % gelbe Marke
\marke[x=5, y=1, farbe=cyan!60]   % Marke in eigener Farbe
\quader[x=4, y=1, bisy=5]         % Quaderwand; \wand = Synonym
\end{lstlisting}

\key{richtung} akzeptiert \key{osten}, \key{westen}, \key{norden} und
\key{sueden} sowie die Synonyme \key{rechts}, \key{links},
\key{hinten} bzw.\ \key{oben} und \key{vorn}, \key{vorne} bzw.\
\key{unten} (Vorgabe: \key{sueden}). Marken liegen stets \emph{oben auf} dem
Ziegelstapel ihrer Zelle; Karol steht auf Stapel und Marke.

\subsection{Beispiel in beiden Ansichten}

\begin{center}
\begin{karolwelt}[breite=4, laenge=4, skalierung=0.8,
		titel={3D-Ansicht}]
	\karol[x=1, y=4, richtung=osten]
	\ziegel[x=2, y=4]\ziegel[x=3, y=4, anzahl=2]
	\ziegel[x=4, y=4, anzahl=3]\ziegel[x=4, y=3, anzahl=4]
	\ziegel[x=4, y=2, anzahl=5]\ziegel[x=4, y=1, anzahl=6]
	\ziegel[x=3, y=1, anzahl=7]\ziegel[x=2, y=1, anzahl=8]
	\ziegel[x=1, y=1, anzahl=9]
	\marke[x=1, y=1]
\end{karolwelt}
\qquad
\begin{karolwelt}[breite=4, laenge=4, ansicht=2d,
		titel={2D-Ansicht}]
	\karol[x=1, y=4, richtung=osten]
	\ziegel[x=2, y=4]\ziegel[x=3, y=4, anzahl=2]
	\ziegel[x=4, y=4, anzahl=3]\ziegel[x=4, y=3, anzahl=4]
	\ziegel[x=4, y=2, anzahl=5]\ziegel[x=4, y=1, anzahl=6]
	\ziegel[x=3, y=1, anzahl=7]\ziegel[x=2, y=1, anzahl=8]
	\ziegel[x=1, y=1, anzahl=9]
	\marke[x=1, y=1]
\end{karolwelt}
\end{center}

In der 2D-Ansicht zeigen Zahlen die Stapelhöhe; Ziegelzellen sind
rosa, Standard-Marken ein gelbgrünes Kreuz, gefärbte Marken
vollflächig in ihrer Farbe, Quader grau, Karol ist der
schwarze Richtungskeil.

\section{Einzeilige Welten: \texttt{\textbackslash karolzeile}}

Für schnelle eindimensionale Welten gibt es die kompakte
Zeichenketten-Notation (bis Version 2.x hieß das Kommando
\texttt{\textbackslash karolwelt}). Gezeichnet wird mit denselben
Bausteinen wie in der Umgebung \texttt{karolwelt}: gleiche Projektion,
gleiches Bodengitter, gleiche Ziegel, Marken, Quader und derselbe
Avatar. Eine Zeilen-Welt ist damit optisch nichts anderes als eine
\texttt{karolwelt} mit \key{laenge}\,=\,1 -- nur die Eingabe ist kürzer.

\begin{center}
\begin{tabular}{@{}c@{\qquad}l@{}}
\karolzeile[skalierung=0.8]{> Z 2 {2M} {3>} M Q} &
\begin{minipage}[c]{6.6cm}
\begin{lstlisting}
\karolzeile{> Z 2 {2M} {3>} M Q}
\end{lstlisting}
\end{minipage}
\end{tabular}
\end{center}

\begin{tabular}{@{}ll@{}}
\verb|> < ^ v| & Karol mit Blickrichtung \\
\verb|.| & leeres Feld \\
\verb|Z|, \verb|2|\,…\,\verb|9| & Ziegel bzw.\ Stapel \\
\verb|M|, \verb|Q| & Marke, Quader \\
\verb|{...}| & mehrere Objekte auf einem Feld, von unten nach
	oben: \verb|{M>}|, \verb|{2M}|, \verb|{3>}| \\
\end{tabular}

\subsection{Schlüssel}

\begin{tabular}{@{}lll@{}}
\key{skalierung} & 1 & Skalierungsfaktor des Bildes \\
\key{nummern} & \texttt{true} & Feldnummern anzeigen \\
\key{titel} & --- & Zeile über dem Bild \\
\key{hinweis} & --- & kursive Zeile unter dem Bild \\
\key{hervorheben} & --- & Komma-Liste von Feldnummern \\
\key{rahmen} & \texttt{false} & Raumrahmen wie in \texttt{karolwelt} \\
\key{hoehe} & 3 & Raumhöhe des Rahmens in Ziegellagen \\
\end{tabular}

Die \textbf{Feldnummern} stehen vor der vordersten Gitterkante und nicht
auf dem Feld: im Schrägbild würde sie sonst jeder Ziegelstapel verdecken.
\key{hervorheben} zeichnet einen magentafarbenen Rahmen knapp außerhalb
des Feldes und färbt dessen Nummer mit -- ein roter Rahmen wäre neben den
reinroten Ziegelkanten nicht zu erkennen (Farbe: \key{hervorfarbe}).
Den Raumrahmen zeichnet \verb|\karolzeile| nur auf Wunsch; für eine
einzelne Reihe ist er meist zu wuchtig.

\begin{center}
\karolzeile[skalierung=0.8, hervorheben={1,4}]{> Z 2 {2M} M Q .}
\qquad
\karolzeile[skalierung=0.8, rahmen, hoehe=3]{> Z 2 {2M} M Q .}
\end{center}

Dazu gibt es

\begin{tabular}{@{}lp{7.4cm}@{}}
\verb|\karolpaar[keys][keys2]{vorher}{nachher}| & Vorher-nachher-Paar;
	\texttt{keys} gilt für beide Bilder, \texttt{keys2} nur für
	„nachher" \\
\verb|\karolgitter[keys]{n}| & leeres Gitter aus $n$ Feldern \\
\verb|\karollegende| & Standardlegende der Weltsymbole \\
\verb|\karollegendenitem{Welt}{Text}| & einzelner Legendeneintrag \\
\end{tabular}

\section{Blockprogramme}

Die Umgebung \texttt{karolbloecke} stapelt Blockly-Blöcke; Farben und
Formen entsprechen der Karol-Online-Oberfläche.

\begin{center}
\begin{minipage}[c]{0.56\textwidth}
\begin{lstlisting}
\begin{karolbloecke}
  \bwiederholesolange{NichtIstWand}{%
    \bwenndann{IstZiegel}{%
      \bbefehl[1]{Aufheben}}
    \bbefehl[1]{Schritt}}
\end{karolbloecke}
\end{lstlisting}
\end{minipage}\hfill
\begin{minipage}[c]{0.40\textwidth}
\begin{karolbloecke}[skalierung=0.9]
	\bwiederholesolange{NichtIstWand}{%
		\bwenndann{IstZiegel}{%
			\bbefehl[1]{Aufheben}}
		\bbefehl[1]{Schritt}}
\end{karolbloecke}
\end{minipage}
\end{center}

\begin{tabular}{@{}lp{8.2cm}@{}}
\verb|\bbefehl[n]{Name}| & Anweisung (violett); optionale Zahl als
	Pille \\
\verb|\bwiederholemal{n}{...}| & Zählschleife \\
\verb|\bwiederholesolange{Bed}{...}| & kopfgesteuerte Schleife \\
\verb|\bwiederholeimmer{...}| & Endlosschleife \\
\verb|\bwenndann{Bed}{...}| & einseitige Verzweigung \\
\verb|\bwenndannsonst{Bed}{...}{...}| & zweiseitige Verzweigung \\
\verb|\bbedingung{IstZiegel}| & Bedingung mit linkem Stecker; auch
	im Fließtext; leeres Argument = weißer Leersockel \\
\verb|\bist{Norden}| & Himmelsrichtung als Auswahlmenü \\
\verb|\bnichtist{Norden}| & dasselbe verneint \\
\verb|\bluecke[Breite]| & gestrichelter Geisterblock \\
\verb|\bkommentar{Text}| & Kommentar (khaki, \texttt{//}) \\
\verb|\baufruf[n]{Name}| & Aufruf einer eigenen Anweisung (rot) \\
\verb|\banweisung{Name}{...}| & Definition einer eigenen Anweisung \\
\verb|\bhauptprogramm| & Hauptprogramm-Hut \\
\end{tabular}

\subsection{Himmelsrichtungen}

Die acht Blöcke \verb|Ist|\,/\,\verb|NichtIst| zeigen die Richtung in
Robot Karol Online nicht als Text, sondern als Auswahlmenü: eine helle
Pille mit Auswahldreieck. \verb|\bist{...}| und \verb|\bnichtist{...}|
bilden das nach und nehmen die Richtung als Argument.

\begin{center}
\begin{karolbloecke}[skalierung=0.9]\bist{Norden}\end{karolbloecke}\quad
\begin{karolbloecke}[skalierung=0.9]\bnichtist{Westen}\end{karolbloecke}
\end{center}

Für sich allein ergeben sie ein vollständiges Bedingungsplättchen. Als
Argument eines Kontrollblocks steuern sie nur dessen Beschriftung bei --
das Plättchen baut dort wie gewohnt \verb|\bbedingung|:

\begin{center}
\begin{minipage}[c]{0.52\textwidth}
\begin{lstlisting}
\bwenndann{\bist{Norden}}{%
  \bbefehl{Schritt}}
\end{lstlisting}
\end{minipage}\hfill
\begin{minipage}[c]{0.44\textwidth}
\begin{karolbloecke}[skalierung=0.9]
	\bwenndann{\bist{Norden}}{%
		\bbefehl{Schritt}}
\end{karolbloecke}
\end{minipage}
\end{center}

Dasselbe Auswahldreieck trägt der Aufrufblock \verb|\baufruf|: dort
wählt man in der Oberfläche die aufzurufende Anweisung aus. Die
Definition \verb|\banweisung| zeigt den Namen dagegen in einer Pille
ohne Dreieck.

\begin{center}
\begin{karolbloecke}[skalierung=0.9]
	\banweisung{TueEtwas}{\bbefehl[1]{Schritt}}
\end{karolbloecke}\qquad
\begin{karolbloecke}[skalierung=0.9]\baufruf{TueEtwas}\end{karolbloecke}
\end{center}

Beispiel Lückenaufgabe mit Leersockel und Geisterblock:

\begin{center}
\begin{karolbloecke}[skalierung=0.9]
	\bwiederholesolange{}{%
		\bluecke
		\bbefehl[1]{Schritt}}
\end{karolbloecke}
\end{center}

\section{Inline-Blöcke im Fließtext}

Die \verb|\i...|-Kommandos setzen genau \emph{einen} Block in die
laufende Zeile. Die Textgrundlinie des Blocks liegt dabei exakt auf der
Grundlinie des umgebenden Textes, und die Beschriftung übernimmt dessen
Schriftgröße; Kerbe, Nase und Innenabstände sind flacher als im Stapel,
damit die Blockhöhe der Zeilenhöhe nahekommt.

\begin{lstlisting}
Mit \iwenndann{IstZiegel} prüft Karol, ob ein Ziegel vor ihm liegt;
\iwiederholemal{5} wiederholt fünfmal, \ibefehl{Schritt} geht weiter.
\end{lstlisting}

\noindent
Mit \iwenndann{IstZiegel} prüft Karol, ob ein Ziegel vor ihm liegt;
\iwiederholemal{5} wiederholt fünfmal, \ibefehl{Schritt} geht weiter.

\medskip\noindent
{\sloppy
Blöcke, die im Stapel mehrzeilig wären -- Schleifen, Verzweigungen und
eigene Anweisungen --, erscheinen inline \textbf{nur mit ihrem Kopf}.
\verb|\iwenndann{IstZiegel}| ergibt also den Block \iwenndann{IstZiegel}
ohne Rumpf. Für echte Rümpfe bleibt die Umgebung \texttt{karolbloecke}
zuständig.\par}

% Inline-Blöcke sind höher als eine normale Textzeile: Zeilen strecken.
\begingroup\renewcommand{\arraystretch}{1.45}
\begin{tabular}{@{}lp{8.2cm}@{}}
\verb|\ibefehl[n]{Name}| & Anweisung \ibefehl[3]{Schritt} \\
\verb|\iaufruf[n]{Name}| & Aufruf einer eigenen Anweisung \\
\verb|\ianweisung{Name}| & Kopf einer eigenen Anweisung \\
\verb|\ikommentar{Text}| & Kommentar \\
\verb|\ihauptprogramm| & Hauptprogramm-Hut \\
\verb|\iwiederholemal{n}| & Kopf der Zählschleife \iwiederholemal{5} \\
\verb|\iwiederholesolange{Bed}| & Kopf der kopfgesteuerten Schleife \\
\verb|\iwiederholeimmer| & Kopf der Endlosschleife \\
\verb|\iwenndann{Bed}| & Kopf der Verzweigung \\
\verb|\isonst| & sonst-Balken \isonst{} \\
\verb|\ibedingung{Bed}| & Bedingung \ibedingung{IstMarke} \\
\verb|\iist{Norden}| & Himmelsrichtung \iist{Norden} \\
\verb|\inichtist{Norden}| & verneint \inichtist{Osten} \\
\verb|\iluecke[Breite]| & Geisterblock \iluecke{} \\
\end{tabular}
\endgroup

\medskip\noindent
Die \verb|\b...|-Kommandos erkennen den Fließtext selbst und setzen dort
ebenfalls inline; die \verb|\i...|-Fassungen ersparen nur die leeren
Rumpf-Argumente und erzwingen den Modus auch im Stapel.

Inline-Blöcke sind breite, unzerbrechliche Kästen. In schmalen Spalten
kann \hologo{TeX} sie nicht immer umbrechen -- dann hilft
\verb|\sloppy| oder eine höhere \verb|\tolerance| für den Absatz.

\section{Text-Programme und Struktogramme}

Die Umgebung \texttt{karolcode} setzt Karol-Quelltext mit
Syntaxhervorhebung (\pkg{listings}); \verb|\kb{...}| und
\verb|\kw{...}| formatieren Bezeichner und Schlüsselwörter im
Fließtext. Für Struktogramme lädt das Paket \pkg{struktex} und
ergänzt \verb|\leeranweisung| sowie \verb|\stklucke[Breite]|.

\section{Globale Einstellungen: \texttt{\textbackslash karolsetup}}

\begin{lstlisting}
\karolsetup{feldbreite=8.4mm, befehlfarbe={RGB}{116,91,165}, ...}
\end{lstlisting}

\subsection{Schriften}\label{sec:schriften}

Die Oberfläche von Robot Karol Online setzt ihre Beschriftungen in
\emph{Noto Sans} und den Programmtext des Editors in \emph{Hack}. Das
Paket tut das seit v3.6 ebenso: Beschriftungen der Blöcke, Feldnummern
und Stapelzahlen erscheinen in Noto Sans, \texttt{karolcode} sowie
\verb|\kb| und \verb|\kw| in Hack. Dafür lädt das Paket
\pkg{fontspec}. Noto Sans liegt in \TeX\ Live; Hack nicht -- ist es im
System installiert, wird es benutzt, sonst DejaVu Sans Mono, aus dessen
Vorläufer Hack hervorgegangen ist. Welche der beiden es geworden ist,
steht in der \texttt{.log}-Datei.

Wer die Schriften des eigenen Dokuments übernehmen will -- oder
\pkg{fontspec} nicht geladen haben möchte --, lädt das Paket mit

\begin{lstlisting}
\usepackage[schrift=dokument]{robotkarol}
\end{lstlisting}

\noindent
Dann benutzt das Paket \verb|\sffamily| und \verb|\ttfamily| des
Dokuments; die Ausgabe ist Zeichen für Zeichen dieselbe wie bis v3.5.
Umschalten geht auch mitten im Dokument, in einer Gruppe nur dort:

\begin{tabular}{@{}ll@{}}
\key{schrift=karol} & Noto Sans und Hack (Vorgabe) \\
\key{schrift=dokument} & \verb|\sffamily| und \verb|\ttfamily| des Dokuments \\
\key{textschrift=\{...\}} & eigene Schrift für Beschriftungen \\
\key{codeschrift=\{...\}} & eigene Schrift für Programmtext \\
\end{tabular}

\noindent
Die beiden letzten Schlüssel nehmen den Umschaltbefehl selbst:

\begin{lstlisting}
\karolsetup{textschrift={\fontspec{Fira Sans}}}
\end{lstlisting}

\noindent
Ein \verb|\karolsetup{schrift=karol}| in einem Dokument, das mit
\key{schrift=dokument} geladen wurde, ist wirkungslos (mit Warnung) --
die Schriften sind dann gar nicht geladen.

Titel und Hinweis einer Welt bleiben absichtlich in der Schrift des
Dokuments: sie sind Text des Dokuments, keine Beschriftung der
Zeichnung. Für eigenen Text in der Paketschrift gibt es die Umschalter
\verb|\karolschrift| und \verb|\karolcodeschrift|.

\subsection{Weltfarben}

Sie wirken auf \verb|\karolzeile| \emph{und} die Umgebung
\texttt{karolwelt}, die dieselben Bausteine zeichnen.

\begin{tabular}{@{}lll@{}}
\key{feldbreite} & 8.4\,mm & Zell-/Feldbreite aller Welten \\
\key{ziegelfarbe} & reines Rot & Lagenkante; Körper daraus abgeleitet
	(\texttt{!59!black}) \\
\key{ziegelkoerperfarbe} & 150,8,8 & nur die Ziegelflächen \\
\key{ziegelkantenfarbe} & 255,0,0 & nur die Lagenkanten \\
\key{markenfarbe} & 250,205,60 & Markenplatte \\
\key{quaderfarbe} & 128,128,128 & Quader\,/\,Wand \\
\key{bodenfarbe}, \key{gitterfarbe} & 45,45,215 & Bodengitter \\
\key{hervorfarbe} & 226,0,122 & \key{hervorheben} \\
\end{tabular}

\subsection{Figur der Welten}

Das Paket bringt zwei Figuren mit: \key{karol} (Vorgabe) und
\key{emma} mit langem Haar und einer Blume in der Hand. Umgeschaltet
wird mit

\begin{lstlisting}
\karolfigur{emma}           % gleichwertig: \karolsetup{figur=emma}
\end{lstlisting}

\noindent
Die Einstellung wirkt auf \verb|\karolzeile| \emph{und} die Umgebung
\texttt{karolwelt}; in einer Gruppe gesetzt gilt sie nur dort.

\begin{center}
\begin{tabular}{@{}c@{\qquad}c@{}}
\karolzeile[nummern=false, skalierung=1.1]{> ^ < v} &
{\karolfigur{emma}\karolzeile[nummern=false, skalierung=1.1]{> ^ < v}} \\[2pt]
\texttt{karol} & \texttt{emma} \\
\end{tabular}
\end{center}

Emma ist aus derselben Figur gebaut wie Karol -- sie ist ein Nachbau,
keine Kopie. Ihre Farben heißen \key{karolEmmaShirt},
\key{karolEmmaHaar}, \key{karolEmmaBluete} und \key{karolEmmaStiel} und
lassen sich mit \verb|\colorlet| ändern.

\subsection{Blockfarben}

\begin{tabular}{@{}lll@{}}
\key{befehlfarbe} & 116,91,165 & Anweisungsblöcke \\
\key{schleifenfarbe}, \key{verzweigungfarbe} & 91,165,91 &
	grüne Kontrollblöcke \\
\key{bedingungfarbe} & 91,128,165 & Bedingungen \\
\key{anweisungfarbe} & 165,91,98 & eigene Anweisungen \\
\key{kommentarfarbe} & 165,150,91 & Kommentare \\
\key{hutfarbe} & 130,123,117 & Hauptprogramm-Hut \\
\end{tabular}

Die Blockfarben sind aus der Karol-Online-Oberfläche übernommen.

\section{Hinweise und Migration}

\begin{itemize}
\item Das Paket benötigt \textbf{LuaLaTeX}.
\item Bis v2.x hieß das Zeichenketten-Kommando
	\texttt{\textbackslash karolwelt}; ab v3.0 heißt es
	\texttt{\textbackslash karolzeile}, der Name \texttt{karolwelt}
	bezeichnet die neue Umgebung. Bestehende Dokumente: einfaches
	Suchen/Ersetzen.
\item Die kurzen Objektnamen \verb|\karol|, \verb|\ziegel|,
	\verb|\marke|, \verb|\quader| und \verb|\wand| sind nur
	\emph{innerhalb} der Umgebung \texttt{karolwelt} belegt. Ein
	Dokument darf sie also selbst verwenden -- außerhalb der Umgebung
	behalten sie ihre eigene Bedeutung.
\item Vorgegeben ist die Figur \key{karol}. In v3.5 war für kurze Zeit
	\key{emma} die Vorgabe; wer sie behalten will, schreibt in die
	Präambel ein \verb|\karolfigur{emma}|.
\item Seit v3.6 setzt das Paket seine Beschriftungen in den Schriften
	von Robot Karol Online und lädt dafür \pkg{fontspec}. Wer die
	bisherige Ausgabe will, lädt es mit der Paketoption
	\key{schrift=dokument} -- siehe Abschnitt~\ref{sec:schriften}.
\end{itemize}

\section*{Lizenz}

\pkg{robotkarol} steht unter der \LaTeX{} Project Public License,
Version 1.3c oder später (\url{https://www.latex-project.org/lppl.txt}),
mit dem Wartungsstatus \emph{maintained}. Copyright \copyright{} 2026
Anselm Wagner.

Farben und Proportionen sind aus der Oberfläche von \emph{Robot Karol
Online} gemessen und mit \pkg{TikZ} nachgebaut; es wurden keine Grafiken
übernommen.

\end{document}
