% \iffalse meta-comment %/GitFileInfo=tudscr-texindy.dtx % % TUD-Script -- Corporate Design of Technische Universität Dresden % ---------------------------------------------------------------------------- % % Copyright (C) Falk Hanisch , 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 % %<*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} % % \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} %\ifdefined\tudxdyflag %\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 % \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% % % \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% % (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% % (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% % % \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% % % \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 % % \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% % \@spaces:open\space\space"\string\,\string\dotfill\string\,"^^J% % \@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% % % \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% % % \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% % % \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% % \@spaces"see" "seealso" "seeidx" "seeunverified"^^J% % \@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% % % \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 %\tud@xdy@create* %\fi % \end{macrocode} % \end{macro}^^A \tud@xdy@write % \end{macro}^^A \tud@xdy@@create % \end{macro}^^A \tud@xdy@create % % \PrintBackMatter % \endinput