summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/koma-script/scrkernel-listsandtabulars.dtx
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/contrib/koma-script/scrkernel-listsandtabulars.dtx')
-rw-r--r--macros/latex/contrib/koma-script/scrkernel-listsandtabulars.dtx491
1 files changed, 491 insertions, 0 deletions
diff --git a/macros/latex/contrib/koma-script/scrkernel-listsandtabulars.dtx b/macros/latex/contrib/koma-script/scrkernel-listsandtabulars.dtx
new file mode 100644
index 0000000000..bc4973533e
--- /dev/null
+++ b/macros/latex/contrib/koma-script/scrkernel-listsandtabulars.dtx
@@ -0,0 +1,491 @@
+% \iffalse meta-comment
+% ======================================================================
+% scrkernel-listsandtabulars.dtx
+% Copyright (c) Markus Kohm, 2002-2022
+%
+% 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.md.
+% ======================================================================
+%%% From File: $Id: scrkernel-listsandtabulars.dtx 3874 2022-06-05 10:38:02Z kohm $
+%<option>%%% (run: option)
+%<body>%%% (run: body)
+%<*dtx>
+\ifx\ProvidesFile\undefined\def\ProvidesFile#1[#2]{}\fi
+\begingroup
+ \def\filedate$#1: #2-#3-#4 #5${\gdef\filedate{#2/#3/#4}}
+ \filedate$Date: 2022-06-05 12:38:02 +0200 (So, 05. Jun 2022) $
+ \def\filerevision$#1: #2 ${\gdef\filerevision{r#2}}
+ \filerevision$Revision: 3874 $
+ \edef\reserved@a{%
+ \noexpand\endgroup
+ \noexpand\ProvidesFile{scrkernel-listsandtabulars.dtx}%
+ [\filedate\space\filerevision\space
+ KOMA-Script source
+ (lists and tabulars)]
+ }%
+\reserved@a
+\documentclass[USenglish]{koma-script-source-doc}
+\usepackage{babel}
+\usepackage{hvlogos}
+\setcounter{StandardModuleDepth}{2}
+\begin{document}
+\DocInput{scrkernel-listsandtabulars.dtx}
+\end{document}
+%</dtx>
+% \fi
+%
+% \changes{v2.95}{2002/07/01}{first version after splitting \file{scrclass.dtx}}
+% \changes{v3.36}{2022/02/15}{switch over from \cls*{scrdoc} to
+% \cls*{koma-script-source-doc}}
+% \changes{v3.36}{2022/02/15}{whole implementation documentation in English}
+%
+% \GetFileInfo{scrkernel-listsandtabulars.dtx}
+% \title{Code of Lists, Tabulars and Similar Objects of the
+% \href{https://komascript.de}{\KOMAScript} Classes}
+% \author{\href{mailto:komascript@gmx.info}{Markus Kohm}}
+% \date{Revision \fileversion{} of \filedate}
+% \maketitle
+% \begin{abstract}
+% \file{scrkernel-listandtabulars.dtx} provides mainly code for all kind of
+% lists namely \env{itemize}, \env{enumerate}, \env{description},
+% \env{labeling}, \env{quote}, \env{quotation} and \env{addmargin} for all
+% \KOMAScript{} classes. And because the code for \env{tabbing} and
+% \env{tabular} is only some lines, it is added here too.
+% \end{abstract}
+% \tableofcontents
+%
+% \section{User Manual}
+%
+% You can find the user documentation the commands implemented here in the
+% \KOMAScript{} manual, either the German \file{scrguide} or the English
+% \file{scrguien}.
+%
+% \MaybeStop{\PrintIndex}
+%
+% \section{Implementation of Lists}
+%
+% \subsection{Options}
+%
+% The environments do not depend on options.
+%
+% \subsection{List margins}
+%
+% \begin{length}{\leftmargini,\leftmarginii,\leftmarginiii,\leftmarginiv,
+% \leftmarginv,\leftmarginvi,\leftmargin}
+% Usually lists can be nested at most six levels (but usually only four are
+% used). So we have to define six different margins depending on the level
+% (roman number added to \cs{leftmargin}):
+% \begin{macrocode}
+%<*body>
+%<*class>
+%<*!letter>
+\if@twocolumn
+ \setlength{\leftmargini}{2em}
+\else
+%</!letter>
+ \setlength{\leftmargini}{2.5em}
+%<!letter>\fi
+\setlength{\leftmarginii}{2.2em}
+\setlength{\leftmarginiii}{1.87em}
+\setlength{\leftmarginiv}{1.7em}
+%<*!letter>
+\if@twocolumn
+ \setlength{\leftmarginv}{.5em}
+ \setlength{\leftmarginvi}{.5em}
+\else
+%</!letter>
+ \setlength{\leftmarginv}{1em}
+ \setlength{\leftmarginvi}{1em}
+%<!letter>\fi
+\setlength{\leftmargin}{\leftmargini}
+% \end{macrocode}
+% \end{length}^^A \leftmargini … \leftmarginvi,\leftmargin
+%
+%
+% \subsection{List labels}
+%
+% \begin{length}{\labelsep,\labelwidth}
+% If a list has a label we need a label width and a horizontal distance after
+% the label.
+% \begin{macrocode}
+\setlength{\labelsep}{.5em}
+\setlength{\labelwidth}{\leftmargini}
+\addtolength{\labelwidth}{-\labelsep}
+% \end{macrocode}
+% \end{length}^^A \labelsep,\labewidth
+%
+%
+% \subsection{List penalties}
+%
+% \begin{macro}{\@beginparpenalty,\@endparpenalty,\@itempenatly}
+% Page breaks at the begin an end of lists or items are better than somewhere
+% else but not much.
+% \begin{macrocode}
+\@beginparpenalty=-\@lowpenalty
+\@endparpenalty =-\@lowpenalty
+\@itempenalty =-\@lowpenalty
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{List items}
+%
+% \begin{command}{\theenumi,\theenumii,\theenumiii,\theenumiv}
+% There are four levels of \env{enumerate} items with their numbers in Arabic,
+% lower case letters, lowercase Roman numbers, uppercase letters.
+% \begin{macrocode}
+\renewcommand*\theenumi{\@arabic\c@enumi}
+\renewcommand*\theenumii{\@alph\c@enumii}
+\renewcommand*\theenumiii{\@roman\c@enumiii}
+\renewcommand*\theenumiv{\@Alph\c@enumiv}
+% \end{macrocode}
+% \end{command}
+%
+% \begin{command}{\labelenumi}
+% \begin{command}{\labelenumii}
+% \changes{v2.4m}{1997/02/28}{opening brace removed}
+% \begin{command}{\labelenumiii,\labelenumiv}
+% The printed labels consist of the previously defined numbers followed by a
+% dot or brace.
+% \begin{macrocode}
+\newcommand*\labelenumi{\theenumi.}
+\newcommand*\labelenumii{\theenumii)}
+\newcommand*\labelenumiii{\theenumiii.}
+\newcommand*\labelenumiv{\theenumiv.}
+% \end{macrocode}
+% \end{command}
+% \end{command}
+% \end{command}
+%
+% \begin{macro}{\p@enumii,\p@enumiii,\p@enumiv}
+% References to \env{enumerate} items are prefixed by the parent number and
+% additional separation signs like braces.
+% \begin{macrocode}
+\renewcommand*\p@enumii{\theenumi}
+\renewcommand*\p@enumiii{\p@enumii(\theenumii)}
+\renewcommand*\p@enumiv{\p@enumiii\theenumiii}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{command}{\labelitemi,\labelitemii,\labelitemiii,\labelitemiv}
+% \changes{v2.5g}{1999/10/09}{math mode eliminated}
+% \changes{v3.33}{2021/02/15}{Usage of new font element}
+% The characters used for \env{itemize} items. Again four levels are
+% supported. All of them use a own font element.
+% \begin{macrocode}
+\newcommand*\labelitemi{\usekomafont{labelitemi}{\textbullet}}
+\newcommand*\labelitemii{\usekomafont{labelitemii}{\textendash}}
+\newcommand*\labelitemiii{\usekomafont{labelitemiii}{\textasteriskcentered}}
+\newcommand*\labelitemiv{\usekomafont{labelitemiv}{\textperiodcentered}}
+% \end{macrocode}
+% \end{command}^^A \labelitemi … \labelitemiv
+%
+%
+% \subsection{Definition of the environments}
+%
+% \begin{environment}{description}
+% \begin{command}{\descriptionlabel}
+% \changes{v3.36}{2022/02/15}{using \cs{usekomafont\{descriptionlabel\}} instead
+% of \cs{descfont}}
+% This is used to describe a single term. The terms should be short, because
+% line breaks inside the terms are not supported. The term is the optional
+% argument of \cs{item}. It is printed with font of element \fnt{descriptionlabel}.
+% \begin{macrocode}
+\newenvironment{description}{%
+ \list{}{\labelwidth\z@ \itemindent-\leftmargin
+ \let\makelabel\descriptionlabel}%
+}{%
+ \endlist
+}
+\newcommand*{\descriptionlabel}[1]{%
+ \hspace{\labelsep}\usekomafont{descriptionlabel}{#1}%
+}
+% \end{macrocode}
+% \end{command}
+% \end{environment}
+%
+% \begin{environment}{labeling}
+% \begin{command}{\labelinglabel}
+% \changes{v3.02}{2009/01/01}{using font elements \fnt{labelinglabel} and
+% \fnt{labelingseparator}}
+% \changes{v3.02c}{2009/01/28}{using font elements \fnt{labelinglabel} and
+% \fnt{labelingseparator} also for the calculation of the width}
+% \changes{v3.03a}{2009/04/02}{fixed argument in the label width calculation}
+% The \env{labeling} environment is an extension of \env{description}. It has
+% an optional separation string (\texttt{\#1}) added behind every label. The
+% width of the labels are the width of the mandatory argument (\texttt{\#2}).
+% \begin{macrocode}
+%</class>
+\newenvironment{labeling}[2][]{%
+ \def\sc@septext{#1}%
+ \list{}{\settowidth{\labelwidth}{{%
+ \usekomafont{labelinglabel}{#2%
+ \usekomafont{labelingseparator}{\sc@septext}}%
+ }}%
+ \leftmargin\labelwidth \advance\leftmargin by \labelsep
+ \let\makelabel\labelinglabel
+ }%
+}{%
+ \endlist
+}
+\newcommand\labelinglabel[1]{%
+ \usekomafont{labelinglabel}{#1\hfil
+ \usekomafont{labelingseparator}{\sc@septext}}%
+}
+%<*class>
+% \end{macrocode}
+% \end{command}
+% \end{environment}
+%
+% \begin{environment}{verse}
+% \changes{v2.3g}{1996/01/14}{\cs{item} does not wait for \texttt{[]}}
+% The environment for short poems.
+% \begin{macrocode}
+\newenvironment{verse}{%
+ \let\\=\@centercr
+ \list{}{\itemsep=\z@
+ \itemindent=-1.5em
+ \listparindent=\itemindent
+ \rightmargin=\leftmargin
+ \advance\leftmargin by1.5em
+ }%
+ \item\relax
+}{%
+ \endlist
+}
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{environment}{quotation,quote}
+% \changes{v2.3g}{1996/01/14}{\cs{item} does not wait for \texttt{[]}}
+% Two environments for left and right indented text. The difference of both
+% is: \env{quotation} works with paragraph indent (first line is indented),
+% \env{quote} works with paragraph distance.
+% \begin{macrocode}
+\newenvironment{quotation}{%
+ \list{}{\listparindent 1em%
+ \itemindent \listparindent
+ \rightmargin \leftmargin
+ \parsep \z@ \@plus\p@
+ }%
+ \item\relax
+}{%
+ \endlist
+}
+\newenvironment{quote}{%
+ \list{}{\rightmargin\leftmargin}%
+ \item\relax
+}{%
+ \endlist
+}
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{environment}{addmargin}
+% \changes{v2.8q}{2001/11/29}{added}
+% \changes{v2.95a}{2006-07-20}{\cs{@listdepth} reset}
+% \begin{environment}{addmargin*}
+% \changes{v2.8q}{2001/11/29}{added}
+% \changes{v2.95a}{2006-07-20}{\cs{@listdepth} reset}
+% \changes{v3.17}{2015/03/23}{improved handling of page breaks at the beginning}
+% \changes{v3.22}{2016/08/02}{page break test for double-sided documents}
+% Both environments are similar to \env{quote} and \env{quotation}, but the
+% indent is not fix. If only the mandatory argument (\texttt{\#2}) is used, it
+% is the left and right indent. If the optional argument (\texttt{\#1}) is
+% also used, it is the left indent with \env{addmargin} resp. the inner indent
+% with \env{addmargin*}. Note, negative indents will extend to the
+% margins. Note, that page breaks inside \env{addmargin*} should be avoided,
+% because they result in wrong margins at the second, fourth, sixth etc. page.
+% \begin{macro}{\@addmargin}
+% \changes{v2.8q}{2001/11/29}{added}
+% \changes{v2.95}{2002/07/01}{\cs{item} does not wait for \texttt{[]}}
+% \changes{v2.9q}{2003/03/24}{unchanged \len{labelsep}}
+% \changes{v2.95a}{2006/07/20}{unchanged \cs{@tmpcnta}}
+% \changes{v3.05b}{2010/04/29}{\len{partopsep} has to be 0 instead of
+% \len{parskip} because of adding \len{topsep}}
+% \changes{v3.17}{2015/03/23}{improved handling of page breaks at the beginning}
+% \changes{v3.28}{2019/11/19}{\cs{ifthispageodd} replaced by \cs{Ifthispageodd}}
+% \begin{macro}{\scr@addmargin@startpage}
+% \changes{v3.12}{2013/10/26}{added}
+% \changes{v3.12}{2013/10/26}{page break test for \env{addmargin*}}
+% \changes{v3.22}{2016/10/21}{unchanged \len{topsep} and \len{partopsep}}
+% \begin{macrocode}
+%</class>
+\newenvironment{addmargin}{%
+ \@tempswafalse\@addmargin
+}{%
+ \advance\@listdepth\@ne
+ \endlist
+}
+\newenvironment{addmargin*}{%
+ \@tempswafalse
+ \if@twoside\is@thispageodd[]\ifthispagewasodd\else\@tempswatrue\fi
+ \edef\scr@addmargin@startpage{\csname tpo@\scr@tpo\endcsname}\fi
+ \@addmargin
+}{%
+ \if@twoside
+ \unskip\nobreak\Ifthispageodd{}{}%
+ \expandafter\ifx\csname tpo@\scr@tpo\endcsname\scr@addmargin@startpage\else
+%<class> \ClassWarning{\KOMAClassName}{%
+%<package> \PackageWarning{scrextend}{%
+ page break inside `addmargin*' environment.\MessageBreak
+ A `addmargin*' environment starting on page
+ \scr@addmargin@startpage\MessageBreak
+ ends on page \csname tpo@\scr@tpo\endcsname.\MessageBreak
+ This will result in potential wrong margins on\MessageBreak
+ every other page.\MessageBreak
+ So maybe you should change the `addmargin*'\MessageBreak
+ environment, that ends%
+ }%
+ \fi
+ \fi
+ \advance\@listdepth\@ne
+ \endlist
+}
+\newcommand*{\@addmargin}[2][\@tempa]{%
+ \list{}{%
+ \if@tempswa
+ \def\@tempa{\leftmargin}%
+ \setlength{\leftmargin}{#2}%
+ \setlength{\rightmargin}{#1}%
+ \else
+ \def\@tempa{\rightmargin}%
+ \setlength{\rightmargin}{#2}%
+ \setlength{\leftmargin}{#1}%
+ \fi
+ \setlength{\listparindent}{\parindent}%
+ \setlength{\itemsep}{\parskip}%
+ \setlength{\itemindent}{\z@}%
+ \setlength{\@tempskipa}{\topsep}%
+ \setlength{\topsep}{\z@}%
+ \setlength{\parsep}{\parskip}%
+ \setlength{\@tempskipb}{\partopsep}%
+ \setlength{\partopsep}{\z@}%
+ \let\makelabel\@gobble
+ \setlength{\labelwidth}{\z@}%
+ \advance\@listdepth\m@ne
+ }%
+ \expandafter\ifnum\scr@v@is@ge{3.22}%
+ \setlength{\topsep}{\@tempskipa}%
+ \setlength{\partopsep}{\@tempskipb}%
+ \fi
+ \item\is@thispageodd@setlabel\nobreak\ignorespaces
+}
+%<*class>
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{environment}
+% \end{environment}
+%
+%
+% \subsection{Font elements of lists}
+%
+% \begin{fontelement}{descriptionlabel}
+% \changes{v2.8o}{2001/09/14}{added}
+% The font element is defined indirect by some macros to stay compatible with
+% \KOMAScript{} before the design of font elements.
+% \begin{macro}{\descfont}
+% \changes{v3.20}{2016/01/29}{\cs{sffamily} replaced by \cs{@gr@gsffamily}}
+% The font of the item labels of \env{description}. The command \cs{descfont}
+% should not be used by users. Think of it as an internal macro. The user
+% space name is because of compatibility to very old \KOMAScript{} versions.
+% \begin{macrocode}
+\newcommand*\descfont{\@gr@gsffamily\bfseries}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\scr@fnt@descriptionlabel}
+% The font element uses \cs{descfont}.
+% \begin{macrocode}
+\newcommand*{\scr@fnt@descriptionlabel}{\descfont}
+% \end{macrocode}
+% \end{macro}
+% \end{fontelement}
+%
+% \begin{fontelement}{labelitemi,labelitemii,labelitemiii,labelitemiv,itemizelabel}
+% \changes{v3.33}{2021/02/15}{added}
+% \begin{command}{\labelitemfont}
+% \changes{v3.33}{2021/02/15}{added}
+% Due to a change in the LaTeX kernel 2020/02/02 the \env{itemize} items
+% react on font changes. For this the standard classes have been changed to
+% set the item \emph{bullets} using \cs{labelitemfont} which is
+% \cs{normalfont} by default. I've adapted this using also \cs{labelitemfont}
+% for compatibility but only to store the font of font element
+% \fnt{itemizelabel} which is the default of the level depending font
+% elements. \fnt{itemlabelii} differs, because the default \cs{textendash}
+% should be bold.
+% \begin{macrocode}
+\newcommand*{\labelitemfont}{\normalfont}
+\newcommand*\scr@fnt@itemizelabel{\labelitemfont}
+\newkomafont{labelitemi}{\usekomafont{itemizelabel}}
+\newkomafont{labelitemii}{\usekomafont{itemizelabel}\bfseries}
+\newkomafont{labelitemiii}{\usekomafont{itemizelabel}}
+\newkomafont{labelitemiv}{\usekomafont{itemizelabel}}
+%</class>
+% \end{macrocode}
+% \end{command}
+% \end{fontelement}
+%
+% \begin{fontelement}{labelinglabel,labelingseparator}
+% \changes{v3.02}{2009/01/01}{added}
+% The \env{labeling} environment has two font elements, one for the whole
+% label and one for the separator only. The default is no change.
+% \begin{macrocode}
+\newkomafont{labelinglabel}{}
+\newkomafont{labelingseparator}{}
+% \end{macrocode}
+% \end{fontelement}
+%
+%
+% \section{Implementation of Tabulars, Array etc.}
+%
+% All these environments are implemented in the \LaTeX{} kernel already. We
+% only need some configuration parameters.
+%
+% \begin{length}{\arraycolsep,\tabcolsep,\arrayrulewidth,\doublerulewidth,
+% \tabbingsep}
+% These are the distances between columns in \env{array} and \env{tabular},
+% the width of lines/rules independent from \env{array} or \env{tabular} and
+% the distance of double lines/rules (two consecutive \cs{hline}). The last
+% one, \cs{tabbingsep}, is the \cs{'} distance in \env{tabbing} environments.
+% All values are same as in the standard classes.
+% \begin{macrocode}
+%<*class>
+\setlength\arraycolsep{5\p@}
+\setlength\tabcolsep{6\p@}
+\setlength\arrayrulewidth{.4\p@}
+\setlength\doublerulesep{2\p@}
+\setlength\tabbingsep{\labelsep}
+%</class>
+% \end{macrocode}
+% \end{length}^^A \arraycolsep … \tabbingsep
+%
+%
+% \begin{macrocode}
+%</body>
+% \end{macrocode}
+%
+% \Finale
+% \PrintChanges
+%
+\endinput
+% Local Variables:
+% mode: doctex
+% ispell-local-dictionary: "en_US"
+% eval: (flyspell-mode 1)
+% TeX-master: t
+% TeX-engine: luatex-dev
+% eval: (setcar (or (cl-member "Index" (setq-local TeX-command-list (copy-alist TeX-command-list)) :key #'car :test #'string-equal) (setq-local TeX-command-list (cons nil TeX-command-list))) '("Index" "mkindex %s" TeX-run-index nil t :help "makeindex for dtx"))
+% End: