You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

2903 lines
94 KiB

% ======================================================================
% scrguide.cls
% Copyright (c) Markus Kohm, 2005-2020
%
% This file is part of the LaTeX2e KOMA-Script bundle.
%
% 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
% version 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 Markus Kohm.
%
% This work consists of all files listed in manifest.txt.
% ----------------------------------------------------------------------
% scrguide.cls
% Copyright (c) Markus Kohm, 2005-2020
%
% Dieses Werk darf nach den Bedingungen der LaTeX Project Public Lizenz,
% Version 1.3c, verteilt und/oder veraendert werden.
% Die neuste Version dieser Lizenz ist
% http://www.latex-project.org/lppl.txt
% und Version 1.3c ist Teil aller Verteilungen von LaTeX
% Version 2005/12/01 oder spaeter und dieses Werks.
%
% Dieses Werk hat den LPPL-Verwaltungs-Status "author-maintained"
% (allein durch den Autor verwaltet).
%
% Der Aktuelle Verwalter und Autor dieses Werkes ist Markus Kohm.
%
% Dieses Werk besteht aus den in manifest.txt aufgefuehrten Dateien.
% ======================================================================
%
% \section{Identification}
%
% \begin{macrocode}
\ProvidesClass{scrguide}[2020/03/17 v1.23 internal KOMA-Script guide class]
% \end{macrocode}
%
%
% \section{Options on my own}
%
% This class also has options.
%
% \begin{option}{pagereftolabel}
% |\autopageref| should reference the label not the page.
% \begin{option}{pagereftopage}
% |\autopageref| should reference the page not the label.
% \begin{macro}{\if@pagereftolabel}
% \begin{macrocode}
\newif\if@pagereftolabel\@pagereftolabeltrue
\DeclareOption{pagereftolabel}{\@pagereftolabeltrue}
\DeclareOption{pagereftopage}{\@pagereftolabelfalse}
% \end{macrocode}
% \end{macro}
% \end{option}
% \end{option}
%
% \begin{option}{moreindexnotes}
% Show more notes at the index.
% \begin{option}{lessindexnotes}
% Show less notes at the index.
% \begin{macro}{\if@moreindexnotes}
% \begin{macrocode}
\newif\if@moreindexnotes\@moreindexnotesfalse
\DeclareOption{moreindexnotes}{\@moreindexnotestrue}
\DeclareOption{lessindexnotes}{\@moreindexnotesfalse}
% \end{macrocode}
% \end{macro}
% \end{option}
% \end{option}
%
% Note: You have to pass options to class \textsf{scrguide}, because only
% these options will be processed by |\LoadClassWithOptions| below.
% \begin{macrocode}
\ExecuteOptions{pagereftolabel,lessindexnotes}
\PassOptionsToClass{%
bibliography=totoc,
index=totoc,
captions=tableabove,
headings=small,
headings=optiontoheadandtoc,
version=last,
}{scrguide}
\ProcessOptions\relax
% \end{macrocode}
%
%
% \section{Load the Base Class and Packages}
%
% \begin{macro}{\KOMAProvidesFile}
% \begin{macro}{\@KOMAProvidesFile}
% \changes{v1.22b}{2019/11/18}{\cs{ifstr} umbenannt in \cs{Ifstr}}%^^A
% Extended version of |\ProvidesFile|, that uses the date from the
% repository.
% \begin{macrocode}
\newcommand*{\KOMAProvidesFile}{}
\def\KOMAProvidesFile#1{%
\@ifnextchar [%]
{\@KOMAProvidesFile{#1}}{\ProvidesFile{#1}\relax}%
}
\newcommand*{\@KOMAProvidesFile}{}
\def\@KOMAProvidesFile#1[$#2: #3-#4-#5 #6$#7]{%
\Ifstr{#2}{Date}{%
\ProvidesFile{#1}[#3/#4/#5 \detokenize{#6 #7}]\relax
}{%
\ClassError{scrguide}{missmatch repository date string}{%
It seams, that you haven't used $%
Date: YYYY-MM-DD $ for the date of \string\KOMAProvidesFile.}%
\ProvidesFile{#1}[$#2: #3/#4/#5 \detokenize{#6}$\detokenize{#7}]\relax
}%
}
% \end{macrocode}
% \end{macro}
% \end{macro}
% \begin{macrocode}
\LoadClassWithOptions{scrbook}
\RequirePackage[TS1,T1]{fontenc}
\newcommand*{\strngerman}{ngerman}
\newcommand*{\strenglish}{english}
\edef\languages{\ifx\languagename\strngerman main=\fi ngerman,%
\ifx\languagename\strenglish main=\fi english}
\edef\uselanguage{\languagename}
\expandafter\RequirePackage\expandafter[\languages]{babel}%
\AtBeginDocument{%
\typeout{TRACE: Current language is `\languagename`.}}%
\RequirePackage[fixlanguage]{babelbib}
\expandafter\selectbiblanguage\expandafter{\uselanguage}
\RequirePackage{afterpage}
\RequirePackage{makeidx}
\RequirePackage{scrdate}
\RequirePackage{scrtime}
\RequirePackage{picture}
\RequirePackage{graphicx}
\RequirePackage{booktabs}
\RequirePackage{longtable}
\RequirePackage{amsmath}
\RequirePackage{listings}
\RequirePackage{multicol}
\RequirePackage{marginnote}
\RequirePackage{tabularx}
\RequirePackage{scrhack}%
\RequirePackage{mparhack}%
% \end{macrocode}
%
% \section{Dependence from \KOMAScript{} Version}
%
% \begin{macro}{currentversionlt}
\newcommand*{\currentversionlt}[1]{%
\expandafter\ifx\csname scr@v@#1\endcsname\relax \maxdimen
\else\csname scr@v@#1\endcsname\fi >\scr@compatibility\relax
}
% \end{macrocode}
% \end{macro}
%
% \section{Free or Non-Free Version}
%
% \begin{macrocode}
\newif\ifshortversion\shortversionfalse
\InputIfFileExists{scrnonfree.tex}{}{%
\RequirePackage[svgnames]{xcolor}%
\RequirePackage{tikz}%
\usetikzlibrary{calc}%
\RequirePackage[\uselanguage]{hyperref}%
\RequirePackage[open,openlevel=0]{bookmark}% improved pdf bookmarks
\typeout{^^J
----------------------------------------------------------------------^^J
FREE VERSION OF THE KOMA-SCRIPT GUIDE.^^J
NOTE THAT THIS VERSION MAY BE FULL OF UGLY PARAGRAPH AND PAGE BREAKS.^^J
THIS IS BECAUSE THIS VERSION OF THE KOMA-SCRIPT GUIDE IS UNDER^^J
CONSTRUCTION FOREVER.^^J
----------------------------------------------------------------------^^J
^^J%
}%
\newcommand*{\iffree}{\@firstoftwo}%
\newcommand*{\important}[2][]{}%
\newcommand*{\textnote}[2][]{}%
\shortversiontrue
\newcommand*{\LoadNonFree}[2]{\par\GuideLoadNonFree\par}%
\AtBeginDocument{\InputIfFileExists{linkalias.tex}{}{}}%
\usepackage{lmodern}%
\@twosidefalse\@openrightfalse\@mparswitchfalse
\RequirePackage{geometry}%
\geometry{papersize={180mm,210mm},%
includehead,includemp,reversemp,marginparwidth=4em,%
vmargin={1.5mm,3mm},hmargin=1.75mm}%
\RequirePackage{scrlayer-scrpage}%
\clearpairofpagestyles
\ihead{%
\smash{%
\hspace*{.5em}\rule[-\dp\strutbox]{0pt}{\headheight}\headmark
}%
}%
\ohead*{\smash{\pagemark\hspace{2mm}}}%
\colorlet{headbackground}{DarkBlue}%
\colorlet{headline}{white}%
\setkomafont{pageheadfoot}{\small\sffamily\bfseries\color{headline}}%
\setkomafont{pagenumber}{}%
\DeclareNewLayer[head,background,
hoffset=0pt,
width=\paperwidth,
addheight=\dimexpr \topmargin+1in+\dp\strutbox\relax,
addvoffset=2\dp\strutbox,
contents={%
\color{headbackground}\rule{\layerwidth}{\layerheight}}]
{headbackground}%
\AddLayersAtBeginOfPageStyle{scrheadings}{headbackground}%
\renewcommand*{\chaptermark}[1]{%
\@mkdouble{\Ifnumbered{chapter}{\chaptermarkformat}{}##1}%
}%
\renewcommand*{\chaptermarkformat}{%
\makebox[\dimexpr \oddsidemargin+1in-.5em][r]{%
\chapapp~\thechapter:~%
}%
}%
\renewcommand*{\chapterformat}{}%
\renewcommand*{\chapterpagestyle}{scrheadings}%
\setlength{\@tempdimc}{\oddsidemargin}%
\addtolength{\@tempdimc}{1in}%
\setheadwidth[-\@tempdimc]{paper}%
% Entweder:
\hypersetup{colorlinks,citecolor=Green,linkcolor=Crimson,urlcolor=Blue}%
% oder:
% \hypersetup{pdfborderstyle={/S/U/W 1}}%
\let\orig@maketitle\maketitle
\def\maketitle{%
\begingroup
\@twosidetrue
\let\cleardoublepage\clearpage
\addtolength{\oddsidemargin}{\evensidemargin}%
\setlength{\evensidemargin}{.5\oddsidemargin}%
\setlength{\oddsidemargin}{\evensidemargin}%
\orig@maketitle\relax
\endgroup
}%
\renewcommand*{\chapterheadstartvskip}{}%
\raggedbottom
\sloppy
\lstset{breaklines,prebreak=\mbox{$\hookleftarrow$}}%
}%
% \end{macrocode}
%
% Now loading the last package (better do it late than never):
% \begin{macrocode}
\RequirePackage{textcomp}
% \end{macrocode}
%
% \section{Load common paragraphs}
%
% \begin{macrocode}
\newcommand*{\ThisCommonFile}{}%
\newcommand*{\ThisCommonLabelBase}{}
\newcommand*{\IfThisCommonLabelBase}[1]{%
\expandafter\Ifstr\expandafter{\ThisCommonLabelBase}{#1}%
\@firstoftwo\@secondoftwo
}
\newcommand*{\IfThisCommonLabelBaseOneOf}[1]{%
\begingroup
\@tempswafalse
\@for \reserved@a:=#1\do{%
\expandafter\IfThisCommonLabelBase\expandafter{\reserved@a}%
{\@tempswatrue}{}%
}%
\if@tempswa
\aftergroup\@firstoftwo
\else
\aftergroup\@secondoftwo
\fi
\endgroup
}
\newcommand*{\IfThisCommonLabelBaseNotOneOf}[1]{%
\begingroup
\@tempswafalse
\@for \reserved@a:=#1\do{%
\expandafter\IfThisCommonLabelBase\expandafter{\reserved@a}%
{\@tempswatrue}{}%
}%
\if@tempswa
\aftergroup\@secondoftwo
\else
\aftergroup\@firstoftwo
\fi
\endgroup
}
\newcommand*{\ThisCommonFirstLabelBase}{%
\@nameuse{CommonFile@\ThisCommonFile @LabelBase}%
}
\newif\ifthiscommonfirst
\newcommand*{\IfThisCommonFirstRun}{%
\ifthiscommonfirst \expandafter\@firstoftwo
\else \expandafter\@secondoftwo \fi
}
\newcommand*{\LoadCommonFile}[1]{%
\Ifstr{\ThisCommonFile}{}{%
\def\ThisCommonFile{#1}%
\let\ThisCommonLabelBase\label@base
\@ifundefined{CommonFile@\ThisCommonFile @LabelBase}{%
\expandafter\let\csname CommonFile@\ThisCommonFile @LabelBase\endcsname
\ThisCommonLabelBase
\thiscommonfirsttrue
}{\thiscommonfirstfalse}%
\input{common-\ThisCommonFile.tex}%
\thiscommonfirstfalse
\let\ThisCommonLabelBase\@empty
\let\ThisCommonFile\@empty
}{%
\ClassError{scrguide}{recursive \string\LoadCommon}{%
You can not use \string\LoadCommon\space inside another
common file.%
}%
}%
}
\newcommand*{\InternalCommonFileUsageError}{%
\GenericError{%
(common-\ThisCommonFile.tex)\@spaces
}{%
Common File common-\ThisCommonFile.tex Error: Unprepared usage%
}{%
You have to prepare the file for the label base \ThisCommonLabelBase.%
}{}%
}
% \end{macrocode}
%
% \section{Language Dependencies}
%
% We load the language dependency file at |\begin{document}| and add some
% of the extensions to the language.
% \begin{macrocode}
\AtBeginDocument{%
\InputIfFileExists{\jobname-\uselanguage.tex}{%
\ClassInfo{scrguide}{Loading language dependencies for \uselanguage}%
}{%
\ClassError{scrguide}{\uselanguage\space not supported}{%
You've tried to generate a guide for language `\uselanguage' but
language\MessageBreak
dependency file `\jobname-\uselanguage.tex' was not found.\MessageBreak
This may result in a lot of errors and warnings, if you'll continue}%
}%
\expandafter\addto\csname extras\uselanguage\endcsname
\GuideLanguageExtensions\GuideLanguageExtensions
}
% \end{macrocode}
%
%
% \section{Breaking of Paragraphs and Pages}
%
% There are several parameters to configure the breaking. I've tried to find
% good values. First of all the placement of floats and text.
% \begin{macrocode}
\renewcommand*{\floatpagefraction}{.75}% was .6
\renewcommand*{\textfraction}{.2}% original
\renewcommand*{\topfraction}{.75}% was .7
\renewcommand*{\bottomfraction}{.33}% was .3
\setcounter{topnumber}{1}% was 2
\setcounter{bottomnumber}{1}% original
\setcounter{totalnumber}{3}% original
% \end{macrocode}
%
%
% \section{Find the Date of the Newest Documentation File}
%
% \begin{macro}{\newestfiledate}
% The latex date of the newest used file.
% \begin{macrocode}
\newcommand*{\newestfiledate}{0001-01-01}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@notonlypreamble}
% Remove commands from to be \@onlypreamble commands.
% \begin{macrocode}
\newcommand*{\@notonlypreamble}[1]{%
\begingroup
\let\new@preamblecmds\@empty%
\def\do##1{\ifx ##1#1\else
\expandafter\def\expandafter\new@preamblecmds\expandafter{%
\new@preamblecmds\do##1}\fi}%
\@preamblecmds
\global\let\@preamblecmds\new@preamblecmds
\endgroup
}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@ifl@t@r}
% Not longer a |\@onlypreamble| command.
% \begin{macrocode}
\@notonlypreamble\@ifl@t@r
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@parse@version}
% Not longer a |\@onlypreamble| command.
% \begin{macrocode}
\@notonlypreamble\@parse@version
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@latex@version}
% Like |\@parse@version| but returns a \LaTeX{} date.
% \begin{macrocode}
\newcommand*{\@latex@version}{}
\def\@latex@version#1/#2/#3#4#5\@nil{#1/#2/#3#4}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@iso@version}
% Like |\@parse@version| but returns an iso date.
% \begin{macrocode}
\newcommand*{\@iso@version}{}
\def\@iso@version#1/#2/#3#4#5\@nil{#1-#2-#3#4}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\IsoDate}
% Converts \LaTeX{} date #1 into an iso date.
% \begin{macrocode}
\newcommand*{\IsoDate}[1]{\expandafter\@iso@version#1//00\@nil}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@CheckDate}
% Check if the provided date of file #1.tex is newer than
% \@newestfiledate. If so, write the new date to the aux file.
% \begin{macrocode}
\newcommand*{\@CheckDate}[1]{%
\begingroup
\expandafter\ifx\csname ver@#1.tex\endcsname\relax\else
\typeout{\csname ver@#1.tex\endcsname}%
\expandafter\@ifl@t@r\csname ver@#1.tex\endcsname\newestfiledate{%
\xdef\newestfiledate{%
\expandafter\expandafter\expandafter\@latex@version
\csname ver@#1.tex\endcsname//00\@nil%
}%
\write\@auxout{\noexpand\gdef\noexpand\newestfiledate{%
\newestfiledate}\@percentchar\space #1.tex}%
}{}%
\fi
\endgroup
}
% \end{macrocode}
% \end{macro}
%
% Check the date of the jobfile:
% \begin{macrocode}
\@CheckDate\jobname
% \end{macrocode}
%
% \begin{macro}{\@providesfile}
% \begin{macro}{\SCR@providesfile}
% Redefine |\ProvidesFile| to also check the date.
% \begin{macrocode}
\newcommand*{\SCR@providesfile}{}
\AtBeginDocument{%
\let\SCR@providesfile\@providesfile
\def\@providesfile#1[#2]{%
\SCR@providesfile#1[#2]%
\expandafter\@CheckDate\expandafter{\expandafter\@BaseFileName#1.\@nil}%
}%
}
% \end{macrocode}
% \begin{macro}{\@BaseFileName}
% Split of extension of the file name.
% \begin{macrocode}
\newcommand*{\@BaseFileName}{}
\def\@BaseFileName#1.#2\@nil{#1}
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% Predefine current date:
% \begin{macrocode}
\AtBeginDocument{\date{\IsoDate\newestfiledate}}
% \end{macrocode}
%
%
% \section{Collect All Translators}
%
% At the translated guides, the translators should also be shown somewhere at
% the title.
%
% \begin{macro}{\translator}
% \changes{v0.9d}{2007/09/18}{new}
% This macro is used, so save one or more translators into the aux file.
% \begin{macrocode}
\newcommand*{\translator}[1]{%
\protected@write\@auxout{\def\and{,}}{%
\protect\@addtranslators{#1}%
}%
}
% \end{macrocode}
% \begin{macro}{\@translator}
% \begin{macro}{\@addtranslator}
% And we need macros so store the translators
% \begin{macrocode}
\newcommand*{\@translator}{}
% \end{macrocode}
% and to read the translators from the aux file.
% \begin{macrocode}
\newcommand*{\@addtranslators}[1]{%
\ifx\@translator\@empty\else\g@addto@macro\@translator{,}\fi
\g@addto@macro\@translator{#1}%
}
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
%
% \begin{macro}{\settranslator}
% \changes{v0.9d}{2007/09/18}{new}
% Last but not least, we need a macro to set the list of translators.
% \begin{macrocode}
\newcommand{\settranslator}[2]{%
\ifx\@translator\@empty\else
#1%
\begingroup
% \end{macrocode}
% Run through all translators, but store each once only.
% \begin{macrocode}
\let\@tempb\@empty
\@tempcnta=\z@
\expandafter\@for \expandafter\@tempa\expandafter:\expandafter=%
\@translator\do {%
\ifx\@tempa\@empty\else
%<trace> \typeout{Test: `,\@tempa,' at `,\@tempb,'}%
\@expandtwoargs\in@{,\@tempa,}{,\@tempb,}%
\ifin@\else
\edef\@tempb{\@tempb\@tempa,}%
\advance\@tempcnta by 1\relax
\fi
\fi
}%
% \end{macrocode}
% Set each of the stored translators.
% \begin{macrocode}
\@tempcntb=\z@
\expandafter\@for \expandafter\@tempa\expandafter:\expandafter=%
\@tempb\do {%
\ifx\@tempa\@empty\else
\advance\@tempcntb by 1\relax
\typeout{Translator \the\@tempcntb: \@tempa}%
\ifnum\@tempcntb >\@ne\relax
\ifnum\@tempcntb=\@tempcnta\relax
\ifnum\@tempcntb=\tw@\relax
\GuideAnd
\else
\GuideListAnd
\fi
\else
,
\fi
\fi
\@tempa
\fi
}%
\endgroup
#2%
\fi
}
% \end{macrocode}
% \end{macro}
%
% \section{Emphasization and Fonts}
%
% The \KOMAScript{} guide uses a lot of emphasizations. Most of them are
% declared robustly to avoid problems at index, change log etc.
%
% We need some colors for emphasizing in images:
% \begin{macrocode}
\colorlet{ImageRed}{Crimson}%
\colorlet{ImageBlue}{Blue}%
\colorlet{ImageGreen}{Green}%
\colorlet{ImageYellow}{Yellow}%
% \end{macrocode}
%
% \begin{macro}{\textsfrm}
% Something like |\emph| using |\textsf| and |\textrm| instead of |\textit|
% and |\textup|.
% \begin{macrocode}
\newcommand*{\textsfrm}[1]{%
\begingroup
\edef\@tempa{\sfdefault}%
\ifx\@tempa\f@family\textrm{#1}\else\textsf{#1}\fi
\endgroup
}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\File}
% \begin{macro}{\Class}
% \begin{macro}{\Package}
% Some markup macros for files with special meanings.
\DeclareRobustCommand*{\File}[1]{\mbox{\texttt{#1}}}
\DeclareRobustCommand*{\Class}[1]{\mbox{\textsfrm{#1}}}
\DeclareRobustCommand*{\Package}[1]{\mbox{\textsfrm{#1}}}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\DeclareSpecialMarkup}
% Command to declare special markup commands, that behave different in- and
% outside |Description| environment. Parameters are:
% \begin{declaration}
% \item[\arg{command}:] The the markup command, that should be defined.
% \item[\arg{outside definition}:] Definition of the markup command
% outside |Description| environment.
% \item[\arg{inside definition}:] Definition of the markup command inside
% |Description| environment.
% \item{\oarg{inside end definition}:] Definition of the \cs{end} command,
% if inside |Description| an markup environment instead of an markup
% command would be used.
% \end{declaration}
% At the end color \meta{command name} will be black and \cs{\meta{command
% name}}, \cs{text\meta{command name}, \cs{Desc\meta{command name}}, and
% optionally \cs{endDesc\meta{command name} will be defined, with
% \cs{\meta{command name}} is \meta{command}.
% \begin{macrocode}
\newcommand\DeclareSpecialMarkup[3]{%
\newcommand*#1{}%
\expandafter\colorlet\expandafter{\expandafter\@gobble\string#1}{black}%
\expandafter\newcommand\expandafter*%
\csname text\expandafter\@gobble\string #1\endcsname[1]{#2}%
\expandafter\DeclareRobustCommand\expandafter*\expandafter#1\expandafter{%
\csname text\expandafter\@gobble\string #1\endcsname}%
\expandafter\newcommand\expandafter*%
\csname Desc\expandafter\@gobble\string #1\endcsname[1]{#3}%
\kernel@ifnextchar [%
{\expandafter\@optdef
\csname endDesc\expandafter\@gobble\string #1\endcsname}%
{}%]
}
% \end{macrocode}
% \begin{macro}{\@optdef}
% Helper to define a macro via optional instead of mandatory argument
\newcommand*{\@optdef}{}
\long\def\@optdef#1[#2]{\def#1{#2}}
% \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\Macro}
% \begin{macro}{\Option}
% \begin{macro}{\KOption}
% \begin{macro}{\OptionValue}
% \begin{macro}{\Environment}
% \begin{macro}{\Counter}
% \begin{macro}{\Length}
% \begin{macro}{\PLength}
% \changes{v1.17}{2019/10/24}{\cs{setplength} verschoben}%^^A
% \begin{macro}{\FloatStyle}
% \begin{macro}{\PageStyle}
% \begin{macro}{\Variable}
% \begin{macro}{\FontElement}
% \begin{macro}{\DoHook}
% \changes{v1.14}{2019/02/20}{neu}%^^A
% \begin{macro}{\PName}
% \begin{macro}{\PValue}
% \begin{macro}{\Parameter}
% \begin{macro}{\OParameter}
% \begin{macro}{\AParameter}
% \begin{macro}{\PParameter}
% \begin{macro}{\POParameter}
% \begin{description}
% \item[\cs{Macro}] \LaTeX{} or \TeX{} macro
% \item[\cs{Option}] class or package option
% \item[\cs{KOption}] |\KOMAoptions| option
% \item[\cs{Environment}] \LaTeX{} environment
% \item[\cs{Counter}] \LaTeX{} counter
% \item[\cs{Length}] \LaTeX{} length
% \item[\cs{PLength}] \KOMAScript{} pseudo length
% \item[\cs{Variable}] \KOMAScript{} variable
% \item[\cs{FontElement}] \KOMAScript{} element that has its own font
% selection
% \item[\cs{PName}] name of a parameter of a macro or environment
% \item[\cs{PValue}] value of a parameter of a macro or environment
% \item[\cs{Parameter}] the mandatory parameter of a macro or environment
% \item[\cs{OParameter}] the optional parameter of a macro or environment
% \item[\cs{AParameter}] the alternativ parameter of a macro or environment
% \item[\cs{PParameter}] the part-of-command parameter of a macro or
% environment
% \end{description}
% \begin{macrocode}
\newcommand*{\LabelMacro}[2][\label@suffix]{%
\begingroup
\protected@edef\@currentlabel{\Macro{#2}}%
\label@sanitize
\Hy@MakeCurrentHref{\label@desc@prefix\label@base.cmd.#2#1}%
\ClassInfo{scrguide}{Anchor: `\@currentHref'}%
\Hy@raisedlink{\hyper@anchorstart{\@currentHref}\hyper@anchorend}%
\label{\label@desc@prefix\label@base.cmd.#2#1}%
\endgroup
}
\DeclareRobustCommand*{\DescRef}{%
\kernel@ifstar {\@DescRef*}{\@DescRef\@empty}%
}
\newcommand*{\@DescRef}[2]{\expandafter\ref#1{\label@desc@prefix#2}}
\DeclareRobustCommand*{\DescPageRef}{%
\kernel@ifstar {\@DescPageRef*}{\@DescPageRef\space}%
}
\newcommand*{\@DescPageRef}[2]{\expandafter\autopageref#1{\label@desc@prefix#2}}
\DeclareSpecialMarkup{\Macro}{\mbox{\texttt{\char`\\#1}}}{%
\par
\settowidth{\leftskip}{\textMacro{#1}}% indent from left
\hskip-\leftskip
\BeginIndex{Cmd}{#1}% index entry
\LabelMacro{#1}%
\textMacro{#1}%
}
\newcommand*{\LabelOption}[2][\label@suffix]{%
\begingroup
\protected@edef\@currentlabel{\Option{#2}}%
\label@sanitize
\Hy@MakeCurrentHref{\label@desc@prefix\label@base.option.#2#1}%
\ClassInfo{scrguide}{Anchor: `\@currentHref'}%
\Hy@raisedlink{\hyper@anchorstart{\@currentHref}\hyper@anchorend}%
\expandafter\gdef
\csname \label@desc@prefix\label@base.option.#2#1\endcsname{}%
\label{\label@desc@prefix\label@base.option.#2#1}%
\endgroup
}
\DeclareSpecialMarkup{\Option}{\mbox{\texttt{#1}}}{%
\par
\leftskip\z@
\BeginIndex{Option}{#1}% index entry
\LabelOption{#1}%
\textOption{#1}%
}
\DeclareSpecialMarkup{\KOption}{%
\mbox{\textOption{#1=}}\linebreak[0]%
}{%
\ClassWarning{scrguide}{You should replace
\string\KOption{#1}\string\PName{...}\MessageBreak
by \string\OptionVName{#1}{...}}%
\par
\leftskip\z@
\BeginIndex{Option}{#1}% index entry
\begingroup
\@nameuse{phantomsection}%
\label@sanitize
\expandafter\gdef
\csname \label@desc@prefix\label@base.option.#1\label@suffix\endcsname{}%
\label{\label@desc@prefix\label@base.option.#1\label@suffix}%
\endgroup
\textOption{#1=}%
}
\newcommand*{\maybelinebreak}{%
\ifvmode\else
\ifnum\lastpenalty<\z@\else
\ifnum\lastpenalty<\@medpenalty
\hskip\z@skip
\fi
\fi
\fi
}
\DeclareRobustCommand*{\textKValue}[1]{\maybelinebreak\mbox{\texttt{#1}}}
\newcommand*{\KValue}{}
\let\KValue\textKValue
\newcommand*{\textOptionValue}[2]{%
\textKOption{#1}\textKValue{#2}%
}
\DeclareRobustCommand*{\OptionValue}{\textOptionValue}%
\newcommand*{\LabelOptionValue}[3][\label@suffix]{%
\begingroup
\protected@edef\@currentlabellong{\OptionValue{#2}{#3}}%
\protected@edef\@currentlabelshort{\Option{#2}}%
\label@sanitize
\scr@ifundefinedorrelax{%
\label@desc@prefix\label@base.option.#2\label@suffix
}{%
\expandafter\gdef
\csname \label@desc@prefix\label@base.option.#2\label@suffix\endcsname{}%
\Hy@MakeCurrentHref{\label@desc@prefix\label@base.option.#2#1}%
\ClassInfo{scrguide}{Anchor: `\@currentHref'}%
\Hy@raisedlink{\hyper@anchorstart{\@currentHref}\hyper@anchorend}%
\let\@currentlabel\@currentlabelshort
\label{\label@desc@prefix\label@base.option.#2#1}%
}{}%
\Hy@MakeCurrentHref{\label@desc@prefix\label@base.option.#2.#3#1}%
\ClassInfo{scrguide}{Anchor: `\@currentHref'}%
\Hy@raisedlink{\hyper@anchorstart{\@currentHref}\hyper@anchorend}%
\let\@currentlabel\@currentlabellong
\label{\label@desc@prefix\label@base.option.#2.#3#1}%
\endgroup
}
% \end{macrocode}
% \begin{macro}{\OptionValueRef}
% \cs{OptionValue} by reference. Use it like
% |\OptionValueRef[suffix]{maincls}{version}{3.20}|.
% \begin{macrocode}
\newcommand*{\OptionValueRef}{%
\kernel@ifstar {\@RefOptionValue0}{\@RefOptionValue1}%
}
\newcommand*{\@RefOptionValue}[1]{%
\kernel@ifnextchar [%]
{\@@RefOptionValue#1}{\@@RefOptionValue#1[]}%
}
\newcommand*{\@@RefOptionValue}{}
\def\@@RefOptionValue#1[#2]#3#4#5{%
\scr@ifundefinedorrelax{r@\label@desc@prefix#3.option.#4.#5#2}{%
\ifcase #1
\expandafter\scr@no@hyperref
\else
\expandafter\hyperref
\fi
[\label@desc@prefix#3.option.#4#2]%
{\OptionValue{\ref*{\label@desc@prefix#3.option.#4#2}}{#5}}%
}{%
\expandafter\ref\ifcase #1 *\fi{\label@desc@prefix#3.option.#4.#5#2}%
}%
}
\newcommand*{\scr@no@hyperref}[2][]{#2}
% \end{macrocode}
% \end{macro}
% \begin{macrocode}
\newcommand*{\DescOptionValue}[2]{%
\par
\leftskip\z@
\BeginIndex{Option}{#1}%
\BeginIndex{Option}{#1~=\KValue{#2}}%
\LabelOptionValue{#1}{#2}%
\textOptionValue{#1}{#2}%
}
\newcommand*{\textOptionVName}[2]{%
\textKOption{#1}\PName{#2}%
}
\DeclareRobustCommand*{\OptionVName}{\textOptionVName}%
\newcommand*{\LabelOptionVName}[3][\label@suffix]{%
\begingroup
\protected@edef\@currentlabellong{\OptionVName{#2}{#3}}%
\protected@edef\@currentlabelshort{\Option{#2}}%
\label@sanitize
\scr@ifundefinedorrelax{%
\label@desc@prefix\label@base.option.#2\label@suffix
}{%
\expandafter\gdef
\csname \label@desc@prefix\label@base.option.#2\label@suffix\endcsname{}%
\Hy@MakeCurrentHref{\label@desc@prefix\label@base.option.#2#1}%
\ClassInfo{scrguide}{Anchor: `\@currentHref'}%
\Hy@raisedlink{\hyper@anchorstart{\@currentHref}\hyper@anchorend}%
\let\@currentlabel\@currentlabelshort
\label{\label@desc@prefix\label@base.option.#2#1}%
}{}%
\Hy@MakeCurrentHref{\label@desc@prefix\label@base.option.#2=#3#1}%
\ClassInfo{scrguide}{Anchor: `\@currentHref'}%
\Hy@raisedlink{\hyper@anchorstart{\@currentHref}\hyper@anchorend}%
\let\@currentlabel\@currentlabellong
\label{\label@desc@prefix\label@base.option.#2=#3#1}%
\endgroup
}
% \end{macrocode}
% \begin{macro}{\OptionVNameRef}
% \cs{OptionVName} by reference. Use it like
% |\OptionVNameRef[suffix]{maincls}{version}{value}|.
% \begin{macrocode}
\newcommand*{\OptionVNameRef}{%
\kernel@ifstar {\@RefOptionVName0}{\@RefOptionVName1}%
}
\newcommand*{\@RefOptionVName}[1]{%
\kernel@ifnextchar [%]
{\@@RefOptionVName#1}{\@@RefOptionVName#1[]}%
}
\newcommand*{\@@RefOptionVName}{}
\def\@@RefOptionVName#1[#2]#3#4#5{%
\scr@ifundefinedorrelax{r@\label@desc@prefix#3.option.#4=#5#2}{%
\ifcase #1
\expandafter\scr@no@hyperref
\else
\expandafter\hyperref
\fi
[\label@desc@prefix#3.option.#4#2]%
{\OptionVName{\ref*{\label@desc@prefix#3.option.#4#2}}{#5}}%
}{%
\expandafter\ref\ifcase #1 *\fi{\label@desc@prefix#3.option.#4=#5#2}%
}%
}
% \end{macrocode}
% \end{macro}
% \begin{macrocode}
\newcommand*{\DescOptionVName}[2]{%
\par
\leftskip\z@
% \BeginIndex{Option}{#1}%
\BeginIndex{Option}{#1~=\PName{#2}}%
\LabelOptionVName{#1}{#2}%
\textOptionVName{#1}{#2}%
}
\newcommand*{\LabelFloatStyle}[2][\label@suffix]{%
\begingroup
\protected@edef\@currentlabel{\FloatStyle{#2}}%
\label@sanitize
\Hy@MakeCurrentHref{\label@desc@prefix\label@base.floatstyle.#2#1}%
\ClassInfo{scrguide}{Anchor: `\@currentHref'}%
\Hy@raisedlink{\hyper@anchorstart{\@currentHref}\hyper@anchorend}%
\label{\label@desc@prefix\label@base.floatstyle.#2#1}%
\endgroup
}
\DeclareSpecialMarkup{\FloatStyle}{\mbox{\texttt{#1}}}{%
\par
\leftskip\z@
\BeginIndex{Floatstyle}{#1}%
\LabelFloatStyle{#1}%
\textFloatStyle{#1}%
}
\newcommand*{\LabelPageStyle}[2][\label@suffix]{%
\begingroup
\protected@edef\@currentlabel{\PageStyle{#2}}%
\label@sanitize
\Hy@MakeCurrentHref{\label@desc@prefix\label@base.pagestyle.#2#1}%
\ClassInfo{scrguide}{Anchor: `\@currentHref'}%
\Hy@raisedlink{\hyper@anchorstart{\@currentHref}\hyper@anchorend}%
\label{\label@desc@prefix\label@base.pagestyle.#2#1}%
\endgroup
}
\DeclareSpecialMarkup{\PageStyle}{\mbox{\texttt{#1}}}{%
\par
\leftskip\z@
\BeginIndex{Pagestyle}{#1}%
\LabelPageStyle{#1}%
\scr@ifundefinedorrelax{r@\label@desc@prefix maincls.cmd.pagestyle}{%
\textMacro{pagestyle}%
}{%
\begingroup
\let\Macro\textMacro
\DescRef{maincls.cmd.pagestyle}%
\endgroup
}\PParameter{#1}%
}
\newcommand*{\LabelEnvironment}[2][\label@suffix]{%
\begingroup
\protected@edef\@currentlabel{\Environment{#2}}%
\label@sanitize
\Hy@MakeCurrentHref{\label@desc@prefix\label@base.env.#2#1}%
\ClassInfo{scrguide}{Anchor: `\@currentHref'}%
\Hy@raisedlink{\hyper@anchorstart{\@currentHref}\hyper@anchorend}%
\label{\label@desc@prefix\label@base.env.#2#1}%
\endgroup
}
\DeclareSpecialMarkup{\Environment}{\mbox{\texttt{#1}}}{%
\par
\settowidth{\leftskip}{\textMacro{begin}\PParameter{#1}}% siehe Macro
\hskip-\leftskip
\BeginIndex{Env}{#1}%
\LabelEnvironment{#1}%
\textMacro{begin}\PParameter{#1}%
\def\d@EnvironmentName{#1}% Umgebungsnamen merken für das Ende
}[{%
\ifvmode\hskip-\leftskip\else \unskip\,\dots\fi% \begin{…}…\end{…}
\textMacro{end}\expandafter\PParameter\expandafter{\d@EnvironmentName}\par
}]%
\newcommand*{\LabelCounter}[2][\label@suffix]{%
\begingroup
\protected@edef\@currentlabel{\Counter{#2}}%
\label@sanitize
\Hy@MakeCurrentHref{\label@desc@prefix\label@base.counter.#2#1}%
\ClassInfo{scrguide}{Anchor: `\@currentHref'}%
\Hy@raisedlink{\hyper@anchorstart{\@currentHref}\hyper@anchorend}%
\label{\label@desc@prefix\label@base.counter.#2#1}%
\endgroup
}
\DeclareSpecialMarkup{\Counter}{\mbox{\texttt{#1}}}{%
\par
\leftskip\z@
\BeginIndex{Counter}{#1}%
\LabelCounter{#1}%
\textCounter{#1}%
}
\newcommand*{\LabelLength}[2][\label@suffix]{%
\begingroup
\protected@edef\@currentlabel{\Length{#2}}%
\label@sanitize
\Hy@MakeCurrentHref{\label@desc@prefix\label@base.length.#2#1}%
\ClassInfo{scrguide}{Anchor: `\@currentHref'}%
\Hy@raisedlink{\hyper@anchorstart{\@currentHref}\hyper@anchorend}%
\label{\label@desc@prefix\label@base.length.#2#1}%
\endgroup
}
\DeclareSpecialMarkup{\Length}{\mbox{\texttt{\char`\\#1}}}{%
\par
\leftskip\z@
\BeginIndex{Length}{#1}% index entry
\LabelLength{#1}%
\textLength{#1}%
}
\newcommand*{\LabelPLength}[2][\label@suffix]{%
\begingroup
\protected@edef\@currentlabel{\PLength{#2}}%
\label@sanitize
\Hy@MakeCurrentHref{\label@desc@prefix\label@base.plength.#2#1}%
\ClassInfo{scrguide}{Anchor: `\@currentHref'}%
\Hy@raisedlink{\hyper@anchorstart{\@currentHref}\hyper@anchorend}%
\label{\label@desc@prefix\label@base.plength.#2#1}%
\endgroup
}
\DeclareSpecialMarkup{\PLength}{\mbox{\texttt{#1}}}{%
\par
\leftskip\z@
\BeginIndex{PLength}{#1}%
\LabelPLength{#1}%
\scr@ifundefinedorrelax{%
r@\label@desc@prefix scrlttr2.cmd.setplength}{%
\textMacro{setplength}%
}{%
\begingroup
\let\Macro\textMacro
\DescRef{scrlttr2.cmd.setplength}%
\endgroup
}%
\PParameter{#1}\Parameter{\lengthname}%
}
\newcommand*{\LabelVariable}[2][\label@suffix]{%
\begingroup
\protected@edef\@currentlabel{\Variable{#2}}%
\label@sanitize
\Hy@MakeCurrentHref{\label@desc@prefix\label@base.variable.#2#1}%
\ClassInfo{scrguide}{Anchor: `\@currentHref'}%
\Hy@raisedlink{\hyper@anchorstart{\@currentHref}\hyper@anchorend}%
\label{\label@desc@prefix\label@base.variable.#2#1}%
\endgroup
}
\DeclareSpecialMarkup{\Variable}{\mbox{\texttt{#1}}}{%
\par
\leftskip\z@
\BeginIndex{Variable}{#1}%
\LabelVariable{#1}%
\scr@ifundefinedorrelax{r@\label@desc@prefix scrlttr2.cmd.setkomavar}{%
\textMacro{setkomavar}%
}{%
\begingroup
\let\Macro\textMacro
\DescRef{scrlttr2.cmd.setkomavar}%
\endgroup
}%
\PParameter{#1}\OParameter{\descriptionname}%
\Parameter{\contentname}%
}
\newcommand*{\LabelFontElement}[2][\label@suffix]{%
\begingroup
\protected@edef\@currentlabel{\FontElement{#2}}%
\label@sanitize
\Hy@MakeCurrentHref{\label@desc@prefix\label@base.fontelement.#2#1}%
\ClassInfo{scrguide}{Anchor: `\@currentHref'}%
\Hy@raisedlink{\hyper@anchorstart{\@currentHref}\hyper@anchorend}%
\label{\label@desc@prefix\label@base.fontelement.#2#1}%
\endgroup
}
\DeclareSpecialMarkup{\FontElement}{\mbox{\texttt{#1}}}{%
\par
\leftskip\z@
\BeginIndex{FontElement}{#1}%
\LabelFontElement{#1}%
\scr@ifundefinedorrelax{r@\label@desc@prefix\LabelBase.cmd.setkomafont}{%
\scr@ifundefinedorrelax{r@\label@desc@prefix maincls.cmd.setkomafont}{%
\textMacro{setkomafont}%
}{%
\begingroup
\let\Macro\textMacro
\DescRef{maincls.cmd.setkomafont}%
\endgroup
}%
}{%
\begingroup
\let\Macro\textMacro
\DescRef{\LabelBase.cmd.setkomafont}%
\endgroup
}%
\PParameter{#1}\OParameter{\fontsettingname}%
}
\newcommand*{\LabelDoHook}[2][\label@suffix]{%
\begingroup
\renewcommand*{\PName}[1]{=##1=}%
\ForDoHook{#2}{\Label@DoHook{#1}}%
\endgroup
}
\newcommand*{\Label@DoHook}[3]{%
\IfArgIsEmpty{#3}{\@firstofone}{%
\scr@ifundefinedorrelax{dhr@\label@desc@prefix\label@base.dohook.#2#1}{%
\@firstofone
}{%
\@gobble
}%
}{%
\protected@edef\@currentlabel{\DoHook{#2}}%
\label@sanitize
\Hy@MakeCurrentHref{\label@desc@prefix\label@base.dohook.#2#1}%
\ClassInfo{scrguide}{Anchor: `\@currentHref'}%
\Hy@raisedlink{\hyper@anchorstart{\@currentHref}\hyper@anchorend}%
\label{\label@desc@prefix\label@base.dohook.#2#1}%
\expandafter\gdef
\csname dhr@\label@desc@prefix\label@base.dohook.#2#1\endcsname{#3}%
}%
}
\DeclareSpecialMarkup{\DoHook}{\mbox{\texttt{#1}}}{%
\par
\leftskip\z@
\BeginIndex{DoHook}{#1}%
\LabelDoHook{#1}%
\scr@ifundefinedorrelax{r@scrbase.cmd.ExecuteDoHook}{%
\textMacro{ExecuteDoHook}%
}{%
\begingroup
\let\Macro\textMacro
\DescRef{scrbase.cmd.ExecuteDoHook}%
\endgroup
}%
\PParameter{#1}%
}
\DeclareRobustCommand*{\PName}[1]{\texttt{\textit{#1}}}
\DeclareRobustCommand*{\PValue}[1]{\texttt{#1}}
\DeclareRobustCommand*{\Parameter}[1]{%
\maybelinebreak\texttt{\{}\PName{#1}\texttt{\}}}
\DeclareRobustCommand*{\OParameter}[1]{%
\maybelinebreak\texttt{[%]
}\PName{#1}\texttt{%[
]}}
\DeclareRobustCommand*{\AParameter}[1]{%
\maybelinebreak\texttt{(%)
}\PName{#1}\texttt{%(
)}}
\DeclareRobustCommand*{\PParameter}[1]{\maybelinebreak\texttt{\{#1\}}}
\DeclareRobustCommand*{\POParameter}[1]{\maybelinebreak\texttt{[#1]}}
\newcommand\label@sanitize{%
\renewcommand*{\"}[1]{##1e}%
\renewcommand*{\IeC}[1]{\expandafter\@gobble\string##1}%
\renewcommand*{\textup}[1]{##1}%
\renewcommand*{\PName}[1]{/##1/}%
}
\newcommand*{\label@desc@prefix}{desc:}
\newcommand*{\label@suffix}{}
\newcommand*{\labelsuffix}[1][]{% Werden Dinge mehrfach dokumentiert benötigen
% sie ein zusätzliches Unterscheidungsmerkmal
% beim gesetzten Label.
\IfArgIsEmpty{#1}{\let\label@suffix\@empty}{\edef\label@suffix{.#1}}%
}
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\EMail}
% An email adress.
% \begin{macrocode}
\DeclareRobustCommand*{\EMail}[1]{\textless #1\textgreater}
% \end{macrocode}
% \end{macro}
% \begin{macro}{\TextEMail}
% EMail address at the text.
% \begin{macrocode}
\DeclareRobustCommand*{\TextEMail}[1]{{\small\EMail{#1}}}
% \end{macrocode}
% \end{macro}
%
% Setup fonts for table and figure captions:
% \begin{macrocode}
\setkomafont{caption}{\normalcolor\small}
% \end{macrocode}
%
%
% \section{Footnotes}
%
% \begin{macro}{\thempfootnote}
% \begin{macrocode}
\renewcommand*{\thempfootnote}{\textit{\@arabic{\c@mpfootnote}}}
% \end{macrocode}
% \end{macro}
%
% \section{Math}
%
% I will not use real math. But there will be some »pseudo math code«. So I
% need some macros for this.
%
% \begin{macro}{\Var}
% Variables (in real math simply |$a$| will be |\Var{a}| in my math:
% \begin{macrocode}
\newcommand*{\Var}[1]{\ensuremath{\textit{#1}}}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\Unit}
% The unit of a length.
% \begin{macrocode}
\newcommand*{\Unit}[1]{\,\ifmmode \textrm{#1}\else #1\fi}
% \end{macrocode}
% \end{macro}
%
% Wie allow page breaks at display math.
% \begin{macrocode}
\allowdisplaybreaks[1]
% \end{macrocode}
%
%
% \section{Acronyms}
%
% \begin{macro}{\Script}
% \begin{macro}{\ScriptII}
% \begin{macrocode}
\DeclareRobustCommand{\Script}{\Package{Script}}
\DeclareRobustCommand{\ScriptII}{\Package{Script-2}}
% \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\eTeX}
% This may already be defined.
% \begin{macrocode}
\providecommand*{\eTeX}{\ensuremath{\varepsilon}-\TeX}
\providecommand*{\NTS}{%
\leavevmode\hbox{$\cal N\kern-0.35em\lower0.5ex\hbox{$\cal T$}%
\kern-0.2emS$}}
% \end{macrocode}
% \end{macro}
%
%
% \section{Identification}
%
% \begin{macro}{\LabelBase}
% \begin{macro}{\labelbase}
% \changes{v1.22b}{2019/11/18}{\cs{ifstr} umbenannt in \cs{Ifstr}}%^^A
% \begin{macrocode}
\newcommand*{\labelbase}[1]{%
\Ifstr{\label@base@sec}{unknown}{}{%
\labelofbase[sec]{\label@base@sec.next}%
\gdef\label@base@sec{}%
}%
\renewcommand*{\label@base}{#1}%
\label{cha:#1}%
}
% \end{macrocode}
% \begin{macro}{\label@base}
% \begin{macro}{\label@base.sec}
% \begin{macrocode}
\newcommand*{\label@base}{unknown}
\newcommand*{\label@base@sec}{}
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \begin{macro}{\labelofbase}
% Sets a label depending on \cs{label@base}. First optional argument is the
% label prefix, second is the the label postfix.
% \begin{macrocode}
\newcommand*{\labelofbase}[2][lab]{%
\label{#1:\label@base.#2}%
}
% \end{macrocode}
% \begin{macro}{\prefix@ref}
% Internal command to set a \cs{ref}, \cs{pageref}, or \cs{autoref} to an
% label with prefix. Use it, e.g., like
% |\label@base@ref{\autoref}{sec}{maincls.cmd.foo}|.
% \begin{macrocode}
\newcommand*{\prefix@ref}[3]{%
#1{#2:#3}%
}
% \end{macrocode}
% \end{macro}
% \begin{macro}{\seclabel}
% Sets a label of type section.
% \begin{macrocode}
\newcommand*{\seclabel}[1]{%
\ifx\label@base@sec\@empty\else
\labelofbase[sec]{\label@base@sec.next}%
\fi
\xdef\label@base@sec{#1}%
\labelofbase[sec]{#1}%
}
% \end{macrocode}
% \end{macro}
% \begin{macro}{\xmpllabel}
% \begin{macro}{\Refxmpl}
% \begin{macro}{\PageRefxmpl}
% Sets a label of type example.
% \begin{macrocode}
\newcommand*{\xmpllabel}[1]{%
\labelofbase[xmpl]{#1}%
}
\newcommand*{\Refxmpl}{%
\kernel@ifstar {\prefix@ref{\autoref*}{xmpl}}%
{\prefix@ref{\autoref}{xmpl}}%
}
\newcommand*{\PageRefxmpl}{%
\kernel@ifstar {\prefix@ref{\autopageref*}{xmpl}}%
{\prefix@ref{\autopageref}{xmpl}}%
}
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% User command to get the current label base.
% \begin{macrocode}
\newcommand*{\LabelBase}{\@nameuse{label@base}}
% \end{macrocode}
% \end{macro}
%
% \section{Special Environments}
%
% \begin{environment}{Declaration}
% Declaration of macros, environments, options, lengths, counters, pseudo
% length, variables etc.\footnote{TODO: Redefining most declaration commands
% to also write labels.}
% \begin{macrocode}
\colorlet{Declaration}{PaleTurquoise}
\newsavebox\Declaration@Box
\newcommand*{\Declaration@Width}{\linewidth}
\newcommand*{\Declaration@LeftIndent}{-2\fboxsep}
\newcommand*{\Declaration@UseBox}[1]{%
\colorbox{Declaration}{\usebox\Declaration@Box}%
}
\newenvironment{Declaration}[1][2]{%
\def\Declare@Lines{#1\baselineskip}%
% Als erstes wird eine neue Index-Gruppe begonnen. Dagegen darf die
% vorherige Index-Gruppe hier nicht automatisch geschlossen werden, weil
% beispielsweise ein Abschnitt oder ein Kapitel ebenfalls eine Index-Gruppe
% sein könnte (aber nicht muss).
\BeginIndexGroup
% Die Absatzformatierung anpassen. Eigentlich hier noch nicht notwendig,
% schadet aber auch nichts.
\parindent\z@
\parfillskip\@flushglue
\parskip\z@
% \Macro, \Environment, etc. so umdefinieren, dass sie passend für die
% Umgebung formatiert werden und auch gleich Label und Index-Einträge
% erzeugt werden.
\scr@Desc@let\Macro
\scr@Desc@let\Option
\scr@Desc@let\KOption
\scr@Desc@let\OptionValue
\scr@Desc@let\OptionVName
\scr@Desc@let\Variable
\scr@Desc@let\Environment
\let\endEnvironment\endDescEnvironment
\scr@Desc@let\Counter
\scr@Desc@let\Length
\scr@Desc@let\PageStyle
\scr@Desc@let\PLength
\scr@Desc@let\FontElement
\scr@Desc@let\FloatStyle
\scr@Desc@let\DoHook
% Todo: Replace the following by the correct definitions:
\let\XMacro\textMacro
\let\XEnvironment\textEnvironment
\let\XOption\textOption
\let\XOptionValue\textOptionValue
\newenvironment{Body}{% Umgebung für den (vertikalen) Inhalt einer Umgebung
\\
\setlength{\leftskip}{1em}%
\minipage{\dimexpr\linewidth-\leftskip}%
\raggedright
\newcommand*{\BodyDots}{%
\par
\hskip-\leftskip
\raisebox{0pt}[1.1\ht\strutbox][.5\dp\strutbox]{$\vdots$}%
\par
}%
}{%
\par
\endminipage
\\
}%
% Todo: Behandlung für Optionen, Längen, Zähler, Font-Elemente, Seitenstile,
% etc.
% Maybe: Vielleicht wäre es besser, die \X…-Definitionen von hier direkt zur
% Definition der entsprechenden Elemente zu verlagern und sie \D… zu
% nennen. Das wird dann eventuell übersichtlicher als alles hier zu
% machen. Hier gäbe es dann nur noch für jedes Element genau ein
% \let\…\D….
% Jetzt wird der ganze Inhalt der Umgebung linksbündig in eine Box gepackt
\begin{lrbox}{\Declaration@Box}%
\minipage{\Declaration@Width}%
\raggedright
\parskip\baselineskip
\small
\addtolength{\parskip}{-\baselineskip}%
\catcode`\^^M=9 % ignore line ends
}{%
\par
\endminipage
\end{lrbox}
\vskip 1\baselineskip \@plus .75\baselineskip \@minus .25\baselineskip
% Hier darf ein Seitenumbruch ohne vertikalen Ausgleich erfolgen, wenn nicht
% mindestens für die Deklaration und einige Zeilen Platz ist.
\vskip \dimexpr\ht\Declaration@Box+\dp\Declaration@Box+\Declare@Lines\relax
\penalty-\@medpenalty
\vskip -\dimexpr\ht\Declaration@Box+\dp\Declaration@Box+\Declare@Lines\relax
\begingroup% Dann wird die erzeugte Box farbig hinterlegt leicht im linken
% Rand ausgegeben.
\parfillskip\@flushglue
\parindent\z@
\leavevmode
\hspace*{\Declaration@LeftIndent}%
\Declaration@UseBox{\Declaration@Box}%
\par\nobreak\vskip\fboxsep
\endgroup\nobreak
% Der nachfolgende Text soll wie bei einer Überschrift behandelt werden.
\aftergroup\@afterindentfalse\aftergroup\@afterheading
}
% \end{macrocode}
% \begin{macro}{\scr@Desc@let}
% Redefine the internal command of a robust command.
% \begin{macrocode}
\newcommand*{\scr@Desc@let}[1]{%
\expandafter\def
\csname \expandafter\@gobble\string #1 \expandafter\endcsname\expandafter{%
\csname Desc\expandafter\@gobble\string #1\endcsname}%
}
% \end{macrocode}
% \end{macro}
% \end{environment}
%
% \begin{environment}{Example}
% \changes{v1.15a}{2019/10/17}{Space removed}%
% This environment is used for all examples at the \KOMAScript{} guide.
% \begin{macrocode}
\newenvironment{Example}{%
\lstset{belowskip=0pt plus 1pt minus .5pt}%
\labeling{{\usekomafont{disposition}\GuideExample:}}
\item[{\usekomafont{disposition}\GuideExample:}]%
}{%
\endlabeling
}
% \end{macrocode}
% \end{environment}
% \begin{macro}{\ExampleEndFix}
% \changes{v1.18}{2019/10/25}{New}%^^A
% If an example is at the end of a description and before a new description
% the vertical spacing is suboptimal. Sorry, but this cannot be fixed
% automatically currently. But here is a manual fix:
% \begin{macrocode}
\newcommand*{\ExampleEndFix}{\vskip -1\ht\strutbox plus .75\strutbox}
% \end{macrocode}
% \end{macro}
%
% \begin{environment}{ShowOutput}
% This environment is used for the output of examples. It shows the middle
% part of a page\footnote{TODO: optional arguments for printing a top or
% bottom part of a page}. It uses |\scalebox| so you should never use a
% DVI preview or a raw DVI printing.
% \begin{macrocode}
\newsavebox\ShowOutputBox
\newenvironment{ShowOutput}[1][0pt]{\par
\begin{lrbox}{\ShowOutputBox}%
\minipage{.9\linewidth}%
\vspace*{\baselineskip}\vspace{-#1}%
}{%
\endminipage
\end{lrbox}%
\setlength{\unitlength}{1pt}%
\setlength{\@tempdima}{\ht\ShowOutputBox}%
\addtolength{\@tempdima}{\dp\ShowOutputBox}%
\setlength{\@tempdima}{.75\@tempdima}%
\edef\MidY{\strip@pt\@tempdima}%
\addtolength{\@tempdima}{5pt}%
\edef\HighY{\strip@pt\@tempdima}%
\addtolength{\@tempdima}{-10pt}%
\edef\LowY{\strip@pt\@tempdima}%
\addtolength{\@tempdima}{5pt}%
\setlength{\@tempdima}{.9\linewidth}\edef\QuadIV{\strip@pt\@tempdima}%
\setlength{\@tempdima}{.675\linewidth}\edef\QuadIII{\strip@pt\@tempdima}%
\setlength{\@tempdima}{.45\linewidth}\edef\QuadII{\strip@pt\@tempdima}%
\setlength{\@tempdima}{.225\linewidth}\edef\QuadI{\strip@pt\@tempdima}%
\centering
\begin{picture}(\QuadIV,\MidY)
\qbezier(0,\MidY)(\QuadI,\HighY)(\QuadII,\MidY)%
\qbezier(\QuadII,\MidY)(\QuadIII,\LowY)(\QuadIV,\MidY)
\put(0,0){\makebox(\QuadIV,\MidY)[c]{%
\scalebox{.75}{\usebox{\ShowOutputBox}}%
}%
}%
\put(0,-5){\line(0,1){\HighY}}%
\put(\QuadIV,-5){\line(0,1){\HighY}}%
\qbezier(0,-5)(\QuadI,0)(\QuadII,-5)%
\qbezier(\QuadII,-5)(\QuadIII,-10)(\QuadIV,-5)
\end{picture}\par
\vspace{1ex plus 1ex minus .5ex}%
}
% \end{macrocode}
% \end{environment}
%
% \begin{environment}{Explain}
% Some parts of the documentation are importing for understanding
% \KOMAScript{} but not important for using \KOMAScript.
% \begin{macrocode}
\newenvironment{Explain}{%
\par\sffamily\ignorespaces
}{%
\par
}
% \end{macrocode}
% \end{environment}
%
%
% \subsection{Used by Jens-Uwe only}
%
% There are some example visualizations used only by Jens-Uwe.\footnote{TODO:
% All these should be merged with \texttt{ShowOutputBox}.}
%
% \begin{environment}{XmpTopPage}
% Output of the top of a page.
% \begin{macrocode}
\newenvironment{XmpTopPage}
{%
\begin{center}
\iffree{\setlength{\unitlength}{1mm}}{\setlength{\unitlength}{.833mm}}%
\begin{picture}(100,39)
\thinlines
\qbezier(0,5)(25,7)(50,5)\qbezier(50,5)(75,3)(100,5)
\put(0,5){\line(0,1){34}}
\thicklines
\put(100,5){\line(0,1){34}}\put(0,39){\line(1,0){100}}
\footnotesize
}{%
\end{picture}
\end{center}\vspace{-1.5\baselineskip}%
}
% \end{macrocode}
% \end{environment}
%
% \begin{environment}{XmpBotPage}
% Output of the bottom of a page.
% \begin{macrocode}
\newenvironment{XmpBotPage}
{\begin{center}
\iffree{\setlength{\unitlength}{1mm}}{\setlength{\unitlength}{.833mm}}%
\begin{picture}(100,40)%
\thinlines
\qbezier(0,38)(25,40)(50,38)\qbezier(50,38)(75,36)(100,38)
\put(0,5){\line(0,1){33}}
\thicklines
\put(100,5){\line(0,1){33}}\put(0,5){\line(1,0){100}}
\footnotesize
}{%
\end{picture}\end{center}\vspace{-1.5\baselineskip}%
}
% \end{macrocode}
% \end{environment}
%
% \begin{macro}{\XmpSetText}
% Output some text at \texttt{XmpTopPage} or \texttt{XmpBotPage}.
% \begin{macrocode}
\newcommand{\XmpSetText}[2][\XmpText]{%
\put(#2){\makebox(0,0)[tl]{\parbox{70\unitlength}{\parfillskip=0pt
#1}}}}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\XmpMarginNote}
% Output a margin note at \texttt{XmpTopPage} or \texttt{XmpBotPage}.
% \begin{macrocode}
\newcommand{\XmpMarginNote}[1]{%
\put(#1){\makebox(0,5)[tl]{\scriptsize\XmpMarginTextA}}
\put(#1){\makebox(0,5)[bl]{\scriptsize\XmpMarginTextB}}}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\XmpRule}
% Output a horizonal rule at a \texttt{XmpTopPage} or \texttt{XmpBotPage}.
% \begin{macrocode}
\newcommand{\XmpRule}[2]{\put(#1){\line(1,0){#2}}}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\XmpHeading}
% Output a head line at a \texttt{XmpTopPage} or \texttt{XmpBotPage}.
% \begin{macrocode}
\newcommand{\XmpHeading}[3][\KOMAScript\hfill 3]{%
\put(#2){\makebox(#3,0)[l]{#1}}}
% \end{macrocode}
% \end{macro}
%
%
% \section{Margin Notes}
%
% \begin{macro}{\OnlyAt}
% Some things are not available at every \KOMAScript{} class. To show the
% differences we'll put a margin note. If more than one class or package
% should be noted, |\and| will be used to separate them.
% \begin{macrocode}
\newcommand*{\OnlyAt}[1]{%
\marginline{\def\and{,\\}\footnotesize #1\par}%
}
% \end{macrocode}
% \end{macro}
%
%
% \section{Change Log}
%
% Not all features are part of every old \KOMAScript{} release. New features
% will be marked and these marks are referenced at a kind of index.
%
% \begin{macro}{\ChangedAt}
% \changes{v1.22b}{2019/11/18}{\cs{ifstr} umbenannt in \cs{Ifstr}}%^^A
% Set the margin note and write an entry to the change log.\footnote{TODO:
% Don't use the glossary, use a file by my own.}
% \begin{macrocode}
\providecommand*{\ChangedAt}[3][]{%
\Ifstr{#1}{}{%
\marginnote{\tiny\fbox{\strut#2}}%
}{%
\def\reserved@a##1/##2\@nil{%
\count@\year
\advance\count@-##1\relax
\multiply\count@ by 12\relax
\advance\count@\month
\advance\count@-##2\relax
}\reserved@a#1\@nil
\ifnum\count@<13
\marginnote{\tiny Beta-Feature}%
\else
\marginnote{\tiny\fbox{\strut #2}}%
\fi
}%
\begingroup
\let\@tempa\@empty
\Ifstr{#2}{v2.9i}{\def\@tempa{v2.90i=}}{}%
\Ifstr{#2}{v2.9t}{\def\@tempa{v2.90t=}}{}%
\let\and\ignorespaces
\def\Package##1{%
\glossary{##1=\string\Package{##1}>\@tempa#2|indexrm}%
\glossary{\@tempa#2>##1=\string\Package{##1}|indexrm}%
\ignorespaces
}%
\def\Class##1{%
\glossary{##1=\string\Class{##1}>\@tempa#2|indexrm}%
\glossary{\@tempa#2>##1=\string\Class{##1}|indexrm}%
\ignorespaces
}%
\ignorespaces #3%
\endgroup
}
% \end{macrocode}
% \end{macro}
%
% While I currently use the glossary, we have to make it:
% \begin{macrocode}
\makeglossary
% \end{macrocode}
%
% \begin{macro}{\printchangelog}
% We don't want to generate the change log only. We also have to print it.
% \begin{macrocode}
\newcommand*{\printchangelog}{\@input@{\jobname.chn}}
% \end{macrocode}
% \end{macro}
% \begin{environment}{thechangelog}
% And this will be used at the \texttt{chn} file. The change log index will
% always generate an entry to the table of contents.
% \begin{macrocode}
\newenvironment{thechangelog}{%
\setchapterpreamble{\GuideChangeLogPreamble\par\bigskip}%
\addchap{\changelogname}%
\markboth{\changelogname}{\changelogname}%
\setlength{\parindent}{0pt}%
\setlength{\parskip}{0pt plus .3pt}%
\setlength{\parfillskip}{0pt plus 1fil}%
\def\and{,\ }%
\let\item\@idxitem
}{%
\clearpage
}
% \end{macrocode}
% The macros |\GuideChangeLogPreamble| and |\changelogname| have to be
% defined at the language file.
% \end{environment}
%
%
% \section{Special Tabulars and Tables}
%
% I need some special tabulars and tables. These are used for describing
% single topics.
%
% \begin{environment}{desctabular}
% \changes{v1.13d}{2019/02/01}{\cs{addlinespace} removed from end code}^^A
% This kind of tabluar has primary one column but uses two columns in
% declaration. It's something like a \texttt{description} environment with
% line break after the item. I've used a \texttt{tabular} at the definition
% because of full compatibitlity with \texttt{desctable}.
% \begin{length}{\descwidth}
% I need a length of local usage. I could have used |\@tempdima| or
% another local length from kernel. But I've decided not to try to find a
% unused length at \texttt{tabular} environment.
% \begin{length}{\descdefaultindent}
% And I need a length of global usage.
% \begin{macrocode}
\newlength{\descwidth}
\newlength{\descdefaultindent}\setlength{\descdefaultindent}{2em}
% \end{macrocode}
% \end{length}
% \end{length}
% The definition of \texttt{desctabular} is very simple, because the main
% work will be done by a \emph{worker} macro that will be defined later.
% \begin{macrocode}
\newenvironment{desctabular}[1][c]{%
\start@desctab{\descdefaultindent}%
\tabular[#1]{lp{\descwidth}}
\toprule
}{%
\bottomrule
\endtabular
}
% \end{macrocode}
% \end{environment}
%
% \begin{environment}{desctable}
% \textbf{Deprecated! Use \texttt{desclist} instead of!}
% This is almost the same like \texttt{desctabular} but it uses a longtable
% to allow page breaks.
% \begin{macrocode}
\newenvironment{desctable}[1][\descdefaultindent]{%
\ClassError{scrguide}{deprecated environment}{%
please replace desctable by desclist}%
\onelinecaptionsfalse
\start@desctab{#1}%
\newcommand{\Endfirsthead}{\toprule\endfirsthead}%
\newcommand{\Endhead}{\midrule\endhead}%
\newcommand*{\standardfoot}{%
\addlinespace[-.5\normalbaselineskip]\midrule
\multicolumn{2}{r@{}}{\dots}\\
\endfoot
\addlinespace[-.5\normalbaselineskip]\bottomrule
\endlastfoot
}%
\longtable{lp{\descwidth}}%
}{%
\endlongtable
}
% \end{macrocode}
% \end{environment}
%
% \begin{macro}{\start@desctab}
% \changes{v1.7c}{2013/10/13}{\cs{leavevmode}\cs{ignorespaces} added to
% \cs{nentry}}%^^A
% \changes{v1.16}{2019/10/23}{links for plengths added}%^^A
% \changes{v1.17}{2019/10/23}{links for variables added}%^^A
% This is the \emph{worker} macro of \texttt{desctable} and
% \texttt{desctabular}. It does the complete calculations and definition of
% the entry (something like |\item|) commands.
% \begin{macrocode}
\newcommand*{\start@desctab}[1]{%
\setlength{\descwidth}{\linewidth}%
\addtolength{\descwidth}{-4\tabcolsep}%
\addtolength{\descwidth}{-#1}%
\setlength{\labelwidth}{\linewidth}%
\addtolength{\labelwidth}{-2\tabcolsep}%
\newcommand{\nentry}[2]{%
\multicolumn{2}{p{\labelwidth}}{\raggedright##1}\tabularnewline*%
\hspace*{#1} & \leavevmode\ignorespaces ##2\tabularnewline%
}%
\newcommand{\entry}[2]{\nentry{##1}{##2}[.5\baselineskip]}%
\newcommand*{\pentry}[1]{%
\entry{%
\scr@ifundefinedorrelax{r@\label@desc@prefix\LabelBase.plength.##1}{%
\ClassWarning{scrguide}{%
Reference `\label@desc@prefix\LabelBase.plength.##1' undefined}%
\PLength{##1}%
}{%
\DescRef{\LabelBase.plength.##1}%
}%
\IndexPLength[indexmain]{##1}}}%
\newcommand*{\pventry}[1]{\entry{\PValue{##1}}}%
\newcommand*{\mentry}[1]{\entry{\Macro{##1}}}%
\newcommand*{\ventry}[1]{%
\entry{%
\scr@ifundefinedorrelax{r@\label@desc@prefix\LabelBase.variable.##1}{%
\ClassWarning{scrguide}{%
Reference `\label@desc@prefix\LabelBase.variable.##1 undefined}%
\Variable{##1}%
}{%
\DescRef{\LabelBase.variable.##1}%
}%
\IndexVariable[indexmain]{##1}%
}%
}%
\newcommand*{\feentry}[1]{%
\entry{%
\scr@ifundefinedorrelax{r@\label@desc@prefix\LabelBase.fontelement.##1}{%
\ClassWarning{scrguide}{%
Reference `\label@desc@prefix\LabelBase.fontelement.##1' undefined}%
\FontElement{##1}%
}{%
\DescRef{\LabelBase.fontelement.##1}%
}%
\IndexFontElement[indexmain]{##1}}%
}%
\newcommand*{\oentry}[1]{%
\entry{\Option{##1}\IndexOption[indexmain]{##1}}%
}%
}
% \end{macro}
%
% \begin{environment}{desclist}
% This is similar to \texttt{desctable} but it has been build by single
% tabulars instead of longtable.
% \begin{macro}{\desccaptionb@xfirst}
% \begin{macro}{\desccaptionb@xother}
% \begin{macro}{\descfootb@x}
% \begin{macro}{\descentryb@x}
% \begin{macro}{\desccaptiob@xnext}
% \begin{macrocode}
\newsavebox\desccaptionb@xfirst
\newsavebox\desccaptionb@xother
\newsavebox\descfootb@x
\newsavebox\descentryb@x
\newif\ifdescpage@dd
\newcommand*{\desccaptionb@xnext}{}
\newcommand*{\abovecaptionskipcorrection}{}
\newenvironment{desclist}[1][\descdefaultindent]{%
\par
\setparsizes{\z@}{\z@}{\z@\@plus 1fil}\selectfont%
\vskip\intextsep
\start@desctab{#1}%
\csname @desclistinithook\endcsname
\def\@captype{table}%
\newcommand{\desccaption}{\@dblarg{\@desccaption}}%
\newcommand{\@desccaption}[3][]{%
\setbox\desccaptionb@xfirst\vbox{%
\tabular{p{\labelwidth}}%
\multicolumn{1}{@{}p{\dimexpr\labelwidth+2\tabcolsep}@{}}{%
\captionaboveof{table}[##1]{##2\unskip\strut}%
}\tabularnewline[%
\dimexpr \abovecaptionskip-\normalbaselineskip\relax
% \dimexpr \abovecaptionskip-\abovecaptionskipcorrection\relax
]
\toprule\tabularnewline
\endtabular
\vskip -\baselineskip
}%
\let\abovecaptionskipcorrection\@empty
\setbox\desccaptionb@xother\vbox{%
\tabular{p{\labelwidth}}
\multicolumn{1}{@{}p{\dimexpr\labelwidth+2\tabcolsep}@{}}{%
\@@makecaption\@firstofone{\fnum@table}{\ignorespaces ##3}%
}\tabularnewline[-\normalbaselineskip]
\addlinespace[\abovecaptionskip]
\toprule\tabularnewline
\endtabular
\vskip -\baselineskip
}%
\let\desccaptionb@xnext\desccaptionb@xfirst
}%
\setbox\descfootb@x\vbox{%
\tabular{p{\labelwidth}}%
\addlinespace[-.5\normalbaselineskip]\midrule
\addlinespace[-\dp\strutbox]
\raggedleft\dots\hspace*{-\tabcolsep}\tabularnewline
\endtabular
}%
\newcommand*{\entryskip}[1][]{%
\ifx\relax##1\relax\else\vskip##1\relax\fi
}%
\renewcommand{\nentry}[2]{%
\typeout{TRACE: Generate entry}%
\setbox\descentryb@x\vbox{%
\ifx\desccaptionb@xnext\desccaptionb@xfirst\copy\desccaptionb@xnext\fi
\makebox[\linewidth][l]{\begin{tabular}{lp{\descwidth}}%
\multicolumn{2}{p{\labelwidth}}{\raggedright##1}\tabularnewline
\hspace*{#1} & ##2\tabularnewline
\end{tabular}}%
}%
\typeout{TRACE: entry done}%
\begingroup
\dimen@ \ht\descentryb@x
\advance \dimen@ \dp\descentryb@x
\ifdim \ht\descfootb@x>\ht\strutbox
\advance \dimen@ \ht\descfootb@x
\else
\advance \dimen@ \ht\strutbox
\fi
\ifdim \dp\descfootb@x>\dp\strutbox
\advance \dimen@ \dp\descfootb@x
\else
\advance \dimen@ \dp\strutbox
\fi
\advance \dimen@ \baselineskip
\dimen@ii \pagegoal \advance \dimen@ii -\pagetotal
\typeout{TRACE: \the\dimen@>\the\dimen@ii\space (footbox
ht=\the\ht\descfootb@x, dp=\the\dp\descfootb@x; strutbox
ht=\the\ht\strutbox, dp=\the\dp\strutbox)?}%
\ifdim \dimen@>\dimen@ii
\typeout{TRACE: Break table \thetable}%
\ifx\desccaptionb@xnext\@empty
\csname @desclistentryhook\endcsname
{\copy\descfootb@x}%
\fi
\newpage
\ifx\desccaptionb@xnext\@empty
\typeout{TRACE: switch page}%
\ifdescpage@dd
\aftergroup\descpage@ddfalse
\expandafter\descpage@ddfalse
\else
\aftergroup\descpage@ddtrue
\expandafter\descpage@ddtrue
\fi
\csname @desclistentryhook\endcsname
{\copy\desccaptionb@xother}%
\fi
\fi
\endgroup
\ifx\desccaptionb@xnext\desccaptionb@xfirst
\Ifthispageodd{\descpage@ddtrue}{\descpage@ddfalse}%
\fi
\csname @desclistentryhook\endcsname
{\copy\descentryb@x}%
\let\desccaptionb@xnext\@empty
\entryskip
}%
}{%
\vskip -.5\baselineskip
\setbox\descfootb@x\vbox{%
\tabular{p{\labelwidth}}
\bottomrule\tabularnewline
\endtabular
}%
\csname @desclistentryhook\endcsname
{\copy\descfootb@x}%
\par\nobreak
\vskip -\baselineskip \vskip \intextsep
}
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{environment}
%
%
% \section{Listings}
%
% Setup listings:
% \begin{macrocode}
\lstset{%
basicstyle=\ttfamily,%
columns=fullflexible,keepspaces,%
aboveskip=.4\baselineskip,%
belowskip=\dp\strutbox plus 1pt minus .5pt,%
literate=%
{Ö}{{\"O}}1
{Ä}{{\"A}}1
{Ü}{{\"U}}1
{ß}{{\ss}}1
{ü}{{\"u}}1
{ä}{{\"a}}1
{ö}{{\"o}}1
{»}{{\guillemetright}}1
{«}{{\guillemetleft}}1
}%
\lstdefinestyle{code}{%
language=[LaTeX]TeX,%
moretexcs={%
@auxout,@currext,@dottedtocline,@empty,@float,
@gobble,@gobbletwo,
@hangfrom,@ifpackagelater,
@ifundefined,@mkboth,
@rightmark,@secondoftwo,
@tempskipa,@tempdima,@tempswafalse,@tempswatrue,
@undefined,
AtBeginDocument,AtEndDocument, appendix, ClassWarningNoLine,CurrentOption,
color,colorbox,
DeclareOption,DeclareRobustCommand,dimexpr,end@float,ExecuteOptions,
gluexpr,
if@filesw,if@tempswa,if@twoside,includegraphics,
labelformat,
MessageBreak,
numexpr,
onehalfspacing,
PackageError,PackageInfo,PackageWarning,PassOptionsToPackage,
ProcessOptions,protected@edef,protected@write,
ProvidesFile,ProvidesPackage,
providecommand,
RequirePackage,RequirePackageWithOptions,setkey,setlength,
SelectInputMappings,setkeys,
textsuperscript}%
}%
\lstdefinestyle{output}{%
breaklines,prebreak=\mbox{$\hookleftarrow$}%
}%
\lstdefinestyle{KOMA}{%
style=code,%
moretexcs={%
@addtoplength,@setplength,@newplength, activateareas,
addchap,addrentry,Address,addcontentslinetoeachtocfile,
addxcontentslinetoeachtocfile,addsec,
addtoeachtocfile,
addtokomafont,addtolengthplength,addtoplength,addtoreffields,addtotoclist,
addxcontentsline,
adrchar,adrentry,
AddLayersAtBeginOfPageStyle,AddLayersToPageStyle,
AddtoDoHook,AddtoOneTimeDoHook,
AfterBibliographyPreamble,AfterCalculatingTypearea,
AfterFile,AfterPackage,AfterStartingTOC,AfterTOCHead,
appendixmore,appendixname,areaset,autodot,automark,AtAddToTocList,
AtBeginLetter,At@startsection,
Before@sect,Before@ssect,
BeforeFamilyProcessOptions,
BeforeClosingMainAux,BeforePackage,BeforeStartingTOC,
bib@beginhook,bib@endhook,
blinddocument,blindtext,Blinddocument,Blindtext,
cc,captionabove,captionaboveof,captionbelow,captionbelowof,captionformat,
captionof,cefoot,cfoot,chapapp, chapappifchapterprefix,
chapterheadstartvskip,chapterheadmidvskip,chapterheadendvskip,
chapter,chapterlinesformat,chapterlineswithprefixformat,
chapterformat,chaptermarkformat,chapternumdepth,chaptertocdepth,
chapterpagestyle,chead,
Clause,
cleardoubleevenemptypage,cleardoubleoddpage,
clearscrheadfoot,closing,cofoot,Comment,
CloneTOCEntryStyle,
DeclareNewJuraEnvironment,
DeclareLayer,DeclareNewLayer,DeclareNewPageStyleByLayers,
DeclarePageStyleByLayers,
DeclareTOCStyleEntry,DeclareTOCEntryStyle,
DeclareNewNoteColumn,DeclareNewPageStyleAlias,
DeclareNewTOC,DeclareSectionCommand,DeclareNewSectionCommand,
RedeclareSectionCommand,ProvideSectionCommand,
dedication,defcaptionname,deffootnote,deffootnotemark,
DefineFamily,DefineFamilyKey,DefineFamilyMember,
DefineTOCEntryOption,DefineTOCEntryBooleanOption,
DefineTOCEntryCommandOption,DefintTOCEntryIfOption,
DefineTOCEntryLengthOption,DefineTOCEntryNumberOption,
DestroyLayer,defpagestyle,deftripstyle,
dictum,dictumauthorformat,dictumrule,dictumwidth,doforeachtocfile,
ellipsispar,
encl,ExecuteDoHook,extratitle,FamilyBoolKey,FamilyExecuteOptions,
FamilyKeyState,FamilyKeyStateUnknown,FamilyKeyStateProcessed,
FamilyKeyStateUnknownValue,FamilyKeyStateNeedValue,
FamilyNumericalKey,%
FamilyOption,FamilyOptions,FamilyProcessOptions,FamilySetBool,
FamilyStringKey,FamilyUnknownKeyValue,
figureformat,figurename,firstfoot,firsthead,FirstName,footfont,footref,
ForDoHook,ForEachLayerOfPageStyle,
FreeI,FreeII,FreeIII,FreeIV,
GenericMarkFormat,
headfont,headmark,
Ifattoclist,Ifkomavar,Ifkomavarempty,Ifstr,Ifstrstart,Ifthispageodd,
Ifundefinedorrelax,IfUsePrefixLine,
ifundefinedorrelax,
ifattoclist,ifoot,ihead,ifkomavarempty,ifstr,ifthispageodd,
IfActiveMkBoth,InputAddressFile,
KOMAoption,KOMAoptions,KOMAScript, l@addto@macro,
LastName,layerwidth,layerheight,lefoot,lefttopmark,leftbotmark,
leftfirstmark,lehead,LetterOptionNeedsPapersize,
LenToUnit,
lipsum,listoffigures,
listoftables,listoftoc,LoadLetterOption,lofoot,lohead,lowertitleback,
MakeMarkcase,makenote,maketitle,manualmark,marginline,markleft,markdouble,
minisec,
multfootsep,multiplefootnoteseparator,
Name,nameday,newbibstyle,newcaptionname,newkomavar,nexthead,
ofoot,ohead,opening,othersectionlevelsformat,
p@section,pagemark,paragraphformat,subparagraphformat,
paragraphnumdepth,paragraphtocdepth,
subparagraphnumdepth,subparagraphtocdepth,
parellipsis,parformat,parname,parshortname,
part,partformat,partlineswithprefixformat,
partname,partnumdepth,partpagestyle,partnumdepth,
partheadstartvskip,partheadmidvskip,partheadendvskip,
pnumfont,
PreventPackageFromLoading,providecaptionname,publishers,ps,
putLL,putLR,putUL,putUR,putC,
raggedcaption,raggedchapter,raggedfootnote,raggedsection,raggedpart,
raggedsignature,
recalctypearea,
refL,refS,refN,refoot,
refParagraph,refParagraphN,refPar,refParL,refParS,refParN,
refSentence,refSentenceL,refSentenceS,refSentenceN,rehead,
RelaxFamilyKey,
removereffields,renewcaptionname,
RedeclarePageStyleAlias,RedeclareTOCStyleEntry,
ReplaceInput,ReplacePackage,ResetPreventPackageFromLoading,
rightbotmark,righttopmark,rightfirstmark,
rohead,
sectionformat,subsectionformat,subsubsectionformat,
sectionnumdepth,sectiontocdepth,
subsectionnumdepth,subsectiontocdepth,
subsubsectionnumdepth,subsubsectiontocdepth,
sectionmarkformat,sectioncatchphraseformat,sectionlinesformat,
Sentence,sentencename,sentenceshortname,
setbibpreamble,setcapindent,setcapwidth,setcaptionalignment,
setchapterpreamble,setfootbotline,setfootsepline,setfootwidth,
setheadsepline,setheadtopline,setheadwidth,setindexpreamble,setkomafont,
setkomavar,setlengthtoplength,setparsizes,setpartpreamble,
setplength,setuptoc,
showfields,showenvelope,showISOenvelope,showUScommercial,showUScheck,
SplitDoHook,
storeareas,StorePreventPackageFromLoading,
subject,SubClause,subsectionmarkformat,subtitle,syncwithnotecolumn,
tableformat,tablename,tableofcontents,textsubscript,thechapter,thefigure,
thefootnotemark,thepar,thepart,thesection,thesentence,thesubsection,
thesubsubsection,theparagraph,thesubparagraph,
thetable,thistime,
titlehead,tocbasic@extend@babel,TOCclone,todaysname,typearea,%
TOCEntryStyleInitCode,TOCEntryStyleStartInitCode,TOCLineLeaderFill,
UnPreventPackageFromLoading,unitfactor,
unsettoc,usekomafont,useplength,usekomavar,uppertitleback%
}%
}%
\lstnewenvironment{lstoutput}[1][]{%
\lstset{style=output,basicstyle=\ttfamily\codesize,#1}%
}{}%
\lstnewenvironment{lstcode}[1][]{%
\lstset{style=KOMA,basicstyle=\ttfamily\codesize,#1}%
}{}%
\newcommand*{\lstinputcode}[1][]{%
\lstinputlisting[style=KOMA,basicstyle=\ttfamily\codesize,#1]%
}
\newcommand*{\codesize}{\small}
% \end{macrocode}
%
%
% \section{hyperref Addons}
%
% \begin{macro}{\KOMAScript}
% \begin{macro}{\Guide@KOMAScript}
% We need some additions to \textsf{hyperref}.
% \begin{macrocode}
\newcommand*{\Guide@KOMAScript}{}
\expandafter\let\csname Guide@KOMAScript\expandafter\endcsname\csname
KOMAScript \endcsname
\DeclareRobustCommand*{\KOMAScript}{%
\texorpdfstring{\Guide@KOMAScript}{KOMA-Script}%
}
% \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\url@}
% \changes{v1.9b}{2015/09/30}{\cs{GuideCTANserver} not needed and removed}%^^A
% \changes{v1.22a}{2019/11/18}{https instead of http}%^^A
% Redefine to make \texttt{CTAN://} be an alias for
% \texttt{https://mirror.ctan.org/}.
% \begin{macrocode}
\def\url@#1{\expandafter\url@@#1\@nil}
\def\url@@#1://#2\@nil{%
\def\@tempa{#1}\def\@tempb{CTAN}\ifx\@tempa\@tempb
\hyper@linkurl{\Hurl{#1://#2}}{https://mirror.ctan.org/#2}%
\else
\hyper@linkurl{\Hurl{#1://#2}}{#1://#2}%
\fi
}
% \end{macrocode}
% \end{macro}
%
% We have to setup \textsf{hyperref}:
% \begin{macrocode}
\AtBeginDocument{%
\iffree{%
\hypersetup{%
plainpages=false,
pdftitle={\GuideTitle},
pdfauthor={Markus Kohm},
pdfsubject={\GuideSubject},
pdfkeywords={\KOMAScript, scrbook, scrreprt, scrartcl,
typearea, scrlfile, scrlayer, scrlayer-scrpage, scrlayer-notecolumn,
scrletter, scrlttr2, scraddr, scrtime, scrdate, scrwfile},
pdfcreator={\KOMAScript, hyperref}
}%
}{}%
}
% \end{macrocode}
%
% \begin{macro}{\autopageref}
% This is something like |\autoref| but with page reference. A simple
% definition would use |\hyperref| and |\pageref*|. But I want to allow to
% decide if the reference is the page or the label. So this definition is
% more like |\autoref|.
% \begin{macrocode}
\DeclareRobustCommand{\autopageref}[1]{%
\expandafter\auto@setpageref\csname r@#1\endcsname
\@secondoffive
{#1}%
}
% \end{macrocode}
% \begin{macro}{\auto@setpageref}
% This is the \emph{worker} macro. It checks for the label and trys to set
% either a reference to the page or a reference to the label.
% \begin{macrocode}
\newcommand*{\auto@setpageref}[3]{%
\@safe@activestrue
\ifx#1\relax
\protect\G@refundefinedtrue
\nfss@text{\reset@font\bfseries ??}%
\@latex@warning{%
Reference `#3' on page \thepage \space undefined%
}%
\else
\def\@currentHtag{\pageautorefname~}%
\if@pagereftolabel
\hyper@@link
{\expandafter\@fifthoffive#1}%
{\expandafter\@fourthoffive#1\@empty\@empty}%
{\@currentHtag\expandafter#2#1\@empty\@empty\null}%
\else
\hyper@@link
{\expandafter\@fifthoffive#1}%
{page.\expandafter\@secondoffive#1\@empty\@empty}%
{\@currentHtag\expandafter#2#1\@empty\@empty\null}%
\fi
\fi
\@safe@activesfalse
}
% \end{macrocode}
% \end{macro}
% \end{macro}
%
%
% \section{Entries to \contentsname, \figurelistname, etc.}
%
% We have large page numbers, so better setup the needed width. And we like
% other dot seperation.
% \begin{macrocode}
\RedeclareSectionCommand[%
tocdynnumwidth,%
tocbreakafternumber=true,%
tocentrynumberformat=\partnumberwithprefix,%
tocpagenumberformat=\@firstofone
]{part}%
\newcommand*{\partnumberwithprefix}[1]{\let\autodot:\partname~#1}%
\RedeclareSectionCommand[%
tocnumwidth=21pt,%
tocpagenumberformat=\@firstofone,%
tocraggedentrytext=true%
]{chapter}%
\RedeclareSectionCommand[tocindent=21pt,tocnumwidth=34pt]{section}%
\RedeclareSectionCommand[tocindent=55pt,tocnumwidth=36pt]{subsection}%
\DeclareTOCStyleEntries[dynnumwidth]{default}{figure,table}%
\renewcommand*{\@pnumwidth}{1.8em}% 1.67
\renewcommand*\@tocrmarg {2.70em}% 2.55em
\renewcommand*\@dotsep{2.5}%
% \end{macrocode}
%
% \section{Part}
%
% We want another vertical spacing at part headings.
% \begin{macrocode}
\renewcommand*{\partheadstartvskip}{\vspace*{.1\textheight}}
\renewcommand*{\partheadmidvskip}{\par\nobreak\vspace{.5\baselineskip}}
\renewcommand*{\partpagestyle}{empty}
% \end{macrocode}
%
%
% \section{Logos}
%
% I don't want to use package \textsf{hologo} for only one logo:
% \begin{macrocode}
\DeclareRobustCommand{\XeTeX}{%
X\kern-.125em\lower.5ex\hbox{\reflectbox{E}}\kern-.10em\TeX%
}%
\DeclareRobustCommand{\XeLaTeX}{%
X\kern-.125em\lower.5ex\hbox{\reflectbox{E}}\kern-.10em\LaTeX%
}%
% \end{macrocode}
%
% \section{Appendix}
%
% \begin{macro}{\appendix}
% Use only first if used more than once. With this, every appendix file may
% start with |\appendix|.
% \begin{macrocode}
\g@addto@macro\appendix{\global\let\appendix\relax}
% \end{macrocode}
% \end{macro}
%
% \section{Bibliography}
%
% \begin{macro}{\BibTeX}
% I use the same hack like the \LaTeX{} team uses at \texttt{ltlogos.dtx}
% for |\LaTeX|:
% \begin{macrocode}
\DeclareRobustCommand{\BibTeX}{B\kern-.05em%
\hbox{$\m@th$%
\csname S@\f@size\endcsname \fontsize\sf@size\z@
\math@fontsfalse\selectfont
I\kern-.025emB}%
\kern-.08em%
\-\TeX%
}
% \end{macrocode}
% \end{macro}
%
% Use of a preamble and sime other usefull changes.
% \begin{macrocode}
\AtBeginDocument{%
\setbibpreamble{\GuideBibPreamble\bigskip}%
\selectbiblanguage{\languagename}%
\bibliographystyle{babalpha-fl}%
\renewcommand*{\@openbib@code}{%
\setlength{\parsep}{0pt}%
\renewcommand*{\btxauthorcolon}[1]{:\par\nobreak}%
\renewcommand*{\btxurlfont}{\par\nobreak\url}%
\raggedright
}%
}
% \end{macrocode}
%
% The generated argument of thebibliography is to short:
% \begin{macrocode}
\newcommand*{\OrigTheBibliography}{}
\let\OrigTheBibliography\thebibliography
\renewcommand*{\thebibliography}[1]{%
\OrigTheBibliography{XXXX99}%
}
% \end{macrocode}
%
%
% \section{Index}
%
% This is realy tricky. The index depends on an external perl script, which
% splits the one index into several indexes. But first of all, we need to make
% the raw index.
% \begin{macrocode}
\makeindex
% \end{macrocode}
%
% Use of a preamble:
% \begin{macrocode}
\AtBeginDocument{\setindexpreamble{\GuideIndexPreamble\bigskip}}
% \end{macrocode}
%
% \begin{macro}{\ifusemultiindex}
% Now let's decide wether to use one index or to use a multi part index.
% \begin{macrocode}
\newif\ifusemultiindex
\IfFileExists{\jobname-gen.ind}{\usemultiindextrue}{\usemultiindexfalse}
\ifusemultiindex
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\printmultiindex}
% \changes{v1.11a}{2016/11/02}{index label generation delayed}^^A
% Print one part of the multi part index.
% \begin{macrocode}
\newcommand*{\printmultiindex}[3][]{%
\begingroup
\def\indexname{#2}%
% \end{macrocode}
% \begin{macro}{\CrossIndex}
% Produce a reference from one index to another. The macro |\UseIndex| tells
% the external splitt processor the index to be used for that entry. The
% first argument is the entry to the index. The second is the shortcut of
% the source index and the third is the shortcut of the index with the main
% entry for the entry from first argument. This macro should be used at the
% preamble of one part of the multi part index only. Because of this, it's
% defined here only.
% \begin{macrocode}
\newcommand*{\CrossIndex}[3]{%
\Index{##1=\UseIndex{##2}\protect##1>##3=\UseIndex{##2}\SeeSign
\protect##3}%
}%
% \end{macrocode}
% \end{macro}
% \begin{macrocode}
\ifx\relax#1\relax\let\index@preamble=\relax
\else\def\index@preamble{#1}%
\fi
\def\index@setlabel{\label{idx:#3}}%
\@input@{\jobname-#3.ind}%
\endgroup
}
% \end{macrocode}
% \begin{environment}{theindex}
% I don't want every part of the index starting a new page. So I'll use the
% \textsf{multicol} package to generate the two columns instead of
% |\twocolumn|.
% \begin{macrocode}
\renewenvironment{theindex}{%
\setchapterpreamble{\index@preamble}
\begin{multicols}{2}[\idx@heading\vspace{-1\baselineskip}][.2\textheight]%
\parindent\z@
\setlength{\parskip}{\z@ \@plus .3\p@}%
\setlength{\parfillskip}{\z@ \@plus 1fil}%
\let\item\@idxitem
\small\csname index@setlabel\endcsname
}{%
\end{multicols}%
}
% \end{macrocode}
% \end{environment}
% \end{macro}
%
% \begin{macro}{\printindex}
% Print the full index.
% \begin{macrocode}
\renewcommand*{\printindex}{%
\setchapterpreamble{\index@preamble}%
\addchap{\indexname}%
\let\index@preamble=\relax
\renewcommand*\idx@heading{%
\addsec{\indexname}%
\ifx\index@preamble\relax
\else\index@preamble\let\index@preamble=\relax\fi
}%
\printmultiindex{\GuidegenIndex}{gen}%
\printmultiindex[%
\CrossIndex{\GuideMacro}{gen}{\GuidecmdIndexShort}%
\CrossIndex{\GuideEnvironment}{gen}{\GuidecmdIndexShort}%
\CrossIndex{\GuideCounter}{gen}{\GuidecmdIndexShort}%
\CrossIndex{\GuideLength}{gen}{\GuidecmdIndexShort}%
]{\GuidecmdIndex}{cmd}%
\printmultiindex[%
\CrossIndex{\GuideLength}{gen}{\GuidelenIndexShort}%
\CrossIndex{\GuidePLength}{gen}{\GuidelenIndexShort}%
\CrossIndex{\GuideCounter}{gen}{\GuidelenIndexShort}%
]{\GuidelenIndex}{len}%
\printmultiindex[%
\CrossIndex{\GuideFontElement}{gen}{\GuideelmIndexShort}%
]{\GuideelmIndex}{elm}%
\printmultiindex[%
\CrossIndex{\GuideFile}{gen}{\GuidefilIndexShort}%
\CrossIndex{\GuidePackage}{gen}{\GuidefilIndexShort}%
\CrossIndex{\GuideClass}{gen}{\GuidefilIndexShort}%
]{\GuidefilIndex}{fil}%
\printmultiindex[%
\CrossIndex{\GuideOption}{gen}{\GuideoptIndexShort}%
]{\GuideoptIndex}{opt}%
\printmultiindex[%
\CrossIndex{\GuideHook}{gen}{\GuidehokIndexShort}%
]{\GuidehokIndex}{hok}
}
\fi
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\indexsection}
% Heading of the next section (e.g. the next character) at an index.
% \begin{macrocode}
\newcommand*{\indexsection}[1]{%
\ifx\empty#1\empty\else
\hspace{0pt plus 2fil}{{\usekomafont{disposition} #1}}\hspace{0pt plus
1fil}\nopagebreak
\fi
}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\indexdelim}
% \begin{macro}{\indexdelimi}
% \begin{macro}{\indexdelimii}
% The delimiter after the index topic but before the page number. There are
% three index levels, so there are three delimiters too.
% \begin{macrocode}
\newcommand*{\indexdelim}{\ \hspace{0pt plus 1fil}\penalty0\null\nobreak
\dotfill~}
\newcommand*{\indexdelimi}{~\dotfill\penalty0\ }
\newcommand*{\indexdelimii}{~\dotfill\penalty0\ }
% \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\UseIndex}
% This macro does nothing but shows the external index split processor the
% destination index.
% \begin{macrocode}
\DeclareRobustCommand*{\UseIndex}[1]{\ignorespaces}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\SeeSign}
% The symbol used to sign a reference at an index.
% \begin{macrocode}
\DeclareRobustCommand*{\SeeSign}{\ensuremath{\protect\rightarrow}~}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\AddSeeIndex}
% Add »\emph{see another index}« entry to an index. First argument is an
% index entry to the index with shortcut of second argument. The third
% argument is the name of another index given also by the shortcut at the
% fourth argument.
% \begin{macrocode}
\newcommand*{\AddSeeIndex}[4]{%
\ifusemultiindex
\Index[seeindex{#4}]{#1=\UseIndex{#2}#1>#3=\UseIndex{#2}\SeeSign#3}%
\fi
}
% \end{macrocode}
% \begin{macro}{\seeindex}
% Page number style of references to another index. This eats the page
% number of the index entry and set's a page number reference to the label
% of the other index. Don't use this on your own. This is need by
% |\AddSeeIndex|.
% \begin{macrocode}
\newcommand*{\seeindex}[2]{\pageref{idx:#1}}
% \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\IndexSeeAt}
% A more general version of |\AddSeeIndex|. First (optional) argument is a
% entry note (e.g. |\GuidePagestyle|). This is only used if option
% \texttt{moreindexnotes} was set. Second argument is the entry. Third is
% the shortcut of the source index, the index the entry should be set.
% Fourth is the shortcut of the destination index, the index the entry
% should reference. Fifth is the name of that index. Sixth is the output
% command (e.g. |\Macro|) for the entry.
% \begin{macrocode}
\newcommand*{\IndexSeeAt}[6][\relax]{%
\ifusemultiindex
\if@moreindexnotes
\edef\@tempa{idx@f@\string#1.\string#2.#3.#4}%
\else
\edef\@tempa{idx@f@\string#2.#3.#4}%
\fi
\expandafter\ifx\csname \@tempa\endcsname\relax
\expandafter\gdef\csname \@tempa\endcsname{}%
\begingroup
\@tempswatrue
\if@moreindexnotes
\ifx\relax#1\relax\else\@tempswafalse
\Index[seeindex{#4}]{%
#2 (#1)=\UseIndex{#3}#6{#2} (\protect#1)>%
#5=\UseIndex{#3}\SeeSign\protect#5}%
\fi
\fi
\if@tempswa
\Index[seeindex{#4}]{%
#2=\UseIndex{#3}#6{#2}>#5=\UseIndex{#3}\SeeSign\protect#5}%
\fi
\endgroup
\fi
\fi
}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\Index}
% Primary index command. First (optional) argument is the page number style
% of the entry. Second argument is the entry. The page number style should
% be either \texttt{indexother} or \texttt{indexmain}. Default is
% \texttt{indexother}.
% \begin{macrocode}
\newcommand*{\Index}[2][indexother]{\index{#2|#1}}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\BeginIndex}
% \begin{macro}{\EndIndex}
% \changes{v1.22b}{2019/11/18}{\cs{ifstr} umbenannt in \cs{Ifstr}}%^^A
% Its also usefull to define index range entries. These have three
% arguments. First (optiona) argument is the page number style. Default of
% this parameter is \texttt{indexmain}. See |\Index| for more information
% about this parameter. The second parameter is the kind of index
% entry. This is not the same like the name or shortcut of an index! See
% |\Define|\dots|Index| for more information about the kind of an index
% entry. The third argument is the index entry.
% \begin{macrocode}
\newif\ifnolabel
\def\nolabelfalse{\global\let\ifnolabel\iffalse}%
\def\nolabeltrue{\global\let\ifnolabel\iftrue}%
\newcommand*{\BeginIndex}[3][indexmain]{%
\expandafter\ifx\csname Index#2\endcsname\relax
\GenericError{(scrguide)\@spaces\@spaces\@spaces\@spaces}{%
Document scrguide Error: \string\BeginIndex\space with unknown
index%
}{Check the \string\BeginIndex-command or add a new index type
``#2''.}{%
See scrguide.cls for more information.}%
\else
\csname Index#2\endcsname[(%)
#1]{#3}%
\push@IndexStack{{\do{#1}{#2}{#3}}}%
\fi
% \ifnolabel\nolabelfalse\else
% \ifx\relax#2\relax\else
% \begingroup
% \def\SplitIndexValue##1~=##2~=##3\@nil{%
% ##1\expandafter\ifx\expandafter\relax##2\relax\else.##2\fi
% }%
% \let\PName\@gobble
% \let\PValue\@firstofone
% \let\ensuremath\@firstofone
% \let\textit\@firstofone
% \def~{\string~}%
% \lowercase{\def\@tempa{#2}}%
% \edef\@tempa{\label@base.\@tempa.\SplitIndexValue#3~=~=\@nil}%
% \pdfstringdef\@tempb{\@tempa}%
% \expandafter\ifx\csname \@tempb\endcsname\relax
% \expandafter\xdef\csname \@tempb\endcsname{\the\inputlineno}%
% \xdef\@currentHref{\@tempb}%
% \ClassInfo{scrguide}{Anchor: `\@currentHref'}%
% \Hy@raisedlink{\hyper@anchorstart{\@currentHref}\hyper@anchorend}%
% \label{desc:\@tempa}%
% \else
% \ClassWarning{scrguide}{%
% Label \@tempa\space already defined at \csname
% \@tempb\endcsname,\MessageBreak
% ignored}%
% \fi
% \endgroup
% \fi
% \fi
\penalty\@M\ignorespaces
}
\newlength\PreserveSkip
\newcount\PreservePenalty
\newcommand*{\CloseIndex}[3][indexmain]{%
\PreservePenalty\lastpenalty
\ifvmode\PreserveSkip\lastskip\else\unskip\PreserveSkip\z@\fi
\ifdim \PreserveSkip>\z@
\vskip -\PreserveSkip
\fi
\penalty\@M
\expandafter\ifx\csname Index#2\endcsname\relax
\GenericError{(scrguide)\@spaces\@spaces\@spaces\@spaces}{%
Document scrguide Error: \string\EndIndex\space with unknown
index%
}{Check the \string\BeginIndex-command or add a new index type
``#2''.}{%
See scrguide.cls for more information.}%
\else
\csname Index#2\endcsname[%(
)#1]{#3}%
\fi
\ifdim\PreserveSkip >\z@
\vskip\PreserveSkip
\fi
\penalty\PreservePenalty
}
\newcommand*{\EndIndex}[3][indexmain]{%
\begingroup
\@tempswatrue
\def\do##1##2##3{%
\Ifstr{#1}{##1}{%
\Ifstr{#2}{##2}{%
\Ifstr{\detokenize{#3}}{\detokenize{##3}}{}{\@tempswafalse}%
}{\@tempswafalse}%
}{\@tempswafalse}%
\if@tempswa
\else
\ClassError{scrguide}{Index stack error}{%
Should pop \string\do{#1}{#2}{\detokenize{#3}}\MessageBreak
but have \string\do{##1}{##2}{\detokenize{##3}}%
}%
\push@IndexStack{{\do{##1}{##2}{##3}}}%
\fi
}%
\def\StopIndexGroup{%
\ClassError{scrguide}{Index stack error}{%
Should pop \string\do{#1}{#2}{\detokenize{#3}}\MessageBreak
but have \string\StopIndexGroup
}%
\push@IndexStack{\StopIndexGroup}%
}%
\expandafter\pop@IndexStack\@IndexStack\@nil
\endgroup
\CloseIndex[#1]{#2}{#3}%
}
% \end{macrocode}
% \end{macro}
% \end{macro}
\let\@IndexStack\@empty
\newcommand*{\push@IndexStack}[1]{% Einen Eintrag auf den Index Stapel werfen.
\xdef\@IndexStack{\unexpanded{#1}\unexpanded\expandafter{\@IndexStack}}%
}
\newcommand*{\BeginIndexGroup}{% Am Anfang einer Gruppe auf den Stack die
% Index-Gruppen-Trennmarke packen.
\push@IndexStack{\StopIndexGroup}%
}
\newcommand*{\EndIndexGroup}{% Den Stapel bis zur nächsten Stop-Marke
% verarbeiten.
\ifx\@IndexStack\@empty
\ClassError{scrguide}{cannot end index group}{%
You've told me to end the current index group,\MessageBreak
but there is no more index group open%
}%
\else
\begingroup
\let\StopIndexGroup\@tempswafalse
\@tempswatrue%(
\def\do##1##2##3{%
\CloseIndex[##1]{##2}{##3}%
}%
\@whilesw \if@tempswa \fi {%
\expandafter\pop@IndexStack\@IndexStack\@nil
}%
\endgroup
\fi
}
\def\pop@IndexStack#1#2\@nil{% Ein Argument von Stapel holen und verarbeiten.
\gdef\@IndexStack{#2}#1%
}
\newcommand*\CleanUpIndexStack{%
\ifx\@IndexStack\@empty\else
\ClassError{scrguide}{Index stack error}{%
The index stack should be empty\MessageBreak
but it still contains: \MessageBreak
\expandafter\detokenize\expandafter{\@IndexStack}%
}%
\begingroup
\let\StopIndexGroup\relax
\def\do##1##2##3{%
\CloseIndex[##1]{##2}{##3}%
}%
\@IndexStack
\global\let\@IndexStack\@empty
\endgroup
\fi
}
\AtEndDocument{\CleanUpIndexStack}
\l@preto@macro\chapter{\CleanUpIndexStack}
\l@preto@macro\part{\CleanUpIndexStack}
%
% Now we have to define different kinds of index entries. We have entries that
% will be added to only one index. We have entries that will be added to one
% index with reference to that index at another index. And there are even
% entries that will be added to one index with reference to that index from
% another index and from the main index.
% \begin{macro}{\DefineSingleIndex}
% \changes{v1.22}{2019/11/14}{support \cs{PName} in second argument}%^^A
% This defines a single index entry, e.g. of commands. A macro will be
% defined that addes the entry only to one index. First (optional)
% agrument is a not, which shows the kind of entry (e.g. |\GuideMacro|). The
% second is the macro postfix (e.g. \texttt{Cmd} would define |\IndexCmd|).
% The third is the shortcut of the index to bee used
% (e.g. \texttt{cmd}). The fourth argument is the command to be used to
% output (format) the index entries (e.g. |\Macro|).
% \begin{macrocode}
\newcommand*{\DefineSingleIndex}[4][\relax]{%
\ifx\relax#1\relax
\expandafter\newcommand\expandafter*%
\csname Index#2\endcsname[2][indexother]{%
\begingroup
\let\PName\@firstofone
\protected@edef\reserved@a{%
\unexpanded{\endgroup\Index[##1]}%
{##2\unexpanded{=\UseIndex{#3}#4{##2}}}%
}%
\reserved@a
}%
\else
\expandafter\newcommand\expandafter*%
\csname Index#2\endcsname[2][indexother]{%
\begingroup
\let\PName\@firstofone
\protected@edef\reserved@a{%
\unexpanded{\endgroup\Index[##1]}%
{##2 \unexpanded{(#1)=\UseIndex{#3}#4{##2} (\protect #1)}}%
}%
\reserved@a
}%
\fi
}
% \end{macrocode}
% \end{macro}
% \begin{macro}{\DefineDoubleIndex}
% This defines a double index entry, e.g. of page styles. A macro will be
% defined that adds the entry to an index and also adds a reference entry to
% the main index. See |\DefineSingleIndex| for informations about the
% parameters. If a note was given (first optional argument) it will be used
% to make a top level entry to the main index with the corresponding
% subentry.
% \begin{macrocode}
\newcommand*{\DefineDoubleIndex}[4][\relax]{%
% #1 = optional entry note (\GuidePagestyle)
% #2 = index macro postfix (Pagestyle)
% #3 = see-from-index to be used (cmd)
% #4 = output command (\Macro)
\ifx\relax#1\relax
\expandafter\newcommand\expandafter*%
\csname Index#2\endcsname[2][indexother]{%
\Index[##1]{##2=\UseIndex{gen}#4{##2}}%
\IndexSeeAt{##2}{#3}{gen}{\GuidegenIndex}{#4}%
}%
\else
\expandafter\newcommand\expandafter*%
\csname Index#2\endcsname[2][indexother]{%
\Index[##1]{##2 (#1)=\UseIndex{gen}#4{##2} (\protect #1)}%
\Index[##1]{\csname Guide#2IndexCategoryExpanded\endcsname=\UseIndex{gen}\expandafter\protect\csname Guide#2IndexCategory\endcsname>##2=\UseIndex{gen}#4{##2}}%
\IndexSeeAt[#1]{##2}{#3}{gen}{\GuidegenIndex}{#4}%
}%
\fi
}
% \end{macrocode}
% \end{macro}
% \begin{macro}{\DefineTripleIndex}
% This defines a triple index entry, e.g. of lengths. A macro will be
% defined that adds the entry to an index and also adds a reference entry to
% another index and the main index. The first (optional) argument is a note
% (e.g. (|\GuideLength|) that will be used to generate a top level index
% entry to the main index. The second argument is the macro postfix
% (e.g. \texttt{Length} to define |\IndexLength|). The third argument is the
% shortcut of the primary index (e.g. \texttt{len}). The fourth argument is
% the short name of that index (e.g. |\GuidelenIndexShort|). The fifth
% argument is the shortcut of the index to put the reference into
% (e.g. \texttt{cmd}). The sixth argument is the output command of the index
% entry (e.g. |\Length|).
% \begin{macrocode}
\newcommand*{\DefineTripleIndex}[6][\relax]{%
% #1 = optional entry note (\GuideLength)
% #2 = index macro postfix (Length)
% #3 = index to be used (len)
% #4 = index name (\GuidelenIndexShort)
% #5 = also-from-index to be used (cmd)
% #6 = output command (\Macro)
\ifx\relax#1\relax
\expandafter\newcommand\expandafter*%
\csname Index#2\endcsname[2][indexother]{%
\IndexSeeAt{##2}{gen}{#3}{#4}{#6}%
\IndexSeeAt{##2}{#5}{#3}{#4}{#6}%
\Index[##1]{##2=\UseIndex{#3}#6{##2}}%
\IndexSeeAt{##2}{#3}{gen}{\GuidegenIndex}{#4}%
}%
\else
\expandafter\newcommand\expandafter*%
\csname Index#2\endcsname[2][indexother]{%
% \IndexSeeAt[#1]{##2}{gen}{#3}{#4}{#6}%
% \Index[##1]{#1=\UseIndex{gen}\protect#1>##2=\UseIndex{gen}#6{##2}}%
\IndexSeeAt[#1]{##2}{#5}{#3}{#4}{#6}%
\Index[##1]{##2 (#1)=\UseIndex{#3}#6{##2} (\protect #1)}%
}%
\fi
}
% \end{macrocode}
% \end{macro}
%
% After this, let's define all used kinds of index entries:
% \begin{macrocode}
\DefineSingleIndex{Cmd}{cmd}{\Macro}
\DefineDoubleIndex[\GuidePagestyle]{Pagestyle}{cmd}{\PValue}
\DefineDoubleIndex[\GuideFloatstyle]{Floatstyle}{cmd}{\PValue}
\DefineTripleIndex[\GuideCounter]{Counter}
{len}{\GuidelenIndexShort}{cmd}{\Counter}
\DefineTripleIndex[\GuideLength]{Length}
{len}{\GuidelenIndexShort}{cmd}{\Length}
\ifusemultiindex
\DefineSingleIndex[\GuideEnvironment]{Env}{cmd}{\Environment}
\DefineSingleIndex{Option}{opt}{\Option}
\DefineSingleIndex[\GuidePackage]{Package}{fil}{\Package}
\DefineSingleIndex[\GuideClass]{Class}{fil}{\Class}
\DefineSingleIndex{File}{fil}{\File}
\DefineSingleIndex[\GuideVariable]{Variable}{cmd}{\Variable}
\DefineSingleIndex{FontElement}{elm}{\FontElement}
\DefineSingleIndex{PLength}{len}{\PLength}
\DefineSingleIndex{DoHook}{hok}{\DoHook}
\else
\DefineDoubleIndex[\GuideEnvironment]{Env}{cmd}{\Environment}
\DefineDoubleIndex{Option}{opt}{\Option}
\DefineDoubleIndex[\GuidePackage]{Package}{fil}{\Package}
\DefineDoubleIndex[\GuideClass]{Class}{fil}{\Class}
\DefineDoubleIndex{File}{fil}{\File}
\DefineDoubleIndex[\GuideVariable]{Variable}{cmd}{\Variable}
\DefineDoubleIndex{FontElement}{elm}{\FontElement}
\DefineDoubleIndex{PLength}{len}{\PLength}
\DefineDoubleIndex{DoHook}{hok}{\DoHook}
\fi
% \end{macrocode}
%
% \begin{macro}{\indexrm}
% \begin{macro}{\indexother}
% \begin{macro}{\indexit}
% \begin{macro}{\indexbf}
% \begin{macro}{\indexmain}
% \begin{macro}{\indexsl}
% \begin{macro}{\indexsf}
% \begin{macro}{\indexsc}
% Some helpers to get page numbers with different fontification but hyper
% links.
% \begin{macrocode}
\newcommand*{\indexrm}[1]{\textrm{\hyperpage{#1}}}
\newcommand*{\indexother}{}\let\indexother\indexrm
\newcommand*{\indexit}[1]{\textit{\hyperpage{#1}}}
\newcommand*{\indexbf}[1]{\textbf{\hyperpage{#1}}}
\newcommand*{\indexmain}{}\let\indexmain\indexbf
\newcommand*{\indexsl}[1]{\textsl{\hyperpage{#1}}}
\newcommand*{\indexsf}[1]{\textsf{\hyperpage{#1}}}
\newcommand*{\indexsc}[1]{\textsc{\hyperpage{#1}}}
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
%
\endinput
%
%%% Local Variables:
%%% mode: doctex
%%% TeX-master: "test.tex"
%%% End: