% Patch cnltx-doc class
\AddToHook{class/scrartcl/after}{
  \NewCommandCopy{\originalAfterPackage}{\AfterPackage}
  \RenewDocumentCommand{\AfterPackage}{t! m m}{
    \IfBooleanTF{#1}{#3}{%
      \originalAfterPackage{#2}{#3}
    }
  }
}
\makeatother
\typeout{*** Patch cnltx-doc}
\documentclass[
babel-options={ngerman},
load-preamble-,
scrartcl={headings=small}
]{cnltx-doc}

\usepackage[oldstyle]{libertine}
\usepackage[scaled=.81]{DejaVuSansMono}
\usepackage{microtype}
\usepackage{enumitem}
% Since the cnltx class doesn't do examples with lualatex,
% we can't include our package.
% Thus, we use readprov to get file information.
\usepackage{readprov}
\ReadFileInfos{seatingchart.sty}

\providecommand{\packagename}{seatingchart}
\def\thepkg{\pkg*{\packagename}}
\setcnltx{
  name  = seatingchart,
  package  = \packagename,
  version  = \UseVersionOf{\packagename.sty},
  date     = \UseDateOf{\packagename.sty},
  title    = Das \thepkg-Paket,
  info     = Erstellung von Sitzplänen,
  authors  = {Matthias Werner[matthias.werner@informatik.tu-chemnitz.de]},
  abstract = {Das Paket ermöglicht es, Sitzpläne, wie sie z. B. für Prüfungen
    benötigt werden, einfach zu erstellen. Eine Reihe
    verschiedener automatischer Platzierungsschemata sind vordefiniert, 
    aber man kann auch feingranular eigene Platzierungen vornehmen.
    Während das Paket zunächst für den internen
    Gebrauch an der TU Chemnitz gedacht war und
    für (einige) der Räume der TU~Chemnitz vordefinierte Sitzlayouts enthält,
    sind jedoch einerseits sowohl die Raumdaten leicht erweiter-
    oder ersetzbar, andererseits können Räume auch
    ad hoc erstellt werden.},
  url      =https://github.com/tuc-osg/seatingchart,
  build-title
} 

\begin{document}

\section{Einführung}
Für die Durchführung von Prüfungen benötigen wir mitunter Sitzpläne.
So haben sich über die einige mit Pläne  in Form von TikZ-unterstützten
\LaTeX-Dateien angesammelt. 
Je nach Anzahl der Studierenden in einer Prüfung (und für wie groß wir die
Gefahr eines Betrugsversuches bewerten) nutzen wir unterschiedliche
Platzierungsschemata, so dass wir die Dateien in anpassen müssen.
Außerdem wird uns von Zeit zu Zeit ein neuer Raum zugewiesen, für den wir noch
keine Pläne haben.

Dies war die Motivation zur Erschaffung des \thepkg-Pakets. Es \ldots
\begin{itemize}[itemsep=0pt]
  \item ermöglicht eine schnelle und einfach Erstellung von Sitzplänen;
  \item trennt das Sitzlayout und das Platzierungsschema voneinander;
  \item bietet eine Reihe von Standardschemata für die Platzierung an;
  \item enthält bereits eine Anzahl vordefinierter Räume mit Layouts der Sitze;
  \item erlaubt eine \emph{Ad-hoc}-Erstellung neuer Räume und Platzierungsschemata.
\end{itemize}

\section{Abhängigkeiten}
Das \thepkg-Paket arbeitet nur mit Lua\LaTeX\ und benötigt eine hinreichend
moderne \LaTeX-Version, mindestens vom Juli 2022.
Es lädt folgende Pakete:
\begin{itemize}[nosep]
  \item \pkg{etoolbox} 
  \item \pkg{luacode}
  \item \pkg{tikz}
\end{itemize}
Diese Pakete sind in allen gängigen \TeX-Distributionen vorhanden und haben
wiederum andere Pakete als Abhängigkeit.
Insbesondere wird durch \pkg*{tikz} das Paket \pkg{xcolor} geladen, dessen
Farbdefinition auch in \thepkg\ verwendet werden.

\section{Sitzlayout}
\label{sec:layout}
Das Paket wird wie üblich mit
%
%\centerline{
\cs{usepackage}\oarg{optionen}\{\thepkg\}
%}
geladen.
Dabei kann bereits weitgehend das Layout der Sitze festgelegt werden, also
die Darstellung der Sitze im Raum. Die Zuweisung der Sitzbelegung erfogt später,
siehe Abschnitt~\ref{sec:seat-assignment}.

\subsection{Klassenoptionen}
\label{sec:class-options}
Durch die Nutzung bzw. Nichtnutzung der Option \option{room} werden zwei
grundsätzliche Anwendungsfälle unterschieden:
\begin{options}
  \keyval-{room}{Raum}\Default{}
  Diesen Optionsschlüssel sollte man nutzen, wenn der gewünschte
  Raum ist bereits in der Datenbank von \thepkg\ vorhanden ist.
  \keyval{layout}{Institution}\Default{tu-chemnitz}
  Die Daten für die vordefinierten Räume werden
  aus der Datei \code{seatingchart-}\meta{Institution}\code{.sc} gelesen. 
  Dieser Schlüssel kann genutzt werden, wenn eigene vordefinierte Räume deklariert
  wurden, siehe Abschnitt~\ref{sec:new-rooms}.
\end{options}
Falls der Raum noch nicht bekannt ist, werden einige Schlüssel-Wert-Paar zur
Beschreibung des Raumslayout gebraucht.
\begin{options}
  \keychoice{shape}{rectangle,arc}\Default{rectangle}
  Hier wird beschrieben, ob das Layout der Sitze rechteckig
  (\choices{rectangle}) oder bogenförmig (\choices{arc})\footnote{Z.\,B.\ an der
    TU~Chemnitz der Raum A10.316.} ist.
  \keyval-{rows}{Anzahl der Sitzreihen}\Default*!{}\vspace{-.3\baselineskip}
  \keyval-{seats per row}{Sitze pro Sitzreihe}\Default!{}
  Besimmt Anzahl der Sitzreihen und Sitze pro Reihe. Dabei muss immer von der
  jeweils maximalen Anzahl ausgegangen werden. Für unvollständige Reihen werden später Sitze
  entfernt, aber es können keine Sitze mehr zugefügt werden, die außerhalb des einmal
  festgelegten Layoutrahmens liegen. \textbf{Achtung:} Auch Gänge zwischen
  Blöcken von Sitzen müssen hier als Sitze mitgezählt werden.
\end{options}
Wenn Sie bei den Klassenoptionen \textbf{sowohl} den Schlüssel \option*{room}, \textbf{als auch}
eine der Schlüssel \option*{rows} oder \option*{seats per row} angeben, ist das Ergebnis
unbestimmt. Entsprechend wird eine Warnung ausgegeben.\medskip

Alle weiteren Klassenoptionen legen die Darstellung des Raumlayouts fest.
Sie können auch später mit \cs{scConfig} gesetzt werden, vgl.\ Abschnitt~\ref{sec:late-options}.
\begin{options}
  \keybool{blackboard}\Default{false}
  Zeichnet eine Tafel ein.
  \keyval-{seat distance}{Abstand}\Default{2pt}
  Abstand der Sitze zueinander. Damit wird auch der Reihenabstand bestimmt.
  Möchte man beides unterschiedlich haben, so muss man die beiden folgenden
  Schlüssel nutzen:
  
  \keyval-{seat neighbor distance}{Abstand}\Default*{2pt}\vspace{-.3\baselineskip}
  \keyval-{row distance}{Abstand}\Default{2pt}

  \keychoice{rownumbers}{none,left,right,both}\Default{none}
  Legt beim Rechteck-Layout fest, ob links und oder rechts der Reihen die Nummer
  der Sitzreihe angegeben wird. Dabei wird von vorn (Tafel) gezählt.\newline
  \emph{Anmerkung:} Für das bogenförmige Layout ist diese Funktion derzeit
  nicht implementiert.
  \keyval-{rownumber distance}{Abstand}\Default{2pt}
  Abstand der Reihennummern zu den äußeren Sitzen, wenn \option*{rownumbers}
  nicht \code{none} ist.
  \keyval-{empty seat background color}{Farbe}\Default*{lightgray!20}\vspace{-.3\baselineskip}
  \keyval-{empty seat border color}{Farbe}\Default*{lightgray}\vspace{-.3\baselineskip}
  \keyval-{assigned seat background color}{Farbe}\Default*{lightgray!30}\vspace{-.3\baselineskip}
  \keyval-{assigned seat border color}{Farbe}\Default{black}
  Legt die Farben für den Hintergrund und die Umrandung von leeren bzw.\ durch
  ein Sitzschema belegten Sitzen fest.
  Falls die Sitze nicht farblich unterschieden werden sollen, können auch die
  Schlüssel
  \keyval-{seat background color}{Farbe}\Default*\vspace{-.3\baselineskip}
  \keyval-{seat border color}{Farbe}\Default
  verwendet werden.
  \keyval{assigned seat label font}{Fontbefehl}\Default*{\cs*{small}}\vspace{-.3\baselineskip}
  \keyval-{assigned seat label color}{Farbe}\Default{black}
  Setzt die Größe und Farbe der Sitzbeschriftung.
\end{options}
\subsection{Späte Optionswahl}
\label{sec:late-options}
\begin{commands}
  \command{scConfig} Mit diesem Kommando können außer
  \option{room}, \option{shape}, \option{rows} und \option{seats per row} alle
  im Abschnitt~\ref{sec:class-options} genannten Schlüssel auch
  außerhalb von \cs*{documentclass}-Optionen gesetzt werden.
\end{commands}
\subsection{Modifikation des Sitzlayouts}
\label{sec:modify-layout}
Häufig ist sind nicht in jeder Reihe alle Sitze vorhanden.
Bei Angabe eine Raums ist dies bereits berücksichtigt, aber auch hier kann es
vorkommen, dass beispielsweise ein Klappsitz defekt ist und aus dem Layout
genommen werden muss.
Beim Erstellen eines eigenen Layouts ist die Modifikation die Regel.
Dafür stellt \pkg\ folgende Kommandos zur Verfügung
\begin{commands}
  \command{scRemoveSeatAt}[\marg{Reihe}\marg{Sitznummer}]
  Entfernt den Sitz \meta{Sitznummer} in der Reihe \meta{Reihe} aus dem
  Layout. Dabei beziehen sich \meta{Reihe} und \meta{Sitznummer} auf das
  vollständige Layout, ändern sich also nicht durch bereits entfernte Sitze.
  Wenn die \meta{Sitznummer} negativ ist, wird von rechts aus gezählt
  \command{scRemoveSeats}[\marg{Liste}]
  Entfernt alle in der Liste vorkommenden Sitze aus dem Layout. Die Liste enthält
  dabei kommaseparierte Einträge der Form
  \code{\{\meta{Reihe},\meta{Sitznummer}\}}. Für \meta{Reihe} und
  \meta{Sitznummer} gilt wie bei \cs*{scRemoveSeatAt} das urspüngliche Layout.
  Im folgenden Beispiel werden die ersten drei Sitze links und der erste Sitz
  rechts in der ersten Reihe entfernt:
  \begin{example}[code-only]
    \scRemoveSeats{{1,1},{1,2},{1,3}{1,-1}}
  \end{example}\vspace{-1.3\baselineskip}
  \command{scSetAisle}[\Oarg{\meta{Startreihe}-\meta{Endreihe}}\marg{Sitznummer}]
  %\Default{\meta{erste Reihe}-\meta{letzte Reihe}}
  An der Stelle von \meta{Sitznummer} wird durch alle Reihen ein Gang eingefügt. Nutzen Sie das
  optionale Argument, wenn der Gang nicht alle Reihen erfassen soll (Stichgang).
  Für horizontale Gänge (die also einen Sitzblock in einen vorderen und hinteren
  Teil zerlegen, anstatt einen rechten und einen linke) nutzen Sie bitte
  \cs*{scRemoveSeats}.
  Das ist im Prinzip auch bei vertikalen Gängen möglich, jedoch können bei der automatischen
  Sitzschemazuweisung mit \cs*{scSetAisle} erzeugte Gänge anders als die mit
  \cs*{scRemoveSeats} erzeugten Gänge behandelt werden.
\end{commands}

\subsection{Ausgabe}
\label{sec:drawing}
\begin{commands}
  
  \command{scDrawSeating}[\Oarg{seat width=\meta{Breite}, seat height=\meta{Höhe}}]
  Gibt den Sitzplan aus. Dabei versucht \thepkg, die Ausmaße der Sitz so zu
  berechnen, dass der zur Verfügung stehenden Platz des Gesamtplans vollständig
  ausgenutzt wird.
  Da damit nicht immer alle Bedürfnisse getroffen werden, können in der
  über das optionale Argument die Breite und Höhe der Sitze auf
  dem Sitzplan einzeln eingestellt werden.
\end{commands}

Das folgende Beispiel zeigt den Code und das Ergebnis für ein einfaches Sitzplanlayout
mit einem Mittelgang und zwei fehlenden Sitzen in der ersten Reihe.
\begin{example}[compile,program=lualatex,pages=1,add-frame,code-sep=\bigskip,graphics={scale=.25}]
  \documentclass{article}
  \usepackage[shape=rectangle, rows = 9, seats per row=15]{seatingchart}
  \begin{document}
    \scSetAisle{8}
    \scRemoveSeats{{1,1},{1,2}}
    \scDrawSeating
  \end{document}
\end{example}

\section{Sitzplatzbelegung}
\label{sec:seat-assignment}
\subsection{Parameter zur Konstruktion von Belegungsschemata}
\label{sec:constr-scheme}
Natürlich ist ein Sitzplan ohne die Markierung von belegten Plätzen
nur bedingt nützlich.
Die Belegung wird in \thepkg\ mit Sitzplatzschemata realisiert. 
Zur Erzeugung eines Sitzschemas gibt es den Befehl
\begin{commands}
  \command{scSeatingScheme}[\oarg{Schlüsselliste}\marg{Name}] \vspace{-1.3\baselineskip}
  \command{scSeatingScheme}[\sarg\oarg{Schlüsselliste}\marg{Schema}]
Das Pflichtargument enthält in der Standardvariante des Befehls eine Bezeichnung
für ein vorgegebenes Sitzschema, siehe Abschnitt~\ref{sec:defined-schemes}.
In der Sternvariante wird hier eine Zeichenkette von "`\code{X}"' und "`\code{-}"' übergeben,
die (den Anfang) eines Sitzschemas für eine einzelne Reihe beschreibt, wobei
"`\code{X}"' für einen belegten und "`\code{-}"' für einen leeren Platz steht. Ist die
Zeichenkette kürzer als die Anzahl der Sitze in der Reihe, wird sie wiederholt angewendet.
Reihe mehr Plätze als 
Beispielsweise wird mit
\begin{example}[code-only]
  \scSeatingScheme*{X--}
\end{example}\vspace{-1.3\baselineskip}
jeder dritte Sitz belegt.

Im optionalen Argument kann wieder eine Liste von Schlüssel-Wert-Paaren
übergeben werden, die die restlichen Einstellung für das Sitzschema steuern. Es
ist insbesondere in der Sternvariante wichtig, kann aber auch in der
Standardvariante genutzt werden. 
werden:
\begin{options}
  \keyval-{row sep}{Anzahl}\Default{2}
  Legt fest, in jeder wievielten Reihe Sitze belegt werden.
  \keyval-{start row}{Nummer}\Default*{1}\vspace{-.3\baselineskip}
  \keyval-{end row}{Nummer}\Default{\meta{Anzahl Reihen}}
  Durch diese beiden Schlüssel wird gesteuert, in welchen Reihen ein Schema
  angewendet wird. Dadurch können unterschiedliche Schemata für verschiedene
  Reihen genutzt werden.
  \keyval-{row restart after}{Anzahl}\Default
  Das Sitzschema wird nach \meta{Anzahl} Reihen zurückgesetzt. Damit wird es
  möglich, alternanierende Reihenabstände zu erzielen, vergleiche Beispiel in
  Abschnitt~\ref{sec:ex:own1}.
  \keyval-{aisle counts}{Anzahl}\Default{1}
  Legt fest, wie viele Sitze ein Gang zählt. Dadurch kann berücksichtigt werden,
  dass ein Gang häufig breiter als ein Sitzplatz ist.
  \keybool{aisle restarts scheme}\Default{false}
  Startet das Schema nach einem Gang erneut. Der Schlüssel \option*{aisle
    counts} wird damit wirkungslos.
  \keybool{ignore aisle}\Default*{false}\vspace{-.3\baselineskip}
  \keybool{ignore removed seats}\Default{false}
  Bei der Zählung von Sitzen, die im Platzlabel genutzt werden kann (vgl.\
  Abschnitt~\ref{sec:seat-label}) werden auch entfernte Sitze und Gänge
  mitgezählt.
  Dies ist sinnvoll, damit in Reihen (im Rechteck-Grundlayout) sich gleiche
  Sitznummern hintereinander befinden. Wird einer der Schlüssel gesetzt,
  werden entfernte Sitze bzw. Gänge nicht mitgezählt. Dies bietet sich
  insbesondere im Bogen-Grundlayout an.
  \keyval{assigned seat label}{Formatzeichenkette}\Default{m\{\{\string\,\}\}D}
  Über diesen Schlüssel kann festgelegt werden, wie die belegten Sitze
  beschriftet werden. Voreingestellt ist die Nummer der Reihe, gefolgt von einem
  schmalen Leerzeichen und einem Buchstaben für den laufenden belegten Sitz
  (z.\,B. "`3\,c"'). Es sind hier eine Reihe anderer Möglichkeiten
  einstellbar. Details dazu sind im Abschnitt~\ref{sec:seat-label} beschrieben.
\end{options}
\command{scConfigScheme\marg{Schlüsselliste}}
Setzt die Schlüssel wie beim optionalen Argument von \cs*{scSeatingScheme},
führt aber keine Zuweisung von Sitzen aus.
\end{commands}
Schlüsselwerte, die durch \cs*{scSeatingScheme} oder \cs*{scConfigScheme}
gesetzt werden, bleiben erhalten, bis sie explizit neu gesetzt werden.

\subsection{Vordefinierte Sitzschemata}
\label{sec:defined-schemes}
Das \thepkg-Paket definiert eine Reihe vordefinierter
Platzierungsschemata. Manche haben auch einen Alternativnamen.
\begin{options}
  \opt{1x1}
  Jeder Platz ist markiert.\newline Alternativname: \option{all}
  \opt{2x2}
  Zwischen zwei belegten Plätzen ist jeweils ein Platz bzw.\ eine Reihe
  Abstand.\newline  Alternativname: \option{simple}
  \opt{2x2-}
  Zwischen zwei belegten Plätzen ist jeweils ein freier Platz. Nach einer freien
  Reihe kommen \emph{zwei} Reihen mit belegten Plätzen. Dies ist das Schema, mit
  dem in einer Prüfung die größtmögliche Zahl an Studierenden in einem Raum
  untergebracht werden können, aber trotzdem ein seitlicher Minimalabstand
  gegeben ist und sich die Aufsicht zu jedem Studierenden kommen kann (entweder
  von vorn, oder von hinten). \newline Alternativname: \option{dense}
  \opt{2x3}
  Belegte Sitze haben einen seitlichen Abstand von zwei Sitzen und belegte
  Reihen einen Abstand von einer Leerreihe. Dies wird in unser Gruppe als das
  anzustrebende Standardschema für Prüfungen betrachtet.\newline Alternativname:
  \option{sixpack}
  \opt{2x3-}
  Die Reihen werden wie bei \option{2x2-} belegt, der seitliche Abstand
  innerhalb einer belegten Reihe beträgt jedoch zwei Sitze.
  \opt{2x4}
  Belegte Sitze haben einen seitlichen Abstand von drei Sitzen und belegte
  Reihen einen Abstand von einer Leerreihe.
  \opt{3x4}
  Belegte Sitze haben einen seitlichen Abstand von drei Sitzen und belegte
  Reihen einen Abstand von zwei Leerreihen.
\end{options}

\subsection{Sitzbeschriftung}
\label{sec:seat-label}
Die Beschriftung der zugewiesenen Sitzplätze kann auf unterschiedliche Weise
erfolgen, die durch Zuweisung einer Formatzeichenkette an den Schlüssel
\option{assigned seat label} gesteuert wird.
Es stehen dafür vier Zähler zur Verfügung:
\begin{itemize}
\item absolute Reihe: die Nummer der Reihe im Sitzlayout
\item laufende Reihe: die Nummer der \emph{belegten} Reihe. Reihen, in denen
  keine Sitz zugewiesen werden, werden hier übersprungen.
\item absolute Sitznummer: die Nummer des Sitzes im Sitzlayout. Ob hier auch
  entfernte Sitze berücksichtigt werden, hängt vom Wert des Schlüssels
  \option*{ignore removed seats} ab.
\item laufende Sitznummer: die Nummer der \emph{belegten} Sitze. Unbelegte Sitze
  werden bei der Zählung übersprungen.
\end{itemize}
Jeder dieser Zähler kann unterschiedlich formatiert werden. Dafür werden in der
Formatzeichenkette verschiedene Formatierungszeichen benutzt, die in der
folgenden Tabelle gelistet sind:\medskip

\begin{tabular}{llccccc}\hline
  \textbf{\sffamily Zähler}&\textbf{\sffamily Anmerkung}&\multicolumn{5}{c}{\textbf{\sffamily Darstellung als\ldots}}\\
      &&\rotatebox{90}{(arabische) Zahl}&\rotatebox{90}{Kleinbuchstabe}&\rotatebox{90}{Großbuchstabe}&
 \rotatebox{90}{kleine römische Zahl}&\rotatebox{90}{große römische
                           Zahl}\\\hline
  absolute Reihe&\emph{bezieht sich auf das Sitzlayout}&\code{m}&\code{a}&\code{A}&\code{y}&\code{Y}\\
  laufende Reihe&\emph{bezieht sich auf das Belegungsschema}&\code{r}&\code{b}&\code{B}&\code{i}&\code{I}\\ 
  absolute Sitznummer&\emph{bezieht sich auf das Sitzlayout}&\code{n}&\code{c}&\code{C}&\code{x}&\code{X}\\
  laufende Sitznummer&\emph{bezieht sich auf das Belegungsschema}&\code{s}&\code{d}&\code{D}&\code{j}&\code{J}\\\hline
\end{tabular}\medskip

\noindent
Teile der Beschriftung, die nicht als Formatierungszeichen interpretiert werden
sollen, werden in doppelte geschweifte Klammern gesetzt
(\code{\{\{\meta{geschützte Zeichenkette}\}\}}).
Beispielsweise erzeugt
\begin{example}[code-only]
  \scSeatingScheme[assigned seat label=Y{{-}}D]{2x3}
\end{example}\vspace{-1.3\baselineskip}
beim vierten Sitz (von links) in der dritten Reihe die Beschriftung "`III-B"'.

\subsection{Sitzplatzliste}
\label{sec:seats-list}
Insbesondere wenn es um den Anwendungsfall einer Prüfung geht, ist es nützlich,
eine Sitzplatzliste zu erhalten, also eine tabellarische Zuordnung zwischen Prüfling und Sitzplatz.
In der aktuellen Version erstellt \thepkg\ keine (\LaTeX)-Tabelle, kann aber
die Tabellenerstellung (mit \LaTeX\ oder einer Tabellenkalkulation)
unterstützen.
\begin{commands}
    \command{scSeatingList}[\oarg{Eingabedatei}\marg{Ausgabedatei}]\vspace{-1.3\baselineskip}
    \command{scSeatingList}[\sarg\oarg{Eingabedatei}\marg{Ausgabedatei}]
    Erstellt eine CVS-Datei \meta{Ausgabedatei} mit den Labels der belegten
    Plätze, jeweils einen pro Zeile.\medskip

    \framebox{\parbox{\linewidth}{
        \textbf{Achtung!}
        Die in die \meta{Ausgabedatei} geschriebenen Labeltexte werden aus den
        entsprechenden \LaTeX-Boxen extrahiert und nur die druckbaren Zeichen
        ausgegeben.
        Es empfiehlt sich bei Nutzung dieser Funkion daher, in der
        Formatzeichenkette von \option*{assigned seat label} auf zuviel
        \TeX-Magie zu verzichten.
    }}\medskip

    In der Sternvariante werden in jeder Zeile 
    die absoluten Koordinaten (Reihe, Platznummer, bezogen auf das
    Grundlayout) kommasepariert dem Labeln vorangestellt.

    Wenn eine Eingabedatei angegeben wurde, wird ihr Inhalt zweilenweise den
    erzeugten Zeilen vorangestellt. Diese Eingabedatei könnte beispielsweise die Namen
    oder/und die Immatrikulationsnummern von Studierenden enthalten, die dann in der
    Ausgabedatei den markierten Plätzen zugeordnet werden.
    Sind weniger Einträge in \meta{Eingabedatei} als Sitze belegt sind, werden
    die Felder in der Ausgabe leer gelassen.
    Wenn dagegen die Anzahl der Sitze nicht ausreicht, gibt \thepkg\ eine
    Information aus, wer nicht platziert werden konnte.
\end{commands}
\section{Beispiele}
\label{sec:examples}
Zur Demonstration des Verhaltens von \thepkg\ sind hier einige Beispiele des
Einsatzes dokumentiert.
\subsection{Dichte Belegung für den Beispielraum aus Abschnitt~\ref{sec:drawing}}
\label{sec:ex-simple}
\begin{example}[compile,program=lualatex,pages=1,add-frame,code-sep=\bigskip,graphics={scale=.25}]
  \documentclass{article}
  \usepackage[shape=rectangle, rows = 9, seats per row=15]{seatingchart}
  \begin{document}
    \scSetAisle{8}
    \scRemoveSeats{{1,1},{1,2}}
    \scSeatingScheme{2x2-}
    \scDrawSeating
  \end{document}
\end{example}
\subsection{Vordefinierter Raum, rechteckig}
\label{sec:ex:std-rect}
\begin{example}[compile,program=lualatex,pages=1,add-frame,code-sep=\bigskip,graphics={scale=.5}]
  \documentclass{scrartcl}
    % Um das Papier gut auszunutzen, nehmen wir es Landscape-Format
    % und reduzieren die Ränder
    \usepackage[a4paper,landscape,inner=10pt,outer=10pt,top=1cm,bottom=1cm]{geometry}
    \usepackage[
      room=C10.115,
      blackboard
    ]{seatingchart}

  \begin{document}
    % Standardtitelei nimmt viel Platz weg.
    \centering\textbf{\Huge\sffamily Sitzplan C10.115}\bigskip
    \scSeatingScheme{sixpack}
    \scDrawSeating
  \end{document}
\end{example}

\subsection{Vordefinierter Raum, bogenförmig}
\label{sec:ex:std-arc}
\begin{example}[compile,program=lualatex,pages=1,add-frame,code-sep=\bigskip,graphics={scale=.5}]
  \documentclass{scrartcl}
    % Um das Papier gut auszunutzen, nehmen wir es Landscape-Format
    % und reduzieren die Ränder
    \usepackage[a4paper,landscape,inner=10pt,outer=10pt,top=1cm,bottom=1cm]{geometry}
    \usepackage[
      room=A10.316,
      blackboard,
      assigned seat label color=blue
    ]{seatingchart}

   \begin{document}
     % Standardtitelei nimmt viel Platz weg.
     \centering\textbf{\Huge\sffamily Sitzplan A10.316}\bigskip
     \scSeatingScheme[ignore removed seats]{2x2}
     \scDrawSeating
   \end{document}
\end{example}
\subsection{Eigenes Platzlayout und angepasstes Sitzschema}
\label{sec:ex:own1}
\begin{example}[compile,program=lualatex,pages=1,add-frame,code-sep=\bigskip,graphics={scale=.5}]
  \documentclass{scrartcl}
    % Um das Papier gut auszunutzen, nehmen wir es Landscape-Format
    % und reduzieren die Ränder
    \usepackage[a4paper,landscape,inner=10pt,outer=10pt,top=1cm,bottom=1cm]{geometry}
    \usepackage[
      shape=rectangle, rows=9, seats per row=9,
      assigned seat background color=yellow
    ]{seatingchart}
    
    \begin{document}
      \scRemoveSeats{{1,1},{1,-1},{2,1},{2,-1},{3,1},{3,-1}}
        
      \scSeatingScheme[ignore removed seats,end row=3]{2x3}
      \scSeatingScheme[start row=5, end row=10]{2x4}
      \scDrawSeating
  \end{document}
\end{example}
\subsection{Dame}
\label{sec:ex:dame}
\begin{example}[compile,program=lualatex,pages=1,add-frame,code-sep=\bigskip,graphics={scale=.5}]
  \documentclass{scrartcl}
    \usepackage[a5paper,landscape,top=1cm,bottom=1cm]{geometry}
    \usepackage[shape=rectangle, rows=10,seats per row=10,
       assigned seat label color=blue, assigned seat background color=teal,
       empty seat background color=lime!50,
       seat distance=0pt]{seatingchart}
    \usepackage{stix}
    \begin{document}
      \centering\textbf{\Huge\sffamily Let's play Checkers}\bigskip

      \scConfigScheme{assigned seat label={}}
      \scSeatingScheme*[start row=5, end row=5]{X-}
      \scSeatingScheme*[start row=6, end row=6]{-X}
      \scConfigScheme{assigned seat label font=\Huge, assigned seat label={{{\textcolor{white}{$\circledbullet$}}}}}
      \scSeatingScheme*[start row=1, end row=3,row sep=2]{X-}
      \scSeatingScheme*[start row=2, end row=4]{-X}
      \scConfigScheme{assigned seat label={{{\textcolor{yellow}{$\circledbullet$}}}}}
      \scSeatingScheme*[start row=7, end row=9]{X-}
      \scSeatingScheme*[start row=8, end row=10]{-X}
  
      \scDrawSeating[seat width=1cm, seat height=1cm]
  \end{document}
\end{example}
\section{Deklaration neuer Raumlayouts}
\label{sec:new-rooms}
In der augenblicklichen Version hat das \thepkg-Paket erst eine relativ geringe Anzahl
von Räumen der TU~Chemnitz mit ihrem Sitzlayout erfasst.
Nutzer werden daher häufig darauf angewiesen sein, eigene Layouts anzulegen.

Neben der Möglichkeit zur Ad-hoc-Kreation von Layouts, wie sie im
Abschnitt~\ref{sec:layout} beschrieben sind, besteht auch die Möglichkeit das
Paket selbst zu erweitern und damit Layouts für neue Räume anzulegen, die dann
einfach über den \option{room}-Schlüssel angesprochen werden können.
Dazu können eigene \code{seatingchart-*.sc}-Dateien angelegt und über die
\option{layout} eingebunden werden. 

In einer \code{seatingchart-*.sc} können zwei Befehle genutzt werden:
\begin{commands}
  \command{scDeclareRoom}[\marg{Raumbezeichnung}\marg{Schlüsselliste}]
  Ein neues Raumlayout wird für den Raum \meta{Raumbezeichnung} angelegt.
  Die Schlüsselliste \emph{muss} die drei Schlüssel
  \begin{options}
    \keychoice{shape}{rectangle,arc}\Default*!{}%\vspace{-.3\baselineskip}
    \keyval-{rows}{Anzahl der Sitzreihen}\Default*!{}%\vspace{-.3\baselineskip} und
    \keyval-{seats per row}{Sitze pro Sitzreihe}\Default!{}
    enthalten, die die analoge Bedeutung zu den
    gleichnamigen Schlüsseln aus Abschnitt~\ref{sec:layout} haben.
    Diese Angaben zum Basislayout \emph{müssen} von dem Schlüssel
    \opt{init}\Default! 
    gefolgt werden.
    Anschließend kann mit
    \keyval-{aisle}{Sitznummer}\vspace{-1.3\baselineskip}
    \keyval{remove}{Liste}
    das Layout angepasst werden. Die beiden Schlüssel funktionieren analog zu
    \cs*{scSetAisle} und \cs*{scRemoveSeats}, vgl.\ Abschnitt~\ref{sec:modify-layout}.
  \end{options}
  \begin{example}[code-only]
    \scDeclareRoom{C10.115}{
      shape=rectangle,
      rows=21,
      seats per row=35,
      init,
      aisle=18,
      remove={{1,1},{1,2},{1,3},{1,4},{1,-1},{1,-2},{1,-3},{1,-4}}
    }
  \end{example}\vspace{-1.3\baselineskip}
  \command{scAliasRoom}[\marg{Aliasname}\marg{Originalname}]
  Setzt \meta{Aliasname} als einen Ersatznamen für \meta{Originalname}.  
\end{commands}
  Wenn Sie wünschen, dass eine Layoutdatei ihrer Institution Bestandteil des
  Pakets auf CTAN wird, schicken Sie bitte dem Maintainer ihre Datei oder
  initiieren Sie einen Pull-Request auf
  \url{https://github.com/tuc-osg/seatingchart}.
  Geben Sie in diesem Fall der Datei einen aussagekräftigen und
  unterscheidungsfähigen Namen. Beispielsweise
  sollte die \emph{Lummerland Maschinenbau Universität}
  eher \code{seatingchart-lummerland-mu.sc} oder
  \code{seatingchart-lummerland-machbau-uni.sc} nutzen, als
  \code{seatingchart-lmu.sc}.
  
\section{Beschränkungen und Bugs}
\label{sec:bugs}
Auch wenn das \thepkg-Paket zumindest in unserer Gruppe im praktischen Einsatz
ist, ist es als experimentell zu betrachten.
Die \code{0} in der Hauptversionsnummer deutet diesen Umstand an.
Er bedeutet insbesondere, dass sich die API noch ändern kann.

Das Pakte unterliegt einigen Einschränkungen.
Ob diese in kommenden Versionen behoben werden, steht noch nicht fest.
Das Paket ist auf die Erstellung separater Sitzpläne ausgelegt und kann daher
nicht dafür genutzt werden, mehrere Sitzpläne in einem Dokument darstellen.
Ebenfalls können keine Sitzlayouts mit versetzten Sitzreihen dargestellt werden.

Die Anzahl der vordefinierten Räume ist derzeit noch eher gering.
Es besteht die Absicht, in künftigen Patches weitere Räume der TU~Chemnitz
aufzunehmen.
Layoutdateien von anderen Institutionen sind willkommen.

Bogenförmiges Raumlayout ist bei kleineren Reihenlängen problematisch.
Bitte nutzen Sie für Bugs-Reports oder Pull-Requests GitHub:
\url{https://github.com/tuc-osg/seatingchart}.

\section{Lizenz}
Es ist erlaubt, diese Software unter den Bedingungen der \LaTeX Project Public
License (LPPL), Version 1.3c oder später, zu kopieren und zu verteilen
(\url{http://www.latex-project.org/lppl.txt}). 
\end{document}
