% \iffalse meta-comment
%
% Copyright (C) 1989-1994 by Johannes Braams
% All rights reserved.
% For additional copyright information see further down in this file.
% 
% This file is part of the Babel system, release 3.4 patchlevel 2.
% ----------------------------------------------------------------
% 
% This file is distributed in the hope that it will be useful,
% but WITHOUT ANY WARRANTY; without even the implied warranty of
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
% 
% 
% IMPORTANT NOTICE:
% 
% For error reports in case of UNCHANGED versions see readme file.
% 
% Please do not request updates from me directly.  Distribution is
% done through Mail-Servers and TeX organizations.
% 
% You are not allowed to change this file.
% 
% You are allowed to distribute this file under the condition that
% it is distributed together with all files mentioned in manifest.txt.
% 
% If you receive only some of these files from someone, complain!
% 
% You are NOT ALLOWED to distribute this file alone.  You are NOT
% ALLOWED to take money for the distribution or use of either this
% file or a changed version, except for a nominal charge for copying
% etc.
% \fi
% \CheckSum{581}
%%% \iffalse ============================================================
%%%  @LaTeX-style-file{
%%%     author-1        = "Bernd Raichle",
%%%     author-2        = "Braams J.L.",
%%%     version         = "2.5c",
%%%     date            = "26 June 1994",
%%%     time            = "00:38:56 MET",
%%%     filename        = "germanb.dtx",
%%%     address         = "PTT Research
%%%                        St. Paulusstraat 4
%%%                        2264 XZ Leidschendam
%%%                        The Netherlands",
%%%     telephone-2     = "(70) 3325051",
%%%     FAX-2           = "(70) 3326477",
%%%     checksum        = "29603 839 3842 33542",
%%%     email-1         = "raichle@azu.Informatik.Uni-Stuttgart.de",
%%%     email-2         = "J.L.Braams@research.ptt.nl (Internet)",
%%%     codetable       = "ISO/ASCII",
%%%     keywords        = "babel, german",
%%%     supported       = "yes",
%%%     abstract        = "",
%%%     docstring       = "This file contains the german language specific
%%%                        definitions for the babel system.
%%%                        It is based on german.tex 2.3e.",
%%%  }
%%%
%%%  ====================================================================
%%% \fi
% \def\filename{germanb.dtx}
%\def\fileversion{v2.5c}
%\def\filedate{1994/06/26}
%
% \iffalse
% Babel DOCUMENT-STYLE option for LaTeX version 2e
% Copyright (C) 1989 - 1994
%           by Johannes Braams, PTT Research Neher Laboratories
%
% Please report errors to: J.L. Braams
%                          J.L.Braams@research.ptt.nl
%
%    This file is part of the babel system, it provides the source code for
%    the German language-specific file.
%    This file is based on German.sty version 2.3e
%                          by Bernd Raichle, Hubert Partl et.al.
%<*filedriver>
\documentclass{ltxdoc}
\font\manual=logo10 % font used for the METAFONT logo, etc.
\newcommand\MF{{\manual META}\-{\manual FONT}}
\newcommand\TeXhax{\TeX hax}
\newcommand\babel{{\sf babel}}
\newcommand\ttbs{\char'134}
\newcommand\langvar{$\langle \it lang \rangle$}
\newcommand\note[1]{}
\newcommand\bsl{\protect\bslash}
\newcommand\Lopt[1]{{\sf #1}}
\newcommand\file[1]{{\tt #1}}
\begin{document}
 \DocInput{germanb.dtx}
\end{document}
%</filedriver>
%\fi
%
% \changes{germanb-1.0a}{14 may 90}{Incorporated Nico's comments}
% \changes{germanb-1.0b}{22 may 90}{fixed typo in definition for
%                            austrian language found by Werenfried
%                            Spit nspit@fys.ruu.nl}
% \changes{germanb-1.0c}{16 july 90}{Fixed some typos}
% \changes{germanb-1.1}{30 juli 90}{When using PostScript fonts with the
%                            Adobe fontencoding, the dieresis-accent
%                            is located elsewhere, modified code}
% \changes{germanb-1.1a}{27 august 90}{Modified the documentation
%                            somewhat}
% \changes{germanb-2.0}{23 april 91}{Modified for babel 3.0}
% \changes{germanb-2.0a}{25 may 91}{Removed some problems in change
%                            log}
% \changes{germanb-2.1}{29 may 91}{Removed bug found by van der Meer}
% \changes{germanb-2.2}{11 june 91}{Removed global assignments,
%                           brought uptodate with german v2.3d}
% \changes{germanb-2.2a}{15 july 91}{Renamed babel.sty in babel.com}
% \changes{germanb-2.3}{5 nov 91}{Rewritten parts of the code to use
%                            the new features of babel version 3.1}
% \changes{germanb-2.3e}{10 nov 91}{Brought up-to-date with german.sty
%                        v2.3e (plus some bug fixes) [br]}
% \changes{germanb-2.5}{8 feb 94}{Update or LaTeX2e}
% \changes{germanb-2.5c}{1994/06/26}{Removed the use of \cs{filedate}
%    and moved the identification after the loading of babel.def}
%
%  \section{The German language}
%
%    The file \file{\filename}\footnote{The file described in this
%    section has version number \fileversion and was last revised on
%    \filedate.}
%    defines all the language-specific macros for the German
%    language as well as for the Austrian dialect of this
%    language\footnote{This file is a re-implementation of Hubert Partl's
%    {\tt german.sty} version 2.3e, see~\cite{HP}.}.
%
%    For this language the character |"| is made active. In
%    table~\ref{tab:german-quote} an overview is given of its
%    purpose. One of the reasons for this is that in the German
%    language some character combinations change when a word is broken
%    between the combination. Also the vertical placement of the
%    umlaut can be controlled this way.
%    \begin{table}[htb]
%     \begin{center}
%     \begin{tabular}{lp{8cm}}
%      |"a| & |\"a|, also implemented for the other
%                  lowercase and uppercase vowels.                  \\
%      |"s| & to produce the German \ss{} (like |\ss{}|). \\
%      |"ck|& for |ck| to be hyphenated as |k-k|.    \\
%      |"ff|& for |ff| to be hyphenated as |ff-f|,
%                  this is also implemented for certain other
%                  consonants.                                      \\
%      |"S| & for |SS| to be |\uppercase{"s}|.       \\
%      \verb="|= & disable ligature at this position.               \\
%      |"-| & an explicit hyphen sign, allowing hyphenation
%                  in the rest of the word.                         \\
%      |""| & like |"-|, but producing no hyphen sign
%                  (for compund words with hyphen, e.g.\ |x-""y|). \\
%      |"`| & for German left double quotes (looks like ,,).   \\
%      |"'| & for German right double quotes.                  \\
%      |"<| & for French left double quotes (similar to $<<$). \\
%      |">| & for French right double quotes (similar to $>>$).\\
%     \end{tabular}
%     \caption{The extra definitions made
%              by \file{german.sty}}\label{tab:german-quote}
%     \end{center}
%    \end{table}
%    The quotes in table~\ref{tab:german-quote} can also be typeset by
%    using the commands in table~\ref{tab:more-quote}.
%    \begin{table}[htb]
%     \begin{center}
%     \begin{tabular}{lp{8cm}}
%      |\glqq| & for German left double quotes (looks like ,,).   \\
%      |\grqq| & for German right double quotes (looks like ``).  \\
%      |\glq|  & for German left single quotes (looks like ,).    \\
%      |\grq|  & for German right single quotes (looks like `).   \\
%      |\flqq| & for French left double quotes (similar to $<<$). \\
%      |\frqq| & for French right double quotes (similar to $>>$).\\
%      |\flq|  & for (French) left single quotes (similar to $<$).  \\
%      |\frq|  & for (French) right single quotes (similar to $>$). \\
%      |\dq|   & the original quotes character (|"|).        \\
%     \end{tabular}
%     \caption{More commands which produce quotes, defined
%              by \file{german.sty}}\label{tab:more-quote}
%     \end{center}
%    \end{table}
%
% \StopEventually{}
%
% \changes{germanb-2.2d}{27 okt 91}{Removed code to load {\tt
%                                   latexhax.com}}
%
%    As this file, \file{germanb.sty}, needs to be read only once,
%    we check whether it was read before.
%    If it was, the command |\captionsgerman| is already
%    defined, so we can stop processing. If this command is undefined
%    we proceed with the various definitions and first show the
%    current version of this file.
%
% \changes{germanb-2.2a}{15 july 91}{Added reset of catcode of @ before
%                                  {\tt\bsl endinput}.}
% \changes{germanb-2.2d}{27 okt 91}{Removed use of {\tt\bsl @ifundefined}}
% \changes{germanb-2.3e}{10 nov 91}{Moved code to the beginning of the
%                                   file and added {\tt\bsl
%                                   selectlanguage} call}
%    \begin{macrocode}
\ifx\undefined\captionsgerman
\else
  \selectlanguage{german}
  \expandafter\endinput
\fi
%    \end{macrocode}
%
% \begin{macro}{\atcatcode}
%    This file, {\tt germanb.sty}, may have been read while \TeX\ is
%    in the middle of processing a document, so we have to make sure
%    the category code of {\tt @} is `letter' while this file is being
%    read. We save the category code of the @-sign in |\atcatcode| and
%    make it `letter'. Later the category code can be restored to
%    whatever it was before.
%
% \changes{germanb-2.2}{11 june 91}{Made test of catcode of @ more
%                                   robust}
% \changes{germanb-2.2a}{15 july 91}{Modified handling of catcode of @
%                                    again.}
% \changes{germanb-2.2d}{27 okt 91}{Removed use of {\tt\bsl makeatletter}
%                        and hence the need to load {\tt latexhax.com}}
%    \begin{macrocode}
\chardef\atcatcode=\catcode`\@
\catcode`\@=11\relax
%    \end{macrocode}
% \end{macro}
%
%
%    Now we determine whether the common macros from the file
%    \file{babel.def} need to be read. We can be in one of two
%    situations: either another language option has been read earlier
%    on, in which case that other option has already read
%    \file{babel.def}, or {\tt germanb} is the first language option
%    to be processed. In that case we need to read \file{babel.def}
%    right here before we continue.
%
% \changes{germanb-2.0}{23 april 91}{New check before loading
%                                    babel.com}
% \changes{germanb-2.3g}{15 feb 92}{Added {\tt\bsl relax} after the
%                                    argument of {\tt\bsl input}}
%    \begin{macrocode}
\ifx\undefined\babel@core@loaded\input babel.def\relax\fi
%    \end{macrocode}
%
%    Tell the \LaTeX\ system who we are and write an entry on the
%    transcript.
%    \begin{macrocode}
\ProvidesFile{germanb.sty}[1994/06/26 v2.5c
         German support from the babel system]
%    \end{macrocode}
%
% \changes{germanb-2.1}{29 may 91}{Add a check for existence of
%    {\tt\bsl originalTeX}}
%    Another check that has to be made, is if another language
%    specific file has been read already. In that case its definitions
%    have been activated. This might interfere with definitions this
%    file tries to make. Therefore we make sure that we cancel any
%    special definitions. This can be done by checking the existence
%    of the macro |\originalTeX|. If it exists we simply execute it,
%    otherwise it is |\let| to |\empty|.
% \changes{germanb-2.2a}{15 july 91}{Added {\tt\bsl let\bsl
%    originalTeX% \bsl relax} to test for existence}
% \changes{germanb-2.3f}{25 jan 92}{Set {\tt\bsl originalTeX} to
%    {\tt\bsl empty}, because it should be expandable.}
%    \begin{macrocode}
\ifx\undefined\originalTeX \let\originalTeX\empty\fi
\originalTeX
%    \end{macrocode}
%
%    When this file is read as an option, i.e., by
%    the |\usaepackage| command, {\tt german} will be an
%    `unknown' language, so we have to make it known.
%    So we check for the existence of |\l@german| to see whether
%    we have to do something here.
%
% \changes{germanb-2.0}{23 april 91}{Now use {\tt\bsl adddialect} if
%    language undefined}
% \changes{germanb-2.2d}{27 okt 91}{Removed use of {\tt\bsl
%    @ifundefined}}
% \changes{germanb-2.3e}{10 nov 91}{Added warning, if no german
%    patterns loaded}
% \changes{germanb-2.5c}{1994/06/26}{Now use \cs{@nopatterns} to
%    produce the warning}
%    \begin{macrocode}
\ifx\undefined\l@german
  \@nopatterns{German}
  \adddialect\l@german0
\fi
%    \end{macrocode}
%
%    For the Austrian version of these definitions we just add another
%    language. Also, the macros |\captionsaustrian| and
%    |\extrasaustrian| are |\let| to their German
%    counterparts if these parts are defined.
% \changes{germanb-2.0}{23 april 91}{Now use {\tt\bsl adddialect} for
%                                    austrian}
%    \begin{macrocode}
\adddialect\l@austrian\l@german
%    \end{macrocode}
%
%
%    The next step consists of defining commands to switch to (and
%    from) the German language.
%
% \begin{macro}{\captionsgerman}
%    The macro |\captionsgerman| defines all strings used in the four
%    standard document classes provided with \LaTeX.
%
% \changes{germanb-2.2}{6 june 91}{Removed {\tt\bsl global} definitions}
% \changes{germanb-2.2}{6 june 91}{{\tt\bsl pagename} should be
%                                  {\tt\bsl headpagename}}
% \changes{germanb-2.3e}{10 nov 91}{Added {\tt\bsl prefacename},
%                       {\tt\bsl seename} and {\tt\bsl alsoname}}
% \changes{germanb-2.4}{15 jul 93}{`headpagename should be `pagename}
%    \begin{macrocode}
\addto\captionsgerman{%
  \def\prefacename{Vorwort}%
  \def\refname{Literatur}%
  \def\abstractname{Zusammenfassung}%
  \def\bibname{Literaturverzeichnis}%
  \def\chaptername{Kapitel}%
  \def\appendixname{Anhang}%
  \def\contentsname{Inhaltsverzeichnis}%    % oder nur: Inhalt
  \def\listfigurename{Abbildungsverzeichnis}%
  \def\listtablename{Tabellenverzeichnis}%
  \def\indexname{Index}%
  \def\figurename{Abbildung}%
  \def\tablename{Tabelle}%                  % oder: Tafel
  \def\partname{Teil}%
  \def\enclname{Anlage(n)}%                 % oder: Beilage(n)
  \def\ccname{Verteiler}%                   % oder: Kopien an
  \def\headtoname{An}%
  \def\pagename{Seite}%
  \def\seename{siehe}%
  \def\alsoname{siehe auch}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\captionsgerman}
%    The `captions' are the same for both version of the language, so
%    we can |\let| the macro |\captionsaustrian| be equal to
%    |\captionsgerman|.
%    \begin{macrocode}
\let\captionsaustrian\captionsgerman
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\dategerman}
%    The macro |\dategerman| redefines the command
%    |\today| to produce German dates.
% \changes{germanb-2.3e}{10 nov 91}{Added {\tt\bsl month@german}}
%    \begin{macrocode}
\def\month@german{\ifcase\month\or
  Januar\or Februar\or M\"arz\or April\or Mai\or Juni\or
  Juli\or August\or September\or Oktober\or November\or Dezember\fi}
\def\dategerman{\def\today{\number\day.~\month@german
  \space\number\year}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\dateaustrian}
%    The macro |\dateaustrian| redefines the command
%    |\today| to produce Austrian version of the German dates.
%    \begin{macrocode}
\def\dateaustrian{\def\today{\number\day.~\ifnum1=\month
  J\"anner\else \month@german\fi \space\number\year}}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\extrasgerman}
% \changes{germanb-2.0b}{29 may 91}{added some comment chars to
%                                   prevent white space}
% \changes{germanb-2.2}{11 june 91}{Save all redefined macros}
% \begin{macro}{\noextrasgerman}
% \changes{germanb-1.1}{30 juli 90}{Added {\tt\bsl dieresis}}
% \changes{germanb-2.0b}{29 may 91}{added some comment chars
%                        to prevent white space}
% \changes{germanb-2.2}{11 june 91}{Try to restore everything to
%                                    its former state}
%    The macro |\extrasgerman| will perform all the extra definitions
%    needed for the German language. The macro |\noextrasgerman|
%    is used to cancel the actions of |\extrasgerman|.
%
%    Because for German (as well as for Dutch) the {\tt "} character
%    is made active, the \LaTeX\ macros |\dospecials| and
%    |\@sanitize| have to be redefined to include this character
%    as well.
%    \begin{macrocode}
\addto\extrasgerman{\babel@add@special\"}
%    \end{macrocode}
%    Similarly, |\noextrasgerman| should restore them to their
%    original definition.
%    \begin{macrocode}
\addto\noextrasgerman{\babel@remove@special\"}
%    \end{macrocode}
%
%    The {\tt "} character is made active by |\extrasgerman|.
%    The restore operation for the category change is appended to
%    |\originalTeX|. Additionally we redefine |\active@dq|,
%    after we have saved the original meaning.  If written with
%    |\protect| set accordingly, the active doublequote is written
%    as this macro. (All languages with the doublequote active
%    should write it using the same control sequence name.)
%    \begin{macrocode}
\addto\extrasgerman{\babel@savevariable{\catcode`\"}\babel@save\active@dq
  \catcode`\"\active \let\active@dq\german@active@dq}
%    \end{macrocode}
%    The simple definition |\def"{\protect\active@dq}| is not usable,
%    because the |\protect| occurs at the toplevel.  If \TeX\
%    tries to scan a number in hexadecimal notation (i.\,e., using a
%    doublequote), the |\protect| with meaning |\relax|
%    prevents the correct scanning of the number.
%    \begin{macrocode}
\begingroup \catcode`\"=\active
\def\x{\endgroup
  \addto\extrasgerman{\babel@save"\let"\german@@active@dq}}
\x
%    \end{macrocode}
%
%    In order for \TeX\ to be able to hyphenate German words which
%    contain `\ss' we have to give the character a nonzero
%    |\lccode| (see Appendix H, the \TeX book).
%    \begin{macrocode}
\addto\extrasgerman{\babel@savevariable{\lccode`\^^Y}%
  \lccode`\^^Y`\^^Y}
%    \end{macrocode}
%    In an older version of {\tt german.sty} |\3| was used as a
%    shorthand for |\ss|, it is still here for
%    compatibility.\footnote{The shorthand {\tt\bsl 3} will be gone
%    in future versions of {\tt german.sty}.}
%    \begin{macrocode}
\addto\extrasgerman{\babel@save\3\let\3\ss}
%    \end{macrocode}
%    The umlaut accent macro |\"| is changed to lower the umlaut dots.
%    The redefinition is done with the help of |\umlautlow|.
%    \begin{macrocode}
\addto\extrasgerman{\babel@save\"\umlautlow}
%    \end{macrocode}
%    The german hyphenation patterns can be used with |\lefthyphenmin|
%    and |\righthyphenmin| set to~2.
%    \begin{macrocode}
\addto\extrasgerman{\babel@savevariable\lefthyphenmin
  \babel@savevariable\righthyphenmin
  \lefthyphenmin\tw@\righthyphenmin\tw@}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\extrasaustrian}
% \begin{macro}{\noextrasaustrian}
%    For both versions of the language the same special macros are
%    used, so we can |\let| the austrian macros be equal to their
%    german counterparts.
%    \begin{macrocode}
\let\extrasaustrian\extrasgerman
\let\noextrasaustrian\noextrasgerman
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
%  \begin{macro}{\umlauthigh}
%    The macro |\umlauthigh| restores the definition of |\"|.
% \changes{germanb-1.1}{30 juli 90}{{\tt\bsl dieresis} instead of
%                                    {\tt\bsl accent127}}
%    \begin{macrocode}
\def\umlauthigh{\let\"\dieresis}
%    \end{macrocode}
%  \end{macro}
%  \begin{macro}{\umlautlow}
%    The macro |\umlautlow| redefines the umlaut-accent such that
%    the dots come nearer to the letter and that the hyphenation is
%    enabled in the rest of the word.
%    \begin{macrocode}
\def\umlautlow{\def\"{\protect\newumlaut}}
%    \end{macrocode}
%  \end{macro}
%  \begin{macro}{\highumlaut}
%    The macro |\highumlaut| redefines the umlaut-accent such that
%    the hyphenation is enabled in the rest of the word. The vertical
%    placement of the dots is the same as with the original |\"|.
% \changes{germanb-1.1}{30 juli 90}{{\tt\bsl dieresis} instead of
%                                    {\tt\bsl accent127}}
% \changes{germanb-2.0b}{29 may 91}{added some comment chars
%                                  to prevent white space}
%    \begin{macrocode}
\def\highumlaut#1{\leavevmode\allowhyphens
  \dieresis{#1}\allowhyphens}
%    \end{macrocode}
%  \end{macro}
%
% \changes{germanb-2.3e}{10 nov 91}{Replaced {\tt\bsl newumlaut}
%                                   routine}
%
%  \begin{macro}{\newumlaut}
%    The macro |\newumlaut|, used in the definition of |\umlautlow|,
%    lowers the umlaut character nearer to the letter. To do this it
%    needs an extra dimen register.
%    \begin{macrocode}
\expandafter\ifx\csname U@D\endcsname\relax
  \csname newdimen\endcsname\U@D
\fi
%    \end{macrocode}
%    The following code fools \TeX's {\tt make\_accent} procedure
%    about the current x-height of the font to force another placement
%    of the umlaut character.
%    \begin{macrocode}
\def\newumlaut#1{\leavevmode\allowhyphens
%    \end{macrocode}
%    First we have to save the current x-height of the font, because
%    we'll change this font dimension and this is always done
%    globally.
%    \begin{macrocode}
  {\U@D 1ex%
%    \end{macrocode}
%    Then we compute the new x-height in such a way that the umlaut
%    character is lowered to the base character.
%    The value of {\tt .45ex} depends on the \MF\ parameters with
%    which the fonts were built.  (Just try
%    out, which value will look best.)
%    \begin{macrocode}
  {\setbox\z@\hbox{\char127}\dimen@ -.45ex\advance\dimen@\ht\z@
%    \end{macrocode}
%    If the new x-height is too low, it is not changed.
%    \begin{macrocode}
  \ifdim 1ex<\dimen@ \fontdimen5\font\dimen@ \fi}%
%    \end{macrocode}
%    Finally we call the |\accent| primitive, reset the old x-height
%    and insert the base character in the argument.
%    \begin{macrocode}
  \accent127\fontdimen5\font\U@D #1}\allowhyphens}
%    \end{macrocode}
%  \end{macro}
%
%    The code above is necessary because we need an extra
%    active character. This character is then used as indicated in
%    table~\ref{tab:german-quote}.
%
%    To be able to define the function of |"|, we first define a
%    couple of `support' macros.
%
% \changes{germanb-2.3e}{10 nov 91}{Added {\tt\bsl save@sf@q} macro
%                           and rewrote all quote macros to use it}
% \changes{germanb-2.3h}{16 feb 91}{moved definition of {\tt\bsl
%                           allowhyphens},  {\tt\bsl set@low@box} and
%                           {\tt\bsl save@sf@q} to {\tt babel.com}}
%
%  \begin{macro}{\glqq}
%    The above macro can now be used to define low opening quotes.
%    Since it may be used in arguments to other macros we protect it.
%    \begin{macrocode}
\def\glqq{\protect\@glqq}
\def\@glqq{\save@sf@q{\set@low@box{''}\box\z@\kern-.04em\allowhyphens}}
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\grqq}
%    The German double closing quotes:
%    \begin{macrocode}
\def\grqq{\protect\@grqq}
\def\@grqq{\save@sf@q{\kern-.07em``\kern.07em}}
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\glq}
%  \begin{macro}{\grq}
%    Now follow the single quote versions of the above.
%    \begin{macrocode}
\def\glq{\protect\@glq}
\def\@glq{\save@sf@q{\set@low@box{'}\box\z@\kern-.04em\allowhyphens}}
%    \end{macrocode}
%    \begin{macrocode}
\def\grq{\protect\@grq}
\def\@grq{\save@sf@q{\kern-.07em`\kern.07em}}
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%
%  \begin{macro}{\flqq}
%  \begin{macro}{\frqq}
%    Another form of quotes used in Germany are the ``guillemets'' or
%    french quotes. The double guillemets are implemented using the
%    mathematics symbol~`$\ll$'. The disadvantage is that it doesn't
%    work properly with all font sizes and styles. A better solution
%    is still needed.
%    \begin{macrocode}
\def\flqq{\protect\@flqq}
\def\@flqq{\relax \ifmmode \ll \else
  \save@sf@q{\raise .2ex\hbox{$\scriptscriptstyle \ll $}}\fi}
%    \end{macrocode}
%    \begin{macrocode}
\def\frqq{\protect\@frqq}
\def\@frqq{\relax \ifmmode \gg \else
  \save@sf@q{\raise .2ex\hbox{$\scriptscriptstyle \gg $}}\fi}
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%  \begin{macro}{\flq}
%  \begin{macro}{\frq}
%    Also single ``guillemets'' are provided.  (These quotes are used
%    in Germany for nested quotations.)
%    \begin{macrocode}
\def\flq{\protect\@flq}
\def\@flq{\relax \ifmmode <\else
  \save@sf@q{\raise .2ex\hbox{$\scriptscriptstyle <$}}\fi}
%    \end{macrocode}
%    \begin{macrocode}
\def\frq{\protect\@frq}
\def\@frq{\relax \ifmmode >\else
  \save@sf@q{\raise .2ex\hbox{$\scriptscriptstyle >$}}\fi}
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%
%  \begin{macro}{\dq}
%    We save the original double quote character in |\dq| to keep
%    it available, the math accent |\"| can now be typed as |"|.
%    Also we store the original meaning of the command |\"| for
%    future use.
%    \begin{macrocode}
\begingroup \catcode`\"12
\def\x{\endgroup
  \def\@UMLAUT{\"}
  \def\@MATHUMLAUT{\mathaccent"707F }
  \def\@SS{\mathchar"7019 }
  \def\dq{"}}
\x
%    \end{macrocode}
%
%    If an active {\tt "} character gets ``lost'' in a non-german
%    language it should expand to a {\tt "} with category code `other'
%    by default. The same applies for the control sequence
%    |\active@dq|.
% \changes{germanb-2.2}{11 jun 90}{Added default expansion of active
%                                  doublequote}
% \changes{germanb-2.3e}{24 nov 90}{Define default expansion of active
%                                  doublequote only if it is undefined}
%    \begin{macrocode}
\begingroup \catcode`\"=\active
\def\x{\endgroup
  \ifx"\undefined \let"\dq \fi
  \let\active@dq\dq}
\x
%    \end{macrocode}
%  \end{macro}
%
%
%  \begin{macro}{\dieresis}
% \changes{germanb-1.1}{30 juli 90}{Macro added}
%    The original definition of |\"| is stored as
%    |\dieresis|, because the definition of |\"| might not
%    be the default plain \TeX\ one. If the user uses PostScript fonts
%    with the Adobe fontencoding the {\tt "} character is not in the
%    same position as in Knuth's fontencoding. In this case |\"|
%    will not be defined as |\accent"7F #1|, but as
%    |\accent'310 #1|. For this reason we save the definition of
%    |\"| and use that in the definition of other macros.
%    \begin{macrocode}
\let\dieresis=\"
%    \end{macrocode}
%  \end{macro}
%
% \changes{germanb-2.3e}{10 nov 91}{German active doublequote
%                       mechanism rewritten}
%
%  \begin{macro}{\german@dq@macro}
%    For all arguments of an active doublequote which should be treated
%    in a special way, we define a macro with a name that contains the
%    argument text.
%
%    \begin{macrocode}
\def\german@dqmacro#1{\csname g@dq@\string #1@dq@\endcsname}
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\german@@active@dq}
%    An active doublequote is |\let| to this macro definition.
%    First we look if the argument triggers a special macro, then we
%    expand either to a normal doublequote or indirectly to this macro.
%    \begin{macrocode}
\def\german@@active@dq#1{\expandafter\expandafter\expandafter
  \ifx\german@dqmacro{#1}\relax \expandafter\normal@dq
  \else \expandafter\german@@@active@dq \fi {#1}}
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\normal@dq}
%    The braces around the argument in |\german@@active@dq| are
%    necessary for empty arguments.  For |\normal@dq| we have to
%    delete the braces and insert a normal doublequote.
%    \begin{macrocode}
\def\normal@dq#1{\dq #1}
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\german@@@active@dq}
%    We have to call |\active@dq|, but this call has to be protected
%    to inhibit further expansion when it is written to files.
%    (|\active@dq| is |let| to |\german@active@dq|.)
%    To allow correct ligatures and kerning, the |\protect| should
%    expand to nothing, if it is used with meaning |\relax|.
%    The additional |\empty| in the argument of the |\active@dq|
%    call is necessary for the correct expansion of |""|.
%    \begin{macrocode}
\def\german@@@active@dq#1{%
  \ifx\protect\relax \else \expandafter\protect \fi
  \active@dq{#1\empty}}
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\german@active@dq}
%    In german mode |\active@dq| is |\let| to this macro.
%    To get the final expansion of the special action macros, we have
%    to expand the |\german@dqmacro| three times.  This expansion
%    consists of two groups containing the action for text and for
%    math mode. The correct group is selected with the help of two
%    additional macros.
%    \begin{macrocode}
\def\german@active@dq#1{%
  \csname german@dq@\ifmmode second\else first\fi
    \expandafter\expandafter\expandafter\expandafter
    \expandafter\expandafter\expandafter
  \endcsname
  \german@dqmacro{#1}}
\def\german@dq@first#1#2{#1}
\def\german@dq@second#1#2{#2}
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\def@german@dqmacro}
% \changes{germanb-2.3h}{16 feb 91}{Renamed macro from {\tt\bsl
%                 def@dqmacro} because of clash with the same macro
%                 for other languages}
%  \begin{macro}{\let@german@dqmacro}
% \changes{germanb-2.3h}{16 feb 91}{Renamed macro from {\tt\bsl
%                 let@dqmacro} because of clash with the same macro
%                 for other languages}
%    To define a doublequote macro we use two macros.
%    \begin{macrocode}
\def\def@german@dqmacro#1#2#3{\expandafter\expandafter\expandafter
  \def\german@dqmacro{#1}{{#2}{#3}}}
%    \end{macrocode}
%
%    \begin{macrocode}
\def\let@german@dqmacro#1#2{\begingroup
  \edef\x{\endgroup \let
    \expandafter\expandafter\expandafter\noexpand\german@dqmacro{#1}%
    \expandafter\expandafter\expandafter\noexpand\german@dqmacro{#2}}%
  \x}
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%
%  \begin{macro}{\german@dq@disc}
%    For the discretionary macros we use this macro:
%    \begin{macrocode}
\def\german@dq@disc#1#2{%
  \allowhyphens\discretionary{#2-}{}{#1}\allowhyphens}
%    \end{macrocode}
%  \end{macro}
%
%    Now we can define the doublequote macros: the umlauts,
%    \begin{macrocode}
\def@german@dqmacro{a}{\@UMLAUT a}{\@MATHUMLAUT a}
\def@german@dqmacro{o}{\@UMLAUT o}{\@MATHUMLAUT o}
\def@german@dqmacro{u}{\@UMLAUT u}{\@MATHUMLAUT u}
\def@german@dqmacro{A}{\@UMLAUT A}{\@MATHUMLAUT A}
\def@german@dqmacro{O}{\@UMLAUT O}{\@MATHUMLAUT O}
\def@german@dqmacro{U}{\@UMLAUT U}{\@MATHUMLAUT U}
%    \end{macrocode}
%    tremas,
%    \begin{macrocode}
\def@german@dqmacro{e}{\highumlaut e}{\@MATHUMLAUT a}
\def@german@dqmacro{E}{\highumlaut E}{\@MATHUMLAUT E}
\def@german@dqmacro{i}{\highumlaut\i{}}{\@MATHUMLAUT\imath}
\def@german@dqmacro{I}{\highumlaut I}{\@MATHUMLAUT I}
%    \end{macrocode}
%    german es-zet (sharp s),
%    \begin{macrocode}
\def@german@dqmacro{s}{\ss{}}{\@SS{}}
\def@german@dqmacro{S}{SS}{SS}
%    \end{macrocode}
%    german and french quotes,
%    \begin{macrocode}
\def@german@dqmacro{`}{\glqq{}}{\glqq{}}
\def@german@dqmacro{'}{\grqq{}}{\grqq{}}
\def@german@dqmacro{<}{\flqq{}}{\flqq{}}
\def@german@dqmacro{>}{\frqq{}}{\frqq{}}
%    \end{macrocode}
%    discretionary commands
%    \begin{macrocode}
\def@german@dqmacro{c}{\german@dq@disc ck}{c}
\def@german@dqmacro{C}{\german@dq@disc CK}{C}
\def@german@dqmacro{f}{\german@dq@disc f{ff}}{f}
\def@german@dqmacro{F}{\german@dq@disc F{FF}}{F}
\def@german@dqmacro{l}{\german@dq@disc l{ll}}{l}
\def@german@dqmacro{L}{\german@dq@disc L{LL}}{L}
\def@german@dqmacro{m}{\german@dq@disc m{mm}}{m}
\def@german@dqmacro{M}{\german@dq@disc M{MM}}{M}
\def@german@dqmacro{n}{\german@dq@disc n{nn}}{n}
\def@german@dqmacro{N}{\german@dq@disc N{NN}}{N}
\def@german@dqmacro{p}{\german@dq@disc p{pp}}{p}
\def@german@dqmacro{P}{\german@dq@disc P{PP}}{P}
\def@german@dqmacro{t}{\german@dq@disc t{tt}}{t}
\def@german@dqmacro{T}{\german@dq@disc T{TT}}{T}
%    \end{macrocode}
%    and some additional commands:
%    \begin{macrocode}
\def@german@dqmacro{-}{\allowhyphens\-\allowhyphens}%
               {\allowhyphens\-\allowhyphens}
\def@german@dqmacro{|}{\discretionary{-}{}{\kern.03em}}{}
\def@german@dqmacro{"}{\hskip\z@skip}{\hskip\z@skip}
%    \end{macrocode}
%    We take special care for |""|, if it is expanded only (i.\,e.,
%    written to a file or used in |\edef|) and |\protect| is
%    used to protect the expansion of the first active doublequote.
%    For this case the second doublequote is expanded with |\empty|
%    as its argument.  To read the complete ``expansion'', we have to
%    define a macro for the argument |\active@dq{}|.
%    \begin{macrocode}
\def@german@dqmacro{\empty}{{}}{{}}
\let@german@dqmacro{\active@dq{}}{"}
%    \end{macrocode}
%
%
%  \begin{macro}{\mdqon}
%  \begin{macro}{\mdqoff}
%  \begin{macro}{\ck}
%    All that's left to do now is to  define a couple of commands
%    for reasons of compatibility with {\tt german.sty}.
%    \begin{macrocode}
\def\mdqon{\catcode`\"\active}
\def\mdqoff{\catcode`\"12 }
\def\ck{\allowhyphens\discretionary{k-}{k}{ck}\allowhyphens}
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%
% Our last action is to activate the commands we have just defined,
% by calling the macro |\selectlanguage|.
%    \begin{macrocode}
\selectlanguage{german}
%    \end{macrocode}
%    Finally, the category code of {\tt @} is reset to its original
%    value.
% \changes{germanb-2.2a}{15 july 91}{Modified handling of catcode of
%                                    @-sign.}
%    \begin{macrocode}
\catcode`\@=\atcatcode
%    \end{macrocode}
%
% \Finale
%%
%% \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         \~}
%%
\endinput
