% \iffalse meta-comment
%/GitFileInfo=tudscr-texindy.dtx
%
%  TUD-Script -- Corporate Design of Technische Universität Dresden
% ----------------------------------------------------------------------------
%
%  Copyright (C) Falk Hanisch <hanisch.latex@outlook.com>, 2012-2022
%
% ----------------------------------------------------------------------------
%
%  This work may be distributed and/or modified under the conditions of the
%  LaTeX Project Public License, either version 1.3c of this license or
%  any later version. The latest version of this license is in
%    http://www.latex-project.org/lppl.txt
%  and version 1.3c or later is part of all distributions of
%  LaTeX version 2008-05-04 or later.
%
%  This work has the LPPL maintenance status "maintained".
%
%  The current maintainer and author of this work is Falk Hanisch.
%
% ----------------------------------------------------------------------------
%
% \fi
%
% \iffalse ins:batch + dtx:driver
%<*ins>
\ifx\documentclass\undefined
  \input docstrip.tex
  \ifToplevel{\batchinput{tudscr.ins}}
\else
  \let\endbatchfile\relax
\fi
\endbatchfile
%</ins>
%<*dtx>
\ProvidesFile{tudscr-texindy.dtx}[2022/08/09]
\RequirePackage{tudscr-gitinfo}
\documentclass[english,ngerman,xindy]{tudscrdoc}
\iftutex
  \usepackage{fontspec}
\else
  \usepackage[T1]{fontenc}
  \usepackage[ngerman=ngerman-x-latest]{hyphsubst}
\fi
\usepackage{babel}
\usepackage{tudscrfonts}
\usepackage[babel]{microtype}

\GitHubBase{\TUDScriptRepository}
\begin{document}
  \author{Falk Hanisch\TUDScriptContactTitle}
  \maketitle
  \tableofcontents
  \DocInput{\filename}
\end{document}
%</dtx>
% \fi
%
% \selectlanguage{ngerman}
%
%
%
% \section{Stildateien für \app{texindy}}
%
% Für die Dokumentationsklassen und -pakete wird zur Sortierung \app{texindy} 
% verwendet. Da das Programm die die Dateien nicht in einem |TEXPATH| nach den
% Stildateien sucht, werden diese zur Laufzeit im Arbeitsverzeichnis erstellt.
% Nachfolgend werden die erstellten \app{texindy}-Stildateien beschrieben.
%
% \begin{macro}{\@hashchar}
% \changes{v2.05}{2016/04/25}{neu}^^A
% Das Hash-Zeichen wird bei \cls{tudscrdoc} für die Befehlsdeklarationen in der 
% Stildatei benötigt. Damit dieses beim Erzeugen der Datei nicht als solches
% interpretiert wird, ist dafür ein separates Makro notwendig.
%    \begin{macrocode}
\edef\tud@res@a{\catcode`\noexpand\#=\the\catcode`\#\relax}%
\@makeother\#
\newcommand*\@hashchar{#}
\tud@res@a
%    \end{macrocode}
% \end{macro}^^A \@hashchar
% \begin{macro}{\tud@xdy@create}
% \changes{v2.05}{2016/04/24}{neu}^^A
% \begin{macro}{\tud@xdy@@create}
% \begin{macro}{\tud@xdy@write}
% \changes{v2.05}{2016/04/24}{neu}^^A
% Dies sind die Hilfsmakros für die Erzeugung der nötigen Dateien. Mit dem
% \cs{tud@xdy@create} wird angegeben, ob die Stildatei für einen Index oder ein 
% Glossar erzeugt wird, was prinzipiell nur für die Klasse \cls{tudscrdoc} 
% notwendig ist.
%    \begin{macrocode}
%<doc>\ifdefined\tudxdyflag
%<!doc>\tud@newwrite\tud@xdy@write
\NewDocumentCommand\tud@xdy@create{s}{%
  \begingroup%
    \edef\tud@res@a{\@currname-\IfBooleanTF{#1}{gls}{ind}.xdy}%
    \expandafter\IfFileExists\expandafter{\tud@res@a}{}{%
      \IfBooleanTF{#1}{\@tud@res@swatrue}{\@tud@res@swafalse}%
      \edef\tud@res@b{the\if@tud@res@swa glossary\else index\fi}%
      \edef\tud@res@a{\noexpand\tud@xdy@@create{\tud@res@b}{\tud@res@a}}%
      \tud@res@a%
    }%
  \endgroup%
}
\newcommand*\tud@xdy@@create[2]{%
  \immediate\openout\tud@xdy@write=#2\relax%
%    \end{macrocode}
% Als erstes wird das \LaTeX-Standardmodul geladen.
%    \begin{macrocode}
  \immediate\write\tud@xdy@write{(require "texindy.xdy")}%
%    \end{macrocode}
%
% Für die Klasse \cls{tudscrdoc} werden in den Stildateien die verwendeten 
% Umgebung definiert, welche für die prozessierten Indexdateien zu nutzen sind.
%    \begin{macrocode}
  \immediate\write\tud@xdy@write{%
    (markup-index^^J%
    \@spaces:open^^J%
    "\string\begin{#1}^^J%
%<*doc>
    \space\space\string\makeatletter\@percentchar^^J%
    \space\space\string\providecommand*\string\lettergroupDefault[1]%
        {\string\lettergroup{\string\tud@symbols@name}}\@percentchar^^J%
    \space\space\string\providecommand*\string\lettergroup[1]{\@percentchar^^J%
    \@spaces\string\belowpdfbookmark%
        {\@hashchar1}{#1/\@hashchar1}\@percentchar^^J%
    \@spaces\string\par\string\centerline%
        {\string\normalsize\string\textbf{\string\textsf{\@hashchar1}}}%
        \@percentchar^^J%
    \@spaces\string\par\string\smallskip\string\nopagebreak\@percentchar^^J%
    \space\space}\@percentchar^^J%
    \space\space\string\scan@allowedfalse\@percentchar^^J%
%    \end{macrocode}
% Für die Änderungsliste erfolgt die Gruppierung anhand der Versionsnummer. Da 
% diese auf der ersten Ebene angegeben ist (\cs{item}) muss das Ganze mit einem 
% terminierten Befehl erfolgen. Hierfür wird \cs{@lettergroup} definiert. 
% Außerdem werden mit \cs{tud@lst@def} die benötigten Befehle zur selektiven 
% Anzeige der Änderungseinträge erstellt.
%    \begin{macrocode}
\if@tud@res@swa
    \space\space\string\newcommand*\string\@lettergroup{}\@percentchar^^J%
    \space\space\string\def\string\@lettergroup\@hashchar1\string\relax%
        {\string\lettergroup{\@hashchar1}}\@percentchar^^J%
    \space\space\string\tud@lst@def\@percentchar^^J%
\fi
%</doc>
    \space\space\string\providecommand*\string\seesep{/}\@percentchar^^J%
%    \end{macrocode}
% Der Abschluss der Umgebungsdefinition.
%    \begin{macrocode}
    "^^J% Ende des Umgebungsbeginns
    \@spaces:close "\string~n\string~n\string\end{#1}\string~n"^^J%
    \@spaces:hierdepth 3^^J%
    )^^J%
%    \end{macrocode}
% Für die Sortierung des Indexes sollen einzelne Zeichen beachtet werden.
% Hierfür wird |xy-ignore-special| durch |xy-resolve-special| ersetzt.
%    \begin{macrocode}
%<*doc>
    (define-sort-rule-orientations (forward backward forward forward))^^J%
    (use-rule-set :run 0^^J%
    \@spaces:rule-set ("xy-alphabetize" "xy-resolve-special")^^J%
    )^^J%
    (use-rule-set :run 1^^J%
    \@spaces:rule-set ("xy-resolve-diacritics" "xy-resolve-special")^^J%
    )^^J%
    (use-rule-set :run 2^^J%
    \@spaces:rule-set ("xy-resolve-case" "xy-resolve-special")^^J%
    )^^J%
%    \end{macrocode}
% Die Seitenzahlenbereiche für die Quelltextdokumentation bestehen aus drei 
% Teilen, um das Verlinken auf Codezeilen zu ermöglichen~--
% \meta{Target}|:|\meta{Dateischlüssel}|-|\meta{Codezeile}|:|\meta{Seitenzahl}
%    \begin{macrocode}
    (define-alphabet "AlphaExtended"^^J%
    \@spaces(^^J%
    \@spaces\@spaces"A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M"^^J%
    \@spaces\@spaces"N" "O" "P" "Q" "R" "S" "T" "U" "V" "W" "X" "Y" "Z"^^J%
    \@spaces\@spaces"a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m"^^J%
    \@spaces\@spaces"n" "o" "p" "q" "r" "s" "t" "u" "v" "w" "x" "y" "z"^^J%
    \@spaces\@spaces"?"^^J%
    \@spaces)^^J%
    )^^J%
    (define-location-class "hypdoc"^^J%
    \@spaces(^^J%
    \@spaces\@spaces"arabic-numbers" :sep ":"^^J%
    \@spaces\@spaces"AlphaExtended" \space:sep "-" "arabic-numbers" :sep ":"^^J%
    \@spaces\@spaces"arabic-numbers"^^J%
    \@spaces)^^J%
    \@spaces:min-range-length 2^^J%
    )^^J%
%</doc>
%    \end{macrocode}
% Leider lässt sich für Seitenzahlbereiche via |:attr| (noch) kein Markup für 
% angehängte \enquote*{f.} sowie \enquote*{ff.} einstellen. Diese würden deshalb
% bei kursiven oder fetten Seitenzahlen trotzdem in normaler Schrift erscheinen,
% weshalb auf die Auszeichnung folgender Seiten verzichtet wird.
%    \begin{macrocode}
%^^A  (require "ff-ranges.xdy")^^J%
%    \end{macrocode}
% Bereiche mit mehr als zwei Seitenzahlen werden zusammengefasst, wobei als
% Trennzeichen ein Halbgeviertstrich verwendet wird.
%    \begin{macrocode}
    (define-location-class "arabic-page-numbers"^^J%
    \@spaces("arabic-numbers")^^J%
    \@spaces:min-range-length 2^^J%
    )^^J%
%<*doc>
    (define-location-class-order ("hypdoc" "arabic-page-numbers"))^^J%
%</doc>
    (markup-range :sep "--")^^J%
%    \end{macrocode}
% Alle Argumente in eckigen Klammern werden ignoriert. Dies wird bei einigen
% Indexbefehlen genutzt, um die nicht beachteten RegExp-Regeln auszugleichen, 
% siehe den nächsten Absatz. In der Klasse \cls{tudscrdoc} werden außerdem im 
% Befehlsnamen enthaltene |@|"~Zeichen für die Sortierung gesondert behandelt.
%    \begin{macrocode}
%<*doc>
    (merge-rule :again^^J%
    \@spaces"(.*)@(.*)"^^J%
    \@spaces"\string\1\string\2\space\string~e"^^J%
    )^^J%
%</doc>
    (merge-rule :eregexp^^J%
    \@spaces"\string\[(.*)\string\]"^^J%
    \@spaces""^^J%
    )^^J%
%    \end{macrocode}
% Innerhalb ausgewählter Auszeichnungs- und Textbefehle sollten die Befehle
% selbst, nicht jedoch die Argumente verworfen werden. Leider lässt sich dies 
% momentan nicht umsetzen, da die manuell erstellten RegExp-Regeln durch 
% \hrfn{http://sourceforge.net/p/xindy/bugs/22/}{\app{texindy} nicht korrekt} 
% genutzt werden.
%    \begin{macrocode}
%<*!doc>
%^^A    (merge-rule "\\hologo\{(.*)\}" "/1" :eregexp)^^J%
%^^A    (merge-rule "\\texttt\{(.*)\}" "/1" :eregexp)^^J%
%^^A    (merge-rule "\\textsbn\{(.*)\}" "/1" :eregexp)^^J%
%^^A    (merge-rule "\\textsbi\{(.*)\}" "/1" :eregexp)^^J%
%</!doc>
%    \end{macrocode}
% Für die Änderungsliste im Handbuch werden Untereinträge bis zur vierten Ebene
% unterstützt.
%    \begin{macrocode}
%<*!doc>
    (markup-indexentry :depth 3^^J%
    \@spaces:open\space\space"\string~n\string\subsubsubitem\space"^^J%
    )^^J%
%</!doc>
%    \end{macrocode}
% Für die Änderungsliste von \cls{tudscrdoc} erfolgt die Gruppierung anhand der
% angegebenen Versionsnummer. Das bedeutet, das das Markup für die eigentliche 
% |letter-group| unterdrückt und die erste Ebene dafür verwendet wird. 
%    \begin{macrocode}
%<*doc>
\if@tud@res@swa
    (markup-letter-group^^J%
    \@spaces:open-head\space\space"\string~n\space\space\string\@gobble{"^^J%
    \@spaces:close-head "}"^^J%
    )^^J%
%    \end{macrocode}
% Leider gibt es für die Eintragsebenen keine Schlüssel |open-head| und
% |close-head|, weshalb für die Änderungsliste etwas getrickst werden muss. 
% Zwischen Einträgen der ersten Ebene soll äquivalent zu |letter-group| etwas
% Abstand eingefügt werden.
%    \begin{macrocode}
    (markup-indexentry-list :depth 0^^J%
    \@spaces:sep\space\space\space%
        "\string~n\string~n\space\space\string\indexspace\string~n"^^J%
    )^^J%
%    \end{macrocode}
% Da jeder Eintrag in der Änderungsliste aus mindestens drei Ebenen besteht, 
% wird vor der ersten Ebene der Beginn des Markupbefehls gesetzt\dots
%    \begin{macrocode}
    (markup-indexentry \@spaces\space:depth 0^^J%
    \@spaces:open\space\space%
        "\string~n\space\space\string\@lettergroup\space"^^J%
    )^^J%
%    \end{macrocode}
% \dots und vor Beginn der zweiten Ebene mit \cs{relax} terminiert. Diese 
% wird mit \cs{item} ausgezeichnet.
%    \begin{macrocode}
    (markup-indexentry-list :depth 1^^J%
    \@spaces:open\space\space"\string\relax"^^J%
    )^^J%
    (markup-indexentry \@spaces\space:depth 1^^J%
    \@spaces:open\space\space"\string~n\space\space\string\item\space"^^J%
    )^^J%
%    \end{macrocode}
% Eine einzelne, nachfolgende Änderungsnotiz für den aktuellen Eintrag soll 
% direkt ausgegeben werden. Sind jedoch mehrere nachgelagerte Anmerkungen 
% vorhanden, so sollen diese in der nächsten Ebene ausgegeben werden. Da die
% Anzahl aller Anmerkungen zu einem einzelnen Eintrag zu Beginn noch unbekannt
% ist, werden alle dazugehörigen Änderungsnotizen zunächst mit \cs{tud@lst@add}
% in der~-- zuvor mit dem Makro \cs{tud@lst@init} initialisierten~-- Liste
% \cs{tud@lst@values} gesammelt und diese am Ende des jeweiligen Eintrags durch
% \cs{tud@lst@process} ausgewertet. Sollte eine weitere Unterebene exisitieren, 
% werden entsprechend die Makros \cs{tud@lst@@init}, \cs{tud@lst@@values} und
% \cs{tud@lst@@add} sowie \cs{tud@lst@@process} verwendet.
%    \begin{macrocode}
    (markup-indexentry-list :depth 2^^J%
    \@spaces:open\space\space"\string\tud@lst@init"^^J%
    \@spaces:close "\string~n \@spaces\space\string\tud@lst@process"^^J%
    )^^J%
    (markup-indexentry \@spaces\space:depth 2^^J%
    \@spaces:open%
        \space\space"\string~n\@spaces\space\space\string\tud@lst@add{"^^J%
    \@spaces:close "}"^^J%
    )^^J%
    (markup-indexentry-list :depth 3^^J%
    \@spaces:close "\string~n\@spaces\@spaces\string\tud@lst@@process{"^^J%
    \@spaces:open\space\space"}\string\tud@lst@@init"^^J%
    )^^J%
    (markup-indexentry \@spaces\space:depth 3^^J%
    \@spaces:open%
        \space\space"\string~n\@spaces\@spaces\string\tud@lst@@add{"^^J%
    \@spaces:close "}"^^J%
    )^^J%
%    \end{macrocode}
% Für den Index aller Eintragstypen ist nur auf zu leere \cs{hbox} zu achten.
%    \begin{macrocode}
\else
    (markup-indexentry-list :open "\string\efil" :depth 1)^^J%
\fi
%</doc>
%    \end{macrocode}
% Punkte zwischen Eintrag und Seitenzahl. Das schließende \cs{relax} wird für 
% die smarte Definition des Befehls \cs{cleversee} benötigt, welcher nach den 
% beiden obligatorischen Argument die nachfolgenden Seitenzahlen sucht und 
% dabei durch \cs{relax} begrenzt wird. Für die Klasse \cls{tudscrdoc} wird in
% der Änderungsliste der Hyperlink für die Seitenzahl respektive die Codezeile 
% direkt erzeugt.
%    \begin{macrocode}
    (markup-locclass-list^^J%
%<!doc>    \@spaces:open\space\space"\string\,\string\dotfill\string\,"^^J%
%<doc>    \@spaces:open\space\space"\string\pfill\space"^^J%
    \@spaces:close "\string\relax"^^J%
    \@spaces:sep\space\space\space",\space"^^J%
    )^^J%
%    \end{macrocode}
% Es werden für Handbuch und Tutorials die Attribute \emph{!} für deklarierende 
% sowie \emph{?} für wichtige Einträge zusätzlich zu \emph{default} definiert.
%
% Einträge werden hierarchisch unterschieden. Standardeinträge \val{default}
% werden ggf. von deklarierenden oder wichtigen Einträgen überschrieben bzw. 
% nicht separat gelistet.
%    \begin{macrocode}
%<*!doc>
    (define-attributes (("!" "default") ("?" "default") ("default")))^^J%
    (markup-attribute-group-list :sep ", ")^^J%
%    \end{macrocode}
% Hier erfolgt die Definition der Auszeichnugen der Attribute. Deklarationen 
% werden fett gedruckt, wichtige Einträge erscheinen kursiv. Außerdem wird ein
% entsprechnder Link auf die Seite eingefügt.
%    \begin{macrocode}
    (markup-locref :attr "!"^^J%
    \@spaces:open\space\space"\string\textbf{\string\hyperpage{"^^J%
    \@spaces:close "}}"^^J%
    )^^J%
    (markup-locref :attr "?"^^J%
    \@spaces:open\space\space"\string\textit{\string\hyperpage{"^^J%
    \@spaces:close "}}"^^J%
    )^^J%
    (markup-locref :attr "default"^^J%
    \@spaces:open\space\space"\string\hyperpage{"^^J%
    \@spaces:close "}" ^^J%
    )^^J%
%</!doc>
%    \end{macrocode}
% Für \cls{tudscrdoc} erfolgen die Auszeichnungen für den Index im Stile von
% \pkg{doc} vorallem mit den Attributen \emph{usage} für Erläuterung sowie
% \emph{main} für Codedefinitionen und \emph{code} für Verweise auf die 
% Verwendung im Quellcode. Zusätzlich wird \emph{change} definiert, um auch
% Änderungseinträge separat zu erfassen. Diese Attribute dienen \app{texindy}
% lediglich für die Kategorisierung der Einträge, die Formatierung dieser für
% die Ausgabe erfolgt mit \cs{tud@xdy@mapping}\marg{Attribut}\marg{Referenz}.
%    \begin{macrocode}
%<*doc>
    (markup-attribute-group-list :sep ", ")^^J%
    (define-attributes (("usage") ("main") ("code") ("change") ("default")))^^J%
    (markup-locref :attr "change"^^J%
    \@spaces:open"\string\tud@xdy@mapping{change}{"^^J
    \@spaces:close "}"^^J%
    )^^J%
    (markup-locref :attr "code"^^J%
    \@spaces:open "\string\tud@xdy@mapping{code}{"^^J%
    \@spaces:close "}"^^J%
    )^^J%
    (markup-locref :attr "usage"^^J%
    \@spaces:open "\string\tud@xdy@mapping{usage}{"^^J%
    \@spaces:close "}"^^J%
    )^^J%
    (markup-locref :attr "main"^^J%
    \@spaces:open "\string\tud@xdy@mapping{main}{"^^J%
    \@spaces:close "}"^^J%
    )^^J%
%</doc>
%    \end{macrocode}
% Im Handbuch prüfen, mit \verb+|see+\marg{Eintrag} erzeugte Querverweise im 
% Index, ob außerdem noch Seitenzahlangaben existent sind.
%    \begin{macrocode}
%<*!doc>
    (markup-crossref-list :class "see"^^J%
    \@spaces:open\space\space"\string\cleversee\space"^^J%
    \@spaces:sep\space\space\space"; "^^J%
    \@spaces:close "\@backslashchar\@backslashchar"^^J%
    )^^J%
    (markup-crossref-list :class "seealso"^^J%
    \@spaces:open\space\space"\string\cleverseealso\space"^^J%
    \@spaces:sep\space\space\space"; "^^J%
    \@spaces:close "\@backslashchar\@backslashchar"^^J%
    )^^J%
%    \end{macrocode}
% Um Querverweise ohne Prüfung des Zieleintrags erzeugen zu können, wird der 
% passende Typ |seeunverified| definiert.
%    \begin{macrocode}
%<*class>
    (define-crossref-class "seeunverified" :unverified)^^J%
    (markup-crossref-list :class "seeunverified"^^J%
    \@spaces:open\space\space"\string\cleversee\space"^^J%
    \@spaces:sep\space\space\space"; "^^J%
    \@spaces:close "\@backslashchar\@backslashchar"^^J%
    )^^J%
%    \end{macrocode}
% Dieser Querverweistyp wird speziell im allgemeinen Index verwendet, um auf 
% einen Spezialindex zu verweisen. Dabei dient |:unverified| zum Unterdrücken
% von Warnungen durch \app{texindy} aufgrund eines fehlenden Ziels für den
% Querverweis.
%    \begin{macrocode}
    (define-crossref-class "seeidx" :unverified)^^J%
    (markup-crossref-list :class "seeidx"^^J%
    \@spaces:open\space\space"\string\seeidx{"^^J%
    \@spaces:sep\space\space\space"; "^^J%
    \@spaces:close "}{}"^^J%
    )^^J%
%</class>
%    \end{macrocode}
% Werden mit \verb+|see+\marg{Eintrag!Untereintrag} gezielte Querverweise auf
% Untereinträge im Index erstellt, so werden diese nicht standardmäßig mit 
% einem Komma sondern mit dem anpassbaren Makro \cs{seesep} getrennt.
%    \begin{macrocode}
    (markup-crossref-layer-list :class "see"%
    \@spaces\space:sep "\string\seesep{}"%
    )^^J%
    (markup-crossref-layer-list :class "seealso"%
    \space:sep "\string\seesep{}"%
    )^^J%
%    \end{macrocode}
% Damit die Makros \cs{cleversee} und \cs{cleverseealso} sowie \cs{seeidx} auf
% nachfolgende Seitenzahlen suchen können, müssen diese vor selbigen im Index
% aufgerufen werden.
%    \begin{macrocode}
    (define-location-class-order^^J%
    \@spaces(^^J%
%<class>    \@spaces"see" "seealso" "seeidx" "seeunverified"^^J%
%<!class>    \@spaces"see" "seealso"^^J%
    \@spaces"roman-page-numbers" "arabic-page-numbers" "alpha-page-numbers"^^J%
    \@spaces"Roman-page-numbers" "Alpha-page-numbers"^^J%
    \@spaces)^^J%
    )^^J%
%</!doc>
%    \end{macrocode}
% Damit ist die \app{texindy}-Stildatei fertig und kann mit \cs{tud@xdy@create} 
% erstellt werden.
%    \begin{macrocode}
  }%
  \immediate\closeout\tud@xdy@write%
}
\tud@xdy@create
%<doc>\tud@xdy@create*
%<doc>\fi
%    \end{macrocode}
% \end{macro}^^A \tud@xdy@write
% \end{macro}^^A \tud@xdy@@create
% \end{macro}^^A \tud@xdy@create
%
% \PrintBackMatter
%
\endinput
