{-# LANGUAGE OverloadedStrings #-}

-- |
-- Module      : Docs.ExampleDoc
-- Description : Definition of an Example Document
-- License     : AGPL-3
-- Maintainer  : stu235271@mail.uni-kiel.de
--               stu236925@mail.uni-kiel.de
--
-- This module contains the definition of an example document.
module Docs.ExampleDoc (exampleTree) where

import Data.Text (Text, unlines)
import Language.Ltml.Common (Flagged (Flagged))
import Language.Ltml.Tree
    ( FlaggedInputTree'
    , Tree (Leaf, Tree)
    , TypedInputTree'
    , TypedTree (TypedTree)
    )
import Prelude hiding (unlines)

-- | Example tree for an example document
exampleTree :: FlaggedInputTree'
exampleTree :: FlaggedInputTree'
exampleTree =
    Bool -> TypedTree Bool (Maybe Text) Text -> FlaggedInputTree'
forall flag a. flag -> a -> Flagged flag a
Flagged Bool
False (TypedTree Bool (Maybe Text) Text -> FlaggedInputTree')
-> TypedTree Bool (Maybe Text) Text -> FlaggedInputTree'
forall a b. (a -> b) -> a -> b
$
        KindName
-> TypeName
-> Tree Bool (Maybe Text) Text
-> TypedTree Bool (Maybe Text) Text
forall flag a b.
KindName -> TypeName -> Tree flag a b -> TypedTree flag a b
TypedTree KindName
"document-container" TypeName
"fpo-container" (Tree Bool (Maybe Text) Text -> TypedTree Bool (Maybe Text) Text)
-> Tree Bool (Maybe Text) Text -> TypedTree Bool (Maybe Text) Text
forall a b. (a -> b) -> a -> b
$
            Maybe Text -> [FlaggedInputTree'] -> Tree Bool (Maybe Text) Text
forall flag a b. a -> [FlaggedTree flag a b] -> Tree flag a b
Tree (Text -> Maybe Text
forall a. a -> Maybe a
Just Text
header) (FlaggedInputTree'
mainDocTree FlaggedInputTree' -> [FlaggedInputTree'] -> [FlaggedInputTree']
forall a. a -> [a] -> [a]
: [FlaggedInputTree']
appTrees)
  where
    header :: Text
    header :: Text
header =
        [Text] -> Text
unlines
            [ Text
"// Document container header."
            , Text
"// The order of entries is fixed (TODO)."
            , Text
""
            , Text
"pdf-title: Beispieltitel"
            , Text
""
            , Text
"// Name of the institution here."
            , Text
"header-footer-supertitle: Universität BeispielStadt"
            , Text
""
            , Text
"header-footer-title: FPO Beispiel 2025"
            , Text
""
            , Text
"header-footer-date: 2025-08-26"
            ]

mainDocTree :: FlaggedInputTree'
mainDocTree :: FlaggedInputTree'
mainDocTree =
    Bool -> TypedTree Bool (Maybe Text) Text -> FlaggedInputTree'
forall flag a. flag -> a -> Flagged flag a
Flagged Bool
False (TypedTree Bool (Maybe Text) Text -> FlaggedInputTree')
-> TypedTree Bool (Maybe Text) Text -> FlaggedInputTree'
forall a b. (a -> b) -> a -> b
$
        KindName
-> TypeName
-> Tree Bool (Maybe Text) Text
-> TypedTree Bool (Maybe Text) Text
forall flag a b.
KindName -> TypeName -> Tree flag a b -> TypedTree flag a b
TypedTree KindName
"document" TypeName
"fpo-maindoc" (Tree Bool (Maybe Text) Text -> TypedTree Bool (Maybe Text) Text)
-> Tree Bool (Maybe Text) Text -> TypedTree Bool (Maybe Text) Text
forall a b. (a -> b) -> a -> b
$
            Maybe Text -> [FlaggedInputTree'] -> Tree Bool (Maybe Text) Text
forall flag a b. a -> [FlaggedTree flag a b] -> Tree flag a b
Tree
                (Text -> Maybe Text
forall a. a -> Maybe a
Just Text
heading)
                [FlaggedInputTree'
forall {flag} {a}. Flagged Bool (TypedTree flag a Text)
introTree, FlaggedInputTree'
mainBodyTree, FlaggedInputTree'
forall {flag} {a}. Flagged Bool (TypedTree flag a Text)
extroTree]
  where
    heading :: Text
heading =
        [Text] -> Text
unlines
            [ Text
"// Only the document's heading is permitted here."
            , Text
"! Beispiel-Überschrift"
            ]

    introTree :: Flagged Bool (TypedTree flag a Text)
introTree =
        Bool
-> TypedTree flag a Text -> Flagged Bool (TypedTree flag a Text)
forall flag a. flag -> a -> Flagged flag a
Flagged Bool
False (TypedTree flag a Text -> Flagged Bool (TypedTree flag a Text))
-> TypedTree flag a Text -> Flagged Bool (TypedTree flag a Text)
forall a b. (a -> b) -> a -> b
$
            KindName -> TypeName -> Tree flag a Text -> TypedTree flag a Text
forall flag a b.
KindName -> TypeName -> Tree flag a b -> TypedTree flag a b
TypedTree KindName
"document-intro" TypeName
"" (Tree flag a Text -> TypedTree flag a Text)
-> Tree flag a Text -> TypedTree flag a Text
forall a b. (a -> b) -> a -> b
$
                Text -> Tree flag a Text
forall flag a b. b -> Tree flag a b
Leaf Text
introText

    mainBodyTree :: FlaggedInputTree'
mainBodyTree =
        Bool -> TypedTree Bool (Maybe Text) Text -> FlaggedInputTree'
forall flag a. flag -> a -> Flagged flag a
Flagged Bool
False (TypedTree Bool (Maybe Text) Text -> FlaggedInputTree')
-> TypedTree Bool (Maybe Text) Text -> FlaggedInputTree'
forall a b. (a -> b) -> a -> b
$
            KindName
-> TypeName
-> Tree Bool (Maybe Text) Text
-> TypedTree Bool (Maybe Text) Text
forall flag a b.
KindName -> TypeName -> Tree flag a b -> TypedTree flag a b
TypedTree KindName
"document-mainbody" TypeName
"fpo-mainbody-simple" (Tree Bool (Maybe Text) Text -> TypedTree Bool (Maybe Text) Text)
-> Tree Bool (Maybe Text) Text -> TypedTree Bool (Maybe Text) Text
forall a b. (a -> b) -> a -> b
$
                Maybe Text -> [FlaggedInputTree'] -> Tree Bool (Maybe Text) Text
forall flag a b. a -> [FlaggedTree flag a b] -> Tree flag a b
Tree
                    Maybe Text
forall a. Maybe a
Nothing
                    [ Bool -> TypedTree Bool (Maybe Text) Text -> FlaggedInputTree'
forall flag a. flag -> a -> Flagged flag a
Flagged Bool
True TypedTree Bool (Maybe Text) Text
sectionOne
                    , Bool -> TypedTree Bool (Maybe Text) Text -> FlaggedInputTree'
forall flag a. flag -> a -> Flagged flag a
Flagged Bool
True TypedTree Bool (Maybe Text) Text
sectionTwo
                    , Bool -> TypedTree Bool (Maybe Text) Text -> FlaggedInputTree'
forall flag a. flag -> a -> Flagged flag a
Flagged Bool
True TypedTree Bool (Maybe Text) Text
sectionThree
                    ]

    extroTree :: Flagged Bool (TypedTree flag a Text)
extroTree =
        Bool
-> TypedTree flag a Text -> Flagged Bool (TypedTree flag a Text)
forall flag a. flag -> a -> Flagged flag a
Flagged Bool
False (TypedTree flag a Text -> Flagged Bool (TypedTree flag a Text))
-> TypedTree flag a Text -> Flagged Bool (TypedTree flag a Text)
forall a b. (a -> b) -> a -> b
$
            KindName -> TypeName -> Tree flag a Text -> TypedTree flag a Text
forall flag a b.
KindName -> TypeName -> Tree flag a b -> TypedTree flag a b
TypedTree KindName
"document-extro" TypeName
"" (Tree flag a Text -> TypedTree flag a Text)
-> Tree flag a Text -> TypedTree flag a Text
forall a b. (a -> b) -> a -> b
$
                Text -> Tree flag a Text
forall flag a b. b -> Tree flag a b
Leaf Text
extroText

appTrees :: [FlaggedInputTree']
appTrees :: [FlaggedInputTree']
appTrees = [FlaggedInputTree'
appendixTree, FlaggedInputTree'
attachmentsTree]

appendixTree :: FlaggedInputTree'
appendixTree :: FlaggedInputTree'
appendixTree =
    Bool -> TypedTree Bool (Maybe Text) Text -> FlaggedInputTree'
forall flag a. flag -> a -> Flagged flag a
Flagged Bool
False (TypedTree Bool (Maybe Text) Text -> FlaggedInputTree')
-> TypedTree Bool (Maybe Text) Text -> FlaggedInputTree'
forall a b. (a -> b) -> a -> b
$
        KindName
-> TypeName
-> Tree Bool (Maybe Text) Text
-> TypedTree Bool (Maybe Text) Text
forall flag a b.
KindName -> TypeName -> Tree flag a b -> TypedTree flag a b
TypedTree KindName
"appendix-section" TypeName
"appendix" (Tree Bool (Maybe Text) Text -> TypedTree Bool (Maybe Text) Text)
-> Tree Bool (Maybe Text) Text -> TypedTree Bool (Maybe Text) Text
forall a b. (a -> b) -> a -> b
$
            Maybe Text -> [FlaggedInputTree'] -> Tree Bool (Maybe Text) Text
forall flag a b. a -> [FlaggedTree flag a b] -> Tree flag a b
Tree Maybe Text
forall a. Maybe a
Nothing []

attachmentsTree :: FlaggedInputTree'
attachmentsTree :: FlaggedInputTree'
attachmentsTree =
    Bool -> TypedTree Bool (Maybe Text) Text -> FlaggedInputTree'
forall flag a. flag -> a -> Flagged flag a
Flagged Bool
False (TypedTree Bool (Maybe Text) Text -> FlaggedInputTree')
-> TypedTree Bool (Maybe Text) Text -> FlaggedInputTree'
forall a b. (a -> b) -> a -> b
$
        KindName
-> TypeName
-> Tree Bool (Maybe Text) Text
-> TypedTree Bool (Maybe Text) Text
forall flag a b.
KindName -> TypeName -> Tree flag a b -> TypedTree flag a b
TypedTree KindName
"appendix-section" TypeName
"attachments" (Tree Bool (Maybe Text) Text -> TypedTree Bool (Maybe Text) Text)
-> Tree Bool (Maybe Text) Text -> TypedTree Bool (Maybe Text) Text
forall a b. (a -> b) -> a -> b
$
            Maybe Text -> [FlaggedInputTree'] -> Tree Bool (Maybe Text) Text
forall flag a b. a -> [FlaggedTree flag a b] -> Tree flag a b
Tree Maybe Text
forall a. Maybe a
Nothing []

introText :: Text
introText :: Text
introText =
    [Text] -> Text
unlines
        [ Text
"[date]"
        , Text
""
        , Text
"// Insert correct date here; displayed at the very top."
        , Text
"Vom 19. Januar 2038"
        , Text
""
        , Text
""
        , Text
"[publ_log]"
        , Text
""
        , Text
"// Publication log; typically one paragraph (i.e., no empty lines)"
        , Text
"// with many comma-separated \"Veröffentlichung vom ...\""
        , Text
""
        , Text
""
        , Text
"[intro]"
        , Text
""
        , Text
"// Intro; typically one paragraph à la:"
        , Text
"// \"Aufgrund ... wird ... erlassen:\""
        ]

mkSection :: Text -> TypedInputTree'
mkSection :: Text -> TypedTree Bool (Maybe Text) Text
mkSection = KindName
-> TypeName
-> Tree Bool (Maybe Text) Text
-> TypedTree Bool (Maybe Text) Text
forall flag a b.
KindName -> TypeName -> Tree flag a b -> TypedTree flag a b
TypedTree KindName
"section" TypeName
"section" (Tree Bool (Maybe Text) Text -> TypedTree Bool (Maybe Text) Text)
-> (Text -> Tree Bool (Maybe Text) Text)
-> Text
-> TypedTree Bool (Maybe Text) Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Tree Bool (Maybe Text) Text
forall flag a b. b -> Tree flag a b
Leaf

sectionOne :: TypedInputTree'
sectionOne :: TypedTree Bool (Maybe Text) Text
sectionOne =
    Text -> TypedTree Bool (Maybe Text) Text
mkSection (Text -> TypedTree Bool (Maybe Text) Text)
-> Text -> TypedTree Bool (Maybe Text) Text
forall a b. (a -> b) -> a -> b
$
        [Text] -> Text
unlines
            [ Text
"§ Zugang zum Masterstudium"
            , Text
""
            , Text
"Der Zugang zum Studiengang setzt voraus, dass die Bewerberin oder der Bewerber"
            , Text
"einen anerkannten, qualifizierten Bachelor of Science in Informatik oder einer"
            , Text
"verwandten Disziplin besitzt. Der Zugang kann nur erfolgen, wenn"
            , Text
"  # mit diesem Abschluss dieselben Lernziele erreicht werden, die"
            , Text
"    mit dem Bachelor of Science Informatik der Christian-Albrechts-Universität"
            , Text
"    zu Kiel erreicht werden, oder"
            , Text
"  # gemäß der Satzung zur Feststellung der Eignung für den 1-Fach-Masterstudiengang"
            , Text
"    Informatik die Eignung festgestellt wurde."
            , Text
""
            , Text
"Die Feststellung, ob die Zugangsvoraussetzungen erfüllt sind, insbesondere, ob ein"
            , Text
"qualifizierter Abschluss vorliegt, trifft der Prüfungsausschuss Informatik."
            , Text
"Erfüllt die Studiengangskoordinatorin, der Studiengangskoordinator oder eine"
            , Text
"andere vom Prüfungsausschuss beauftragte Person die in der Anerkennungssatzung"
            , Text
"für eine Feststellung genannten Voraussetzungen, entscheidet diese oder dieser"
            , Text
"über das Vorliegen der Zugangsvoraussetzungen."
            , Text
""
            , Text
"Der Zugang zum Studiengang Informatik mit dem Abschluss Master of Science setzt"
            , Text
"weiter den Nachweis von Englischkenntnissen voraus durch"
            , Text
"  # eine allgemeine Hochschulreife oder"
            , Text
"  # eine fachgebundene Hochschulreife mit mindestens drei Jahren Englisch auf"
            , Text
"    grundlegendem Niveau (Grundkursniveau) oder"
            , Text
"  # entsprechende Sprachnachweise auf dem Niveau B1 des Gemeinsamen Europäischen"
            , Text
"    Referenzrahmens für Sprachen (GER) oder"
            , Text
"  # ein Ergebnis von mindestens 145 Punkten im Abschnitt „Verbal Reasoning“"
            , Text
"    eines GRE®revised General Tests."
            , Text
"Absolventinnen und Absolventen des CAU-Bachelorstudiengangs, auf dem dieser"
            , Text
"Master aufbaut und für den die geforderten Voraussetzungen bereits nachzuweisen"
            , Text
"waren, müssen diese Voraussetzungen nicht erneut nachweisen."
            ]

sectionTwo :: TypedInputTree'
sectionTwo :: TypedTree Bool (Maybe Text) Text
sectionTwo =
    Text -> TypedTree Bool (Maybe Text) Text
mkSection (Text -> TypedTree Bool (Maybe Text) Text)
-> Text -> TypedTree Bool (Maybe Text) Text
forall a b. (a -> b) -> a -> b
$
        [Text] -> Text
unlines
            [ Text
"§{label:} Studienaufbau"
            , Text
""
            , Text
"Das Masterstudium hat eine Regelstudienzeit von vier Semestern."
            , Text
"Das Studienvolumen umfasst 120 LP und etwa 80 Semesterwochenstunden."
            , Text
""
            , Text
"Es müssen Wahlpflichtmodule im Umfang von insgesamt 90 LP erfolgreich abgeschlossen werden."
            , Text
"  # Informatikmodule im Gesamtumfang von 75 bis 80 LP aus den folgenden Bereichen:"
            , Text
"      # Wahlpflichtmodule Informatik (Msc-Inf-WP): Es müssen mindestens 12 LP"
            , Text
"        aus dem Bereich Theoretische Informatik (MSc-Inf-Theo) erbracht werden."
            , Text
"        Über die Zuordnung von Modulen zu diesem Bereich entscheidet der"
            , Text
"        Prüfungsausschuss nach Rücksprache mit den Dozentinnen und Dozenten des"
            , Text
"        Bereichs und macht diese in geeigneter Weise bekannt."
            , Text
"      #{numb:} Masterseminare zur Informatik (Msc-Inf-Sem) im Umfang von 5 LP: Ziel"
            , Text
"        eines Masterseminars ist eine eigenständige Auseinandersetzung mit"
            , Text
"        wissenschaftlichen Themen der Informatik, dem Schreiben wissenschaftlicher"
            , Text
"        Texte und dem Präsentieren wissenschaftlicher Ergebnisse."
            , Text
"      # Masterprojekte zur Informatik (Msc-Inf-Proj) im Umfang von 10 LP: Ziel"
            , Text
"        eines Masterprojekts ist die intensive, praktische Auseinandersetzung mit"
            , Text
"        einem aktuellen Thema der Informatik. Inhalt sollen insbesondere die"
            , Text
"        Bereiche Problemanalyse, Spezifikation und Implementierung sein."
            , Text
"        Das Masterprojekt soll in der Regel als Gruppenarbeit erfolgen,"
            , Text
"        so dass neben den fachlichen Inhalten auch Aspekte der Gruppen-"
            , Text
"        und Projektarbeit erlernt werden. Die Ergebnisse des Masterprojekts"
            , Text
"        werden im Rahmen eines Vortrags präsentiert."
            , Text
"      # Projektgruppen (Msc-Winf-PrGrp) im Umfang von 15 bis 20 LP:"
            , Text
"        Die Projektgruppe verfolgt dieselben Ziele wie ein Masterprojekt in"
            , Text
"        einem größeren Rahmen."
            , Text
"      #{nume:} Forschungsprojekte (MSc-WInf-FoPro, Mitarbeit in einer Arbeitsgruppe),"
            , Text
"        jeweils im Umfang von bis zu 10 LP."
            , Text
"Es müssen die folgenden Bedingungen bei den Modulen gemäß den Buchstaben {:numb})"
            , Text
"bis {:nume}) eingehalten werden:"
            , Text
"  # 1"
            , Text
"      # a"
            , Text
"          # Ein oder zwei Masterseminare."
            , Text
"          # Ein oder zwei Masterprojekte oder eine Projektgruppe."
            , Text
"          # Höchstens ein Forschungsprojekt."
            , Text
"          # Der Gesamtumfang der Module gemäß den Buchstaben {:numb}) bis {:nume}) ist höchstens 25 LP."
            , Text
"  #{num2:} Außerfachlicher Wahlbereich im Umfang von 10 bis 15 LP: In diesem Bereich können"
            , Text
"    Studierende Module aus dem Angebot der Christian-Albrechts-Universität zu Kiel"
            , Text
"    wählen, welche nicht auch in einem anderen Bereich dieses Studiengangs belegt"
            , Text
"    werden können. Sprachkurse, welche nicht über das Niveau der gymnasialen Oberstufe"
            , Text
"    hinausgehen, oder die Muttersprache betreffen, sowie Module mit informatischem"
            , Text
"    beziehungsweise wirtschaftsinformatischem Inhalt, gehören nicht zu diesem Bereich."
            , Text
"    Bei der Wahl außerfachlicher Module müssen die Kapazitätsbeschränkungen anderer"
            , Text
"    Fächer gemäß § 9 Absatz 3 PVO beachtet werden."
            , Text
"  # Neben der Wahl von Modulen gemäß Nummer {:num2} ist im außerfachlichen Wahlbereich auch"
            , Text
"    die Wahl eines koordinierten Nebenfachs möglich. Das Nebenfach kann sowohl"
            , Text
"    konsekutiven Charakter haben und das gleiche Nebenfach aus dem Bachelorstudiengang"
            , Text
"    fortsetzen als auch ein neues einführendes Nebenfach sein. Die möglichen Nebenfächer"
            , Text
"    mit den zu absolvierenden Modulen werden zum Studienbeginn in geeigneter Weise durch"
            , Text
"    das Institut für Informatik bekannt gemacht. Dabei kann es in einzelnen Nebenfächern"
            , Text
"    erforderlich sein, mehr als 10 LP zu erreichen. Weitere Nebenfächer können in"
            , Text
"    Absprache mit den beteiligten Fächern und dem Prüfungsausschuss Informatik, bestimmt"
            , Text
"    werden. Das Nebenfach wird auf dem Zeugnis ausgewiesen."
            , Text
""
            , Text
"Im Rahmen des Masterstudiums ist eine Masterarbeit im Umfang von 30 LP anzufertigen."
            , Text
"Näheres regelt § {:par6}. Die Masterarbeit erfolgt in der Regel als Abschluss des Masterstudiums."
            , Text
""
            , Text
"Aktualisierungen der Wahlpflichtbereiche nimmt der Prüfungsausschuss vor;"
            , Text
"vor Einführung eines neuen Moduls werden die durchführenden Lehrpersonen und"
            , Text
"die Studiengangskoordinatorin oder der Studiengangskoordinator gehört."
            , Text
""
            , Text
"Bereits für einen Bachelorabschluss verwendete Wahlpflichtmodule können"
            , Text
"nicht erneut eingebracht werden."
            ]

sectionThree :: TypedInputTree'
sectionThree :: TypedTree Bool (Maybe Text) Text
sectionThree =
    Text -> TypedTree Bool (Maybe Text) Text
mkSection (Text -> TypedTree Bool (Maybe Text) Text)
-> Text -> TypedTree Bool (Maybe Text) Text
forall a b. (a -> b) -> a -> b
$
        [Text] -> Text
unlines
            [ Text
"§ Studienaufbau"
            , Text
""
            , Text
"Die Regelstudienzeit und das Studienvolumen betragen drei Jahre beziehungsweise"
            , Text
"180 Leistungspunkte und circa 120 Semesterwochenstunden."
            , Text
""
            , Text
"Der Bachelorstudiengang Wirtschaftsinformatik (Studienverlaufsplan siehe Anlage {:verlaufsplan},"
            , Text
"Module mit Prüfungsleistungen siehe Anlage {:anlage11} und {:anlage12}) setzt sich aus folgenden"
            , Text
"Bereichen zusammen:"
            , Text
"  # Grundmodule (Pflicht, BSc-WInf-G) im Umfang von 46 LP:"
            , Text
"      - infEWInf-01a: Einführung in die Wirtschaftsinformatik (7 LP)"
            , Text
"      - infEInf-01a: Einführung in die Informatik (8 LP)"
            , Text
"      - Inf-InfRecht: Informatikrecht (2 LP)"
            , Text
"  # Aufbaumodule (Pflicht, BSc-WInf-A) im Umfang von 32 LP:"
            , Text
"      - VWL-STATWX: Statistische Methoden (10 LP)"
            , Text
"      - infST-01a: Softwaretechnik (7 LP)"
            , Text
"      - infEthik-01a: Ethik in der Informatik (2 LP)"
            , Text
"  # Wahlpflichtmodule (BSc-WInf-WP-WInf und BSc-WInf-WP-Inf) im Umfang von 37 LP."
            , Text
"    Weitere Informationen sind in Anlage {:anlage12} aufgeführt. Diese Module bestehen in der"
            , Text
"    Regel aus einer Vorlesung mit einer begleitenden Übung."
            , Text
"    Bei der Wahl der Module müssen die Studierenden mindestens 23 LP aus dem Bereich"
            , Text
"    Wahlpflichtmodule BSc-WInf-WP-WInf und mindestens 7 LP aus dem Bereich"
            , Text
"    Wahlpflichtmodule BSc-WInf-WP-Inf wählen."
            , Text
"  # ein Projekt Wirtschaftsinformatik (BSc-WInf-Proj) im Umfang von 6 LP."
            , Text
"  # ein Seminarmodul zur Wirtschaftsinformatik (BSc-WInf-Sem) im Umfang von 7 LP,"
            , Text
"    gemäß Anlage {:anlage12}."
            , Text
"  # Studienangebote BWL oder VWL im Umfang von 40 LP:"
            , Text
"    Die Studienangebote BWL und VWL sind Alternativen. Mit der Wahl des ersten Moduls,"
            , Text
"    welches nicht in beiden Varianten vorkommt, legen Studierende fest, welche"
            , Text
"    Variante sie wählen. Ein Wechsel zu dem jeweils anderen Studienangebot ist"
            , Text
"    jederzeit möglich. Zum Erreichen des Bachelorabschlusses müssen alle Module"
            , Text
"    eines der beiden Studienangebote erfolgreich absolviert werden."
            , Text
"      # Studienangebot BWL, gemäß Anlage {:anlage6}:"
            , Text
"          # BWL-EinfBWL: Einführung in die Betriebswirtschaftslehre (5 LP)"
            , Text
"          # BWL-ERW: Externes Rechnungswesen (5 LP)"
            , Text
"          # BWL-ER: Entscheidungsrechnungen (5 LP)"
            , Text
"          # VWL-EVWL: Einführung in die Volkswirtschaftslehre"
            , Text
"          # BWL-InnoMProz: Innovationsmanagement: Prozesse und Methoden (5 LP)"
            , Text
"          # Zwei Module des Wahlpflichtbereichs BWL (zusammen 10 LP):"
            , Text
"              - BWL-Ent: Decision Analysis I (5 LP)"
            , Text
"              - BWL-RDM: Decision Analysis II (5 LP)"
            , Text
"              - BWL-ProdLog: Produktion und Logistik (5 LP)"
            , Text
"              - BWL-Mark: Marketing (5 LP)"
            , Text
"            Wurde ein Wahlpflichtmodul erfolgreich abgeschlossen, darf dieses"
            , Text
"            nicht durch ein anderes Wahlpflichtmodul (zum Beispiel zur"
            , Text
"            Notenverbesserung) ersetzt werden."
            , Text
"      # Studienangebot VWL, gemäß Anlage {:anlage6}:"
            , Text
"          # BWL-EinfBWL: Einführung in die Betriebswirtschaftslehre (5 LP)"
            , Text
"          # VWL-EVWL: Einführung in die Volkswirtschaftslehre (10 LP)"
            , Text
"          # VWLvwlMikro1-01a: Grundzüge der mikroökonomischen Theorie I (5 LP)"
            , Text
"  # Bachelorarbeit, individuell oder im Abschlussprojekt, im Umfang von 12 LP gemäß § {:abschluss}."
            ]

extroText :: Text
extroText :: Text
extroText =
    [Text] -> Text
unlines
        [ Text
"[extro]"
        , Text
""
        , Text
"// Here goes some text that goes at the end of the document."
        , Text
""
        , Text
"// In particular, there should be the date and name of the"
        , Text
"// signatory, with space for the actual signature."
        , Text
"//  - Vertical space can be inserted as {nl}."
        , Text
""
        , Text
""
        , Text
"[legal_log]"
        , Text
""
        , Text
"// Here, a sequence of paragraphs like the following should go."
        , Text
""
        , Text
"<*Artikel 42 der Änderungssatzung vom 19. Januar 2038:>"
        , Text
"Diese Satzung tritt am Tag nach ihrer Bekanntmachung in Kraft."
        ]