% \CheckSum{2999} % \iffalse meta-comment % % ============================================================================ % % TUD-KOMA-Script % Copyright (c) Falk Hanisch , 2012-2016 % % ============================================================================ % % This work may be distributed and/or modified under the conditions of the % LaTeX Project Public License, version 1.3c of the license. The latest % version of this license is in http://www.latex-project.org/lppl.txt and % version 1.3c or later is part of all distributions of LaTeX 2005/12/01 % or later and of this work. This work has the LPPL maintenance status % "author-maintained". The current maintainer and author of this work % is 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. % % ============================================================================ % % \fi % % \CharacterTable % {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z % Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z % Digits \0\1\2\3\4\5\6\7\8\9 % Exclamation \! Double quote \" Hash (number) \# % Dollar \$ Percent \% Ampersand \& % Acute accent \' Left paren \( Right paren \) % Asterisk \* Plus \+ Comma \, % Minus \- Point \. Solidus \/ % Colon \: Semicolon \; Less than \< % Equals \= Greater than \> Question mark \? % Commercial at \@ Left bracket \[ Backslash \\ % Right bracket \] Circumflex \^ Underscore \_ % Grave accent \` Left brace \{ Vertical bar \| % Right brace \} Tilde \~} % % \iffalse %%% From File: tudscr-manual.dtx %<*driver> \ifx\ProvidesFile\undefined\def\ProvidesFile#1[#2]{}\fi \ProvidesFile{tudscr-manual.dtx}[% 2015/07/02 v2.04 TUD-KOMA-Script\space% % %\NeedsTeXFormat{LaTeX2e} %\ProvidesPackage{tudscrman}[% %<*driver|package&identify> %!TUDVersion % package (internal tutorials)% ] % %<*driver> \RequirePackage[ngerman=ngerman-x-latest]{hyphsubst} \documentclass[english,ngerman]{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-} \CodelineIndex \RecordChanges \GetFileInfo{tudscr-manual.dtx} \begin{document} \maketitle \DocInput{\filename} \end{document} % % \fi % % \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 % % \section{Klasse und Paket für die Anwenderdokumentation von \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. % 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} % % \iffalse %<*!doc> %<*body> % \fi % % \subsection{Benötigte Pakete für die Anwenderdokumentation} % % 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. % % Das Paket \pkg{xparse} erlaubt eine sehr freie Deklaration von Makros mit % nahezu beliebig arrangierbaren (optionalen) Argumenten. % \begin{macrocode} \RequirePackage{xparse}[2013/12/31] % \end{macrocode} % 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}\recalctypearea % \end{macrocode} % Sprachunterstützung. % \begin{macrocode} \RequirePackage{babel}[2014/03/24] % \end{macrocode} % Sprachabhängiges Setzen von Anführungszeichen. % \begin{macrocode} \AfterPackage*{inputenc}{\RequirePackage{csquotes}[2011/10/22]} \AtBeginDocument{% \@ifpackageloaded{csquotes}{}{% %<*class> \ClassWarning% % %<*package> \PackageWarning% % {tudscrman}{Package `csquotes' not loaded}% \providecommand\enquote[1]{\glqg#1\grqq{}}% }% } % \end{macrocode} % Das Paket \pkg{microtype} wird für den optischen Randausgleich verwendet. % \begin{macrocode} \AfterPackage*{hyperref}{\RequirePackage[babel]{microtype}[2013/05/23]} % \end{macrocode} % \begin{length}{\baselineskipglue} % Diese Länge wird in der Dokumentation für alle möglichen stauch- und % dehnbaren Einfügen genutzt. % \begin{macrocode} \newlength\baselineskipglue \AtBeginDocument{% \setlength\baselineskipglue{% .4\baselineskip plus .4\baselineskip minus .2\baselineskip% }% } % \end{macrocode} % \end{length}^^A \baselineskipglue % Verbesserte Zitate. % \begin{macrocode} \PassOptionsToPackage{vskip=.5\baselineskipglue}{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} % Das Paket \pkg{marginnote} stellt nicht fließenden Randnotizen bereit. % \begin{macrocode} \RequirePackage{marginnote}[2012/03/29] % \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. % \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,% } % \end{macrocode} % Mit dem Paket \pkg{silence} lassen sich ungewollte bzw. lästige Warnungen % deaktivieren. % \begin{macrocode} \RequirePackage{silence}[2012/07/02] % \end{macrocode} % Das Pakete 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} % 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. % \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 % \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. % \begin{macrocode} \WarningFilter*{ifplatform}{^^J \space\space\space shell escape is disabled} \RequirePackage{ifplatform}[2010/10/22] % \end{macrocode} % 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. % \begin{macro}{\Email} % Hyperlink für die Angabe einer E-Mail-Adresse. % \begin{macrocode} \newcommand*\Email[1]{\href{mailto:#1}{\nolinkurl{#1}}} % \end{macrocode} % \end{macro}^^A \Email % 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}{\autorefname} % \begin{macro}{\@autorefname} % \begin{macro}{\@@autorefname} % 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 % vorgestellt und hier übernommen. % \begin{macrocode} \newcommand*\autorefname[1][current]{% \ifstr{#1}{current}{% \expandafter\HyPsd@@autorefname\@currentHref\@nil% }{% \@autorefname\HyPsd@@autorefname{#1}% }% \unskip\xspace% } \newcommand*\@autorefname[2]{% \expandafter\ifx\csname r@#2\endcsname\relax% ??% \else% \expandafter\expandafter\expandafter\@@autorefname% \csname r@#2\endcsname{}{}{}{}\@nil#1\@nil% \fi% } \newcommand*\@@autorefname{} \def\@@autorefname#1#2#3#4#5\@nil#6\@nil{#6#4.\@nil} % \end{macrocode} % \end{macro}^^A \@@autorefname % \end{macro}^^A \@autorefname % \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}} % % \end{macrocode} % Aus einem Tutorial erfolgen alle Querverweise mit \cs{manualhyperref} auf das % Anwenderhandbuch \enquote{tudscr}. % \begin{macrocode} %<*package> \newcommand*\manualhyperref[2]{\hyperref{../tudscr}{tudscr}{#1}{#2}} % % \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. % \begin{macrocode} } % \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. % \begin{macrocode} \PassOptionsToPackage{xindy,splitindex}{imakeidx} \RequirePackage{imakeidx}[2013/07/11]% \indexsetup{% %<*class> level=\addsec,% % %<*package> level=\subsection*,% % 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 % % \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. % \begin{macrocode} %<*class> \makeindex[title={Allgemeiner Index},options=\xdyopt]% % \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]% % \makeindex[title={Klassen, Pakete und Dateien},name=files,options=\xdyopt]% %<*class> \makeindex[title={\"Anderungsliste},name=changelog,columns=1,options=\xdyopt]% % % \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 } % \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} % Verbesserte Referenzierungen auf Seiten. % \begin{macrocode} \RequirePackage{varioref}[2011/10/02]% \renewcommand*\fullref[1]{\hyperref[#1]{\autoref*{#1} \vpageref{#1}}} % \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} % Befehle für die Dokumentation des Pakets \pkg{tudscrsupervisor}. % \begin{macrocode} \RequirePackage{tudscrsupervisor}[\TUDVersion] % \end{macrocode} % % \iffalse % %<*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] % \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{filecontents}[2011/10/08] \WarningFilter[Tutorial]{latex}{Overwriting file}% % \end{macrocode} % % \iffalse % % %<*option> % \fi % % \subsection{Optionen der Anwenderdokumentation} % % 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{macrocode} \newif\if@tud@todo \@tud@todotrue \newcommand*\tud@todo@type{} \TUD@key{ToDo}[true]{% \TUD@set@ifkey{ToDo}{@tud@todo}{#1}% \ifx\FamilyKeyState\FamilyKeyStateProcessed% \let\tud@todo@type\relax% \else% \def\tud@todo@type{#1}% \@tud@todotrue% \FamilyKeyStateProcessed% \fi% } % \end{macrocode} % \end{macro}^^A \tud@todo@type % \end{macro}^^A \if@tud@todo % \end{option}^^A ToDo % % \iffalse %<*class> % \fi % % Es werden einige Optionen für das Handbuch standardmäßig aktiviert. Dazu % werden diese an die entsprechende Elternklasse übergeben. % \begin{macrocode} \PassOptionsToClass{% cdfoot=true,% chapterpage=true,% chapterprefix=true,% headings=optiontoheadandtoc,% captions=tableheading,% numbers=noenddot,% cd=color,% }{\TUDClassName@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 % %<*package> % \fi % % Wird das Paket \pkg{tudscrman} geladen, werden zu Beginn des Dokumentes ein % paar Standardeinstellungen gemacht. % % \begin{macrocode} \KOMAoptions{headings=small} \TUDoptions{cd=true,cdfoot=true} % \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. % \begin{macrocode} \AfterPackage*{pstricks}{% \ifnum\pdfshellescape=\@ne\relax\else% \PassOptionsToPackage{off}{auto-pst-pdf}% \fi% \RequirePackage{auto-pst-pdf}[2009/04/26]% } % \end{macrocode} % % \iffalse % % %<*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. % \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]}}} % \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} % % \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} %<*class> \newrobustcmd*\hypertut[2]{% \hyperref{tutorials/#1.pdf}{\jobname}{tutorials:#1}{\textsbn{#1.pdf}#2}% } \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. % \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% % \end{macrocode} % Hier erfolgt die Unterscheidung der Befehle für die unterschiedlichen OS. % \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}% \fi% }% \fi% % \end{macrocode} % Hyperlink und Indexeintrag. % \begin{macrocode} \IfFileExists{tutorials/#2.pdf}{% \hypertut{#2}{}% }{% \textsbn{#2.pdf}% \tud@shellescape@wrn% }% \IfBooleanF{#1}{% \index[files]{\hypertut{#2}{~{\idxfont(Tutorial)}}\IfValueT{#3}{|#3}}% }% } % % \end{macrocode} % Der Befehl für die Querverweise innerhalb von Tutorials. % \begin{macrocode} %<*package> \newcommand*\Tutorial[1]{\href{#1.pdf}{\textsbn{#1.pdf}}} % % \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. % \begin{macrocode} \newcommand*\IncludeExample[1]{% \lstinputlisting[style=tudscr]{examples/#1}% % \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 }% }% \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% }% } % \end{macrocode} % \end{macro}^^A \IncludeExample % % \iffalse % % \fi % % \subsubsection{ToDo-Liste} % % \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% % \end{macrocode} % Die boolschen Schlüssel. % \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}}{}% }% % \end{macrocode} % In \cs{@ToDo} wird das optionale Argument für \pkg{todonotes} gesichert. % \begin{macrocode} \def\@ToDo{}% \IfValueTF{#2}{% \IfBooleanTF{#1}{\edef\@ToDo{#2,nolist}}{\edef\@ToDo{#2}}% }{% \IfBooleanT{#1}{\edef\@ToDo{nolist}}% }% % \end{macrocode} % Damit die Randnotiz nicht verrutscht, wird \cs{marginnote} anstelle von % \cs{marginpar} verwendet. % \begin{macrocode} \renewcommand*\marginpar[2][]{% \marginnote[##1]{##2}[\dimexpr-1.6ex+1pt\relax]% }% % \end{macrocode} % Die Ausgabe erfolgt entweder für alle ToDo-Notizen oder nur den per Option % festgelegten Typ. % \begin{macrocode} \@tempswafalse \ifdefvoid{\tud@todo@type}{\@tempswatrue}{}% \IfValueT{#2}{% \@for\@tempa:=#2\do{\ifstr{\@tempa}{\tud@todo@type}{\@tempswatrue}{}}% }% % \end{macrocode} % Vor der Ausgabe ist eine vertikale Verschiebung um den durch \pkg{todonotes} % definierten Leerraum notwendig. % \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% } % \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. % \begin{macrocode} \newcommand*\ListOfToDo{\if@tud@todo\listoftodos\fi} \reversemarginpar % \end{macrocode} % \end{macro}^^A \ListOfToDo % \end{macro}^^A \@ToDo % \end{macro}^^A \ToDo % % \subsubsection{Kleinkram} % % \begin{macro}{\bsc} % \changes{v2.02}{2014/07/22}{\cs{newrobustcmd} aus \pkg{etoolbox} anstelle von % \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{macrocode} \newcommand*\tud@shellescape@wrn{% %<*class> \ClassWarning% % %<*package> \PackageWarning% % {tudscrman}{% You have to recompile this document with\MessageBreak% activated shell escape option% }% \global\let\tud@shellescape@wrn\relax% } % \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{macrocode} % Den Anfang mach gleich \cs{TUDScript}. % \begin{macrocode} \newcommand*\@TUDScript{TUD-KOMA-Script} \pdfexpandableoutline{TUDScript} % \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. % \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}}% }% }% } \DeclareExpandableDocumentCommand\@Application{sm}{#2} \pdfexpandableoutline{Application} % %<*package> \newcommand*\Application[1]{\ifdin{#1}{\mbox{\textsbs{#1}}}} % % \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}}% }% }% } % %<*package> \newcommand*\Distribution[1]{\ifdin{#1}{\mbox{\textsbn{#1}}}} % % \end{macrocode} % \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}}} % \end{macrocode} % \end{macro}^^A \Path % \begin{macro}{\File} % \changes{v2.02}{2014/10/08}{überarbeitet}^^A % 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}}% }% }% } % %<*package> \newcommand*\File[1]{\ifdin{#1}{\mbox{\textsbn{#1}}}} % % \end{macrocode} % \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}% \else% \ifdin{#2}{% \SetIndexFormat{#1}{#4}% \@ProcessOutput{\textsbn{#2}}'#3'% {files}[\protect\sbnfont]{#2}[~{\idxfont(Klasse)}]% }% \fi% } % %<*package> \NewDocumentCommand\Class{sm}{% \ifdin{#2}{% \IfBooleanTF{#1}{% \manualhyperref{files:#2}{\textsbn{#2}}% }{% \textsbn{#2}% }% \index[files]{\begingroup\protect\sbnfont#2\endgroup~{\idxfont(Klasse)}}% }% } % \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 % \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. % \begin{macrocode} %<*class> \newcommand*\@TempPackage{} \NewDocumentCommand\Package{smd''d()d||}{% \if@changelog% \@ProcessChangedAt{#1}{files}{\protect\sbnfont}{#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% } % %<*package> \NewDocumentCommand\Package{smd()}{% \ifdin{#2}{% \IfBooleanTF{#1}{% \manualhyperref{files:#2}{\textsbn{#2}}% }{% \IfValueTF{#3}{% \href{http://www.ctan.org/pkg/#3}{\textsbn{#2}}% }{% \href{http://www.ctan.org/pkg/#2}{\textsbn{#2}}% }% }% \index[files]{\begingroup\protect\sbnfont#2\endgroup~{\idxfont(Paket)}}% }% } % \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} % \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. % \begin{macrocode} %<*class> \newcommand*\@TempOption{} \NewDocumentCommand\Option{smod''d||}{% \if@changelog% \@ProcessChangedAt{#1}{options}{\ttfamily}{#2}{Option}% \else% \IfValueTF{#3}{\gdef\@TempOption{\texttt{=#3}}}{\gdef\@TempOption{}}% \SetIndexFormat{#1}{#5}% \@ProcessOutput{\texttt{#2}}[\@TempOption]'#4'{options}[\ttfamily]{#2}% \fi% } % %<*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}% }% } % \DeclareExpandableDocumentCommand\@Option{sm}{#2} \pdfexpandableoutline{Option} % \end{macrocode} % \end{macro}^^A \@TempOption % \end{macro}^^A \@Option % \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. % \begin{macrocode} %<*class> \newcommand*\@TempEnvironment{} \NewDocumentCommand\Environment{smod''d||}{% \if@changelog% \@ProcessChangedAt{#1}{macros}{\ttfamily}{#2}{Umgebung}% \else% % \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}% \fi% } % %<*package> \NewDocumentCommand\Environment{sm}{% \ifdin{#2}{% \IfBooleanTF{#1}{% \manualhyperref{macros:#2}{\texttt{#2}}% }{% \texttt{#2}% }% \index[macros]{\begingroup\ttfamily#2\endgroup}% }% } % \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} %<*class> \NewDocumentCommand\Macro{smd''d||}{% \if@changelog% \@ProcessChangedAt{#1}{macros}{\ttfamily\bsc}{#2}{Befehl}% \else% \SetIndexFormat{#1}{#4}% \@ProcessOutput{\texttt{\bsc#2}}'#3'{macros}[\ttfamily\bsc]{#2}% \fi% } % %<*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}% }% } % \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 % Die Auszeichnung und der Indexeintrag einer \LaTeX-Länge. % \begin{macrocode} %<*class> \NewDocumentCommand\Length{smd''d||}{% \if@changelog% \@ProcessChangedAt{#1}{macros}{\ttfamily\bsc}{#2}{L\"ange}% \else% \SetIndexFormat{#1}{#4}% \@ProcessOutput{\texttt{\bsc#2}}[\if@declare~{\idxfont(L\"ange)}\fi]'#3'% {macros}[\ttfamily\bsc]{#2}[~{\idxfont(L\"ange)}]% \fi% } % %<*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)}}% }% } % % \end{macrocode} % \end{macro}^^A \@TempLength % \end{macro}^^A \Length % % \iffalse %<*class> % \fi % % \minisec{Exklusive Auszeichnungen für die Klasse} % Alle weiteren Befehle werden ausschließlich für die Klasse \cls{tudscrman} % definiert. % % \begin{macro}{\Key} % \changes{v2.02}{2014/10/08}{überarbeitet}^^A % \begin{macro}{\@TempKey} % 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. % \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% } % \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}% \else% \SetIndexFormat{#1}{#4}% \@ProcessOutput{\texttt{#2}}[\if@declare~{\idxfont(Z\"ahler)}\fi]% {macros}[\ttfamily]{#2}[~{\idxfont(Z\"ahler)}]% \fi% } % \end{macrocode} % \end{macro}^^A \@TempCounter % \end{macro}^^A \Counter % \begin{macro}{\Term} % \changes{v2.02}{2014/10/08}{überarbeitet}^^A % \begin{macro}{\@TempTerm} % \changes{v2.02}{2014/10/08}{entfernt}^^A % Die Auszeichnung und der Indexeintrag eines sprachabhängigen Bezeichners. % \begin{macrocode} \NewDocumentCommand\Term{smd''d||}{% \if@changelog% \@ProcessChangedAt{#1}{terms}{\ttfamily\bsc}{#2}{Bezeichner}% \else% \SetIndexFormat{#1}{#4}% \@ProcessOutput{\texttt{\bsc#2}}[\if@declare~{\idxfont(Bezeichner)}\fi]'#3'% {terms}[\ttfamily\bsc]{#2}% \fi% } % \end{macrocode} % \end{macro}^^A \@TempTerm % \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{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% } % \end{macrocode} % \end{macro}^^A \@termlist % \end{macro}^^A \@@TermTable % \end{macro}^^A \@TermTable % \end{macro}^^A \TermTable % \begin{macro}{\Font} % \changes{v2.02}{2014/10/08}{überarbeitet}^^A % \begin{macro}{\@TempFont} % \changes{v2.02}{2014/10/08}{entfernt}^^A % Die Auszeichnung und der Indexeintrag eines Schriftelementes. % \begin{macrocode} \NewDocumentCommand\Font{smd''d||}{% \if@changelog% \@ProcessChangedAt{#1}{fonts}{\ttfamily}{#2}{Schriftelement}% \else% \SetIndexFormat{#1}{#4}% \@ProcessOutput{\texttt{#2}\if@declare~{\idxfont(Schriftelement)}\fi}% {fonts}[\ttfamily]{#2}% \fi% } % \end{macrocode} % \end{macro}^^A \@TempFont % \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}% \else% \SetIndexFormat{#1}{#5}% \@ProcessOutput{\texttt{#2}}[% \IfValueT{#3}{~\texttt{(#3)}}\if@declare~{\idxfont(Farbe)}\fi% ]'#4'{colors}[\ttfamily]{#2}% \fi% } % \end{macrocode} % \end{macro}^^A \@TempColor % \end{macro}^^A \Color % Damit ist das Intermezzo mit Auszeichnungsbefehlen speziell für die Klasse % beendet. % % \iffalse % % \fi % % \iffalse %<*class> % \fi % % \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% }% }% }% } % \end{macrocode} % Der Befehl \cs{SetIndexFormat} setzt das gewünschte Format für den jeweilgen % Indexeintrag. % \begin{macrocode} \newcommand*\SetIndexFormat[2]{% \CheckIndexFormat{#1}{#2}% \IfBooleanTF{#1}{% \def\@IndexFormat{#1}% }{% \IfValueTF{#2}{\def\@IndexFormat{#2}}{\def\@IndexFormat{}}% }% } % \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. % \begin{macrocode} \newif\if@declare \newif\if@stareddeclare \newif\if@openindex \newif\if@deprecated % \end{macrocode} % \end{macro}^^A \if@deprecated % \end{macro}^^A \if@openindex % \end{macro}^^A \if@stareddeclare % \end{macro}^^A \if@declare % % \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. % % \begin{macro}{\@ProcessOutput} % \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: % \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} % \endgroup % \begin{macrocode} \NewDocumentCommand\@ProcessOutput{mod''d()md()omo}{% % \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}. % \begin{macrocode} \if@declare% \if@openindex% \IfValueT{#3}{% \ClassWarning{tudscrman}{% It is not possible to use any cross-reference\MessageBreak% shorthand like '#3' within the arguments of\MessageBreak% the environment `Declaration'% }% }% % \end{macrocode} % Das zu erzeugende Label wird definiert. % \begin{macrocode} \IfValueTF{#6}{\edef\@tempa{#5:#6:#8}}{\edef\@tempa{#5:#8}}% % \end{macrocode} % Für die Deklaration veralteter Optionen, Befehle etc. kann die Sternvariante % des Auszeichnungsbefehls verwendet werden, um das Erzeugen eines Labels zu % unterbinden. % \begin{macrocode} \if@deprecated% \expandafter\IfBooleanF\expandafter{\@IndexFormat}{% \manualhyperdef{\@tempa}% }% % \end{macrocode} % Wurde die Sternversion eines Auszeichnungsbefehls innerhalb der Umgebung % \env{Declaration} genutzt, wird lediglich ein Label aber kein Eintrag im % Index erzeugt. % \begin{macrocode} \else% \expandafter\IfBooleanTF\expandafter{\@IndexFormat}{% \manualhyperdef{\@tempa}% % \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'% }% \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}% % \end{macrocode} % Andernfalls wird der normale Hyperlink gesetzt. Das Label zum Prüfen wird % implizit durch \cs{manualhyperdef} gesetzt. % \begin{macrocode} \else% \manualhyperdef{\@tempa}% \fi% \@HyperIndex{#5}{#6}{#7}{#8}{#9}{(declare}% }% \fi% % \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. % \begin{macrocode} \if@stareddeclare\else% #1\IfValueT{#2}{#2}% \fi% % \end{macrocode} % Zum Ende der \env{Declaration}"=Umgebung wird der Indexeintrag beendet. % \begin{macrocode} \else% \if@deprecated\else% \expandafter\IfBooleanF\expandafter{\@IndexFormat}{% \@HyperIndex{#5}{#6}{#7}{#8}{#9}{declare)}% }% \fi% \fi% \else% % \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. % \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% % \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}). % \begin{macrocode} \IfValueTF{#6}{\edef\@tempa{#5:#6:#8}}{\edef\@tempa{#5:#8}}% \ifcsdef{r@\@tempa}{% % \end{macrocode} % 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. % \begin{macrocode} \let\@tempb\relax% \def\@tempc{\mbox{\hyperref{}{\jobname}{\@tempa}{#1}\IfValueT{#2}{#2}}}% \IfValueT{#3}{% \def\@tempb{% \ClassWarning{tudscrman}{% You've used the unknown cross-reference\MessageBreak% shorthand '#3'. Only 'auto', 'page'\MessageBreak% and 'full' as well as 'none' 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}}}% }{}% }% \@tempc\@tempb% }{% % \end{macrocode} % Wurde ein Format für den Querverweis gesetzt und es existiert kein passendes % Label, wird eine Warnung ausgegeben. % \begin{macrocode} \IfValueT{#3}{% \ClassWarning{tudscrman}{% No cross-reference created, label \@tempa\space is missing% }% }% % \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. % \begin{macrocode} \IfValueTF{#4}{% \ifstr{#4}{}{\mbox{#1\IfValueT{#2}{#2}}}{% \href{http://www.ctan.org/pkg/#4}{\mbox{#1\IfValueT{#2}{#2}}}% }% }{% \mbox{#1\IfValueT{#2}{#2}}% }% }% \fi% % \end{macrocode} % Zum Schluss wird \cs{@IndexFormat} zurückgesetzt. % \begin{macrocode} \let\@IndexFormat\relax% } % \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: % \newline\begingroup\scriptsize % \cs{@HyperIndex}\marg{Index}\marg{Haupteintrag}\ignorespaces% % \marg{Vorsatz}\marg{Eintrag}\marg{Anhang}\marg{Formatierung} % \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{}}% % \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. % \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% \let\Environment\@firstofone% \def\Macro##1{\bsc##1}% \index[keys]{% \hyperidx[\@tempb]{% \begingroup\expandonce\@tempa#4\endgroup~{\idxfont(\texttt{#2})}% }% \expandonce\@tempc% }% \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% }% }% % \end{macrocode} % Falls es sich nicht um einen Parameter handelt, wird lediglich der Eintrag im % speziellen Index vorgenommen und ggf. ein Hyperlink erzeugt. % \begin{macrocode} }{% \ifcsdef{r@#1:#4}{% \index[#1]{% \hyperidx[#1:#4]{% \begingroup\expandonce\@tempa#4\endgroup\expandonce\@tempb% }% \expandonce\@tempc% }% }{% \index[#1]{% \begingroup\expandonce\@tempa#4\endgroup% \expandonce\@tempb\expandonce\@tempc% }% }% }% } % \end{macrocode} % \end{macro}^^A \@HyperIndex % % \subsubsection{Deklarationen} % % 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{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. % \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% } % \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. % % 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}. % \begin{macrocode} \NewDocumentEnvironment{Declaration}{omoog}{% \listadd\@declarationlist{#2}% % \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. % \begin{macrocode} \@changedatdeclare{#1}{#2}% % \end{macrocode} % Hier noch die Listen für Voreinstellungen\dots % \begin{macrocode} \IfValueTF{#3}{% \@presetlisttrue% \IfValueTF{#4}{% \def\@tempa[##1:##2]{##1:\,##2}% \listeadd\@presetlist{preset:\,#3\,|\,\expandonce{\@tempa[#4]}}% }{% \listadd\@presetlist{preset:\,#3}% }% }{% \listadd\@presetlist{\relax}% }% % \end{macrocode} % \dots sowie zusätliche Informationen. % \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% }% }{% % \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. % \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?% }% \fi% \@gobbleparameters% \vskip-\lastskip% \@declaretrue\@openindexfalse#2\@declarefalse% \pagebreak[0]% } % \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. % \begin{macrocode} \NewDocumentCommand\printdeclarationlist{sod()}{% \ifx\@declarationlist\relax\else% \ifvmode\else\par\fi% \addpenalty{\@beginparpenalty}% \addvspace{1.5\baselineskipglue}% % \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. % \begin{macrocode} \IfBooleanTF{#1}{% \global\@deprecatedtrue% \renewcommand*\@changedatdeclaredefault{\emph{entf\"allt}|deprecated}% }{% \global\@deprecatedfalse% }% % \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{macrocode} % Wurde das optionale Argument angegeben und die Zusatzliste war leer, so wird % der Schalter \cs{@additionallisttrue} gesetzt. % \begin{macrocode} \@additionallisttrue% \let\@additionallist\relax% \protected@edef\@tempa{#2}% % \end{macrocode} % Die Standardformatierung der Zusatzinformationen. % \begin{macrocode} \protected@edef\@tempb{\hspace*{\tabcolsep}\protect\small}% \def\@tempc##1{% \listeadd\@additionallist{\expandonce\@tempb(\expandonce\@tempa)}% }% \forlistloop\@tempc{\@declarationlist}% \fi% }% \@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. % \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}% }% \fi% \if@additionallist% \begin{tabular}{@{}l@{}}% \forlistloop\@tempa{\@additionallist}% \end{tabular}% \fi% }{}% % \end{macrocode} % Alle für die Deklaration verwendeten Listen werden nach ihrer Abarbeitung % zurückgesetzt. % \begin{macrocode} \global\let\@declarationlist\relax% \global\let\@presetlist\relax% \global\@presetlistfalse% \global\let\@additionallist\relax% \global\@additionallistfalse% % \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} \printchangedatlist*[% \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{#3}{#3}% \par\nobreak% \vskip 1.5\baselineskipglue% \@afterindentfalse\@afterheading% \fi% } % \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 % 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?% }% \fi% \global\@deprecatedfalse% \@gobbleparameters% \@declaretrue\@openindexfalse#2\@declarefalse% } % \end{macrocode} % \end{environment}^^A Declaration* % \begin{environment}{tabularm} % \begin{macro}{\allcolumnpar} % \begin{macro}{\@allcolumnpar} % \begin{macro}{\tabularm@box} % \begin{macro}{\tabularm@num} % \begin{length}{\tabularm@wd} % Die Umgebung \env{tabularm} ist eine Erweiterung der \env{tabularm}-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. % \begin{macrocode} \newsavebox\tabularm@box \newlength\tabularm@wd \newcommand*\tabularm@num{1} \NewEnviron{tabularm}[1]{% \begin{lrbox}{\tabularm@box}% \let\allcolumnpar\@gobble% \begin{tabular}{*{#1}l}\BODY\end{tabular}% \end{lrbox}% \setlength\tabularm@wd{\wd\tabularm@box}% \def\tabularm@num{#1}% \let\allcolumnpar\@allcolumnpar% \begin{tabular}{*{#1}l}\BODY\end{tabular}% } \newcommand*\@allcolumnpar[1]{% \multicolumn{\tabularm@num}{@{}p{\tabularm@wd}@{}}{#1}% } % \end{macrocode} % \end{length}^^A \tabularm@wd % \end{macro}^^A \tabularm@box % \end{macro}^^A \tabularm@num % \end{macro}^^A \@allcolumnpar % \end{macro}^^A \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. % \begin{macrocode} \newcommand*\itemfalse{\def\tud@item@val{false/off/no}\item} \newcommand*\itemtrue{\def\tud@item@val{true/on/yes}\item} % \end{macrocode} % Mit der neuen Definition kann der Säumniswert mit \cs{item*} explizit in der % Liste hervorgehoben werden. % \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% }{% \let\tud@item@add\relax% \let\tud@item@format\relax% \tud@@item% }% } % \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}% } % \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% ]% } % \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. % % \begin{environment}{Example} % \begin{environment}{Example*} % Diese Umgebung wird für die exemplarische Erläuterung von bestimmten Aspekten % im Handbuch verwendet. Wenn dafür ein Quelltextauszug nötig ist, kann % innerhalb dieser die \env{Code}-Umgebung genutzt werden. Die Sternversion % unterdrückt dabei das Zurücksetzen des eigentlich entfernten vertikalen % Abstandes. % \begin{macrocode} \newenvironment{Example}{\@nameuse{Example*}}{% \@nameuse{endExample*}% \addvspace{-\topsep}% } \newenvironment{Example*}{% \labeling{{\usekomafont{disposition}Beispiel:\ }}% \item[{\usekomafont{disposition}Beispiel:\ }]% }{% \endlabeling% } % \end{macrocode} % \end{environment}^^A Example* % \end{environment}^^A Example % \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. % \begin{macrocode} \lstnewenvironment{Code}[1][]{\lstset{style=tudscr,#1}}{} % \end{macrocode} % Innerhalb der Umgebung \env{Code} wird \cs{@currentHref} unerwünschter Weise % geändert. Um dies zu vermeiden, wird dieser Befehl gesichert und anschließend % zurückgesetzt. % \begin{macrocode} \newcommand*\tud@currentHref{} \BeforeBeginEnvironment{Code}{\global\let\tud@currentHref\@currentHref} \AfterEndEnvironment{Code}{\global\let\@currentHref\tud@currentHref} % \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} % % 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. % }[?] % % \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% }% }% } % \end{macrocode} % Die Änderungsnotiz für die Implementierung wird erst an den Ausrufezeichen % in einzelne Argumente getrennt\dots % \begin{macrocode} \NewDocumentCommand\ChangedAt@Split{>{\SplitArgument{2}{!}}m}{% \ChangedAt@@Split#1% } % \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. % \begin{macrocode} \newcommand*\ChangedAt@@Split[3]{% \in@{*}{#1}% \ifin@% \listadd\@changedatdeclarelist{Allgemein!#2}% \else% \listadd\@changedatdeclarelist{% Implementierung!#2!\IfValueTF{#3}{#3}{\@changedatdeclaredefault}!#1% }% \fi% } % \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. % \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% }% \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. % \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% }% \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% }% } % \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. % \begin{macrocode} \NewDocumentCommand\ChangedAt@Process@Split{>{\SplitArgument{3}{!}}m}{% \ChangedAt@@Process#1% } % \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}. % \begin{macrocode} \newcommand*\ChangedAt@@Process[4]{% \IfValueTF{#4}{% % \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. % \begin{macrocode} \begingroup% \@gobbleparameters% \xdef\ChangedAt@Default{#4}% \endgroup% \ChangedAt@@@Process{#2}{#1}{\ChangedAt@Default: #3}% }{% % \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}. % \begin{macrocode} \IfValueT{#3}{\ChangedAt@@@Process{#2}{#1}{#3}}% }% % \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}}% } % \end{macrocode} % Mit \cs{ChangedAt@@@Process} Erfolgen die Einträge in die Änderungsliste. % \begin{macrocode} \newcommand*\ChangedAt@@@Process[3]{% \begingroup% % \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. % \begin{macrocode} \NewDocumentCommand\Replace{ommm}{% % \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. % \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% }% % \end{macrocode} % Und ggf. der Eintrag im Index. % \begin{macrocode} \IfValueT{#1}{\index[#1]{\@tempa|see{#3}}}% \fi% }% } % \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. % \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}% }{% \def\@tempb{\begingroup#4#5\endgroup~{\idxfont(#6)}}% }% \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. % \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}}% } % \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. % \begin{macrocode} \if@listsorted% \expandafter\edef\expandafter\@tempb\expandafter{\@tempb,\@tempa}% \else% % \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. % \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% % \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. % \begin{macrocode} \ifx\@tempb\@empty% \expandafter\edef\expandafter\@tempb\expandafter{\@tempa}% \else% \expandafter\edef\expandafter\@tempb\expandafter{\@tempb,\@tempa}% \fi% \fi% \fi% }% % \end{macrocode} % Wurde der Eintrag nach dem Durchlaufen der Liste nicht eingefügt, so erfolgt % dies hier am Ende der Liste. % \begin{macrocode} \if@listsorted\else% \expandafter\edef\expandafter\@tempb\expandafter{\@tempb,#1}% \fi% % \end{macrocode} % Die temporäre Liste \cs{@tempb} wird auf \cs{@sortedlist} überschrieben. % \begin{macrocode} \let\@sortedlist\@tempb% \fi% } % \end{macrocode} % \end{macro}^^A \if@listsorted % \end{macro}^^A \@sortedlist % \end{macro}^^A \@sortlist % \end{macro}^^A \sortlist % % \iffalse % %<*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. % \begin{environment}{Preamble} % \changes{v2.02}{2014/11/02}{neu}^^A % \begin{environment}{Preamble*} % \changes{v2.02}{2014/11/03}{neu}^^A % \begin{environment}{Preamble+} % \changes{v2.02}{2014/11/03}{neu}^^A % Die Umgebung \env{Preamble} dient für die Ausgabe von Quelltexten, welche in % einem \LaTeXe-Dokument in der Präambel verwendet werden müssen oder sollten. % Die in ihr gesetzten Inhalte werden für das Copy"~\&"~Paste-Beispiel vor den % Inhalten aus der Umgebung \env{Trunk} ausgegeben. Die Sternversion führt % den Inhalt zusätzlich im Dokument aus. Die Pluszechen"=Version fügt dem % Ausgabestream ihren Inhalt hinzu, ohne das dieser ausgegeben oder ausgeführt % wird. % \begin{macrocode} \newenvironment{Preamble}{\tud@tut@pre}{% \tud@tut@post% \tud@tut@append{\tud@write@i}% \gdef\@tempa{% \tud@tut@lst% \global\let\@CodePreamble\relax% }% \aftergroup\@tempa% } \newenvironment{Preamble*}{\tud@tut@pre}{% \tud@tut@post% \tud@tut@append{\tud@write@i}% \gdef\@tempa{% \tud@tut@lst% \tud@tut@input% \global\let\@CodePreamble\relax% }% \aftergroup\@tempa% } \newenvironment{Preamble+}{\tud@tut@pre}{% \tud@tut@post% \tud@tut@append{\tud@write@i}% \gdef\@tempa{% \global\let\@CodePreamble\relax% }% \aftergroup\@tempa% } % \end{macrocode} % \end{environment}^^A Preamble+ % \end{environment}^^A Preamble* % \end{environment}^^A Preamble % \begin{environment}{Trunk} % \changes{v2.02}{2014/08/16}{neu}^^A % \begin{environment}{Trunk*} % \changes{v2.02}{2014/08/19}{neu}^^A % \begin{environment}{Trunk+} % \changes{v2.02}{2014/11/03}{neu}^^A % \begin{environment}{Trunk!} % \changes{v2.02}{2014/10/07}{neu}^^A % Die Umgebung \env{Trunk} dient zur Ausgabe von exemplarischen Quelltexten, % welche in einem \LaTeXe-Dokument innerhalb der \env{document}-Umgebung % verwendet werden müssen oder sollten. Für das Copy"~\&"~Paste-Beispiel werden % die gegebenen Inhalte nach den Inhalten aus der Umgebung \env{Preamble} % ausgegeben. Die Sternversion der Umgebung führt ihren Inhalt zusätzlich im % Dokument aus. Die Pluszeichen"=Version fügt dem Ausgabestream ihren Inhalt % hinzu, ohne diesen auszugeben oder auszuführen. Die Ausrufezeichen"=Version % fügt den Quelltext im Dokument ein und führt diesen zusätzlich in einer % separaten Datei mit einem minimalen Dokumentkörper aus, um daraus eine % PDF-Datei zu erzeugen, welche im Nachhinein mit \cs{IncludeStandalone} als % Grafik eingebunden werden kann. Dies ist für Quelltextabschnitte gedacht, % deren Ausgabe zu groß ist, um diese direkt anzuzeigen und dennoch dargestellt % werden sollen. % \begin{macrocode} \newenvironment{Trunk}{\tud@tut@pre}{% \tud@tut@post% \tud@tut@append{\tud@write@ii}% \gdef\@tempa{% \tud@tut@lst% \global\let\@CodePreamble\relax% }% \aftergroup\@tempa% } \newenvironment{Trunk*}{\tud@tut@pre}{% \tud@tut@post% \tud@tut@append{\tud@write@ii}% \gdef\@tempa{% \tud@tut@lst% \tud@tut@input% \global\let\@CodePreamble\relax% }% \aftergroup\@tempa% } \newenvironment{Trunk+}{\tud@tut@pre}{% \tud@tut@post% \tud@tut@append{\tud@write@ii}% \gdef\@tempa{% \global\let\@CodePreamble\relax% }% \aftergroup\@tempa% } \newenvironment{Trunk!}[1]{% \gdef\@StandaloneFile{#1}% \tud@tut@pre% }{% \tud@tut@post% \tud@tut@append{\tud@write@ii}% \gdef\@tempa{% \tud@tut@lst% \tud@tut@pdf% \global\let\@CodePreamble\relax% }% \aftergroup\@tempa% } % \end{macrocode} % \end{environment}^^A Trunk! % \end{environment}^^A Trunk+ % \end{environment}^^A Trunk* % \end{environment}^^A Trunk % \begin{environment}{Hint} % \changes{v2.02}{2014/09/16}{neu}^^A % \begin{environment}{Hint*} % \changes{v2.02}{2014/10/13}{neu}^^A % \begin{environment}{Hint?} % \changes{v2.02}{2014/12/09}{neu}^^A % \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 % Sternversion genutzt wurde~-- auch ausgeführt, allerdings nicht in das % Copy"~\&"~Paste"~Beispiel übernommen. Ansonsten entsprechen alle Umgebungen % in ihren Eigenschaften den äquivalenten \env{Trunk}-Umgebungen. Die Version % mit Fragezeichen ist für Quelltextauszüge gedacht, die ungeprüft \emph{vor} % dessen Ausgabe ausgeführt werden sollen. % \begin{macrocode} \newenvironment{Hint}{\tud@tut@pre}{% \tud@tut@post% \gdef\@tempa{% \tud@tut@lst% \global\let\@CodePreamble\relax% }% \aftergroup\@tempa% } \newenvironment{Hint*}{\tud@tut@pre}{% \tud@tut@post% \gdef\@tempa{% \tud@tut@lst% \tud@tut@input% \global\let\@CodePreamble\relax% }% \aftergroup\@tempa% } \newenvironment{Hint?}{\tud@tut@pre}{% \tud@tut@post% \gdef\@tempa{% \InputCode% \tud@tut@lst% \global\let\@CodePreamble\relax% }% \aftergroup\@tempa% } \newenvironment{Hint!}[1]{% \gdef\@StandaloneFile{#1}% \tud@tut@pre% }{% \tud@tut@post% \gdef\@tempa{% \tud@tut@lst% \tud@tut@pdf% \global\let\@CodePreamble\relax% }% \aftergroup\@tempa% } % \end{macrocode} % \end{environment}^^A Hint! % \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}% \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. % \begin{macrocode} \newcommand*\tud@tut@input{% % \end{macrocode} % Nach dem Ausführen des ersten Argumentes von \cs{@tempa} wird geprüft, ob % dieses überhaupt eine sichtbare Ausgabe erzeugt hat. Nur für diesen Fall wird % nach dieser vertikaler Leerraum eingefügt. Der Anfang entspricht prinzipiell % dem Standardbefehl \cs{settoheight}, jedoch wird im Inneren zusätzlich eine % \cs{vbox} verwendet, um damit auch mathematische Umgebungen testen zu können. % Das Ganze findet innerhalb einer Gruppierung statt, um keine Änderungen zu % erzeugen. % \begin{macrocode} \def\@tempa##1##2{% ##1% \begingroup% ##2% \setbox\@tempboxa\hbox{\vbox{##1}}% \@tempdima=\ht\@tempboxa% \setbox\@tempboxa\box\voidb@x% \ifdim\@tempdima>\z@\relax% \endgraf% \vspace{\baselineskipglue}% \noindent\ignorespaces% \fi% \endgroup% }% % \end{macrocode} % 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}{}% \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 % \cs{newcommand} zu Fehler führen. Mit dem Makro \cs{CodeHook} lassen sich % diese Konflikte durch eine lokale Redefinition ebensoclher Befehle auflösen % (bspw. \cs{let}\cs{newcommand}\cs{renewcommand}). % \begin{macrocode} \ActivateWarningFilters[Tutorial]% \@tempa{\input{\jobname-temp.tex}}{\@CodeHook}% \DeactivateWarningFilters[Tutorial]% \global\let\@CodeHook\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 % 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}} % \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% \ActivateWarningFilters[Tutorial]% \begin{filecontents*}{tutorial-temp.tex} \RequirePackage[ngerman=ngerman-x-latest]{hyphsubst} \documentclass[english,ngerman]{tudscrreprt} \usepackage[utf8]{inputenc} \usepackage[T1]{fontenc} \usepackage{babel} \usepackage{tudscrsupervisor} \usepackage{isodate} \usepackage{enumitem} \setlist{noitemsep} \begin{document} \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} % im weiteren Verlauf in das Tutorial eingebunden werden kann, wird diese noch % in \cs{\meta{Argument}-temp.pdf} umbenannt. % \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 }% \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% } % \end{macrocode} % \end{macro}^^A \tud@tut@pdf % \begin{macro}{\IncludeStandalone} % \changes{v2.02}{2014/09/10}{neu}^^A % Der Befehl \cs{IncludeStandalone} bindet die durch \env{Trunk!} generierten % PDF-Dateien ein. Das angehängte optionale Argument dient zur Angabe der % einzubindenden Seiten der PDF-Datei, wobei diese automatisch auf die passende % Breite skaliert werden. % \begin{macrocode} \NewDocumentCommand\IncludeStandalone{omO{1}}{% \IfFileExists{#2-temp.pdf}{% \@tempcnta\z@% \@for\@tempa:=#3\do{\advance\@tempcnta\@ne}% \ifnum\@tempcnta>\z@\relax% \setlength\@tempdima{\textwidth}% \divide\@tempdima\@tempcnta% \advance\@tempcnta\m@ne% \multiply\@tempcnta 2% \addtolength\@tempdima{-\@tempcnta\tabcolsep}% \@for\@tempa:=#3\do{% \advance\@tempcnta\m@ne% \edef\@tempb{% keepaspectratio,page=\@tempa,width=\the\@tempdima,% \IfValueT{#1}{#1}% } \fbox{\expandafter\includegraphics\expandafter[\@tempb]{#2-temp.pdf}}% \ifnum\@tempcnta>\z@\relax\hfill\fi% }% \fi% }{% \tud@shellescape@wrn% }% } % \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. % \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} } % \end{macrocode} % Der Befehl \cs{FinishTutorial} schleißt den noch offenen Ausgabestream und % gibt den vorgestellten Quelltext vollständig aus. % \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}% } % \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. % \begin{macrocode} \if@tempswa% \immediate\write#2{\unexpanded\expandafter{\tud@tut@line}}% \fi% % \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. % \begin{macrocode} \ifx\tud@tut@line\@empty\@tempswafalse\fi% \repeat% \closein\tud@read% \endgroup% } % \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. % \begin{macrocode} \newcommand*\tud@tut@append[1]{\tud@tut@readtostream{\jobname-temp.tex}{#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. % \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 } % \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 % % \iffalse % % \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{macrocode} \newcommand*\idxfont{} \let\idxfont\footnotesize \robustify{\idxfont} % \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. % \begin{macrocode} \newcommand*\PrintIndex{% \begingroup% %<*class> \@printindex% % \@printindex[options]% \@printindex[macros]% %<*class> \@printindex[keys]% \@printindex[terms]% \@printindex[fonts]% \begingroup% \let\lettergroup\@gobble% \let\indexspace\par% \@printindex[colors]% \endgroup% % \@printindex[files]% \endgroup% } % \end{macrocode} % Hiermit kann der einleitende Teil für den allgemeinen Index gesetzt werden. % \begin{macrocode} %<*class> \newcommand*\PrintIndexPrologue[1]{\long\gdef\@printindexprologue{#1}} \newcommand*\@printindexprologue{} % % \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. % \begin{macrocode} \newcommand*\@printindexskip{% \ifnum\imki@columns>\@ne\relax\vspace{-\multicolsep}\fi% } % \end{macrocode} % Der Befehl \cs{@printindex} setzt vor jedem Unterindex ein referenzierbares % Label und gibt diesen danach aus. % \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% }% % %<*package> \indexprologue[\@printindexskip]{}% \printindex[#1]\@printindexskip% % } % \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. % \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}% }% } % % \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 % % \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}% }% } % \end{macrocode} % \end{macro}^^A \deprecatedhyperpage % \end{macro}^^A \Changelog % \end{macro}^^A \if@changelog % \end{macro}^^A \PrintChangelog % % \iffalse % % \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} %<*class> \if@changelog\let\deprecatedhyperpage\@gobble\fi% % } \renewrobustcmd*\seealso[2]{% \ifstr{#1}{*}{\emph{\alsoname}~#2}{\emph{\alsoname}~#1}% } % \end{macrocode} % \end{macro}^^A \seealso % \end{macro}^^A \see % % \iffalse % % %<*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}{\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*\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 } % \end{macrocode} % \end{macro}^^A \DDC % \end{macro}^^A \TnUD % \end{macro}^^A \TUD % \end{macro}^^A \CDs % \end{macro}^^A \CD % \end{macro}^^A \vKOMAScript % \end{macro}^^A \vTUDScript % % \iffalse % %<*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} % \changes{v2.02}{2014/08/16}{neu}^^A % \begin{macro}{\textsbs} % \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. % \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} \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 % \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% } % \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 % % \fi % % \Finale % \endinput