diff options
Diffstat (limited to 'Master/texmf-dist/source/latex/tudscr/tudscr-manual.dtx')
-rw-r--r-- | Master/texmf-dist/source/latex/tudscr/tudscr-manual.dtx | 7531 |
1 files changed, 4821 insertions, 2710 deletions
diff --git a/Master/texmf-dist/source/latex/tudscr/tudscr-manual.dtx b/Master/texmf-dist/source/latex/tudscr/tudscr-manual.dtx index 3371b857d33..485f2246f26 100644 --- a/Master/texmf-dist/source/latex/tudscr/tudscr-manual.dtx +++ b/Master/texmf-dist/source/latex/tudscr/tudscr-manual.dtx @@ -1,4 +1,4 @@ -% \CheckSum{2999} +% \CheckSum{4147} % \iffalse meta-comment % % ============================================================================ @@ -18,13 +18,13 @@ % % ---------------------------------------------------------------------------- % -% Dieses Werk darf nach den Bedingungen der LaTeX Project Public Lizenz -% in der Version 1.3c, verteilt und/oder veraendert werden. Die aktuelle -% Version dieser Lizenz ist http://www.latex-project.org/lppl.txt und -% Version 1.3c oder spaeter ist Teil aller Verteilungen von LaTeX 2005/12/01 -% oder spaeter und dieses Werks. Dieses Werk hat den LPPL-Verwaltungs-Status -% "author-maintained", wird somit allein durch den Autor verwaltet. Der -% aktuelle Verwalter und Autor dieses Werkes ist Falk Hanisch. +% Dieses Werk darf nach den Bedingungen der LaTeX Project Public Lizenz +% in der Version 1.3c, verteilt und/oder veraendert werden. Die aktuelle +% Version dieser Lizenz ist http://www.latex-project.org/lppl.txt und +% Version 1.3c oder spaeter ist Teil aller Verteilungen von LaTeX 2005/12/01 +% oder spaeter und dieses Werks. Dieses Werk hat den LPPL-Verwaltungs-Status +% "author-maintained", wird somit allein durch den Autor verwaltet. Der +% aktuelle Verwalter und Autor dieses Werkes ist Falk Hanisch. % % ============================================================================ % @@ -51,23 +51,24 @@ %<*driver> \ifx\ProvidesFile\undefined\def\ProvidesFile#1[#2]{}\fi \ProvidesFile{tudscr-manual.dtx}[% - 2015/07/02 v2.04 TUD-KOMA-Script\space% + 2016/07/26 v2.05 TUD-KOMA-Script\space% %</driver> -%<package&identify>\NeedsTeXFormat{LaTeX2e} -%<package&identify>\ProvidesPackage{tudscrman}[% +%<package&identify>\ProvidesPackage{tudscrtutorial}[% %<*driver|package&identify> -%!TUDVersion +%!TUD@Version %<package> package (internal tutorials)% ] %</driver|package&identify> %<*driver> \RequirePackage[ngerman=ngerman-x-latest]{hyphsubst} -\documentclass[english,ngerman]{tudscrdoc} +\documentclass[english,ngerman,xindy]{tudscrdoc} \usepackage{selinput}\SelectInputMappings{adieresis={ä},germandbls={ß}} \usepackage[T1]{fontenc} \usepackage{babel} \usepackage{tudscrfonts} % only load this package, if the fonts are installed \KOMAoptions{parskip=half-} +\usepackage{microtype} +\usepackage{bookmark} \CodelineIndex \RecordChanges \GetFileInfo{tudscr-manual.dtx} @@ -80,576 +81,715 @@ % % \selectlanguage{ngerman} % -% \changes{v2.02}{2014/11/18}{\cls{tudscrman} Index für Tutorials möglich}^^A -% \changes{v2.02}{2014/12/17}{\cls{tudscrman} xindy-Stildatei wird bei der -% Kompilierung erzeugt}^^A +% \changes{v2.02}{2014/12/17}{Erstellung der \app{texindy}-Stildatei während +% der Kompilierung}^^A +% \changes{v2.02}{2014/11/18}{\pkg{tudscrtutorial}: Index für Tutorials}^^A +% \changes{v2.05}{2015/08/04}{Geteilte Deklarationen für Klasse und Paket}^^A % -% \section{Klasse und Paket für die Anwenderdokumentation von \TUDScript} +% \section{Klasse und Paket für Handbuch und Leitfäden zu \TUDScript} % -% Es werden die Klasse \cls{tudscrman} für das \TUDScript-Handuch sowie das -% Paket \pkg{tudscrman} für das Setzen von einigen Anwenderleitfäden bzw. +% Es werden die Klasse \cls{tudscrmanual} für das \TUDScript-Handuch sowie das +% Paket \pkg{tudscrtutorial} für das Setzen von einigen Anwenderleitfäden bzw. % Tutorials erzeugt. Da es zwischen der Klasse und dem Paket es eine große % Menge an Überschneidungen gibt, basieren diese auf der gleichen Quelldatei. % -% \StopEventually{\PrintIndex\PrintChanges} +% \StopEventually{\PrintIndex\PrintChanges\PrintToDos} % % \iffalse -%<*!doc> -%<*body> +%<*body|doc> % \fi % -% \subsection{Benötigte Pakete für die Anwenderdokumentation} +% \subsection{Notwendige Pakete und Befehle für Klasse und Paket} % -% Basis für das Handbuch ist die Klasse \cls{tudscrreprt}. An diese werden alle -% Klassenoptionen weitergereicht. Sie wird für das Setzen des Anwenderhandbuchs -% genutzt. Zusätzlich wird das Paket \pkg{tudscrman} erstellt, um an das -% Handbuch angelehnte Tutorials in einem Unterordner zu erstellen. Sowohl für -% die Klasse als auch das Paket werden einige Pakete geladen. +% Basis für die Handbuchklasse \cls{tudscrmanual} ist die \cls{tudscrreprt}. +% Zusätzlich wird das Paket \pkg{tudscrtutorial} erstellt, um an das Handbuch +% angelehnte Tutorials in einem Unterordner zu erstellen. Sowohl für die Klasse +% als auch das Paket werden einige Pakete geladen, um Einstellungen vorzunehmen +% und nützliche Befehle zu definieren. % % Das Paket \pkg{xparse} erlaubt eine sehr freie Deklaration von Makros mit % nahezu beliebig arrangierbaren (optionalen) Argumenten. % \begin{macrocode} +%<*!doc> +\PassOptionsToPackage{log-declarations=false}{xparse} \RequirePackage{xparse}[2013/12/31] +%</!doc> % \end{macrocode} -% Für den Fließtext werden Pfeile u.\,ä. durch \pkg{textcomp} bereitgestellt. +% Bugfixes für unterschiedliche Pakete. % \begin{macrocode} -\RequirePackage{textcomp}[2005/09/27] +\RequirePackage{scrhack}[2014/02/27] % \end{macrocode} -% Vergrößerung des Durchschusses. +% Die Sprachunterstützung für Klasse und Paket. % \begin{macrocode} -\RequirePackage{setspace}[2011/12/19] -\setstretch{1.1}\recalctypearea +%<*!doc> +\RequirePackage{babel}[2014/03/24] +%</!doc> % \end{macrocode} -% Sprachunterstützung. +% Das Paket \pkg{marginnote} stellt nicht fließenden Randnotizen bereit, welche +% für die Kennzeichnung von Änderungen, Hinweise oder ToDo-Notizen verwendet +% werden. Die Randnotizen werden auf dem linken~-- weil größeren~-- Seitenrand +% gesetzt. % \begin{macrocode} -\RequirePackage{babel}[2014/03/24] +%<*!doc> +\PassOptionsToPackage{quiet}{marginnote} +\RequirePackage{marginnote}[2012/03/29] +\reversemarginpar +%</!doc> % \end{macrocode} -% Sprachabhängiges Setzen von Anführungszeichen. +% Das Paket für intelligente Leerzeichen am Ende von Makros mit \cs{xspace}. % \begin{macrocode} -\AfterPackage*{inputenc}{\RequirePackage{csquotes}[2011/10/22]} -\AtBeginDocument{% - \@ifpackageloaded{csquotes}{}{% -%<*class> - \ClassWarning% -%</class> -%<*package> - \PackageWarning% -%</package> - {tudscrman}{Package `csquotes' not loaded}% - \providecommand\enquote[1]{\glqg#1\grqq{}}% +\RequirePackage{xspace}[2009/10/20] +\xspaceaddexceptions{"=} +% \end{macrocode} +% Für das Paket \pkg{geometry} erfolgen durch \TUDScript vielerlei Anpassungen. +% Um bei einer signifikanten Änderung des Paketes passend reagieren zu können, +% wird auf das aktuelle Paketdatum geprüft und für neue Versionen eine Warnung +% erzeugt. +% \begin{macrocode} +%<*!doc> +\@ifpackagelater{geometry}{2010/09/13}{% + \ClassWarning{\TUD@Class@Name}{% + Package `geometry' was updated so some patches\MessageBreak% + are maybe outdated }% -} +}{}% +%</!doc> % \end{macrocode} -% Das Paket \pkg{microtype} wird für den optischen Randausgleich verwendet. +% \begin{macro}{\vTUDScript} +% \begin{macro}{\vKOMAScript} +% Diese Befehle geben in der Dokumentation die aktuelle Version von \TUDScript +% sowie die mindestens notwendige Version von \KOMAScript aus. % \begin{macrocode} -\AfterPackage*{hyperref}{\RequirePackage[babel]{microtype}[2013/05/23]} +\newcommand*\vTUDScript{v\TUDScriptVersionNumber} +\newcommand*\vKOMAScript{v\TUD@Version@KOMA} % \end{macrocode} -% \begin{length}{\baselineskipglue} -% Diese Länge wird in der Dokumentation für alle möglichen stauch- und -% dehnbaren Einfügen genutzt. +% \end{macro}^^A \vKOMAScript +% \end{macro}^^A \vTUDScript +% \begin{macro}{\tud@english} +% Mit diesem Befehl wird der Inhalt des Arumentes mit englischen Trennmustern +% gesetzt, falls die Sprache geladen wurde. % \begin{macrocode} -\newlength\baselineskipglue +\newcommand*\tud@english[1]{#1} \AtBeginDocument{% - \setlength\baselineskipglue{% - .4\baselineskip plus .4\baselineskip minus .2\baselineskip% +%<*doc> + \providecommand*\iflanguageloaded[3]{#3}% +%</doc> + \iflanguageloaded{english}{% + \renewcommand*\tud@english[1]{\foreignlanguage{english}{#1}}% + }{}% +} +% \end{macrocode} +% \end{macro}^^A \tud@english +% +% \iffalse +%</body|doc> +%<*!doc> +%<*body> +% \fi +% +% \begin{macro}{\pdfstrcmp} +% \begin{macro}{\pdfshellescape} +% Sollte \app{lualatex} eingesetzt werden, sind diese \app{pdflatex}-Primitiven +% dennoch notwendig, wofür \pkg{pdftexcmds} geladen wird. +% \begin{macrocode} +\RequirePackage{ifluatex}[2016/05/16] +\ifluatex + \RequirePackage{pdftexcmds}[2016/05/21] + \let\pdfstrcmp\pdf@strcmp + \let\pdfshellescape\pdf@shellescape +\fi +% \end{macrocode} +% \end{macro}^^A \pdfshellescape +% \end{macro}^^A \pdfstrcmp +% \begin{macro}{\tud@list@sort} +% \changes{v2.02}{2014/07/25}{neu}^^A +% \begin{macro}{\tud@list@@sort} +% \changes{v2.02}{2014/07/25}{neu}^^A +% \begin{macro}{\tud@templist} +% \changes{v2.02}{2014/07/25}{neu}^^A +% \begin{macro}{\if@tud@list@sorted} +% \changes{v2.02}{2014/07/25}{neu}^^A +% Der Befehl \cs{tud@list@sort} erwartet eine \pkg{etoolbox}-Liste und sortiert +% diese mit \cs{sort@list} in alphabetischer Reihenfolge in eine kommagetrennte +% Auflistung. Diese wird anschließend wieder in eine \pkg{etoolbox}-Liste +% umgewandelt. +% \begin{macrocode} +\newcommand*\tud@templist{} +\let\tud@templist\relax +\newcommand*\tud@list@sort[1]{% + \ifdefvoid{#1}{% + \ClassWarning{tudscrmanual}{% + The given list \string#1\space\MessageBreak% + is empty, nothing to sort here% + }% + }{% + \let\tud@reserved#1% + \let\tud@templist\relax% + \forlistloop\tud@list@@sort{\tud@reserved}% + \let\tud@reserved\relax% + \@for\@tempa:=\tud@templist\do{\listeadd\tud@reserved{\@tempa}}% + \let#1\tud@reserved% }% } % \end{macrocode} -% \end{length}^^A \baselineskipglue -% Verbesserte Zitate. +% Hier erfolgt die eigentliche Sortierung der Liste. % \begin{macrocode} -\PassOptionsToPackage{vskip=.5\baselineskipglue}{quoting} -\RequirePackage{quoting}[2014/01/28] +\newif\if@tud@list@sorted +\newcommand*\tud@list@@sort[1]{% % \end{macrocode} -% Automatisierte Datumsformatierung. +% Der erste Eintrag wird direkt der Liste hinzugefügt. % \begin{macrocode} -\RequirePackage{isodate}[2010/01/03] + \ifx\tud@templist\relax% + \def\tud@templist{#1}% % \end{macrocode} -% Verschiedenste Symbole aus dem \LaTeX-Universum. +% Weitere Einräge werden mit \cs{pdfstrcmp} an der richtigen Stelle eingefügt. +% Dabei wird die kommagetrennte Liste \cs{tud@templist} durchlaufen und +% \cs{@tempb} als Hilfsmakro verwendet, in welches die aktuelle Liste innerhalb +% der \cs{@for}-Schleife stückweise expandiert wird. Wenn das aktuelle Element +% an der dafür passenden Stelle eingesetzt wurde, wird \cs{if@tud@list@sorted} +% gesetzt. % \begin{macrocode} -\RequirePackage{hologo}[2012/04/26] + \else% + \@tud@list@sortedfalse% + \let\@tempb\@empty% + \@for\@tempa:=\tud@templist\do{% % \end{macrocode} -% Das Paket \pkg{marginnote} stellt nicht fließenden Randnotizen bereit. +% Ist der Eintrag bereits erfolgt, wird der verbliebene Teil der Liste +% angehangen. % \begin{macrocode} -\RequirePackage{marginnote}[2012/03/29] + \if@tud@list@sorted% + \expandafter\edef\expandafter\@tempb\expandafter{\@tempb,\@tempa}% + \else% % \end{macrocode} -% Sowohl im Handbuch als auch in den Tutroials werden Quelltextauszüge für das -% bessere Verständnis des Anwenders angegeben. Um diese darzustellen wird das -% Paket \pkg{listings} verwendet. +% Liegt der Eintrag in alphabetischer Reihenfolge vor dem aktuellen der +% durchlaufenenen Liste, so wird dieser davor eingefügt. Dabei muss der Fall, +% dass das Element der erste Eintrag in der temporären Liste \cs{@tempb} ist, +% eine Sonderbehandlung erfolgen. Anschließend wird \cs{@tud@list@sortedtrue} +% gesetzt. % \begin{macrocode} -\RequirePackage{listings}[2014/03/04] -\lstdefinestyle{tudscr}{% - basicstyle=\ttfamily\setstretch{1},% - keywordstyle=,% - columns=fullflexible,keepspaces,% - aboveskip=.5\baselineskipglue,% - belowskip=.5\baselineskipglue,% - language=[LaTeX]TeX,% - texcl,% -} + \expandafter\ifnum\pdfstrcmp{#1}{\@tempa}<\z@\relax% + \ifx\@tempb\@empty% + \expandafter\edef\expandafter\@tempb\expandafter{% + #1,\@tempa% + }% + \else% + \expandafter\edef\expandafter\@tempb\expandafter{% + \@tempb,#1,\@tempa% + }% + \fi% + \@tud@list@sortedtrue% + \else% % \end{macrocode} -% Mit dem Paket \pkg{silence} lassen sich ungewollte bzw. lästige Warnungen -% deaktivieren. +% Ist Eintrag in alphabetischer Reihenfolge nach dem aktuellen der geprüften +% Liste, so wird dieser (noch) nicht eingefügt. Der Sonderfall des ersten +% Elementes wird abgedeckt. % \begin{macrocode} -\RequirePackage{silence}[2012/07/02] + \ifx\@tempb\@empty% + \expandafter\edef\expandafter\@tempb\expandafter{\@tempa}% + \else% + \expandafter\edef\expandafter\@tempb\expandafter{\@tempb,\@tempa}% + \fi% + \fi% + \fi% + }% % \end{macrocode} -% Das Pakete wird genutzt, um externer Dateien nur zu kompilieren, wenn dies -% aufgrund einer Änderung auch notwendig ist. +% Wurde der Eintrag nach dem Durchlaufen der Liste nicht eingefügt, so erfolgt +% dies hier am Ende der Liste. % \begin{macrocode} -\RequirePackage{filemod}[2011/09/19] + \if@tud@list@sorted\else% + \expandafter\edef\expandafter\@tempb\expandafter{\@tempb,#1}% + \fi% % \end{macrocode} -% Sollte \pkg{auto-pst-pdf} aktiv sein, so wird das Laden von \pkg{todonotes} -% unterdrückt, da dieses wiederum das Paket \pkg{tikz} lädt, was zu Problem bei -% der automatisierten Erstellung von \env{pstricks}"=Grafiken führt. +% Die temporäre Liste \cs{@tempb} wird auf \cs{tud@templist} überschrieben. % \begin{macrocode} -\RequirePackage{ifpdf}[2011/01/30] -\ifpdf - \PassOptionsToPackage{colorinlistoftodos,obeyFinal,color=HKS92!10}{todonotes} - \RequirePackage{todonotes}[2012/07/25] -\else - \TUDoptions{ToDo=false} -\fi + \let\tud@templist\@tempb% + \fi% +} % \end{macrocode} -% Um die \cs{write18} sowohl für Windows als auch für unixoide Betriebssysteme -% nutzen zu können, wird das Paket \pkg{ifplatform} geladen. Damit dieses nicht -% allzu lästig ist, wird mithilfe von \pkg{silence} die normalerweise erzeugte -% Warnung der nicht aktivierten Option \opt{shell escape} deaktiviert. +% \end{macro}^^A \if@tud@list@sorted +% \end{macro}^^A \tud@templist +% \end{macro}^^A \tud@list@@sort +% \end{macro}^^A \tud@list@sort +% +% \iffalse +%<*package> +% \fi +% +% \subsubsection{Zusätzliche Pakete für das Paket \pkg{tudscrtutorial}} +% +% Mit dem Paket \pkg{scrwfile} lassen sich Probleme mit zu wenig verfügbaren +% Streams für das Schreiben externer Datein beheben. Hintergrund ist die +% Verwendung des Paketes \pkg{glossaries} in einem der Tutorials, welches eine +% Vielzahl solcher Streams benötigt. Das Paket \pkg{morewrites} hat keinen +% Einfluss auf \pkg{glossaries}. % \begin{macrocode} -\WarningFilter*{ifplatform}{^^J \space\space\space shell escape is disabled} -\RequirePackage{ifplatform}[2010/10/22] +\RequirePackage{scrwfile}[2013/08/05] +% \end{macrocode} +% Die Umgebungen \env{Preamble}, \env{Trunk} und \env{Hint} sowie deren +% Varianten nutzen das Paket \pkg{filecontents}, um ihren Inhalt in eine +% temporäre Datei zu schreiben und diese direkt mit dem Paket \pkg{listings} +% darzustellen sowie ggf. den Quelltext auszuführen. Beim Überschreiben einer +% Datei wird für gewöhnlich eine Warnung erzeugt. Mit dem Paket \pkg{silence} +% wird diese innerhalb der genannten Umgebungen deaktiviert. +% \begin{macrocode} +\RequirePackage{silence}[2012/07/02] +\RequirePackage{filecontents}[2011/10/08] +\WarningFilter[Tutorial]{latex}{Overwriting file}% +\WarningFilter[Tutorial]{latex}{Writing file}% +% \end{macrocode} +% +% \iffalse +%</package> +%<*class> +% \fi +% +% \subsubsection{Debug-Traces für die Klasse \cls{tudscrmanual}} +% +% Ab und an ist es beim Erstellen des Handbuchs recht sinnvoll, verschiedene +% Dinge direkt im Logfile zu überprüfen. Hierfür werden folgend einige Befehle +% zur Ablaufkontrolle definiert. +% +% \begin{macro}{\tracinglabels} +% \changes{v2.05}{2015/10/29}{neu}^^A +% \begin{macro}{\tud@trace@lbl@created@add} +% \changes{v2.05}{2015/10/29}{neu}^^A +% \begin{macro}{\tud@trace@lbl@missing@add} +% \changes{v2.05}{2015/10/29}{neu}^^A +% \begin{macro}{\tud@trace@lbl@created@list} +% \changes{v2.05}{2015/10/29}{neu}^^A +% \begin{macro}{\tud@trace@lbl@missing@list} +% \changes{v2.05}{2015/10/29}{neu}^^A +% Mit \cs{tracinglabels} wird die Nachverfolgung aller erstellten Labels in der +% Dokumentation aktiviert werden. Die Label werden zum einen direkt im Logfile +% ausgegeben und am Ende des selbigen in einer sortierten Liste ausgegeben. Die +% Sternversion des Befehls erzeugt keine sortierte Liste. Über das optionale +% Argument kann mit verschiedenen Schlüsseln zudem eingestellt werden, ob alle +% Label (\val{all}) oder nur die erstellten (\val{created}) beziehungsweise die +% fehlenden (\val{missing}) nachverfolgt werden sollen. +% \begin{macrocode} +\newcommand*\tud@trace@lbl@created@add[1]{} +\newcommand*\tud@trace@lbl@missing@add[1]{} +\NewDocumentCommand\tracinglabels{sO{missing}}{% + \newcommand*\tud@trace@lbl@created@list{}% + \newcommand*\tud@trace@lbl@missing@list{}% + \@tempswafalse% + \ifstr{#2}{created}{\@tempswatrue}{}% + \ifstr{#2}{all}{\@tempswatrue}{}% + \if@tempswa% + \renewcommand*\tud@trace@lbl@created@add[1]{% + \typeout{% + +++++ label created: ##1 on page \thepage% + }% + \xifinlist{##1}{\tud@trace@lbl@created@list}{}{% + \listxadd\tud@trace@lbl@created@list{##1}% + }% + }% + \IfBooleanF{#1}{% + \AfterEndDocument{% + \typeout{+++++ labels created (sorted) +++++}% + \tud@list@sort\tud@trace@lbl@created@list% + \forlistloop\typeout{\tud@trace@lbl@created@list}% + }% + }% + \fi% + \@tempswafalse% + \ifstr{#2}{missing}{\@tempswatrue}{}% + \ifstr{#2}{all}{\@tempswatrue}{}% + \if@tempswa% + \renewcommand*\tud@trace@lbl@missing@add[1]{% + \typeout{% + +++++ label missing: ##1 on page \thepage% + }% + \xifinlist{##1}{\tud@trace@lbl@missing@list}{}{% + \listxadd\tud@trace@lbl@missing@list{##1}% + }% + }% + \IfBooleanF{#1}{% + \AfterEndDocument{% + \typeout{+++++ labels missing (sorted) +++++}% + \tud@list@sort\tud@trace@lbl@missing@list% + \forlistloop\typeout{\tud@trace@lbl@missing@list}% + }% + }% + \fi% +} +\@onlypreamble\tracinglabels +% \end{macrocode} +% \end{macro}^^A \tud@trace@lbl@missing@list +% \end{macro}^^A \tud@trace@lbl@created@list +% \end{macro}^^A \tud@trace@lbl@missing@add +% \end{macro}^^A \tud@trace@lbl@created@add +% \end{macro}^^A \tracinglabels +% \begin{macro}{\tracingmarkup} +% \changes{v2.05}{2015/10/29}{neu}^^A +% \begin{macro}{\tud@trace@markup} +% \changes{v2.05}{2015/10/29}{neu}^^A +% Durch die Verwendung von \cs{tracinglabels} wird die Nachverfolgung aller +% Aufrufe von \cs{Process@@MarkupDeclare} und \cs{Process@@MarkupInline} durch +% \cs{Process@Markup} inklusive all ihrer Argumente aktiviert. Dies ist für die +% Kontrolle des erzeugten Markups sinnvoll. +% \begin{macrocode} +\newcommand*\tud@trace@markup[2]{} +\newcommand*\tracingmarkup{% + \renewcommand*\tud@trace@markup[2]{% + \typeout{+++++ markup ##1 on page \thepage^^J##2}% + }% +} +\@onlypreamble\tracingmarkup +% \end{macrocode} +% \end{macro}^^A \tud@trace@markup +% \end{macro}^^A \tracingmarkup +% \begin{macro}{\tracingbundle} +% \changes{v2.05}{2015/10/29}{neu}^^A +% \begin{macro}{\tud@trace@bdl@add} +% \changes{v2.05}{2015/10/29}{neu}^^A +% \begin{macro}{\tud@trace@bdl@list} +% \changes{v2.05}{2015/10/29}{neu}^^A +% Wird \cs{tracingbundle} in der Präambel verwendet, werden alle direkt oder +% indirekt durch \cs{Process@Markup} im Handbuch erzeugten Querverweise auf +% Klassen oder Pakete aus dem \TUDScript-Bundle nachverfolgt und am Ende des +% Logfiles ausgegeben. Damit kann im Zweifel übeprüft werden, ob eventuell eine +% falsche Referenz genutzt wurde, wodurch u.\,U. Querverweise oder Einträge in +% Index und Änderungsliste fehlerhaft werden oder erst gar nicht erscheinen. +% \begin{macrocode} +\newcommand*\tud@trace@bdl@add[1]{} +\newcommand*\tud@trace@bdl@list{} +\newcommand*\tracingbundle{% + \renewcommand*\tud@trace@bdl@add[1]{% + \begingroup% + \def\Class####1{class:####1}% + \def\Package####1{package:####1}% + \xifinlist{##1}{\tud@trace@bdl@list}{}{% + \listxadd\tud@trace@bdl@list{##1}% + }% + \endgroup% + }% + \AfterEndDocument{% + \typeout{+++++ bundle list +++++}% + \forlistloop\typeout{\tud@trace@bdl@list}% + }% +} +\@onlypreamble\tracingbundle % \end{macrocode} +% \end{macro}^^A \tud@trace@bdl@list +% \end{macro}^^A \tud@trace@bfundle +% \end{macro}^^A \tracingbundle +% +% \iffalse +%</class> +% \fi +% +% \subsubsection{Anpassungen für das Paket \pkg{hyperref} und Querverweise} +% % Das Paket \pkg{hyperref} wird für alle möglichen Links und Querverweise % geladen, \pkg{bookmark} verbesssert das Erstellen der Outline-Einträge. % \begin{macrocode} \PassOptionsToPackage{hyperindex=false,colorlinks,linkcolor=blue}{hyperref} \PassOptionsToPackage{open,openlevel=0}{bookmark} -\AtBeginDocument{% - \RequirePackage{hyperref}[2012/11/06] - \RequirePackage{bookmark}[2011/12/02] % \end{macrocode} -% Es folgen einige Befehle, die an das Paket \pkg{hyperref} gekoppelt sind. +% Es folgen einige Befehle, die an das Paket \pkg{hyperref} gekoppelt sind. +% Sobald das Paket geladen wurde, werden die Makros mit der jeweiligen +% Funktionalität definiert. +% \begin{macrocode} +\AfterPackage*{hyperref}{% +% \end{macrocode} +% Die Bezeichner für die Abschnittsebenen werden umbenannt. +% \begin{macrocode} + \renewcaptionname{ngerman}{\sectionautorefname}{Unterkapitel}% + \renewcaptionname{ngerman}{\subsectionautorefname}{Abschnitt}% + \renewcaptionname{ngerman}{\subsubsectionautorefname}{Unterabschnitt}% +% \end{macrocode} % \begin{macro}{\Email} -% Hyperlink für die Angabe einer E-Mail-Adresse. +% Hiermit wird ein Hyperlink für eine E"~Mail-Adresse erzeugt. % \begin{macrocode} - \newcommand*\Email[1]{\href{mailto:#1}{\nolinkurl{#1}}} + \newcommand*\Email[1]{\href{mailto:#1}{\nolinkurl{#1}}}% % \end{macrocode} % \end{macro}^^A \Email -% Die Bezeichner für die Abschnittsebenen werden umbenannt. +% \begin{macro}{\tudhyperdef} +% \changes{v2.02}{2014/10/27}{neu}^^A +% \begin{macro}{\tudhyperref} +% \changes{v2.02}{2014/10/27}{neu}^^A +% \begin{macro}{\tud@manualname} +% \changes{v2.05}{2015/1q/19}{neu}^^A +% Diese Befehle dienen sowohl zum Definieren von Textankern im Handbuch als +% auch zum Referenzieren auf diese. Bei der Erstellung des Ankers mit +% \cs{tudhyperdef} wird zusätzlich auch noch ein Label (\cs{label}) erzeugt. +% Der Anker wird mit \cs{Hy@raisedlink}~-- wie es auch bei pkg{hyperref}-Labels +% geschieht~-- über die Grundlinie gehoben. Die Sternversion sollte nach +% Überschriften verwendet werden und verschiebt die vertikale Position des +% Ankers noch weiter nach oben. +% \begin{macrocode} + \newcommand*\tud@manualname{tudscr}% +%<*class> + \NewDocumentCommand\tudhyperdef{sm}{% + \IfBooleanTF{#1}{% + \raisebox{4\baselineskip}[0pt][0pt]{\hyperdef{\tud@manualname}{#2}{}}% + \par\nobreak\vskip\dimexpr-\parskip-\baselineskip\relax% + \@afterindentfalse\@afterheading% + }{% + \Hy@raisedlink{\hyperdef{\tud@manualname}{#2}{}}\ignorespaces% + }% + \label{#2}% + \tud@trace@lbl@created@add{#2}% + }% + \newcommand*\tudhyperref[2]{\hyperref{}{\tud@manualname}{#1}{#2}}% +%</class> +% \end{macrocode} +% Aus einem Tutorial erfolgen alle Querverweise mit \cs{tudhyperref} auf das +% Anwenderhandbuch \enquote{tudscr} im übergeordneten Ordner. % \begin{macrocode} - \renewcaptionname{ngerman}{\sectionautorefname}{Unterkapitel} - \renewcaptionname{ngerman}{\subsectionautorefname}{Abschnitt} - \renewcaptionname{ngerman}{\subsubsectionautorefname}{Unterabschnitt} +%<*package> + \newcommand*\tudhyperref[2]{% + \hyperref{../\tud@manualname.pdf}{\tud@manualname}{#1}{#2}% + }% +%</package> % \end{macrocode} +% \end{macro}^^A \tud@manualname +% \end{macro}^^A \tudhyperref +% \end{macro}^^A \tudhyperdef % \begin{macro}{\autorefname} -% \begin{macro}{\@autorefname} -% \begin{macro}{\@@autorefname} +% \begin{macro}{\auto@refname} +% \begin{macro}{\auto@@refname} % Der Befehl \cs{autorefname} dient dazu, den Verweistyp beziehungsweise den % Bezeichner des aktuellen oder optional zu einem speziellen Label ohne die % dazugehörige Nummerierung zu erhalten. Auf der Seite LaTeX Stack Exchange% -%\footnote{\url{http://tex.stackexchange.com/q/33776/}} wurde das Prinzip +% \footnote{\url{http://tex.stackexchange.com/q/33776/}} wurde das Prinzip % vorgestellt und hier übernommen. % \begin{macrocode} \newcommand*\autorefname[1][current]{% \ifstr{#1}{current}{% \expandafter\HyPsd@@autorefname\@currentHref\@nil% }{% - \@autorefname\HyPsd@@autorefname{#1}% + \auto@refname\HyPsd@@autorefname{#1}% }% \unskip\xspace% - } - \newcommand*\@autorefname[2]{% + }% + \newcommand*\auto@refname[2]{% \expandafter\ifx\csname r@#2\endcsname\relax% ??% \else% - \expandafter\expandafter\expandafter\@@autorefname% + \expandafter\expandafter\expandafter\auto@@refname% \csname r@#2\endcsname{}{}{}{}\@nil#1\@nil% \fi% - } - \newcommand*\@@autorefname{} - \def\@@autorefname#1#2#3#4#5\@nil#6\@nil{#6#4.\@nil} + }% + \newcommand*\auto@@refname{}% + \def\auto@@refname#1#2#3#4#5\@nil#6\@nil{#6#4.\@nil}% % \end{macrocode} -% \end{macro}^^A \@@autorefname -% \end{macro}^^A \@autorefname +% \end{macro}^^A \auto@@refname +% \end{macro}^^A \auto@refname % \end{macro}^^A \autorefname -% \begin{macro}{\manualhyperdef} -% \changes{v2.02}{2014/10/27}{neu}^^A -% \begin{macro}{\manualhyperref} -% \changes{v2.02}{2014/10/27}{neu}^^A -% Diese beiden Befehle dienen zum Defnieren von Textankern im Handbuch und zum -% Referenzieren auf diese. Bei der Erstelung des Ankers mit \cs{manualhyperdef} -% wird zusätzlich auch noch ein Label (\cs{label}) erzeugt. Die Sternversion -% des Befehls unterdrückt dies. Der Anker wird mit \cs{Hy@raisedlink}~-- wie es -% auch bei normalen \pkg{hyperref}-Labels geschieht~-- über die Grundlinie -% gehoben. Die Version mit Apostroph kann nach Überschriften verwendet werden -% und verschiebt die vertikale Position des Ankers noch weiter nach oben. -% \begin{macrocode} -%<*class> - \NewDocumentCommand\manualhyperdef{st'm}{% - \IfBooleanTF{#2}{% - \raisebox{4\baselineskip}[0pt][0pt]{\hyperdef{\jobname}{#3}{}}% - \par\nobreak\vskip\dimexpr-\parskip-\baselineskip\relax% - \@afterindentfalse\@afterheading% - }{% - \Hy@raisedlink{\hyperdef{\jobname}{#3}{}}% - \ignorespaces% - }% - \IfBooleanF{#1}{\label{#3}}% - } - \newcommand*\manualhyperref[2]{\hyperref{}{\jobname}{#1}{#2}} -%</class> -% \end{macrocode} -% Aus einem Tutorial erfolgen alle Querverweise mit \cs{manualhyperref} auf das -% Anwenderhandbuch \enquote{tudscr}. +% Damit sind die Ausführungen für das Paket \pkg{hyperref} beendet. % \begin{macrocode} -%<*package> - \newcommand*\manualhyperref[2]{\hyperref{../tudscr}{tudscr}{#1}{#2}} -%</package> +} % \end{macrocode} -% \end{macro}^^A \manualhyperref -% \end{macro}^^A \manualhyperdef -% Damit sind die Ausführungen für das Paket \pkg{hyperref} \emph{fast} beendet. -% Etwas später wird noch der Befehl \cs{pdfexpandableoutline} definiert. +% Sollte das Paket \pkg{hyperref} nicht geladen werden, wird eine Rückfallebene +% definiert, wodurch die Klasse dennoch verwendet werden kann. % \begin{macrocode} -} +\TUD@UnwindPackage{hyperref}{% % \end{macrocode} -% Für die Erstellung des Indexes wird das Paket \pkg{imakeidx} zusammen mit -% \pkg{xindy} verwendet. Zuerst ein paar kleinere Einstellungen für das Layout. +% Zunächst die direkt innerhalb der Dokumentation verwendeten Befehle nebst +% dazugehöriger Warnung. +% \begin{macro}{\hypersetup} +% \begin{macro}{\hyperdef} +% \begin{macro}{\hyperref} +% \begin{macro}{\tud@hyperref@a} +% \begin{macro}{\tud@hyperref@b} +% \begin{macro}{\href} +% \begin{macro}{\hyperpage} +% \begin{macro}{\autoref} +% \begin{macro}{\texorpdfstring} +% \begin{macro}{\phantomsection} % \begin{macrocode} -\PassOptionsToPackage{xindy,splitindex}{imakeidx} -\RequirePackage{imakeidx}[2013/07/11]% -\indexsetup{% %<*class> - level=\addsec,% + \ClassWarningNoLine{tudscrmanual}% %</class> %<*package> - level=\subsection*,% -%</package> - noclearpage,firstpagestyle=headings,headers={\indexname}{\indexname},% - othercode={\renewcommand*\subitem{\@idxitem\hspace*{15\p@}}}% -} -\newcommand*\xdyopt{-M tudscrman-temp.xdy -L german-din} -% \end{macrocode} -% \begin{macro}{\tud@write@i} -% \changes{v2.02}{2014/10/22}{neu}^^A -% \begin{macro}{\tud@write@ii} -% \changes{v2.02}{2014/11/02}{neu}^^A -% \begin{macro}{\tud@read} -% \changes{v2.02}{2014/08/19}{neu}^^A -% Für die Erstellung der Indizes wird zum Sortieren das Programm \pkg{xindy} -% genutzt. Für dieses wird eine eigene Stildatei verwendet, welche zur Laufzeit -% erzeugt wofür zuerst ein Ausgabestream reserviert wird. -% \begin{macrocode} -\newcommand*\tud@write@i{} -\newwrite\tud@write@i -% \end{macrocode} -% Für die Tutorials werden später zusätzlich noch ein weiterer Ausgabe- sowie -% ein Eingabestream benötigt, die hier gleich mit initilaisiert werden. -% \begin{macrocode} -%<*package> -\newcommand*\tud@write@ii{} -\newwrite\tud@write@ii -\newcommand*\tud@read{} -\newread\tud@read + \PackageWarningNoLine{tudscrtutorial}% %</package> + {% + It is strongly recommended to load package `hyperref'.\MessageBreak% + Nevertheless, essential commands are rudimentarily\MessageBreak% + defined. At least the package `url' is loaded.% + }% + \RequirePackage{url}[2013/09/16]% + \providecommand*\hypersetup[1]{}% + \providecommand*\hyperdef[3]{\label{#1.#2}#3}% % \end{macrocode} -% \end{macro}^^A \tud@read -% \end{macro}^^A \tud@write@ii -% \end{macro}^^A \tud@write@i -% Nachfolgend wird die zu erstellenden \pkg{xindy}-Stildatei kurz beschrieben. -% \begin{macrocode} -\openout\tud@write@i=tudscrman-temp.xdy -% \end{macrocode} -% Als erstes wird Standard-\LaTeX-Modul geladen. -% \begin{macrocode} -\write\tud@write@i{(require "texindy.xdy")} -% \end{macrocode} -% Leider lässt sich für Seitenzahlbereiche via \val{: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} -%\write\tud@write@i{(require "ff-ranges.xdy")} -% \end{macrocode} -% -% Seitenbereiche werden sofort zusammengefasst, wobei als Trennzeichen ein -% Halbgeviertstrich verwendet wird. -% \begin{macrocode} -\write\tud@write@i{% -(define-location-class^^J% -\space\space "arabic-page-numbers" ("arabic-numbers") :min-range-length 1^^J% -)% -} -\write\tud@write@i{(markup-range :sep "--")} -% \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. -% \begin{macrocode} -\write\tud@write@i{% -(merge-rule "\@backslashchar[(.*)\@backslashchar]" "" :eregexp)% -} -% \end{macrocode} -% Innerhalb ausgewählter Auszeichnungs- und Textbefehle sollten die Befehle -% selbst, nicht jedoch die Argumente verworfen werden. Leider werden die -% manuell erstellten RegExp-Regeln durch \texttt{texindy} zu spät genutzt -% (\url{http://sourceforge.net/p/xindy/bugs/22/}). -% \begin{macrocode} -%\write\tud@write@i{(merge-rule "\\hyperidx\{(.*)\}\{(.*)\}" "/2" :eregexp)} -%\write\tud@write@i{(merge-rule "\\hologo\{(.*)\}" "/1" :eregexp)} -%\write\tud@write@i{(merge-rule "\\texttt\{(.*)\}" "/1" :eregexp)} -%\write\tud@write@i{(merge-rule "\\textsbn\{(.*)\}" "/1" :eregexp)} -%\write\tud@write@i{(merge-rule "\\textsbs\{(.*)\}" "/1" :eregexp)} -% \end{macrocode} -% Es werden die Attribute \emph{declare} mit der Abkürzung \emph{!} sowie -% \emph{important} mit der Abkürzung \emph{?} und \emph{default} definiert, -% welche hierarchisch gleichgestellt sind. -% \begin{macrocode} -\write\tud@write@i{% -(define-attributes (("declare" "!" "important" "?" "deprecated" "default")))% -} -% \end{macrocode} -% Eine Alternative wäre, diese in der Hierarchie zu unterscheiden, allerdings -% war eine Bildung von zufriedenstellenden Seitenbereichen dabei nicht möglich -% und wurde deshalb verworfen. -% \begin{macrocode} -%\write\tud@write@i{(markup-attribute-group-list :sep ", ")} -%\write\tud@write@i{% -%(define-attributes (("declare" "!") ("important" "?")("default")))% -%} -% \end{macrocode} -% Einträge, die als wichtig oder als Deklaration festgelegt wurden, könnten -% auch für normale Indexeinträge zur Bereichsbildung verwendet werden. -% Allerdings führt dies auch zur Erzeugung redundanter Einträge, falls es sich -% bei den Sondereinträgen bereits um einen Seitenbereich handelt. -% \begin{macrocode} -%\write\tud@write@i{(merge-to "declare" "default")} -%\write\tud@write@i{(merge-to "!" "default")} -%\write\tud@write@i{(merge-to "important" "default")} -%\write\tud@write@i{(merge-to "?" "default")} -% \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} -\write\tud@write@i{% -(markup-locref^^J% -\space\space :attr "declare"^^J% -\space\space :open "\string\textbf{\string\hyperpage{"^^J% -\space\space :close "}}"^^J% -)% -} -\write\tud@write@i{% -(markup-locref^^J% -\space\space :attr "!"^^J% -\space\space :open "\string\textbf{\string\hyperpage{"^^J% -\space\space :close "}}"^^J% -)% -} -\write\tud@write@i{% -(markup-locref^^J% -\space\space :attr "important"^^J% -\space\space :open "\string\textsl{\string\hyperpage{"^^J% -\space\space :close "}}"^^J% -)% -} -\write\tud@write@i{% -(markup-locref^^J% -\space\space :attr "?"^^J% -\space\space :open "\string\textsl{\string\hyperpage{"^^J% -\space\space :close "}}"^^J% -)% -} -\write\tud@write@i{% -(markup-locref^^J% -\space\space :attr "default"^^J% -\space\space :open "\string\hyperpage{"^^J% -\space\space :close "}"^^J% -)% -} -% \end{macrocode} -% Für die Änderungsliste wird ein separates Attribut erstellt. Mit diesem wird -% es möglich, die Seitenangabe für Optionen und Befehle zu unterdrücken, welche -% aus \TUDScript entfernt wurden oder veraltet sind, wenn mit \cs{Replace} eine -% Alternative eingeführt wurde. Dafür wird der Befehl \cs{deprecatedhyperpage} -% verwendet, welcher im Bedarfsball auf \cs{@gobble} gesetzt wird. -% \begin{macrocode} -\write\tud@write@i{% -(markup-locref^^J% -\space\space :attr "deprecated"^^J% -\space\space :open "\string\deprecatedhyperpage{"^^J% -\space\space :close "}"^^J% -)% -} -% \end{macrocode} -% Punkte zwischen Eintrag und Seitenzahl. -% \begin{macrocode} -\write\tud@write@i{% - (markup-locclass-list :open "\string\,\string\dotfill\string\,")% -} -% \end{macrocode} -% Dieser Querverweistyp wird speziell im allgemeinen Index verwendet, um auf -% einen Spezialindex zu verweisen. -% \begin{macrocode} -\write\tud@write@i{(define-crossref-class "seeidx")} -\write\tud@write@i{% -(markup-crossref-list^^J% -\space\space :class "seeidx" :open "\string\seeidx{" :sep "; " :close "}{}"^^J% -)% -} -% \end{macrocode} -% Damit ist die \pkg{xindy}-Stildatei fertig. -% \begin{macrocode} -\closeout\tud@write@i -% \end{macrocode} -% Nun können die einzelnen Indizes erstellt werden. +% Der Befehl \cs{hyperref} existiert in zwei Varianten. Entweder mit einem +% optionalen und einem obligatorischen Argument oder mit vier Argumenten. % \begin{macrocode} + \providerobustcmd*\hyperref{% + \kernel@ifnextchar[{\tud@hyperref@a}{\tud@hyperref@b}% + } + \newcommand*\tud@hyperref@a[2][]{#2} + \newcommand*\tud@hyperref@b[4]{#4} + \providecommand*\href[3][]{#3}% + \providecommand*\hyperpage[1]{#1}% +% \end{macrocode} +% Der Befehl \cs{autoref} wird auch in der Sternversion genutzt. +% \begin{macrocode} + \providecommand*\autoref{??\xspace\kernel@ifstar{\ref}{\ref}}% +% \end{macrocode} +% Auch \cs{texorpdfstring} und \cs{phantomsection} werden vorgehalten. +% \begin{macrocode} + \providecommand*\phantomsection{}% + \providecommand*\texorpdfstring[2]{#1}% +% \end{macrocode} +% \end{macro}^^A \phantomsection +% \end{macro}^^A \texorpdfstring +% \end{macro}^^A \autoref +% \end{macro}^^A \hyperpage +% \end{macro}^^A \href +% \end{macro}^^A \tud@hyperref@b +% \end{macro}^^A \tud@hyperref@a +% \end{macro}^^A \hyperref +% \end{macro}^^A \hyperdef +% \end{macro}^^A \hypersetup +% \begin{macro}{\partautorefname} +% \begin{macro}{\chapterautorefname} +% \begin{macro}{\sectionautorefname} +% \begin{macro}{\subsectionautorefname} +% \begin{macro}{\subsubsectionautorefname} +% Die notwendigen, lokalen Bezeichner der Gliederungsebenen. +% \begin{macrocode} + \tud@locale@german{\partautorefname}{Teil}% + \tud@locale@german{\chapterautorefname}{Kapitel}% + \tud@locale@german{\sectionautorefname}{Unterkapitel}% + \tud@locale@german{\subsectionautorefname}{Abschnitt}% + \tud@locale@german{\subsubsectionautorefname}{Unterabschnitt}% + \tud@locale@english{\partautorefname}{Part}% + \tud@locale@english{\chapterautorefname}{chapter}% + \tud@locale@english{\sectionautorefname}{section}% + \tud@locale@english{\subsectionautorefname}{subsection}% + \tud@locale@english{\subsubsectionautorefname}{subsubsection}% +% \end{macrocode} +% \end{macro}^^A \subsubsectionautorefname +% \end{macro}^^A \subsectionautorefname +% \end{macro}^^A \sectionautorefname +% \end{macro}^^A \chapterautorefname +% \end{macro}^^A \partautorefname +% Anschließend folgen die für Klasse und Paket eigens definierten Befehle. +% \begin{macrocode} + \providecommand*\Email[1]{\mbox{#1}}% %<*class> -\makeindex[title={Allgemeiner Index},options=\xdyopt]% -%</class> -\makeindex[title={Klassen- und Paketoptionen},name=options,options=\xdyopt]% -\makeindex[% - title={Umgebungen, Befehle und Seitenstile},name=macros,options=\xdyopt% -]% -%<*class> -\makeindex[title={Umgebungs- und Befehlsparameter},name=keys,options=\xdyopt]% -\makeindex[title={Sprachabh\"angige Bezeichner},name=terms,options=\xdyopt]% -\makeindex[title={Schriftelemente},name=fonts,options=\xdyopt]% -\makeindex[title={Farben},name=colors,options=\xdyopt]% -%</class> -\makeindex[title={Klassen, Pakete und Dateien},name=files,options=\xdyopt]% -%<*class> -\makeindex[title={\"Anderungsliste},name=changelog,columns=1,options=\xdyopt]% + \ProvideDocumentCommand\tudhyperdef{sm}{\label{#2}}% %</class> -% \end{macrocode} -% -% \iffalse -%<*class> -% \fi -% -% \subsubsection{Pakete für die Klasse \cls{tudscrman}} -% -% Das Paket \pkg{enumitem} erlaubt das Beeinflussen der Standardlisten und die -% Ableitung neuer Listen aus diesen. mit \cs{setlist\{noitemsep\}} werden die -% zusätzlichen Zwischenräume innerhalb der Listen beseitigt. -% \begin{macrocode} -\RequirePackage{enumitem}[2011/09/28] -\setlist{noitemsep} -% \end{macrocode} -% Das Paket \pkg{ellipsis} sorgt für korrekte Auslassungpunkte. -% \begin{macrocode} -\AtBeginDocument{ - \RequirePackage{ellipsis}[2004/9/28] - \let\ellipsispunctuation\relax + \providecommand*\tudhyperref[2]{#2}% + \providecommand*\autorefname[1][]{??\xspace}% } % \end{macrocode} -% Mit Hilfe von \pkg{tabularx} können Tabellen bestimmter Breite und -% automatisch berechneten Spaltenbreiten gesetzt werden. -% \begin{macrocode} -\RequirePackage{tabularx}[1999/01/07] -% \end{macrocode} -% Mit \pkg{ragged2e} wird~-- falls benötigt~-- die Silbentrennung im -% Flattersatz aktiviert. -% \begin{macrocode} -\RequirePackage{ragged2e}[2009/05/21] -% \end{macrocode} -% Die Fußnoten werden nicht mit jedem Kapitel zurückgesetzt. -% \begin{macrocode} -\RequirePackage{chngcntr}[2009/09/02] -\counterwithout{footnote}{chapter} -% \end{macrocode} -% Das Paket wird für die Erstellung von Tabellen verwendet. -% \begin{macrocode} -\RequirePackage{booktabs}[2005/04/14] -% \end{macrocode} +% \begin{macro}{\fullref} % Verbesserte Referenzierungen auf Seiten. % \begin{macrocode} -\RequirePackage{varioref}[2011/10/02]% +\RequirePackage{varioref}[2011/10/02] \renewcommand*\fullref[1]{\hyperref[#1]{\autoref*{#1} \vpageref{#1}}} % \end{macrocode} -% Erstellen von Grafiken. +% \end{macro}^^A \fullref +% \begin{macro}{\hrfn} +% \changes{v2.02}{2014/08/16}{neu}^^A +% \changes{v2.04}{2015/02/18}{Schriftgröße mit \cs{scalebox}}^^A +% Mit diesem Makro können Hyperlinks im Fließtext erzeugt werden, welche +% zusätzlich noch die dazugeörige URL als Fußnote anzeigen. % \begin{macrocode} -\RequirePackage{tikz}[2013/12/13] +\newcommand*\hrfn[2]{% + \href{#1}{\trim@spaces{#2}}% + \footnote{% + \scalebox{0.95}{% % \end{macrocode} -% Einbinden von ganzseitigen PDF"~Dokumenten als Beispiel im Handbuch. +% Die Box wird verwendet, um zu lange URLs ausreichend zu verkleinern. Außerdem +% werden Unterstriche entschärft, die im Zweifel zu Fehlern führen können. % \begin{macrocode} -\RequirePackage{pdfpages}[2013/08/25] + \def\_{_}% + \edef\@tempa{#1}% + \strut\expandafter\url\expandafter{\@tempa}% + }% + }% +} % \end{macrocode} -% Typographisch saubere Einheiten. -% \begin{macrocode} -\RequirePackage{units}[1998/08/04] +% \end{macro}^^A \hrfn +% Wenn \pkg{hyperref} geladen wird, erzeugt das Paket \pkg{babel} innerhalb von +% \cs{pdfstringdef} ziemlich viele und absolut unnötige Infos in der Form +% \texttt{Package babel Info: Redefining ngerman shorthand}. Dieser Patch dient +% zum Unterdrücken dieser Infos. +% \begin{macrocode} +\AfterPackage*{hyperref}{% + \patchcmd{\pdfstringdef}{\csname HyPsd@babel@}{% + \let\bbl@info\@gobble\csname HyPsd@babel@% + }{}{\tud@patch@wrn{pdfstringdef}}% +} % \end{macrocode} -% Befehle für die Dokumentation des Pakets \pkg{tudscrsupervisor}. +% Das Paket \pkg{microtype} wird für den optischen Randausgleich verwendet. Es +% sollte erst nach \pkg{hyperref} geladen werden. % \begin{macrocode} -\RequirePackage{tudscrsupervisor}[\TUDVersion] -% \end{macrocode} -% -% \iffalse -%</class> -%<*package> -% \fi -% -% \subsubsection{Pakete für das Paket \pkg{tudscrman}} -% -% Mit dem Paket \pkg{scrwfile} lassen sich Probleme mit zu wenig verfügbaren -% Streams für das Schreiben externer Datein beheben. Hintergrund ist die -% Verwendung des Paketes \pkg{glossaries} in einem der Tutorials, welches eine -% Vielzahl solcher Streams benötigt. Das Paket \pkg{morewrites} hat keinen -% Einfluss auf \pkg{glossaries}. -% \begin{macrocode} -\RequirePackage{scrwfile}[2013/08/05] +\AfterPackage*{hyperref}{\RequirePackage[babel]{microtype}[2013/05/23]} % \end{macrocode} -% Die Umgebungen \env{Preamble}, \env{Trunk} und \env{Hint} sowie deren -% Varianten nutzen das Paket \pkg{filecontents}, um ihren Inhalt in eine -% temporäre Datei zu schreiben und diese direkt mit dem Paket \pkg{listings} -% darzustellen sowie ggf. den Quelltext auszuführen. Beim Überschreiben einer -% Datei wird für gewöhnlich eine Warnung erzeugt. Mit dem Paket \pkg{silence} -% wird diese innerhalb der genannten Umgebungen deaktiviert. +% Wurde \pkg{hyperref} nicht geladen, dann soll auf \pkg{microtype} trotzdem +% nicht verzichtet werden. % \begin{macrocode} -\RequirePackage{filecontents}[2011/10/08] -\WarningFilter[Tutorial]{latex}{Overwriting file}% +\TUD@UnwindPackage{hyperref}{\RequirePackage[babel]{microtype}[2013/05/23]} % \end{macrocode} % % \iffalse -%</package> %</body> %<*option> % \fi % -% \subsection{Optionen der Anwenderdokumentation} +% \subsection{Optionen für das Ausgabeformat} % -% Hier werden die Optionen für Klasse und Paket definiert. -% -% \begin{option}{ToDo} -% \changes{v2.02}{2014/07/10}{neu}^^A -% \begin{macro}{\if@tud@todo} -% \changes{v2.02}{2014/07/10}{neu}^^A -% \begin{macro}{\tud@todo@type} -% \changes{v2.03}{2015/01/25}{neu}^^A -% Diese Option ist verantwortlich für den Schalter \cs{if@tud@todo}. Über -% diesen wird gesteuert, ob ToDo-Notizen ausgegeben werden sollen. +% \begin{option}{final} +% \begin{option}{print} +% \begin{macro}{\tudfinalflag} +% \begin{macro}{\tudprintflag} +% Diese beiden Optionen dienen zur finalen und/oder der unbunten Ausgabe. % \begin{macrocode} -\newif\if@tud@todo -\@tud@todotrue -\newcommand*\tud@todo@type{} -\TUD@key{ToDo}[true]{% - \TUD@set@ifkey{ToDo}{@tud@todo}{#1}% +\TUD@key{final}[true]{% + \TUD@set@ifkey{final}{@tempswa}{#1}% \ifx\FamilyKeyState\FamilyKeyStateProcessed% - \let\tud@todo@type\relax% - \else% - \def\tud@todo@type{#1}% - \@tud@todotrue% - \FamilyKeyStateProcessed% + \if@tempswa% + \let\tudfinalflag\relax% + \fi% + \fi% +} +\TUD@key{print}[true]{% + \TUD@set@ifkey{print}{@tempswa}{#1}% + \ifx\FamilyKeyState\FamilyKeyStateProcessed% + \if@tempswa% + \let\tudprintflag\relax% + \fi% \fi% } % \end{macrocode} -% \end{macro}^^A \tud@todo@type -% \end{macro}^^A \if@tud@todo -% \end{option}^^A ToDo +% Wurde eine oder beide der Optionen \opt{final} oder \opt{print} gesetzt bzw. +% vor einem externen \app{pdflatex}-Aufruf die Flags \cs{tudfinalflag} und/oder +% \cs{tudprintflag} definiert, werden die entsprechenden Einstellungen zur +% finalen Ausgabe und/oder unbunten Druck vorgenommen und anschließend die +% entsprechenden Optionen unschädlich gemacht. +% \begin{macrocode} +\AtEndPreamble{% + \ifdef{\tudfinalflag}{% + \TUDoptions{ToDo=false}% + \TUD@key{ToDo}{}% + }{}% + \ifdef{\tudprintflag}{% + \ifnum\tud@cd@num>\z@\relax% + \TUDoptions{cd=true}% + \fi% + \TUD@key{cd}{}% + \ifundef{\hypersetup}{}{\hypersetup{hidelinks}}% + }{}% +} +% \end{macrocode} +% \end{macro}^^A \tudprintflag +% \end{macro}^^A \tudfinalflag +% \end{option}^^A print +% \end{option}^^A final % % \iffalse %<*class> % \fi % +% \subsection{Standardoptionen der Anwenderdokumentation} +% % Es werden einige Optionen für das Handbuch standardmäßig aktiviert. Dazu % werden diese an die entsprechende Elternklasse übergeben. % \begin{macrocode} @@ -661,1550 +801,3671 @@ captions=tableheading,% numbers=noenddot,% cd=color,% -}{\TUDClassName@Parent} +}{\TUD@Class@Parent} \PassOptionsToPackage{automark}{scrlayer-scrpage} % \end{macrocode} -% \begin{macro}{\tudfinalflag} -% \begin{macro}{\tudprintflag} -% Außerdem wird geprüft, ob durch einen externen pdf\LaTeX-Aufruf die Flags -% \cs{tudfinalflag} und/oder \cs{tudprintflag} definiert wurde. In diesem Fall -% werden Optionen zur finalen Ausgabe und/oder unbunten Druck aktiviert. -% \begin{macrocode} -\DeclareOption{final}{\let\tudfinalflag\relax} -\DeclareOption{print}{\let\tudprintflag\relax} -\AtBeginDocument{% - \ifdef{\tudfinalflag}{\TUDoptions{ToDo=false}}{}% - \ifdef{\tudprintflag}{% - \TUDoptions{color=no}% - \PassOptionsToPackage{hidelinks}{hyperref}% - }{}% -} -% \end{macrocode} -% \end{macro}^^A \tudprintflag -% \end{macro}^^A \tudfinalflag % % \iffalse %</class> -%<*package> +%</option> +%<*body> +%<*class> % \fi % -% Wird das Paket \pkg{tudscrman} geladen, werden zu Beginn des Dokumentes ein -% paar Standardeinstellungen gemacht. +% \subsection{Deklarationen für die Klasse} +% +% Die Umgebungen \env{Declaration} und \env{Declaration*} werden beide für die +% Auszeichnung von Optionen, Umgebungen und Befehlen verwendet, die \TUDScript +% dem Anwender zur Verfügung stellt. % +% \begin{macro}{\if@tud@declare} +% \begin{macro}{\if@openindex} +% \begin{macro}{\tud@declare@num} +% \changes{v2.05}{2015/11/01}{neu}^^A +% Dies sin ein paar Hilfsmakros zur Steuerung des Markup sowie der Ausgabe von +% Deklarationen, Index und Änderungsliste, welche bei den nächsten Befehlen und +% Umgebungen genutzt werden. Mit \cs{if@tud@declare} wird festgelegt, ob die +% Befehle für das Markup in der Ausgabe als Deklaration oder anderweiteig +% erfolgt. Der Schalter \cs{if@openindex} wird zu Beginn einer Deklaration auf +% \val{true} gesetzt und vor dem Beenden auf \val{false}. Damit wird bestimmt, +% ob ein öffnender oder ein schließender Indexeintrag erzeugt werden soll. % \begin{macrocode} -\KOMAoptions{headings=small} -\TUDoptions{cd=true,cdfoot=true} +\newif\if@tud@declare +\newif\if@openindex % \end{macrocode} -% Falls innerhalb eines Tutorials das Paket \pkg{pstricks} verwendet wird, muss -% dafür Sorge getragen werden, dass die automatische Kompilierung reibungslos -% mit \pkg{auto-pst-pdf} funktioniert. +% Das Makro \cs{tud@declare@num} bestimmt innerhalb einer Deklaration, wie +% das Markup erfolgen soll. Die möglichen Werte für \cs{tud@declare@num} sind +% bei der Beschreibung von \cs{Process@@MarkupDeclare} zu finden. % \begin{macrocode} -\AfterPackage*{pstricks}{% - \ifnum\pdfshellescape=\@ne\relax\else% - \PassOptionsToPackage{off}{auto-pst-pdf}% - \fi% - \RequirePackage{auto-pst-pdf}[2009/04/26]% -} +\newcommand*\tud@declare@num{0} % \end{macrocode} -% -% \iffalse -%</package> -%</option> -%<*body> -% \fi -% -% \subsection{Gemeinsame Befehle und Umgebungen für Klasse und Paket} -% -% Es folgen die Definitionen für Befehle und Umgebungen für Klasse und Paket, -% welche sich überschneidenden und für beide benötigt werden. Allerdings sind -% diese jedoch für Klasse und Paket in ihrer Implementierung teilweise sehr -% unterschiedlich. -% -% \subsubsection{Auszeichnung von Variablen, Parametern etc.} -% -% \begin{macro}{\PName} -% \begin{macro}{\PBoolean} -% \begin{macro}{\PBName} -% \changes{v2.02}{2014/11/12}{neu}^^A -% \begin{macro}{\PSet} -% \begin{macro}{\Parameter} -% \begin{macro}{\OParameter} -% \begin{macro}{\LParameter} -% \begin{macro}{\OLParameter} -% \begin{macro}{\PValue} -% \begin{macro}{\PParameter} -% \begin{macro}{\POParameter} -% \begin{macro}{\textOR} -% \changes{v2.02}{2015/01/25}{neu}^^A -% Diese Befehle dienen zum Auszeichnen von obligatorischen und optionalen -% Parametern und Befehlen oder bestimmten Wertzuweisungen. +% \end{macro}^^A \tud@declare@num +% \end{macro}^^A \if@openindex +% \end{macro}^^A \if@tud@declare +% \begin{environment}{Declaration} +% \begin{environment}{Obsolete} +% \changes{v2.05}{2015/11/01}{neu}^^A +% \begin{macro}{\tud@declaration@list} +% \begin{macro}{\if@tud@obsolete} +% \changes{v2.05}{2015/11/01}{neu}^^A +% Es werden einige Hilfsmakros für die Ausgabe einer Deklaration sowie der +% dazugehörigen Änderungsliste initialisiert. % \begin{macrocode} -\newrobustcmd*\textOR{\,\textbardbl\,} -\newrobustcmd*\PName[1]{\mbox{\texttt{\textsl{<#1>}}}} -\newrobustcmd*\PBoolean{\PName{Ein-Aus-Wert}} -\newrobustcmd*\PBName[1]{\PBoolean\textOR\PName{#1}} -\newrobustcmd*\PSet{\PName{Einstellung}} -\newrobustcmd*\Parameter[1]{\mbox{\texttt{\{}\PName{#1}\texttt{\}}}} -\newrobustcmd*\OParameter[1]{\mbox{\texttt{[}\PName{#1}\texttt{]}}} -\newrobustcmd*\LParameter{\mbox{\texttt{[}\PName{Parameterliste}\texttt{]}}} -\newrobustcmd*\OLParameter[1]{% - \mbox{\texttt{[}\PName{#1}\textOR\PName{Parameterliste}\texttt{]}}% -} -\newrobustcmd*\PValue[1]{\mbox{\texttt{#1}}} -\newrobustcmd*\PParameter[1]{\mbox{\texttt{\{#1\}}}} -\newrobustcmd*\POParameter[1]{\mbox{\texttt{[#1]}}} +\newcommand*\tud@declaration@list{} +\let\tud@declaration@list\relax % \end{macrocode} -% \end{macro}^^A \textOR -% \end{macro}^^A \POParameter -% \end{macro}^^A \PParameter -% \end{macro}^^A \PValue -% \end{macro}^^A \OLParameter -% \end{macro}^^A \LParameter -% \end{macro}^^A \OParameter -% \end{macro}^^A \Parameter -% \end{macro}^^A \PSet -% \end{macro}^^A \PBName -% \end{macro}^^A \PBoolean -% \end{macro}^^A \PName -% -% \subsubsection{Kompilieren von externen Dateien und Querverweise auf diese} +% Die \env{Declaration}-Umgebung dient zur Deklaration von Optionen, Umgebungen, +% Befehlen, Parametern, Bezeichnern, Längen, Schriftelementen und Farben. Diese +% werden mit den entsprechenden Auszeichnungsbefehlen als obligatorisches +% Argument übergeben. Zuvor kann noch vorher im ersten optionalen Argument eine +% Beschreibung für die Änderungsliste in der Form \oarg{Verison!Beschreibung} +% angegeben werden. Danach kann im dritten Argument~-- das zweite optionale~-- +% die Voreinstellung für eine Option oder dergleichen angegeben werden. Das +% nächste optionale Argument erlaubt die Angabe einer bedingten Voreinstellung, +% also einer anderen Voreinstellung als der zuerst angegeben unter bestimmten +% Voraussetzungen. Diese wird in der Form \oarg{Bedingung:Voreinstellung} +% angegeben. Das letzte Argument ist ebenfalls optional, wird aber in der Form +% \marg{Zusatz} angegeben und enthält ggf. zusätzliche Informationen. % -% \begin{macro}{\Tutorial} -% \changes{v2.02}{2014/08/22}{neu}^^A -% \changes{v2.02}{2014/10/22}{Reimplementierung}^^A -% \begin{macro}{\hypertut} -% \changes{v2.02}{2014/09/02}{neu}^^A -% Die gegebenenfalls notwendige Kompilierung und die Referenzierung eines -% Tutorials aus dem Handbuch erfolgt mit \cs{Tutorial}. Außerdem erfolgt mit -% \cs{hypertut} ein verlinkter Eintrag in den Index. +% Die Umgebung \env{Obsolete} hat eine ganz ähnliche Funktion, wird allerdings +% für die Deklaration veralteter Befehle, Umgebungen, Optionen etc. verwendet. +% Da sich beide Umgebungen stark ähneln, werden zum Start bzw. zum Abschluss +% die Makros \cs{tud@declare@start} bzw. \cs{tud@declare@end} aufgerufen. Zu +% Beginn wird nichts weiter ausgegeben sondern lediglich alle übergebenen +% Argumente in jeweiligen Listen gesammelt. Die eigentliche Ausgabe der +% Deklaration erfolgt mit dem Befehl \cs{printdeclarationlist} bezieungsweise +% \cs{printobsoletelist}. % \begin{macrocode} -%<*class> -\newrobustcmd*\hypertut[2]{% - \hyperref{tutorials/#1.pdf}{\jobname}{tutorials:#1}{\textsbn{#1.pdf}#2}% +\NewDocumentEnvironment{Declaration}{omoog}{% + \listadd\tud@declaration@list{#2}% + \tud@declare@start[#1]{#2}{#3}{#4}{#5}% +}{% + \tud@declare@end{#2}{\printdeclarationlist}% } -\NewDocumentCommand\Tutorial{smd||}{% - \ifnum\pdfshellescape=\@ne\relax% % \end{macrocode} -% Um mit den verschachtelten Aufrufen von pdf\LaTeX{} umgehen zu können, wird -% das ganze Prozedere in ein Skript ausgelagert. Somit können die Aufrufe von -% pdf\LaTeX{} für die Tutorials im entsprechenden Ordner erfolgen. +% Für die Umgebung \env{Obsolete} sieht die Eingabe etwas anders aus. Das erste +% obligatorische Argument sollte eine Versionsnummer enthalten, ab wann die +% Deklaration veraltet ist. Das erste optionale Argument wird genutzt, wenn +% für eine weiterhin gültige Deklaration lediglich ein bestimmter Wert +% entfällt. Wird das erste Argument leer gelassen, erfolgt lediglich die +% Ausgabe der Deklaration ohne einen Eintrag in die Änderungsliste. Dies ist +% für Umgebungen und Befehle gedacht, bei denen lediglich ein oder mehrere +% Parameter geändert wurden bzw. entfallen. +% \begin{macrocode} +\newif\if@tud@obsolete +\NewDocumentEnvironment{Obsolete}{momoog}{% + \@tud@obsoletetrue% + \ifxblank{#1}{% +% \end{macrocode} +% Ohne Versionsnummer erfolgt die Ausgabe ohne Label. Für den Eintrag wird auch +% keine Änderungsnotiz erzeugt. +% \begin{macrocode} + \listadd\tud@declaration@list{% + \def\tud@declare@num{1}% + #3% + \def\tud@declare@num{0}% + }% + \tud@declare@start{#3}{#4}{#5}{#6}% + }{% + \listadd\tud@declaration@list{#3}% +% \end{macrocode} +% Wurde ein optionales Argument angegeben, bezieht sich der Änderungseintrag +% auf ebendieses Argument, die eigentliche, obsolete Deklaration wird als +% Untereintrag genutzt. % \begin{macrocode} - \filemodCmp{tutorials/#2.pdf}{tutorials/#2.tex}{}{% - \immediate\openout\tud@write@i=tutorials.sh% - \immediate\write\tud@write@i{% - cd tutorials^^J% - pdflatex -shell-escape #2^^J% - pdflatex #2^^J% - biber #2^^J% - pdflatex -shell-escape #2^^J% - makeglossaries #2^^J% - pdflatex #2% - }% - \immediate\closeout\tud@write@i% + \IfValueTF{#2}{% + \Changed@At@CreateList[#2]{#1!#3}% + }{% + \Changed@At@CreateList[#3]{#1}% + }% + \IfValueTF{#6}{% + \tud@declare@start{#3}{#4}{#5}{#6}% % \end{macrocode} -% Hier erfolgt die Unterscheidung der Befehle für die unterschiedlichen OS. +% Ohne eine zusätzliche Angabe imletzten optionalen Argument wird standardmäßig +% der Entfall der Deklaration angegeben. Alternativ dazu kann im ersten +% Argument der Versionsangabe mit einem Dopppelpunkt von dieser getrennt eine +% neue bzw. aktuell gültige Deklaration als Querverweis angegeben werden. % \begin{macrocode} - \ifwindows% - \immediate\write18{rename tutorials.sh tutorials.bat}% - \immediate\write18{tutorials.bat}% - \immediate\write18{del tutorials.bat}% - \else% - \immediate\write18{bash tutorials.sh}% - \immediate\write18{rm tutorials.sh}% + }{% + \toks@{\tud@declare@start{#3}{#4}{#5}}% + \def\@tempa{\emph{entf\"allt}}% + \in@{:}{#1}% + \ifin@% + \def\@tempb##1:##2\@nil{% + \IfArgIsEmpty{##2}{}{% + \def\@tempa{\seeref{##2'page'}}% + }% + }% + \@tempb#1\@nil% \fi% + \eaddto@hook\toks@{\expandafter{\@tempa}}% + \the\toks@% }% - \fi% + }% + \@tud@obsoletefalse% +}{% + \@tud@obsoletetrue% + \tud@declare@end{#3}{\printobsoletelist}% + \@tud@obsoletefalse% +} % \end{macrocode} -% Hyperlink und Indexeintrag. +% \end{macro}^^A \if@tud@obsolete +% \end{macro}^^A \tud@declaration@list +% \end{environment}^^A Obsolete +% \end{environment}^^A Declaration +% \begin{macro}{\tud@preset@list} +% \begin{macro}{\if@tud@preset@list} +% \begin{macro}{\tud@additional@list} +% \begin{macro}{\if@tud@additional@list} +% Dies sind die temporären listen, die für alle Deklarationen verwendet werden. +% \begin{macrocode} +\newcommand*\tud@preset@list{} +\let\tud@preset@list\relax +\newif\if@tud@preset@list +\newcommand*\tud@additional@list{} +\let\tud@additional@list\relax +\newif\if@tud@additional@list +% \end{macrocode} +% \end{macro}^^A \if@tud@additional@list +% \end{macro}^^A \tud@additional@list +% \end{macro}^^A \if@tud@preset@list +% \end{macro}^^A \tud@preset@list +% \begin{macro}{\tud@declare@start} +% \changes{v2.05}{2015/11/01}{neu}^^A +% \begin{macro}{\tud@declare@end} +% \changes{v2.05}{2015/11/01}{neu}^^A +% Dies sind die Makros für die eigentliche Abarbeitung der Deklarationsbefehle +% zu Beginn und Ende der Umgebungen \env{Declaration} und \env{Obsolete}. +% \begin{macrocode} +\NewDocumentCommand\tud@declare@start{ommmm}{% +% \end{macrocode} +% Die optional angegebenen Änderungen werden mit \cs{Changed@At@CreateList} in +% der Liste \cs{tud@changedat@list} gesichert und später sowohl für die +% Randnotiz als auch die Änderungsliste verarbeitet. +% \begin{macrocode} + \Changed@At@CreateList[#2]{#1}% +% \end{macrocode} +% Hier noch die Listen für Voreinstellungen\dots % \begin{macrocode} - \IfFileExists{tutorials/#2.pdf}{% - \hypertut{#2}{}% + \IfValueTF{#3}{% + \@tud@preset@listtrue% + \def\@tempa{Voreinstellung: \PValue{#3}}% + \IfValueT{#4}{% + \def\@tempb[##1:##2]{##1: \PValue{##2}}% + \eappto\@tempa{ | \expandonce{\@tempb[#4]}}% + }% + \listeadd\tud@preset@list{\expandonce\@tempa}% }{% - \textsbn{#2.pdf}% - \tud@shellescape@wrn% + \listadd\tud@preset@list{\relax}% }% - \IfBooleanF{#1}{% - \index[files]{\hypertut{#2}{~{\idxfont(Tutorial)}}\IfValueT{#3}{|#3}}% +% \end{macrocode} +% \dots sowie zusätliche Informationen. +% \begin{macrocode} + \IfValueTF{#5}{% + \@tud@additional@listtrue% + \listadd\tud@additional@list{(#5)}% + \in@{\Environment}{#2}% + \ifin@\listadd\tud@additional@list{\tabularnewline}\fi% + }{% + \listadd\tud@additional@list{\relax}% + \in@{\Environment}{#2}% + \ifin@% + \listadd\tud@additional@list{\relax}% + \listadd\tud@additional@list{\relax}% + \fi% }% } -%</class> % \end{macrocode} -% Der Befehl für die Querverweise innerhalb von Tutorials. +% Am Ende der Umgebungen wird das übergebenen Hauptargument erneut ausgeführt, +% was zum Beenden der Indexeinträge für die jeweilige Deklaration führt +% (\cs{@openindexfalse}, siehe \cs{Process@Index}). Dafür werden die Makros für +% die Angabe obligatorischer und optionaler Parameter lokal umdefiniert. % \begin{macrocode} -%<*package> -\newcommand*\Tutorial[1]{\href{#1.pdf}{\textsbn{#1.pdf}}} -%</package> +\newcommand*\tud@declare@end[2]{% + \ifx\tud@declaration@list\relax\else% + \ClassError{tudscrmanual}{\string#2\space is missing}{% + \string\tud@declaration@list\space is not empty. Did you\MessageBreak% + forget to print this list with\MessageBreak% + \string#2?% + }% + \fi% + \vskip-\lastskip% + \@tud@declaretrue\@openindexfalse#1\@tud@declarefalse% + \pagebreak[1]% +} % \end{macrocode} -% \end{macro}^^A \hypertut -% \end{macro}^^A \Tutorial -% -% \iffalse -%<*class> -% \fi -% -% \begin{macro}{\IncludeExample} -% \changes{v2.02}{2014/07/25}{Skalierung der eingefügten Seiten}^^A -% \changes{v2.02}{2014/10/14}{Reimplementierung}^^A -% Mit diesem Befehl wird eine \LaTeX-Datei ggf. übersetzt und anschließend als -% PDF"~Datei wieder eingebunden. Zuvor wird der dazugehörige Quelltext mittels -% \cs{lstinputlisting} im Dokument ausgegeben. Dieser Befehl wird lediglich für -% die Klasse \cls{tudscrman} benötigt. +% \end{macro}^^A \tud@declare@end +% \end{macro}^^A \tud@declare@start +% \begin{environment}{Declaration*} +% \changes{v2.02}{2014/10/09}{neu}^^A +% \changes{v2.05}{2015/08/04}{Indexaufteilung/-markup für Klassen und Pakete}^^A +% Die Sternversion der Umgebung \env{Declaration*} ist für die vereinfachte +% Deklaration von Klassen, Paketen etc. gedacht, bei denen keine Ausgabe +% sondern lediglich Hyperlink, Indexeintrag und Änderungsnotiz erzeugt werden +% sollen. Hierbei werden die Befehle \cs{tud@declare@special@start} sowie +% \cs{tud@declare@special@end} genutzt, wobei der Anker des erzeugten Labels +% nicht erhöht sondern auf der aktuellen Grundlinie erzeugt wird. % \begin{macrocode} -\newcommand*\IncludeExample[1]{% - \lstinputlisting[style=tudscr]{examples/#1}% +\NewDocumentEnvironment{Declaration*}{om}{% + \tud@declare@special@start[#1]{#2}{2}% +}{% + \tud@declare@special@end{#2}% +} % \end{macrocode} -% Die Beispiele werden nur erneut kompiliert, wenn sich diese geändert haben -% oder noch gar kein entsprechendes PDF"~Dokument existiert. -% \begin{macrocode} - \ifnum\pdfshellescape=\@ne\relax% - \filemodCmp{examples/#1.pdf}{examples/#1.tex}{}{% - \immediate\write18{% - pdflatex -output-directory examples examples/#1.tex - pdflatex -output-directory examples examples/#1.tex - }% +% \end{environment}^^A Declaration* +% \begin{environment}{Bundle*} +% \changes{v2.05}{2015/11/01}{neu}^^A +% Die Umgebung \env{Bundle*} wird verwendet, wenn ein zusätzliche Paket oder +% eine weitere Klasse in Ergänzung zu den Hauptklassen dokumentiert wird. Dabei +% wird die Umgebung \env{Bundle} geöffnet, nachdem das obligatorischen Argument +% mit dem Befehl \cs{tud@declare@special@start} deklariert wird. Dabei sollte +% die Umgebung \env{Bundle*} direkt nach einer Gliederungsüberschrift genutzt +% werden, in welcher das zu deklarierende Element (Klasse, Paket etc.) genannt +% wird, da der Anker des erzeugten Labels weiter nach oben auf die Höhe der +% Überschirft verschoben wird. Zum Abschluss der Deklaration wird nach dem +% Schließen der Umgebung \env{Bundle} \cs{tud@declare@special@end} genutzt. +% \begin{macrocode} +\NewDocumentEnvironment{Bundle*}{om}{% + \tud@declare@special@start[#1]{#2}{3}% + \Bundle{#2}% +}{% + \endBundle% + \tud@declare@special@end{#2}% +} +% \end{macrocode} +% \end{environment}^^A Bundle* +% \begin{macro}{\tud@declare@special@start} +% \changes{v2.05}{2015/11/01}{neu}^^A +% \begin{macro}{\tud@declare@special@end} +% \changes{v2.05}{2015/11/01}{neu}^^A +% Die beiden dienen zur vereinfachten Deklaration. Es wird keine Ausgabe +% sondern lediglich Hyperlink, Indexeintrag und Änderungsnotiz erzeugt. Das +% optionale Argument dient einem Änderungseintrag, das erste obligaotrische +% gilt der eigentlichen Deklaration, das zweite zur Einstellung des Makros +% \cs{tud@declare@num}, mit welchem das Verhalten für das Erzeugen der Labels +% gesteuert wird. +% \begin{macrocode} +\NewDocumentCommand\tud@declare@special@start{omm}{% + \Changed@At@CreateList(#2){#1}% + \def\tud@declare@num{#3}% + \@tud@declaretrue\@openindextrue#2\@tud@declarefalse% + \def\tud@declare@num{0}% +} +\newcommand*\tud@declare@special@end[1]{% + \ifx\tud@changedat@list\relax\else% + \ClassError{tudscrmanual}{\string\printchangedatlist\space is missing}{% + \string\tud@changedat@list\space is not empty. Did you\MessageBreak% + forget to print this list with \string\printchangedatlist?% }% \fi% -% \end{macrocode} -% Ist die gesuchte Datei vorhanden, wird diese auch eingebunden. Andernfalls -% wird eine Warnung mit dem Hinweis auf die notwendige Verwednung von -% \val{pdflatex} mit der Option \opt{--shell-escape} erzeugt. -% \begin{macrocode} - \IfFileExists{examples/#1.pdf}{% - \includepdf[% - pages=-,noautoscale,frame,keepaspectratio,pagecommand={},% - height=\textheight,width=\textwidth, offset=5mm 0mm% - ]{examples/#1.pdf}% - }{% - \tud@shellescape@wrn% - }% + \@tud@declaretrue\@openindexfalse#1\@tud@declarefalse% } % \end{macrocode} -% \end{macro}^^A \IncludeExample -% -% \iffalse -%</class> -% \fi -% -% \subsubsection{ToDo-Liste} +% \end{macro}^^A \tud@declare@special@end +% \end{macro}^^A \tud@declare@special@start +% \begin{macro}{\printdeclarationlist} +% \begin{length}{\tud@lastskip} +% \changes{v2.05}{2015/11/01}{neu}^^A +% \begin{macro}{\index} +% \changes{v2.05}{2015/11/01}{neu}^^A +% \begin{macro}{\label} +% \changes{v2.05}{2015/11/01}{neu}^^A +% Mit dem Befehl \cs{printdeclarationlist} erfolgt die eingentliche Ausgabe +% aller Deklarationen. Zweck ist es, mehrere \env{Declaration}-Umgebungen +% ineinander verschachteln zu können und eine Ausgabe aller auf einmal zu +% erzeugen. Die durch die ggf. nacheinander folgenden Deklarationen wurden in +% entsprechenden Listen gesammelt und werden hier jetzt formatiert ausgegben. % -% \begin{macro}{\ToDo} -% \changes{v2.02}{2014/07/10}{Verwendung von \pkg{todonotes}}^^A -% \changes{v2.03}{2015/01/25}{Ausgabe auf bestimmten Typ beschränkbar}^^A -% \begin{macro}{\@ToDo} -% \changes{v2.02}{2014/07/10}{neu}^^A -% \begin{macro}{\ListOfToDo} -% \changes{v2.02}{2014/07/10}{neu}^^A -% Mit dem Befehl \cs{ToDo}\oarg{options}\marg{inline text}\oarg{marginnote} -% kann bei aktivierter Option \opt{ToDo} eine Notiz mit einer offenen Ausgabe -% erstellt werden. Das vorangestellte Argument kann Optionen beinhalten, welche -% durch \pkg{todonotes} unterstützt werden. Außerdem werden die vier boolschen -% Schlüssel \val{doc}, \val{man}, \val{imp} und \val{nxt} definiert, welche -% eine feste, farbliche Kodierung erzeugen. Das angestellte optionale Argument -% erzeugt eine gleichartige Notiz am Rand, in welcher vorzugsweise die -% angedachte Version eingetragen werden kann. Mit \cs{ListOfToDo} wird abhängig -% von der Option \opt{ToDo} eine Liste der offenen Aufgaben erstellt. -% \begin{macrocode} -\newcommand*\@ToDo{} -\NewDocumentCommand\ToDo{somo}{% - \ifbool{@tud@todo}{% - \begingroup% +% Da die Verwendung der Befehle \cs{index} und \cs{label} nach Überschriften +% dazu führt, dass \cs{addvspace} nicht mehr richtig verendet werden kann, +% wird hier etwas gebastelt, damit das trotzdem funktioniert. Dabei wird +% einfach bei der verwendung der genannten Befehle der zuvor gesetzte vertikale +% Abstand in \cs{tud@lastskip} gesichert. +% \begin{macrocode} +\newskip\tud@lastskip +\pretocmd{\index}{\tud@lastskip=\lastskip}{}{\tud@patch@wrn{index}} +\pretocmd{\label}{\tud@lastskip=\lastskip}{}{\tud@patch@wrn{label}} +\NewDocumentCommand\printdeclarationlist{sd()}{% + \ifx\tud@declaration@list\relax\else% + \ifhmode% + \vskip\medskipamount% + \else% % \end{macrocode} -% Die boolschen Schlüssel. +% Im vertikalen modus wird dann einfach vom eigentlich gewünschten Abstand der +% durch \cs{label} bzw. \cs{index} erzwungene vertikale Freiraum abgezogen. +% Sollte dann noch ein positiver Wert bestehen, wird dieser einfach zusätzlich +% gesetzt. % \begin{macrocode} - \define@boolkey{todonotes}{doc}[true]{% - \ifbool{KV@todonotes@doc}{\setkeys{todonotes}{color=HKS41!10}}{}% - }% - \define@boolkey{todonotes}{rls}[true]{% - \ifbool{KV@todonotes@rls}{\setkeys{todonotes}{color=HKS44!50}}{}% - }% - \define@boolkey{todonotes}{imp}[true]{% - \ifbool{KV@todonotes@imp}{\setkeys{todonotes}{color=HKS07!50}}{}% - }% - \define@boolkey{todonotes}{nxt}[true]{% - \ifbool{KV@todonotes@nxt}{\setkeys{todonotes}{color=HKS57!50}}{}% - }% + \@tempskipa=\glueexpr\medskipamount-\tud@lastskip\relax% + \ifdim\@tempskipa>\z@% + \addpenalty{\@beginparpenalty}% + \addvspace{\@tempskipa}% + \fi% + \fi% % \end{macrocode} -% In \cs{@ToDo} wird das optionale Argument für \pkg{todonotes} gesichert. +% Anschließend wird die Länge auf jeden Fall zurückgesetzt. % \begin{macrocode} - \def\@ToDo{}% - \IfValueTF{#2}{% - \IfBooleanTF{#1}{\edef\@ToDo{#2,nolist}}{\edef\@ToDo{#2}}% - }{% - \IfBooleanT{#1}{\edef\@ToDo{nolist}}% - }% + \global\tud@lastskip=\z@% + \@afterindentfalse\@afterheading% + \@tud@declaretrue\@openindextrue% % \end{macrocode} -% Damit die Randnotiz nicht verrutscht, wird \cs{marginnote} anstelle von -% \cs{marginpar} verwendet. +% Die deklarierten Optionen, Umgebungen, Befehle etc. werden umrahmt. Dabe +% erfolgt die Ausgabe mithilfe einer Box, um die Größe des Deklarationsrahmens +% zu speichern und die Änderungsmarkierung am Seitenrand auf die richtige Höhe +% zu platzieren. Da innerhalb von Tabellen der Wert von \cs{baselineskip} auf +% \makeatletter\the\z@\makeatother~gesetzt wird, muss für einen richtig +% platzierten Link dieser in \cs{HyperRaiseLinkDefault} gesichert werden. % \begin{macrocode} - \renewcommand*\marginpar[2][]{% - \marginnote[##1]{##2}[\dimexpr-1.6ex+1pt\relax]% - }% + \def\@tempa##1{\ignorespaces##1\tabularnewline}% + \edef\HyperRaiseLinkDefault{\the\baselineskip}% + \sbox\z@{% + \begin{tabular}{|l|}% + \hline% + \forlistloop\@tempa{\tud@declaration@list}% + \hline% + \end{tabular}% + }\usebox\z@% + \@tud@declarefalse% % \end{macrocode} -% Die Ausgabe erfolgt entweder für alle ToDo-Notizen oder nur den per Option -% festgelegten Typ. +% Danach werden ggf. die Voreinstellungen und Zusatzinformationen in etwas +% kleinerer Schrift gesetzt. % \begin{macrocode} - \@tempswafalse - \ifdefvoid{\tud@todo@type}{\@tempswatrue}{}% - \IfValueT{#2}{% - \@for\@tempa:=#2\do{\ifstr{\@tempa}{\tud@todo@type}{\@tempswatrue}{}}% - }% + \ifboolexpr{bool {@tud@preset@list} or bool {@tud@additional@list}}{% + \def\@tempa##1{\small\ignorespaces##1\tabularnewline}% + \qquad% + \if@tud@preset@list% + \begin{tabular}{@{}l@{}}% + \forlistloop\@tempa{\tud@preset@list}% + \end{tabular}% + \hspace{\tabcolsep}% + \fi% + \if@tud@additional@list% + \begin{tabular}{@{}l@{}}% + \forlistloop\@tempa{\tud@additional@list}% + \end{tabular}% + \fi% + }{}% % \end{macrocode} -% Vor der Ausgabe ist eine vertikale Verschiebung um den durch \pkg{todonotes} -% definierten Leerraum notwendig. +% Alle für die Deklaration verwendeten Listen werden nach ihrer Abarbeitung +% zurückgesetzt. % \begin{macrocode} - \if@tempswa% - \vskip.8ex% - \IfValueT{#4}{% - \settowidth\marginparwidth{#4}% - \addtolength\marginparwidth{\dimexpr1.6ex+1pt\relax}% - \let\par\relax\noindent% - \edef\@tempa{\noexpand\todo[\@ToDo,noline,nolist]}% - \@tempa{#4}% - }% - \edef\@tempa{\noexpand\todo[\@ToDo,inline]}% - \@tempa{#3}% - \fi% - \endgroup% - \par\noindent% - }{}% - \ignorespaces% + \global\let\tud@declaration@list\relax% + \global\let\tud@preset@list\relax% + \global\let\tud@additional@list\relax% + \global\@tud@preset@listfalse% + \global\@tud@additional@listfalse% +% \end{macrocode} +% Die Einträge in der Änderungsliste sowie die dazugehörige Randnotiz werden +% innerhalb der Deklaration mit \cs{printchangedatlist} erzeugt. Das optionale +% Argument sorgt für die Verschiebung der Randnotiz auf die richtige Höhe, um +% den Höhenversatz zwischen Randnotiz und Deklarationsrahmen auszugleichen. +% \begin{macrocode} + \print@changedatlist{#1}{% + \dimexpr.5\ht\strutbox+.5\dp\strutbox-.5\ht0-.5\dp0\relax% + }% +% \end{macrocode} +% Zum Schluss wird das optionale Argument (in runden Klammern) neben der +% Deklarationsbox ausgegeben. +% \begin{macrocode} + \IfValueT{#2}{#2}% + \par\nobreak% + \vskip\medskipamount% + \@afterindentfalse\@afterheading% + \fi% } % \end{macrocode} -% Zum Schluss wird der Befehl \cs{ListOfToDo} definiert, der die Liste der noch -% zu erledigenden Punkte nur ausgeführt ausgibt, wenn die Option \opt{ToDo} -% aktiviert ist. Außerdem werden die Randnotizen auf den linken~-- weil -% größeren~-- Rand gesetzt. +% \end{macro}^^A \label +% \end{macro}^^A \index +% \end{length}^^A \tud@lastskip +% \end{macro}^^A \printdeclarationlist +% \begin{macro}{\printobsoletelist} +% \changes{v2.05}{2015/11/01}{neu}^^A +% Damit werden Deklarationen der Umgebung \env{Obsolete} ausgegeben. +% \begin{macrocode} +\newcommand*\printobsoletelist{% + \@tud@obsoletetrue% + \printdeclarationlist*% + \@tud@obsoletefalse% +} +% \end{macrocode} +% \end{macro}^^A \printobsoletelist +% \begin{macro}{\printchangedatlist} +% \changes{v2.05}{2015/11/01}{neu}^^A +% Damit werden Änderungsnotizen der Umgebungen \env{Declaration*} sowie +% \env{Bundle} und \env{Bundle*} ausgegeben. % \begin{macrocode} -\newcommand*\ListOfToDo{\if@tud@todo\listoftodos\fi} -\reversemarginpar +\NewDocumentCommand\printchangedatlist{sO{\z@}}{% + \print@changedatlist{#1}{#2}% +} % \end{macrocode} -% \end{macro}^^A \ListOfToDo -% \end{macro}^^A \@ToDo -% \end{macro}^^A \ToDo +% \end{macro}^^A \printchangedatlista +% +% \iffalse +%</class> +% \fi +% +% \subsection{Markup von Klassen, Paketen, Optionen und weiteren Elementen} +% +% Es folgen die Definitionen für Befehle und Umgebungen für Klasse und Paket, +% welche sich überschneidenden und für beide benötigt werden. Allerdings sind +% diese für Klasse und Paket in ihrer Implementierung teilweise unterschiedlich. +% +% Als erstes werden für Klasse und Paket einige Hilfmakros definiert. % -% \subsubsection{Kleinkram} -% % \begin{macro}{\bsc} -% \changes{v2.02}{2014/07/22}{\cs{newrobustcmd} aus \pkg{etoolbox} anstelle von +% \changes{v2.02}{2014/07/22}{\cs{newrobustcmd} aus \pkg{etoolbox} anstatt % \cs{DeclareRobustCommand}}^^A % Eine einfacher zu verwendende Kurzform. % \begin{macrocode} \newrobustcmd*\bsc{\@backslashchar} % \end{macrocode} % \end{macro}^^A \bsc -% \begin{macro}{\tud@shellescape@wrn} -% \changes{v2.02}{2014/10/14}{neu}^^A -% Dieses Makro wird verwendet, wenn eine gesuchte Datei nicht gefunden wurde, -% weil das Dokument noch nicht mit der Option \opt{--shell-escape} kompiliert -% wurde. +% \begin{macro}{\suffix} +% \changes{v2.05}{2015/10/27}{neu}^^A +% Für alle möglichen, zusätzlichen Informationen bei Deklarationen, im Index +% oder der normalen in Ausgabe im Fließtext wird eine etwas kleinere Schrift +% verwendet. +% \begin{macrocode} +\newrobustcmd*\suffix[1]{\begingroup~\scriptsize(#1)\endgroup} +% \end{macrocode} +% \end{macro}^^A \suffix +% \begin{macro}{\NewExpandableDocumentCommand} +% \changes{v2.02}{2014/11/04}{neu}^^A +% Für Labels, Index- und Änderungs sowie PDF-Outline-Einträge etc. müssen ganz +% bestimmte Markup-Befehle durch eine expandierbare Version ersetzt werden. Der +% Befehl \cs{NewExpandableDocumentCommand} wird definiert, um dies möglichst +% einfach zu gestalten. +% \begin{macrocode} +\newcommand*\NewExpandableDocumentCommand[3]{% + \NewDocumentCommand#1{#2}{#3}% + \DeclareExpandableDocumentCommand#1{#2}{#3}% +} +% \end{macrocode} +% \end{macro}^^A \NewExpandableDocumentCommand +% +% \subsubsection{Definition der Markup-Befehle} +% +% \changes{v2.05}{2015/11/02}{Markup-Befehle komplett überarbeitet}^^A +% +% Im Folgenden werden allerhand Befehle mit Hilfe des Paketes \pkg{xparse} +% definiert, um bestimmte Begriffe, Klassen, Pakete, Optionen, Umgebungen, +% Befehle, Parameter, Bezeichner, Längen, Schriftelemente und Farben speziell +% auszuzeichnen. Diese Befehle lauten für Klasse und Paket aus Gründen der +% Konsistenz zwar gleich, unterschieden sich jedoch ein klein wenig in der +% Implementierung. +% +% Die Sternversion all dieser Befehlen tragen nichts in den Index ein. Für +% (fast) alle der folgenden Befehle gilt, dass diese mit zwei optionalen +% Argumenten am Ende genutzt werden können. Sollte ein Label existieren, wird +% automatisch ein Hyperlink erzeugt, welcher mit der optionalen Angabe von +% \val{'}\meta{Referenzvariante}\val{'} um einen textuellen Querverweis ergänzt +% werden kann. Mit \val{\textbar}\meta{Indexmarkup}\val{\textbar} kann die +% Erscheinung im Index angepasst werden. Bei einigen Befehlen kann zusätzlich +% zuvor im Markup mit dem optionalen Argument \parg{Bundleelement} die +% Zuweisung auf ein bestimmtes Paket oder eine Klasse aus dem \TUDScript-Bundle +% erfolgen. +% +% Die eigentliche Behandlung erfolgt mit dem Befehl \cs{Process@Markup}, +% welcher die tatsächliche Auszeichnung im Fließtext bzw. als Deklaration +% übernimmt. Das Auszeichnungsformat wird dafür zuvor mit \cs{Markup@SetFormat} +% festgelegt. Ein Eintrag in den Index wird mit \cs{Process@Index} realisiert. +% Für die Änderungsliste wird der Befehl \cs{Process@ChangedAt} genutzt, um die +% entsprechende Formatierung zu gewährleisten, wobei dies nur für die Klasse +% \cls{tudscrmanual} und nicht für das Paket \pkg{tudscrtutorial} gilt. +% +% \begin{macro}{\ProcessorKeyVal} +% \changes{v2.05}{2015/11/01}{neu}^^A +% \begin{macro}{\tud@keyval@error} +% \changes{v2.05}{2015/11/01}{neu}^^A +% Bei Optionen und Parametern können spezielle Werte einfach im Hauptargument +% durch \val{=} getrennt angegeben werden. Um diese auszuwerten, wird dieser +% Befehl definiert, welcher als Argumentprozessor verwendet wird. +% \begin{macrocode} +\newcommand*\ProcessorKeyVal[1]{% + \begingroup% + \in@{=}{#1}% +% \end{macrocode} +% Wird im Argument ein \val{=} gefunden, so wird alles Darauffolgende als Wert +% erkannt und dem eigentlichen Hauptargument bei der Ausgabe angehangen. Das +% Makro, welches diesen Argumentprozessor verwendet, erhält als Ausgabe also +% entweder \marg{Schlüssel} oder \marg{Schlüssel}\val{=}\meta{Wert}\val{=} +% falls \cs{ProcessorKeyVal} mit \marg{Schlüssel=Wert} verwendet wurde . % \begin{macrocode} -\newcommand*\tud@shellescape@wrn{% + \ifin@% + \def\@tempa##1=##2\@nil{\toks@{{##1}=##2=}}% + \else% + \def\@tempa##1\@nil{\toks@{{##1}}}% + \fi% + \@tempa#1\@nil% + \edef\tud@reserved{% + \noexpand\endgroup% + \def\noexpand\ProcessedArgument{\the\toks@}% + }% + \tud@reserved% +} +% \end{macrocode} +% Es gibt auch noch eine interne Variante für ein optioneles Werte-Argument. +% Dabei sollte vermieden werden, dass im Markup das Argument für einen Wert +% doppelt angegeben wird. In diesem Fall wird dieser Fehler ausgegeben. +% \begin{macrocode} +\newcommand*\tud@keyval@error{% %<*class> - \ClassWarning% + \ClassError{tudscrmanual}% %</class> %<*package> - \PackageWarning% + \PackageError{tudscrtutorial}% %</package> - {tudscrman}{% - You have to recompile this document with\MessageBreak% - activated shell escape option% - }% - \global\let\tud@shellescape@wrn\relax% + {Wrong usage of optional argument for value}% + {There are two optional arguments for a value given!}% } % \end{macrocode} -% \end{macro}^^A \tud@shellescape@wrn -% \begin{macro}{\pdfexpandableoutline} -% \changes{v2.02}{2014/11/04}{neu}^^A -% \begin{macro}{\@TUDScript} -% \changes{v2.02}{2014/08/16}{neu}^^A -% Für die PDF-Outline-Einträge müssen einige Befehle durch eine expandierbare -% Version ersetzt werden. Der Befehl \cs{pdfexpandableoutline} wird definiert, -% um dies möglichst einfach zu gestalten. -% \begin{macrocode} -\newcommand*\pdfexpandableoutline[1]{% - \AfterPackage*{hyperref}{\pdfstringdefDisableCommands{\csletcs{#1}{@#1}}} +% \end{macro}^^A \tud@keyval@error +% \end{macro}^^A \ProcessorKeyVal +% \begin{environment}{Bundle} +% \changes{v2.05}{2015/11/01}{neu}^^A +% \begin{macro}{\tud@bdl@curr} +% \changes{v2.05}{2015/08/04}{neu}^^A +% \begin{macro}{\tud@bdl@dflt} +% \changes{v2.05}{2015/11/01}{neu}^^A +% \begin{macro}{\tud@if@bdl} +% \changes{v2.05}{2015/08/04}{neu}^^A +% Die Umgebung \env{Bundle} kann nicht verschachtelt werden und prüft zuerst +% dementsprechend die Verwendung. Anschließend wird lediglich das Makro +% \cs{tud@bdl@curr} auf das übergebene Argument gesetzt, um innerhalb der +% Umgebung erstellte Label und Indexeinträge zu beeinflussen. +% \begin{macrocode} +\newenvironment{Bundle}[1]{% + \tud@if@bdl{% +%<*class> + \ClassError{tudscrmanual}% +%</class> +%<*package> + \PackageError{tudscrtutorial}% +%</package> + {Nested environment `Bundle'}{% + It is not possible to nest this environment, when\MessageBreak% + a cross-label was given before.% + }% + }{% + \gdef\tud@bdl@curr{#1}% + }% + \ignorespaces% +}{% + \global\let\tud@bdl@curr\tud@bdl@dflt% + \aftergroup\ignorespaces% } % \end{macrocode} -% Den Anfang mach gleich \cs{TUDScript}. +% Diese Makros werden für das Definieren eines Bundle-Elements und ggf. das +% Prüfen des selbigen benötigt. % \begin{macrocode} -\newcommand*\@TUDScript{TUD-KOMA-Script} -\pdfexpandableoutline{TUDScript} +\newcommand*\tud@bdl@curr{} +\newcommand*\tud@bdl@dflt{tudscr} +\let\tud@bdl@curr\tud@bdl@dflt +\newcommand*\tud@if@bdl[2]{\ifstr{\tud@bdl@curr}{\tud@bdl@dflt}{#2}{#1}} % \end{macrocode} -% \end{macro}^^A \@TUDScript -% \end{macro}^^A \pdfexpandableoutline -% -% \subsubsection{Markup von Klassen, Paketen, Optionen und weiteren Elementen} -% -% Im Folgenden werden allerhand Befehle mit Hilfe des Paketes \pkg{xparse} -% definiert, um bestimmte Begriffe, Klassen, Pakete, Optionen, Umgebungen, -% Befehle, Parameter, Bezeichner, Längen, Schriftelemente und Farben speziell -% auszuzeichnen. Diese Befehle lauten für Klasse und Paket nutzen aus Gründen -% der Konsistenz zwar gleich, unterschieden sich jedoch in der Implementierung. -% -% Für die Klasse gilt, dass die Sternversion all dieser Befehlen nichts in den -% Index einträgt, wenn diese denn im Fließtext Verwendung finden. Wird die -% Sternversion jedoch in einer Änderungsnotiz genutzt, so wird die für diese -% normalerweise angehängte Beschreibung des Elementes unterdrückt. Für (fast) -% alle der folgenden Befehle gilt, dass diese mit zwei optionalen Befehlen am -% Ende genutzt werden können. Mit \val{'refformat'} kann angegeben werden, ob -% der automatisch erzeugte Hyperlink um einen textuellen Querverweis ergänzt -% werden soll. Mit \val{|idxformat|} kann die Erscheinung im Index angepasst -% werden. Die eigentliche Behandlung der Eingabe und die Eintragungen in den -% Index erfolgen dabei mit dem Befehl \cs{@ProcessOutput}, für einen Eintrag -% in die Änderungsliste wird der Befehl \cs{@ProcessChangedAt} genutzt. -% -% Die Befehle für das Paket \pkg{tudscrman} sind in ihrer Funktionalität um -% einiges reduziert. Die meisten besitzen nur ein obligatorisches Argument für -% die formatierte Ausgabe sowie evtl. eine Sternversion, die einen Querverweis -% auf das Handbuch erzeugt. +% \end{macro}^^A \tud@if@bdl +% \end{macro}^^A \tud@bdl@dflt +% \end{macro}^^A \tud@bdl@curr +% \end{environment}^^A Bundle % \begin{macro}{\Application} % \changes{v2.02}{2014/10/08}{überarbeitet}^^A % \begin{macro}{\@Application} % Die Auszeichnung und der Indexeintrag einer Anwendungssoftware. % \begin{macrocode} -%<*class> -\NewDocumentCommand\Application{smd||}{% - \ifdin{#2}{% - \mbox{\textsbs{#2}}% - \CheckIndexFormat{#1}{#3}% - \IfBooleanF{#1}{% - \index{\textsbs{#2}~{\idxfont(Anwendungssoftware)}\IfValueT{#3}{|#3}}% - }% +\NewExpandableDocumentCommand\@Application{sm}{#2} +\NewDocumentCommand\Application{smd()d<>d||}{% + \Markup@SetFormat{\sbsfont}% + \IfValueTF{#4}{% + \Process@Markup{\Application{#2}}(#3)<#4>% + }{% + \Process@Markup{\Application{#2}}(#3)% }% + \Process@Index{#1}{\Application{#2}}[Anwendungssoftware](#3)|#4|% } -\DeclareExpandableDocumentCommand\@Application{sm}{#2} -\pdfexpandableoutline{Application} -%</class> -%<*package> -\newcommand*\Application[1]{\ifdin{#1}{\mbox{\textsbs{#1}}}} -%</package> % \end{macrocode} % \end{macro}^^A \@Application % \end{macro}^^A \Application % \begin{macro}{\Distribution} % \changes{v2.02}{2014/10/08}{überarbeitet}^^A -% Die Auszeichnung und der Indexeintrag einer \LaTeX-Distribution. -% \begin{macrocode} -%<*class> -\NewDocumentCommand\Distribution{smod||}{% - \ifdin{#2\IfValueT{#3}{~#3}}{% - \mbox{\textsbn{#2\IfValueT{#3}{~#3}}}% - \CheckIndexFormat{#1}{#4}% - \IfBooleanF{#1}{% - \index{\textsbn{#2}~{\idxfont(Distribution)}\IfValueT{#4}{|#4}}% - }% +% \begin{macro}{\@Distribution} +% Die Auszeichnung und der Indexeintrag einer \LaTeX-Distribution. Das +% optionale Argument kann für das Anhängen einer Versionsnummer o.\,ä. im +% Fließtext genutzt werden. +% \begin{macrocode} +\NewExpandableDocumentCommand\@Distribution{sm}{#2} +\NewDocumentCommand\Distribution{smod()d||}{% + \Markup@SetFormat{\sbnfont}% + \IfValueTF{#3}{% + \Process@Markup{\Distribution{#2}}[~#3](#4)% + }{% + \Process@Markup{\Distribution{#2}}(#4)% }% + \Process@Index{#1}{\Distribution{#2}}[Distribution](#4)|#5|% } -%</class> -%<*package> -\newcommand*\Distribution[1]{\ifdin{#1}{\mbox{\textsbn{#1}}}} -%</package> % \end{macrocode} +% \end{macro}^^A \@Distribution % \end{macro}^^A \Distribution -% \begin{macro}{\Path} -% \changes{v2.02}{2014/07/22}{\cs{DeclareRobustCommand} ersetzt durch -% \cs{newrobustcmd} aus \pkg{etoolbox}}^^A -% Die Auszeichnung eines Dateipfades. -% \begin{macrocode} -\newrobustcmd*\Path[1]{\mbox{\texttt{#1}}} +% \begin{macro}{\Engine} +% \changes{v2.05}{2015/11/04}{neu}^^A +% \begin{macro}{\@Engine} +% \changes{v2.05}{2015/11/04}{neu}^^A +% Die Auszeichnung und der Indexeintrag für ein bestimmtes Textsatzsystem. +% \begin{macrocode} +\NewExpandableDocumentCommand\@Engine{sm}{#2} +\NewDocumentCommand\Engine{smd()d||}{% + \Markup@SetFormat{\sbnfont}% + \Process@Markup{\Engine{\hologo{#2}}}(#3)% + \Process@Index{#1}{\Engine{#2}}[Textsatzsystem](#3)|#4|% +} % \end{macrocode} -% \end{macro}^^A \Path +% \end{macro}^^A \@Engine +% \end{macro}^^A \Engine % \begin{macro}{\File} % \changes{v2.02}{2014/10/08}{überarbeitet}^^A +% \begin{macro}{\@File} % Die Auszeichnung und der Indexeintrag einer Datei. % \begin{macrocode} -%<*class> -\NewDocumentCommand\File{smd||}{% - \ifdin{#2}{% - \mbox{\textsbn{#2}}% - \CheckIndexFormat{#1}{#3}% - \IfBooleanF{#1}{% - \index[files]{\textsbn{#2}~{\idxfont(Datei)}\IfValueT{#3}{|#3}}% - }% - }% +\NewExpandableDocumentCommand\@File{sm}{#2} +\NewDocumentCommand\File{smd()d||}{% + \Markup@SetFormat{\sbnfont}% + \Process@Markup{\File{#2}}(#3)% + \Process@Index{#1}{\File{#2}}[Datei](#3)|#4|% } -%</class> -%<*package> -\newcommand*\File[1]{\ifdin{#1}{\mbox{\textsbn{#1}}}} -%</package> % \end{macrocode} +% \end{macro}^^A \@File % \end{macro}^^A \File % \begin{macro}{\Class} % \changes{v2.02}{2014/10/08}{überarbeitet}^^A % \begin{macro}{\@Class} -% \begin{macro}{\@TempClass} -% \changes{v2.02}{2014/10/08}{entfernt}^^A -% \begin{macro}{\DeclareClass} -% \changes{v2.02}{2014/10/09}{entfernt}^^A -% Die Auszeichnung und der Indexeintrag einer Klasse. Sollte gerade DIN~Bold -% verwendet werden~-- der Befehl wird innerhalb einer Überschrift genutzt~-- -% wird lediglich das Hauptargument ausgegeben. Das optionale Argument zwischen -% Apostrophen kann für die Formatierung eines Querverweises im Text genutzt -% werden, das optionale Argument zwischen senkrechten Strichen dient der -% Formatierung des Indexeintrages. Außerdem wird für Einträge mit dem Paket -% \pkg{hyperref} mit \cs{@Class} eine expandierbare Version definiert. -% \begin{macrocode} -%<*class> -\NewDocumentCommand\Class{smd''d||}{% - \if@changelog% - \@ProcessChangedAt{#1}{files}{\protect\sbnfont}{#2}{Klasse}% +% Die Auszeichnung und der Indexeintrag einer Klasse. Das optionale Argument +% zwischen Apostrophen kann für die Formatierung eines Querverweises im Text +% genutzt werden, das optionale Argument zwischen senkrechten Strichen dient +% der Formatierung des Indexeintrages. +% \begin{macrocode} +\NewExpandableDocumentCommand\@Class{sm}{#2} +\NewDocumentCommand\Class{smd()d''d||}{% +%<*class> + \if@tud@changedat% + \Process@ChangedAt{\Class{#2}}[Klasse]% \else% - \ifdin{#2}{% - \SetIndexFormat{#1}{#4}% - \@ProcessOutput{\textsbn{#2}}'#3'% - {files}[\protect\sbnfont]{#2}[~{\idxfont(Klasse)}]% - }% +%</class> + \Markup@SetFormat{\sbnfont}% + \Process@Markup{\Class{#2}}(#3)'#4'% + \Process@Index{#1}{\Class{#2}}[Klasse](#3)|#5|% +%<*class> \fi% -} %</class> -%<*package> -\NewDocumentCommand\Class{sm}{% - \ifdin{#2}{% - \IfBooleanTF{#1}{% - \manualhyperref{files:#2}{\textsbn{#2}}% - }{% - \textsbn{#2}% - }% - \index[files]{\begingroup\protect\sbnfont#2\endgroup~{\idxfont(Klasse)}}% - }% } -%</package> -\DeclareExpandableDocumentCommand\@Class{sm}{#2} -\pdfexpandableoutline{Class} % \end{macrocode} -% \end{macro}^^A \DeclareClass -% \end{macro}^^A \@TempClass % \end{macro}^^A \@Class % \end{macro}^^A \Class % \begin{macro}{\Package} -% \changes{v2.02}{2014/07/10}{Ausgabe für ChangeLog hinzugefügt}^^A -% \changes{v2.02}{2014/10/08}{überarbeitet}^^A +% \changes{v2.02}{2014/07/10}{Ausgabe für Änderungsliste hinzugefügt}^^A % \begin{macro}{\@Package} -% \begin{macro}{\@TempPackage} -% \begin{macro}{\DeclarePackage} -% \changes{v2.02}{2014/10/09}{entfernt}^^A % Für die Auszeichnungen von Paketen gelten vorherigen Aussagen äquivalent. % Für Pakete wird ergänzend ein Hyperlink auf CTAN erzeugt, wenn für dieses -% kein Label im Dokument besteht, wo dieses genauer erläutert wird. Mit dem -% optionalen Argument in runden Klammern lässt sich der Paketname für den Link, -% welcher normalerweise aus obligatorischen Argument entnommen wird, anpassen. -% Zusätzlich wird ein Befehl für Tutorials erstellt, welcher auf das Handbuch -% verweist. +% kein Label im Dokument besteht. Genaueres ist der Beschreibung und Definition +% von \cs{Process@Markup} zu entnehmen. Das optionale Argument in einfachen +% Guillemets dient zum Anpassen des CTAN-Links, welcher normalerweise aus +% obligatorischen Argument generiert wird. % \begin{macrocode} +\NewExpandableDocumentCommand\@Package{sm}{#2} +\NewDocumentCommand\Package{smd()d<>d''d||}{% %<*class> -\newcommand*\@TempPackage{} -\NewDocumentCommand\Package{smd''d()d||}{% - \if@changelog% - \@ProcessChangedAt{#1}{files}{\protect\sbnfont}{#2}{Paket}% + \if@tud@changedat% + \Process@ChangedAt{\Package{#2}}[Paket]% \else% - \ifdin{#2}{% - \IfValueTF{#4}{\def\@TempPackage{#4}}{\def\@TempPackage{#2}}% - \SetIndexFormat{#1}{#5}% - \@ProcessOutput{\textsbn{#2}}'#3'(\@TempPackage)% - {files}[\protect\sbnfont]{#2}[~{\idxfont(Paket)}]% - }% - \fi% -} %</class> -%<*package> -\NewDocumentCommand\Package{smd()}{% - \ifdin{#2}{% - \IfBooleanTF{#1}{% - \manualhyperref{files:#2}{\textsbn{#2}}% + \Markup@SetFormat{\sbnfont}% + \IfValueTF{#4}{% + \Process@Markup{\Package{#2}}(#3)<#4>'#5'% }{% - \IfValueTF{#3}{% - \href{http://www.ctan.org/pkg/#3}{\textsbn{#2}}% - }{% - \href{http://www.ctan.org/pkg/#2}{\textsbn{#2}}% - }% + \Process@Markup{\Package{#2}}(#3)<#2>'#5'% }% - \index[files]{\begingroup\protect\sbnfont#2\endgroup~{\idxfont(Paket)}}% - }% + \Process@Index{#1}{\Package{#2}}[Paket](#3)|#6|% +%<*class> + \fi% +%</class> } -%</package> -\DeclareExpandableDocumentCommand\@Package{sm}{#2} -\pdfexpandableoutline{Package} % \end{macrocode} -% \end{macro}^^A \DeclarePackage -% \end{macro}^^A \@TempPackage % \end{macro}^^A \@Package % \end{macro}^^A \Package % \begin{macro}{\Option} % \changes{v2.02}{2014/10/08}{überarbeitet}^^A +% \begin{macro}{\Option@Value} +% \changes{v2.05}{2015/11/02}{neu}^^A % \begin{macro}{\@Option} % \changes{v2.02}{2014/11/02}{neu}^^A -% \begin{macro}{\@TempOption} -% Im Gegensatz zu den vorherigen Befehlen gibt es ein ordinäres optionales -% Argument nach dem Hauptargument. Damit kann der Option im Handbuch ein Wert -% zugewiesen werden. Für Tutorials wird ein Befehl definiert, der auf das -% Handbuch verweist. +% Im Gegensatz zu den vorherigen Befehlen, kann im Hauptargument ein spezieller +% Wert für eine Option optional durch ein \val{=} getrennt angegeben werden. +% Durch den Argumentprozessor \cs{ProcessorKeyVal} wird dieses vom eigentlichen +% Schlüssel getrennt. Dabei wird der gegebene Schlüssel immer in der Form +% \marg{Schlüssel} ausgegeben. Sollte ein optionaler Wert gegeben worden sein, +% wird dieser in der Form \val{=}\meta{Wert}\val{=} einfach angehängt und als +% optionales Argument von \cs{Option@Value} weiter verarbeitet. Mit dem +% optionalen Argument in runden Klammern kann ggf. auf eine Option aus einem +% \TUDScript-Paket verwiesen +% werden. +% \begin{macrocode} +\NewExpandableDocumentCommand\@Option{sm}{#2} +\NewDocumentCommand\Option{s>{\ProcessorKeyVal}md==d()d''d||}{% + \Option@Value{#1}#2=#3=(#4)'#5'|#6|% +} +% \end{macrocode} +% Für die interne Verwendung kann das optionale Argument für den Wert auch +% direkt mit \val{=}\meta{Wert}\val{=} angehangen werden. Um die gleichzeitige +% Verwendung beider Varianten zu unterdrücken, wird in diesem Fall ein Fehler +% erzeugt. % \begin{macrocode} +\NewDocumentCommand\Option@Value{mmd==d==d()d''d||}{% + \IfValueT{#4}{\tud@keyval@error}% %<*class> -\newcommand*\@TempOption{} -\NewDocumentCommand\Option{smod''d||}{% - \if@changelog% - \@ProcessChangedAt{#1}{options}{\ttfamily}{#2}{Option}% + \if@tud@changedat% + \Process@ChangedAt{\Option{#2}}=#3=[Option](#5)% \else% - \IfValueTF{#3}{\gdef\@TempOption{\texttt{=#3}}}{\gdef\@TempOption{}}% - \SetIndexFormat{#1}{#5}% - \@ProcessOutput{\texttt{#2}}[\@TempOption]'#4'{options}[\ttfamily]{#2}% +%</class> + \Markup@SetFormat{\ttfamily}% + \Process@Markup{\Option{#2}}=#3=(#5)'#6'% + \Process@Index{#1}{\Option{#2}}=#3=(#5)|#7|% +%<*class> \fi% -} %</class> -%<*package> -\NewDocumentCommand\Option{smo}{% - \ifdin{#2}{% - \IfBooleanTF{#1}{% - \manualhyperref{options:#2}{\texttt{#2}}\IfValueT{#3}{\texttt{=#3}}% - }{% - \texttt{#2}\IfValueT{#3}{\texttt{=#3}}% - }% - \index[options]{\begingroup\ttfamily#2\endgroup}% - }% } -%</package> -\DeclareExpandableDocumentCommand\@Option{sm}{#2} -\pdfexpandableoutline{Option} % \end{macrocode} -% \end{macro}^^A \@TempOption % \end{macro}^^A \@Option +% \end{macro}^^A \Option@Value % \end{macro}^^A \Option % \begin{macro}{\Environment} % \changes{v2.02}{2014/10/08}{überarbeitet}^^A % \begin{macro}{\@Environment} % \changes{v2.02}{2014/11/02}{neu}^^A -% \begin{macro}{\@TempEnvironment} -% Auch hier wird für die Änderungsliste unterschieden und für Tutorials ein -% Befehl definiert, welcher auf das Handbuch referenziert. +% Bei diesem Makro dient das optionale Argument für die Ausgabe der möglichen +% Umgebungsargumente bzw. -parameter \emph{bei der Deklaration}. % \begin{macrocode} +\NewExpandableDocumentCommand\@Environment{sm}{#2} +\NewDocumentCommand\Environment{smod()d''d||}{% %<*class> -\newcommand*\@TempEnvironment{} -\NewDocumentCommand\Environment{smod''d||}{% - \if@changelog% - \@ProcessChangedAt{#1}{macros}{\ttfamily}{#2}{Umgebung}% + \if@tud@changedat% + \Process@ChangedAt{\Environment{#2}}[Umgebung](#4)% \else% +%</class> % \end{macrocode} % Außerdem wird für den Fall, dass der \cs{Environment}-Befehl innerhalb der -% Umgebung \env{Declaration} verwendet wird, eine spezielle Ausgabe erzeugt. Nur -% hier kommt das optionale Argument nach dem Hauptargument zum Tragen. Damit -% können etwaige obligatorische und optionale Argumente angegeben werden. -% \begin{macrocode} - \if@declare% - \gdef\@TempEnvironment{% - \texttt{\bsc{}begin\{#2\}\IfValueT{#3}{#3}}\tabularnewline% - \texttt{\dots}\tabularnewline% - \texttt{\bsc{}end\{#2\}}% - }% - \else% - \gdef\@TempEnvironment{\texttt{#2}}% - \fi% - \SetIndexFormat{#1}{#5}% - \@ProcessOutput{\@TempEnvironment}'#4'{macros}[\ttfamily]{#2}% +% Umgebung \env{Declaration} verwendet wird, eine spezielle Ausgabe erzeugt. +% Nur hier kommt das optionale Argument von \cs{Markup@SetFormat} nach dem +% Hauptargument zum Tragen. Die resultierende Ausgabe hat die Gesatlt: +% +% \begin{tabular}{l}% +% \cs{begin}\marg{Umgebung}\tabularnewline +% \dots\tabularnewline +% \cs{end}\marg{Umgebung}\tabularnewline +% \end{tabular}% +% \begin{macrocode} + \Markup@SetFormat{\ttfamily}(% + \ttfamily\bsc{}begin\textbraceleft#2\textbraceright\IfValueT{#3}{#3}% + \tabularnewline\ttfamily\dots% + \tabularnewline\ttfamily\bsc{}end\textbraceleft#2\textbraceright% + )% + \Process@Markup{\Environment{#2}}[#3](#4)'#5'% + \Process@Index{#1}{\Environment{#2}}[Umgebung](#4)|#6|% +%<*class> \fi% -} %</class> -%<*package> -\NewDocumentCommand\Environment{sm}{% - \ifdin{#2}{% - \IfBooleanTF{#1}{% - \manualhyperref{macros:#2}{\texttt{#2}}% - }{% - \texttt{#2}% - }% - \index[macros]{\begingroup\ttfamily#2\endgroup}% - }% } -%</package> -\DeclareExpandableDocumentCommand\@Environment{sm}{#2} -\pdfexpandableoutline{Environment}% % \end{macrocode} -% \end{macro}^^A \@TempEnvironment % \end{macro}^^A \@Environment % \end{macro}^^A \Environment % \begin{macro}{\Macro} % \changes{v2.02}{2014/10/08}{überarbeitet}^^A % \begin{macro}{\@Macro} % \changes{v2.02}{2014/11/02}{neu}^^A -% Die Auszeichnung und der Indexeintrag eines Befehls sowie für das Paket -% \pkg{tudscrman} der Hyperlink auf das Handbuch. -% \begin{macrocode} +% Die Auszeichnung und der Indexeintrag eines Befehls. Das ordinäre optionale +% Argument ist für das Anhängen von Parametern o.\,ä. nach dem eigentlichen +% Makro zu verwenden. Das optionale Argument in runden Klammern dient dem +% Hyperlink zu einem Befehl aus einem anderen Paket oder einer anderen Klasse +% aus dem \TUDScript-Bundle. +% \begin{macrocode} +\NewExpandableDocumentCommand\@Macro{sm}{#2} +\NewDocumentCommand\Macro{smod()d''d||}{% %<*class> -\NewDocumentCommand\Macro{smd''d||}{% - \if@changelog% - \@ProcessChangedAt{#1}{macros}{\ttfamily\bsc}{#2}{Befehl}% + \if@tud@changedat% + \Process@ChangedAt{\Macro{#2}}[Befehl](#4)% \else% - \SetIndexFormat{#1}{#4}% - \@ProcessOutput{\texttt{\bsc#2}}'#3'{macros}[\ttfamily\bsc]{#2}% +%</class> + \Markup@SetFormat{\ttfamily\bsc}% + \Process@Markup{\Macro{#2}}[#3](#4)'#5'% + \Process@Index{#1}{\Macro{#2}}(#4)|#6|% +%<*class> \fi% -} %</class> -%<*package> -\NewDocumentCommand\Macro{sm}{% - \ifdin{\bsc#2}{% - \IfBooleanTF{#1}{% - \manualhyperref{macros:#2}{\texttt{\bsc#2}}% - }{% - \texttt{\bsc#2}% - }% - \index[macros]{\begingroup\ttfamily\bsc#2\endgroup}% - }% } -%</package> -\DeclareExpandableDocumentCommand\@Macro{sm}{#2} % \end{macrocode} % \end{macro}^^A \@Macro % \end{macro}^^A \Macro % \begin{macro}{\Length} % \changes{v2.02}{2014/10/08}{überarbeitet}^^A -% \begin{macro}{\@TempLength} -% \changes{v2.02}{2014/10/08}{entfernt}^^A +% \begin{macro}{\@Length} % Die Auszeichnung und der Indexeintrag einer \LaTeX-Länge. % \begin{macrocode} +\NewExpandableDocumentCommand\@Length{sm}{#2} +\NewDocumentCommand\Length{smd()d''d||}{% %<*class> -\NewDocumentCommand\Length{smd''d||}{% - \if@changelog% - \@ProcessChangedAt{#1}{macros}{\ttfamily\bsc}{#2}{L\"ange}% + \if@tud@changedat% + \Process@ChangedAt{\Length{#2}}[L\"ange](#3)% \else% - \SetIndexFormat{#1}{#4}% - \@ProcessOutput{\texttt{\bsc#2}}[\if@declare~{\idxfont(L\"ange)}\fi]'#3'% - {macros}[\ttfamily\bsc]{#2}[~{\idxfont(L\"ange)}]% +%</class> + \Markup@SetFormat{\ttfamily\bsc}[L\"ange]% + \Process@Markup{\Length{#2}}(#3)'#4'% + \Process@Index{#1}{\Length{#2}}[L\"ange](#3)|#5|% +%<*class> \fi% -} %</class> -%<*package> -\NewDocumentCommand\Length{sm}{% - \ifdin{\bsc#2}{% - \IfBooleanTF{#1}{% - \manualhyperref{macros:#2}{\texttt{\bsc#2}}% - }{% - \texttt{\bsc#2}% - }% - \index[macros]{\begingroup\ttfamily\bsc#2\endgroup~{\idxfont(L\"ange)}}% - }% } -%</package> % \end{macrocode} -% \end{macro}^^A \@TempLength +% \end{macro}^^A \@Length % \end{macro}^^A \Length +% \begin{macro}{\Counter} +% \changes{v2.02}{2014/10/08}{überarbeitet}^^A +% Die Auszeichnung und der Indexeintrag einer \LaTeX-Zählers. +% \begin{macrocode} +\NewExpandableDocumentCommand\@Counter{sm}{#2} +\NewDocumentCommand\Counter{smd()d''d||}{% +%<*class> + \if@tud@changedat% + \Process@ChangedAt{\Counter{#2}}[Z\"ahler](#3)% + \else% +%</class> + \Markup@SetFormat{\ttfamily}[Z\"ahler]% + \Process@Markup{\Counter{#2}}(#3)'#4'% + \Process@Index{#1}{\Counter{#2}}[Z\"ahler](#3)|#5|% +%<*class> + \fi% +%</class> +} +% \end{macrocode} +% \end{macro}^^A \Counter % % \iffalse %<*class> % \fi % % \minisec{Exklusive Auszeichnungen für die Klasse} -% Alle weiteren Befehle werden ausschließlich für die Klasse \cls{tudscrman} +% Alle weiteren Befehle werden ausschließlich für die Klasse \cls{tudscrmanual} % definiert. % % \begin{macro}{\Key} % \changes{v2.02}{2014/10/08}{überarbeitet}^^A -% \begin{macro}{\@TempKey} +% \begin{macro}{\Key@Value} +% \changes{v2.05}{2015/11/02}{neu}^^A +% \begin{macro}{\@Key} % Die Auszeichnung und der Indexeintrag eines Parameters für Umgebungen und % Befehle. Das erste Argument ist die Umgebung oder der Befehl, wofür der -% Parameter gültig ist. Das zweite Argument ist der Parameter selbst. Dafür -% werden die Befehle \cs{Environment} und \cs{Macro} lokal umdefiniert. Das -% ordinäre obligatorische Argument danach dient der Zuweisung eines Wertes im -% Fließtext. -% \begin{macrocode} -\newcommand*\@TempKey{} -\NewDocumentCommand\Key{smmod''d||}{% - \if@changelog% - \@ProcessChangedAt{#1}{macros}(#2){\ttfamily}{#3}{Parameter}% - \else% - \begingroup% - \let\Environment\@firstofone% - \let\Macro\@firstofone% - \IfValueTF{#4}{% - \gdef\@TempKey{\texttt{=#4}\if@declare~{\idxfont(Parameter)}\fi}% - }{% - \gdef\@TempKey{\if@declare~{\idxfont(Parameter)}\fi}% - }% - \SetIndexFormat{#1}{#6}% - \@ProcessOutput{\texttt{#3}}[\@TempKey]'#5'{macros}(#2)[\ttfamily]{#3}% - \endgroup% - \fi% -} -% \end{macrocode} -% \end{macro}^^A \@TempKey -% \end{macro}^^A \Key -% \begin{macro}{\PageStyle} -% \changes{v2.02}{2014/07/25}{neu}^^A -% Die Auszeichnung und der Indexeintrag eines Seitenstils. +% Parameter gültig ist. Das zweite Argument ist der Parameter selbst. Die +% optionale Zuweisung eines Wertes kann äquivalent zu \cs{Option} mit dem +% Trennzeichen~\val{=} im Hauptargument erfolgen. % \begin{macrocode} -\NewDocumentCommand\PageStyle{smd''d||}{% - \if@changelog% - \@ProcessChangedAt{#1}{macros}{\ttfamily}{#2}{Seitenstil}% - \else% - \SetIndexFormat{#1}{#4}% - \@ProcessOutput{\texttt{#2}\if@declare~{\idxfont(Seitenstil)}\fi}'#3'% - {macros}[\ttfamily]{#2}[~{\idxfont(Seitenstil)}]% - \fi% +\NewExpandableDocumentCommand\@Key{smm}{#2!#3} +\NewDocumentCommand\Key{sm>{\ProcessorKeyVal}md==d()d''d||}{% + \Key@Value{#1}{#2}#3=#4=(#5)'#6'|#7|% } -% \end{macrocode} -% \end{macro}^^A \PageStyle -% \begin{macro}{\Counter} -% \changes{v2.02}{2014/10/08}{überarbeitet}^^A -% \begin{macro}{\@TempCounter} -% \changes{v2.02}{2014/10/08}{entfernt}^^A -% Die Auszeichnung und der Indexeintrag einer \LaTeX-Zählers. -% \begin{macrocode} -\NewDocumentCommand\Counter{smd''d||}{% - \if@changelog% - \@ProcessChangedAt{#1}{macros}{\ttfamily}{#2}{Z\"ahler}% +\NewDocumentCommand\Key@Value{mmmd==d==d()d''d||}{% + \IfValueT{#5}{\tud@keyval@error}% + \if@tud@changedat% + \Process@ChangedAt{\Key{#2}{#3}}=#4=[Parameter](#6)% \else% - \SetIndexFormat{#1}{#4}% - \@ProcessOutput{\texttt{#2}}[\if@declare~{\idxfont(Z\"ahler)}\fi]% - {macros}[\ttfamily]{#2}[~{\idxfont(Z\"ahler)}]% + \Markup@SetFormat{\ttfamily}[Parameter]% + \Process@Markup{\Key{#2}{#3}}=#4=(#6)'#7'% + \Process@Index{#1}{\Key{#2}{#3}}=#4=(#6)|#8|% \fi% } % \end{macrocode} -% \end{macro}^^A \@TempCounter -% \end{macro}^^A \Counter +% \end{macro}^^A \@Key +% \end{macro}^^A \Key@Value +% \end{macro}^^A \Key % \begin{macro}{\Term} % \changes{v2.02}{2014/10/08}{überarbeitet}^^A -% \begin{macro}{\@TempTerm} -% \changes{v2.02}{2014/10/08}{entfernt}^^A +% \begin{macro}{\@Term} % Die Auszeichnung und der Indexeintrag eines sprachabhängigen Bezeichners. % \begin{macrocode} -\NewDocumentCommand\Term{smd''d||}{% - \if@changelog% - \@ProcessChangedAt{#1}{terms}{\ttfamily\bsc}{#2}{Bezeichner}% +\NewExpandableDocumentCommand\@Term{sm}{#2} +\NewDocumentCommand\Term{smd()d''d||}{% + \if@tud@changedat% + \Process@ChangedAt{\Term{#2}}[Bezeichner](#3)% \else% - \SetIndexFormat{#1}{#4}% - \@ProcessOutput{\texttt{\bsc#2}}[\if@declare~{\idxfont(Bezeichner)}\fi]'#3'% - {terms}[\ttfamily\bsc]{#2}% + \Markup@SetFormat{\ttfamily\bsc}[Bezeichner]% + \Process@Markup{\Term{#2}}(#3)'#4'% + \Process@Index{#1}{\Term{#2}}(#3)|#5|% \fi% } % \end{macrocode} -% \end{macro}^^A \@TempTerm +% \end{macro}^^A \@Term % \end{macro}^^A \Term -% \begin{macro}{\TermTable} -% \begin{macro}{\@TermTable} -% \begin{macro}{\@@TermTable} -% \begin{macro}{\@termlist} -% Für sprachabhängige Bezeichner wird zusätzlich der Befehl \cs{TermTable} -% definiert, dem eine kommaseparierte Liste übergeben werden kann. Anhand -% dieser Liste werden die enthalten Begriffe für die Sprachen Deutsch und -% English in einer Tabelle ausgegeben. Die Sternversion dieses Befehls nutzt -% dafür die \env{tabularx}-Umgebung. Für diese kann ein zweites Argument -% angegeben werden, welches die gewünschte Breite der Tabelle angibt. +% \begin{macro}{\PageStyle} +% \changes{v2.02}{2014/07/25}{neu}^^A +% \begin{macro}{\@PageStyle} +% Die Auszeichnung und der Indexeintrag eines Seitenstils. % \begin{macrocode} -\newcommand\@termlist{} -\let\@termlist\relax -\NewDocumentCommand\TermTable{smg}{% - \forcsvlist{\listadd\@termlist}{#2}% - \ifvmode\else\par\fi% - \vskip\baselineskipglue% - \@afterindentfalse\@afterheading% - \IfBooleanTF{#1}{% - \IfValueTF{#3}{\setlength\@tempdima{#3}}{\setlength\@tempdima{\linewidth}}% - \setlength\@tempdimc{-.7\baselineskip}% - \begin{tabularx}{\@tempdima}{lXX}\@TermTable\end{tabularx}% - }{% - \setlength\@tempdimc{\z@}% - \begin{tabular}{lll}\@TermTable\end{tabular}% - }% - \let\@termlist\relax% -} -\newcommand*\@TermTable{% - \toprule% - \textbf{Bezeichner} & \textbf{Deutsch} & \textbf{Englisch}\tabularnewline% - \midrule% - \forlistloop\@@TermTable{\@termlist}% - \bottomrule% -} -\newcommand*\@@TermTable[1]{% - \Term{#1} & % - \ifstr{\@nameuse{#1}}{}{\PName{leer}}{\@nameuse{#1}} & % - \selectlanguage{english}\vspace*{\@tempdimc}% - \ifstr{\@nameuse{#1}}{}{\PName{empty}}{\@nameuse{#1}}\tabularnewline% +\NewExpandableDocumentCommand\@PageStyle{sm}{#2} +\NewDocumentCommand\PageStyle{smd()d''d||}{% + \if@tud@changedat% + \Process@ChangedAt{\PageStyle{#2}}[Seitenstil](#3)% + \else% + \Markup@SetFormat{\ttfamily}[Seitenstil]% + \Process@Markup{\PageStyle{#2}}(#3)'#4'% + \Process@Index{#1}{\PageStyle{#2}}[Seitenstil](#3)|#5|% + \fi% } % \end{macrocode} -% \end{macro}^^A \@termlist -% \end{macro}^^A \@@TermTable -% \end{macro}^^A \@TermTable -% \end{macro}^^A \TermTable +% \end{macro}^^A \@PageStyle +% \end{macro}^^A \PageStyle % \begin{macro}{\Font} % \changes{v2.02}{2014/10/08}{überarbeitet}^^A -% \begin{macro}{\@TempFont} -% \changes{v2.02}{2014/10/08}{entfernt}^^A +% \begin{macro}{\@Font} % Die Auszeichnung und der Indexeintrag eines Schriftelementes. % \begin{macrocode} -\NewDocumentCommand\Font{smd''d||}{% - \if@changelog% - \@ProcessChangedAt{#1}{fonts}{\ttfamily}{#2}{Schriftelement}% +\NewExpandableDocumentCommand\@Font{sm}{#2} +\NewDocumentCommand\Font{smd()d''d||}{% + \if@tud@changedat% + \Process@ChangedAt{\Font{#2}}[Schriftelement](#3)% \else% - \SetIndexFormat{#1}{#4}% - \@ProcessOutput{\texttt{#2}\if@declare~{\idxfont(Schriftelement)}\fi}% - {fonts}[\ttfamily]{#2}% + \Markup@SetFormat{\ttfamily}[Schriftelement]% + \Process@Markup{\Font{#2}}(#3)'#4'% + \Process@Index{#1}{\Font{#2}}[Schriftelement](#3)|#5|% \fi% } % \end{macrocode} -% \end{macro}^^A \@TempFont +% \end{macro}^^A \@Font % \end{macro}^^A \Font % \begin{macro}{\Color} % \changes{v2.02}{2014/10/08}{überarbeitet}^^A -% \begin{macro}{\@TempColor} -% \changes{v2.02}{2014/10/08}{entfernt}^^A -% Die Auszeichnung und der Indexeintrag einer Farbe des \CDs. -% \begin{macrocode} -\NewDocumentCommand\Color{smod''d||}{% - \if@changelog% - \@ProcessChangedAt{#1}{colors}{\ttfamily}{#2}{Farbe}% +% \begin{macro}{\@Color} +% Die Auszeichnung und der Indexeintrag einer Farbe des \CDs. Das optionale +% Argument kann sowohl bei der Deklaration als auch im Fließtext für das +% Anhängen eines Suffix verwendet werden. Alle mit \cs{Color} ausgezeichneten +% Farben referenzieren standardmäßig auf das Paket \pkg{tudscrcolor}. +% \begin{macrocode} +\NewExpandableDocumentCommand\@Color{sm}{#2} +\NewDocumentCommand\Color{smoD(){\Package{tudscrcolor}}d''d||}{% + \if@tud@changedat% + \Process@ChangedAt{\Color{#2}}[Farbe](#4)% \else% - \SetIndexFormat{#1}{#5}% - \@ProcessOutput{\texttt{#2}}[% - \IfValueT{#3}{~\texttt{(#3)}}\if@declare~{\idxfont(Farbe)}\fi% - ]'#4'{colors}[\ttfamily]{#2}% + \Markup@SetFormat{\ttfamily}[Farbe](% + \begingroup\ttfamily{#2\IfValueT{#3}{~(#3)}}\endgroup% + )% + \Process@Markup{\Color{#2}}[#3](#4)'#5'% + \Process@Index{#1}{\Color{#2}}[Farbe](#4)|#5|% \fi% } % \end{macrocode} -% \end{macro}^^A \@TempColor +% \end{macro}^^A \@Color % \end{macro}^^A \Color -% Damit ist das Intermezzo mit Auszeichnungsbefehlen speziell für die Klasse -% beendet. % % \iffalse %</class> % \fi % -% \iffalse +% \subsubsection{Zuordnung der Markup-Befehle für Label und Index} +% +% \begin{macro}{\tud@attr@get} +% \changes{v2.05}{2015/11/03}{neu}^^A +% Der Befehl \cs{tud@attr@get} ordnet den einzelnen Markup-Befehlen ihren +% spezifischen Präfix für ein Label oder in der Sternversion den passenden +% Index zu. Im ersten obligatorischen Argument wird ein Makro angegeben, +% welches die Zuordnung enthalten soll, das zweite ist der Markup-Befehl selbst. +% \begin{macrocode} +\NewDocumentCommand\tud@attr@get{smm}{% + \begingroup% +% \end{macrocode} +% Das temporäre Makro \cs{@tempa} definiert zunächst alle Markup-Befehle lokal +% neu und expandiert beim Aufruf für jeden dieser Markup-Befehle~-- abhängig +% vom Aufruf von \cs{tud@attr@get} mit oder ohne Stern~-- entweder zum Markup +% passenden Index oder das entsprechende Labelpräfix in \cs{@tempb}. +% \begin{macrocode} + \def\@tempa##1##2##3{% + \def##1####1{% + \edef\@tempb{\IfBooleanTF{#1}{##2}{##3}}% + }% + }% + \@tempa\Application{\jobname}{app}% + \@tempa\Distribution{\jobname}{dst}% + \@tempa\Engine{\jobname}{eng}% + \@tempa\File{files}{fle}% + \@tempa\Class{files}{cls}% + \@tempa\Package{files}{pkg}% + \@tempa\Option{options}{opt}% + \@tempa\Environment{macros}{env}% + \@tempa\Macro{macros}{cmd}% + \@tempa\Length{misc}{len}% + \@tempa\Counter{misc}{cnt}% +% \end{macrocode} +% Da \cs{Key} mit zwei Hauptargumenten aufgerufen wird, ist nur die Expansion +% des ersten Argumentes in \cs{@tempb} notwendig. +% \begin{macrocode} %<*class> -% \fi + \def\Key##1##2{% + \edef\@tempb{\IfBooleanTF{#1}{macros}{key}}% + }% + \@tempa\Term{terms}{term}% + \@tempa\PageStyle{elements}{pgs}% + \@tempa\Font{elements}{font}% + \@tempa\Color{elements}{clr}% +%</class> +% \end{macrocode} +% Nachdem alle Markup-Befehle lokal redefiniert wurden, wird der nun angegebene +% Befehl ausgeführt, was zum eigentlichen Definieren von \cs{@tempb} führt. +% \begin{macrocode} + #3% +% \end{macrocode} +% Damit alle Änderungen der temporären Makros lokal bleiben, wird das Ergebnis +% nach der Gruppe in das erste obligatorische Argument expandiert. +% \begin{macrocode} + \edef\tud@reserved{% + \noexpand\endgroup% + \def\noexpand#2{\@tempb}% + }% + \tud@reserved% +} +% \end{macrocode} +% \end{macro}^^A \tud@attr@get % -% \subsection{Befehle und Umgebungen für die Klasse} -% -% Hier taucht alles auf, was lediglich für die Klasse \cls{tudscrman} und nicht -% für das Paket benötigt wird. -% -% \begin{macro}{\CheckIndexFormat} -% \changes{v2.02}{2014/10/08}{neu}^^A -% \begin{macro}{\SetIndexFormat} -% \changes{v2.02}{2014/10/08}{neu}^^A -% \begin{macro}{\@IndexFormat} -% \changes{v2.02}{2014/10/08}{neu}^^A -% Zuerst werden jedoch einige Hilfsmakros erstellt mit denen überprüft wird, ob -% die Sternversion der zuvor definierten Auszeichnung"=Befehle zusammen mit -% einer Indexformatierung \val{|idxformat|} genutzt wurde, was sich natürlich -% widerspricht. In diesem Fall erfolgt eine Warnung. -% \begin{macrocode} -\newcommand*\@IndexFormat{} -\let\@IndexFormat\relax -\newcommand*\CheckIndexFormat[2]{% - \IfBooleanT{#1}{% - \IfValueT{#2}{% - \ClassWarning{tudscrman}{% - You've used the starred version so no entry for\MessageBreak% - the index is created and the optional argument\MessageBreak% - |#2| will be ignored% +% \subsubsection{Markup von Variablen, Parametern etc.} +% +% \begin{macro}{\Path} +% \changes{v2.02}{2014/07/22}{\cs{DeclareRobustCommand} ersetzt durch +% \cs{newrobustcmd} aus \pkg{etoolbox}}^^A +% \begin{macro}{\PValue} +% \begin{macro}{\PName} +% \begin{macro}{\PValueName} +% \changes{v2.05}{2015/11/01}{neu}^^A +% \begin{macro}{\PSet} +% \begin{macro}{\PBoolean} +% \begin{macro}{\PBName} +% \changes{v2.02}{2014/11/12}{neu}^^A +% \begin{macro}{\Parameter} +% \begin{macro}{\OParameter} +% \begin{macro}{\LParameter} +% \begin{macro}{\OLParameter} +% \begin{macro}{\PParameter} +% \begin{macro}{\POParameter} +% \changes{v2.03}{2015/01/25}{neu}^^A +% \begin{macro}{\textOR} +% Diese Befehle dienen zum Auszeichnen von obligatorischen und optionalen +% Parametern und Befehlen oder bestimmten Wertzuweisungen. +% \begin{macrocode} +\newrobustcmd*\Path[1]{\mbox{\texttt{#1}}} +\newrobustcmd*\PValue[1]{\mbox{\texttt{#1}}} +\newrobustcmd*\PName[1]{\PValue{\textsl{<#1>}}} +\newrobustcmd*\PValueName[1]{\PName{#1}} +\newrobustcmd*\PSet{\PName{Einstellung}} +\newrobustcmd*\PBoolean{\PName{Ein-Aus-Wert}} +\newrobustcmd*\PBName[1]{\PBoolean\textOR\PName{#1}} +\newrobustcmd*\Parameter[1]{% + \mbox{\texttt{\textbraceleft}\PName{#1}\texttt{\textbraceright}}% +} +\newrobustcmd*\OParameter[1]{\mbox{\texttt{[}\PName{#1}\texttt{]}}} +\newrobustcmd*\LParameter{\mbox{\texttt{[}\PName{Parameterliste}\texttt{]}}} +\newrobustcmd*\OLParameter[1]{% + \mbox{\texttt{[}\PName{#1}\textOR\PName{Parameterliste}\texttt{]}}% +} +\newrobustcmd*\PParameter[1]{\mbox{\texttt{\textbraceleft#1\textbraceright}}} +\newrobustcmd*\POParameter[1]{\mbox{\texttt{[#1]}}} +\newrobustcmd*\textOR{\PValue{\,\textbardbl\,}} +% \end{macrocode} +% \end{macro}^^A \textOR +% \end{macro}^^A \POParameter +% \end{macro}^^A \PParameter +% \end{macro}^^A \OLParameter +% \end{macro}^^A \LParameter +% \end{macro}^^A \OParameter +% \end{macro}^^A \Parameter +% \end{macro}^^A \PBName +% \end{macro}^^A \PBoolean +% \end{macro}^^A \PSet +% \end{macro}^^A \PValueName +% \end{macro}^^A \PName +% \end{macro}^^A \PValue +% \end{macro}^^A \Path +% \begin{macro}{\tud@doifPValue} +% \changes{v2.05}{2015/11/14}{neu}^^A +% Der Befehl wird von den Makros \cs{tud@lbl@get@curr} und \cs{tud@idx@get} +% genutzt, um bedingten Quelltext auszuführen, falls im ersten obligatorischen +% Argument entweder Parameter entweder direkt oder aber mit einem der beiden +% Parameter-Markup-Befehle \cs{PValue} oder \cs{PValueName} angegeben wurde. +% Alle anderen Auszeichnungsbefehle für Parameter sollen ingnoriert werden. +% \begin{macrocode} +\newcommand*\tud@doifPValue[3][]{% + \IfValueT{#2}{% + \begingroup% +% \end{macrocode} +% Zunächst wird der Inhalt fast aller ausgezeichneten Parameter unterdrückt. +% Lediglich das Argument der beiden Makros \cs{PValue} und \cs{PValueName} wird +% durchgereicht.Dies wird bei der Generierung von Labeln sowie der Erstellung +% für Einträge im Index und der Änderungsliste benötigt, um die Angabe von +% speziellen Werten bei Schlüsseln zu erhalten. +% \begin{macrocode} + \let\PValue\@firstofone% + \let\PName\@gobble% + \let\PValueName\@firstofone% + \let\PSet\@empty% + \let\PBoolean\@empty% + \let\PBName\@gobble% + \let\Parameter\@gobble% + \let\OParameter\@gobble% + \let\LParameter\@empty% + \let\OLParameter\@gobble% + \let\PParameter\@gobble% + \let\POParameter\@gobble% + \let\textOR\relax% + \let\emph\@firstofone% +% \end{macrocode} +% Im optionalen Argument können weitere Angaben gemacht werden, beispielsweise +% um weitere lokale Redefinitionen vorzunehmen. +% \begin{macrocode} + #1% +% \end{macrocode} +% Falls tatsächlich ein passendes Argument angegeben wurde, wird der Quelltext +% des zweiten obligatorischen Argumentes ausgeführt. Es ist zu beachten, dass +% dieser \emph{expandiert} wird! +% \begin{macrocode} + \ifxblank{#2}{% + \let\tud@reserved\endgroup% + }{% + \protected@edef\tud@reserved{\noexpand\endgroup#3}% + }% + \tud@reserved% + }% +} +% \end{macrocode} +% \end{macro}^^A \tud@doifPValue +% \begin{macro}{\Markup@Gobble} +% \changes{v2.05}{2015/11/01}{neu}^^A +% Dieser Befehl definiert alle Markup-Befehle in der Form um, dass diese nur +% noch das eigentliche Hauptargument unformatiert durchreichen. Dies wird für +% die Erstellung von Label und Indexeinträgen benötigt. Die Sternversion führt +% dies auch noch für die Auszeichnung von Parametern etc. durch. +% \begin{macrocode} +\NewDocumentCommand\Markup@Gobble{s}{% + \let\Application\@Application% + \let\Distribution\@Distribution% + \let\Engine\@Engine% + \let\File\@File% + \let\Class\@Class% + \let\Package\@Package% + \let\Option\@Option% + \let\Environment\@Environment% + \let\Macro\@Macro% + \let\Length\@Length% + \let\Counter\@Counter% +%<*class> + \let\Key\@Key% + \let\Term\@Term% + \let\PageStyle\@PageStyle% + \let\Font\@Font% + \let\Color\@Color% +%</class> + \IfBooleanF{#1}{% + \let\PValue\@firstofone% + \let\PName\@firstofone% + \let\PValueName\@firstofone% + \let\PSet\relax% + \let\PBoolean\relax% + \let\PBName\@firstofone% + \let\Parameter\@firstofone% + \let\OParameter\@firstofone% + \let\LParameter\relax% + \let\OLParameter\@firstofone% + \let\PParameter\@firstofone% + \let\POParameter\@firstofone% + \let\textOR\relax% + \let\hologoRobust\@firstofone% + \def\TUDScript{TUD-KOMA-Script}% + \def\_{-}% + \protected\def~{~}% + }% +} +% \end{macrocode} +% Mit dem zuvor definierten Makro \cs{Markup@Gobble} wird gleich dafür Sorge +% getragen, dass die Auszeichnungsbefehle für PDF-Outline-Einträge korrekt +% funktionieren. +% \begin{macrocode} +\AfterPackage*{hyperref}{% + \expandafter\pdfstringdefDisableCommands\expandafter{\Markup@Gobble}% +} +% \end{macrocode} +% \end{macro}^^A \Markup@Gobble +% +% \subsubsection{Erstellung und Validierung von Labeln} +% +% \begin{macro}{\tud@lbl@tmp} +% \changes{v2.05}{2015/11/03}{neu}^^A +% \begin{macro}{\tud@lbl@fmt} +% \changes{v2.05}{2015/11/03}{neu}^^A +% In \cs{tud@lbl@tmp} werden nachfolgend die durch \cs{tud@lbl@get@curr} oder +% \cs{tud@attr@get} erzeugten (Sub-)Label gespeichert. Mit dem Hilfsmakro +% \cs{tud@lbl@fmt} wird innerhalb der beiden Befehle \cs{tud@lbl@@create} und +% \cs{tud@lbl@get@@curr} dafür gesorgt, dass geschützte Leerzeichen sowie +% eingabekodierungsabhängige Zeichen korrekt für ein Label umgesetzt werden. +% Auch durch \cs{NoCaseChange} in Überschriften geschützte Inhalte werden +% direkt übernommen. +% \begin{macrocode} +\newcommand*\tud@lbl@tmp{} +\newcommand*\tud@lbl@fmt{% + \def~{-}% + \let\IeC\@firstofone% + \def\"##1{##1e}% + \def\ss{ss}% + \let\NoCaseChange\@firstofone% +} +% \end{macrocode} +% \end{macro}^^A \tud@lbl@fmt +% \end{macro}^^A \tud@lbl@tmp +% \begin{macro}{\tud@lbl@get@curr} +% \changes{v2.05}{2015/11/03}{neu}^^A +% \begin{macro}{\tud@lbl@get@@curr} +% \changes{v2.05}{2015/11/03}{neu}^^A +% Für den Befehl \cs{tud@lbl@get@curr} wird das zweite obligatorische +% Argument (\val{\#3}) für gewöhnlich in der Form +% \val{\{\string\Bundle{\marg{Klasse/Paket}}:\string\Markup{\marg{Element}}\}} +% angegeben. Dieses wird beim Einlesen direkt an die beiden Argumentprozessoren +% \cs{SplitArgument}\val{\{2\}\{:\}} gefolgt von \cs{tud@lbl@create} übergeben. +% Danach enthält das zweite obligatorische Argument ein Label der Form +% \meta{Bundlepräfix}\val{:}\meta{Labelpräfix}\val{:}\meta{Element}. Auch die +% Angabe eines Makros als zweites obligatorische Argument, welches das Label in +% der richtigen Formatierung enthält, ist möglich. +% \begin{macrocode} +\NewDocumentCommand\tud@lbl@get@curr{% + sm>{\tud@lbl@create}>{\SplitArgument{2}{:}}md==% +}{% +% \end{macrocode} +% Mit \cs{tud@lbl@get@@curr} wird das im zweiten obligatorischen Argument +% (\val{\#3}) generierte Label in das im ersten obligatorischen Argument +% (\val{\#2}) angegebenen Makro gespeichert und ggf. diesem das letzte +% optionale Argument für einen speziellen Wert zu einem Schlüssel angehangen. +% \begin{macrocode} + \tud@lbl@get@@curr#2{#3}=#4=% +% \end{macrocode} +% Die Sternversion von \cs{tud@lbl@get@curr} wird für das Definieren von Labeln +% bei Deklarationen etc. genutzt. Sollte diese verwendet worden sein, ist die +% Generierung beendet. +% \begin{macrocode} +%<*class> + \IfBooleanF{#1}{% +% \end{macrocode} +% Andernfalls wird geprüft, ob das erstellte Label überhaupt existiert. Sollte +% dies nicht der Fall sein wird ein passendes Label für den gegebenen Schlüssel +% ohne speziellen Wert gesucht. +% \begin{macrocode} + \@tempswafalse% + \tud@if@lbl@exists{#2}{% + \@tempswatrue% + }{% + \IfValueT{#4}{% + \tud@lbl@get@@curr\tud@reserved{#3}% + \tud@if@lbl@exists{\tud@reserved}{% + \let#2\tud@reserved% + \@tempswatrue% + }{}% }% }% +% \end{macrocode} +% Wurde auch danach noch kein passendes Label gefunden, gibt es u.\,U. eine +% letzte Möglichkeit, ein passendes Label zu finden. Wird in der Dokumentation +% gerade ein Paket oder eine sich von den Hauptklassen unterscheidende Klasse +% aus dem \TUDScript-Bundle erläutert (Umgebungen \env{Bundle}, \env{Bundle*}), +% so wird eventuell auf ein Element aus ebendiesen Hauptklassen referenziert. +% In diesem Fall wird \cs{tud@lbl@get@dflt} aufgerufen, um den Bundlepräfix +% für das Label entsprechend zu setzen. +% \begin{macrocode} + \if@tempswa\else% + \tud@if@bdl{\tud@lbl@get@dflt#2{#3}=#4=}{}% + \fi% }% +%</class> } % \end{macrocode} -% Der Befehl \cs{SetIndexFormat} setzt das gewünschte Format für den jeweilgen -% Indexeintrag. +% Mit dem Befehl \cs{tud@lbl@get@@curr} wird das generierte Label in das beim +% Aufruf von \cs{tud@lbl@get@curr} angegebenen Makro gespeichert. % \begin{macrocode} -\newcommand*\SetIndexFormat[2]{% - \CheckIndexFormat{#1}{#2}% - \IfBooleanTF{#1}{% - \def\@IndexFormat{#1}% +\NewDocumentCommand\tud@lbl@get@@curr{mmd==}{% + \def#1{#2}% +% \end{macrocode} +% Sollte optional mit \cs{PValue} bzw. \cs{PValueName} ein spezieller Wert für +% einen Schlüssel übergeben worden sein, wird dieser ggf. angehängt. +% \begin{macrocode} + \tud@doifPValue[\tud@lbl@fmt]{#3}{\noexpand\appto\noexpand#1{=#3}}% +} +% \end{macrocode} +% \end{macro}^^A \tud@lbl@get@@curr +% \end{macro}^^A \tud@lbl@get@curr +% \begin{macro}{\tud@lbl@get@dflt} +% \changes{v2.05}{2015/11/04}{neu}^^A +% \begin{macro}{\tud@lbl@get@@dflt} +% \changes{v2.05}{2015/11/04}{neu}^^A +% Diese beiden Makros werden genutzt, um mit \cs{tud@lbl@get@curr} innerhalb +% der Umgebungen \env{Bundle} und \env{Bundle*} für den Fall, dass ein +% gesuchtes Label für das aktuelle Bundle-Element nicht existiert, nach diesem +% Element in den existierenden Labels der Hauptklassen zu suchen. +% +% Dabei wird das bereits generierte Label durch \cs{tud@lbl@get@dflt} in +% seine drei Hauptbestandteile zur WEiterverarbeitung zerlegt. +% \begin{macrocode} +\NewDocumentCommand\tud@lbl@get@dflt{m>{\SplitArgument{2}{:}}mr==}{% + \tud@lbl@get@@dflt{#1}#2=#3=% +} +% \end{macrocode} +% Durch \cs{tud@lbl@get@@dflt} wird als erstes geprüft, ob der Bundlepräfix +% bereits dem Standardpräfix für die Hauptklassen entspricht. Nur wenn dies +% nicht der Fall ist, wird die Labelgenerierung abermals ausgeführt. +% \begin{macrocode} +\NewDocumentCommand\tud@lbl@get@@dflt{mmmmr==}{% + \edef\tud@reserved{\expandafter\detokenize\expandafter{\tud@bdl@dflt}}% + \ifstr{\tud@reserved}{#2}{}{% +% \end{macrocode} +% Dabei erfolgt der Aufruf logischerweise mit dem richtigen Bundlepräfix. +% \begin{macrocode} + \tud@lbl@get@curr#1{\tud@bdl@dflt:#3:#4}=#5=% + }% +} +% \end{macrocode} +% \end{macro}^^A \tud@lbl@get@@dflt +% \end{macro}^^A \tud@lbl@get@dflt +% \begin{macro}{\tud@if@lbl@exists} +% \changes{v2.05}{2015/11/05}{neu}^^A +% Mit dem Befehl \cs{tud@if@lbl@exists} wird eine Fallunterscheidung bezüglich +% der Existenz eines Labels in der Form +% \meta{Bundlepräfix}\val{:}\meta{Labelpräfix}\val{:}\meta{Element} +% durchgeführt. Das zu prüfende Label ist in gleicher Weise wie beim Makro +% \cs{tud@lbl@get@curr} anzugeben. Je nachdem, ob ein existierendes Label +% gefunden wird oder nicht, wird das zweite oder das dritte obligatorische +% Argument ausgeführt. +% \begin{macrocode} +%<*class> +\NewDocumentCommand\tud@if@lbl@exists{% + >{\tud@lbl@create}>{\SplitArgument{2}{:}}m% +}{% + \ifcsdef{r@#1}{% + \expandafter\@firstoftwo% }{% - \IfValueTF{#2}{\def\@IndexFormat{#2}}{\def\@IndexFormat{}}% + \expandafter\@secondoftwo% }% } +%</class> % \end{macrocode} -% \end{macro}^^A \@IndexFormat -% \end{macro}^^A \SetIndexFormat -% \end{macro}^^A \CheckIndexFormat -% \begin{macro}{\if@declare} -% \begin{macro}{\if@stareddeclare} -% \changes{v2.02}{2014/10/09}{neu}^^A -% \begin{macro}{\if@openindex} -% \begin{macro}{\if@deprecated} -% Dies sin ein paar Hilfsmakros zur Steuerung des Markup sowie der Ausgabe von -% Deklarationen, Index und Änderungsliste, welche bei den nächsten Befehlen und -% Umgebungen genutzt werden. +% \end{macro}^^A \tud@if@lbl@exists +% \begin{macro}{\tud@lbl@create} +% \changes{v2.05}{2015/11/03}{neu}^^A +% \begin{macro}{\tud@lbl@@create} +% \changes{v2.05}{2015/11/03}{neu}^^A +% Das Makro \cs{tud@lbl@@create} ist ein Argumentprozessor, welcher als Eingabe +% genau drei Argumente für das Erstellen eines gültigen Labels erwartet. Er +% wird sowohl von \cs{tud@lbl@get@curr} als auch von \cs{tud@if@lbl@exists} +% verwendet. Vor der Nutzung von \cs{tud@lbl@create} muss das Argument zuvor +% bereits mit \cs{SplitArgument}\val{\{2\}\{:\}} aufgerufen worden sein. Diese +% Eigenheit macht die Definition von \cs{tud@lbl@create} notwendig, um das +% Ergebnis der zuvor vorgenommenen Argumentaufspaltung verarbeiten zu können, +% in dem dieses an \cs{tud@lbl@@create} durchgereicht wird. Eine Integration +% der Spaltung des Argumentes in \cs{tud@lbl@create} ist aufgrund des +% mehrmaligen rekursiven Aufrufs von \cs{tud@lbl@create} nicht möglich. +% +% Mit dem Argumentprozessor \cs{tud@lbl@create} wird es möglich, an die beiden +% Befehle \cs{tud@lbl@get@curr} und \cs{tud@if@lbl@exists} sowohl ein +% einzelnes Makro, welches das Label bereits beinhaltet als auch einen +% Markup-Befehl ggf. mit einem Bundlepräfix zu übergeben. In beiden Fällen +% wird aus dem übergebenen Argument ein eindeutiges Label in der Form +% \meta{Bundlepräfix}\val{:}\meta{Labelpräfix}\val{:}\meta{Element} generiert +% und als resultierendes Argument an das aufrufenden Makro übergeben. +% \begin{macrocode} +\NewDocumentCommand\tud@lbl@create{m}{\tud@lbl@@create#1} +% \end{macrocode} +% Es gibt insgesamt vier verschiedene Varianten der Argumentenübergabe an den +% Argumentprozessor \cs{tud@lbl@@create}. +% \begin{description}\let\itshape\slshape +% \item[\cs{tud@lbl@@create}\val{\ignorespaces +% \{\string\LabelMakro\}\{-NoValue-\}\{-NoValue-\}\ignorespaces +% }]\strut\newline +% Das Label ist bereits in \cs{LabelMakro} enthalten und soll expandiert +% werden. Dabei spielt es keine Rolle, ob die durch \val{:} getrennten +% Bestandteile innerhalb des Labels schon als einfacher String oder in der +% Markupform gegeben sind. +% \item[\cs{tud@lbl@@create}\val{\ignorespaces +% \{-NoValue-\}\{\string\Markup{\marg{Element}}\}\{-NoValue-\}\ignorespaces +% }]\strut\newline +% Das Label soll für ein Markupelement generiert werden, wobei in jedem +% Fall der Inhalt aus \cs{tud@bdl@curr} als Bundlepräfix genutzt wird. +% \item[\cs{tud@lbl@@create}\val{\ignorespaces +% \{\string\Class/\string\Package\marg{\dots}\}\ignorespaces +% \{\string\Markup{\marg{Element}}\}\ignorespaces +% \{-NoValue-\}\ignorespaces +% }]\strut\newline +% Das Label soll für ein Markupelement generiert werden. +% Dabei wurde explizit ein Paket oder eine Klasse aus dem Bundle angegeben +% oder implizit das Makro \cs{tud@bdl@curr} als Argument verwendet, +% welches innerhalb der Umgebungen \env{Bundle} und \env{Bundle*} auf +% das/die aktuell beschriebene Paket/Klasse gesetzt wurde. +% \item[\cs{tud@lbl@@create}\val{\ignorespaces +% \marg{Bundlepräfix}\ignorespaces +% \marg{Labelpräfix}\ignorespaces +% \marg{Element}\ignorespaces +% }]\strut\newline +% Das Label ist bereits vollständig bestimmt und die Argumente werden +% entweder als String oder als Markup übergeben. Auch Mischformen sind +% möglich. In diesem Fall wird es einfach wieder zusammengesetzt. Diese +% Variante tritt durch rekursiven Aufruf des Argumentprozessors auf. +% \end{description} +% \begin{macrocode} +\NewDocumentCommand\tud@lbl@@create{mmm}{% + \begingroup% +% \end{macrocode} +% Zu Beginn werden die Markup-Befehle auf ihre expandierbaren Varianten gesetzt +% und die zusätzlichen Redefinitionen für die Labelgenerierung aktiviert. % \begin{macrocode} -\newif\if@declare -\newif\if@stareddeclare -\newif\if@openindex -\newif\if@deprecated + \Markup@Gobble% + \tud@lbl@fmt% % \end{macrocode} -% \end{macro}^^A \if@deprecated -% \end{macro}^^A \if@openindex -% \end{macro}^^A \if@stareddeclare -% \end{macro}^^A \if@declare +% Sind alle drei Bestandteile bereits vorhanden, wird das Label einfach wieder +% zusammengesetzt. +% \begin{macrocode} + \IfValueTF{#3}{% + \edef\@tempa{#1:#2:#3}% + }{% +% \end{macrocode} +% Hier geschieht der eigentliche Vorgang der Labelgenerierung. Dabei wird mit +% dem Makro \cs{tud@attr@get} der für den jeweiligen Markup-Befehl aus dem +% zweiten obligatorischen Argument spezifische Labelpräfix generiert. Abhängig +% davon, ob im ersten obligatorischen Argument ein spezieller Bundlepräfix +% angegeben wurde, wird dieser entweder verwendet oder aber implizit auf den +% Inhalt aus \cs{tud@bdl@dflt} zurückgegriffen. +% \begin{macrocode} + \IfValueTF{#2}{% + \tud@attr@get\@tempb{#2}% + \IfValueTF{#1}{% + \ifxblank{#1}{% + \edef\@tempa{\tud@bdl@dflt:\@tempb:#2}% + }{% + \edef\@tempa{#1:\@tempb:#2}% + }% + }{% + \edef\@tempa{\tud@bdl@curr:\@tempb:#2}% + }% + }{% +% \end{macrocode} +% Wurde lediglich ein Makro angegeben, wird dieses einfach expandiert. +% \begin{macrocode} + \edef\@tempa{#1}% + }% + }% +% \end{macrocode} +% Das Ergebnis der Labelgenrierung wurde für alle der behandelten Fälle in +% \cs{@tempa} geschrieben. Abschließnd wird \cs{ProcessedArgument} nach der +% Gruppe mit dessen Inhalt definiert. Dabei werden bei der Expansion die +% catcodes aller Zeichen in Tokens der Klasse \val{other} gewandelt, um diese +% später sicher vergleichen zu können. +% \begin{macrocode} + \edef\@tempc{% + \noexpand\endgroup% + \def\noexpand\ProcessedArgument{% + \expandafter\detokenize\expandafter{\@tempa}% + }% + }% + \@tempc% +} +% \end{macrocode} +% \end{macro}^^A \tud@lbl@@create +% \end{macro}^^A \tud@lbl@create % % \subsubsection{Abarbeitung der Markup-Befehle} % -% In der Klasse \cls{tudscrman} werden die Markup-Befehle entweder im Fließtext -% verwendet und dabei automatisch Einträge in den Index erzeugt oder aber diese -% werden als Argument der Umgebung \env{Declaration} genutzt. +% Die Festlegung des individuellen Markups der Einzelnen Elemente erfolgt bei +% der Definition mit \cs{Markup@SetFormat}. Bei der Nutztung der Markup-Befehle +% im Fließtext wird zum einen das in \cs{Markup@Format} individuell definierte +% Markup umgesetzt und zum anderen wird dabei gleich automatisch ein Eintrag +% für das Element im Index erzeugt. +% +% In der Klasse \cls{tudscrmanual} werden die Markup-Befehle zusätzlich auch +% als Argument der Umgebung \env{Declaration} genutzt. Für diese Verwendung +% kommt die Definiton von \cs{Markup@Declare} und ggf. \cs{Markup@Suffix} zum +% Einsatz. % -% \begin{macro}{\@ProcessOutput} +% \begin{macro}{\Process@Markup} % \changes{v2.02}{2014/10/08}{Markup für Index und Fließtext getrennt}^^A % \changes{v2.02}{2014/10/09}{Anpassung für Umgebung \env{Declaration*}}^^A -% Der Befehl \cs{@ProcessOutput} ist das Herzstück der Auszeichnungen aller -% Elemente. Das erste obligatorische Argument ist der übergebene Wert, welcher -% in einer bestimmten Form ausgezeichnet werden soll. Darauf folgen die ein -% möglicher \oarg{Anhang} sowie ggf. das \val{'}\meta{Kürzel}\val{'} für die -% Erweiterung der Referenzierunug im Fließtext. Danach wird der Zielindex -% \marg{Index} und~-- für Parameter~-- der \parg{Haupteintrag} übergeben. Es -% folgt der zu erstellende Indexeintrag mit \oarg{Vorsatz}, \marg{Eintrag} und -% \oarg{Anhang}. Die Formatierung für den Indexbefehl wurde zuvor durch -% \cs{SetIndexFormat} in \cs{@IndexFormat} gespeichert. Der vollständige -% Funktionsaufruf lautet: +% \changes{v2.05}{2015/11/05}{Neuimplementierung}^^A +% \begin{macro}{\Markup@Suppress} +% \changes{v2.05}{2015/11/05}{neu}^^A +% \begin{macro}{\Markup@@Suppress} +% \changes{v2.05}{2015/11/05}{neu}^^A +% Der Befehl \cs{Process@Markup} ist das Herzstück der Auszeichnungen aller +% Elemente. Das obligatorische Argument ist das auszuzeichnende Element selbst, +% welches im weiteren Verlauf der Abarbeitung expandiert wird. Darauf folgen +% mehrere optionale Argumente. Mit \val{=}\meta{Wert}\val{=} kann ein Wert für +% einen Schlüssel angegeben werden, was aktuell von \cs{Option} und \cs{Key} +% genutzt wird. Darauf folgend kann in einem ordinären optionalen Argument ein +% Suffix für die Fließtextausgabe angegeben werden, was von \cs{Distribution} +% sowie \cs{Environment}, \cs{Macro} und \cs{Color} verwendet wird. +% +% Mit dem optionalen Argument in runden Klammern kann eine Klasse oder ein +% Paket aus dem \TUDScript-Bundle angegeben werden, auf welche sich das +% aktuelle auszuzeichnende Element bezieht und ggf. das Label und der +% Indexeintrag dementsprechend erzeugt werden sollen. Verwendet wird es mit: +% \val{(\string\Class\marg{Klasse}/\string\Package\marg{Paket})} +% +% Das optionale Argument in Guillemets wird von \cs{Package} benötigt, um ggf. +% die automatisch generierten Links auf CTAN anzupassen. Zuletzt kann mit +% \val{'}\meta{Referenzvariante}\val{'} der automatisch erzeugte Querverweis in +% verschiedenen Varianten formatiert werden. Der vollständige Funktionsaufruf: % \newline\begingroup\scriptsize -% \cs{@ProcessOutput}* -% \marg{Ausgabe}\oarg{Anhang}\val{'}\meta{Kürzel}\val{'}\ignorespaces% -% \marg{Index}\parg{Haupteintrag}\oarg{Vorsatz}\marg{Eintrag}\oarg{Anhang} +% \cs{Process@Markup}\val{\ignorespaces% +% \marg{Element}=\meta{Wert}=\oarg{Ausgabesuffix}\ignorespaces% +% \parg{Bundleelement}<\meta{CTAN-Paket}>\ignorespaces% +% '\meta{Referenzvariante}'\ignorespaces% +% }% % \endgroup +% +% In eingen Fällen ist es beim Aufruf eines Markup-Befehls nicht erwünscht, +% dass dieser auch tatsächlich ausgegeben wird. Für diesen Fall wird gleich zu +% Beginn der Befehl \cs{Markup@Suppress} definiert, der dies ermöglicht. +% \begin{macrocode} +\newcommand*\Markup@Suppress{\let\Process@Markup\Markup@@Suppress} +\NewDocumentCommand\Markup@@Suppress{md==od()d<>d''}{} +% \end{macrocode} +% Nun folgt die eigentliche Befehlsdefinition. % \begin{macrocode} -\NewDocumentCommand\@ProcessOutput{mod''d()md()omo}{% +\NewDocumentCommand\Process@Markup{md==od()d<>d''}{% % \end{macrocode} -% Mit dem Schalter \cs{if@declare} wird unterschieden, ob ein beliebiger -% Auszeichnungsbefehl innerhalb der Umgebung~\env{Declaration} verwendet wird. -% Ist dies der Fall wird ein Label und mit \cs{@HyperIndex} ein spezieller -% Indexeintrag für die Deklaration erstellt. Eine Ausgabe der Auszeichnung -% erfolgt in diesem Fall nicht, dafür ist der Befehl \cs{printdeclarationlist} -% verantwortlich. Außerdem wird mit Hilfe der \env{Declaration}-Umgebung der -% Anfang und das Ende der Deklaration für den Indexeintrag mit \cs{@HyperIndex} -% exakt festgelegt. Der Schalter \cs{if@openindex} wird zu Beginn der Umgebung -% auf \cs{@openindextrue} gesetzt, am Ende dieser auf \cs{@openindexfalse}. +% Zu Beginn wird mit dem Schalter \cs{if@tud@declare} geprüft, ob die der +% Markup-Befehl in einer der Deklarationsumgebungen oder anderweitig genutzt +% wird. Für den ersten Fall erfolgt die Weiterverarbeitung der Argumente mit +% \cs{Process@@MarkupDeclare}, andernfalls kommt \cs{Process@@MarkupInline} zum +% Einsatz. Da beide Makros die gleiche Reihenfolge der Argumente verlangen, +% wird der jeweilige Befehlsaufruf über ein Token-Register realisiert, womit +% das Zusammensetzen der notwendigen Übergabewerte erleichtert wird. +% +% Die Fallunterscheidung betrifft des Weiteren die Erzeugung des Labels. Für +% eine Deklaration wird die Sternversion von \cs{tud@lbl@get@curr} verwendet, +% welche ein Label aus den gegebenen Argumenten zusammensetzt. Ist keine +% Deklaration aktiv, versucht \cs{tud@lbl@get@curr} ein gültiges, schon +% vorhandenes Label zu verwenden. Das generierte Label wird anschließend als +% erstes Argument für das weiterverabeitende Makro genutzt. % \begin{macrocode} - \if@declare% +%<*class> + \if@tud@declare% + \tud@toks@{\Process@@MarkupDeclare}% + \IfValueTF{#4}{% + \tud@lbl@get@curr*\tud@lbl@tmp{#4:#1}=#2=% + }{% + \tud@lbl@get@curr*\tud@lbl@tmp{\tud@bdl@curr:#1}=#2=% + }% + \else% +%</class> + \tud@toks@{\Process@@MarkupInline}% + \tud@lbl@get@curr\tud@lbl@tmp{#4:#1}=#2=% +%<*class> + \fi% +%</class> + \eaddto@hook\tud@toks@{\expandafter{\tud@lbl@tmp}}% +% \end{macrocode} +% Danach wird der Inhalt des im ersten Argument übergebenen Markup-Befehls in +% einer Gruppe ein temporäres Makro expandiert und als zweites Argument für die +% Weiterverarbeitung genutzt. +% \begin{macrocode} + \begingroup% + \Markup@Gobble*% + \protected@edef\tud@reserved{% + \noexpand\endgroup% + \def\noexpand\tud@reserved{#1}% + }% + \tud@reserved% + \eaddto@hook\tud@toks@{\expandafter{\tud@reserved}}% +% \end{macrocode} +% Es folgen gegebenenfalls die optionalen Argument \val{=}\meta{Wert}\val{=} +% sowie \oarg{Ausgabesuffix}~-- falls diese angegeben wurden. +% \begin{macrocode} + \IfValueT{#2}{\addto@hook\tud@toks@{=#2=}}% + \IfValueT{#3}{\addto@hook\tud@toks@{[#3]}}% +% \end{macrocode} +% Erfolgt gerade eine Deklaration, wird mit dem Schalter \cs{if@openindex} +% eigentlich unterschieden, ob ein öffnender oder ein schließender Indexeintrag +% erzeugt werden soll. Dieser wird mit \cs{Process@@Index} erstellt. Um den +% schließenden Indexeintrag zu erzeugen, ist die Ausführung des Hauptargumentes +% der Deklarationsumgebung am Ende dieser notwendig. Dabei soll allerdings das +% Markup nicht noch ein weiteres Mal ausgegeben werden. Deshalb wird der +% Schalter hier genutzt, um lediglich zu Beginn einer Deklaration das Markup +% auszuführen. Dabei Angaben für eine \val{'}\meta{Referenzvariante}\val{'} +% nicht erlaubt. +% \begin{macrocode} +%<*class> + \if@tud@declare% \if@openindex% - \IfValueT{#3}{% - \ClassWarning{tudscrman}{% + \IfValueT{#6}{% + \ClassWarning{tudscrmanual}{% It is not possible to use any cross-reference\MessageBreak% - shorthand like '#3' within the arguments of\MessageBreak% + shorthand like '#6' within the arguments of\MessageBreak% the environment `Declaration'% }% }% % \end{macrocode} -% Das zu erzeugende Label wird definiert. +% Für ein eventuell notwendiges Debugging, wird \cs{Process@@MarkupDeclare} mit +% seinen Argumenten ggf. in das Log-File geschrieben. % \begin{macrocode} - \IfValueTF{#6}{\edef\@tempa{#5:#6:#8}}{\edef\@tempa{#5:#8}}% + \tud@trace@markup{declare}{\the\tud@toks@}% + \else% + \tud@toks@{\relax}% + \fi% % \end{macrocode} -% Für die Deklaration veralteter Optionen, Befehle etc. kann die Sternvariante -% des Auszeichnungsbefehls verwendet werden, um das Erzeugen eines Labels zu -% unterbinden. +% Findet der Auszeichnungsbefehl außerhalb einer Umgebung für Deklarationen +% Verwendung, werden die optionalen Argumente für einen CTAN-Link +% \val{<}\meta{CTAN-Paketname}\val{>} sowie die Formatierung des Querverweise +% \val{'}\meta{Referenzvariante}\val{'} hinzugefügt~-- falls vorhanden. Dies +% geschieht jedoch nur, wenn das Markup nicht innerhalb eines Index erfolgt, +% da hier URL-Hyperlinks und formatierte Querverweise unerwünscht sind. Mit +% der Angabe eines leeren Argumentes \val{<>} wird gar kein Hyperlink erstellt. % \begin{macrocode} - \if@deprecated% - \expandafter\IfBooleanF\expandafter{\@IndexFormat}{% - \manualhyperdef{\@tempa}% - }% + \else% +%</class> + \if@tud@index\else% + \IfValueT{#5}{% + \ifxblank{#5}{}{\addto@hook\tud@toks@{<http://www.ctan.org/pkg/#5>}}% + }% + \IfValueT{#6}{\addto@hook\tud@toks@{'#6'}}% + \fi% +%<*class> % \end{macrocode} -% Wurde die Sternversion eines Auszeichnungsbefehls innerhalb der Umgebung -% \env{Declaration} genutzt, wird lediglich ein Label aber kein Eintrag im -% Index erzeugt. +% Auch hier wird ggf. ein Debug-Eintrag ins Log-File geschrieben. % \begin{macrocode} - \else% - \expandafter\IfBooleanTF\expandafter{\@IndexFormat}{% - \manualhyperdef{\@tempa}% + \tud@trace@markup{output}{\the\tud@toks@}% + \fi% % \end{macrocode} -% Andernfalls werden Label bzw. Hyperlinkanker und ein Eintrag in den Index -% erzeugt, wobei die Formatierung dieses Eintrags fest vorgegeben ist. -% \begin{macrocode} - }{% - \ifx\@IndexFormat\@empty\else% - \ClassWarning{tudscrman}{% - It is not possible to use any indexing format\MessageBreak% - like |\@IndexFormat| within the arguments of the\MessageBreak% - environment `Declaration'% +% Ganz zum Schluss wird noch für beide Fälle geprüft, ob \parg{Bundleelement} +% angegeben wurde. Ist dies der Fall, wird zum einen das \meta{Bundleelement} +% zur Überprüfung ggf. in das Log-File geschrieben, zum anderen wird geprüft, +% ob für das \meta{Element} überhaupt ein Link definiert wurde, der verwendet +% werden soll. Ist dies nicht der Fall, wird eine Warnung ausgegeben. Dies ist +% möglich, da durch die automatische Labelgenerierung normalerweise alle nicht +% existierenden Labels mit \meta{Bundlepräfix} auf \cs{tud@bdl@dftl} verweisen +% müssten. Für die wenigen Fälle, in denen gezielt auf einen Querverweis +% verzichtet werden soll, kann ein leeres Argument \val{()} angegeben werden. +% \begin{macrocode} + \if@tud@index\else% + \IfValueT{#4}{% + \ifxblank{#4}{}{% + \tud@trace@bdl@add{#4}% + \ifstr{#6}{none}{}{% + \tud@if@lbl@exists{\tud@lbl@tmp}{}{% + \ClassWarning{tudscrmanual}{% + No existing label \tud@lbl@tmp\space for #4% }% - \fi% -% \end{macrocode} -% Wird zur Deklaration die Umgebung \env{Declaration*} genutzt, so wird der -% Hyperlink ein ganzes Stück nach oben verschoben. Hintergrund ist, dass diese -% Umgebung nur zum Deklarieren von Klassen und Paketen gedacht ist und direkt -% nach einer Gliederungsüberschrift folgen sollte. -% \begin{macrocode} - \if@stareddeclare% - \manualhyperdef'{\@tempa}% + }% + }% + }% + }% + \fi% % \end{macrocode} -% Andernfalls wird der normale Hyperlink gesetzt. Das Label zum Prüfen wird -% implizit durch \cs{manualhyperdef} gesetzt. +% Nun erfolgt mit \cs{Process@@MarkupDeclare} bzw. \cs{Process@@MarkupInline} +% die Ausführung der eigentlichen Auszeichnung. % \begin{macrocode} - \else% - \manualhyperdef{\@tempa}% - \fi% - \@HyperIndex{#5}{#6}{#7}{#8}{#9}{(declare}% - }% - \fi% +%</class> + \the\tud@toks@% +} % \end{macrocode} -% Die \env{Declaration*}"=Umgebung erzeugt keine direkte Ausgabe sondern nur -% die Hyperlinks und Indexeinträge. Die Nennung der Klasse bzw. des Paketes -% oder der Pakete sollte in der Überschrift davor erfolgen. +% \end{macro}^^A \Markup@@Suppress +% \end{macro}^^A \Markup@Suppress +% \end{macro}^^A \Process@Markup +% \begin{macro}{\Process@@MarkupDeclare} +% \changes{v2.05}{2015/11/05}{neu}^^A +% Mit \cs{Process@@MarkupDeclare} wird die formatierte Ausgabe der Deklaration +% realisiert. Wie diese genau gestaltet ist, wird durch \cs{tud@declare@num} +% bestimmt. Folgende Werte sind möglich: +% \begin{description} +% \item[\val{0}:] Ausgabe von Markup, Erzeugen eines Labels +% \item[\val{1}:] Ausgabe von Markup, kein Label +% \item[\val{2}:] keine Ausgabe, aber Erzeugen eines Labels +% \item[\val{3}:] keine Ausgabe, Erzeugen eines nach oben verschobenen Labels +% \end{description} +% Normalerweise kommt die erste Variante zum Einsatz. Die zweite Variante wird +% genutzt, wenn mit mit der Umgebung \env{Obsolete} zwar eine Ausgabe aber kein +% Label erstellt werden soll. Dies wird verwendet, um bei der Beschreibung +% veralteter Werte oder Parameter diese im Kontext ihrer Option oder Umgebung +% bzw. ihres Befehls anzugeben. +% +% Die dritte Version kommt bei Erklärungen mit der Umgebung \env{Declaration*} +% zum Einsatz, welche im Fließtext verwendet wird und kein Markup, wohl aber +% eine Label für das beschriebene Element erzeugt werden soll. Für die vierte +% Variante, welche die Umgebung \env{Bundle*} betrifft, gilt dies im Prinzip +% gleichermaßen. Allerdings wird diese Umgebung zu Beginn der Deklarationen +% eines Bundleelements direkt nach einer Überschrift verwendet. Hier soll der +% erzeugte Link direkt auf der Höhe der Überschrift platziert werden. +% +% Das erste Argument enthält das zu definierende Label, gefolgt vom Element, +% welches ausgezeichnet werden soll. Die tatsächliche Ausgabe erfolgt mit dem +% Makro \cs{Markup@Output}. An dieses werden die beiden optionalen Argumente +% \val{=}\meta{Wert}\val{=} und \oarg{Ausgabesuffix} direkt weitergereicht. +% +% Vor der eigentlichen Ausführung wird mit \cs{Markup@CheckFormat} geprüft, ob +% für das auszuzeichnende Element mit \cs{Markup@SetFormat} überhaupt eine +% Ausgabeformatierung defineirt wurde. Nach der Ausgabe wird diese Formatierung +% mit \cs{Markup@ClearFormat} zurückgesetzt. % \begin{macrocode} - \if@stareddeclare\else% - #1\IfValueT{#2}{#2}% - \fi% +%<*class> +\NewDocumentCommand\Process@@MarkupDeclare{mmd==o}{% + \Markup@CheckFormat% + \ifcase\tud@declare@num\relax% + \tudhyperdef{#1}% + \Markup@Output{#2}=#3=[#4]% + \or% + \Markup@Output{#2}=#3=[#4]% + \or% + \tudhyperdef{#1}% + \or% + \tudhyperdef*{#1}% + \def\@tempa##1:##2:##3\@nil{\tudhyperdef*{##3:##2:##3}}% + \@tempa#1\@nil% + \fi% + \Markup@ClearFormat% +} +%</class> % \end{macrocode} -% Zum Ende der \env{Declaration}"=Umgebung wird der Indexeintrag beendet. +% \end{macro}^^A \Process@@MarkupDeclare +% \begin{macro}{\Process@@MarkupInline} +% \changes{v2.05}{2015/11/05}{neu}^^A +% Mit \cs{Process@@MarkupInline} wird die formatierte Ausgabe außerhalb der +% Deklarationsumgebungen umgesetzt. Dabei entsprechen die ersten vier Argument +% denen des Befehls \cs{Process@@MarkupDeclare} und werden bis auf das Label +% ebenso an \cs{Markup@Output} übergeben, nachdem mit \cs{Markup@CheckFormat} +% auf eine existierende Markup-Definition geprüft wurde. % \begin{macrocode} - \else% - \if@deprecated\else% - \expandafter\IfBooleanF\expandafter{\@IndexFormat}{% - \@HyperIndex{#5}{#6}{#7}{#8}{#9}{declare)}% - }% - \fi% - \fi% - \else% +\NewDocumentCommand\Process@@MarkupInline{mmd==od<>d''}{% + \Markup@CheckFormat% % \end{macrocode} -% Findet der Auszeichnungsbefehl außerhalb der \env{Declaration}-Umgebung im -% Fließtext Verwendung, wird für den Fall, dass keine Sternversion genutzt -% wurde, mit \cs{@HyperIndex} ein Eintrag im dazugehörigen Index erzeugt. +% Um die aktuelle Definiton der temporären Makros nicht zu ändern, erfolgt die +% formatierte Ausgabe in einer Gruppe. Dabei wird in \cs{@tempc} die minimale +% Variante gesichert. % \begin{macrocode} - \ifx\@IndexFormat\relax% - \ClassError{tudscrman}{\string\SetIndexFormat\space unused}{% - It seems you have forgotten to use \string\SetIndexFormat.% - }% - \else% - \expandafter\IfBooleanF\expandafter{\@IndexFormat}{% - \@HyperIndex{#5}{#6}{#7}{#8}{#9}{\@IndexFormat}% - }% - \fi% + \begingroup% + \def\@tempc{\Markup@Output{#2}=#3=[#4]}% % \end{macrocode} -% Danach erfolgt die Ausgabe der Auszeichnung. Sollte für diesen ein Label -% durch eine Deklaration innerhalb der \env{Declaration}-Umgebung definiert -% worden sein, so wird auf dieses ein Hyperlink gesetzt. Ansonsten erfolgt die -% normale textuelle Ausgabe. Für Parameter muss der Hyperlink dabei aufgrund -% des definierten Haupteintrag etwas anders ausgeführt werden (\cs{@tempa}). +% Danach wird eine Fallunterscheidung anhand des im ersten Argument übergebenen +% Labels getroffen. Existiert dieses, soll das Element als Hyperlink ausgegeben +% werden. Die Definition dafür wird in \cs{@tempa} gespeichert. % \begin{macrocode} - \IfValueTF{#6}{\edef\@tempa{#5:#6:#8}}{\edef\@tempa{#5:#8}}% - \ifcsdef{r@\@tempa}{% +%<*class> + \tud@if@lbl@exists{#1}{% + \def\@tempa{\hyperref{}{\tud@manualname}{#1}{\@tempc}}% % \end{macrocode} +% Anschließend wird \cs{@tempb} ggf. für den erweiterten Querverweis verwendet. % Wurde ein Format für den Querverweis gesetzt, muss dieses validiert werden. -% Gültige Kürzel sind 'auto', 'page' und 'full'. Damit werden die erzeugten -% Querverweise um den Gliederungsabschnitt, die Seite oder beides ergänzt. -% Außerdem kann mit 'none' der Hyperlink selbst unterbunden werden. +% Gültige Kürzel sind \val{'auto'}, \val{'page'} und \val{'full'}. Damit werden +% die erzeugten Querverweise um den Gliederungsabschnitt, die Seite oder beides +% ergänzt. Außerdem kann mit \val{'none'} der Hyperlink komplett unterbunden +% werden. Für \cs{Package} kann mit zusätzlich \val{'url'} noch der gCTAN-Link +% forciert werden, auch wenn eigentlich ein Label für das Paket existiert. % \begin{macrocode} \let\@tempb\relax% - \def\@tempc{\mbox{\hyperref{}{\jobname}{\@tempa}{#1}\IfValueT{#2}{#2}}}% - \IfValueT{#3}{% + \IfValueT{#6}{% \def\@tempb{% - \ClassWarning{tudscrman}{% + \ClassWarning{tudscrmanual}{% You've used the unknown cross-reference\MessageBreak% - shorthand '#3'. Only 'auto', 'page'\MessageBreak% - and 'full' as well as 'none' are valid% + shorthand '#6'. Only 'auto', 'page' and 'full'\MessageBreak% + as well as 'none' \IfValueT{#5}{or 'url' }are valid% }% }% - \ifstr{#3}{auto}{\def\@tempb{ in \autoref{\@tempa}}}{}% - \ifstr{#3}{page}{\def\@tempb{ \vpageref{\@tempa}}}{}% - \ifstr{#3}{ppage}{\def\@tempb{ \reftextfaraway{\@tempa}}}{}% - \ifstr{#3}{full}{\def\@tempb{ in \fullref{\@tempa}}}{}% - \ifstr{#3}{none}{% - \let\@tempb\relax% - \def\@tempc{\mbox{#1\IfValueT{#2}{#2}}}% - }{}% + \ifstr{#6}{auto}{\def\@tempb{ in \autoref{#1}}}{% + \ifstr{#6}{page}{\def\@tempb{ \vpageref{#1}}}{% + \ifstr{#6}{ppage}{\def\@tempb{ \reftextfaraway{#1}}}{% + \ifstr{#6}{full}{\def\@tempb{ in \fullref{#1}}}{% + \ifstr{#6}{none}{\let\@tempa\@tempc\let\@tempb\relax}{}}}}}% + \IfValueT{#5}{% + \ifstr{#6}{url}{\def\@tempa{\href{#5}{\@tempc}}\let\@tempb\relax}{}% + }% }% - \@tempc\@tempb% }{% +%</class> % \end{macrocode} -% Wurde ein Format für den Querverweis gesetzt und es existiert kein passendes -% Label, wird eine Warnung ausgegeben. +% Existiert kein Label, so wird einfach die minimale Markup-Variante verwendet. +% Für Pakete wird ein CTAN-Link erzeugt. % \begin{macrocode} - \IfValueT{#3}{% - \ClassWarning{tudscrman}{% - No cross-reference created, label \@tempa\space is missing% - }% - }% + \let\@tempa\@tempc% + \IfValueT{#5}{\def\@tempa{\href{#5}{\@tempc}}}% % \end{macrocode} -% Sollte ein Paket mit \cs{Package} angegeben worden sein, so wurde das erste -% optionale Argument in runden Klammern verwendet. Dieses wird genutzt, um -% einen Hyperlink auf CTAN zu generieren. Die Ausgabe selbst besteht in jedem -% Fall aus dem ersten obligatorischen und ggf. dem ersten optionalen Argument. +% Ein Querverweis kann logischerweise nicht erstellt werden. Wurde dennoch im +% letzten optionalen Argument eine \val{'}\meta{Referenzvariante}\val{'} für +% den Querverweis angegeben, wird eine Warnung erzeugt. % \begin{macrocode} - \IfValueTF{#4}{% - \ifstr{#4}{}{\mbox{#1\IfValueT{#2}{#2}}}{% - \href{http://www.ctan.org/pkg/#4}{\mbox{#1\IfValueT{#2}{#2}}}% + \let\@tempb\relax% + \IfValueT{#6}{% + \ifstr{#6}{none}{\let\@tempa\@tempc}{% +%<package> \ifstr{#6}{manual}{\def\@tempa{\tudhyperref{#1}{\@tempc}}}{% + \def\@tempb{% + \ClassWarning{tudscrmanual}{% +%<*class> + Label #1\MessageBreak% + is missing, no cross-reference created.% +%</class> +%<*package> + You've used the unknown cross-reference\MessageBreak% + shorthand '#6'. Only 'none' and 'manual'\MessageBreak% + are valid% +%</package> + }% + }% +%<package> }% }% - }{% - \mbox{#1\IfValueT{#2}{#2}}% }% +% \end{macrocode} +% Um im Zweifel nach allen fehlenden Labels im Log-File prüfen zu können, gibt +% es den passenden Debug-Befehl. +% \begin{macrocode} +%<*class> + \tud@trace@lbl@missing@add{#1}% }% +%</class> +% \end{macrocode} +% Ganz zum Schluss erfolgt die Ausgabe als Hyperlink mit optional erweitertem +% Querverweis nicht, wenn gerade eine Überschrift gesetzt wird. +% \begin{macrocode} + \ifdin{\@tempc}{\@tempa\@tempb}% +% \end{macrocode} +% Zum Schluss wird die Formatierung mit \cs{Markup@ClearFormat} zurückgesetzt. +% \begin{macrocode} + \endgroup% + \Markup@ClearFormat% +} +% \end{macrocode} +% \end{macro}^^A \Process@@MarkupInline +% \begin{macro}{\Markup@Output} +% \changes{v2.05}{2015/11/05}{neu}^^A +% \begin{macro}{\Markup@@Output} +% \changes{v2.05}{2015/11/05}{neu}^^A +% Der Befehl \cs{Markup@Output} wird für die formatierte Markup-Ausgabe von den +% beiden Makros \cs{Process@@MarkupDeclare} sowie \cs{Process@@MarkupInline} +% aufgerufen. Das erste Argument enthält dabei das auszuzeichnende Element. +% Dabei ist die Besonderheit des Makros \cs{Key}\marg{Makro}\marg{Parameter} zu +% beachten, dessen beiden Argumente hier in der Form \marg{Makro!Parameter} +% übergeben werden. Deshalb wird das erste Argument mit dem Argumentprozessor +% \cs{SplitArgument}\val{\{1\}\{!\}} getrennt und dann weiter verarbeitet. +% \begin{macrocode} +\NewDocumentCommand\Markup@Output{>{\SplitArgument{1}{!}}md==o}{% + \Markup@@Output#1=#2=[#3]% +} +% \end{macrocode} +% Anschließend wird entweder \cs{Markup@Declare} oder \cs{Markup@Inline} +% aufgerufen~-- abermals abhängig vom Schalter \cs{if@tud@declare}. Auch hier +% wird für den Befehlsaufruf mit dem dazugehörigen Argument zur Vereinfachung +% ein Token-Register verwendet. +% \begin{macrocode} +\NewDocumentCommand\Markup@@Output{mmd==o}{% +%<*class> + \if@tud@declare% + \tud@toks@{\Markup@Declare}% + \else% +%</class> + \tud@toks@{\Markup@Inline}% +%<*class> \fi% +%</class> % \end{macrocode} -% Zum Schluss wird \cs{@IndexFormat} zurückgesetzt. +% Ist das aktuelle Element \cs{Key} wird nur das zweite Argument ausgegeben. +% Das erste wird lediglich für Label und Indexeintrag benötigt. % \begin{macrocode} - \let\@IndexFormat\relax% + \IfValueTF{#2}{% + \def\@tempa{#2}% + }{% + \def\@tempa{#1}% + }% +% \end{macrocode} +% Die beiden optionalen Argumente werden ggf. in der gleichen Formatierung +% ausgegeben. +% \begin{macrocode} + \IfValueT{#3}{\appto\@tempa{=#3}}% + \IfValueT{#4}{\appto\@tempa{#4}}% + \eaddto@hook\tud@toks@{\expandafter{\@tempa}}% + \the\tud@toks@% } % \end{macrocode} -% \end{macro}^^A \@ProcessOutput -% \begin{macro}{\hyperidx} -% \changes{v2.02}{2014/08/16}{neu}^^A -% Aufgrund der Nichtbeachtung von RegExp"=Ausdrücken durch den Indexprozessor -% \texttt{texindy} (\url{http://sourceforge.net/p/xindy/bugs/22/}) muss hierfür -% etwas getrickst werden. Der Befehl \cs{hyperidx} hat ein optionales Argument, -% in welchem das für \cs{manualhyperref} obligatorische Label enthalten ist. -% Das führt dazu, dass \texttt{texindy} dieses beim internen Filtern in eckigen -% Klammern beibehält und es anschließend über eine in \texttt{tudscrman.xdy} -% eigens definierte \texttt{merge-rule} verworfen werden kann. -% \begin{macrocode} -\newrobustcmd*\hyperidx[2][]{\manualhyperref{#1}{#2}} -% \end{macrocode} -% \end{macro}^^A hyperidx -% \begin{macro}{\@HyperIndex} -% \changes{v2.02}{2014/10/08}{überarbeitet}^^A -% Dieser Befehl sorgt für die eigentlichen Indexeinträge. Dabei werden für -% Einträge, welche innerhalb der \env{Declaration}-Umgebung deklariert wurden, -% ein Hyperlink im Index erstellt. Das erste Argument \marg{Index} enthält den -% gewünschten Zielindex. Danach folgt~-- für Parameter~-- der Haupteintrag. -% Daran schließt der Indexeintrag selbst mit \marg{Vorsatz}, \marg{Eintrag}, -% \marg{Anhang} und zum Abschluss \oarg{Formatierung} an. Der vollständige -% Funktionsaufruf lautet: +% \end{macro}^^A \Markup@@Output +% \end{macro}^^A \Markup@Output +% \begin{macro}{\Markup@Inline} +% \changes{v2.05}{2015/11/05}{neu}^^A +% \begin{macro}{\Markup@Declare} +% \changes{v2.05}{2015/11/05}{neu}^^A +% \begin{macro}{\Markup@@Declare} +% \changes{v2.05}{2015/11/05}{neu}^^A +% Die Ausgabe selbst ist alles andere als spektakulär. Die zur Formatierung +% verwendeten Makros \cs{Markup@Format} und \cs{Markup@Suffix} werden durch +% \cs{Markup@SetFormat} für jedes Markup-Element individuell definiert. +% \begin{macrocode} +\newcommand*\Markup@Inline[1]{\mbox{\Markup@Format{#1}}} +%<*class> +\newcommand*\Markup@Declare{} +\newcommand*\Markup@@Declare[1]{% + \begingroup\Markup@Format{#1}\endgroup\Markup@Suffix% +} +%</class> +% \end{macrocode} +% \end{macro}^^A \Markup@@Declare +% \end{macro}^^A \Markup@Declare +% \end{macro}^^A \Markup@Inline +% \begin{macro}{\Markup@SetFormat} +% \changes{v2.05}{2015/11/05}{neu}^^A +% \begin{macro}{\Markup@CheckFormat} +% \changes{v2.05}{2015/11/05}{neu}^^A +% \begin{macro}{\Markup@ClearFormat} +% \changes{v2.05}{2015/11/05}{neu}^^A +% \begin{macro}{\Markup@Format} +% \changes{v2.05}{2015/11/05}{neu}^^A +% \begin{macro}{\Markup@Suffix} +% \changes{v2.05}{2015/11/05}{neu}^^A +% \begin{macro}{\tud@x@textcase@uclcnotmath} +% \begin{macro}{\tud@nonchangecase} +% \changes{v2.05}{2015/11/20}{neu}^^A +% \begin{macrocode} +\newcommand*\Markup@Format{} +\newcommand*\Markup@Suffix{} +% \end{macrocode} +% Der Befehl \cs{Markup@SetFormat} setzt das gewünschte Format für die jeweilge +% Ausgabe. Dieses wird im ersten Argument angegeben. Das ordinäre optionale +% Argument kann genutzt werden, wenn bei der Deklaration noch eine geanuere +% Beschreibung oder Spezifizierung erscheinen soll, beispielsweise etwas wie +% \enquote{Umgebung} oder \enquote{Parameter}. Mit dem optionalen Argument in +% runden Klammern wird es möglich, die Definition von \cs{Markup@Declare}, die +% ohne eine Angabe der von \cs{Markup@@Declare} entspricht, zu ändern. Dies +% wird insbesondere von \cs{Environment} genutzt, um bei der Deklaration eine +% Tabelle zu erzeugen. +% \begin{macrocode} +\NewDocumentCommand\Markup@SetFormat{mod()}{% +% \end{macrocode} +% Außerdem ist noch eine weitere Besonderheit zu beachten. Sollte gerade \DIN +% verwendet werden~-- der Befehl wird innerhalb einer Überschrift genutzt~-- +% wird lediglich das Hauptargument unformatiert jedoch als Argument von +% \cs{MakeTextUppercase} ausgegeben, um das Setzen von Majuskeln zu erzwingen. +% Der Hintergrund wird bei der Erweiterung von \cs{tud@x@textcase@uclcnotmath} +% erläutert. +% \begin{macrocode} + \def\Markup@Format{\ifdin{\MakeTextUppercase}{#1}}% + \IfValueT{#2}{\def\Markup@Suffix{\suffix{#2}}}% +%<*class> + \IfValueT{#3}{\renewcommand*\Markup@Declare[1]{#3\Markup@Suffix}}% +%</class> +} +% \end{macrocode} +% Das durch die \TUDScript-Hauptklassen in Ergänzung zum Paket \pkg{fontspec} +% erstellte Makro \cs{tud@x@textcase@uclcnotmath} erlaubt die Definition von +% Makros, welche von \cs{MakeTextUppercase} nicht beachtet werden sollen. +% Dieser Befehl kommt bei den \TUDScript-Klassen in Überschriften zum Einsatz, +% wenn diese in \DIN gesetzt werden. Das hat zu Folge, dass die Argumente der +% Markup-Befehle bereits in Majuskeln übergeben werden würden, was unter +% anderem für die Erstellung von Labeln und Einträgen für den Index nicht +% gewünscht wäre. Deshalb werden \emph{alle} Markup-Befehle der Liste zum +% Ignorieren hinzugefügt. Damit aber bei der eigentlichen Ausgabe alles in +% Majuskeln erscheint, wird für diesen Fall \cs{Markup@Format} genutzt. +% \begin{macrocode} +\robustify\NoCaseChange +\NewDocumentCommand\tud@nonchangecase{m}{% + \DeclareExpandableDocumentCommand#1{sm}{% + \IfBooleanT{##1}{\noexpand\@tud@indextrue}% + \NoCaseChange{#1{##2}}% + }% +} +\apptocmd{\tud@x@textcase@uclcnotmath}{% + \tud@nonchangecase\Application% + \tud@nonchangecase\Distribution% + \tud@nonchangecase\Engine% + \tud@nonchangecase\File% + \tud@nonchangecase\Class% + \tud@nonchangecase\Package% + \tud@nonchangecase\Option% + \tud@nonchangecase\Environment% + \tud@nonchangecase\Macro% + \tud@nonchangecase\Length% + \tud@nonchangecase\Counter% +%<*class> + \DeclareExpandableDocumentCommand\Key{smm}{% + \IfBooleanT{##1}{\noexpand\@tud@indextrue}% + \NoCaseChange{#1{##2}{##3}}% + }% + \tud@nonchangecase\Term% + \tud@nonchangecase\PageStyle% + \tud@nonchangecase\Font% + \tud@nonchangecase\Color% +%</class> +}{}{\tud@patch@wrn{tud@x@textcase@uclcnotmath}} +% \end{macrocode} +% Nach der formatierten Ausgabe wird \cs{Markup@ClearFormat} aufgerufen, um die +% aktuell definierte Formatierung zurückzusetzen und bei einem neuen Aufruf +% eines der Markup-Befehle mit \cs{Markup@CheckFormat} auf die Verwendung von +% \cs{Markup@SetFormat} prüfen zu können. +% \begin{macrocode} +\newcommand*\Markup@ClearFormat{% + \let\Markup@Format\relax% + \let\Markup@Declare\Markup@@Declare% + \let\Markup@Suffix\relax% +} +\Markup@ClearFormat +\newcommand*\Markup@CheckFormat{% + \ifx\Markup@Format\relax% + \ClassError{tudscrmanual}{\string\Markup@SetFormat\space unused}{% + It seems you have forgotten to use \string\Markup@SetFormat.% + }% + \fi% +} +% \end{macrocode} +% \end{macro}^^A \tud@nonchangecase +% \end{macro}^^A \tud@x@textcase@uclcnotmath +% \end{macro}^^A \Markup@Suffix +% \end{macro}^^A \Markup@Format +% \end{macro}^^A \Markup@ClearFormat +% \end{macro}^^A \Markup@SetFormat +% \end{macro}^^A \Markup@CheckFormat +% +% \subsection{Index} +% +% Hier erscheint alles, was für Erstellen und Ausgabe der einzelnen Indexe +% notwendig ist. +% +% \subsubsection{Indexerstellung} +% +% Für die Erstellung aller Indexe wird das Paket \pkg{imakeidx} zusammen mit +% \app{texindy} verwendet. Diese können sowohl mit dem Paket als auch mit der +% Klasse erzeugt werden. +% \begin{macrocode} +\PassOptionsToPackage{xindy,splitindex}{imakeidx} +\RequirePackage{imakeidx}[2013/07/11] +% \end{macrocode} +% Zuerst ein paar kleinere Einstellungen für das Layout\dots +% \begin{macrocode} +\indexsetup{% +%<*class> + level=\addsec,% +%</class> +%<*package> + level=\subsection*,% +%</package> + noclearpage,firstpagestyle=headings,headers={\indexname}{\indexname},% + othercode={\renewcommand*\subitem{\@idxitem\hspace*{15\p@}}}% +} +% \end{macrocode} +% \begin{environment}{theindex} +% \dots gefolgt von einem Patch für die Umgebung \env{theindex}, um unschöne +% Seitenumbrüche direkt nach Überschriften zu vermeiden. Diese treten auf, das +% das Paket \pkg{imakeidx} meiner Meinung nach die Überschriften zusammen mit +% der \env{multicols}-Umgebung falsch setzt. Der Patch sorgt dafür, dass die +% Überschriften (\cs{imki@indexlevel}\val{\{}{\cs{indexname}\val{\{\}}}) nicht +% vor der Umgebung sondern~-- wie für \pkg{multicol} auch dokumentiert~-- im +% optionalen Argument von \env{multicols} aufgerufen werden. +% \begin{macrocode} +\ifimki@original\else% + \CheckCommand\theindex{% + \imki@maybeaddtotoc + \imki@indexlevel{\indexname}\imki@indexheaders + \thispagestyle{\imki@firstpagestyle}% + \ifnum\imki@columns>\@ne + \columnsep \imki@columnsep + \ifx\imki@idxprologue\relax + \begin{multicols}{\imki@columns} + \else + \begin{multicols}{\imki@columns}[\imki@idxprologue] + \fi + \else + \imki@idxprologue + \fi + \global\let\imki@idxprologue\relax + \parindent\z@ + \parskip\z@ \@plus .3\p@\relax + \columnseprule \ifKV@imki@columnseprule.4\p@\else\z@\fi + \raggedright + \let\item\@idxitem + \imki@othercode% + }% + \patchcmd{\theindex}{% + \imki@indexlevel{\indexname}\imki@indexheaders% + }{% + \imki@indexheaders% + }{}{\tud@patch@wrn{theindex}}% + \patchcmd{\theindex}{% + \ifnum\imki@columns>\@ne + \columnsep \imki@columnsep + \ifx\imki@idxprologue\relax + \begin{multicols}{\imki@columns} + \else + \begin{multicols}{\imki@columns}[\imki@idxprologue] + \fi + \else + \imki@idxprologue + \fi + }{% + \ifnum\imki@columns>\@ne\relax% + \columnsep \imki@columnsep% + \ifx\imki@idxprologue\relax% + \begin{multicols}{\imki@columns}[\imki@indexlevel{\indexname}]% + \else% + \begin{multicols}{\imki@columns}[% + \imki@indexlevel{\indexname}% + \imki@idxprologue% + ]% + \fi% + \else% + \imki@indexlevel{\indexname}\imki@idxprologue% + \fi% + }{}{\tud@patch@wrn{theindex}}% +\fi% +% \end{macrocode} +% \end{environment}^^A theindex +% \begin{macro}{\cleversee} +% \changes{v2.05}{2015/11/02}{neu}^^A +% \begin{macro}{\cleverseealso} +% \changes{v2.05}{2015/11/02}{neu}^^A +% \begin{macro}{\tud@cleversee} +% \changes{v2.05}{2015/11/02}{neu}^^A +% Diese Befehle dienen zum smarten Setzen von Hinweisen im Index. Existiert +% lediglich dieser Hinweis im Index, wird dieser mit dem Präfix \cs{seename} +% ausgegeben. Sind jedoch für einen Indexeintrag auch Seitenzahlen vorhanden, +% so werden diese zuerst ausgegeben, danach folgt der Querverweis mit dem +% Präfix \cs{seealsoname}. Der Befehl \cs{cleverseealso} verwendet letzteren +% Präfix in jedem Fall. +% \begin{macrocode} +\newrobustcmd*\cleversee{\tud@cleversee{\seename}} +\newrobustcmd*\cleverseealso{% + \ClassWarning{tudscrmanual}{You should use `|see' instead of `|seealso'}% + \tud@cleversee{\alsoname}% +} +% \end{macrocode} +% Diese Makro übernimmt die eigentliche Arbeit. Es ist darauf angewiesen, dass +% die angegebene Seitenzahlen eines Indexeintrages erst \emph{nach} den +% Hinweisen ausgegeben und mit \cs{relax} abgeschlossen werden. Dies wird mit +% der später definierten Stildatei für \app{texindy} sichergestellt. So wird es +% möglich, dass das Makro \cs{tud@cleversee} auf alles ihm bis \cs{relax} +% nachfolgende parsen kann und abhängig davon die Ausgabe gestaltet. +% \begin{macrocode} +\newcommand*\tud@cleversee{} +\def\tud@cleversee#1#2#3\relax{% + \IfArgIsEmpty{#3}{% + \emph{#1}\space#2% + }{% + #3, \emph{\alsoname}\space#2% + }% +} +% \end{macrocode} +% \end{macro}^^A \tud@cleversee +% \end{macro}^^A \cleverseealso +% \end{macro}^^A \cleversee +% \begin{macro}{\seeref} +% \changes{v2.05}{2015/11/02}{neu}^^A +% \begin{macro}{\seeidx} +% Der Befehl \cs{seeref} kann anstelle von \cs{see} bzw. in der Sternversion +% statt \cs{alsosee} genutzt werden. Das Makro \cs{seeidx} verweist auf die +% Seite eines Indexes. +% \begin{macrocode} +%<*class> +\NewDocumentCommand\seeref{sm}{% + \emph{\IfBooleanTF{#1}{\alsoname}{\seename}}\space#2% +} +\newcommand*\seeidx[2]{\pageref{idx:#1}} +%</class> +% \end{macrocode} +% \end{macro}^^A \seeidx +% \end{macro}^^A \seeref +% \begin{macro}{\makexdyindex} +% \changes{v2.05}{2015/11/01}{neu}^^A +% Um die einzelnen Indexe erstellen zu können, wird das Makro \cs{makexdyindex} +% definiert. Die Sternversion dieses Befehle erstellt dabei neben dem normalen +% Spezialindex einen weiteren, welcher explizit für Deklarationen genutzt wird. +% Dieser wird anschließen als erstes an \app{texindy} weitergereicht, um die +% richtige Formatierung der einzelnen Einträge gewährleisten zu können. Erst +% danach wird die Datei mit den normalen Einträgen verarbeitet. Siehe hierzu +% auch \cs{Process@@Index}. +% \begin{macrocode} +\NewDocumentCommand\makexdyindex{somo}{% + \let\@tempb\@empty% +%<*class> + \IfBooleanT{#1}{% + \def\@tempc{\jobname-#4-declare.idx}% + \makeindex[name={#4-declare}]% + \IfFileExists{\@tempc}{% + \edef\@tempb{-o \jobname-#4.ind \@tempc}% + }{% + \ClassWarning{tudscrmanual}{File \@tempc\space not found}% + }% + }% +%</class> + \protected@edef\@tempa{% + title={#3},% + columnsep=\noexpand\f@size\noexpand\p@,% + \IfValueTF{#4}{% + name={#4},% + options={-M \@currname-ind.xdy -L german-din -t \jobname-#4.xlg \@tempb},% + }{% + options={-M \@currname-ind.xdy -L german-din -t \jobname.xlg},% + }% + \IfValueT{#2}{#2}% + }% + \expandafter\makeindex\expandafter[\@tempa]% +} +% \end{macrocode} +% \end{macro}^^A \makexdyindex +% Nun können mit \cs{makexdyindex} die einzelnen Indexe erstellt werden. +% \begin{macrocode} +\makexdyindex{Allgemeiner Index} +\makexdyindex*{Klassen- und Paketoptionen}[options] +\makexdyindex*{Befehle und Umgebungen mit zugeh\"origen Parametern}[macros] +%<*class> +\makexdyindex*{Sprachabh\"angige Bezeichner}[terms] +\makexdyindex*{Seitenstile, Schriftelemente und Farben}[elements] +%</class> +\makexdyindex{L\"angen und Z\"ahler}[misc] +\makexdyindex*{Klassen, Pakete und Dateien}[files] +%<*class> +\makexdyindex[columns=1]{\"Anderungsliste}[changelog] +%</class> +\undef\makexdyindex +% \end{macrocode} +% \begin{macro}{\if@tud@index} +% \changes{v2.05}{2015/11/05}{neu}^^A +% Dieser Schalter wird zwei unterschiedliche Aufgaben verwendet. Zum einen wird +% er bei der Ausgabe von Verzeichnissen auf \val{true} gesetzt, um das Setzen +% von Indexeinträgen durch Markup-Befehle in den Verzeichnissen selbst zu +% unterbinden. Weiterhin verhindert der aktivierte Schalter bei der Ausführung +% von \cs{Process@Markup} das erstellen von erweiterten Querverweisen sowie das +% Setzen von CTAN-Links bei Paketen (\cs{Package}), was weder in Verzeichnissen +% noch im Index erwünscht ist, weshalb vom Makro \cs{@printindex} ebenfalls +% \cs{@tud@indextrue} gesetzt wird. +% \begin{macrocode} +\newif\if@tud@index +\addtoeachtocfile{\protect\@tud@indextrue} +% \end{macrocode} +% \end{macro}^^A \if@tud@index +% \begin{macro}{\tud@idx@get} +% \changes{v2.05}{2015/11/05}{neu}^^A +% \begin{macro}{\tud@idx@key} +% \changes{v2.05}{2015/11/05}{neu}^^A +% \begin{macro}{\tud@idx@fmt} +% \changes{v2.05}{2015/11/05}{neu}^^A +% \begin{macro}{\tud@idx@val} +% \changes{v2.05}{2015/11/05}{neu}^^A +% \begin{macro}{\tud@idx@bdl} +% \changes{v2.05}{2015/11/05}{neu}^^A +% Mit dem Makro \cs{tud@idx@get} wird die Formatierung eines Indexeintrags für +% einen Markup-Befehl realisiert. Für das Sortieren der Indexeinträge kommt +% \app{texindy} zum Einsatz. Um die Indexeinträge wie gewünscht zu Formatieren, +% gibt es zwei Möglichkeit. +% +% Bei der ersten Variante würde der Indexeintrag einfach direkt mit den +% Markup-Befehlen erstellt und in der \app{texindy}-Stildatei wird für alle +% Auszeichnungsbefehle die passende \val{merge-rule} erstellt, um die korrekte +% Sortierung zu gewährleisten. Tatsächlich war in einer früheren Version genau +% das der Ansatz. Allerdings werden die manuell erstellten RegExp-Regeln leider +% durch \app{texindy} zu spät genutzt, weshalb der Ansatz verworfen wurde. +% (\url{http://sourceforge.net/p/xindy/bugs/22/}). +% +% Damit das Sortieren verlässlich funktioniert, werden die Einträge für den +% Index deshalb in der gewohnten Syntax von \app{makeindex} in der Form +% \meta{Schlüsselwort}\val{@}\meta{Markup} erstellt. Diese Syntax kann auch mit +% \app{texindy} genutzt werden. +% +% An \cs{tud@idx@get} werden vier obligatorische gefolgt von vier optionalen +% Argumenten übergeben. Die ersten beiden Argumente sind die Makros, in welche +% \meta{Schlüsselwort}~-- für gewöhnlich \cs{tud@idx@key}~-- sowie die +% Formatierung \meta{Markup}~-- normalerweise \cs{tud@idx@fmt}~-- expandiert +% werden. Mit dem Makro im dritten Argument wird es möglich, Untereinträge zu +% einem \meta{Schlüsselwort} für beispielsweise Parameter von Umgebungen oder +% Befehlen (\cs{Key}) sowie spezielle Schlüsselwerte von Optionen zu erzeugen. +% Dabei wird vor der Erstellung des Untereintrages der direkt zuvor generierte +% Indexhaupteintrag ins dritte Argument~-- normalerweise \cs{tud@idx@val}~-- +% gesichert. Das vierte und letzte obligatorische Argument enthält schließlich +% den eigentlichen Markup-Befehl, für welchen der Indexeintrag erzeugt werden +% soll. +% +% Daran schließen sich vier optionale Argumente an, mit denen die Formatierung +% des Indexeintrags differenziert werden kann. Das erste optionale Argument +% \val{=}\meta{Wert}\val{=} kann wie bereits gewohnt für das Hinzufügen eines +% Schlüsselwertes genutzt werden. Das zweite, ordinäre optionale Argument +% \oarg{Anmerkung} fügt dem Eintrag in den Index eine zusätzliche Anmerkung +% hinzu. Soll der Indexeintrag für ein spezifisches Paket oder eine Klasse aus +% dem \TUDScript-Bundle erstellt werden, wird das optionale Argument in runden +% Klammern \val{(\string\Class\marg{Klasse}/\string\Package\marg{Paket})} für +% einen Verweis auf das \parg{Bundleelement} verwendet, der in \cs{@idxbundle} +% gespeichert wird. Das Argument \val{\textbar}\meta{Indexmarkup}\val{\textbar} +% wird bei Deklarationen zur Unterdrückung von Untereinträgen verwendet. +% Der vollständige Funktionsaufruf lautet: % \newline\begingroup\scriptsize -% \cs{@HyperIndex}\marg{Index}\marg{Haupteintrag}\ignorespaces% -% \marg{Vorsatz}\marg{Eintrag}\marg{Anhang}\marg{Formatierung} +% \cs{tud@idx@get}\cs{tud@idx@key}\cs{tud@idx@fmt}\cs{tud@idx@val}% +% \val{\ignorespaces% +% \marg{Elem.}=\meta{Wert}=\oarg{Anm.}\ignorespaces% +% \parg{Bundleelem.}\textbar\meta{Indexmark.}\textbar\ignorespaces% +% }% % \endgroup % \begin{macrocode} -\NewDocumentCommand\@HyperIndex{mmmmmm}{% - \IfValueTF{#3}{\def\@tempa{#3}}{\def\@tempa{}}% - \IfValueTF{#5}{\def\@tempb{#5}}{\def\@tempb{}}% - \IfValueTF{#6}{\edef\@tempc{|#6}}{\def\@tempc{}}% +\newcommand*\tud@idx@key{} +\newcommand*\tud@idx@fmt{} +\newcommand*\tud@idx@val{} +\newcommand*\tud@idx@bdl{} +\NewDocumentCommand\tud@idx@get{smmmmr==r[]r()d||}{% % \end{macrocode} -% Auch hier wird unterschieden, ob es sich um einen Parameter (keys) handelt. -% Wurde für einen Parameter eine Umgebung oder ein Befehl bereits definiert, -% werden zwei Indexeinträge generiert. Einer beim Befehl selber als -% Untereintrag für den jeweiligen Parameter und einer im Index für Parameter -% selbst mit der dazugehörigen Umgebung bzw. dem dazugehörigen Befehl. Beide -% erhalten einen entsprechenden Hyperlink zur Deklaration. +% Die Änderungen an allerhand temporären Makros sollen lokal bleibens. % \begin{macrocode} - \IfValueTF{#2}{% - \ifcsdef{r@#1:#2:#4}{% - \edef\@tempb{#1:#2:#4}% - \index[#1]{% - #2!\hyperidx[\@tempb]{\begingroup\expandonce\@tempa#4\endgroup}% - ~{\idxfont(Parameter)}\expandonce\@tempc% + \begingroup% +% \end{macrocode} +% In einer weiteren Gruppe wird der Markup-Befehl des vierten obligatorischen +% Arguments ausgewertet. Es wird eine Fallunterschiedung durchgeführt, ob es +% sich dabei um einen Parameter (\cs{Key}) handelt oder nicht. Ist dies der +% Fall, wird für diesen Parameter der hier nachfolgend formatierte Indexeintrag +% als Untereintrag verwendet. Dafür wird zuvor ein Haupteintrag aus dem ersten +% Argument von \cs{Key} generiert und in das dritte obligatorische Argument +% gespeichert (\cs{tud@idx@val}). +% \begin{macrocode} + \begingroup% +%<*class> + \let#4\@empty% + \in@{\Key}{#5}% +% \end{macrocode} +% Um den Haupteintrag zu extrahieren, wird mit \cs{Markup@Suppress} die Ausgabe +% des Markups deaktiviert und das erste Argument von \cs{Key} ausgeführt. Dies +% führt über \cs{Process@Index} zum rekursiven Aufruf von \cs{tud@idx@get}. Als +% Ergebnis sind im zweiten und dritten Argument~-- sprich in \cs{tud@idx@key} +% und \cs{tud@idx@fmt}~-- sowohl \meta{Schlüsselwort} als auch \meta{Markup} +% für den Elterneintrag enthalten. Diese werden in das vierte Argument +% (\cs{idxentry}) gespeichert. +% \begin{macrocode} + \ifin@% + \Markup@Suppress% + \let\Key\@firstoftwo% + #5% +% \end{macrocode} +% Da der Inhalt des vierten Arguments am Ende der Gruppe expandiert wird, wird +% mit \cs{expandonce} dafür gesorgt, dass die Expansion nur einmalig erfolgt. +% Zu beachten ist außerdem, dass der Hauptindexeintrag bereits in der Form +% \meta{Schlüsselwort}\val{@}\meta{Markup}\textbf{\val{!}} zusammengefügt wird. +% Die Sternversion wird für die Änderungsnotizen verwendet. Für diese wird eine +% kleine Anmerkung im Haupteintrag ergänzt. +% \begin{macrocode} + \let\@tempa\@empty% + \IfBooleanT{#1}{\def\@tempa{: Parameter angepasst}}% + \def#4{% + \expandonce#2\expandonce\@tempa{}@% + \expandonce#3\expandonce\@tempa{}!% + }% + \fi% +%</class> +% \end{macrocode} +% Nachdem ein möglicher Haupteintrag für Parameter erzeugt wurde, folgt nun +% der formatierte Indexeintrag für das aktuelle Markup-Element. Um diesen zu +% erstellen, wird für \meta{Schlüsselwort} zunächst nur der Inhalt des +% Hauptargumentes benötigt. Dieser wird hier in das zweite Argument +% expandiert, der ggf. erzeugte Haupteintrag in das vierte. Für \cs{Key} ist +% hier nur noch das zweite Argument relevant. +% \begin{macrocode} + \Markup@Gobble% +%<class> \let\Key\@secondoftwo% + \edef\tud@reserved{% + \noexpand\endgroup% + \def\noexpand#2{#5}% +%<class> \def\noexpand#4{#4}% }% + \tud@reserved% +% \end{macrocode} +% Die Auszeichnung für den Indexeintrag besteht in erster Linie aus dem +% Markup-Befehl selbst. Damit ein \val{@}-Zeichen beispielsweise in einem +% Makronamen korrekt verarbeitet wird, wird dieses im Stil von \app{makeindex} +% mit \val{"} maskiert. +% \begin{macrocode} + \def#3{#5}% + \tud@replace#2{@}{"@}% + \tud@replace#3{@}{"@}% +% \end{macrocode} +% In \cs{@idxbundle} wird ggf. das Paket oder die Klasse gespeichert, für die +% der aktuelle Eintrag erzeugt werden soll. Eine explizite Angabe wird in jedem +% Fall genutzt,\dots +% \begin{macrocode} + \let\tud@idx@bdl\tud@bdl@dflt% + \IfValueTF{#8}{% + \def\tud@idx@bdl{#8}% + }{% +% \end{macrocode} +% \dots eine implizite nur, wenn auch tatsächlich das passende Label existiert, +% da sonst mit Sicherheit falsche Einträge im Index erscheinen würden. +% \begin{macrocode} +%<*class> + \tud@if@bdl{% + \tud@if@lbl@exists{\tud@bdl@curr:#5}{% + \edef\tud@idx@bdl{\expandonce\tud@bdl@curr}% +% \end{macrocode} +% Sollte der Eintrag selbst dem Suffix für Paket oder Klasse entsprechen, wird +% dieser ignoriert. +% \begin{macrocode} + \def\tud@reserved{#5}% + \ifx\tud@reserved\tud@idx@bdl% + \let\tud@idx@bdl\tud@bdl@dflt% + \fi% + }{}% + }{}% +%</class> + }% +% \end{macrocode} +% Nachfolgend wird für den zu erzeugenden Indexeintrag die Zugehörigkeit des +% aktuellen Elements zu einem Paket oder einer Klasse aus dem \TUDScript-Bundle +% durch das Anhängen des jeweiligen \TUDScript-Bundle-Elements signalisiert. +% Dabei werden für die Anpassung von Schlüssel und Formatierung des Eintrags +% die temporären Makros \cs{@tempa}~(Schlüssel) und \cs{@tempb}~(Formatierung) +% gespeichert. In \cs{@tempc} wird der Inhalt von \cs{@tempb} zwischenzeitlich +% zur späteren Verwendung gesichert. +% \begin{macrocode} + \let\@tempa\@empty% + \let\@tempb\@empty% + \let\@tempc\@empty% +% \end{macrocode} +% Der temporäre Schalter \cs{@tempswa} wird genutzt, um das Hinzufügen der +% Ergänzungen zu steuern. Diese sollen nur für Elemente, welche nicht zu den +% Hauptklassen gehören, erfolgen. +% \begin{macrocode} + \@tempswatrue% + \ifx\tud@idx@bdl\tud@bdl@dflt% + \@tempswafalse% +% \end{macrocode} +% Ebenso werden die Anmerkungen für \cs{Key}-Elemente unterfdrückt, da diese +% sowieso als Untereintrag erzeugt werden. Einträge in der Änderungsliste +% werden ohnehin separat für jedes \TUDScript-Bundle-Element ausgegeben. In +% jedem Fall ist jedoch Formatierung beim Markup für das Erzeugen des richtigen +% Querverweises notwendig und wird in \cs{@tempb} und \cs{@tempc} abgelegt. +% \begin{macrocode} + \else% +%<class> \in@{\Key}{#5}\ifin@\@tempswafalse\fi% + \IfBooleanT{#1}{\@tempswafalse}% + \edef\@tempb{(\expandonce\tud@idx@bdl)}% + \fi% + \let\@tempc\@tempb% +% \end{macrocode} +% Der Indexeintrag kann zur besseren Kenntnisnahme außerdem standardmäßig mit +% einer Beschreibung versehen werden. +% \begin{macrocode} + \IfValueT{#7}{% + \appto\@tempa{ #7}% + \appto\@tempb{\suffix{#7}}% + }% +% \end{macrocode} +% Wird die Anmerkung gesetzt, ist für den Schlüssel nur der Inhalt des in +% \cs{@idxbundle} gesicherten Markup-Befehls relevant. Dieser wird in der +% folgenden Gruppe extrahiert und \cs{@tempa} angehangen. Für die Formatierung +% bleibt das Markup erhalten und wird \cs{tempb} hinzugefügt. +% \begin{macrocode} + \if@tempswa% \begingroup% - \let\Environment\@firstofone% - \def\Macro##1{\bsc##1}% - \index[keys]{% - \hyperidx[\@tempb]{% - \begingroup\expandonce\@tempa#4\endgroup~{\idxfont(\texttt{#2})}% - }% - \expandonce\@tempc% + \Markup@Gobble% + \edef\tud@reserved{% + \noexpand\endgroup% + \noexpand\appto\noexpand\@tempa{ \tud@idx@bdl}% }% - \endgroup% - }{% - \index[#1]{% - #2!\begingroup\expandonce\@tempa#4\endgroup% - ~{\idxfont(Parameter)}\expandonce\@tempc% - }% - \index[keys]{% - \begingroup\expandonce\@tempa#4\endgroup~{\idxfont(\texttt{#2})}% - \expandonce\@tempc% - }% + \tud@reserved% + \eappto\@tempb{\suffix{\expandonce\tud@idx@bdl}}% + \fi% +% \end{macrocode} +% Sollte mit \val{=}\meta{Wert}\val{=} ein spezieller Schlüsselwert angegeben +% worden sein, wird für diesen normalerweise ein separater Untereintrag +% erstellt. Der Schalter \cs{@tempswa} wird genutzt, um das Erzeugen dieses +% Untereintrages im Zweifel zu unterdrücken und diesen stattdessen als normalen +% Eintrag zu setzen. Dies ist zum einen bei Deklarationen und zum anderen in +% der Änderungsliste notwendig. Außerdem kann dies auch mit der Anagabe von +% \val{default} als Indexargument erzwungen werden. +% \begin{macrocode} + \@tempswafalse% + \IfBooleanT{#1}{\@tempswatrue}% + \IfValueT{#9}{\ifstr{#9}{declare}{\@tempswatrue}{}}% + \IfValueT{#9}{\ifstr{#9}{default}{\@tempswatrue}{}}% +% \end{macrocode} +% In diesem Fall die Ergänzungen für Schlüssel und Formatierung ggf. um die +% speziellen Schlüsselwerte für das Element ergänzt. +% \begin{macrocode} + \if@tempswa% + \protected@eappto#2{\expandonce\@tempa}% + \tud@doifPValue{#6}{\noexpand\appto\noexpand#2{=#6}}% + \protected@eappto#3{\IfValueT{#6}{=#6=}\expandonce\@tempb}% +% \end{macrocode} +% Andernfalls wird geprüft, ob ein verwertbarer Schlüsselwert angegeben wurde. +% \begin{macrocode} + \else% + \tud@doifPValue{#6}{\noexpand\@tempswatrue}% +% \end{macrocode} +% Ist dies der Fall, wird aus den bisherigen Eingaben der Hauoteintrag und +% daran anschließend der dazugehörige Untereintrag erstellt\dots +% \begin{macrocode} + \if@tempswa% + \eappto#4{% + \expandonce#2\expandonce\@tempa{}@% + \expandonce#3\expandonce\@tempb{}!% + }% + \appto#2{=#6}% + \appto#3{=#6=}% + \protected@eappto#3{\expandonce\@tempc}% +% \end{macrocode} +% \dots andernfalls bleibt es bei einem normalem Eintrag in den Index. +% \begin{macrocode} + \else% + \protected@eappto#2{\expandonce\@tempa}% + \protected@eappto#3{\expandonce\@tempb}% + \fi% + \fi% +% \end{macrocode} +% Die Erzeugung eines formatierten Indexeintrages ist beendet, das Resultat +% wird nach der letzten Gruppe definiert. +% \begin{macrocode} + \let\emph\@firstofone% + \protected@edef\tud@reserved{% + \noexpand\endgroup% + \def\noexpand#2{#2}% + \def\noexpand#3{#3}% + \def\noexpand#4{#4}% }% + \tud@reserved% +} % \end{macrocode} -% Falls es sich nicht um einen Parameter handelt, wird lediglich der Eintrag im -% speziellen Index vorgenommen und ggf. ein Hyperlink erzeugt. +% \end{macro}^^A \tud@idx@bdl +% \end{macro}^^A \tud@idx@val +% \end{macro}^^A \tud@idx@fmt +% \end{macro}^^A \tud@idx@key +% \end{macro}^^A \tud@idx@get +% \begin{macro}{\Process@Index} +% \changes{v2.05}{2015/11/15}{neu}^^A +% \begin{macro}{\Process@@Index} +% \changes{v2.05}{2015/11/15}{neu}^^A +% Mit \cs{Process@Index} wird geprüft, ob mit dem im zweiten obligatorischen +% Argument enthaltenen Markup-Befehl ein Indexeintrag erzeugt werden soll. +% Ein Indexeintrag kann mit der Sternversion eines Markup-Befehls explizit +% unterdrückt werden, wobei der boolesche Wert im ersten obligatorischen +% Argument an \cs{Process@Index} zu Prüfung übergeben wird. Außerdem wird für +% obsolete Deklarationen ebenso wie bei aktiviertem Schalter \cs{if@tud@index} +% kein Eintrag erstellt. In allen genannten Fällen passiert beim Aufruf von +% \cs{Process@Index} nichts, andernfalls wird \cs{Process@@Index} ausgeführt. +% +% Die auf die zwei obligatorischen Argumente folgenden optionalen sind in der +% Nomenklatur identisch zu den bisherigen Erläuterungen, der vollständige +% Funktionsaufruf lautet: +% \newline\begingroup\scriptsize +% \cs{Process@Index}\val{\ignorespaces% +% \marg{Stern?}\marg{Element}=\meta{Wert}=\oarg{Anmerkung}\ignorespaces% +% \parg{Bundleelement}\textbar\meta{Indexmarkup}\textbar\ignorespaces% +% }% +% \endgroup % \begin{macrocode} - }{% - \ifcsdef{r@#1:#4}{% - \index[#1]{% - \hyperidx[#1:#4]{% - \begingroup\expandonce\@tempa#4\endgroup\expandonce\@tempb% +\NewDocumentCommand\Process@Index{mmd==od()d||}{% + \ifboolexpr{% +%<class> bool {@tud@index} or bool {@tud@obsolete}% +%<package> bool {@tud@index}% + }{}{% + \IfBooleanTF{#1}{% + \IfValueT{#6}{% + \ClassWarning{tudscrmanual}{% + You've used the starred version. No index entry\MessageBreak% + for #2 is created. The\MessageBreak% + optional argument |#6| will be ignored% }% - \expandonce\@tempc% }% }{% - \index[#1]{% - \begingroup\expandonce\@tempa#4\endgroup% - \expandonce\@tempb\expandonce\@tempc% + \Process@@Index{#2}=#3=[#4](#5)|#6|% + }% + }% +} +% \end{macrocode} +% Mit \cs{Process@@Index} erfolgt die eigentliche Erzeugung des Indexeintrages. +% \begin{macrocode} +\NewDocumentCommand\Process@@Index{mr==r[]r()r||}{% +% \end{macrocode} +% Dabei erledigt \cs{tud@idx@get} einen Großteil der Aufgabe. Mit besagtem +% Makro werden Schlüssel und Format für den gewünschten Indexeintrag erzeugt. +% Sollte optional ein spezieller \val{=}\meta{Wert}\val{=} für einen Schlüssel +% gegeben sein, so wird ggf. auch der passende Haupteintrag erstellt. +% \begin{macrocode} +%<*class> + \if@tud@declare% + \tud@idx@get\tud@idx@key\tud@idx@fmt\tud@idx@val{#1}=#2=[#3](#4)|declare|% + \else% +%</class> + \tud@idx@get\tud@idx@key\tud@idx@fmt\tud@idx@val{#1}=#2=[#3](#4)|#5|% +%<*class> + \fi% +%</class> +% \end{macrocode} +% Mit der Sternversion \cs{tud@attr@get*} wird der Zielindex für das im +% ersten Argument übergebene \marg{Element} ermittelt. +% \begin{macrocode} + \tud@attr@get*\tud@lbl@tmp{#1}% +% \end{macrocode} +% Markup-Befehle, welche in Deklarationen verwendet wurden, werden für eine +% höhere Priorisierung in einem speziellen Index angelegt, wobei hier die +% Formatierung dieses Eintrags fest vorgegeben ist. +% \begin{macrocode} +%<*class> + \if@tud@declare% + \if@openindex% + \IfValueT{#5}{% + \ClassWarning{tudscrmanual}{% + It is not possible to use any indexing format\MessageBreak% + like |#5| within the arguments of the\MessageBreak% + environments `Declaration' or `Declaration*'% + }% + }% +% \end{macrocode} +% Jetzt folgt~-- abhängig vom Schalter \cs{if@openindex}~-- der öffnende oder +% schließende Indexeintrag der Deklaration. Für den schließenden ist dabei eine +% Formatierung des Schlüssels nicht notwendig. +% \begin{macrocode} + \index[\tud@lbl@tmp-declare]{% + \tud@idx@val\tud@idx@key{}@\tud@idx@fmt|(declare% + }% + \else% + \index[\tud@lbl@tmp-declare]{\tud@idx@val\tud@idx@key|declare)}% + \fi% +% \end{macrocode} +% Für Markup-Befehle außerhalb von Deklarationsumgebungen wird ein einfacher +% Eintrag in den Index erzeugt, wobei auch im Fließtext über das Indexmarkup +% \val{\textbar{}declare\textbar} eine Quasi-Deklaration verwendet werden kann. +% Dies wird beispielsweise für \KOMAScript-Optionen genutzt, um diese in der +% gewünschten Formatierung im Index erscheinen zu lassen. +% \begin{macrocode} + \else% +%</class> + \IfValueT{#5}{% +%<*class> + \ifstr{#5}{declare}{% + \appto\tud@lbl@tmp{-declare}% + \appto\tud@idx@fmt{|declare}% + }{% + \appto\tud@idx@fmt{|#5}% }% +%</class> +%<*package> + \appto\tud@idx@fmt{|#5}% +%</package> + }% + \index[\tud@lbl@tmp]{\tud@idx@val\tud@idx@key{}@\tud@idx@fmt}% +%<*class> + \fi% +%</class> +} +% \end{macrocode} +% \end{macro}^^A \Process@@Index +% \end{macro}^^A \Process@Index +% +% \iffalse +%<*class> +% \fi +% +% \begin{macro}{\CrossIndex} +% Der Befehl \cs{CrossIndex} dient zum Eintragen eines Schlagwortes, welches im +% ersten obligatorischen Argument angegeben wird, in den allgemeinen Index und +% verweist auf den im zweiten obligatorischen Argument, zum Schlagwort gehörigen +% Spezialindex. Das ordinäre optionale Argument kann verwendet werden, um ggf. +% den Eintrag in den allgemeinen Index, der normalerweise mit dem jeweiligen +% Schlagwort erfolgt, zu überschrieben. +% +% Wird die Sternversion von \cs{CrossIndex} genutzt, so wird der Querverweis +% als Eintrag in der obersten Ebene gesetzt, andernfalls wird ein Untereintrag +% gesetzt. Mit der normalen Variante können so zu einem Schlagwort weitere +% Verweise im allgemeinen Index erscheinen. Das zweite obligatorische Argument +% kann eine kommagetrennte Liste enthalten. +% \begin{macrocode} +\NewDocumentCommand\CrossIndex{smom}{% + \def\@tempa##1##2##3{% + \index{% + \IfBooleanTF{#1}{##3@##3}{##3!"|@}% + \,\textrightarrow\,% + \tudhyperref{idx:##2}{\IfValueTF{##1}{##1}{Index der ##3}}|seeidx{##2}% }% }% + \forcsvlist{\@tempa{#3}{#4}}{#2}% +} +% \end{macrocode} +% \end{macro}^^A \CrossIndex +% \begin{macro}{\SeeRef} +% \changes{v2.05}{2015/11/05}{neu}^^A +% Mit \cs{SeeRef} wird unter dem im ersten Argument gegebenen Schlagwort ein +% Indexuntereintrag erzeugt, der wiederum auf einen Indexeintrag des zweiten +% Argumentes verweist. Dabei kann im zweiten Argument ein normaler Begriff oder +% ein Markup-Befehl verwendet werden. Normalerweise wird für den Querverweis +% die Referenzklasse \val{see} verwendet, die Sternversion des Befehls hingegen +% nutzt \val{seeunverified}, um auf eine Prüfung des verwiesenen Eintrags zu +% verzichten. +% \begin{macrocode} +\NewDocumentCommand\SeeRef{smm}{% + \sbox\z@{% + \let\tud@idx@fmt\relax% + #3% +% \end{macrocode} +% Wurde im zweiten Argument ein Markup-Befehl angegeben, so wurde durch das +% Erstellen der Box das dazugehörige Indexformat in \cs{tud@idx@fmt} für den +% Eintrag erstellt. Andernfalls wurde die Definiton von \cs{tud@idx@fmt} nicht +% geändert und das Argument wird nach der Box direkt in den Index eingetragen. +% \begin{macrocode} + \ifx\tud@idx@fmt\relax% + \gdef\tud@reserved{#3}% + \else% + \global\let\tud@reserved\tud@idx@fmt% + \fi% + }% + \IfBooleanTF{#1}{\def\tud@idx@fmt{seeunverified}}{\def\tud@idx@fmt{see}}% + \index{#2!#3|\tud@idx@fmt{\tud@reserved}}% } % \end{macrocode} -% \end{macro}^^A \@HyperIndex +% \end{macro}^^A \SeeRef % -% \subsubsection{Deklarationen} +% \iffalse +%</class> +% \fi % -% Die Umgebungen \env{Declaration} und \env{Declaration*} werden beide für die -% Auszeichnung von Optionen, Umgebungen und Befehlen verwendet, die \TUDScript -% dem Anwender zur Verfügung stellt. +% \subsubsection{Indexausgabe} % -% \begin{environment}{Declaration} -% \begin{macro}{\printdeclarationlist} -% \begin{macro}{\@declarationlist} -% \begin{macro}{\@presetlist} -% \begin{macro}{\if@presetlist} -% \begin{macro}{\@additionallist} -% \begin{macro}{\if@additionallist} -% \begin{macro}{\@gobbleparameters} -% \changes{v2.02}{2014/10/09}{neu}^^A -% \changes{v2.03}{2015/02/02}{Makro \cs{relax} mit \cs{@empty} ersetzt}^^A -% Es werden einige Hilfsmakros für die Ausgabe einer Deklaration sowie der -% dazugehörigen Änderungsliste initialisiert. +% Dies sind alle Befehle, die zur Ausgabe der erzeugten Indexe benötigt werden. +% \begin{macro}{\PrintIndex} +% \changes{v2.02}{2014/08/20}{neu}^^A +% \begin{macro}{\tud@indexprologue} +% \changes{v2.02}{2014/08/20}{neu}^^A +% Mit \cs{PrintIndex} erfolgt die Ausgabe aller erstellten Indexe. Dabei wird +% für bestimmte Spezialindexe das Makro \cs{tud@indexprologue} neu gesetzt, um +% für diese vor der eigentlichen Ausgabe einige Anmerkungen machen zu können. +% Mit \cs{tud@indexprologue} kann der einleitende Teil für einen Index gesetzt +% werden. % \begin{macrocode} -\newcommand*\@declarationlist{} -\let\@declarationlist\relax -\newcommand*\@presetlist{} -\let\@presetlist\relax -\newif\if@presetlist -\newcommand*\@additionallist{} -\let\@additionallist\relax -\newif\if@additionallist -\newcommand*\@gobbleparameters{% - \let\PName\@gobble% - \let\PBoolean\@empty% - \let\PBName\@gobble% - \let\PSet\@empty% - \let\PValue\@gobble% - \let\Parameter\@gobble% - \let\OParameter\@gobble% - \let\LParameter\@empty% - \let\OLParameter\@gobble% - \let\PParameter\@gobble% - \let\POParameter\@gobble% +%<*class> +\newcommand*\tud@indexprologue{} +%</class> +\newcommand*\PrintIndex{% + \begingroup% + \providecommand*\lettergroup[1]{% + \par\textbf{\textsf{##1}}\par% + \nopagebreak% + }% +%<*class> + \renewcommand\tud@indexprologue{% + Die im Folgenden aufgelisteten Schlagworte sollen f\"ur den Umgang mit + \hologo{LaTeXe} im Allgemeinen sowie dem \TUDScript-Bundle im Speziellen + sowohl Antworten bei generellen Fragen liefern als auch L\"osungen f\"ur + typische Probleme bereitstellen. Falls ein gesuchter Begriff hier nicht + auftaucht oder trotz vorhandener Hinweise kein zufriedenstellendes + Ergebnis erzielt werden kann, sollte das \Forum* erster Anlaufpunkt sein, + um weitere Hilfe bei der Nutzung von \TUDScript zu erhalten.% + }% +%</class> +%<*package> + \begingroup% + \let\lettergroup\@gobble% + \let\indexspace\relax% +%</package> + \print@index% +%<*package> + \endgroup% +%</package> +%<*class> + \clearpage% + \renewcommand\tud@indexprologue{% + Dies ist der Index aller im Handbuch erl\"auterten sowie erw\"ahnten + Optionen, wobei bei den meisten auch Untereintr\"age mit Seitenangaben + f\"ur spezielle Wertzuweisungen existieren.% + }% +%</class> + \print@index[options]% +%<*class> + \renewcommand\tud@indexprologue{% + Dies ist die Auflistung aller im Handbuch erl\"auterten sowie erw\"ahnten + Befehle und Umgebungen. Bei einigen existieren auch Untereintr\"age f\"ur + Schl\"ussel-Wert-Parameter, welche im optionalen Argument der jeweiligen + Anweisung verwendet werden k\"onnen. In der dritten Unterebene sind + gegebenenfalls Seitenverweise f\"ur explizite Wertzuweisungen an diese + Parameter zu finden.% + }% +%</class> + \print@index[macros]% +%<*class> + \renewcommand\tud@indexprologue{% + Dies sind alle von \TUDScript definierten, sprachabh\"angigen Bezeichner. + Informationen zur Verwendung sowie den Anpassungsm\"oglichkeiten sind in + \autoref{sec:localization} zu finden.% + }% + \print@index[terms]% + \print@index[elements]% +%</class> +%<*package> + \begingroup% + \let\lettergroup\@gobble% + \let\indexspace\relax% +%</package> + \print@index[misc]% +%<*package> + \endgroup% +%</package> + \print@index[files]% + \endgroup% } % \end{macrocode} -% Die \env{Declaration}-Umgebung dient zur Deklaration von Optionen, Umgebungen, -% Befehlen, Parametern, Bezeichnern, Längen, Schriftelementen und Farben. Diese -% werden mit den entsprechenden Auszeichnungsbefehlen als obligatorisches -% Argument übergeben. Zuvor kann noch vorher im ersten optionalen Argument eine -% Beschreibung für die Änderungsliste in der Form \oarg{Verison!Beschreibung} -% angegeben werden. Danach kann im dritten Argument~-- das zweite optionale~-- -% die Voreinstellung für eine Option oder dergleichen angegeben werden. Das -% nächste optionale Argument erlaubt die Angabe einer bedingten Voreinstellung, -% also einer anderen Voreinstellung als der zuerst angegeben unter bestimmten -% Voraussetzungen. Diese wird in der Form \oarg{Bedingung:Voreinstellung} -% angegeben. Das letzte Argument ist ebenfalls optional, wird aber in der Form -% \marg{Zusatz} angegeben und enthält ggf. zusätzliche Informationen. +% \end{macro}^^A \tud@indexprologue +% \end{macro}^^A \PrintIndex +% \begin{macro}{\print@index} +% \changes{v2.02}{2014/07/25}{neu}^^A +% \begin{macro}{\tud@idx@skip} +% \changes{v2.02}{2014/09/02}{neu}^^A +% Mit \cs{@printindex} erfolgt die Ausgabe der einzelnen Indexe. Dabei wird in +% der Klasse \cls{tudscrmanual} zuvor für jeden Index ein referenzierbares +% Label erstellt und ggf. der Prolog gesetzt. % -% Die Umgebung selbst gibt zu Beginn nichts weiter aus sondern sammelt -% lediglich alle übergebenen Argumente in jeweiligen Listen. Die eigentliche -% Ausgabe erfolgt mit dem Befehl \cs{printdeclarationlist}. +% Aufgrund der Verwendung der \env{multicols}-Umgebung durch das Paket +% \pkg{imakeidx} werden normalerweise ohne einen Prolog zu große vertikale +% Abstände gesetzt. Dies wird mit \cs{tud@idx@skip} behoben. % \begin{macrocode} -\NewDocumentEnvironment{Declaration}{omoog}{% - \listadd\@declarationlist{#2}% +\newcommand*\tud@idx@skip{% + \ifnum\imki@columns>\@ne\relax\vspace{-\multicolsep}\fi% +} +\newcommand*\print@index[1][]{% % \end{macrocode} -% Die optional angegebenen Änderungen werden später mit \cs{ChangedAt@Process} -% verarbeitet und für die Änderungsliste sowie die Randnotiz mit -% \cs{@changedatdeclare} in der Liste \cs{@changedatdeclarelist} gesichert. +% Falls ein Seitenumbruch notwendig ist, sollte dieser vor dem Index und nicht +% unmittelbar nach dem Beginn erfolgen. % \begin{macrocode} - \@changedatdeclare{#1}{#2}% + \pagebreak[3]% + \@tud@indextrue% +%<*class> % \end{macrocode} -% Hier noch die Listen für Voreinstellungen\dots +% Das zu erstellende Label wird in \cs{tud@reserved} gespeichert. Dabei wird +% die Sternversion von \cs{tudhyperdef} genutzt, um das Label auf die Höhe der +% Überschrift zu setzen. % \begin{macrocode} - \IfValueTF{#3}{% - \@presetlisttrue% - \IfValueTF{#4}{% - \def\@tempa[##1:##2]{##1:\,##2}% - \listeadd\@presetlist{preset:\,#3\,|\,\expandonce{\@tempa[#4]}}% - }{% - \listadd\@presetlist{preset:\,#3}% - }% + \ifblank{#1}{% + \def\tud@reserved{\tudhyperdef*{idx:main}}% }{% - \listadd\@presetlist{\relax}% + \def\tud@reserved{\tudhyperdef*{idx:#1}}% }% % \end{macrocode} -% \dots sowie zusätliche Informationen. +% Ohne Prolog wird der fehlerhafte vertikale Abstand behoben. % \begin{macrocode} - \IfValueTF{#5}{% - \@additionallisttrue% - \listadd\@additionallist{\hspace*{\tabcolsep}\small(#5)}% - \in@{\Environment}{#2}% - \ifin@\listadd\@additionallist{\tabularnewline}\fi% - }{% - \listadd\@additionallist{\relax}% - \in@{\Environment}{#2}% - \ifin@\listadd\@additionallist{\relax}\listadd\@additionallist{\relax}\fi% - }% -}{% + \ifx\tud@indexprologue\@empty% + \indexprologue[\tud@idx@skip]{\tud@reserved}% % \end{macrocode} -% Am Ende der Umgebung wird das übergebenen Hauptargument erneut ausgeführt, -% was zum Beenden der Indexeinträge für die jeweilige Deklaration führt -% (\cs{@openindexfalse}, siehe \cs{@ProcessOutput}). Dafür werden die Makros für -% die Angabe obligatorischer und optionaler Parameter lokal umdefiniert. +% Mit Prolog wird der fehlerhafte vertikale Abstand nach diesem korrigiert. % \begin{macrocode} - \ifx\@declarationlist\relax\else% - \ClassError{tudscrman}{\string\printdeclarationlist\space is missing}{% - \string\@declarationlist\space is not empty. Did you forget\MessageBreak% - to print this list with \string\printdeclarationlist?% + \else% + \indexprologue{% + \tud@reserved% + \tud@indexprologue% + \tud@idx@skip% }% \fi% - \@gobbleparameters% - \vskip-\lastskip% - \@declaretrue\@openindexfalse#2\@declarefalse% - \pagebreak[0]% +%</class> +% \end{macrocode} +% Fur das Paket \pkg{tudscrtutorial} erfolgt eine einfache Ausgabe der Indexe. +% \begin{macrocode} +%<package> \indexprologue[\tud@idx@skip]{}% +% \end{macrocode} +% Die Ausgabe des gewünschten Index und des leeren des Prologs. +% \begin{macrocode} + \ifblank{#1}{\printindex}{\printindex[#1]}% + \ifnum\imki@columns>\@ne\relax\vspace{-\multicolsep}\fi% +%<class> \let\tud@indexprologue\@empty% } % \end{macrocode} -% Mit dem Befehl \cs{printdeclarationlist} erfolgt die eingentliche Ausgabe -% aller Deklarationen. Zweck ist es, mehrere \env{Declaration}-Umgebungen -% ineinander verschachteln zu können und eine Ausgabe aller auf einmal zu -% erzeugen. Die durch die ggf. nacheinander folgenden Deklarationen wurden in -% entsprechenden Listen gesammelt und werden hier jetzt formatiert ausgegben. +% \end{macro}^^A \tud@idx@skip +% \end{macro}^^A \print@index +% +% \iffalse +%<*class> +% \fi +% +% \subsection{Änderungsliste} +% +% Um dem Anwender einen schnellen Überblick zu Änderungen der aktuellen Version +% bereitstellen zu können, werden Befehle zur automatisierten Erzeugung einer +% solchen Liste definiert. Die Änderungsliste ist der Klasse \cls{tudscrmanual} +% vorbehalten. +% +% Änderungsnotizen lassen sich auf zwei unterschieldichen Wegen generieren. +% Entweder über die Nutzung des Befehls \cs{ChangedAt} oder über das optionale +% Argument der Deklarationsumgebungen. Dabei sind diese in beiden Fällen in +% der Form Versionsnummer gefolgt von der eigentlichen Notiz anzugeben, wobei +% diese zwingend durch einen Doppelpunkt voneinander zu trennen sind. Die Form +% der Verwendung lautet: \meta{Versionsnummer}\val{:}\meta{Änderungsnotiz}. Die +% alleinige Angabe der Versionsnummer ohne Änderungsnotiz ist ebenso möglich. +% +% Wird die Änderungsnotiz für ein bestimmtes Element wie eine Option oder ein +% Befehl erstellt, wie es bei den Deklarationsumgebungen implizit oder bei der +% Verwendung von \cs{ChangedAt} mit optionalem Argument geschieht, gibt es die +% zusätzliche Möglichkeit, einen Untereintrag zu erstellen. Dabei ist dieser +% nach Versionsnummer und vor Änderungsnotiz in folgender Form anzugeben: +% \meta{Versionsnummer}\val{!}\meta{Untereintrag}\val{:}\meta{Änderungsnotiz}. +% Der Untereintrag ist für die explizite Angabe eines Schlüssel-Wert-Paares +% gedacht. +% \begin{macro}{\if@tud@changedat} +% \begin{macro}{\Process@ChangedAt} +% \changes{v2.02}{2014/07/25}{erweitert}^^A +% \changes{v2.02}{2014/10/08}{Sternversion ergänzt}^^A +% Der Schalter \cs{if@tud@changedat} wird im weiteren Verlauf dazu verwendet, +% das Standard-Verhalten der einzelnen Markup-Befehle kurzeitig zu ändern und +% anstelle der Makros \cs{Process@Markup} und \cs{Process@Index} den Befehl +% \cs{Process@ChangedAt} auszuführen, mit welchem die Formatierung der Einträge +% der Änderungsliste erfolgt. +% \begin{macrocode} +\newif\if@tud@changedat +% \end{macrocode} +% Die Formatierung der Änderungseinträge erfolgt dabei wie auch für den Index +% mit \cs{tud@idx@get}, wobei die Sternversion dabei für die Identifikation als +% Änderungseintrag fungiert. Aufgerufen wird \cs{Process@ChangedAt} während der +% Erstellung der Änderungseinträge mit \cs{Changed@At@CreateEntry}. Der Aufruf +% des Makros erfolgt dabei in der gewohnten Form mit einem obligatorischen +% gefolgt von drei optionalen Argumenten: +% \newline\begingroup\scriptsize +% \cs{Process@ChangedAt}\val{\ignorespaces% +% \marg{Element}=\meta{Wert}=\oarg{Ausgabesuffix}\parg{Bundleelement}% +% }% +% \endgroup +% \begin{macrocode} +\NewDocumentCommand\Process@ChangedAt{md==od()}{% + \tud@idx@get*\tud@idx@key\tud@idx@fmt\tud@idx@val{#1}=#2=[#3](#4)% +} +% \end{macrocode} +% \end{macro}^^A \Process@ChangedAt +% \end{macro}^^A \if@tud@changedat +% \begin{macro}{\ChangedAt} +% \changes{v2.02}{2014/07/25}{erweitert}^^A +% \changes{v2.02}{2014/10/15}{Sternversion neu (keine Randnotiz)}^^A +% \begin{length}{\changedatskip} +% \changes{v2.04}{2015/06/08}{neu}^^A +% Der Befehl \cs{ChangedAt} kann im Fließtext für das Erstellen einer freien +% Änderungsnotiz genutzt werden. Das obligatorische Argument sollt wie kurz +% zuvor beschrieben verwendet werden. +% +% Eine Änderungsnotiz wird für die angegebene Versionsnummer normalerweise im +% Abschnitt \enquote{Allgemein} aufgeführt. Soll jedoch eine Notiz explizit für +% eine Option, eine Umgebung, einen Befehlt etc. erstellt werden, kann dieses +% Element vor dem obligatorischen im optionalen Argument angegeben werden. Der +% Eintrag erfolgt dann im Abschnitt \enquote{Implementierung} für das gegebene +% Element. Im obligatorischen Argument können auch mehrere Änderungsnotizen +% gleichzeitig erzeugt werden. hierfür sind diese mit Semikolon voneinander zu +% trennen. Das Erzeugen der Liste erfolgt mit \cs{Changed@At@CreateList}. +% +% Normalerweise wird bei der Nutzung von \cs{ChangedAt} zusätzlich zum Eintrag +% in die Änderungsliste eine Randnotiz mit den angegebenen Versionsnummern +% erzeugt. Mit dem letzten optionalen Argument nach dem obligatorischen kann +% ein vertikaler Versatz dieser angegeben werden. Die Sternversion des Befehls +% unterdrückt die Ausgabe der Randnotiz. % \begin{macrocode} -\NewDocumentCommand\printdeclarationlist{sod()}{% - \ifx\@declarationlist\relax\else% - \ifvmode\else\par\fi% - \addpenalty{\@beginparpenalty}% - \addvspace{1.5\baselineskipglue}% +\newlength\changedatskip +\NewDocumentCommand\ChangedAt{somO{\changedatskip}}{% + \IfValueTF{#2}{% + \Changed@At@CreateList[#2]{#3}% + }{% + \Changed@At@CreateList{#3}% + }% % \end{macrocode} -% Die Sternversion erzeugt die Ausgabe ohne Deklarationsindexbefehle. Das -% optionale Argument kann genutzt werden, um das standardmäßige Atrribut für -% die Änderungsliste, welches in \cs{@changedatdeclaredefault} hinterlegt ist, -% zu ändern. Dies ist für die normale Version auf \emph{neu} und für die -% Sternversion auf \emph{entfällt} voreingestellt. Für überholte Einträge in -% der Änderungsliste wird das Indexattribut \enquote{deprecated} angehängt. +% Nach dem Erstellen der Liste wird diese abgearbeitet und ggf. die Randnotiz +% ausgegeben. % \begin{macrocode} - \IfBooleanTF{#1}{% - \global\@deprecatedtrue% - \renewcommand*\@changedatdeclaredefault{\emph{entf\"allt}|deprecated}% + \print@changedatlist{#1}{#4}% +} +% \end{macrocode} +% \end{length}^^A \changedatskip +% \end{macro}^^A \ChangedAt +% +% \subsubsection{Sukzessive Erstellung der Einträge für die Änderungsliste} +% +% Das Erstellen von Änderungsnotizen erfolgt in zwei Schritten. Diese werden +% mit dem Befehl \cs{Changed@At@CreateList} in einer standardisierten Form in +% der temporären Liste \cs{tud@changedat@list} gespeichert und später mit dem +% Makro \cs{Changed@At@CreateEntry} verarbeitet. Dieses Vorgehen liegt in den +% Umgebungen für Deklarationen begründet, welche verschachtelt werden können, +% jedoch einmalig mit \cs{printdeclarationlist} abgearbeitet werden. +% +% \begin{macro}{\tud@changedat@list} +% \changes{v2.02}{2014/07/25}{neu}^^A +% \begin{macro}{\forssvlist} +% \changes{v2.05}{2015/11/17}{neu}^^A +% Hier werden die Liste \cs{tud@changedat@list} sowie das Makro \cs{forssvlist} +% für die Aufspaltung der semikolongetrennten Änderungsnotizen definiert. +% \begin{macrocode} +\newcommand*\tud@changedat@list{} +\let\tud@changedat@list\relax +\DeclareListParser*{\forssvlist}{;} +% \end{macrocode} +% \end{macro}^^A \forssvlist +% \end{macro}^^A \tud@changedat@list +% \begin{macro}{\Changed@At@CreateList} +% \changes{v2.02}{2014/09/02}{neu}^^A +% \begin{macro}{\Changed@At@@CreateList} +% \changes{v2.02}{2014/10/09}{neu}^^A +% \begin{macro}{\Changed@At@@@CreateList} +% \begin{macro}{\Changed@At@@@@CreateList} +% Mit diesen Befehlen wird eine Liste im Format von \pkg{etoolbox} erzeugt, +% welche alle notwendigen Angaben für das Erzeugen der Änderungshistorie in +% Form eines Indexes mit \cs{Changed@At@CreateEntry} enthält. +% +% Der Befehl \cs{Changed@At@CreateList} kann vor dem obligatorischen Argument +% mit einem ordinären optionalen Argument verwendet werden, in welchem ein +% Makro, eine Umgebung, eine Option etc. angegeben wird. Ist dies der Fall, so +% wird der Eintrag in die Änderungsliste für dieses Element generiert, sonst +% wird eine allgemeiner Eintrag erzeugt. Das optionale Argument in runden +% Klammern wird lediglich verwendet, wenn für eine der beiden Spezialumgebungen +% \env{Declaration*} bzw. \env{Bundle*} eine Änderungsnotiz erstellt wird, um +% diese für das jeweilige \TUDScript-Bundle-Element in den entsprechenden +% Abschnitt der Änderungsliste einzutragen. Das Hauptargument verarbeitet +% schließlich eine semikolongetrennte Liste und reicht jeden Bestandteil +% zusammen mit den beiden optionalen Argumenten an \cs{Changed@At@@CreateList} +% weiter. +% \begin{macrocode} +\NewDocumentCommand\Changed@At@CreateList{od()m}{% + \IfValueT{#3}{\forssvlist{\Changed@At@@CreateList[#1](#2)}{#3}}% +} +% \end{macrocode} +% Mit \cs{Changed@At@@CreateList} wird lediglich die Versionsnummer von der +% eigentlichen Änderungsnotiz getrennt. +% \begin{macrocode} +\NewDocumentCommand\Changed@At@@CreateList{r[]r()>{\SplitArgument{1}{:}}m}{% + \Changed@At@@@CreateList[#1](#2)#3% +} +% \end{macrocode} +% Zuletzt wird durch \cs{Changed@At@@@CreateList} ein möglicher Untereintrag +% in ein separates Argument abgetrennt und \cs{Changed@At@@@@CreateList} mit +% allen Argumenten aufgerufen. +% \begin{macrocode} +\NewDocumentCommand\Changed@At@@@CreateList{r[]r()>{\SplitArgument{1}{!}}mm}{% + \Changed@At@@@@CreateList[#1](#2)#3{#4}% +} +% \end{macrocode} +% Der Befehl \cs{Changed@At@@@@CreateList} übernimmt nun die Erstellung des +% Eintrags in die Liste \cs{tud@changedat@list}. Wie bereits erwähnt, enthalten +% die beiden ersten Argumente ggf. Markup-Befehl und \TUDScript-Bundle-Element. +% Danach folgt die Versionsnummer der Änderungsnotiz, der mögliche Untereintrag +% für einen Markup-Befehl sowie die Änderungsnotiz selbst. +% +% Die oberste Gliederungsebene der Änderungshistorie ist die Versionsnummer. +% Unter dieser werden für jedes \TUDScript-Bundle-Element die Änderungsnotizen +% separat ausgegeben, wobei diese nochmal in einen allgemeinen Teil und einen +% zur Implementierung getrennt werden. +% +% Der im Folgenden erzeugte Eintrag für die Liste \cs{tud@changedat@list} wird +% in zwei unterschiedlichen Varianten generiert. In der Form +% \newline\begingroup\scriptsize +% \val{\meta{Versionsnummer}!Allgemein!\meta{Änderungsnotiz}} +% \endgroup\newline +% werden allgemeine Änderungsnotizen erstellt, für Einträge bezüglich der +% Implementierung wird die folgende Form genutzt: +% \newline\begingroup\scriptsize +% \val{\meta{Versionsnummer}!Implementierung!\meta{Markup-Befehl}}\ignorespaces +% \val{!\meta{Untereintrag}!\meta{Änderungsnotiz}}. +% \endgroup +% \begin{macrocode} +\NewDocumentCommand\Changed@At@@@@CreateList{r[]r()mmm}{% +% \end{macrocode} +% Die Aufteilung der Änderungsliste in die einzelnen \TUDScript-Bundle-Elemente +% erfolgt entweder anhand des explizit angegebenen optionalen Argumentes in +% runden Klammern oder aber implizit über den gegenwärtigen Inhalt des Makros +% \cs{tud@bdl@curr}. Dafür wird das Makro \cs{@tempa} so definiert, dass es +% das angegebene Argument in einer Box ausführt und das gesuchte Bundle-Element +% in \cs{@tempb} gespeichert ist. +% \begin{macrocode} + \def\@tempa##1{% + \sbox\z@{% + \let\tud@idx@fmt\relax% + \@tud@changedattrue% + ##1% + \@tud@changedatfalse% + \ifx\tud@idx@fmt\relax% + \gdef\@tempb{##1}% + \else% + \global\let\@tempb\tud@idx@fmt% + \fi% + }% + }% + \let\@tempb\@empty% + \IfValueTF{#2}{% + \@tempa{#2}% + }{% + \tud@if@bdl{\@tempa{\tud@bdl@curr}}{}% + }% +% \end{macrocode} +% Nachdem klar ist, für welches Bundle-Element ggf. der Änderungslisteneintrag +% erzeugt werden soll, wird nun bestimmt, ob dieser im allgemeinen Teil oder in +% den zur Implementierung erscheinen soll. Dies wird an der Existenz des ersten +% Argumentes entschieden. Ist es vorhanden, handelt es sich um einen Eintrag +% für den Implementierungsteil, welcher in \cs{tud@changedat@list} in der Form +% \newline\begingroup\scriptsize +% \meta{Versionsnummer}\val{!Implementierung!}\meta{Markup-Befehl}\ignorespaces +% \val{!}\meta{Untereintrag}\val{!}\meta{Änderungsnotiz} gespeichert wird, +% \endgroup +% wobei der Untereintrag auch leer bleiben kann. +% \begin{macrocode} + \IfValueTF{#1}{% + \toks@{#3!Implementierung }% +% \end{macrocode} +% Hier erfolgt ggf. der Eintrag des \TUDScript-Bundle-Elements, danach folgt +% der Markup-Befehl. +% \begin{macrocode} + \eaddto@hook\toks@{\@tempb}% + \addto@hook\toks@{!#1!}% +% \end{macrocode} +% Wurde ein Untereintrag angegeben, wird dieser hier gefolgt von der +% eigentlichen Änderungsnotiz eingefügt. Für obsolete Deklarationen für die +% Änderungsnotiz in jedem Fall ignoriert, da beim späteren Aufruf des Makros +% \cs{Changed@At@CreateEntry} eine Standardmeldung ausgegeben wird. +% \begin{macrocode} + \IfValueT{#4}{\addto@hook\toks@{#4}}% + \addto@hook\toks@{!}% + \if@tud@obsolete\else% + \IfValueT{#5}{\addto@hook\toks@{#5}}% + \fi% + }{% +% \end{macrocode} +% Handelt es sich um einen allgemeinen Änderungseintrag, wird dieser in der Form +% \newline\begingroup\scriptsize +% \meta{Versionsnummer}\val{!Allgemein!}\meta{Änderungsnotiz}% +% \endgroup +% in der Liste \cs{tud@changedat@list} gespeichert. Für den allgemeinen Teil +% wird mit der Angabe eines \TUDScript-Bundle-Elements etwas anders verfahren. +% Wurde dieses~-- wenn auch nur indirekt über eine der beiden Spezialumgebungen +% \env{Declaration*} bzw. \env{Bundle*}~-- angegeben, so wird der Eintrag in +% den allgemeinen Hauptteil als Untereintrag erzeugt. Erfolgte die Verwendung +% jedoch innerhalb einer \TUDScript-Bundle-Deklaration, so erscheint der +% Eintrag im allgemeinen Teil für das explizite Bundle-Element. +% \begin{macrocode} + \toks@{#3!Allgemein }% + \IfValueTF{#2}{% + \addto@hook\toks@{!}% + \eaddto@hook\toks@{\@tempb:\space}% + \IfValueTF{#5}{% + \addto@hook\toks@{#5}% + }{% + \addto@hook\toks@{\emph{neu}}% + }% }{% - \global\@deprecatedfalse% + \eaddto@hook\toks@{\@tempb}% + \addto@hook\toks@{!}% + \addto@hook\toks@{#5}% + }% + \IfValueT{#4}{% + \ClassError{tudscrmanual}{Using !#4 isn't allowed for a change notice}{% + At least, it has to be implemented!% + }% }% + }% + \listeadd\tud@changedat@list{\the\toks@}% +} % \end{macrocode} -% Das optionale Argument kann verwendet werden, um allen Deklarationen die -% gleiche, nebenstehende Zusatzinformation mitzugeben, falls diese bis dahin -% komplett leer waren. -% \begin{macrocode} - \IfValueT{#2}{% - \if@additionallist% - \ClassWarning{tudscrman}{% - It is not possible to use the optional argument\MessageBreak% - of \string\printdeclarationlist due to the given\MessageBreak% - additional information as argument of the\MessageBreak% - environment `Declaration'% - }% - \else% +% \end{macro}^^A \Changed@At@@@@CreateList +% \end{macro}^^A \Changed@At@@@CreateList +% \end{macro}^^A \Changed@At@@CreateList +% \end{macro}^^A \Changed@At@CreateList +% +% \subsubsection{Ezeugen der Änderungseinträge} +% +% Mit diesen Makros erfolgt das eigentliche Eintragen der Änderungseinträge aus +% der Liste \cs{listqChangedAt} in den entsprechenden Index \val{changelog}. +% +% \begin{macro}{\Changed@At@CreateEntry} +% \changes{v2.02}{2014/09/02}{neu}^^A +% \begin{macro}{\Changed@At@@CreateEntry} +% \changes{v2.02}{2014/09/02}{neu}^^A +% Der Befehl \cs{Changed@At@CreateEntry} wird durch \cs{@printchangedatlist} +% aufgerufen und teilt die gegebene Liste am Delimiter Ausrufezeichen \val{!} +% in fünf Argumente auf und reicht sie an \cs{Changed@At@@CreateEntry} weiter. +% Sind weniger als vier Ausrufezeichen vorhanden, so werden die ungenutzten +% Argumente mit dem~-- durch das Paket \pkg{xparse} definierten~-- leeren Wert +% \val{-NoValue-} an den Befehl \cs{Changed@At@@CreateEntry} übergeben. +% \begin{macrocode} +\NewDocumentCommand\Changed@At@CreateEntry{>{\SplitArgument{4}{!}}m}{% + \Changed@At@@CreateEntry#1% +} +% \end{macrocode} +% Mit \cs{Changed@At@@CreateEntry} wird der Eintrag in die Änderungshistorie +% erzeugt, falls denn überhaupt ein Eintrag generiert werden soll. Dies wird +% daran erkannt, ob das dritte Argument dew Wert \val{-NoValue-} entspricht +% oder eben nicht. Der zweite Fall tritt auf, wenn lediglich eine Randnotiz +% gesetzt werden soll. Die in \cs{tud@changedat@list} gespeicherten Einträge +% haben die Form +% \newline\begingroup\scriptsize +% \val{\meta{Versionsnummer}!Allgemein!\meta{Änderungsnotiz}} +% \endgroup\newline +% oder +% \newline\begingroup\scriptsize +% \val{\meta{Versionsnummer}!Implementierung!\meta{Markup-Befehl}}\ignorespaces +% \val{!\meta{Untereintrag}!\meta{Änderungsnotiz}}. +% \endgroup +% \begin{macrocode} +\newcommand*\Changed@At@@CreateEntry[5]{% + \IfValueT{#3}{% +% \end{macrocode} +% Bei der Deklaration von Optionen, Befehlen etc. werden diese automatisch in +% der Liste der Änderungen im Bereich \enquote{Implementierung} vor der +% gegebenen Erklärung selbst ausgegeben. Hierfür wird die Existenz des vierten +% Arguments geprüft. Ist dieses vorhanden\dots +% \begin{macrocode} + \IfValueTF{#4}{% +% \end{macrocode} +% \dots befindet sich im dritten Argument der Markup-Befehl für den Eintrag im +% Implementierungsteil. Mit dem zwischenzeitlichen Aktivieren des Schalters +% \cs{if@tud@changedat} wird beim nachfolgenden Aufruf des Markup-Befehls das +% Makro \cs{Process@ChangedAt} ausgeführt und dadurch auch \cs{tud@idx@get*} +% aufgerufen, wodurch in den Makros \cs{tud@idx@key}, \cs{tud@idx@fmt} und +% \cs{tud@idx@val} die passend formatierten Indexeinträge enthalten sind. +% \begin{macrocode} + \@tud@changedattrue% + #3% + \@tud@changedatfalse% % \end{macrocode} -% Wurde das optionale Argument angegeben und die Zusatzliste war leer, so wird -% der Schalter \cs{@additionallisttrue} gesetzt. +% Das vierte Argument erstellt in der Änderungsliste einen Untereintrag für den +% im dritten Argument gegebenen Markup-Befehl. Dies wird für Anmerkungen zu +% expliziten Schlüssel-Wert-Paaren bei Optionen oder Parametern genutzt. % \begin{macrocode} - \@additionallisttrue% - \let\@additionallist\relax% - \protected@edef\@tempa{#2}% + \ifxblank{#4}{}{% % \end{macrocode} -% Die Standardformatierung der Zusatzinformationen. +% Hierfür wird die zuvor erhaltene Formatierung des Markup-Befehls des dritten +% Argumentes an den Haupteintrag \cs{tud@idx@val} mit der zusätzlichen +% Anmerkung \enquote{Werte angepasst} angehängt. % \begin{macrocode} - \protected@edef\@tempb{\hspace*{\tabcolsep}\protect\small}% - \def\@tempc##1{% - \listeadd\@additionallist{\expandonce\@tempb(\expandonce\@tempa)}% + \eappto\tud@idx@val{% + \expandonce\tud@idx@key: Werte angepasst@% + \expandonce\tud@idx@fmt: Werte angepasst!% }% - \forlistloop\@tempc{\@declarationlist}% - \fi% +% \end{macrocode} +% Anschließend werden die Formatierungsbefehle des vierten Arguments genutzt, +% wobei vom Befehl \cs{suffix} nur das Argument selbst benötigt wird. Um den +% Inhalt von \cs{tud@idx@val} zu schützen, erfolgt das ganze in einer Gruppe. +% \begin{macrocode} + \begingroup% + \@tud@changedattrue% + #4% + \@tud@changedatfalse% + \let\suffix\@gobble% + \protected@edef\tud@reserved{% + \noexpand\endgroup% + \def\noexpand\tud@idx@key{\tud@idx@key}% + \def\noexpand\tud@idx@fmt{\tud@idx@fmt}% + }% + \tud@reserved% + }% +% \end{macrocode} +% Nachdem die Formatierung der Haupt- und Untereinträge soweit zusammengebaut +% wurden, wird die eigentliche Änderungsnotiz des fünften Arguments angehangen. +% Dabei wird für den Fall, dass \emph{keine} Erklärung angegeben wurde, in der +% Änderungsliste vermerkt, ob es sich bei dem Markup-Befehl respektive dessen +% Untereintrag um eine \emph{neue} bzw. eine \emph{obsolete} Variante handelt. +% \begin{macrocode} + \ifxblank{#5}{% + \if@tud@obsolete% + \appto\tud@idx@fmt{: \emph{entf\"allt}}% + \else% + \appto\tud@idx@fmt{: \emph{neu}}% + \fi% +% \end{macrocode} +% Existiert ein Eintrag, wird dieser für Schlüssel und Format verwendet. +% \begin{macrocode} + }{% + \appto\tud@idx@key{: #5}% + \appto\tud@idx@fmt{: #5}% + }% +% \end{macrocode} +% Nachdem alles abgearbeitet wurde, wird der Indexeintrag erstellt. +% \begin{macrocode} + \index[changelog]{#1!#2!\tud@idx@val\tud@idx@key @\tud@idx@fmt}% +% \end{macrocode} +% Existiert das vierte Argument nicht, handelt es sich um einen allgemeinen +% Eintrag in der Änderungshistorie. Dieser wird direkt ausgeführt. +% \begin{macrocode} + }{% + \index[changelog]{#1!#2!#3}% }% - \@declaretrue\@openindextrue% - \@afterindentfalse\@afterheading% + }% % \end{macrocode} -% Die deklarierten Optionen, Umgebungen, Befehle etc. werden umrahmt. Dabe -% erfolgt die Ausgabe mithilfe einer Box, um die Größe des Deklarationsrahmens -% zu speichern und die Änderungsmarkierung am Seitenrand auf die richtige Höhe -% zu platzieren. Da innerhalb von Tabellen der Wert von \cs{baselineskip} auf -% \makeatletter\the\z@\makeatother~gesetzt wird, muss für einen richtig -% platzierten Link dieser in \cs{HyperRaiseLinkDefault} gesichert werden. +% Außerdem wird der Liste \cs{tud@templist} die aktuelle Version einmalig +% hinzugefügt, um alle Versionsangaben in einer Randnotiz ausgeben zu können. % \begin{macrocode} - \def\@tempa##1{\ignorespaces##1\tabularnewline}% - \edef\HyperRaiseLinkDefault{\the\baselineskip}% - \setbox0\hbox{% - \begin{tabular}{|l|}% - \hline% - \forlistloop\@tempa{\@declarationlist}% - \hline% - \end{tabular}% - }\usebox0% - \@declarefalse% -% \end{macrocode} -% Danach werden ggf. die Voreinstellungen und Zusatzinformationen gesetzt. -% \begin{macrocode} - \ifboolexpr{bool {@presetlist} or bool {@additionallist}}{% - \if@presetlist% - \qquad% - \texttt{% - \begin{tabular}{l@{}}% - \forlistloop\@tempa{\@presetlist}% - \end{tabular}% + \ifinlist{#1}{\tud@templist}{}{\listadd\tud@templist{#1}}% +} +% \end{macrocode} +% \end{macro}^^A \Changed@At@@CreateEntry +% \end{macro}^^A \Changed@At@CreateEntry +% +% \subsubsection{Ausgabe der Änderungsliste} +% +% Ähnlich wie für den Index wird auch für die Änderungsliste bei der Ausgabe +% verfahren. +% +% \begin{macro}{\PrintChangelog} +% Mit \cs{PrintChangelog} erfolgt die Ausgabe der Änderungsliste. Dabei ist zu +% beachten, dass die Einträge im Index bis zur vierten Ebene erfolgen. +% \begin{macrocode} +\newcommand*\PrintChangelog{% + \begingroup% +% \end{macrocode} +% Die oberste Ebene enthält die Versionsnummer mit dem Präfix \val{v}. Diese +% Ebene soll nicht als Indexeintrag selber sondern vielmehr als Überschrift der +% Ebene \cs{subsection} genutzt werden. Dafür wird zum einen das durch das +% Paket \pkg{imakeidx} definierte Makro \cs{lettergroup} \emph{unschädlich} +% gemacht, zum anderen wird der Befehl \cs{item} so umdefiniert, dass dieser +% alles bis zum nächsten Zeilenumbruch als Argument einliest. Alle darunter +% liegenden \cs{item}-Befehle werden eine Ebene nach oben gehoben. +% \begin{macrocode} + \let\lettergroup\@gobble% + \apptocmd{\theindex}{% + \let\subsubsubitem\subsubitem% + \let\subsubitem\subitem% + \let\subitem\item% + \renewcommand*\item{% + \begingroup% + \escapechar=`\\% + \catcode\endlinechar=\active% + \csname\string\item\endcsname% + }% + \begingroup% + \escapechar=`\\% + \lccode`\~=\endlinechar% + \lowercase{% + \expandafter\endgroup% + \expandafter\def\csname\string\item\endcsname##1~% + }{% + \endgroup% + \addsec[##1]{\TUDScript \NoCaseChange{##1}}% + \tudhyperdef*{idx:changelog:##1}% + \def\@tempa{\indexname: \TUDScript \NoCaseChange{##1}}% + \@mkboth{\@tempa}{\@tempa}% + }% + }{}{\tud@patch@wrn{theindex}}% +% \end{macrocode} +% Mit der so angepassten \env{theindex}-Umgebung erfolgt die Ausgabe der +% Änderungshistorie. +% \begin{macrocode} + \clearpage% + \def\imki@indexlevel{\addchap}% + \print@index[changelog]% + \endgroup% +} +% \end{macrocode} +% \end{macro}^^A \PrintChangelog +% \begin{macro}{\print@changedatlist} +% \changes{v2.02}{2014/10/09}{neu}^^A +% Die Einträge in der Liste der Änderungen \cs{tud@changedat@list} werden mit +% dem Makro \cs{Changed@At@CreateList} abgearbeitet, sortiert und erstellt. Das +% zweite obligatorische Argument von \cs{@printchangedatlist} steurrt den +% vertikalen Versatz der Randnotiz. Wird im ersten Argument das boolesche Flag +% zu \cs{BooleanTrue} gesetzt, wird die Randnotiz unterdrückt. +% \begin{macrocode} +\NewDocumentCommand\print@changedatlist{mm}{% + \ifx\tud@changedat@list\relax\else% + \let\tud@templist\relax% + \forlistloop\Changed@At@CreateEntry{\tud@changedat@list}% + \global\let\tud@changedat@list\relax% +% \end{macrocode} +% Nach der Verarbeitung der Einräge sind in \cs{tud@templist} alle angegebenen +% Versionsnummern genau einmal enthalten. Mit \cs{tud@list@sort} werden diese +% in die richtige Reihenfolge sortiert und anschließend als Randnotiz in einer +% Tabelle ausgegeben, falls nicht die Sternversion verwendet wurde. +% \begin{macrocode} + \IfBooleanF{#1}{% + \tud@list@sort\tud@templist% + \strut% + \marginnote{% + \def\@tempa####1{% + \ignorespaces% + \tudhyperref{idx:changelog:####1}{####1}% + \tabularnewline% }% - \fi% - \if@additionallist% - \begin{tabular}{@{}l@{}}% - \forlistloop\@tempa{\@additionallist}% + \begin{tabular}{|l|}% + \hline% + \forlistloop\@tempa{\tud@templist}% + \hline% \end{tabular}% + }[#2]% + \ignorespaces% + }% + \fi% +} +% \end{macrocode} +% \end{macro}^^A \print@changedatlist +% +% \subsection{Erläuterungen und weiterführende Ergänzungen im Handbuch} +% +% Es folgen einige Umgebungen, mit welchen bestimmte Aspekte oder Pakete im +% Handbuch erläutert werden. +% +% Das Paket \pkg{enumitem} erlaubt das Beeinflussen der Standardlisten und die +% Ableitung neuer Listen aus diesen. Mit \cs{setlist\{noitemsep\}} werden die +% zusätzlichen Zwischenräume innerhalb der Listen beseitigt. +% \begin{macrocode} +\RequirePackage{enumitem}[2011/09/28] +\setlist{noitemsep} +% \end{macrocode} +% Mit den Möglichkeiten des Paketes \pkg{enumitem} werden folgend Listen für +% das Aufführen von möglichen Werten einer Option sowie der Beschreibung von +% nützlichen Paketen erstellt. Für beide Lsiten soll dabei die originale +% Definition von \cs{item} in \cs{stditem} gesichert und anschließend angepasst +% werden. Die Sicherung und Redefinition von \cs{item} erfolgt dabei über das +% Makro \cs{tud@before@item} über einen bereitgestellten \emph{hook} zu Beginn +% der jeweiligen Liste. +% \begin{macro}{\stditem} +% \begin{macro}{\tud@before@item} +% \begin{macrocode} +\newcommand*\stditem{} +\newcommand*\tud@before@item[1]{% + \ifdefvoid{\stditem}{% + \let\stditem\item% + \letcs\item{tud@item@#1}% +% \end{macrocode} +% Damit Änderungsnotizen in der passenden vertikalen Position erscheinen, wird +% die Länge \cs{changedatskip} entsprechend angepasst. +% \begin{macrocode} + \setlength\changedatskip{-\baselineskip}% + }{}% +} +% \end{macrocode} +% \end{macro}^^A \tud@before@item +% \end{macro}^^A \stditem +% \begin{environment}{values} +% \begin{environment}{@values} +% \begin{macro}{\tud@values} +% Die Liste \env{@values} dient zum Benennen der möglichen Werte für einen +% bestimmten Schlüssel. Im Handbuch kommt diese Liste vor allem bei Optionen +% aber ggf. auch bei bestimmten Befehls- und Optionsparametern zum Einsatz. +% Diese wird in der Umgebung \env{values} eingebettet, damit zum einen ein +% \emph{obligatorisches} Argument verwendet werden kann und zum anderen +% \emph{nach} diesem ein optionales für die Liste selbst verwendbar ist. Das +% obligatorische Argument wird in \cs{tud@values} gesichert und sollte die +% genauer zu beschreibende Option bzw. das Makro etc. enthalten. +% \begin{macrocode} +\newcommand*\tud@values{} +\NewDocumentEnvironment{values}{mo}{% + \def\tud@values{#1}% + \IfValueTF{#2}{\@values[#2]}{\@values}% +}{% + \end@values% +} +\newlist{@values}{description}{1} +\setlist[@values]{% + topsep=\smallskipamount,labelwidth=\linewidth,labelsep=0pt,% + font=\normalfont,parsep=\parskip,listparindent=\parindent,% + before=\tud@before@item{values}% +} +% \end{macrocode} +% \end{macro}^^A \tud@values +% \end{environment}^^A @values +% \end{environment}^^A values +% \begin{macro}{\tud@item@values} +% \begin{macro}{\forslashlist} +% Das Makro \cs{tud@item@values} ersetzt in der Umgebung \env{values} die +% originale Definiton von \cs{item}. Die Sternversion kann dabei verwendet +% werden, um die Einstellung für den Säumniswert hervorzuheben. Im ersten +% optionalen Argument können die möglichen Werte einer Option oder eines +% Parameters angegeben werden. Sind mehrere Werte gleichbedeutende Werte +% verwendbar, so sind diese durch \val{/} zu trennen. Dabei wird der als +% erstes angegebene Wert für den Untereintrag in den Index verwendet. Das +% zweite optionale Argument kann genutzt werden, falls beispielsweise für +% unterschiedliche Klassen sich der Säumniswert unterscheidet. Das letzte +% optionale Argument in runden Klammern fügt zum Schluss einen ergänzenden +% Eintrag hinzu. +% \begin{macrocode} +\DeclareListParser*{\forslashlist}{/} +\NewDocumentCommand\tud@item@values{sood()}{% +% \end{macrocode} +% Alle Auszeichnungen kommen nur zum Tragen, wenn ein optionales Argument für +% die Werte angegeben wurde. +% \begin{macrocode} + \IfValueTF{#2}{% +% \end{macrocode} +% Die durch Schrägstrich getrennte Liste im optionalen Argument wird mit +% \cs{forslashlist} durchlaufen. Der erste Eintrag wird für den Indexeintrag +% benötigt und in \cs{@tempc} gesichert, alle weiteren Einträge werden in +% \cs{@tempb} gespeichert und lediglich im Fließtext aufgelistet. +% \begin{macrocode} + \let\@tempc\@empty% + \def\tud@reserved##1{% + \if@tempswa% + \appto\@tempb{/##1}% + \else% + \@tempswatrue% + \let\@tempb\@empty% + \def\@tempc{##1}% \fi% - }{}% + }% + \@tempswafalse% + \forslashlist\tud@reserved{#2}% +% \end{macrocode} +% Jetzt beginnt die Formatierung der Ausgabe. Zuerst wird die zu beschreibende +% Option in \cs{@tempa} expandiert. Danach wird der erste Wert angehangen, +% wobei dieser für die Sternversion als Säumniswert mit \cs{emph} hervorgehoben +% wird. Zuletzt wird dafür Sorge getragen, dass auf den anschließend erzeugten +% Eintrag selbst kein Hyperlink erzeugt wird und dieser im passenden Index als +% fettmarkierter Eintrag erscheint. +% \begin{macrocode} + \edef\@tempa{\expandonce\tud@values}% + \protected@eappto\@tempa{% + =\IfBooleanTF{#1}{\noexpand\emph}{\@firstofone}{\@tempc}=% + }% + \appto\@tempa{'none'|!|}% % \end{macrocode} -% Alle für die Deklaration verwendeten Listen werden nach ihrer Abarbeitung -% zurückgesetzt. +% Danach werden alle weiteren möglichen Werte angegeben, wobei auch diese im +% Zweifelsfall mit \cs{emph} hervorzuheben sind. % \begin{macrocode} - \global\let\@declarationlist\relax% - \global\let\@presetlist\relax% - \global\@presetlistfalse% - \global\let\@additionallist\relax% - \global\@additionallistfalse% + \edef\@tempb{% + \IfBooleanTF{#1}{\noexpand\emph}{\@firstofone}{% + \noexpand\PValue{\@tempb}% + }% + }% % \end{macrocode} -% Die Einträge in der Änderungsliste sowie die dazugehörige Randnotiz werden -% innerhalb der Deklaration mit \cs{printchangedatlist} erzeugt. Das optionale -% Argument sorgt für die Verschiebung der Randnotiz auf die richtige Höhe, um -% den Höhenversatz zwischen Randnotiz und Deklarationsrahmen auszugleichen. +% Zuletzt erfolgt die Auszeichnung, ob es sich bei den gelisteten Werten um +% Säumniswerte handelt, gefolgt vom optionael Suffix. % \begin{macrocode} - \printchangedatlist*[% - \dimexpr.5\ht\strutbox+.5\dp\strutbox-.5\ht0-.5\dp0\relax% - ]% + \IfBooleanTF{#1}{% + \appto\@tempb{\suffix{S\"aumniswert}}% + }{% + \IfValueT{#3}{\appto\@tempb{\suffix{S\"aumniswert f\"ur #3}}}% + }% + \IfValueT{#4}{\appto\@tempb{\suffix{#4}}}% % \end{macrocode} -% Zum Schluss wird das optionale Argument (in runden Klammern) neben der -% Deklarationsbox ausgegeben. +% Die in \cs{tud@values} gespeicherte, zu beschreibende Option bzw. Makro etc. +% und der erste im optionalen Argument angegebene Wert werden verwendet, um ein +% Label zu erstellen. % \begin{macrocode} - \IfValueT{#3}{#3}% - \par\nobreak% - \vskip 1.5\baselineskipglue% - \@afterindentfalse\@afterheading% - \fi% + \tud@lbl@get@curr*\tud@lbl@tmp{\tud@bdl@curr:\tud@values}=\@tempc=% +% \end{macrocode} +% Abschließend erfolgt wird die Ausgabe des generierten Eintrags mit dem +% originalen Makro \cs{stditem}. +% \begin{macrocode} + \stditem[\tudhyperdef{\tud@lbl@tmp}\@tempa\@tempb]% + }{% + \stditem% + }% } % \end{macrocode} -% \end{macro}^^A \@gobbleparameters -% \end{macro}^^A \if@additionallist -% \end{macro}^^A \@additionallist -% \end{macro}^^A \if@presetlist -% \end{macro}^^A \@presetlist -% \end{macro}^^A \@declarationlist -% \end{macro}^^A \printdeclarationlist -% \end{environment}^^A Declaration -% \begin{environment}{Declaration*} -% \changes{v2.02}{2014/10/09}{neu}^^A -% Die Sternversion der Umgebung \env{Declaration*} ist für die vereinfachte -% Deklaration von Klassen, Paketen etc. gedacht, bei denen keine Ausgabe -% sondern lediglich Hyperlink, Indexeintrag und Änderungsnotiz erzeugt werden -% sollen. Dabei sollte diese direkt nach einer Gliederungsüberschrift genutzt -% werden, in welcher das zu deklarierende ELement (Klasse, Paket etc.) genannt +% \end{macro}^^A \forslashlist +% \end{macro}^^A \tud@item@values +% \begin{macro}{\itemtrue} +% \begin{macro}{\itemfalse} +% \begin{macro}{\tud@item@bool} +% Die folgenden beiden Befehle sind äquivalent zu \cs{tud@item@values} genutzt +% werden. Diese enthalten allerdings im optionalen Argument zumindest die +% Standardwerte für positive bzw. negative boolesche Schalter. Diese werden +% durch den Befehl \cs{item@bool} gesetzt. +% \begin{macrocode} +\NewDocumentCommand\itemtrue{sood()}{\item@bool{#1}{true/on/yes}[#2][#3](#4)} +\NewDocumentCommand\itemfalse{sood()}{\item@bool{#1}{false/off/no}[#2][#3](#4)} +% \end{macrocode} +% Der Befehl \cs{item@bool} setzt je nach angegebenen Argumenten über ein +% token-Register den auszuführenden \cs{item}-Befehl zusammen. +% \begin{macrocode} +\NewDocumentCommand\item@bool{mmr[]r[]r()}{% + \toks@{\item}% + \IfBooleanT{#1}{\addto@hook\toks@{*}}% +% \end{macrocode} +% Die optionalen Werte werden im Zweifel den booleschen Standardwerten +% angehängt und als einziges optionales Argument an \cs{item} übergeben. +% \begin{macrocode} + \protected@edef\@tempa{#2\IfValueT{#3}{/#3}}% + \eaddto@hook\toks@{\expandafter[\@tempa]}% + \IfValueT{#4}{\addto@hook\toks@{[#4]}}% + \IfValueT{#5}{\addto@hook\toks@{(#5)}}% + \the\toks@% +} +% \end{macrocode} +% \end{macro}^^A \itemfalse +% \end{macro}^^A \itemtrue +% \end{macro}^^A \tud@item@bool +% \begin{environment}{packages} +% \begin{macro}{\tud@item@packages} +% \changes{v2.02}{2014/10/09}{optionales Argument für CTAN-Link}^^A +% \changes{v2.04}{2015/03/12}{optionales Argument für weitere Pakete}^^A +% Ähnlich wie für die Auflistung von Werten eines Schlüssels wird auch mit der +% Charakterisierung von Paketen verfahren. Diese werden in der Auflistung +% speziell gekennzeichnet. +% \begin{macrocode} +\newlist{packages}{description}{2} +\setlist[packages]{% + topsep=\smallskipamount,labelwidth=\linewidth,labelsep=0pt,% + font=\normalfont,parsep=\parskip,listparindent=\parindent,% + before=\tud@before@item{packages}% +} +% \end{macrocode} +% Hiermit können ein oder mehrere Pakete erläutert werden. Des Weiteren werden +% Textanker definiert, auf die im Zweifelsfall in der Dokumentation verlinkt % wird. % \begin{macrocode} -\NewDocumentEnvironment{Declaration*}{om}{% - \@changedatdeclare{#1}{#2}% - \@stareddeclaretrue% - \global\@deprecatedfalse% - \@declaretrue\@openindextrue#2\@declarefalse% - \@stareddeclarefalse% -}{% - \ifx\@changedatdeclarelist\relax\else% - \ClassError{tudscrman}{\string\printchangedatlist\space is missing}{% - \string\@changedatdeclarelist\space is not empty. Did you\MessageBreak% - forget to print this list with \string\printchangedatlist?% +\NewDocumentCommand\tud@item@packages{od<>d()}{% +% \end{macrocode} +% Die kommagetrennte Liste im optionalen Argument wird verwendet, um jedes +% einzelnen Paket aufzulisten und einen dazugehörigen Textanker zu erzeugen. +% Das optionale Argument in Guillemets kann genutzt werden, um \emph{alle} +% gelisteten Pakete auf den gleichen CTAN-Link zielen zu lassen. Dies ist +% beispielsweise für mehrere Pakete aus dem gleichen Bundle sinnvoll. +% \begin{macrocode} + \def\@tempa##1{% + \@tempc% + \tud@lbl@get@curr*\tud@lbl@tmp{\tud@bdl@curr:\Package{##1}}% + \tudhyperdef{\tud@lbl@tmp}% + \begingroup% + \Package{##1}<#2>'url'|!|% + \endgroup% + \def\@tempc{, }% + }% + \stditem[{% + \IfValueT{#1}{% + \let\@tempc\relax% + \forcsvlist\@tempa{#1}% +% \end{macrocode} +% Wird im dritten optionalen Argument in runden Klammern ein Paket angegeben, +% so wird ebenfalls ein Textanker erzeugt, allerdings auf einen Hyperlink zu +% CTAN verzichtet. +% \begin{macrocode} + \IfValueT{#3}{% + \tud@lbl@get@curr*\tud@lbl@tmp{\tud@bdl@curr:\Package{#3}}% + \quad(\tudhyperdef{\tud@lbl@tmp}\Package{#3}'none'|!|)% + }% }% - \fi% - \global\@deprecatedfalse% - \@gobbleparameters% - \@declaretrue\@openindexfalse#2\@declarefalse% + }]% } % \end{macrocode} -% \end{environment}^^A Declaration* +% \end{macro}^^A \tud@item@packages +% \end{environment}^^A packages % \begin{environment}{tabularm} -% \begin{macro}{\allcolumnpar} -% \begin{macro}{\@allcolumnpar} +% \begin{macro}{\tabularm@allcolumnpar} % \begin{macro}{\tabularm@box} % \begin{macro}{\tabularm@num} % \begin{length}{\tabularm@wd} -% Die Umgebung \env{tabularm} ist eine Erweiterung der \env{tabularm}-Umgebung. +% \begin{length}{\tempdim} +% \changes{v2.02}{2014/08/16}{neu}^^A +% Die Umgebung \env{tabularm} ist eine Erweiterung der \env{tabular}-Umgebung. % In dieser wird die Breite der zu setzenden Tabelle mit Hilfe der Box % \cs{tabularm@box} in \cs{tabularm@wd} gespeichert. Anschließend kann mit dem -% Befehl \cs{allcolumnpar} eine Zeile über alle Spalten der Tabelle -% ausgegeben werden. Dabei ist das zu übergebende Argument die Anzahl der zu -% erzeugenden, linksbündigen Spalten. +% Befehl \cs{allcolumnpar} eine Zeile über alle Spalten der Tabelle ausgegeben +% werden. Dabei ist das zu übergebende Argument die Anzahl der zu erzeugenden, +% linksbündigen Spalten. % \begin{macrocode} +\newlength\tempdim \newsavebox\tabularm@box \newlength\tabularm@wd \newcommand*\tabularm@num{1} @@ -2215,132 +4476,67 @@ \end{lrbox}% \setlength\tabularm@wd{\wd\tabularm@box}% \def\tabularm@num{#1}% - \let\allcolumnpar\@allcolumnpar% + \let\allcolumnpar\tabularm@allcolumnpar% \begin{tabular}{*{#1}l}\BODY\end{tabular}% } -\newcommand*\@allcolumnpar[1]{% +\newcommand*\tabularm@allcolumnpar[1]{% \multicolumn{\tabularm@num}{@{}p{\tabularm@wd}@{}}{#1}% } % \end{macrocode} +% \end{length}^^A \tempdim % \end{length}^^A \tabularm@wd % \end{macro}^^A \tabularm@box % \end{macro}^^A \tabularm@num -% \end{macro}^^A \@allcolumnpar -% \end{macro}^^A \allcolumnpar +% \end{macro}^^A \tabularm@allcolumnpar % \end{environment}^^A tabularm -% \begin{environment}{values} -% \begin{macro}{\before@values} -% \begin{macro}{\itemvalues} -% \begin{macro}{\itemtrue} -% \begin{macro}{\itemfalse} -% \begin{macro}{\tud@item@val} -% \begin{macro}{\tud@item@add} -% \begin{macro}{\tud@item@format} -% \begin{macro}{\tud@item} -% \begin{macro}{\tud@@item} -% \begin{macro}{\tud@@@item} -% Die Liste \env{values} dient zum Benennen der möglichen Werte für einen -% bestimmten Schlüssel. Im Handbuch kommt diese Liste vorallem bei Optionen -% aber auch bei bestimmten Befehls- und Optionsparametern zum Einsatz. -% \begin{macrocode} -\newlist{values}{description}{1} -\setlist[values]{% - topsep=.5\baselineskipglue,labelwidth=\columnwidth,labelsep=0pt,% - font=\normalfont\ttfamily,before*=\before@values% -} -% \end{macrocode} -% Zu Beginn der Umgebung wird die Definition des \cs{item}-Befehls gesichert -% und anschließend geändert. -% \begin{macrocode} -\newcommand*\itemvalues{} -\newcommand*\before@values{% - \ifdefvoid{\itemvalues}{% - \let\itemvalues\item% - \let\item\tud@item% - \setlength\changedatskip{-\baselineskip}% - }{}% -} -% \end{macrocode} -% Die folgenden beiden Befehle enthalten die Standardwerte für boolsche -% Schalter. +% Mit Hilfe von \pkg{tabularx} können Tabellen bestimmter Breite und +% automatisch berechneten Spaltenbreiten gesetzt werden. % \begin{macrocode} -\newcommand*\itemfalse{\def\tud@item@val{false/off/no}\item} -\newcommand*\itemtrue{\def\tud@item@val{true/on/yes}\item} +\RequirePackage{tabularx}[1999/01/07] % \end{macrocode} -% Mit der neuen Definition kann der Säumniswert mit \cs{item*} explizit in der -% Liste hervorgehoben werden. +% \begin{macro}{\TermTable} +% \begin{macro}{\Term@Table} +% \begin{macro}{\Term@@Table} +% Für sprachabhängige Bezeichner wird zusätzlich der Befehl \cs{TermTable} +% definiert, dem eine kommaseparierte Liste übergeben werden kann. Anhand +% dieser Liste werden die enthalten Begriffe für die Sprachen Deutsch und +% English in einer Tabelle ausgegeben. Die Sternversion dieses Befehls nutzt +% dafür die \env{tabularx}-Umgebung. Für diese kann ein zweites Argument +% angegeben werden, welches die gewünschte Breite der Tabelle angibt. % \begin{macrocode} -\newcommand*\tud@item@val{} -\newcommand*\tud@item@add{} -\newcommand*\tud@item@format{} -\newcommand*\tud@item{% - \@ifstar{% - \def\tud@item@add{(S\"aumniswert)}% - \let\tud@item@format\emph% - \tud@@item% +\NewDocumentCommand\TermTable{smg}{% + \let\tud@templist\relax% + \forcsvlist{\listadd\tud@templist}{#2}% + \ifhmode\par\fi% + \vskip\medskipamount% + \@afterindentfalse\@afterheading% + \IfBooleanTF{#1}{% + \IfValueTF{#3}{\setlength\@tempdima{#3}}{\setlength\@tempdima{\linewidth}}% + \setlength\@tempdimc{-.7\baselineskip}% + \begin{tabularx}{\@tempdima}{lXX}\Term@Table\end{tabularx}% }{% - \let\tud@item@add\relax% - \let\tud@item@format\relax% - \tud@@item% + \setlength\@tempdimc{\z@}% + \begin{tabular}{lll}\Term@Table\end{tabular}% }% + \par\addvspace{\medskipamount}% } -% \end{macrocode} -% In der zweiten Instanz wird das optionale Argument von \cs{item} ausgewertet. -% Dabei wird das Hilfsmakro \cs{tud@item@val} beachtet, welches evtl. mit den -% Befehlen \cs{itemtrue} oder \cs{itemfalse} gesetzt wurde und vor dem -% optionalen Argument aufgeführt wird. -% \begin{macrocode} -\newcommand*\tud@@item[1][]{% - \ifblank{#1}% - {\edef\@tempa{\tud@item@val}}% - {\ifstr{\tud@item@val}{}% - {\edef\@tempa{#1}}% - {\edef\@tempa{\tud@item@val/#1}}% - }% - \def\tud@item@val{}% -% \end{macrocode} -% Wurde weder \cs{tud@item@val} gesetzt noch ein Wert im optionalen Argument -% von \cs{item} angegeben, so wird der gesicherte Befehl ausgeführt. Ansonsten -% folgt die dritte Instanz. -% \begin{macrocode} - \ifstr{\@tempa}{}{\itemvalues}{\tud@@@item}% +\newcommand*\Term@Table{% + \toprule% + \textbf{Bezeichner} & \textbf{Deutsch} & \textbf{Englisch}\tabularnewline% + \midrule% + \forlistloop\Term@@Table{\tud@templist}% + \bottomrule% } -% \end{macrocode} -% Der gesicherte Befehl wird mit den aufbereiteten Formatierungen genutzt. -% \begin{macrocode} -\newcommand*\tud@@@item[1][]{% - \ifblank{#1}{}{% - \ifx\tud@item@add\relax% - \def\tud@item@add{#1}% - \else% - \appto\tud@item@add{~#1}% - \fi% - }% - \itemvalues[% - \tud@item@format{\@tempa:}% - \ifx\tud@item@add\relax\else% - {\normalfont\space\footnotesize\tud@item@add}% - \fi% - ]% +\newcommand*\Term@@Table[1]{% + \Term{#1} & % + \ifstr{\csuse{#1}}{}{\PName{leer}}{\csuse{#1}} & % + \selectlanguage{english}\vspace*{\@tempdimc}% + \ifstr{\csuse{#1}}{}{\PName{empty}}{\csuse{#1}}\tabularnewline% } % \end{macrocode} -% \end{macro}^^A \tud@@@item -% \end{macro}^^A \tud@@item -% \end{macro}^^A \tud@item -% \end{macro}^^A \tud@item@format -% \end{macro}^^A \tud@item@add -% \end{macro}^^A \tud@item@val -% \end{macro}^^A \itemfalse -% \end{macro}^^A \itemtrue -% \end{macro}^^A \itemvalues -% \end{macro}^^A \before@values -% \end{environment}^^A values -% -% \subsubsection{Erläuterungen und weiterführende Ergänzungen im Handbuch} -% -% Es folgen einige Umgebungen, mit welchen bestimmte Aspekte oder Pakete im -% Handbuch erläutert werden. -% +% \end{macro}^^A \Term@@Table +% \end{macro}^^A \Term@Table +% \end{macro}^^A \TermTable % \begin{environment}{Example} % \begin{environment}{Example*} % Diese Umgebung wird für die exemplarische Erläuterung von bestimmten Aspekten @@ -2349,26 +4545,97 @@ % unterdrückt dabei das Zurücksetzen des eigentlich entfernten vertikalen % Abstandes. % \begin{macrocode} -\newenvironment{Example}{\@nameuse{Example*}}{% - \@nameuse{endExample*}% +\newenvironment{Example}{\csuse{Example*}}{% + \csuse{endExample*}% \addvspace{-\topsep}% } \newenvironment{Example*}{% - \labeling{{\usekomafont{disposition}Beispiel:\ }}% - \item[{\usekomafont{disposition}Beispiel:\ }]% + \labeling{{\usekomafont{disposition}Beispiel:\nobreakspace}}% + \item[{\usekomafont{disposition}Beispiel:\nobreakspace}]% }{% \endlabeling% } % \end{macrocode} % \end{environment}^^A Example* % \end{environment}^^A Example +% +% \iffalse +%</class> +% \fi +% +% \subsection{Lesen und Schreiben von Hilfsdateien} +% +% Für den Anwender werden im \TUDScript-Bundle einige Tutorials für die Nutzung +% von \LaTeXe bereitgestellt. Innerhalb dieser werden Auszüge von Quelltexten +% verwendet und erläutert. Zum einen soll die Möglichkeit geschaffen werden, +% diese gesammelt am Ende eines Tutorials für ein Copy"~\&"~Paste"~Beispiel zu +% verwenden. Andererseits soll auch das sofortige Ausführen des beschriebenen +% Quelltextauszuges direkt im Tutorial möglich sein. Dafür werden im Folgenden +% die Umgebungen \env{Preamble}, \env{Trunk} und \env{Hint} sowie daraus +% abgeleitet Varianten definiert, womit sich die Angabe und Erläuterung der +% Quelltexte im Tutorial logisch strukturieren lässt und dennoch die notwendige +% Ordnung dieser für das Copy"~\&"~Paste"~Beispiel aufrechterhalen werden kann. +% Hierfür zeichnen die beiden Umgebungen \env{Preamble} und \env{Trunk} und +% deren Derivate verantwortlich. Die Umgebung \env{Hint} steht für zusätzliche +% Erläuterungen bereit, welche jedoch nicht in das Copy"~\&"~Paste"~Beispiel +% übernommen werden. +% +% \begin{macro}{\tud@write@a} +% \changes{v2.02}{2014/10/22}{neu}^^A +% \begin{macro}{\tud@write@b} +% \changes{v2.02}{2014/11/02}{neu}^^A +% \begin{macro}{\tud@read} +% \changes{v2.02}{2014/08/19}{neu}^^A +% Für die Erstellung der Indexe wird zum Sortieren das Programm \app{texindy} +% genutzt. Für dieses wird eine eigene Stildatei verwendet, welche zur Laufzeit +% erzeugt wofür zuerst ein Ausgabestream reserviert wird. +% \begin{macrocode} +\newcommand*\tud@write@a{} +\newwrite\tud@write@a +% \end{macrocode} +% Für die Tutorials werden später zusätzlich noch ein weiterer Ausgabe- sowie +% ein Eingabestream benötigt, die hier gleich mit initialisiert werden. +% \begin{macrocode} +%<*package> +\newcommand*\tud@write@b{} +\newwrite\tud@write@b +\newcommand*\tud@read{} +\newread\tud@read +%</package> +% \end{macrocode} +% \end{macro}^^A \tud@read +% \end{macro}^^A \tud@write@b +% \end{macro}^^A \tud@write@a +% +% \subsection{Einbinden von Quelltextauszügen} +% +% Sowohl im Handbuch als auch in den Tutorials werden Quelltextauszüge für das +% bessere Verständnis des Anwenders angegeben. Um diese darzustellen wird das +% Paket \pkg{listings} verwendet. +% \begin{macrocode} +\RequirePackage{listings}[2014/03/04] +\lstdefinestyle{tudscr}{% + basicstyle=\ttfamily\ifdef{\setstretch}{\setstretch{1}}{},% + keywordstyle=,% + columns=fullflexible,keepspaces,% + aboveskip=\smallskipamount,% + belowskip=\smallskipamount,% + language=[LaTeX]TeX,% + texcl,% +} +% \end{macrocode} +% +% \iffalse +%<*class> +% \fi +% % \begin{environment}{Code} % \begin{macro}{\tud@currentHref} % Folgend werden Befehle und Umgebungen für die Darstellung von Quelltexten im -% Handbuch definiert. Mit dieser Umgebung können kurze Quelltextbeispiele im -% Handbuch ausgegeben werden. Sicherlich sinnvoll ist, die \env{Code}-Umgebung -% innerhalb von \env{Example} oder \env{quoting} zu verwenden, um den -% Quelltext etwas abzuheben. +% Handbuch definiert. Mit dieser Umgebung können kurze Quelltextbeispiele +% ausgegeben werden. Sicherlich sinnvoll ist, die \env{Code}-Umgebung innerhalb +% von \env{Example} oder \env{quoting} zu verwenden, um den Quelltext etwas +% abzuheben. % \begin{macrocode} \lstnewenvironment{Code}[1][]{\lstset{style=tudscr,#1}}{} % \end{macrocode} @@ -2382,538 +4649,370 @@ % \end{macrocode} % \end{macro}^^A \tud@currentHref % \end{environment}^^A Code -% \begin{environment}{packages} -% \begin{macro}{\itempackages} -% \begin{macro}{\tud@item@pkg} -% \changes{v2.02}{2014/10/08}{\cs{DeclarePackage} entfernt}^^A -% \changes{v2.02}{2014/10/09}{optionales Argument für CTAN-Link}^^A -% \changes{v2.04}{2015/03/12}{optionales Argument für weitere Pakete}^^A -% \begin{macro}{\before@packages} -% Ähnlich wie für die Auflistung von Werten eines Schlüssels wird auch mit der -% Charakterisierung von Paketen verfahren. Diese werden in der Auflistung -% speziell gekennzeichnet. -% \begin{macrocode} -\newlist{packages}{description}{2} -\setlist[packages]{% - topsep=\medskipamount,labelwidth=\linewidth,labelsep=0pt,font=\normalfont,% - parsep=\parskip,listparindent=\parindent,before=\before@packages% -} -\newcommand*\itempackages{} -\newcommand*\before@packages{% - \ifdefvoid{\itempackages}{% - \let\itempackages\item% - \let\item\tud@item@pkg% - \setlength\changedatskip{-\baselineskip}% - }{}% -} -\NewDocumentCommand\tud@item@pkg{od()od''}{% - \itempackages[{% - \IfValueT{#1}{% - \manualhyperdef{files:#1}% - \IfValueTF{#2}{% - \def\@tempa{http://www.ctan.org/pkg/#2}% - }{% - \def\@tempa{http://www.ctan.org/pkg/#1}% - }% - \href{\@tempa}{\Package{#1}'none'|!|}% - \IfValueT{#3}{% - \quad(% - \let\@tempb\relax% - \@for\@tempa:=#3\do{% - \@tempb% - \manualhyperdef{files:\@tempa}% - \expandafter\Package\expandafter{\@tempa}'none'|!|% - \def\@tempb{, }% - }% - )% - }% - \IfValueT{#4}{% - \quad(% - \let\@tempb\relax% - \@for\@tempa:=#4\do{% - \@tempb% - \manualhyperdef{files:\@tempa}% - \href{http://www.ctan.org/pkg/\@tempa}{% - \expandafter\Package\expandafter{\@tempa}'none'|!|% - }% - \def\@tempb{, }% - }% - )% - }% - }% - }]% -} -% \end{macrocode} -% \end{macro}^^A \before@packages -% \end{macro}^^A \tud@item@pkg -% \end{macro}^^A \itempackages -% \end{environment}^^A packages % -% \subsubsection{Änderungsliste} +% \iffalse +%</class> +% \fi % -% Um dem Anwender einen schnellen Überblick zu Änderungen der aktuellen Verison -% bereitstellen zu können, werden Befehle zur automatisierten Erzeugung einer -% solchen Liste definiert. -% \ToDo{% -% Der Quelltext ist ein Grauen, das muss ich irgendwann einmal komplett -% überarbeiten. Insbesondere sollten die Argumente für die Änderungsliste -% wesentlich strukturierter eingefügt werden, bestenfalls mit zwei oder mehr -% unterschiedlichen Trennzeichen. -% }[?] +% \subsection{Kompilieren von externen Dateien und Querverweise auf diese} % -% \begin{macro}{\@changedatdeclare} -% \changes{v2.02}{2014/10/09}{neu}^^A -% \begin{macro}{\@changedatdeclaredefault} -% \changes{v2.02}{2014/10/09}{neu}^^A -% \begin{macro}{\@changedatdeclarelist} -% \changes{v2.02}{2014/07/25}{neu}^^A -% \begin{macro}{\ChangedAt@Split} -% \begin{macro}{\ChangedAt@@Split} -% Um für Änderungsnotizen die dazugehörige Option, Befehl etc. bei einer -% Deklaration kenntlich zu machen, wird das deklarierte Element zusammen mit -% der Notiz in einer Liste gespeichert. Da mehrere kommaseparierte Werte -% angegeben werden können, muss das optionale Argument der Umgebung -% \env{Declaration} dahingehend abgearbeitet werden. Wenn keine weitere -% Erklärung angegeben wurde, wird der entspredchende Eintrag mit dem Attribut -% versehen, welches in \cs{@changedatdeclaredefault} gespeichert ist. Dabei -% kann außerdem angegeben werden, ob es sich bei Änderung um eine Umbenennung -% von Option, Befehl etc. handelt. -% \begin{macrocode} -\newcommand*\@changedatdeclarelist{} -\let\@changedatdeclarelist\relax -\newcommand*\@changedatdeclaredefault{\emph{neu}} -\newcommand*\@changedatdeclare[2]{% - \IfValueT{#1}{% - \@for\@tempa:=#1\do{% - \ifx\@tempa\@empty\else% - \preto{\@tempa}{#2!}% - \expandafter\ChangedAt@Split\expandafter{\@tempa}% - \fi% - }% +% Das Paket \pkg{filemod} wird genutzt, um externer Dateien nur zu kompilieren, +% wenn dies aufgrund einer Änderung auch notwendig ist. +% \begin{macrocode} +\RequirePackage{filemod}[2011/09/19] +% \end{macrocode} +% Um die \cs{write18} sowohl für Windows als auch für unixoide Betriebssysteme +% nutzen zu können, wird das Paket \pkg{ifplatform} geladen. +% \begin{macrocode} +\RequirePackage{ifplatform}[2010/10/22] +% \end{macrocode} +% \begin{macro}{\tud@shellescape@wrn} +% \changes{v2.02}{2014/10/14}{neu}^^A +% Dieses Makro wird verwendet, wenn eine gesuchte Datei nicht gefunden wurde, +% weil das Dokument noch nicht mit der Option \opt{--shell-escape} kompiliert +% wurde. +% \begin{macrocode} +\newcommand*\tud@shellescape@wrn[1]{% +%<*class> + \ClassWarning{tudscrmanual}% +%</class> +%<*package> + \PackageWarning{tudscrtutorial}% +%</package> + {% + File `#1' is missing!\MessageBreak% + You have to recompile this document with\MessageBreak% + activated shell escape option% }% } % \end{macrocode} -% Die Änderungsnotiz für die Implementierung wird erst an den Ausrufezeichen -% in einzelne Argumente getrennt\dots +% \end{macro}^^A \tud@shellescape@wrn +% \begin{macro}{\Tutorial} +% \changes{v2.02}{2014/08/22}{neu}^^A +% \changes{v2.02}{2014/10/22}{Reimplementierung}^^A +% \begin{macro}{\hypertut} +% \changes{v2.02}{2014/09/02}{neu}^^A +% Die gegebenenfalls notwendige Kompilierung und die Referenzierung eines +% Tutorials aus dem Handbuch erfolgt mit \cs{Tutorial}. Außerdem erfolgt mit +% \cs{hypertut} ein verlinkter Eintrag in den Index. % \begin{macrocode} -\NewDocumentCommand\ChangedAt@Split{>{\SplitArgument{2}{!}}m}{% - \ChangedAt@@Split#1% +%<*class> +\newrobustcmd*\hypertut[2]{% + \hyperref{tutorials/#1.pdf}{#1}{tutorials:#1}{\File*{#1.pdf}#2}% } +\NewDocumentCommand\Tutorial{smd||}{% + \ifnum\pdfshellescape=\@ne\relax% % \end{macrocode} -% \dots und anschließend in die Liste \cs{@changedatdeclarelist}~-- in einer -% etwas kryptischen Form~-- eingetragen. Dies geschieht jedoch nur, wenn im -% Argument nicht die Sternversion eines Auszeichnungsbefehls genutzt wurde. -% Diese sollen keinen Eintrag in der Änderungsliste, wohl aber eine Randnotiz -% erzeugen. +% Um mit den verschachtelten Aufrufen von \app{pdflatex} umgehen zu können, +% wird das ganze Prozedere in ein Skript ausgelagert. Somit können die Aufrufe +% von \app{pdflatex} für die Tutorials aus dem entsprechenden Ordner und mit +% den notwendigen Optionen erfolgen. % \begin{macrocode} -\newcommand*\ChangedAt@@Split[3]{% - \in@{*}{#1}% - \ifin@% - \listadd\@changedatdeclarelist{Allgemein!#2}% - \else% - \listadd\@changedatdeclarelist{% - Implementierung!#2!\IfValueTF{#3}{#3}{\@changedatdeclaredefault}!#1% - }% - \fi% -} + \filemodCmp{tutorials/#2.pdf}{tutorials/#2.tex}{}{% + \let\@tempa\@empty% + \ifdef{\tudfinalflag}{\appto\@tempa{\def\noexpand\tudfinalflag{}}}{}% + \ifdef{\tudprintflag}{\appto\@tempa{\def\noexpand\tudprintflag{}}}{}% + \appto\@tempa{\noexpand\input{#2.tex}}% + \def\@tempb##1{% + \immediate\openout\tud@write@a=tutorials.sh\relax% + \immediate\write\tud@write@a{cd tutorials^^J##1}% + \immediate\closeout\tud@write@a% % \end{macrocode} -% \end{macro}^^A \ChangedAt@@Split -% \end{macro}^^A \ChangedAt@Split -% \end{macro}^^A \@changedatdeclarelist -% \end{macro}^^A \@changedatdeclaredefault -% \end{macro}^^A \@changedatdeclare -% \begin{macro}{\printchangedatlist} -% \changes{v2.02}{2014/10/09}{neu}^^A -% Die Einträge in der Änderungsliste sowie die dazugehörige Randnotiz werden -% mit dem Makro \cs{ChangedAt@Process} abgearbeitet, sortiert und erstellt. Bei -% \cs{printchangedatlist} wird mit dem optionalen Argument der Versatz für die -% Randnotiz gesetzt. Dieser wird wie auch die Liste an \cs{ChangedAt@Process} -% übergeben, womit diese und die Randnotiz letztendlich erzeugt werden. +% Hier erfolgt die Unterscheidung der Befehle für die unterschiedlichen OS. % \begin{macrocode} -\NewDocumentCommand\printchangedatlist{sO{\z@}}{% - \ifx\@changedatdeclarelist\relax\else% - \if@deprecated% - \ChangedAt@Process[#1]{#2}{\@changedatdeclarelist}% - \else% - \ChangedAt@Process{#2}{\@changedatdeclarelist}% - \fi% - \global\let\@changedatdeclarelist\relax% - \IfBooleanF{#1}{% - \par\nobreak\vskip\dimexpr-\parskip-\baselineskip\relax% - \@afterindentfalse\@afterheading% + \ifwindows% + \immediate\write18{rename tutorials.sh tutorials.bat}% + \immediate\write18{tutorials.bat}% + \immediate\write18{del tutorials.bat}% + \else% + \immediate\write18{bash tutorials.sh}% + \immediate\write18{rm tutorials.sh}% + \fi% + }% + \@tempb{pdflatex -shell-escape "\@tempa"}% + \IfFileExists{tutorials/#2.bcf}{\@tempb{biber #2}}{}% + \@tempb{% + pdflatex "\@tempa"^^J% + pdflatex -shell-escape "\@tempa"^^J% + pdflatex -shell-escape "\@tempa"% + }% }% \fi% -} % \end{macrocode} -% \end{macro}^^A \printchangedatlist -% \begin{macro}{\ChangedAt} -% \changes{v2.02}{2014/07/25}{erweitert}^^A -% \changes{v2.02}{2014/10/15}{Sternversion neu (keine Randnotiz)}^^A -% \begin{length}{\changedatskip} -% \changes{v2.04}{2015/06/08}{neu}^^A -% An den Befehl \cs{ChangedAt} kann eine kommagetrente Liste mit verschiedenen -% Versionsnummern und dazugehörigen Änderungen übergeben werden. Er wird in der -% Form: \cs{ChangedAt}\verb|{|\meta{Version}\verb|!|\meta{Beschreibung}\verb|}| -% genutzt. Mit \cs{ChangedAt@Process} wird der Prozess selbst durchgeführt. Es -% wird zu der angegebenen Versionsnummer ein Eintrag in die Änderungsliste -% erstellt, wenn mit einem Ausrufezeichen getrennt der gewünschte Inhalt -% gegeben wurde. -% -% Alle übergegebenen Versionsnummern werden als Liste mit einmaligen Einträgen -% in einer Randnotiz gesetzt. Mit dem optionalen Argument kann ein vertikaler -% dieser angegeben werden. Die Version mit einem Apostroph verschiebt die -% Randnotiz um den Grundlinienabstand nach oben, die Sternversion unterdrückt -% stattdessen die Ausgabe dieser vollständig. +% Hyperlink und Indexeintrag. % \begin{macrocode} -\newlength\changedatskip -\NewDocumentCommand\ChangedAt{sO{\changedatskip}mO{Allgemein}}{% - \ChangedAt@Process[#1]{#2}[#4]{#3}% -} -% \end{macrocode} -% \end{length}^^A \changedatskip -% \end{macro}^^A \ChangedAt -% \begin{macro}{\ChangedAt@Process} -% \changes{v2.02}{2014/09/02}{neu}^^A -% \begin{macro}{\ChangedAt@@Process} -% \changes{v2.02}{2014/09/02}{neu}^^A -% \begin{macro}{\ChangedAt@@@Process} -% \changes{v2.02}{2014/09/02}{neu}^^A -% \changes{v2.02}{2014/10/16}{Unterteilung Änderungsliste in Bereiche}^^A -% \begin{macro}{\ChangedAt@Default} -% \changes{v2.02}{2014/09/02}{neu}^^A -% \begin{macro}{\ChangedAt@Process@Split} -% \changes{v2.02}{2014/09/02}{neu}^^A -% \begin{macro}{\@changedatlist} -% \changes{v2.02}{2014/09/02}{neu}^^A -% \begin{macro}{\@changedatversionlist} -% \changes{v2.02}{2014/09/02}{neu}^^A -% Mit diesen Befehlen wird die Änderungshistorie in Form eines Index erstellt. -% Der Befehl \cs{ChangedAt@Process} setzt eine kommagetrennte Liste in eine -% im Format von \pkg{etoolbox} um. Anschließend wird diese für die -% Änderungsliste mit \cs{ChangedAt@Process@Split} aufgespalten. Die einzelnen -% Einträge werden mit \cs{ChangedAt@@Process} weiter verarbeitet. -% \begin{macrocode} -\newcommand*\@changedatlist{} -\newcommand*\ChangedAt@Default{} -\newcommand*\@changedatversionlist{} -\let\@changedatversionlist\relax -\NewDocumentCommand\ChangedAt@Process{omom}{% - \let\@changedatlist\relax% - \let\@changedatversionlist\relax% - \@for\@tempa:=#4\do{% - \ifx\@tempa\@empty\else% - \IfValueT{#3}{\preto\@tempa{#3!}}% - \listeadd{\@changedatlist}{\expandonce\@tempa}% - \fi% + \IfFileExists{tutorials/#2.pdf}{% + \hypertut{#2}{}% + }{% + \File*{#2.pdf}% + \tud@shellescape@wrn{tutorials/#2.pdf}% }% - \forlistloop\ChangedAt@Process@Split{\@changedatlist}% -% \end{macrocode} -% Nach der Verarbeitung aller Einräge sind in \cs{@changedatversionlist} alle -% angegebenen Versionsnummern genau einmal enthalten. Mit \cs{sortlist} werden -% diese in die richtige Reihenfolge sortiert und anschließend als Randnotiz in -% einer Tabelle ausgegeben, falls nicht die Sternversion verwendet wurde. -% \begin{macrocode} \IfBooleanF{#1}{% - \sortlist{\@changedatversionlist}% - \strut% - \marginnote{% - \def\@tempa####1{% - \ignorespaces\manualhyperref{####1}{####1}\tabularnewline% - }% - \begin{tabular}{|l|}% - \hline% - \forlistloop\@tempa{\@changedatversionlist}% - \hline% - \end{tabular}% - }[#2]% - \ignorespaces% + \index[files]{\hypertut{#2}{\suffix{Tutorial}}\IfValueT{#3}{|#3}}% }% } +%</class> % \end{macrocode} -% Der Befehl \cs{ChangedAt@Process@Split} teilt ein gegebenes Argument am -% Delimiter Ausrufezeichen (\enquote{!}) in drei Argumente auf und reicht diese -% an \cs{ChangedAt@@Process} weiter. Sollte kein oder nur Ausrufezeichen -% gefunden werden, so wird das zweite und/oder dritte Argument mit dem~-- vom -% Paket \pkg{xparse} definierten~-- leeren Wert \texttt{-NoValue-} an den -% Befehl \cs{ChangedAt@@Process} übergeben. +% Der Befehl für die Querverweise innerhalb von Tutorials. % \begin{macrocode} -\NewDocumentCommand\ChangedAt@Process@Split{>{\SplitArgument{3}{!}}m}{% - \ChangedAt@@Process#1% -} +%<*package> +\newcommand*\Tutorial[1]{\href{#1.pdf}{\textsbn{#1.pdf}}} +%</package> % \end{macrocode} -% Hiermit wird der Eintrag in die Änderungshistorie erzeugt. Dabei ist zu -% unterscheiden, ob der Befehl \cs{ChangedAt} direkt genutzt wurde oder aber -% der Eintrag innerhalb der \env{Declaration}-Umgebung erfolgte. Dies wird -% anhand des dritten Argumentes erkannt. Für den ersten Fall erfolgt ein -% Eintrag lediglich, wenn neben der Versionsnummer selbst auch eine Erklärung -% angegben wurde~-- eine Randnotiz wird aber in jedem Fall gesetzt. Im zweiten -% Fall wird der Erklärung \emph{immer} \cs{ChangedAt@Default} vorangestellt. -% Sollte keine Erklärung direkt angegeben worden sein, so wird in der -% Änderungsliste vermerkt, dass es sich um eine \emph{neue} Option, Befehl etc. -% handelt. Der eigentliche Eintrag selbst erfolgt mit \cs{ChangedAt@@@Process}. +% \end{macro}^^A \hypertut +% \end{macro}^^A \Tutorial +% \begin{macro}{\IncludeExample} +% \changes{v2.02}{2014/07/25}{Skalierung der eingefügten Seiten}^^A +% Mit diesem Befehl wird eine \LaTeX-Datei ggf. übersetzt und anschließend als +% PDF"~Datei wieder eingebunden. Zuvor wird der dazugehörige Quelltext mittels +% \cs{lstinputlisting} im Dokument ausgegeben. Dieser Befehl wird lediglich für +% die Klasse \cls{tudscrmanual} benötigt. % \begin{macrocode} -\newcommand*\ChangedAt@@Process[4]{% - \IfValueTF{#4}{% +%<*class> +\newcommand*\IncludeExample[1]{% + \lstinputlisting[style=tudscr]{examples/#1}% % \end{macrocode} -% Bei der Deklaration von Optionen, Befehlen etc. werden diese automatisch in -% der Liste der Änderungen im Bereich \enquote{Implementierung} vor der -% gegebenen Erklärung selbst ausgegeben. Hierfür wird das dritte Argument -% genutzt. Damit lediglich diese und nicht noch die dazugehörigen Argumente -% eingetragen werden, werden die relevanten Befehle deaktiviert und das -% optionale Argument in \cs{ChangedAt@Default} expandiert. +% Die Beispiele werden nur erneut kompiliert, wenn sich diese geändert haben +% oder noch gar kein entsprechendes PDF"~Dokument existiert. % \begin{macrocode} - \begingroup% - \@gobbleparameters% - \xdef\ChangedAt@Default{#4}% - \endgroup% - \ChangedAt@@@Process{#2}{#1}{\ChangedAt@Default: #3}% - }{% + \ifnum\pdfshellescape=\@ne\relax% + \filemodCmp{examples/#1.pdf}{examples/#1.tex}{}{% + \immediate\write18{% + pdflatex -output-directory examples examples/#1.tex^^J% + pdflatex -output-directory examples examples/#1.tex% + }% + }% + \fi% % \end{macrocode} -% Wurde \cs{ChangedAt} direkt und nicht über das optionale Argument der -% Umgebungen \env{Declaration} genutzt, erscheint der gewünschte Eintrag im -% Bereich \enquote{Allgemein}. +% Ist die gesuchte Datei vorhanden, wird diese auch eingebunden. Andernfalls +% wird eine Warnung mit dem Hinweis auf die notwendige Verwednung von +% \val{pdflatex} mit der Option \opt{--shell-escape} erzeugt. % \begin{macrocode} - \IfValueT{#3}{\ChangedAt@@@Process{#2}{#1}{#3}}% + \IfFileExists{examples/#1.pdf}{% + \includepdf[% + pages=-,noautoscale,frame,keepaspectratio,pagecommand={},% + height=\textheight,width=\textwidth, offset=5mm 0mm% + ]{examples/#1.pdf}% + }{% + \tud@shellescape@wrn{examples/#1.pdf}% }% -% \end{macrocode} -% Außerdem wird der Liste \cs{changedatversionlist} die aktuelle Version -% einmalig hinzugefügt, um alle in einer Randnotiz ausgeben zu können. -% \begin{macrocode} - \xifinlist{#2}{\@changedatversionlist}{}{\listeadd\@changedatversionlist{#2}}% } +%</class> % \end{macrocode} -% Mit \cs{ChangedAt@@@Process} Erfolgen die Einträge in die Änderungsliste. +% \end{macro}^^A \IncludeExample +% +% \iffalse +%<*package> +% \fi +% +% \begin{macro}{\tud@tut@temp} +% \changes{v2.05}{2016/05/01}{neu}^^A +% \begin{macro}{\tud@tut@readtostream} +% \changes{v2.02}{2014/12/16}{neu}^^A +% \begin{macro}{\tud@tut@append} +% \changes{v2.02}{2014/08/19}{neu}^^A +% Bei den Tutorials soll zum Schluss ein komplett kompilierbares Beispiel für +% Copy~\&~Paste gegeben werden. Um dieses zusammenzubauen, werden alle im +% Dokument innerhalb der Varianten der \env{Trunk}-Umgebungen gegebenen +% Codefragmente zusammengesetzt. Um die Quelltexte einlesen und verarbeiten zu +% können, werden zwei Eingabe- sowie ein Ausgabestream benötigt, welche bereits +% zuvor initialisiert wurden. +% +% Mit \cs{tud@tut@readtostream} wird der Inhalt der Datei im ersten Argument +% in den Ausgabestream des zweiten Argumentes geschrieben. Dies wird durch +% \cs{tud@tut@append} genutzt. % \begin{macrocode} -\newcommand*\ChangedAt@@@Process[3]{% +\newcommand*\tud@tut@temp{} +\edef\tud@tut@temp{\@currname-temp} +\newcommand*\tud@tut@readtostream[2]{% \begingroup% + \endlinechar=-1\relax% + \openin\tud@read=#1% % \end{macrocode} -% Für geänderte Parameter wird als Haupteintrag das dazugehörige Makro bzw. die -% entsprechende Umgebung verwendet. Der geänderte Parameter folgt danach. -% Zuerst muss ggf. das Makro \cs{ChangedAt@Default} expandiert werden. -% \begin{macrocode} - \def\@tempa{#3}% - \in@{\ChangedAt@Default}{#3}% - \ifin@% - \expandafter\def\expandafter\@tempa\expandafter{\ChangedAt@Default}% - \fi% -% \end{macrocode} -% Danach wird geprüft, ob das Makro \cs{Key} übergeben wurde. Außerdem wird ein -% Anker in der Änderungsliste für die Referenzierung auf die einzelnen Bereiche -% (\enquote{Allgemein}, \enquote{Implementierung} und \enquote{Ersetzungen}) -% gesetzt. -% \begin{macrocode} - \expandafter\in@\expandafter\Key\expandafter{\@tempa}% - \ifin@% - \begingroup% - \RenewDocumentCommand\Key{sommo}{\xdef\@TempKey{##3:}}% - \setbox0\hbox{#3}% - \endgroup% - \index[changelog]{% - #1\manualhyperdef*{#1}!\manualhyperdef*{#1:#2}#2!\@TempKey\ #3% - }% - \else% - \index[changelog]{% - #1\manualhyperdef*{#1}!\manualhyperdef*{#1:#2}#2!#3% - }% - \fi% - \endgroup% -} -% \end{macrocode} -% \end{macro}^^A \@changedatversionlist -% \end{macro}^^A \@changedatlist -% \end{macro}^^A \ChangedAt@Process@Split -% \end{macro}^^A \ChangedAt@Default -% \end{macro}^^A \ChangedAt@@@Process -% \end{macro}^^A \ChangedAt@@Process -% \end{macro}^^A \ChangedAt@Process -% \begin{macro}{\Replace} -% \changes{v2.02}{2014/07/25}{neu}^^A -% \changes{v2.03}{2015/02/02}{auf mehrere Einträge erweitert}^^A -% Der Befehl \cs{Replace} erzeugt einen Eintrag in der Änderungshistorie sowie -% einen Eintrag im gewünschten Index mit einem Verweis auf den neuen Befehl. +% Der Schalter \cs{if@tempswa} wird verwendet, um unnötige Leerzeilen in der +% Ausgabedatei zu entfernen. Wurde eine nicht leere Zeile gefunden, wird diese +% auf jeden Fall geschrieben, indem \cs{@tempswatrue} gesetzt wird. Eine leere +% Zeile wird~-- bis auf den Sonderfall, dass es sich um die letzte Zeile in der +% Datei handelt~-- zunächst nicht weiter beachtet. Im Zweifelsfall wird diese +% (erste) Leerzeile geschrieben. % \begin{macrocode} -\NewDocumentCommand\Replace{ommm}{% + \@tempswafalse% + \loop\unless\ifeof\tud@read% + \readline\tud@read to\tud@reserved% + \ifx\tud@reserved\@empty% + \ifeof\tud@read\@tempswafalse\fi% + \else% + \@tempswatrue% + \fi% % \end{macrocode} -% Die alten Befehle in der Liste erhalten einen Eintrag in der Änderungsnotiz. -% Das Komma vor dem Argument in der Schleife ist notwendig, weil ansonsten das -% Argument sofort expandiert wird. +% Hier erfolgt das eigentliche Schreiben im selektierten Stream. % \begin{macrocode} - \@for\@tempa:={,#4}\do{% - \ifx\@tempa\@empty\else% - \protected@edef\@tempb{% - Implementierung!#2!\emph{entf\"allt}|see{#3}!\@tempa% - }% - \expandafter\listadd\expandafter\@changedatdeclarelist\expandafter{% - \@tempb% - }% + \if@tempswa% + \immediate\write#2{\expandonce\tud@reserved}% + \fi% % \end{macrocode} -% Und ggf. der Eintrag im Index. +% Im Nachgang wird überprüft, ob die aktuell geschriebene Zeile leer war. Ist +% dies der Fall, so wird \cs{@tempswafalse} gesetzt, um eine etwaig folgende +% Leerzeile nicht in die Ausgabedatei zu schrieben. % \begin{macrocode} - \IfValueT{#1}{\index[#1]{\@tempa|see{#3}}}% - \fi% - }% + \ifx\tud@reserved\@empty\@tempswafalse\fi% + \repeat% + \closein\tud@read% + \endgroup% } % \end{macrocode} -% \end{macro}^^A \Replace -% \begin{macro}{\@ProcessChangedAt} -% \changes{v2.02}{2014/07/25}{erweitert}^^A -% \changes{v2.02}{2014/10/08}{Sternversion ergänzt}^^A -% Die Änderungsliste erhält ebenfalls einen Hyperlink zur Deklaration. Für -% Umgebungs- und Befehlsparameter wird mit dem zweiten optionalen Argument ein -% Untereintrag für die dazugehörige Umgebung beziehungsweise den dazugehörigen -% Befehl erzeugt. +% Der innerhalb der Umgebungen \env{Preamble} und \env{Trunk}~-- sowie deren +% Derivaten~-- angegeben Inhalt wird beim Beenden dieser in die Hilfsdatei +% \cs{tud@tut@temp.tex} zwischengespeichert. Mit dem Befehl \cs{tud@tut@append} +% wird der Inhalt dieser Datei ausgelesen und den zusätzlichen Hilfsdateien +% \cs{tud@tut@temp-preamble.tex} beziehungsweise \cs{tud@tut@temp-trunk.tex} +% angehangen und damit gesichert, um Quelltextauszüge aus dem Tutorial für die +% Präambel sowie den Dokumentteil trennen beziehungsweise sortieren zu können. % \begin{macrocode} -\NewDocumentCommand\@ProcessChangedAt{mmd()mmm}{% - \begingroup% - \let\texttt\@firstofone% - \let\textsbn\@firstofone% - \let\textsbs\@firstofone% - \let\Environment\@firstofone% - \let\Macro\@firstofone% - \IfValueTF{#3}{\xdef\@tempa{#2:#3:#5}}{\xdef\@tempa{#2:#5}}% - \endgroup% - \IfBooleanTF{#1}{% - \def\@tempb{\begingroup#4#5\endgroup}% +\newcommand*\tud@tut@append[1]{% + \ifstr{#1}{preamble}{% + \tud@tut@readtostream{\tud@tut@temp.tex}{\tud@write@a}% }{% - \def\@tempb{\begingroup#4#5\endgroup~{\idxfont(#6)}}% + \ifstr{#1}{trunk}{% + \tud@tut@readtostream{\tud@tut@temp.tex}{\tud@write@b}% + }{% + \tud@tut@readtostream{\tud@tut@temp.tex}{#1}% + }% }% - \ifcsdef{r@\@tempa}{\hyperidx[\@tempa]{\@tempb}}{\@tempb}% } % \end{macrocode} -% \end{macro}^^A \@ProcessChangedAt -% \begin{macro}{\sortlist} -% \changes{v2.02}{2014/07/25}{neu}^^A -% \begin{macro}{\@sortlist} -% \changes{v2.02}{2014/07/25}{neu}^^A -% \begin{macro}{\@sortedlist} -% \changes{v2.02}{2014/07/25}{neu}^^A -% \begin{macro}{\if@listsorted} -% \changes{v2.02}{2014/07/25}{neu}^^A -% Der Befehl \cs{sortlist} erwartet eine \pkg{etoolbox}-Liste und sortiert diese -% mit \cs{@sortlist} in alphabetischer Reihenfolge in eine kommagetrennte -% Auflistung. Diese wird anschließend wieder in eine \pkg{etoolbox}-Liste -% umgewandelt. +% \end{macro}^^A \tud@tut@append +% \end{macro}^^A \tud@tut@readtostream +% \end{macro}^^A \tud@tut@temp +% \begin{macro}{\StartTutorial} +% \changes{v2.02}{2014/08/21}{neu}^^A +% \begin{macro}{\FinishTutorial} +% \changes{v2.02}{2014/08/21}{neu}^^A +% Mit \cs{StartTutorial} wird ein Hyperlink für den Querverweis aus dem +% Handbuch definiert. Außerdem wird gleich der Titel und ein einleitender Satz +% gesetzt. % \begin{macrocode} -\newif\if@listsorted -\newcommand*\@sortedlist{} -\newcommand*\sortlist[1]{% - \let\@sortedlist\relax% - \forlistloop\@sortlist{#1}% - \let#1\relax% - \@for\@tempa:=\@sortedlist\do{\listeadd{#1}{\@tempa}}% +\TUDoptions{headingsvskip=-10ex} +\newcommand\StartTutorial[1][% + Bevor das eigentliche Tutorial beginnt, werden sowohl eine Dokumentklasse + als auch die f\"ur jedes \hologo{pdfLaTeX}-Dokument meiner Meinung nach + sinnvollen Pakete geladen.% +]{% + \Hy@raisedlink{\hyperdef{\jobname}{tutorials:\jobname}{}}% + \faculty{}% + \maketitle\noindent#1% + \immediate\openout\tud@write@a=\tud@tut@temp-preamble.tex\relax% + \immediate\openout\tud@write@b=\tud@tut@temp-trunk.tex\relax% + \immediate\write\tud@write@b{^^J\string\begin{document}^^J} } % \end{macrocode} -% Hier erfolgt die eigentliche Sortierung der Liste. -% \begin{macrocode} -\newcommand*\@sortlist[1]{% -% \end{macrocode} -% Der erste Eintrag wird direkt der Liste hinzugefügt. -% \begin{macrocode} - \ifx\@sortedlist\relax% - \def\@sortedlist{#1}% -% \end{macrocode} -% Weitere Einräge werden mit \cs{pdfstrcmp} an der richtigen Stelle eingefügt. -% Dabei wird die kommagetrennte Liste \cs{@sortedlist} mit \cs{@for} durchlaufen -% und \cs{@tempb} als Hilfsmakro verwendet, in welches die aktuelle Liste -% innerhalb der \cs{@for}-Schelife stückweise expandiert wird. Der Schalter -% \cs{if@listsorted} wird gesetzt, wenn das aktuelle Element an der richtigen -% Stelle eingesetzt wurde. -% \begin{macrocode} - \else% - \@listsortedfalse% - \let\@tempb\@empty% - \@for\@tempa:=\@sortedlist\do{% -% \end{macrocode} -% Ist der Eintrag bereits erfolgt, wird der verbliebene Teil der Liste -% angehängt. +% Der Befehl \cs{FinishTutorial} schleißt den noch offenen Ausgabestream und +% gibt den vorgestellten Quelltext vollständig aus. % \begin{macrocode} - \if@listsorted% - \expandafter\edef\expandafter\@tempb\expandafter{\@tempb,\@tempa}% - \else% +\newcommand\FinishTutorial[1][]{% + \immediate\write\tud@write@b{^^J\string\end{document}^^J} + \immediate\closeout\tud@write@b% + \immediate\closeout\tud@write@a% + \immediate\openout\tud@write@a\jobname-example.tex\relax% + \tud@tut@readtostream{\tud@tut@temp-preamble.tex}{\tud@write@a}% + \tud@tut@readtostream{\tud@tut@temp-trunk.tex}{\tud@write@a}% + \immediate\closeout\tud@write@a% + \clearpage% + \addsec{Copy\nobreakspace\&\nobreakspace{}Paste}% + \pagestyle{empty}% + Zum Ende des Dokumentes wird das vorgestellte Tutorial als \"ubersetzbarer + Quelltext ausgegeben, um dieses via Copy~\&~Paste verwenden und alle Punkte + nachvollziehen zu k\"onnen. Bitte beachten Sie, dass~-- abh\"angig vom + genutzten PDF-Betrachter~-- beim Kopieren die dargestellten Einz\"uge und + Abs\"atze m\"oglicherweise verloren gehen k\"onnen. Dies kann insbesondere + aufgrund fehlender Leerzeilen zu einem unvorteilhaften Ausgabeergebnis + f\"uhren. Alternativ finden Sie den folgenden \hologo{LaTeX}-Quelltext auch + im Pfad \Path{\PName{texmf}/source/latex/tudscr/doc/examples/} als Datei + \File{\jobname-example.tex}. \par #1% + % + \begin{quoting}[rightmargin=0pt]% + \lstinputlisting[style=tudscr]{\jobname-example.tex}% + \end{quoting}% + % % \end{macrocode} -% Liegt der Eintrag in alphabetischer Reihenfolge vor dem aktuellen der -% durchlaufenenen Liste, so wird dieser davor eingefügt. Dabei muss der Fall, -% dass das Element der erste Eintrag in der temporären Liste \cs{@tempb} ist, -% eine Sonderbehandlung erfolgen. Anschließend wird \cs{@listsortedtrue} -% gesetzt. +% Falls es möglich ist, werden nach dem Durchlauf alle nicht mehr benötigten +% Hilfsdateien gelöscht. % \begin{macrocode} - \expandafter\ifnum\pdfstrcmp{#1}{\@tempa}<\z@\relax% - \ifx\@tempb\@empty% - \expandafter\edef\expandafter\@tempb\expandafter{% - #1,\@tempa% - }% - \else% - \expandafter\edef\expandafter\@tempb\expandafter{% - \@tempb,#1,\@tempa% - }% - \fi% - \@listsortedtrue% - \else% + \ifnum\pdfshellescape=\@ne\relax% + \ifwindows% + \def\@tempa{del}% + \else% + \def\@tempa{rm}% + \fi% + \immediate\write18{\@tempa\space\tud@tut@temp*.*}% + \fi% +} % \end{macrocode} -% Ist Eintrag in alphabetischer Reihenfolge nach dem aktuellen der geprüften -% Liste, so wird dieser (noch) nicht eingefügt. Der Sonderfall des ersten -% Elementes wird abgedeckt. +% \end{macro}^^A \FinishTutorial +% \end{macro}^^A \StartTutorial +% \begin{macro}{\CodePreamble} +% \changes{v2.02}{2014/08/20}{neu}^^A +% \begin{macro}{\Code@Preamble} +% \changes{v2.02}{2014/10/22}{neu}^^A +% \begin{macro}{\CodeHook} +% \changes{v2.02}{2014/10/11}{neu}^^A +% \begin{macro}{\Code@Hook} +% \changes{v2.02}{2014/10/11}{neu}^^A +% Bereitstellung von Hilfsmakros für die formatierte Ausgabe von Quelltexten. % \begin{macrocode} - \ifx\@tempb\@empty% - \expandafter\edef\expandafter\@tempb\expandafter{\@tempa}% - \else% - \expandafter\edef\expandafter\@tempb\expandafter{\@tempb,\@tempa}% - \fi% - \fi% - \fi% - }% +\newcommand\Code@Preamble{} +\let\Code@Preamble\relax +\newcommand\CodePreamble[1]{\long\gdef\Code@Preamble{#1}} +\newcommand*\Code@Hook{} +\let\Code@Hook\relax +\newcommand*\CodeHook[1]{\gdef\Code@Hook{#1}} % \end{macrocode} -% Wurde der Eintrag nach dem Durchlaufen der Liste nicht eingefügt, so erfolgt -% dies hier am Ende der Liste. +% \end{macro}^^A \Code@Hook +% \end{macro}^^A \CodeHook +% \end{macro}^^A \Code@Preamble +% \end{macro}^^A \CodePreamble +% \begin{macro}{\StandaloneFile} +% \changes{v2.02}{2014/08/19}{neu}^^A +% \begin{macro}{\StandaloneDate} +% \changes{v2.05}{2015/11/18}{neu}^^A +% Die Umgebungen \env{Trunk!} und \env{Hint!} erzeugen nach der Ausgabe des +% Quelltextes mit dem Makro \cs{tud@tut@pdf} eine PDF-Datei, welche mit +% \cs{IncludeStandalone} in das Tutorial eingebunden werden kann. % \begin{macrocode} - \if@listsorted\else% - \expandafter\edef\expandafter\@tempb\expandafter{\@tempb,#1}% - \fi% +\newcommand*\StandaloneFile{} +\let\StandaloneFile\relax +\newcommand*\StandaloneDate{} % \end{macrocode} -% Die temporäre Liste \cs{@tempb} wird auf \cs{@sortedlist} überschrieben. +% \end{macro}^^A \StandaloneDate +% \end{macro}^^A \StandaloneFile +% \begin{macro}{\tud@tut@pre} +% \changes{v2.02}{2014/08/19}{neu}^^A +% \begin{macro}{\tud@tut@post} +% \changes{v2.02}{2014/08/19}{neu}^^A +% Dies sind die Hilfsmakros, welche zu Beginn und Ende der Quelltextumgebungen +% \env{Preamble}, \env{Trunk} und \env{Hint} für das Sichern der Inhalte in +% eine Hilfsdatei verantwortlich sind, wofür die \env{filecontents}-Umgebung +% genutzt wird. % \begin{macrocode} - \let\@sortedlist\@tempb% - \fi% +\newcommand*\tud@tut@pre{% + \ActivateWarningFilters[Tutorial]% + \csuse{filecontents*}{\tud@tut@temp.tex}% +} +\newcommand*\tud@tut@post{% + \csuse{endfilecontents*}% + \DeactivateWarningFilters[Tutorial]% } % \end{macrocode} -% \end{macro}^^A \if@listsorted -% \end{macro}^^A \@sortedlist -% \end{macro}^^A \@sortlist -% \end{macro}^^A \sortlist -% -% \iffalse -%</class> -%<*package> -% \fi -% -% \subsection{Befehle und Umgebungen für das Paket} -% -% Hier taucht alles auf, was lediglich für das Paket \pkg{tudscrman} und nicht -% für die Klasse benötigt wird. -% -% Für den Anwender werden im \TUDScript-Bundle einige Tutorials für die Nutzung -% von \LaTeXe bereitgestellt. Innerhalb dieser werden Auszüge von Quelltexten -% verwendet und erläutert. Zum einen soll die Möglichkeit geschaffen werden, -% diese gesammelt am Ende eines Tutorials für ein Copy"~\&"~Paste"~Beispiel zu -% verwenden. Andererseits soll auch das sofortige Ausführen des beschriebenen -% Quelltextauszuges direkt im Tutorial möglich sein. Dafür werden im Folgenden -% die Umgebungen \env{Preamble}, \env{Trunk} und \env{Hint} sowie daraus -% abgeleitet Varianten definiert, womit sich die Angabe und Erläuterung der -% Quelltexte im Tutorial logisch strukturieren lässt und dennoch die notwendige -% Ordnung dieser für das Copy"~\&"~Paste"~Beispiel aufrechterhalen werden kann. -% Hierfür zeichnen die beiden Umgebungen \env{Preamble} und \env{Trunk} und -% deren Derivate verantwortlich. Die Umgebung \env{Hint} steht für zusätzliche -% Erläuterungen bereit, welche jedoch nicht in das Copy"~\&"~Paste"~Beispiel -% übernommen werden. -% -% Damit die Umgebungen nicht doppelt implementiert werden müssen, werden die -% Hilfsmakros \cs{tud@tut@pre} und \cs{tud@tut@post} definiert. Diese nutzen -% die \env{filecontents}"=Umgebung, welche den Inhalt in die temporäre Datei -% \val{\string\jobname-temp.tex} schreibt. Zusätzlich wird dieser Inhalt mit -% \cs{tud@tut@append} der Datei \val{\string\jobname-preamble-temp.tex} oder -% \val{\string\jobname-trunk-temp.tex}~-- abhängig vom gegebenen Argument~-- -% hinzugefügt. So werden die im Dokumentes gesetzten Quelltextauszüge für ein -% Copy"~\&"~Paste"~Beispiel gesammelt und mit \cs{FinishTutorial} ausgegeben. +% \end{macro}^^A \tud@tut@post +% \end{macro}^^A \tud@tut@pre +% Die nachfolgenden Umgebungen nutzen die beiden Hilfsmakros \cs{tud@tut@pre} +% und \cs{tud@tut@post}, welche den gegebenen Inhalt in die temporäre Datei +% \file{\string\tud@tut@temp.tex} schreiben. Mit \cs{tud@tut@append} werden +% zusätzlich~-- abhängig vom gegebenen Argument~-- die im Dokument gesetzten +% Quelltextauszüge der Datei \file{\string\tud@tut@temp-preamble.tex} oder +% \file{\string\tud@tut@temp-trunk.tex} hinzugefügt. Damit werden die +% gewünschten Inhalte für ein Copy"~\&"~Paste"~Beispiel gesammelt und mit +% \cs{FinishTutorial} ausgegeben. % \begin{environment}{Preamble} % \changes{v2.02}{2014/11/02}{neu}^^A % \begin{environment}{Preamble*} @@ -2930,28 +5029,28 @@ % \begin{macrocode} \newenvironment{Preamble}{\tud@tut@pre}{% \tud@tut@post% - \tud@tut@append{\tud@write@i}% + \tud@tut@append{preamble}% \gdef\@tempa{% \tud@tut@lst% - \global\let\@CodePreamble\relax% + \global\let\Code@Preamble\relax% }% \aftergroup\@tempa% } \newenvironment{Preamble*}{\tud@tut@pre}{% \tud@tut@post% - \tud@tut@append{\tud@write@i}% + \tud@tut@append{preamble}% \gdef\@tempa{% \tud@tut@lst% \tud@tut@input% - \global\let\@CodePreamble\relax% + \global\let\Code@Preamble\relax% }% \aftergroup\@tempa% } \newenvironment{Preamble+}{\tud@tut@pre}{% \tud@tut@post% - \tud@tut@append{\tud@write@i}% + \tud@tut@append{preamble}% \gdef\@tempa{% - \global\let\@CodePreamble\relax% + \global\let\Code@Preamble\relax% }% \aftergroup\@tempa% } @@ -2983,41 +5082,41 @@ % \begin{macrocode} \newenvironment{Trunk}{\tud@tut@pre}{% \tud@tut@post% - \tud@tut@append{\tud@write@ii}% + \tud@tut@append{trunk}% \gdef\@tempa{% \tud@tut@lst% - \global\let\@CodePreamble\relax% + \global\let\Code@Preamble\relax% }% \aftergroup\@tempa% } \newenvironment{Trunk*}{\tud@tut@pre}{% \tud@tut@post% - \tud@tut@append{\tud@write@ii}% + \tud@tut@append{trunk}% \gdef\@tempa{% \tud@tut@lst% \tud@tut@input% - \global\let\@CodePreamble\relax% + \global\let\Code@Preamble\relax% }% \aftergroup\@tempa% } \newenvironment{Trunk+}{\tud@tut@pre}{% \tud@tut@post% - \tud@tut@append{\tud@write@ii}% + \tud@tut@append{trunk}% \gdef\@tempa{% - \global\let\@CodePreamble\relax% + \global\let\Code@Preamble\relax% }% \aftergroup\@tempa% } \newenvironment{Trunk!}[1]{% - \gdef\@StandaloneFile{#1}% + \gdef\StandaloneFile{#1}% \tud@tut@pre% }{% \tud@tut@post% - \tud@tut@append{\tud@write@ii}% + \tud@tut@append{trunk}% \gdef\@tempa{% \tud@tut@lst% \tud@tut@pdf% - \global\let\@CodePreamble\relax% + \global\let\Code@Preamble\relax% }% \aftergroup\@tempa% } @@ -3032,7 +5131,7 @@ % \changes{v2.02}{2014/10/13}{neu}^^A % \begin{environment}{Hint?} % \changes{v2.02}{2014/12/09}{neu}^^A -% \begin{environment}{Hint!} +% \begin{environment}{Hint{!}} % \changes{v2.02}{2014/11/13}{neu}^^A % Um Quelltextausschnitte zur weiterführenden Information anzugeben, wird die % Umgebung \env{Hint} definiert. Der Inhalt wird ausgegben und~-- falls die @@ -3046,7 +5145,7 @@ \tud@tut@post% \gdef\@tempa{% \tud@tut@lst% - \global\let\@CodePreamble\relax% + \global\let\Code@Preamble\relax% }% \aftergroup\@tempa% } @@ -3055,7 +5154,7 @@ \gdef\@tempa{% \tud@tut@lst% \tud@tut@input% - \global\let\@CodePreamble\relax% + \global\let\Code@Preamble\relax% }% \aftergroup\@tempa% } @@ -3064,19 +5163,19 @@ \gdef\@tempa{% \InputCode% \tud@tut@lst% - \global\let\@CodePreamble\relax% + \global\let\Code@Preamble\relax% }% \aftergroup\@tempa% } \newenvironment{Hint!}[1]{% - \gdef\@StandaloneFile{#1}% + \gdef\StandaloneFile{#1}% \tud@tut@pre% }{% \tud@tut@post% \gdef\@tempa{% \tud@tut@lst% \tud@tut@pdf% - \global\let\@CodePreamble\relax% + \global\let\Code@Preamble\relax% }% \aftergroup\@tempa% } @@ -3085,65 +5184,19 @@ % \end{environment}^^A Hint? % \end{environment}^^A Hint* % \end{environment}^^A Hint -% \begin{macro}{\@StandaloneFile} -% \changes{v2.02}{2014/08/19}{neu}^^A -% Die Umgebungen \env{Trunk!} und \env{Hint!} erzeugen nach der Ausgabe des -% Quelltextes mit dem Makro \cs{tud@tut@pdf} eine PDF-Datei, welche mit -% \cs{IncludeStandalone} in das Tutorial eingebunden werden kann. -% \begin{macrocode} -\newcommand*\@StandaloneFile{} -\let\@StandaloneFile\relax -% \end{macrocode} -% \end{macro}^^A \@StandaloneFile -% \begin{macro}{\tud@tut@pre} -% \changes{v2.02}{2014/08/19}{neu}^^A -% \begin{macro}{\tud@tut@post} -% \changes{v2.02}{2014/08/19}{neu}^^A -% Dies sind die Hilfsmakros, welche zu Beginn und Ende der Quelltextumgebungen -% \env{Preamble}, \env{Trunk} und \env{Hint} für das Sichern der Inhalte in -% eine Hilfsdatei verantwortlich zeichnen. -% \begin{macrocode} -\newcommand*\tud@tut@pre{% - \ActivateWarningFilters[Tutorial]% - \@nameuse{filecontents*}{\jobname-temp.tex}% -} -\newcommand*\tud@tut@post{% - \@nameuse{endfilecontents*}% - \DeactivateWarningFilters[Tutorial]% -} -% \end{macrocode} -% \end{macro}^^A \tud@tut@post -% \end{macro}^^A \tud@tut@pre % \begin{macro}{\tud@tut@lst} % \changes{v2.02}{2014/10/07}{neu}^^A % Damit wird der Quelltext eingezogen ausgegeben. % \begin{macrocode} \newcommand*\tud@tut@lst{% \begin{quoting}[rightmargin=0pt]% - \lstinputlisting[style=tudscr]{\jobname-temp.tex}% + \lstinputlisting[style=tudscr]{\tud@tut@temp.tex}% \end{quoting}% } % \end{macrocode} % \end{macro}^^A \tud@tut@lst % \begin{macro}{\tud@tut@input} % \changes{v2.02}{2014/10/13}{neu}^^A -% \begin{macro}{\CodePreamble} -% \changes{v2.02}{2014/08/20}{neu}^^A -% \begin{macro}{\@CodePreamble} -% \changes{v2.02}{2014/10/22}{neu}^^A -% \begin{macro}{\CodeHook} -% \changes{v2.02}{2014/10/11}{neu}^^A -% \begin{macro}{\@CodeHook} -% \changes{v2.02}{2014/10/11}{neu}^^A -% Bereitstellung von Hilfsmakros für die formatierte Ausgabe von Quelltexten. -% \begin{macrocode} -\newcommand\@CodePreamble{} -\let\@CodePreamble\relax -\newcommand\CodePreamble[1]{\long\gdef\@CodePreamble{#1}} -\newcommand*\@CodeHook{} -\let\@CodeHook\relax -\newcommand*\CodeHook[1]{\gdef\@CodeHook{#1}}% -% \end{macrocode} % Für die Ausgabe des Quelltextergebnisses erfolgt ein linker Einzug. Außerdem % werden unter anderem abhängig von der Verwendung eines erklärenden Textes die % eingefügten vertikalen Abstände angepasst. @@ -3167,64 +5220,61 @@ \setbox\@tempboxa\box\voidb@x% \ifdim\@tempdima>\z@\relax% \endgraf% - \vspace{\baselineskipglue}% + \vspace{\medskipamount}% \noindent\ignorespaces% \fi% \endgroup% }% % \end{macrocode} -% Da aufgrund der Verwendung der \env{filecontents}"=Umgebung ein optionales +% Da aufgrund der Verwendung der \env{filecontents}-Umgebung ein optionales % Argument für alle Abwandlungen der Quelltextumgebungen nicht möglich ist, % wird \cs{CodePreamble} bereitgestellt, womit der Ausgabe ein erläuternder % Text vorangestellt werden kann. % \begin{macrocode} - \@tempa{\@CodePreamble}{}% + \@tempa{\Code@Preamble}{}% \setlength\@tempdimc{\leftskip}% \setlength\leftskip{\leftmargin}% % \end{macrocode} -% Durch die zweimalige Verwendung von \val{\string\jobname-temp.tex}~-- einmal -% dirket und einmal innerhalb einer Box~-- können darin verwendete Befehle wie +% Durch die zweimalige Verwendung von \file{\string\tud@tut@temp.tex}~-- einmal +% direkt und einmal innerhalb einer Box~-- können darin verwendete Befehle wie % \cs{newcommand} zu Fehler führen. Mit dem Makro \cs{CodeHook} lassen sich -% diese Konflikte durch eine lokale Redefinition ebensoclher Befehle auflösen +% diese Konflikte durch eine lokale Redefinition ebensolcher Befehle auflösen % (bspw. \cs{let}\cs{newcommand}\cs{renewcommand}). % \begin{macrocode} \ActivateWarningFilters[Tutorial]% - \@tempa{\input{\jobname-temp.tex}}{\@CodeHook}% + \@tempa{\input{\tud@tut@temp.tex}}{\Code@Hook}% \DeactivateWarningFilters[Tutorial]% - \global\let\@CodeHook\relax% + \global\let\Code@Hook\relax% \setlength\leftskip{\@tempdimc}% \noindent\ignorespaces% } % \end{macrocode} -% \end{macro}^^A \@CodeHook -% \end{macro}^^A \CodeHook -% \end{macro}^^A \@CodePreamble -% \end{macro}^^A \CodePreamble % \end{macro}^^A \tud@tut@input % \begin{macro}{\InputCode} % \changes{v2.02}{2014/10/21}{neu}^^A -% Mit \cs{InputCode} kann der Inhalt der letzen \env{Trunk}"=Umgebung +% Mit \cs{InputCode} kann der Inhalt der letzen \env{Trunk}-Umgebung % direkt ausgeführt werden, ohne diesen zuvor mit \cs{tud@tut@input} zu prüfen % und zu formatieren. % \begin{macrocode} -\newcommand*\InputCode{\input{\jobname-temp.tex}} +\newcommand*\InputCode{\input{\tud@tut@temp.tex}} % \end{macrocode} % \end{macro}^^A \InputCode % \begin{macro}{\tud@tut@pdf} % \changes{v2.02}{2014/10/22}{neu}^^A -% Die Umgebung \env{Trunk!} verwendet nach der Ausgabe des Quelltextes diesen -% abermals, um daraus eine PDF-Datei zu erzeugen. Dafür wird mithilfe einer -% \env{filecontents}"=Umgebung eine temporäre \LaTeX-Datei erzeugt. Diese -% bindet die mit \env{Trunk!} erzeugte Datei ein und wird anschließende via -% \cs{write18} kompiliert. Dabei sollte man sich nicht von der doppelten -% Verwendung von \cs{jobname} verwirren lassen. Der Dateiname der temporär -% erzeugten \LaTeX-Datei ist abhängig vom gesetzten Tutorial. Beim Aufruf -% dieser wird über die Optionen von pdf\LaTeX{} der verwendete \cs{jobname} -% angepasst (siehe \cs{tud@tut@pdf}). -% \begin{macrocode} -\ifnum\pdfshellescape=\@ne\relax% +% Die Umgebungen \env{Trunk!} und \env{hint!} verwenden nach der Ausgabe des +% Quelltextes diesen abermals, um daraus eine PDF-Datei zu erzeugen. Dafür wird +% mithilfe einer \env{filecontents}-Umgebung eine temporäre \LaTeX-Datei +% erzeugt. Diese bindet die mit \env{Trunk!} erzeugte Datei ein und wird +% anschließend via \cs{write18} kompiliert. Dabei sollte man sich nicht von der +% doppelten Verwendung von \cs{jobname} verwirren lassen. Der Dateiname der +% temporär erzeugten \LaTeX-Datei ist abhängig vom gesetzten Tutorial. Beim +% Aufruf dieser wird über die Optionen von \app{pdflatex} der verwendete +% \cs{jobname} angepasst (siehe \cs{tud@tut@pdf}). +% \begin{macrocode} +\IfFileExists{\tud@tut@temp-standalone.tex}{\@tempswafalse}{\@tempswatrue} +\if@tempswa% \ActivateWarningFilters[Tutorial]% -\begin{filecontents*}{tutorial-temp.tex} +\begin{filecontents*}{\tud@tut@temp-standalone.tex} \RequirePackage[ngerman=ngerman-x-latest]{hyphsubst} \documentclass[english,ngerman]{tudscrreprt} \usepackage[utf8]{inputenc} @@ -3235,36 +5285,56 @@ \usepackage{enumitem} \setlist{noitemsep} \begin{document} -\input{\jobname.tex} +\ifdefvoid{\StandaloneDate}{}{\date{\StandaloneDate}}% +\input{\jobname.tex}% \end{document} \end{filecontents*} \DeactivateWarningFilters[Tutorial]% \fi % \end{macrocode} -% Der Quelltext aus der \env{Trunk!}"=Umgebung wird~-- wie bei allen anderen -% Derivaten der Umgebungen \env{Trunk}~-- in \val{\string\jobname-temp.tex} -% gesichert. Beim Aufruf von pdf\LaTeX{} wird durch die Verwendung der Option -% \opt{-jobname=\string\jobname-temp} die eigentliche Definition des Makros -% \cs{jobname} in der aufgerufenen Datei \val{tutorial-temp.tex} überschrieben -% und der Inhalt von \val{\string\jobname-temp.tex} wie gewünscht eingebunden -% und kompiliert. Damit die so erstellte PDF-Datei mit \cs{IncludeStandalone} +% Der Quelltext aus den Umgebungen \env{Trunk!} und \env{Hint!} wird~-- wie bei +% allen anderen \env{Trunk}-Derivaten~-- in \file{\string\tud@tut@temp.tex} +% gesichert. Beim Aufruf von \app{pdflatex} wird durch die Nutzung der Option +% \opt{-jobname=\string\tud@tut@temp} die Definition von \cs{jobname} in der +% aufgerufenen Datei \file{\string\tud@tut@temp-standalone.tex} überschrieben +% und der Inhalt von \file{\string\tud@tut@temp.tex} wie gewünscht eingebunden +% und kompiliert. Damit die so erstellte PDF-Datei mit \cs{IncludeStandalone} % im weiteren Verlauf in das Tutorial eingebunden werden kann, wird diese noch -% in \cs{\meta{Argument}-temp.pdf} umbenannt. +% in \cs{\meta{Argument}-temp.pdf} umbenannt. Das Makro \cs{StandaloneDate} +% wird auf das Datum der Master-Datei gesetzt, damit das voreingestellte Datum +% der erzeugten Datei angepasst werden kann. % \begin{macrocode} \newcommand*\tud@tut@pdf{% \ifnum\pdfshellescape=\@ne\relax% - \immediate\write18{% - pdflatex -jobname=\jobname-temp tutorial-temp.tex - pdflatex -jobname=\jobname-temp tutorial-temp.tex - pdflatex -jobname=\jobname-temp tutorial-temp.tex + \filemodCmp{\jobname-standalone-\StandaloneFile.pdf}{\jobname.tex}{}{% + \begingroup% + \let\printdate\@firstofone% + \edef\@tempa{\expandonce\@date}% + \def\@tempb{\today}% + \ifx\@tempa\@tempb\relax% + \def\@tempb{}% + \else% + \edef\@tempb{\etex@unexpanded{\def\StandaloneDate}{\@date}}% + \fi% + \edef\@tempa{% + pdflatex -jobname=\tud@tut@temp\space% + "\noexpand\unexpanded{\expandonce\@tempb\noexpand\input}% + {\tud@tut@temp-standalone.tex}"% + }% + \immediate\write18{\@tempa^^J\@tempa^^J\@tempa}% + \ifwindows% + \def\@tempa{rename}% + \else% + \def\@tempa{mv}% + \fi% + \immediate\write18{% + \@tempa\space\tud@tut@temp.pdf\space% + \jobname-standalone-\StandaloneFile.pdf% + }% + \endgroup% }% - \ifwindows% - \immediate\write18{rename \jobname-temp.pdf \@StandaloneFile-temp.pdf}% - \else% - \immediate\write18{mv \jobname-temp.pdf \@StandaloneFile-temp.pdf}% - \fi% \fi% - \global\let\@StandaloneFile\relax% + \global\let\StandaloneFile\relax% } % \end{macrocode} % \end{macro}^^A \tud@tut@pdf @@ -3276,7 +5346,7 @@ % Breite skaliert werden. % \begin{macrocode} \NewDocumentCommand\IncludeStandalone{omO{1}}{% - \IfFileExists{#2-temp.pdf}{% + \IfFileExists{\jobname-standalone-#2.pdf}{% \@tempcnta\z@% \@for\@tempa:=#3\do{\advance\@tempcnta\@ne}% \ifnum\@tempcnta>\z@\relax% @@ -3290,410 +5360,508 @@ \edef\@tempb{% keepaspectratio,page=\@tempa,width=\the\@tempdima,% \IfValueT{#1}{#1}% - } - \fbox{\expandafter\includegraphics\expandafter[\@tempb]{#2-temp.pdf}}% + }% + \fbox{% + \expandafter\includegraphics\expandafter[\@tempb]{% + \jobname-standalone-#2.pdf% + }% + }% \ifnum\@tempcnta>\z@\relax\hfill\fi% }% \fi% }{% - \tud@shellescape@wrn% + \tud@shellescape@wrn{\jobname-standalone-#2.pdf}% }% } % \end{macrocode} % \end{macro}^^A \IncludeStandalone -% \begin{macro}{\StartTutorial} -% \changes{v2.02}{2014/08/21}{neu}^^A -% \begin{macro}{\FinishTutorial} -% \changes{v2.02}{2014/08/21}{neu}^^A -% Mit \cs{StartTutorial} wird ein Hyperlink für den Querverweis aus dem -% Handbuch definiert. Außerdem wird gleich der Titel und ein einleitender Satz -% gesetzt. +% +% \iffalse +%</package> +% \fi +% +% \subsection{Automatische Erstellung von \pkg{pstricks}-Grafiken} +% +% Falls innerhalb eines Tutorials das Paket \pkg{pstricks} verwendet wird, muss +% dafür Sorge getragen werden, dass die automatische Kompilierung reibungslos +% mit \pkg{auto-pst-pdf} funktioniert. % \begin{macrocode} -\newcommand\StartTutorial[1][% - Bevor das eigentliche Tutorial beginnt, werden sowohl eine Dokumentklasse - als auch die f\"ur jedes \hologo{pdfLaTeX}-Dokument meiner Meinung nach - sinnvollen Pakete geladen. -]{% - \Hy@raisedlink{\hyperdef{\jobname}{tutorials:\jobname}{}}% - \faculty{}% - \setlength\headingsvskip{-15mm}% - \maketitle\noindent#1% - \immediate\openout\tud@write@i=\jobname-preamble-temp.tex\relax - \immediate\openout\tud@write@ii=\jobname-trunk-temp.tex\relax - \immediate\write\tud@write@ii{^^J\string\begin{document}^^J} -} +%<*package> +\AfterPackage*{pstricks}{% + \ifnum\pdfshellescape=\@ne\relax% + \filemodCmp{\jobname-pics.pdf}{\jobname.tex}{% + \PassOptionsToPackage{off}{auto-pst-pdf}% + }{}% + \else% + \PassOptionsToPackage{off}{auto-pst-pdf}% + \fi% + \RequirePackage{auto-pst-pdf}[2009/04/26]% % \end{macrocode} -% Der Befehl \cs{FinishTutorial} schleißt den noch offenen Ausgabestream und -% gibt den vorgestellten Quelltext vollständig aus. +% Nach dem Paket \pkg{auto-pst-pdf} seine Arbeit verrichtet hat, werden alle +% etwaigen temporär erzeugten Dateien radikal gelöscht. % \begin{macrocode} -\newcommand\FinishTutorial[1][]{% - \immediate\write\tud@write@ii{^^J\string\end{document}^^J} - \immediate\closeout\tud@write@ii% - \immediate\closeout\tud@write@i% - \tud@tut@collect% - \clearpage% - \addsec{Copy~\&~Paste}% - \pagestyle{empty}% - Zum Ende des Dokumentes wird das vorgestellte Tutorial als \"ubersetzbarer - Quelltext ausgegeben, um dieses via Copy~\&~Paste verwenden und alle Punkte - nachvollziehen zu k\"onnen. Bitte beachten Sie, dass~-- abh\"angig vom - genutzten PDF-Betrachter~-- beim Kopieren die dargestellten Einz\"uge und - Abs\"atze m\"oglicherweise verloren gehen k\"onnen. Dies kann insbesondere - aufgrund fehlender Leerzeilen zu einem unvorteilhaften Ausgabeergebnis - f\"uhren. Alternativ finden Sie den folgenden \hologo{LaTeX}-Quelltext auch - im Pfad \Path{texmf/source/latex/tudscr/doc/examples/} als Datei - \File{\jobname-example.tex}. \par #1 - \begin{quoting}[rightmargin=0pt]% - \lstinputlisting[style=tudscr]{\jobname-example-temp.tex}% - \end{quoting}% + \ifnum\pdfshellescape=\@ne\relax% + \edef\@tempa{\app@exe{\app@rm "*\app@suffix*"}}% + \@tempa% + \fi% } +%</package> % \end{macrocode} -% \end{macro}^^A \FinishTutorial -% \end{macro}^^A \StartTutorial -% \begin{macro}{\tud@tut@readtostream} -% \changes{v2.02}{2014/12/16}{neu}^^A -% \begin{macro}{\tud@tut@line} -% \changes{v2.02}{2014/08/19}{neu}^^A -% \begin{macro}{\tud@tut@append} -% \changes{v2.02}{2014/08/19}{neu}^^A -% \begin{macro}{\tud@tut@collect} -% \changes{v2.02}{2014/12/16}{neu}^^A -% Bei den Tutorials soll zum Schluss ein komplett kompilierbares Beispiel für -% Copy~\&~Paste gegeben werden. Um dieses zusammenzubauen, werden alle im -% Dokument innerhalb der Varianten der \env{Trunk}"=Umgebungen gegebenen -% Codefragmente zusammengesetzt. Um die Quelltexte einlesen und verarbeiten zu -% können, werden zwei Eingabe- sowie ein Ausgabestream benötigt, welche bereits -% zuvor initilaisiert wurden. % -% Mit \cs{tud@tut@readtostream} wird der Inhalt der Datei im ersten Argument -% in den Ausgabestream des zweiten Argumentes geschrieben. Dies wird durch die -% Makros \cs{tud@tut@append} und \cs{tud@tut@collect} genutzt. -% \begin{macrocode} -\newcommand*\tud@tut@line{} -\newcommand*\tud@tut@readtostream[2]{% - \begingroup% - \endlinechar=-1\relax% - \openin\tud@read=#1% -% \end{macrocode} -% Der Schalter \cs{if@tempswa} wird verwendet, um unnötige Leerzeilen in der -% Ausgabedatei zu entfernen. Wurde eine nicht leere Zeile gefunden, wird diese -% auf jeden Fall geschrieben, indem \cs{@tempswatrue} gesetzt wird. Eine leere -% Zeile wird~-- bis auf den Sonderfall, dass es sich um die letzte Zeile in der -% Datei handelt~-- zunächst nicht weiter beachtet. Im Zweifelsfall wird diese -% (erste) Leerzeile geschrieben. -% \begin{macrocode} - \@tempswafalse% - \loop\unless\ifeof\tud@read% - \readline\tud@read to\tud@tut@line% - \ifx\tud@tut@line\@empty% - \ifeof\tud@read\@tempswafalse\fi% - \else% - \@tempswatrue% - \fi% -% \end{macrocode} -% Hier erfolgt das eigentliche Schreiben im selektierten Stream. +% \subsection{ToDo-Liste} +% +% Für Klasse und Paket besteht die Möglichkeit, Änderungsnotizen zu nutzen, +% wofür das Paket \pkg{todonotes} geladen wird. % \begin{macrocode} - \if@tempswa% - \immediate\write#2{\unexpanded\expandafter{\tud@tut@line}}% - \fi% +\PassOptionsToPackage{obeyFinal}{todonotes} % \end{macrocode} -% Im Nachgang wird überprüft, ob die aktuell geschriebene Zeile leer war. Ist -% dies der Fall, so wird \cs{@tempswafalse} gesetzt, um eine etwaig folgende -% Leerzeile nicht in die Ausgabedatei zu schrieben. +% Für den Druck wird die farbige Ausgabe der ToDo-Notizen deaktiviert. % \begin{macrocode} - \ifx\tud@tut@line\@empty\@tempswafalse\fi% - \repeat% - \closein\tud@read% - \endgroup% +\ifdef{\tudprintflag}{% + \PassOptionsToPackage{color=white}{todonotes}% +}{% + \PassOptionsToPackage{colorinlistoftodos,color=HKS92!10}{todonotes}% } +\RequirePackage{todonotes}[2012/07/25] % \end{macrocode} -% Der innerhalb der Umgebungen \env{Preamble} und \env{Trunk}~-- sowie deren -% Derivaten~-- angegeben Inhalt wird beim Beenden dieser in die Hilfsdatei -% \cs{jobname-temp.tex} zwischengespeichert. Mit dem Befehl \cs{tud@tut@append} -% wird der Inhalt dieser Datei ausgelesen und den zusätzlichen Hilfsdateien -% \cs{jobname-preamble-temp.tex} beziehungsweise \cs{jobname-trunk-temp.tex} -% angehangen und damit gesichert, um Quelltextauszüge aus dem Tutorial für die -% Präambel sowie den Dokumentteil trennen beziehungsweise sortieren zu können. +% +% \iffalse +%</body> +%<*option> +% \fi +% +% \begin{option}{ToDo} +% \changes{v2.02}{2014/07/10}{neu}^^A +% \changes{v2.05}{2015/10/27}{Nutzung von Positiv- und Negativ-Liste}^^A +% \begin{macro}{\if@tud@todo} +% \changes{v2.02}{2014/07/10}{neu}^^A +% \begin{macro}{\tud@todo@type@pos} +% \changes{v2.05}{2015/10/27}{neu}^^A +% \begin{macro}{\tud@todo@type@neg} +% \changes{v2.05}{2015/10/27}{neu}^^A +% Diese Option ist verantwortlich für den Schalter \cs{if@tud@todo}. Über +% diesen wird gesteuert, ob ToDo-Notizen ausgegeben werden sollen. % \begin{macrocode} -\newcommand*\tud@tut@append[1]{\tud@tut@readtostream{\jobname-temp.tex}{#1}} +\newif\if@tud@todo +\newcommand*\tud@todo@type@pos{} +\let\tud@todo@type@pos\relax +\newcommand*\tud@todo@type@neg{} +\let\tud@todo@type@neg\relax +\TUD@key{ToDo}[true]{% + \TUD@set@ifkey{ToDo}{@tud@todo}{#1}% % \end{macrocode} -% Das Makro \cs{tud@tut@collect} fügt alle Quelltexte des Tutorials, welche -% nach Präambel und Dokumentteil sortiert wurden, in einer Datei zusammen. -% Diese wird zum einen am Ende des Tutorials mit \cs{FinishTutorial} ausgeben, -% zum anderen wird diese als Beispiel in den Ordner für Beispiele beim Erzeugen -% eines Release kopiert. +% Wird der Option ein boolescher Wert übergeben, sind sowohl die Positiv- als +% auch die Negativ-Liste hinfällig. % \begin{macrocode} -\newcommand*\tud@tut@collect{% - \immediate\openout\tud@write@ii\jobname-example-temp.tex\relax% - \tud@tut@readtostream{\jobname-preamble-temp.tex}{\tud@write@ii}% - \tud@tut@readtostream{\jobname-trunk-temp.tex}{\tud@write@ii}% - \immediate\closeout\tud@write@ii + \ifx\FamilyKeyState\FamilyKeyStateProcessed% + \let\tud@todo@type@pos\relax% + \let\tud@todo@type@neg\relax% + \else% +% \end{macrocode} +% Wird die Option nicht mit einem booleschen Wert verwendet, so kann über diese +% gezielt der Typ einer (nicht) auszugebenden ToDo-Notiz angegeben werden. So +% können bestimmte Typen von Notizen entweder ausschließlich ausgegeben oder +% aber unterdrückt werden, wobei für letztere Variante das Suffix \val{not} +% vor dem eigentlichen Typen verwendet werden muss. +% \begin{macrocode} + \def\@tempa not##1##2##3##4\@nil{% + \ifstr{##1##2##3}{not}{% + \if\relax##4\relax\else% + \listeadd\tud@todo@type@neg{##4}% + \@tud@todotrue% + \FamilyKeyStateProcessed% + \fi% + }{% + \if\relax##1\relax\else% + \listeadd\tud@todo@type@pos{##1##2##3##4}% + \@tud@todotrue% + \FamilyKeyStateProcessed% + \fi% + }% + }% + \edef\@tempb{not\trim@spaces{#1}}% + \expandafter\@tempa\@tempb\@empty\@empty\@empty\@nil% + \fi% } % \end{macrocode} -% \end{macro}^^A \tud@tut@collect -% \end{macro}^^A \tud@tut@append -% \end{macro}^^A \tud@tut@line -% \end{macro}^^A \tud@tut@readtostream +% \end{macro}^^A \tud@todo@type@neg +% \end{macro}^^A \tud@todo@type@pos +% \end{macro}^^A \if@tud@todo +% \end{option}^^A ToDo % % \iffalse -%</package> +%</option> +%<*body> % \fi % -% \subsection{Ausgabe von Index und Änderungsliste} -% -% Ein Index kann sowhol mit dem Paket als auch mit der Klasse erzeugt werden, -% die Änderungsliste ist der Klasse vorbehalten. -% \begin{macro}{\idxfont} -% Für zusätzliche Informationen im Index nach dem eigentlichen Eintrag wird -% eine etwas kleinere Schrift verwendet. +% \begin{macro}{\ToDo} +% \changes{v2.02}{2014/07/10}{Verwendung von \pkg{todonotes}}^^A +% \changes{v2.03}{2015/01/25}{Ausgabe auf bestimmten Typ beschränkbar}^^A +% \changes{v2.05}{2015/11/02}{Farbkodierung durch optionale Versionsnummer}^^A +% \begin{macro}{\tud@todo@type@color} +% \changes{v2.05}{2015/11/02}{neu}^^A +% \begin{macro}{\tud@todo@marginnote} +% \changes{v2.05}{2016/05/31}{neu}^^A +% \begin{macro}{\ListOfToDo} +% \changes{v2.02}{2014/07/10}{neu}^^A +% Mit dem Befehl \cs{ToDo}\oarg{Option}\marg{ToDo-Notiz}\oarg{Versionsnummer} +% kann bei aktivierter Option \opt{ToDo} eine Notiz mit einer offenen Aufgabe +% erstellt werden. Das vorangestellte Argument kann Optionen beinhalten, welche +% durch \pkg{todonotes} unterstützt werden. Außerdem werden die fünf booleschen +% Schlüssel \val{doc}, \val{man}, \val{imp}, \val{urg} und \val{nxt} definiert, +% welche eine farbliche Kodierung erzeugen, um die Aufgaben tu kategorisieren. +% \begin{macrocode} +\AfterPackage*{todonotes}{% + \newcommand*\tud@todo@type@color[2]{% + \define@boolkey{todonotes}{#1}[true]{% + \ifdef{\tudprintflag}{}{% + \ifbool{KV@todonotes@#1}{\setkeys{todonotes}{color=#2}}{}% + }% + }% + }% + \tud@todo@type@color{doc}{HKS41!30}% + \tud@todo@type@color{rls}{HKS44!30}% + \tud@todo@type@color{imp}{HKS57!50}% + \tud@todo@type@color{urg}{HKS07!50}% + \tud@todo@type@color{nxt}{HKS92!30}% + \undef\tud@todo@type@color% + \newcommand*\tud@todo@marginnote{}% +% \end{macrocode} +% Nun folgt die Definition des eigentlichen Befehls. Dabei wird zu Beginn +% \cs{@currentHref} gesichert und am Ende wiederhergestellt. +% \begin{macrocode} + \NewDocumentCommand\ToDo{somo}{% + \ifbool{@tud@todo}{% + \global\let\tud@currentHref\@currentHref% + \begingroup% +% \end{macrocode} +% In \cs{@tempa} wird das optionale Argument für den \cs{todo}-Befehl aus dem +% Paket \pkg{todonotes} erstellt. % \begin{macrocode} -\newcommand*\idxfont{} -\let\idxfont\footnotesize -\robustify{\idxfont} + \let\@tempa\@empty% % \end{macrocode} -% \end{macro}^^A \idxfont -% \begin{macro}{\PrintIndex} -% \begin{macro}{\PrintIndexPrologue} -% \changes{v2.02}{2014/08/20}{neu}^^A -% \begin{macro}{\@printindexprologue} -% \changes{v2.02}{2014/08/20}{neu}^^A -% \begin{macro}{\@printindexskip} -% \changes{v2.02}{2014/09/02}{neu}^^A -% \begin{macro}{\Index} -% \begin{macro}{\seeidx} -% \begin{macro}{\@printindex} -% \changes{v2.02}{2014/07/25}{neu}^^A -% Der Befehl \cs{PrintIndex} ist die Zusammenfassung für die Ausgabe aller -% Indexe. +% Das angestellte optionale Argument erzeugt zusätzlich eine Notiz am Rand, in +% welcher vorzugsweise die angedachte Version eingetragen werden kann. Sollte +% dieser angegeben sein, wird auf eine gültige Versionsnummer geprüft. Dabei +% wird ein möglicherweise vorangestelltes \val{v} entfernt. % \begin{macrocode} -\newcommand*\PrintIndex{% - \begingroup% -%<*class> - \@printindex% -%</class> - \@printindex[options]% - \@printindex[macros]% -%<*class> - \@printindex[keys]% - \@printindex[terms]% - \@printindex[fonts]% - \begingroup% - \let\lettergroup\@gobble% - \let\indexspace\par% - \@printindex[colors]% - \endgroup% -%</class> - \@printindex[files]% - \endgroup% -} + \def\tud@todo@marginnote{ToDo}% + \IfValueT{#4}{% + \def\tud@todo@marginnote{#4}% + \tud@v@get\@tempc{#4}% +% \end{macrocode} +% Exisitiert die angegebene Versionsnummer, so wird geprüft, ob die des +% optionalen Argumentes bereits veraltet ist. Ist dies der Fall, wird die +% ToDo-Notiz als dringlich (\val{urg}) gekennzeichnet. +% \begin{macrocode} + \ifcsdef{tud@v@\@tempc}{% + \ifstr{\@tempc}{\TUDScriptVersionNumber}{}{\def\@tempa{urg}}% + \edef\tud@todo@marginnote{v\@tempc}% +% \end{macrocode} +% Exisitiert die angegebene Versionsnummer nicht, so wird geprüft, ob es sich +% überhaupt um eine Versionsnummer handelt. Ist dies der Fall, wird die +% ToDo-Notiz als Aufgabe für eine spätere Version (\val{nxt}) gekennzeichnet. +% \begin{macrocode} + }{% + \def\@tempa##1.##2##3##4\@nil{##1##2##3}% + \edef\@tempb{\expandafter\@tempa\@tempc.000\@nil}% + \ifxnumber{\@tempb}{% + \def\@tempa{nxt}% + \edef\tud@todo@marginnote{v\@tempc}% + }{\let\@tempa\@empty}% + }% + }% % \end{macrocode} -% Hiermit kann der einleitende Teil für den allgemeinen Index gesetzt werden. +% Anschließend wird das eigentliche optionale Argument vorangestellt, wobei in +% diesem ggf. auch der Kategorisierungstyp enthalten ist. +% \begin{macrocode} + \IfValueT{#2}{\preto\@tempa{#2,}}% +% \end{macrocode} +% Die Ausgabe erfolgt entweder für alle ToDo-Notizen oder nur für die per +% Option festgelegten Typen. Dabei wird in einer Schleife geprüft, ob der in +% der aktuellen Notiz angegebene Kategorisierungstyp entweder in der Positv- +% oder aber in der Negativ-Liste enthalten ist. Soll der aktuelle Typ +% ausgegeben werden, wird der Schalter \cs{@tempswa} gesetzt. +% \begin{macrocode} + \@tempswafalse% + \ifx\tud@todo@type@pos\relax\@tempswatrue\fi% + \toks@{\forcsvlist\@tempb}% + \eaddto@hook\toks@{\expandafter{\@tempa}}% + \let\@tempa\@empty% + \def\@tempb##1{% + \eappto\@tempa{##1,}% + \ifinlist{##1}{\tud@todo@type@pos}{\@tempswatrue}{}% + \ifinlist{##1}{\tud@todo@type@neg}{\@tempswafalse}{}% + }% + \the\toks@% +% \end{macrocode} +% Vor der Ausgabe wird ein kleiner vertikaler Abstand eingefügt. % \begin{macrocode} -%<*class> -\newcommand*\PrintIndexPrologue[1]{\long\gdef\@printindexprologue{#1}} -\newcommand*\@printindexprologue{} -%</class> + \if@tempswa% + \ifhmode\par\fi% + \let\par\relax% + \vskip\medskipamount% + \noindent% % \end{macrocode} -% Durch die Verwendung der \env{multicols}"=Umgebung werden zu große vertikale -% Abstände gesetzt. Dies wird mit diesem Befehl rückgängig gemacht. +% Dann erfolgt die Ausgabe der eigentlichen ToDo-Notiz im Textbereich. Die +% Sternversion von \cs{ToDo} unterdrückt dabei die Aufnahme in die ToDo-Liste. % \begin{macrocode} -\newcommand*\@printindexskip{% - \ifnum\imki@columns>\@ne\relax\vspace{-\multicolsep}\fi% -} + \toks@\expandafter{\@tempa inline}% + \IfBooleanT{#1}{\addto@hook\toks@{,nolist}}% + \sbox\z@{% + \expandafter\todo\expandafter[\the\toks@]{\trim@spaces{#3}\strut}% + }\usebox\z@% % \end{macrocode} -% Der Befehl \cs{@printindex} setzt vor jedem Unterindex ein referenzierbares -% Label und gibt diesen danach aus. +% Es folgt die dazugehörige Randnotiz. Damit diese nicht verrutscht, wird +% \cs{marginnote} anstelle von \cs{marginpar} verwendet. Wurde das angestellte +% optionale Argument verwendet, wird dieses für die Randnotiz genutzt. +% Andernfalls erscheint im Rand die Anmerkung \emph{ToDo}. % \begin{macrocode} -\newcommand*\@printindex[1][]{% - \pagebreak[3]% -%<*class> - \ifblank{#1}{% - \ifx\@printindexprologue\@empty% - \indexprologue[\@printindexskip]{\manualhyperdef'{idx:main}}% - \else% - \indexprologue{% - \manualhyperdef'{idx:main}% - \@printindexprologue% - }% - \fi% - \printindex\@printindexskip% - \let\@printindexprologue\@empty% - }{% - \indexprologue[\@printindexskip]{\manualhyperdef'{idx:#1}}% - \printindex[#1]\@printindexskip% + \renewcommand*\marginpar[2][]{% + \marginnote[##1]{##2}[\dimexpr-\ht\z@+1.6ex+1.75pt\relax]% + }% + \toks@\expandafter{\@tempa noline,nolist}% + \settowidth\marginparwidth{\tud@todo@marginnote}% + \addtolength\marginparwidth{\dimexpr1.6ex+1pt\relax}% + \expandafter\todo\expandafter[\the\toks@]{\tud@todo@marginnote\strut}% + \aftergroup\par\aftergroup\noindent% + \fi% + \endgroup% + \global\let\@currentHref\tud@currentHref% + }{}% + \ignorespaces% }% -%</class> -%<*package> - \indexprologue[\@printindexskip]{}% - \printindex[#1]\@printindexskip% -%</package> +% \end{macrocode} +% Zum Schluss wird der Befehl \cs{ListOfToDo} definiert, der die Liste der noch +% zu erledigenden Punkte ausgibt. +% \begin{macrocode} + \newcommand*\ListOfToDo{\if@tud@todo\clearpage\listoftodos\fi}% } % \end{macrocode} -% Der Befehl \cs{Index} dient zum Eintragen eines Schlagwortes im allgemeinen -% Index und verweist auf den speziellen, zum Schlagwort gehörigen Index. Das -% optionale Argument kann verwendet werden, um ggf. den Eintrag in den -% allgemeinen Index anders zu benennen, als den Verweis. +% Sollte das Paket \pkg{todonotes} nicht geladen werden, erfolgt ein Definition +% der beiden notwendigen Befehle als Dummy. % \begin{macrocode} -%<*class> -\newcommand*\seeidx[2]{\pageref{idx:#1}} -\NewDocumentCommand\Index{mom}{% - \index{% - #1!\textrightarrow{}\space% - \manualhyperref{idx:#3}{Index der \IfValueTF{#2}{#2}{#1}}|seeidx{#3}% - }% +\TUD@UnwindPackage{todonotes}{% + \NewDocumentCommand\ToDo{somo}{}% + \newcommand*\ListOfToDo{}% } -%</class> % \end{macrocode} -% \end{macro}^^A \@printindex -% \end{macro}^^A \seeidx -% \end{macro}^^A \Index -% \end{macro}^^A \@printindexskip -% \end{macro}^^A \@printindexprologue -% \end{macro}^^A \PrintIndexPrologue -% \end{macro}^^A \PrintIndex +% \end{macro}^^A \ListOfToDo +% \end{macro}^^A \tud@todo@marginnote +% \end{macro}^^A \tud@todo@type@color +% \end{macro}^^A \ToDo +% +% \section{Verschiedenes für die Dokumentationsklassen und -pakete} +% +% Sowohl für die Klasse \cls{tudscrmanual} als auch \cls{tudscrdoc} werden ein +% paar Befehle zur komfortablen verwendung im Fließtext definiert. Außerdem +% erfolgen mittels einiger Pakete verschiedene Formateinstellungen. +% +% Für den Fließtext werden Pfeile u.\,ä. durch \pkg{textcomp} bereitgestellt. +% \begin{macrocode} +\RequirePackage{textcomp}[2005/09/27] +% \end{macrocode} +% Vergrößerung des Durchschusses. +% \begin{macrocode} +\RequirePackage{setspace}[2011/12/19] +\setstretch{1.1} +% \end{macrocode} +% Sprachabhängiges Setzen von Anführungszeichen. Das Laden des Paketes darf +% erst nach \pkg{inputenc} erfolgen. +% \begin{macrocode} +\AfterPackage*{inputenc}{\RequirePackage{csquotes}[2011/10/22]} +\TUD@UnwindPackage{inputenc}{\RequirePackage{csquotes}[2011/10/22]} +% \end{macrocode} +% Verbesserte Zitate. +% \begin{macrocode} +\PassOptionsToPackage{vskip=\smallskipamount}{quoting} +\RequirePackage{quoting}[2014/01/28] +% \end{macrocode} +% Automatisierte Datumsformatierung. +% \begin{macrocode} +\RequirePackage{isodate}[2010/01/03] +% \end{macrocode} +% Verschiedenste Symbole aus dem \LaTeX-Universum. +% \begin{macrocode} +\RequirePackage{hologo}[2012/04/26] +% \end{macrocode} % % \iffalse %<*class> % \fi % -% \begin{macro}{\PrintChangelog} -% \begin{macro}{\if@changelog} -% \begin{macro}{\Changelog} -% \changes{v2.02}{2014/08/20}{neu}^^A -% \begin{macro}{\deprecatedhyperpage} -% \changes{v2.03}{2015/02/05}{neu}^^A -% Ähnlich wie für den Index wird auch für die Änderungsliste verfahren. Mit dem -% Makro \cs{deprecatedhyperpage} wird die Ausgabe der Seitenzahlen unterdrückt, -% wenn zusätzlich ein mit \cs{see} gesetzter Querverweis existiert. -% \begin{macrocode} -\newcommand*\deprecatedhyperpage{} -\newif\if@changelog -\newcommand*\PrintChangelog{% - \begingroup% - \let\lettergroup\@gobble% - \@changelogtrue% - \let\deprecatedhyperpage\hyperpage% - \preto\item{\let\deprecatedhyperpage\hyperpage}% - \preto\subitem{\let\deprecatedhyperpage\hyperpage}% - \preto\subsubitem{\let\deprecatedhyperpage\hyperpage}% - \@printindex[changelog]% - \endgroup% -} -\NewDocumentCommand\Changelog{m}{% - \index{% - #1!\textrightarrow{}\space% - \manualhyperref{idx:changelog}{\"Anderungsliste}|seeidx{changelog}% - }% +% Mit dem Paket \pkg{ragged2e} wird~-- falls benötigt~-- die Silbentrennung im +% Flattersatz aktiviert. +% \begin{macrocode} +\RequirePackage{ragged2e}[2009/05/21] +% \end{macrocode} +% Die Fußnoten werden nicht mit jedem Kapitel zurückgesetzt. +% \begin{macrocode} +\RequirePackage{chngcntr}[2009/09/02] +\counterwithout{footnote}{chapter} +\addtokomafont{footnote}{\tud@RaggedRight} +% \end{macrocode} +% Das Paket wird für die Erstellung von Tabellen verwendet. +% \begin{macrocode} +\RequirePackage{booktabs}[2005/04/14] +% \end{macrocode} +% Die Formatierung von Gleitobjekten. +% \begin{macrocode} +\RequirePackage{caption}[2015/09/17] +\RequirePackage{floatrow}[2008/08/02] +\DeclareCaptionSubType[alph]{figure} +\DeclareCaptionSubType[alph]{table} +\captionsetup{font=sf,labelfont=bf,labelsep=space} +\captionsetup{singlelinecheck=off,format=hang,justification=raggedright} +\captionsetup[subfloat]{labelformat=brace,list=off} +\KOMAoption{captions}{tableheading,figuresignature} +\floatsetup[table]{style=plaintop} +% \end{macrocode} +% Erstellen von Grafiken. +% \begin{macrocode} +\RequirePackage{tikz}[2013/12/13] +% \end{macrocode} +% Einbinden von ganzseitigen PDF"~Dokumenten als Beispiel im Handbuch. +% \begin{macrocode} +\RequirePackage{pdfpages}[2013/08/25] +% \end{macrocode} +% Typographisch saubere Einheiten. +% \begin{macrocode} +\RequirePackage{units}[1998/08/04] +% \end{macrocode} +% Das Paket \pkg{ellipsis} sorgt für korrekte Auslassungpunkte. +% \begin{macrocode} +\AtEndPreamble{% + \RequirePackage{ellipsis}[2004/9/28]% + \let\ellipsispunctuation\relax% } % \end{macrocode} -% \end{macro}^^A \deprecatedhyperpage -% \end{macro}^^A \Changelog -% \end{macro}^^A \if@changelog -% \end{macro}^^A \PrintChangelog % % \iffalse %</class> +%</body> +%</!doc> +%<*body> % \fi % -% \begin{macro}{\see} -% \changes{v2.03}{2015/02/06}{neu}^^A -% \begin{macro}{\seealso} -% \changes{v2.03}{2015/02/06}{neu}^^A -% Diese Befehle werden zum einen so definiert, dass zwischen \cs{seename} und -% dem Argument ein geschütztes Leerzeichen verwendet wird. Die Sternversion -% benötigt kein zweites, leeres Argument. -% \begin{macrocode} -\renewrobustcmd*\see[2]{% - \ifstr{#1}{*}{\emph{\seename}~#2}{\emph{\seename}~#1}% -% \end{macrocode} -% Innerhalb der Klasse dient er außerdem zum etwaigen Unterdrücken von -% Seitenzahlen in der Änderungsliste veralteter Optionen, Befehle etc. -% \begin{macrocode} +% \begin{macro}{\Attention} +% \changes{v2.02}{2014/08/16}{neu}^^A +% \begin{macro}{\Forum} +% \begin{macro}{\CTAN} +% \changes{v2.05}{2015/11/22}{neu}^^A +% \begin{macro}{\GitHubRepo} +% \changes{v2.02}{2014/08/16}{neu}^^A +% \begin{macro}{\notudscrartcl} +% \begin{macro}{\scrguide} +% \changes{v2.02}{2014/09/04}{neu}^^A +% \changes{v2.05}{2015/07/23}{Hyperlinktext über optionales Argument}^^A +% Für die Anwenderdokumentation werden weitere Auszeichnungsbefehle definiert. +% \begin{macrocode} +\newcommand*\Attention[2][\z@]{% + \marginnote{% + \setlength\fboxsep{0.25em} + \fbox{Achtung!}% + }[#1]% + \emph{\trim@spaces{#2}}% +} +\NewDocumentCommand\Forum{st'}{% + \IfBooleanTF{#1}{\toks@{\href}}{\toks@{\hrfn}}% + \IfBooleanT{#2}{\toks@{\url}}% + \addto@hook\toks@{{http://latex.wcms-file3.tu-dresden.de/phpBB3/}}% + \IfBooleanF{#2}{\addto@hook\toks@{{TUD-\LaTeX-Forum}}}% + \the\toks@\xspace% +} +\NewDocumentCommand\CTAN{sog}{% + \IfBooleanTF{#1}{\toks@{\href}}{\toks@{\hrfn}}% + \addto@hook\toks@{{http://www.ctan.org/\IfValueT{#2}{#2}}}% + \addto@hook\toks@{% + {\tud@english{Comprehensive TeX Archive Network (CTAN\IfValueT{#3}{~#3})}}% + }% + \the\toks@\xspace% +} %<*class> - \if@changelog\let\deprecatedhyperpage\@gobble\fi% -%</class> +\NewDocumentCommand\GitHubRepo{s}{% + \IfBooleanTF{#1}{\toks@{\href}}{\toks@{\hrfn}}% + \addto@hook\toks@{{https://github.com/tud-cd/tudscr/releases}}% + \addto@hook\toks@{{\tud@english{GitHub-Repository~\Distribution*{tudscr}}}}% + \the\toks@\xspace% +} +\newcommand*\notudscrartcl{% + F\"ur die Klassen \Class{tudscrartcl} sowie \Class{tudscrposter} ist diese + Option nicht verf\"ugbar.% } -\renewrobustcmd*\seealso[2]{% - \ifstr{#1}{*}{\emph{\alsoname}~#2}{\emph{\alsoname}~#1}% +%</class> +\NewDocumentCommand\scrguide{sO{\KOMAScript-Handbuch}}{% + \IfBooleanTF{#1}{\toks@{\href}}{\toks@{\hrfn}}% + \addto@hook\toks@{% + {http://mirrors.ctan.org/macros/latex/contrib/koma-script/doc/scrguide.pdf}% + }% + \addto@hook\toks@{{#2}}% + \the\toks@\xspace% } % \end{macrocode} -% \end{macro}^^A \seealso -% \end{macro}^^A \see +% \end{macro}^^A \scrguide +% \end{macro}^^A \notudscrartcl +% \end{macro}^^A \GitHubRepo +% \end{macro}^^A \CTAN +% \end{macro}^^A \Forum +% \end{macro}^^A \Attention % % \iffalse %</body> -%</!doc> %<*body|doc> % \fi % -% \section{Verschiedenes für die Dokumentationklassen} -% -% \begin{macro}{\vTUDScript} -% \begin{macro}{\vKOMAScript} % \begin{macro}{\CD} % \begin{macro}{\CDs} % \begin{macro}{\TUD} % \begin{macro}{\TnUD} +% \begin{macro}{\TUDCD} +% \changes{v2.05}{2015/11/01}{neu}^^A +% \begin{macro}{\TUDCDs} +% \changes{v2.05}{2015/11/01}{neu}^^A % \begin{macro}{\DDC} % Diese Befehle stellen regelmäßig in der Quelltextdokumentatuion und im % Handbuch genutzte Textbausteine bereit. Dazu wird der Befehl \cs{xspace} aus % dem \pkg{xspace}-Paket genutzt. % \begin{macrocode} -\RequirePackage{xspace}[2009/10/20] -\xspaceaddexceptions{"=} -% \end{macrocode} -% Der Befehl \cs{vTUDScript} enthält die aktuelle \TUDScript"=Versionsnummer. -% \begin{macrocode} -\newcommand*\vTUDScript{} -\AtBeginDocument{% - \def\@tempb#1 #2 #3\relax#4\relax{\def\vTUDScript{#2}}% - \edef\@tempa{\TUDVersion}% - \expandafter\@tempb\@tempa\relax? ? \relax\relax% -} -\newcommand*\vKOMAScript{v3.17\xspace} -% \end{macrocode} -% Ganz zum Schluss noch Bugfixes für unterschiedliche Pakete. -% \begin{macrocode} -\RequirePackage{scrhack}[2014/02/27] -% \end{macrocode} -% \dots und der Rest. -% \begin{macrocode} -\newcommand*\CD{Corporate Design\xspace} -\newcommand*\CDs{Corporate Designs\xspace} +\newcommand*\CD{\tud@english{Corporate Design}\xspace} +\newcommand*\CDs{\tud@english{Corporate Designs}\xspace} \newcommand*\TUD{Technische Universit\"at Dresden\xspace} \newcommand*\TnUD{Technischen Universit\"at Dresden\xspace} -\newcommand*\DDC{% - \mbox{D\kern.05em R\kern.05em E\kern.05em S\kern.05em D\kern.05em E\kern.05em - N\kern.1em-\kern.1em concept}\xspace% -} -\AfterPackage*{babel}{% - \@expandtwoargs\in@{,english,}{,\bbl@loaded,}% - \ifin@% - \renewcommand*\CD{\foreignlanguage{english}{Corporate Design}\xspace} - \renewcommand*\CDs{\foreignlanguage{english}{Corporate Designs}\xspace} - \fi +\newcommand*\TUDCD{\CD der \TnUD} +\newcommand*\TUDCDs{\CDs der \TnUD} +%<doc>\AtBeginDocument{% +\newrobustcmd*\DDC{% + \mbox{% + D\kern.05em R\kern.05em E\kern.05em S\kern.05em % + D\kern.05em E\kern.05em N\kern.1em-\kern.1em concept% + }\xspace% } +%<doc>} % \end{macrocode} % \end{macro}^^A \DDC +% \end{macro}^^A \TUDCDs +% \end{macro}^^A \TUDCD % \end{macro}^^A \TnUD % \end{macro}^^A \TUD % \end{macro}^^A \CDs % \end{macro}^^A \CD -% \end{macro}^^A \vKOMAScript -% \end{macro}^^A \vTUDScript +% \begin{macro}{\Univers} +% \begin{macro}{\DIN} +% Für die Nennung der Schriften spezielle Markos bereitgestellt. +% \begin{macrocode} +\newcommand*\Univers{\texorpdfstring{\textubn{Univers}}{Univers}\xspace} +\newcommand*\DIN{\texorpdfstring{\textdbn{DIN~BOLD}}{DIN BOLD}\xspace} +% \end{macrocode} +% \end{macro}^^A \DIN +% \end{macro}^^A \Univers % % \iffalse %</body|doc> %<*body> % \fi % -% \begin{macro}{\Univers} -% \begin{macro}{\DIN} -% \begin{macro}{\Attention} -% \changes{v2.02}{2014/08/16}{neu}^^A -% \begin{macro}{\Forum} -% \begin{macro}{\GitHubRepo} -% \changes{v2.02}{2014/08/16}{neu}^^A % \begin{macro}{\textsbn} % \changes{v2.02}{2014/08/16}{neu}^^A % \begin{macro}{\sbnfont} @@ -3702,76 +5870,19 @@ % \changes{v2.02}{2014/08/16}{neu}^^A % \begin{macro}{\sbsfont} % \changes{v2.02}{2014/08/16}{neu}^^A -% \begin{macro}{\notudscrartcl} -% \begin{length}{\tempdim} -% \changes{v2.02}{2014/08/16}{neu}^^A -% \begin{macro}{\hrfn} -% \changes{v2.02}{2014/08/16}{neu}^^A -% \changes{v2.04}{2015/02/18}{Schriftgröße mit \cs{scalebox}}^^A -% \begin{macro}{\scrguide} -% \changes{v2.02}{2014/09/04}{neu}^^A -% Für die Anwenderdokumentation werden mehr Auszeichnungsbefehle vorgehalten. +% Für die Anwenderdokumentation werden weitere Auszeichnungsbefehle definiert. % \begin{macrocode} -\newcommand*\Univers{\textubn{Univers}\xspace} -\newcommand*\DIN{\textdbn{DIN~BOLD}\xspace} \newcommand*\textsbn{} -\newcommand*\sbnfont{\sffamily\bfseries\upshape} -\DeclareTextFontCommand\textsbn{\sffamily\bfseries\upshape} +\newrobustcmd*\sbnfont{\sffamily\bfseries\upshape} +\DeclareTextFontCommand\textsbn{\sbnfont} \newcommand*\textsbs{} -\newcommand*\sbsfont{\sffamily\bfseries\slshape} -\DeclareTextFontCommand\textsbs{\sffamily\bfseries\slshape} -\newcommand*\Attention[1]{\marginnote{\fbox{Achtung!}}\emph{#1}} -\NewDocumentCommand\Forum{s}{% - \IfBooleanTF{#1}{% - \url{http://latex.wcms-file3.tu-dresden.de/phpBB3/}% - }{% - \hrfn{http://latex.wcms-file3.tu-dresden.de/phpBB3/}{TUD-\LaTeX-Forum}% - }% - \xspace% -} -%<*class> -\NewDocumentCommand\GitHubRepo{s}{% - \def\@tempc{% - https://github.com/tud-cd/tudscr/releases% - }% - \IfBooleanTF{#1}{% - \href{\@tempc}{GitHub-Repository~\File*{tudscr}}% - }{% - \hrfn{\@tempc}{GitHub-Repository~\File*{tudscr}}% - }% - \xspace% -} -\newcommand*\notudscrartcl{% - F\"ur die Klasse \Class{tudscrartcl} ist diese Einstellung nicht verf\"ugbar. -} -\newlength\tempdim -%</class> -\newcommand*\hrfn[2]{\href{#1}{#2}\footnote{\scalebox{0.97}{\url{#1}}}} -\NewDocumentCommand\scrguide{s}{% - \def\@tempc{% - http://mirrors.ctan.org/macros/latex/contrib/koma-script/doc/scrguide.pdf% - }% - \IfBooleanTF{#1}{% - \href{\@tempc}{\File{scrguide.pdf}}% - }{% - \hrfn{\@tempc}{\File{scrguide.pdf}}% - }% - \xspace% -} +\newrobustcmd*\sbsfont{\sffamily\bfseries\slshape} +\DeclareTextFontCommand\textsbs{\sbsfont} % \end{macrocode} -% \end{macro}^^A \scrguide -% \end{macro}^^A \hrfn -% \end{length}^^A \tempdim -% \end{macro}^^A \notudscrartcl % \end{macro}^^A \sbsfont % \end{macro}^^A \textsbs % \end{macro}^^A \sbnfont % \end{macro}^^A \textsbn -% \end{macro}^^A \GitHubRepo -% \end{macro}^^A \Forum -% \end{macro}^^A \Attention -% \end{macro}^^A \DIN -% \end{macro}^^A \Univers % % \iffalse %</body> |