% \iffalse meta-comment
% ======================================================================
% scrkernel-pseudolengths.dtx
% Copyright (c) Markus Kohm, 2002-2023
%
% 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-pseudolengths.dtx 4032 2023-04-17 09:45:11Z 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: 2023-04-17 11:45:11 +0200 (Mo, 17. Apr 2023) $
  \def\filerevision$#1: #2 ${\gdef\filerevision{r#2}}
  \filerevision$Revision: 4032 $
  \edef\reserved@a{%
    \noexpand\endgroup
    \noexpand\ProvidesFile{scrkernel-pseudolengths.dtx}%
                          [\filedate\space\filerevision\space
                           KOMA-Script source
                          (pseudo length)]
  }%
\reserved@a
\documentclass[USenglish]{koma-script-source-doc}
\usepackage{babel}
\usepackage{hvlogos}
\setcounter{StandardModuleDepth}{2}
\begin{document}
\DocInput{scrkernel-pseudolengths.dtx}
\end{document}
%</dtx>
% \fi^^A meta-comment
%
% \changes{v2.95}{2002/06/20}{first version after splitting \file{scrclass.dtx}}
% \changes{v3.36}{2022/02/14}{switch over from \cls*{scrdoc} to
%   \cls*{koma-script-source-doc}}
% \changes{v3.36}{2022/02/14}{whole implementation documentation in English}
% \changes{v3.40}{2023/04/17}{guide names changed}
%
% \GetFileInfo{scrkernel-pseudolengths.dtx}
% \title{Handling of Lengths Stored in Macros for
%   \href{https://komascript.de}{\KOMAScript} Letter Class and Packages}
% \author{\href{mailto:komascript@gmx.info}{Markus Kohm}}
% \date{Revision \fileversion{} of \filedate}
% \maketitle
% \begin{abstract}
%   \file{scrkernel-pseudolength.dtx} provides storing lengths in macros. This
%   feature has been introduced with \cls*{scrlttr2} in 2002, because at that
%   time there where only 256 skip registers for \LaTeX{} lengths and
%   \cls*{scrlttr2} needs several lengths to specify the positions of several
%   notepaper elements. Some time later The \LaTeX{} Team (at long last) has
%   decided to recommend \eTeX{} as \TeX{} engine for
%   \LaTeX.\!\footnote{Currently \pdfTeX{} with \eTeX{} extensions is the
%     recommended \TeX{} engine for \LaTeX.} \,Therefore the usage of the so
%   called \emph{pseudo lengths} in \KOMAScript{} wouldn't be necessary any
%   longer. But they exist and will be used at least for compatibility also in
%   future versions of \cls*{scrlttr2} and \pkg*{scrletter}.
% \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-de.pdf} or the
% English \file{scrguide-en.pdf}.
%
% \MaybeStop{\PrintIndex}
%
% \section{Implementation of Package \pkg*{typearea} and Additional Class
%   Features}
%
%    \begin{macrocode}
%<*letter>
%    \end{macrocode}
% 
% \subsection{Options}
% The method of pseudo lengths is not influenced by options.
%
%
% \subsection{Commands and macros for pseudo lengths}
%
% For the calculation of the positions of several elements of the notepaper
% several lengths are needed. To not use a lot \LaTeX{} lengths (and therefore
% \TeX{} skip registers) they are stored in macros. So we also need some
% additional commands to not only store lengths values in macros but also for
% arithmetic operations on such macros and even to test, if a pseudo lengths
% exists or not.
%
%
% \begin{command}{\Ifplength}
% \changes{v3.27}{2019/03/29}{added}
% \begin{macro}{\if@plength}
% \changes{v3.27}{2019/03/29}{added}
% \changes{v3.36}{2022/02/14}{deprecated}
% Test whether or not a given pseudo-length (\texttt{\#1}) already exists. If
% so execute argument \texttt{\#2}, otherwise \texttt{\#3}.
%    \begin{macrocode}
%<*body>
\newcommand*{\Ifplength}[1]{%
  \@ifundefined{ltr@len@#1}{\@secondoftwo}{\@firstoftwo}%
}
\newcommand*{\if@plength}{%
%<class>  \ClassWarning{\KOMAClassName}{%
%<package>  \PackageWarning{scrletter}{%
    Internal macro `\string\if@plength' is deprecated.\MessageBreak
    Please use `\string\Ifplength' instead}%
  \Ifplength
}
%    \end{macrocode}
% \end{macro}^^A \if@plength
% \end{command}^^A \Ifplength
%
%
% \begin{command}{\newplength}
% \changes{v2.8q}{2001/10/06}{added}
% \changes{v2.8q}{2001/10/06}{retired compatibility to
%   \cls[https://www.ctan.org/pkg/koma-script-obsolete]{scrlettr}}
% \changes{v3.26}{2018/04/26}{user command instead of internal macro}
% \changes{v3.27}{2019/03/29}{changed error message}
% \begin{macro}{\@newplength}
% \changes{v3.36}{2022/02/14}{deprecated}
% Define a new pseudo length (\texttt{\#1}) and initialize it with 0.
%    \begin{macrocode}
\newcommand*{\newplength}[1]{%
  \@ifundefined{ltr@len@#1}{%
    \expandafter\let\csname ltr@len@#1\endcsname=\z@%
  }{%
%<class>    \ClassError{scrlttr2}%
%<package>    \PackageError{scrletter}%
    {%
      pseudo-length \expandafter\string\csname ltr@len@#1\endcsname
      already defined%
    }{%
      You've tried to define a new pseudo-length using\MessageBreak
      \string\@newplength\space
      or \string\newplength.\MessageBreak
      Please, try another name%
    }%
  }%
}
\newcommand*{\@newplength}{%
%<class>  \ClassWarning{\KOMAClassName}{%
%<package>  \PackageWarning{scrletter}{%
    Internal macro `\string\@newplength' is deprecated.\MessageBreak
    Please use `\string\newplength' instead}%
  \newplength
}
%    \end{macrocode}
% \end{macro}
% \end{command}
%
%
% \begin{command}{\useplength}
% \changes{v2.8q}{2001/10/06}{added}
% \changes{v2.97c}{2007/09/17}{with \eTeX{} using \cs{dimexpr} instead of \cs{number}}
% \changes{v3.25}{2017/11/29}{\eTeX{} is mandatory}
% \changes{v3.25}{2017/11/29}{\cs{dimexpr} replaced by \cs{glueexpr}}
% Read the value of a pseudo length like a skip register. This can be done
% using \cs{glueexpr}.
%    \begin{macrocode}
\newcommand*{\useplength}[1]{%
  \glueexpr \csname ltr@len@#1\endcsname\relax}%
%    \end{macrocode}
% \end{command}
%
% \begin{command}{\setlengthtoplength}
% \changes{v2.8q}{2001/10/06}{added}
% Set a real \LaTeX{} length (usually a \TeX{} skip, but \TeX{} dimensions are
% also valid) to a multiple of a pseudo length. The factor is given by the
% optional argument \texttt{\#1}. The length is mandatory argument \textrm{\#2}
% and the name of the pseudo length the also mandatory \texttt{\#3}.
%    \begin{macrocode}
\newcommand*{\setlengthtoplength}[3][]{%
  \setlength{#2}{\useplength{#3}}%
  \setlength{#2}{#1#2}}
%    \end{macrocode}
% \end{command}
%
% \begin{command}{\setplength}
% \changes{v2.8q}{2001/10/06}{added}
% \changes{v3.25}{2017/11/29}{\cs{glueexpr} eingefügt}
% \changes{v3.36}{2018/04/26}{user command instead of internal macro}
% \begin{macro}{\@setplength}
% \changes{v3.36}{2022/02/14}{deprecated}
% We also need a command to set a pseudo length (\texttt{\#2}) to a new value
% (\texttt{\#3}). Locally we use a length to do so, because we want error
% messages about illegal values here and not when using the pseudo value. Once
% more an optional factor (\texttt{\#1}) is provided (but does not make much sense).
%    \begin{macrocode}
\newcommand*{\setplength}[3][]{%
  \begingroup%
    \setlength{\@tempskipa}{\glueexpr #3\relax}%
    \setlength{\@tempskipa}{#1\@tempskipa}%
    \edef\@tempa{\noexpand\endgroup%
      \noexpand\expandafter\noexpand\renewcommand\noexpand\expandafter*%
      \noexpand\csname ltr@len@#2\noexpand\endcsname{\the\@tempskipa}%
    }%
  \@tempa
}
\newcommand*{\@setplength}{%
%<class>  \ClassWarning{\KOMAClassName}{%
%<package>  \PackageWarning{scrletter}{%
    Internal macro `\string\@setplength' is deprecated.\MessageBreak
    Please use `\string\setplength' instead}%
  \setplength
}
%    \end{macrocode}
% \end{macro}
% \end{command}
%
%
% \begin{command}{\setplengthtowidth,\setplengthtoheight,\setplengthtodepth,
%                 \setplengthtototalheight}
% \changes{v3.26}{2018/04/26}{added}
% First three commands are similar to \cs{settowidth}, \cs{settoheight} and
% \cs{settodepth} but with pseudo length instead of a \LaTeX{} length. The
% last one is a combination of \cs{setplengthtoheight} + \cs{setplengthtodepth}.
%    \begin{macrocode}
\newcommand*{\setplengthtowidth}[3][]{%
  \begingroup
    \settowidth{\@tempdima}{#3}%
    \setlength{\@tempdima}{#1\@tempdima}%
    \edef\@tempa{\noexpand\endgroup
      \noexpand\expandafter\noexpand\renewcommand\noexpand\expandafter*%
      \noexpand\csname ltr@len@#2\noexpand\endcsname{\the\@tempdima}%
    }%
  \@tempa
}  
\newcommand*{\setplengthtoheight}[3][]{%
  \begingroup
    \settoheight{\@tempdima}{#3}%
    \setlength{\@tempdima}{#1\@tempdima}%
    \edef\@tempa{\noexpand\endgroup
      \noexpand\expandafter\noexpand\renewcommand\noexpand\expandafter*%
      \noexpand\csname ltr@len@#2\noexpand\endcsname{\the\@tempdima}%
    }%
  \@tempa
}  
\newcommand*{\setplengthtodepth}[3][]{%
  \begingroup
    \settodepth{\@tempdima}{#3}%
    \setlength{\@tempdima}{#1\@tempdima}%
    \edef\@tempa{\noexpand\endgroup
      \noexpand\expandafter\noexpand\renewcommand\noexpand\expandafter*%
      \noexpand\csname ltr@len@#2\noexpand\endcsname{\the\@tempdima}%
    }%
  \@tempa
}  
\newcommand*{\setplengthtototalheight}[3][]{%
  \begingroup
    \settoheight{\@tempdima}{#3}%
    \settodepth{\@tempdimb}{#3}%
    \addtolength{\@tempdima}{\@tempdimb}%
    \setlength{\@tempdima}{#1\@tempdima}%
    \edef\@tempa{\noexpand\endgroup
      \noexpand\expandafter\noexpand\renewcommand\noexpand\expandafter*%
      \noexpand\csname ltr@len@#2\noexpand\endcsname{\the\@tempdima}%
    }%
  \@tempa
}  
%    \end{macrocode}
% \end{command}
%
%
% \begin{command}{\addtolengthplength}
%   \changes{v2.8q}{2001/10/06}{added}
% This provides a plus operation of a pseudo length \texttt{\#3} to a \LaTeX{}
% length \texttt{\#2}. Again an optional factor \texttt{\#1} is possible.
%    \begin{macrocode}
\newcommand*{\addtolengthplength}[3][]{%
  \begingroup%
    \setlengthtoplength[{#1}]{\@tempskipa}{#3}%
    \edef\@tempa{\endgroup%
      \noexpand\addtolength{#2}{\the\@tempskipa}}%
  \@tempa%
}
%    \end{macrocode}
% \end{command}
%
%
% \begin{command}{\addtoplength}
% \changes{v2.8q}{2001/10/06}{added}
% \changes{v3.25}{2017/11/29}{using \cs{glueexpr}}
% \changes{v3.36}{2018/04/26}{user command instead of internal macro}
% \begin{macro}{\@addtoplength}
% \changes{v3.36}{2022/02/14}{deprecated}
% This provides a plus operation for one pseudo length \texttt{\#3} to another
% pseudo length \texttt{\#2}. Again an optional factor \texttt{\#1} is possible.
%    \begin{macrocode}
\newcommand*{\addtoplength}[3][]{%
  \begingroup%
    \setlength{\@tempskipa}{\glueexpr #3\relax}%
    \setlength{\@tempskipa}{#1\@tempskipa}%
    \addtolengthplength{\@tempskipa}{#2}%
    \edef\@tempa{\noexpand\endgroup%
      \noexpand\expandafter\noexpand\renewcommand\noexpand\expandafter*%
      \noexpand\csname ltr@len@#2\noexpand\endcsname{\the\@tempskipa}%
      }%
  \@tempa%
}
\newcommand*{\@addtoplength}{%
%<class>  \ClassWarning{\KOMAClassName}{%
%<package>  \PackageWarning{scrletter}{%
    Internal macro `\string\@addtoplength' is deprecated.\MessageBreak
    Please use `\string\addtoplength' instead}%
  \addtoplength}
%</body>
%    \end{macrocode}
% \end{macro}
% \end{command}
%
%
%    \begin{macrocode}
%</letter>
%    \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: