% \CheckSum{273}
% \iffalse meta-comment
% ======================================================================
% scrkernel-variables.dtx
% Copyright (c) Markus Kohm, 2008-2019
%
% 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.
% ----------------------------------------------------------------------
% scrkernel-variables.dtx
% Copyright (c) Markus Kohm, 2008-2019
%
% 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.
% ======================================================================
% \fi
%
% \CharacterTable
%  {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
%   Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
%   Digits        \0\1\2\3\4\5\6\7\8\9
%   Exclamation   \!     Double quote  \"     Hash (number) \#
%   Dollar        \$     Percent       \%     Ampersand     \&
%   Acute accent  \'     Left paren    \(     Right paren   \)
%   Asterisk      \*     Plus          \+     Comma         \,
%   Minus         \-     Point         \.     Solidus       \/
%   Colon         \:     Semicolon     \;     Less than     \<
%   Equals        \=     Greater than  \>     Question mark \?
%   Commercial at \@     Left bracket  \[     Backslash     \\
%   Right bracket \]     Circumflex    \^     Underscore    \_
%   Grave accent  \`     Left brace    \{     Vertical bar  \|
%   Right brace   \}     Tilde         \~}
%
% \iffalse
%%% From File: $Id: scrkernel-variables.dtx 3393 2019-11-19 10:33:44Z kohm $
%<option>%%%            (run: option)
%<body>%%%            (run: body)
%<*dtx>
% \fi
\ifx\ProvidesFile\undefined\def\ProvidesFile#1[#2]{}\fi
\begingroup
  \def\filedate$#1: #2-#3-#4 #5${\def\filedate{#2/#3/#4}}
  \filedate$Date: 2019-11-19 11:33:44 +0100 (Tue, 19 Nov 2019) $
  \def\filerevision$#1: #2 ${\def\filerevision{r#2}}
  \filerevision$Revision: 1638 $
  \xdef\fileinfo{\filedate\space\filerevision\space}
  \edef\reserved@a{%
    \noexpand\endgroup
    \noexpand\ProvidesFile{scrkernel-variables.dtx}%
                          [\filedate\space\filerevision\space
                           KOMA-Script source(koma variables)]
  }%
\reserved@a
% \iffalse
\documentclass{scrdoc}
\usepackage[english,ngerman]{babel}
\CodelineIndex
\RecordChanges
\GetFileInfo{scrkernel-variables.dtx}
\title{\KOMAScript{} \partname\ \texttt{\filename}%
  \footnote{Dies ist Version \fileversion\ von Datei \texttt{\filename}.}}
\date{\filedate}
\author{Markus Kohm}

\begin{document}
  \maketitle
  \tableofcontents
  \DocInput{\filename}
\end{document}
%</dtx>
% \fi
%
% \selectlanguage{ngerman}
%
% \changes{v2.95}{2006/03/20}{%
%   erste Version aus der Aufteilung von \textsf{scrclass.dtx}}
%
% \section{\KOMAScript{}-Variablen}
%
% Bei Briefen gibt es eine ganze Reihe von speziellen Variablen. An dieser
% Stelle sei als Beispiel nur das Feld "`Ihr Zeichen"' genannt. Es ist nahezu
% unmöglich alle diese Felder vorherzusehen. Daher wurde in der neuen
% Briefklasse ein neuer Mechanismus zur Definition solcher Felder geschaffen.
%
% \iffalse
%<*letter>
% \fi
%
% \StopEventually{\PrintIndex\PrintChanges}
%
% \iffalse
%<*option>
% \fi
%
% \subsection{Option}
% Der Mechanismus ist unabhängig von Optionen.
%
%
% \iffalse
%</option>
%<*body>
% \fi
%
% \subsection{Anweisungen zum Anlegen und Verwenden von Variablen}
%
% \begin{macro}{\newkomavar}
% \changes{v2.8q}{2002/01/14}{Neu}%^^A
% \changes{v3.20}{2016/04/12}{\cs{@ifstar} durch \cs{kernel@ifstar}
%   ersetzt}%^^A
% Es wird zwischen zwei Arten von Feldern unterschieden:
% \begin{itemize}
%   \item Felder für die Geschäftszeile
%   \item Felder für sonstige Verwendung
% \end{itemize}
% Felder können aber auch nachträglich zur Geschäftszeile
% hinzugefügt werden. Die Sternvariante von \cs{newkomavar} führt
% dies jedoch automatisch durch.
% \begin{macro}{\@newkomavar}
% Da mit einer Sternvariante gearbeitet wird, wird ein Hilfsmakro
% benötigt. Das Makro erhält ein optionales und
% ein obligatorisches Argument. Das optionale Argument ist dabei die
% Voreinstellung für den \emph{Ausgabenamen} des Feldes, der
% ggf. ausgegeben werden soll. Das obligatorische Argument ist
% \emph{Name} des Feldes, über den das Feld angesprochen wird.
% Das Makro definiert zwei weitere Makros: \cs{\emph{scr@Name}@var} und
% \cs{scr@\emph{Name}@name}.
%    \begin{macrocode}
\newcommand*{\newkomavar}{%
  \kernel@ifstar {\@tempswatrue\@newkomavar}{\@tempswafalse\@newkomavar}}
\newcommand*{\@newkomavar}[2][\relax]{%
  \@ifundefined{scr@#2@name}{%
    \@ifundefined{scr@#2@var}{%
      \begingroup
        \def\@tempa{#1}\def\@tempb{\relax}%
        \ifx\@tempa\@tempb\endgroup\else
        \endgroup\@namedef{scr@#2@name}{#1}%
      \fi%
      \expandafter\let\csname scr@#2@var\endcsname=\@empty
      \if@tempswa\addtoreffields{#2}\fi
    }{%
%<class>      \ClassError{scrlttr2%
%<package>      \PackageError{scrletter%
      }{%
        This should never happen%
      }{%
        The contents of the KOMA-Script variable `#2'\MessageBreak
        is undefined, but the name of the variable is
        defined.\MessageBreak
        This should never happen. So someone crashs me!%
      }%
    }%
  }{%
%<class>    \ClassError{scrlttr2%
%<package>    \PackageError{scrletter%
    }{%
      Variable `#2' already defined%
    }{%
      I'll ignore this command, if you'll continue.%
    }%
  }%
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\setkomavar}
% \changes{v2.8q}{2002/01/14}{Neu}%^^A
% \changes{v3.08}{2010/10/28}{\cs{scr@\emph{Name}@postsetname} und
%   \cs{scr@\emph{Name}@postsetvar}}%^^A
% \changes{v3.20}{2016/04/12}{\cs{@ifstar} durch \cs{kernel@ifstar}
%   ersetzt}%^^A
% Natürlich wird auch ein Befehl benötigt, um die Feldvariable zu setzen und
% ihnen ggf. einen neuen Namen für die Ausgabe zu geben. Der \emph{Name} der
% Feldvariable wird als obligatorisches erstes Argument übergeben. Zusätzlich
% zum Setzen von Ausgabename oder Wert werden ggf. auch die Hooks
% \cs{scr@\emph{Name}@postsetname} bzw. \cs{scr@\emph{Name}@postsetvar}
% ausgeführt.
% \begin{macro}{\@setkomavar}
% \changes{v2.8q}{2002/01/14}{Neu}%^^A
% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
%   \cs{kernel@ifnextchar}}%^^A
% Da dann zwischen einer Sternvariante und einer normalen unterschieden werden
% soll wird ein Hilfsmakro benötigt.
% \begin{macro}{\@setkomaname}
% \changes{v2.8q}{2002/01/14}{Neu}%^^A
% Die Sternvariante definiert nur den Ausgabename neu.
% \begin{macro}{\@@setkomavar}
% \changes{v2.8q}{2002/01/14}{Neu}%^^A
% Da in der normalen Variante nach dem Stern ein optionales Argument folgen
% kann, wird mit einem weiteren Hilfsmakro gearbeitet. Der \emph{Ausgabename}
% wird dabei als optionales, zweites Argument übergeben. Der \emph{Inhalt}
% wird als obligatorisches, drittes Argument übergeben.
%    \begin{macrocode}
\newcommand*{\setkomavar}{%
  \kernel@ifstar {\@setkomaname}{\@setkomavar}}
\newcommand*{\@setkomavar}[1]{%
  \kernel@ifnextchar [%]
  {\@@setkomavar{#1}}{\@@setkomavar{#1}[\relax]}}
\newcommand*{\@setkomaname}[2]{%
  \@ifundefined{scr@#1@var}{%
    \@komavar@err{set}{#1}%
  }{%
    \@namedef{scr@#1@name}{#2}%
    \csname scr@#1@postsetname\endcsname
  }%
}
\newcommand*{\@@setkomavar}{}
\long\def\@@setkomavar#1[#2]#3{%
  \@ifundefined{scr@#1@var}{%
    \@komavar@err{set}{#1}%
  }{%
    \@namedef{scr@#1@var}{#3}%
    \csname scr@#1@postsetvar\endcsname
    \begingroup
      \def\@tempa{#2}\def\@tempb{\relax}%
      \ifx\@tempa\@tempb\endgroup\else
      \endgroup\@namedef{scr@#1@name}{#2}%
      \csname scr@#1@postsetname\endcsname
    \fi
  }%
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\@komavar@err}
% \changes{v2.8q}{2002/01/14}{Neu}%^^A
% Dieses Makro wird intern in den Makros \cs{setkomavar} und
% \cs{usekomavar} verwendet.
%    \begin{macrocode}
\newcommand*{\@komavar@err}[2]{%
%<class>  \ClassError{scrlttr2%
%<package>  \PackageError{scrletter%
  }{%
    KOMA-Script variable not defined%
  }{%
    You've tried to #1 the not defined KOMA-Script variable
    `#2'.\MessageBreak
    You have to define the variable using \string\newkomavar\space
    before\MessageBreak
    you do this.%
  }%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\usekomavar}
% \changes{v2.8q}{2002/01/14}{Neu}%^^A
% \changes{v2.9i}{2002/09/04}{robust}%^^A
% \changes{v3.20}{2016/04/12}{\cs{@ifstar} durch \cs{kernel@ifstar}
%     ersetzt}%^^A
% Selbstverständlich wird auch ein Makro benötigt, um auf den
% Inhalt oder den Ausgabename einer Variablen zugreifen zu
% können. Mit der normalen Variante wird dabei der Inhalt, mit der
% Sternvariante der Name ausgegeben.
% \begin{macro}{\@usekomavar}
% \changes{v2.8q}{2002/01/14}{Neu}%^^A
% \changes{v2.9i}{2002/09/04}{optionales Argument}%^^A
% \changes{v2.9j}{2002/09/18}{\cs{@firstofone} als Defaultargument
%      eingefügt}
% \begin{macro}{\@usekomaname}
% \changes{v2.8q}{2002/01/14}{Neu}%^^A
% \changes{v2.9i}{2002/09/04}{optionales Argument}%^^A
% \changes{v2.9j}{2002/09/18}{\cs{@firstofone} als Defaultargument
%      eingefügt}
% Da mir einer Sternvariante gearbeitet wird, werden zwei Hilfsmakros
% benötigt. 
%    \begin{macrocode}
\DeclareRobustCommand*{\usekomavar}{%
  \kernel@ifstar {\@usekomaname}{\@usekomavar}}
\newcommand*{\@usekomavar}[2][\@firstofone]{%
  \@ifundefined{scr@#2@var}{%
    \@komavar@err{use}{#2}%
  }{%
    #1{\@nameuse{scr@#2@var}}%
  }%
}
\newcommand*{\@usekomaname}[2][\@firstofone]{%
  \@ifundefined{scr@#2@var}{%
    \@komavar@err{use}{#2}%
  }{%
    #1{\@nameuse{scr@#2@name}}%
  }%
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\ifkomavar}
% \changes{v3.03}{2009/03/04}{Neu}%^^A
% \changes{v3.28}{2019/11/15}{umbenannt in \cs{Ifkomavar}}%^^A
% \begin{macro}{\Ifkomavar}
% \changes{v3.28}{2019/11/15}{Neu aus Umbenennung von \cs{ifkomavar}}%^^A
% Feststellen, ob eine \KOMAScript-Variable überhaupt definiert ist. Weil
% einige Mitglieder des \LaTeX3-Teams sich beschwert haben, dass trotz fehlens
% einer eindeutigen Empfehlung, \KOMAScript{} \LaTeX-Verzweigungen mit
% \cs{if\dots} definiert, statt dies \TeX-Verzweigungen vorzubehalten, habe
% ich das hier nach mehr zehn Jahren geändert. Sollte es öffentliche
% Beschwerden dazu geben und Ulrike diese sehen, will sie übrigens darauf
% antworten.
%    \begin{macrocode}
\newcommand*{\ifkomavar}{%
%<package>  \PackageWarning{scrletter}{%
%<class>  \ClassWarning{\KOMAClassName}{%
    Usage of deprecated command `\string\ifkomavar'.\MessageBreak
    The command has been renamed to because of a\MessageBreak
    recommendation of LaTeX3 team members.\MessageBreak
    Please replace `\string\ifkomavar' by `\string\Ifkomavar'%
  }%
  \Ifkomavar
}
\DeclareRobustCommand*{\Ifkomavar}[1]{%
  \scr@ifundefinedorrelax{scr@#1@var}{%
    \expandafter\@secondoftwo
  }{%
    \expandafter\@firstoftwo
  }%
}
%    \end{macrocode}
% \end{macro}%^^A \Ifkomavar
% \end{macro}%^^A \ifkomavar
%
% \begin{macro}{\ifkomavarempty}
% \changes{v2.8q}{2002/01/14}{Neu}%^^A
% \changes{v2.9i}{2002/09/04}{Leerzeichen rausgeworfen}%^^A
% \changes{v2.9i}{2002/09/04}{robust}%^^A
% \changes{v3.20}{2016/04/12}{\cs{@ifstar} durch \cs{kernel@ifstar}
%   ersetzt}%^^A
% \changes{v3.28}{2019/11/15}{umbenannt in \cs{Ifkomavar}}%^^A
% \begin{macro}{\Ifkomavarempty}
% \changes{v3.28}{2019/11/15}{Neu aus Umbenennung von \cs{ifkomavarempty}}%^^A
% Es gibt auch noch ein Makro, um zu testen, ob eine \KOMAScript{}
% Variable oder deren Name leer ist. Die Sternvariante ist wieder für
% den Namen zuständig. Weil einige Mitglieder des \LaTeX3-Teams sich beschwert
% haben, dass trotz fehlens einer eindeutigen Empfehlung, \KOMAScript{}
% \LaTeX-Verzweigungen mit \cs{if\dots} definiert, statt dies
% \TeX-Verzweigungen vorzubehalten, habe ich das hier nach mehr 17 Jahren
% geändert. Sollte es öffentliche Beschwerden dazu geben und Ulrike diese
% sehen, will sie übrigens darauf antworten.
% \begin{macro}{\if@komavarempty}
% \changes{v2.8q}{2002/01/14}{Neu}%^^A
% \changes{v3.03}{2009/03/04}{die neue Anweisung \cs{ifkomavar} wird
%   verwendet}
% \changes{v3.03}{2009/03/04}{die Argumente werden nicht mehr direkt
%   gelesen}%^^A
% \changes{v3.28}{2019/11/15}{\cs{ifkomavar} durch \cs{Ifkomavar} ersetzt}%^^A
% Da mit einer Sternvariante gearbeitet wird, wird wieder ein
% Hilfsmakro verwendet.
%    \begin{macrocode}
\newcommand*{\ifkomavarempty}{%
%<package>  \PackageWarning{scrletter}{%
%<class>  \ClassWarning{\KOMAClassName}{%
    Usage of deprecated command `\string\ifkomavarempty'.\MessageBreak
    The command has been renamed to because of a\MessageBreak
    recommendation of LaTeX3 team members.\MessageBreak
    Please replace `\string\ifkomavarempty' by `\string\Ifkomavarempty'%
  }%
  \Ifkomavarempty
}
\DeclareRobustCommand*{\Ifkomavarempty}{%
  \begingroup
  \kernel@ifstar {\@tempswatrue\@ifkomavarempty}%
                 {\@tempswafalse\@ifkomavarempty}%
}
\newcommand{\@ifkomavarempty}[1]{%
    \Ifkomavar{#1}{%
      \if@tempswa
        \@ifundefined{scr@#1@name}{%
          \aftergroup\@firstoftwo
        }{%
          \expandafter\ifx\csname scr@#1@name\endcsname\@empty
            \aftergroup\@firstoftwo
          \else
            \aftergroup\@secondoftwo
          \fi
        }%
      \else
        \expandafter\ifx\csname scr@#1@var\endcsname\@empty
          \aftergroup\@firstoftwo
        \else
          \aftergroup\@secondoftwo
        \fi
      \fi
    }{%
      \@komavar@err{use}{#1}%
      \aftergroup\@gobbletwo
    }%
  \endgroup
}
%    \end{macrocode}
% \end{macro}%^^A \@ifkomavarempty
% \end{macro}%^^A \Ifkomavarempty
% \end{macro}%^^A \ifkomavarempty
%
% \selectlanguage{english}
% \begin{macro}{\foreachkomavar}
% \changes{v3.27}{2019/03/13}{new}%^^A
% Executes \texttt{\#2} for each variable in the comma separated list
% \texttt{\#1}. An argument is appended to \texttt{\#2} which is the current
% variable to be processed. This command is short. So if you want so execute
% long code you should define a command for it. Sideeffect: \cs{reserved@a} is
% changed.
%    \begin{macrocode}
\newcommand*{\foreachkomavar}[2]{%
  \@for \reserved@a:=#1\do{%
    \scr@trim@spaces\reserved@a
    \ifx\reserved@a\@empty\else
      \edef\reserved@a{\unexpanded{#2}{\reserved@a}}\expandafter\reserved@a
    \fi
  }%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\foreachkomavarifempty}
% \changes{v3.27}{2019/03/13}{new}%^^A
% \changes{v3.28}{2019/11/15}{\cs{ifkomavarempty} durch \cs{Ifkomavarempty}
%   ersetzt}%^^A
% Same like \cs{foreachkomavar} but \texttt{\#2} is called only for empty
% variables and \texttt{\#3} is called for non empty.
%    \begin{macrocode}
\newcommand*{\foreachkomavarifempty}[3]{%
  \@for \reserved@a:=#1\do{%
    \scr@trim@spaces\reserved@a
    \ifx\reserved@a\@empty\else
      \edef\reserved@a{%
        \noexpand\Ifkomavarempty{\reserved@a}%
        {\unexpanded{#2}{\reserved@a}}%
        {\unexpanded{#3}{\reserved@a}}%
      }\expandafter\reserved@a
    \fi
  }%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\foreachemptykomavar}
% \changes{v3.27}{2019/03/13}{new}%^^A
% \changes{v3.28}{2019/11/15}{\cs{ifkomavarempty} durch \cs{Ifkomavarempty}
%   ersetzt}%^^A
% Similar to \cs{foreachemptykomavar} with \texttt{\#3}=\cs{@gobble}.
%    \begin{macrocode}
\newcommand*{\foreachemptykomavar}[2]{%
  \@for \reserved@a:=#1\do{%
    \scr@trim@spaces\reserved@a
    \ifx\reserved@a\@empty\else
      \edef\reserved@a{%
        \noexpand\Ifkomavarempty{\reserved@a}{\unexpanded{#2}{\reserved@a}}{}%
      }\expandafter\reserved@a
    \fi
  }%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\foreachnonemptykomavar}
% \changes{v3.27}{2019/03/13}{new}%^^A
% \changes{v3.28}{2019/11/15}{\cs{ifkomavarempty} durch \cs{Ifkomavarempty}
%   ersetzt}%^^A
% Similar to \cs{foreachemptykomavar} with \texttt{\#2}=\cs{@gobble}.
%    \begin{macrocode}
\newcommand*{\foreachnonemptykomavar}[2]{%
  \@for \reserved@a:=#1\do{%
    \scr@trim@spaces\reserved@a
    \ifx\reserved@a\@empty\else
      \edef\reserved@a{%
        \noexpand\Ifkomavarempty{\reserved@a}{}{\unexpanded{#2}{\reserved@a}}%
      }\expandafter\reserved@a
    \fi
  }%
}
%    \end{macrocode}
% \end{macro}
% \selectlanguage{ngerman}
%
% \iffalse
%</body>
% \fi
%
% \iffalse
%</letter>
% \fi
%
% \Finale
%
\endinput
%
% end of file `scrkernel-variables.dtx'
%%% Local Variables:
%%% mode: doctex
%%% TeX-master: t
%%% End:
