%\iffalse
%<*package>
%% \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         \~}
%</package>
%
% Doc-Source file to use with LaTeX2e
% Copyright (C) 2015 Nicola Talbot, all rights reserved.
% Copyright (C) 2017-19 Sebastian Friedl, all rights reserved.
% \fi
%
%
%
% \changes{1.0}{2015-03-27}{Initial release}
% \changes{3.0}{2019-12-13}{Load regionless style only when no regional variant is stated}
%
% This file contains the style used when German is requested without a known region.
%
% \medskip
% Identify Module.
%    \begin{macrocode}
\ProvidesDateTimeModule{german}[2019/12/13 v3.0]
%    \end{macrocode}
% Require the base German module
%    \begin{macrocode}
\RequireDateTimeModule{german-base}
%    \end{macrocode}
%
% Allow the user to configure the "german" and "german-numeric" styles.
% The package wide separators such as \cs{dtm@datetimesep} are not used
% in case other date formats are also required.
%
%\begin{macro}{\DTMgermandowdaysep}
% The separator between weekday and day.
%    \begin{macrocode}
\newcommand*{\DTMgermandowdaysep}{,\space}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\DTMgermandaymonthsep}
% The separator between the day and month for the text format.
%    \begin{macrocode}
\newcommand*{\DTMgermandaymonthsep}{.\DTMtexorpdfstring{\protect~}{\space}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\DTMgermanmonthyearsep}
% The separator between the month and year for the text format.
%    \begin{macrocode}
\newcommand*{\DTMgermanmonthyearsep}{\space}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\DTMgermandatetimesep}
% The separator between the date and time blocks in the full format
% (either text or numeric).
%    \begin{macrocode}
\newcommand*{\DTMgermandatetimesep}{,\space}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\DTMgermantimezonesep}
% The separator between the time and zone blocks in the full format
% (either text or numeric).
%    \begin{macrocode}
\newcommand*{\DTMgermantimezonesep}{\space}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\DTMgermandatesep}
% The separator for the numeric date format.
%    \begin{macrocode}
\newcommand*{\DTMgermandatesep}{.}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\DTMgermantimesep}
% The separator for the numeric time format.
%    \begin{macrocode}
\newcommand*{\DTMgermantimesep}{:}
%    \end{macrocode}
%\end{macro}
%
% Provide keys that can be used in \cs{DTMlangsetup} to set these separators.
%    \begin{macrocode}
\DTMdefkey{german}{dowdaysep}{\renewcommand*{\DTMgermandowdaysep}{#1}}
\DTMdefkey{german}{daymonthsep}{\renewcommand*{\DTMgermandaymonthsep}{#1}}
\DTMdefkey{german}{monthyearsep}{\renewcommand*{\DTMgermanmonthyearsep}{#1}}
\DTMdefkey{german}{datetimesep}{\renewcommand*{\DTMgermandatetimesep}{#1}}
\DTMdefkey{german}{timezonesep}{\renewcommand*{\DTMgermantimezonesep}{#1}}
\DTMdefkey{german}{datesep}{\renewcommand*{\DTMgermandatesep}{#1}}
\DTMdefkey{german}{timesep}{\renewcommand*{\DTMgermantimesep}{#1}}
%    \end{macrocode}
%
% 
% Define a boolean key that can switch between full and abbreviated formats for
% the month and day of week names.
%    \begin{macrocode}
\DTMdefboolkey{german}{abbr}[true]{}
%    \end{macrocode}
%
% The default is to show the full names.
%    \begin{macrocode}
\DTMsetbool{german}{abbr}{false}
%    \end{macrocode}
%
% Define a boolean key that determines if the time zone mappings
% should be used.
%    \begin{macrocode}
\DTMdefboolkey{german}{mapzone}[true]{}
%    \end{macrocode}
% The default is to use mappings.
%    \begin{macrocode}
\DTMsetbool{german}{mapzone}{true}
%    \end{macrocode}
%
% Define a boolean key that determines if the day of month should be
% displayed.
%    \begin{macrocode}
\DTMdefboolkey{german}{showdayofmonth}[true]{}
%    \end{macrocode}
% The default is to show the day of month.
%    \begin{macrocode}
\DTMsetbool{german}{showdayofmonth}{true}
%    \end{macrocode}
%
% Define a boolean key that determines if the year should be
% displayed.
%    \begin{macrocode}
\DTMdefboolkey{german}{showyear}[true]{}
%    \end{macrocode}
% The default is to show the year.
%    \begin{macrocode}
\DTMsetbool{german}{showyear}{true}
%    \end{macrocode}
%
% Define the (regionless) "german" style.
%\changes{1.1}{2017-03-09}{Fixed bug in \cs{DTMDisplaydate}}
%\changes{1.2}{2017-09-10}{Implemented short month names}
%\changes{1.2}{2017-09-10}{Implemented short weekday names}
%\changes{1.2}{2017-09-10}{Implemented day of week}
%\changes{2.1}{2017-11-13}{Fixed spurious space when switching languages}
%    \begin{macrocode}
\DTMnewstyle
 {german}% label
 {% date style
   \renewcommand*\DTMdisplaydate[4]{%
   	 \ifDTMshowdow
   	   \ifnum##4>-1
   	     \DTMifbool{german}{abbr}%
   	     {\DTMgermanshortweekdayname{##4}}%
   	     {\DTMgermanweekdayname{##4}}%
   	     \DTMgermandowdaysep
   	   \fi
   	 \fi
   	 %
     \DTMifbool{german}{showdayofmonth}%
     {\DTMgermanordinal{##3}\DTMgermandaymonthsep}%
     {}%
     %
     \DTMifbool{german}{abbr}%
     {\DTMgermanshortmonthname{##2}}%
     {\DTMgermanmonthname{##2}}%
     %
     \DTMifbool{german}{showyear}%
     {%
       \DTMgermanmonthyearsep%
       \number##1 % space intended
     }%
     {}%
   }%
   \renewcommand*\DTMDisplaydate[4]{%
     \ifDTMshowdow
       \ifnum##4>-1
         \DTMifbool{german}{abbr}%
         {\DTMgermanshortweekdayname{##4}}%
         {\DTMgermanweekdayname{##4}}%
         \DTMgermandowdaysep
       \fi
     \fi
     %
     \DTMifbool{german}{showdayofmonth}%
     {\DTMgermanordinal{##3}\DTMgermandaymonthsep}%
     {}%
     %
     \DTMifbool{german}{abbr}%
     {\DTMgermanshortmonthname{##2}}%
     {\DTMgermanmonthname{##2}}%
     %
     \DTMifbool{german}{showyear}%
     {%
       \DTMgermanmonthyearsep%
       \number##1 % space intended
     }%
     {}%
    }%
   }%
 {% time style (use default)
   \renewcommand*\DTMdisplaytime[3]{%
   	\DTMtwodigits{##1}%
   	\DTMgermantimesep\DTMtwodigits{##2}%
   	\ifDTMshowseconds\DTMgermantimesep\DTMtwodigits{##3}\fi
   }%
 }%
 {% zone style
   \DTMresetzones
   \DTMgermanzonemaps
   \renewcommand*{\DTMdisplayzone}[2]{%
     \DTMifbool{german}{mapzone}%
     {\DTMusezonemapordefault{##1}{##2}}%
     {%
       \ifnum##1<0\else+\fi\DTMtwodigits{##1}%
       \ifDTMshowzoneminutes\DTMgermantimesep\DTMtwodigits{##2}\fi
     }%
   }%
 }%
 {% full style
   \renewcommand*{\DTMdisplay}[9]{%
    \ifDTMshowdate
     \DTMdisplaydate{##1}{##2}{##3}{##4}%
     \DTMgermandatetimesep
    \fi
    \DTMdisplaytime{##5}{##6}{##7}%
    \ifDTMshowzone
     \DTMgermantimezonesep
     \DTMdisplayzone{##8}{##9}%
    \fi
   }%
   \renewcommand*{\DTMDisplay}[9]{%
    \ifDTMshowdate
     \DTMDisplaydate{##1}{##2}{##3}{##4}%
     \DTMgermandatetimesep
    \fi
    \DTMdisplaytime{##5}{##6}{##7}%
    \ifDTMshowzone
     \DTMgermantimezonesep
     \DTMdisplayzone{##8}{##9}%
    \fi
   }%
 }%
%    \end{macrocode}
%
% Define the corresponding numeric style.
%\changes{1.2}{2017-09-10}{Implemented day of week}
%\changes{2.0}{2017-10-03}{Fixed month-year-separator}
%    \begin{macrocode}
\DTMnewstyle
 {german-numeric}% label
 {% date style
    \renewcommand*\DTMdisplaydate[4]{%
      \ifDTMshowdow
        \ifnum##4>-1
          \DTMifbool{german}{abbr}%
          {\DTMgermanshortweekdayname{##4}}%
          {\DTMgermanweekdayname{##4}}%
          \DTMgermandowdaysep
        \fi
      \fi
      %
      \DTMifbool{german}{showdayofmonth}%
      {%
        \DTMtwodigits{##3}%
        \DTMgermandatesep
      }%
      {}%
      \DTMtwodigits{##2}%
      \DTMgermandatesep%
      \DTMifbool{german}{showyear}%
      {%
        \DTMifbool{german}{abbr}%
        {\DTMtwodigits{##1}}%
        {\number##1 }% space intended
      }%
      {}%
    }%
    \renewcommand*{\DTMDisplaydate}[4]{\DTMdisplaydate{##1}{##2}{##3}{##4}}%
 }%
 {% time style
    \renewcommand*\DTMdisplaytime[3]{%
      \DTMtwodigits{##1}%
      \DTMgermantimesep\DTMtwodigits{##2}%
      \ifDTMshowseconds\DTMgermantimesep\DTMtwodigits{##3}\fi
    }%
 }%
 {% zone style
   \DTMresetzones
   \DTMgermanzonemaps
   \renewcommand*{\DTMdisplayzone}[2]{%
     \DTMifbool{german}{mapzone}%
     {\DTMusezonemapordefault{##1}{##2}}%
     {%
       \ifnum##1<0\else+\fi\DTMtwodigits{##1}%
       \ifDTMshowzoneminutes\DTMgermantimesep\DTMtwodigits{##2}\fi
     }%
   }%
 }%
 {% full style
   \renewcommand*{\DTMdisplay}[9]{%
    \ifDTMshowdate
     \DTMdisplaydate{##1}{##2}{##3}{##4}%
     \DTMgermandatetimesep
    \fi
    \DTMdisplaytime{##5}{##6}{##7}%
    \ifDTMshowzone
     \DTMgermantimezonesep
     \DTMdisplayzone{##8}{##9}%
    \fi
   }%
   \renewcommand*{\DTMDisplay}{\DTMdisplay}%
 }
%    \end{macrocode}
%
% Switch the style according to the \opt{useregional} setting.
%    \begin{macrocode}
\DTMifcaseregional
{}% do nothing
{\DTMsetstyle{german}}
{\DTMsetstyle{german-numeric}}
%    \end{macrocode}
%
% Redefine \cs{dategerman} (or \cs{date}\meta{dialect}) to prevent
% \sty{babel} from resetting \cs{today}. (For this to work,
% \sty{babel} must already have been loaded if it's required.)
%    \begin{macrocode}
\ifcsundef{date\CurrentTrackedDialect}
{%
  \ifundef\dategerman
  {% do nothing
  }%
  {%
    \def\dategerman{%
      \DTMifcaseregional
      {}% do nothing
      {\DTMsetstyle{german}}%
      {\DTMsetstyle{german-numeric}}%
    }%
  }%
}%
{%
  \csdef{date\CurrentTrackedDialect}{%
    \DTMifcaseregional
    {}% do nothing
    {\DTMsetstyle{german}}%
    {\DTMsetstyle{german-numeric}}%
  }%
}%
%    \end{macrocode}
%
\endinput
