% \CheckSum{157}
% \iffalse meta-comment
% ======================================================================
% scrkernel-variables.dtx
% Copyright (c) Markus Kohm, 2008-2013
%
% 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-2013
%
% 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 1389 2013-10-01 16:06:04Z mjk $
%<*driver>
% \fi
\ProvidesFile{scrkernel-variables.dtx}[2011/03/31 v3.08b KOMA-Script
                                                    (koma variables)]
% \iffalse
\documentclass{scrdoc}
\usepackage[english,ngerman]{babel}
\usepackage[latin1]{inputenc}
\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}
%</driver>
% \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}
% 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}{%
  \@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
    }{%
      \ClassError{%
        scrlttr2%
      }{%
        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!%
      }%
    }%
  }{%
    \ClassError{%
      scrlttr2%
    }{%
      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}
%   \changes{v3.08}{2010/10/28}{\cs{scr@\emph{Name}@postsetname}
%     und \cs{scr@\emph{Name}@postsetvar}}
% Natürlich wird auch ein Befehl benötigt, um die Feldvariablen
% 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}
% 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}
% Die Sternvariante definiert nur den Ausgabename neu.
% \begin{macro}{\@@setkomavar}
%   \changes{v2.8q}{2002/01/14}{Neu}
% 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}{%
  \@ifstar {\@setkomaname}{\@setkomavar}}
\newcommand*{\@setkomavar}[1]{%
  \@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}
% Dieses Makro wird intern in den Makros \cs{setkomavar} und
% \cs{usekomavar} verwendet.
%    \begin{macrocode}
\newcommand*{\@komavar@err}[2]{%
  \ClassError{%
    scrlttr2%
  }{%
    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}
%    \changes{v2.9i}{2002/09/04}{robust}
% 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}
%    \changes{v2.9i}{2002/09/04}{optionales Argument}
%    \changes{v2.9j}{2002/09/18}{\cs{@firstofone} als Defaultargument
%      eingefügt}
%  \begin{macro}{\@usekomaname}
%    \changes{v2.8q}{2002/01/14}{Neu}
%    \changes{v2.9i}{2002/09/04}{optionales Argument}
%    \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}{%
  \@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}
% Feststellen, ob eine \KOMAScript-Variable überhaupt definiert ist.
%    \begin{macrocode}
\DeclareRobustCommand*{\ifkomavar}[1]{%
  \scr@ifundefinedorrelax{scr@#1@var}{%
    \expandafter\@secondoftwo
  }{%
    \expandafter\@firstoftwo
  }%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ifkomavarempty}
%   \changes{v2.8q}{2002/01/14}{Neu}
%   \changes{v2.9i}{2002/09/04}{Leerzeichen rausgeworfen}
%   \changes{v2.9i}{2002/09/04}{robust}
% 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.
% \begin{macro}{\if@komavarempty}
%   \changes{v2.8q}{2002/01/14}{Neu}
%   \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}
% Da mit einer Sternvariante gearbeitet wird, wird wieder ein
% Hilfsmakro verwendet.
%    \begin{macrocode}
\DeclareRobustCommand*{\ifkomavarempty}{%
  \begingroup
  \@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}
%  \end{macro}
%
%
% \iffalse
%</body>
% \fi
%
% \iffalse
%</letter>
% \fi
%
% \Finale
%
\endinput
%
% end of file `scrkernel-variables.dtx'
%%% Local Variables:
%%% mode: doctex
%%% TeX-master: t
%%% End:
