% \iffalse meta-comment
%
% File `babel-german.dtx'
% 
% Copyright 1989--2026
%     Johannes L. Braams
%     Bernd Raichle
%     Walter Schmidt
%     Juergen Spitzmueller
% All rights reserved.
% 
% This file is part of the babel-german bundle,
% an extension to the Babel system.
% ----------------------------------------------
% 
% It may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3
% of this license or (at your option) any later version.
% The latest version of this license is in
%   http://www.latex-project.org/lppl.txt
% and version 1.3 or later is part of all distributions of LaTeX
% version 2003/12/01 or later.
% 
% This work has the LPPL maintenance status "maintained".
% 
% The Current Maintainer of this work is Juergen Spitzmueller.
% \fi
% \CheckSum{1714}
%
% \iffalse
%    Tell the \LaTeX\ system who we are and write an entry on the
%    transcript.
%<*dtx>
\ProvidesFile{babel-german.dtx}
%</dtx>
%<austrian>\ProvidesLanguage{austrian}
%<german>\ProvidesLanguage{german}
%<germanat>\ProvidesLanguage{german-at}
%<germanat1901>\ProvidesLanguage{german-at-1901}
%<germanaustria>\ProvidesLanguage{german-austria}
%<germanaustria1901>\ProvidesLanguage{german-austria-1901}
%<germanch>\ProvidesLanguage{german-ch}
%<germanch1901>\ProvidesLanguage{german-ch-1901}
%<germanswitzerland>\ProvidesLanguage{german-switzerland}
%<germanswitzerland1901>\ProvidesLanguage{german-switzerland-1901}
%<germande>\ProvidesLanguage{german-de}
%<germande1901>\ProvidesLanguage{german-de-1901}
%<germangermany>\ProvidesLanguage{german-germany}
%<germangermany1901>\ProvidesLanguage{german-germany-1901}
%<swissgerman>\ProvidesLanguage{swissgerman}
%<germanb>\ProvidesLanguage{germanb}
%<naustrian>\ProvidesLanguage{naustrian}
%<ngerman>\ProvidesLanguage{ngerman}
%<nswissgerman>\ProvidesLanguage{swissgerman}
%<ngermanb>\ProvidesLanguage{ngermanb}
%\fi
%\ProvidesFile{babel-german.dtx}
%        [2026/04/18 v3.3 German language support for babel]
%\iffalse
%
%<*filedriver>
\documentclass{ltxdoc}
\usepackage[T1]{fontenc}
\usepackage[osf]{libertine}
\usepackage[scaled=0.76]{beramono}
\usepackage{url}
\usepackage{array}
\usepackage{booktabs}
\usepackage[tableposition=top,skip=5pt]{caption}
\usepackage[svgnames]{xcolor}
\usepackage[pdfusetitle]{hyperref}
\hypersetup{%
  colorlinks,
  linkcolor=Maroon,
  filecolor=Maroon,
  urlcolor=Maroon,
  citecolor=black
}
\usepackage{prettyref}
\newrefformat{sec}{\hyperref[{#1}]{Section~\ref*{#1}}}
\newrefformat{fn}{\hyperref[{#1}]{Footnote~\ref*{#1}}}
\newrefformat{tab}{\hyperref[{#1}]{Table~\ref*{#1}}}
\newcommand*\babel{\textsf{babel}}
\newcommand*\Babel{\textsf{Babel}}
\newcommand*\babelde{\textsf{babel-german}}
\newcommand*\langvar{$\langle \it lang \rangle$}
\newcommand*\graph[1]{$\langle$#1$\rangle$}
\newcommand*\note[1]{}
\newcommand*\Lopt[1]{\texttt{\textcolor{Navy}{#1}}}
\newcommand*\BGopt[1]{\texttt{\textcolor{Chocolate}{#1}}}
\newcommand*\file[1]{\texttt{#1}}

\newlength\leftmarginnotevshift
\newlength\leftmarginnotesep
\setlength\leftmarginnotesep{2em}
\makeatletter
\newcommand*\leftmarginnote[1]{%
  \leavevmode
  \@bsphack
  \strut
  \setlength\leftmarginnotevshift{\dp\strutbox}%
  \vadjust{%
    \kern-\leftmarginnotevshift
    \llap{\smash{%
      \parbox[t]{\marginparwidth}{\raggedleft\footnotesize#1}%
      \kern\leftmarginnotesep
    }}%
    \kern\leftmarginnotevshift
  }%
  \@esphack
}
\makeatother
\newcommand*\newfeature[1]{%
  \leftmarginnote{New feature\\in v.\,#1!}}
\newcommand*\breakingchange[1]{%
  \leftmarginnote{\textcolor{DarkRed}{\bfseries Breaking change\\in v.\,#1!}}}

\GlossaryMin = .33\textheight

\begin{document}
 \DocInput{babel-german.dtx}
\end{document}
%</filedriver>
%\fi
% \GetFileInfo{babel-german.dtx}
%
%\RecordChanges
%
% \changes{Version 2.9a=Version 2.10}{2016/11/07}{Improvements to the manual}
%
% \changes{Version 2.7}{2013/12/13}{Revised documentation: Turn the \babel{}
%          manual chapter into a self-enclosed manual.}
% \changes{Version 2.7}{2013/12/13}{Added support for variety \Lopt{swissgerman}.}
% \changes{Version 2.7}{2013/12/13}{Revised \Lopt{austrian} support.}
%
% \changes{Version 2.6d}{1996/07/10}{Replaced \cs{undefined} with
%    \cs{@undefined} and \cs{empty} with \cs{@empty} for consistency
%    with \LaTeX} 
% \changes{Version 2.6d}{1996/10/10}{Moved the definition of
%    \cs{atcatcode} right to the beginning.}
%
% \changes{Version 2.6a}{1995/02/15}{Moved the identification to the
%    top of the file}
% \changes{Version 2.6a}{1995/02/15}{Rewrote the code that handles the
%    active double quote character}
%
% \changes{Version 2.5c}{1994/06/26}{Removed the use of \cs{filedate}
%    and moved the identification after the loading of
%    \file{babel.def}}
%
% \changes{Version 2.5}{1994/02/08}{Update or \LaTeXe}
%
% \changes{Version 2.3e}{1991/11/10}{Brought up-to-date with
%    \file{german.tex} v2.3e (plus some bug fixes) [br]}
%
% \changes{Version 2.2a}{1991/07/15}{Renamed \file{babel.sty} in
%    \file{babel.com}}
%
% \changes{Version 2.3}{1991/11/05}{Rewritten parts of the code to use
%    the new features of babel version 3.1}
%
% \changes{Version 2.2}{1991/06/11}{Removed global assignments,
%    brought uptodate with \file{german.tex} v2.3d}
%
% \changes{Version 2.1}{1991/05/29}{Removed bug found by van der Meer}
%
% \changes{Version 2.0a}{1991/05/25}{Removed some problems in change
%    log}
%
% \changes{Version 2.0}{1991/04/23}{Modified for babel 3.0}
%
% \changes{Version 1.1a}{1990/08/27}{Modified the documentation
%    somewhat}
%
% \changes{Version 1.1}{1990/07/30}{When using PostScript fonts with
%    the Adobe fontencoding, the dieresis-accent is located elsewhere,
%    modified germanb}
%
% \changes{Version 1.0c}{1990/07/16}{Fixed some typos}
%
% \changes{Version 1.0b}{1990/05/22}{fixed typo in definition for
%    austrian language found by Werenfried Spit
%    \texttt{nspit@fys.ruu.nl}}
%
% \changes{Version 1.0a}{1990/05/14}{Incorporated Nico's comments}
%
% \changes{Version 2.9g=Version 2.99}{2025/11/30}{Merge manuals for pre- and post-1996 variants}
%
% \changes{Version 2.9g=Version 2.99}{2025/11/30}{Document new language naming and glottonyms option}
%
%  \title{Babel Support for German}
%  \author{Johannes Braams \and Bernd Raichle \and Walter Schmidt \and Jürgen Spitzmüller\thanks{%
%         Current maintainer. Please report issues via \protect\url{https://codeberg.org/jspitz/babel-german/issues}.}}
%  \date{\fileversion\ (\filedate)}
%  \maketitle
%
%    \begin{abstract}
%      \noindent This manual documents \babel\ language support for German as provided by the
%      \babelde\ package.
%      The package supports all major (standard) varieties of German (i.\,e., Austrian, Swiss,
%      and German Standard German) in contemporary as well as in pre-1996 (i.\,e., 1901) spelling.
%    \end{abstract}
%
%    \tableofcontents
%
%    \section{Aims and Scope}
%
%    The \babelde\ package documented in this manual provides the \babel\ package with all
%    language-specific strings, settings and commands needed for writing German texts
%    (or German passages in texts).
%    Furthermore, the package assures that the appropriate hyphenation patterns are used
%    for these texts or text passages (see \prettyref{sec:patterns} for details).
%
%    Since German is a pluricentric language with differing standard varieties (in Austria,
%    Switzerland, and Germany), \babelde\ supports three varieties of Standard German.\footnote{%
%              Austria, Switzerland, and Germany are so-called \emph{full centers} of Standard German, as they developed
%              each their specific codex. German is also an official language in Liechtenstein and Luxembourg,
%              in parts of Italy (South Tyrol/Alto Adige), and a legally acknowledged minority language
%              in other regions in the world.
%              However, these \emph{half} and \emph{quarter centers} do not have their own codizes;
%              South Tyrol/Alto Adige employs Austrian standard, Liechtenstein Swiss standard, Luxembourg and Belgium
%              orient towards German standard (cf.\ \cite{vwb} for linguistic details).}
%    Furthermore, since the spelling and hyphenation rules of German (in all these standard varieties)
%    have been reformed in 1996 (and in subsequent years), the package provides support for two spelling
%    and hyphenation variants of each standard variety, viz.\ the deprecated 1901 spelling and the current
%    (`reformed') 1996 spelling.
%    
%    The following section provides some information on the history of the package, and in particular
%    on a major interface change in version 2.99 and 3.0. If you have been a user of \babelde\ before
%    that versions, you are advised to read this.
%    If you are new or started using \babelde\ later than that, and just interested how to use the package,
%    you can jump directly to \prettyref{sec:usage}.
%
%
%    \section{Caveats on Language Naming}\label{sec:langnaming}
%
%    \subsection{Language Names in \babelde: A Tangled Affair}\label{sec:tangled}
%
%    The origins of this package reach well beyond the 1996 spelling reform.\footnote{%
%              Support for pre-1996 German started as a re-implementation of the package
%              \file{german.sty} (v.\,2.5b), originally developed by Hubert Partl (cf.\ \cite{HP})
%              as of 1987 and later maintained by Bernd Raichle (cf.\ \cite{gerdoc}).
%              Support for current varieties of German (post-1996 orthography)
%              emerged as a re-implementation of Walter Schmidt's (1998, cf.\ \cite{schmidt}) 
%              companion package to \file{german.sty}, \file{ngerman.sty}.
%              The initial re-implementations for \babel\ were done by Johannes Braams, the original
%              author and then maintainer of \babel, in 1990 (for pre-1996 conventions)
%              and 1999 (for post-1996 conventions). In 2013, Jürgen Spitzmüller took over maintainership
%              for the then orphaned language support files that have been outsourced from \babel\ itself
%              to the independent package, \babelde.}
%    This has led to a rather unfortunate situation.
%    When the spelling reform happened, the options \Lopt{german} and \Lopt{austrian}\footnote{%
%	    \emph{Austrian} is a rather clumsy and irritating shorthand for \emph{Austrian [Standard] German},
%           which does not only imply that there is a completely separate `Austrian' language, but also that
%           in Austria, (Austrian Standard) German is the only official language (whereas, according to the
%           Austrian constitution, there are seven more, the so-called `acknowledged minority languages'
%           [Burgenland] Croatian, Czech, Hungarian, Slovak, Slowenian, Romanes, and Austrian Sign Language).}
%    have already existed in \babel\ for a couple of years, but of course they implied the rules of pre-1996
%    spelling\slash hyphenation. Since these rules (both spelling and hyphenation) changed quite significantly
%    with the reform, post-1996 German orthography could not be supported with the existing language support files.
%    Adapting those to the reformed orthography was not an option, as this would have dropped support for the previous norms
%    (and hence existing or future documents that employ pre-1996 orthography).
%    It would also not have been socially acceptable since the spelling reform hit quite heavy resistance in the general
%    public (cf.\ \cite{johnson}), and many (\LaTeX\ users certainly included) assumed, and hoped, the new rules would be
%    withdrawn again rather sooner than later anyway.
%
%    Against the backdrop of this, post-1996 support had not been integrated into the existing language support files
%    for German and Austrian German, but provided separately in additional ones (technically in completely separated,
%    though collectively distributed packages) -- incidentally almost three years after the reformed orthography has
%    come into effect (albeit with a transition period of eight years).
%    These additional support files were named \file{naustrian.ldf} and \file{ngerman.ldf} in order to distinguish them from
%    the received ones (with the \emph{n} obviously expanding to `new', referring to the then common label,
%    \emph{neue Rechtschreibung} `new orthography'), and language options with the same name -- \Lopt{naustrian}
%    and \Lopt{ngerman} -- have been introduced to \babel\ to use them.
%    When support for the Swiss standard variety was added in 2013, the `new orthography' was not so new anymore
%    and widely accepted. Nonetheless, the naming convention was not touched and adopted for the new varieties,
%    \Lopt{swissgerman} (pre-1996) and \Lopt{nswissgerman} (post-1996). 
%
%    Fast forward even more, thirty years after the reformed rules have been implemented,
%    the 1996 orthography and the heated debate it caused have long settled,
%    the (no longer really) `new' orthography is the common one in all German-writing countries.
%    Pre-1996 orthography is only employed by a minority of writers as the main norm, but of course it
%    is still needed for texts that have been written before the reform, or -- more commonly -- as
%    a secondary variety if you quote from such older texts.
%
%    So, to be sure, in our days, most people expect to get current (that is, post-1996) standards
%    when selecting \Lopt{german} in \babel. Some arguably are not even aware that there have been
%    older orthographic standards.
%    Yet with \babel, one still needed to select \Lopt{ngerman}, \Lopt{naustrian}, or \Lopt{nswissgerman}
%    to get contemporary orthographic conventions and hyphenation rules in the year 2025!
%    The terms you would intuitively use, on the other hand, loaded patterns and captions that are not
%    what many users would expect, namely those adhering to pre-1996 norms. 
%    
%    Why hasn't this been changed once the 1996 orthography has settled? The main reason is \emph{backwards compatibility}.
%    A simple semantic switch (with \Lopt{german} then suddenly meaning post-1996 orthography) would break with a central
%    promise of \LaTeX: \LaTeX\ does not change the output of existing documents behind the back of their authors!
%
%    While this is a very good principle, sometimes breaking it might be warranted, since keeping things
%    as they are causes more harm than it prevents from. And this has arguably become the case with the language
%    names of \babelde: More and more people reported that they are irritated by the fact that \Lopt{german} does not mean what
%    they expect (namely, German according to current standards). It has been assumed that many even erroneuosly loaded pre-1996 patterns
%    without noticing (and getting wrong hyphenations).
%    Given all that, we have been urged to do the compatibility-breaking change, and at some point,
%    we have finally been convinced to do it -- but only since we found some strategies to do it in a way that will
%    affect as less users as possible (although it will still definitely affect some).
%    The next section will elaborate on the changes and strategies.
%
%    \subsection{The New Language Naming Convention}
%
%    With\breakingchange{3.0} v.\,2.99 of this package, a new and more appropriate naming scheme was introduced.
%    As of v.\,3.0, we have also changed the (default) semantics of \Lopt{german}.
%    All of these are major changes which might break backwards compatibility (but only the change of \Lopt{german}
%    does it in a way that affects \emph{existing} documents as opposed to new documents sent to
%    users of older versions of \babelde).
%    The changes address several problems:
%    \begin{enumerate}
%	    \item Ultimately, the confusion of \Lopt{german} activating pre-1996 orthography shall be resolved.
%             From v.\,3.0 on, \Lopt{german} will load contemporary (post-1996) patterns for German Standard German\footnote{%
%                  This follows the received convention to imply \emph{German} Standard German for \Lopt{german}, but see
%                 \prettyref{sec:glottonyms} why this is not so straightforward.},
%             except for documents where we assume it really means pre-1996 orthography, that is, documents also loading
%             \Lopt{ngerman}, \Lopt{naustrian}, or \Lopt{nswissgerman}.
%
%             This also has an effect on the internal language names, which are still defined in the file \file{language.dat}
%             in the received way (meaning |\l@german| continues to denote pre-1996 patterns, |\l@ngerman| post-1996 patterns by default).
%             With the semantic change of \Lopt{german}, |\l@german| also is redefined. Hence, a new name for pre-1996 German was introduced,
%             |\l@tgerman|, which will have a stable meaning independent of the naming convention, |\l@ngerman| continues to denote post-1996 patterns,
%             |\l@german| might denote one or the other, depending on the option discussed next.
%       \item To adjust this for specific documents, we introduced an option where you can select whether \Lopt{german}
%             should still always load pre-1996 patterns (the default before v.\,3.0),
%             always post-1996 patterns notwithstanding parallel usages of \Lopt{ngerman}, \Lopt{naustrian}, or \Lopt{nswissgerman},
%             or guess depending on whether these \Lopt{n}-options are used or not (the new default as of v.\,3.0).
%             See \prettyref{sec:glottonyms} for details.
%       \item While we were at it, we introduced more appropriate terms (language options) for the selection of language varieties and deprecated
%             some of the problematic ones together with the \Lopt{n}-forms (but of course, those received options
%             continue to work, although they might encourage you to switch in a warning once the new scheme has settled).
%       \item These new language options also use the newer and better `experimental' hyphenation patterns by default, whereas
%             the received options continue to use the less accurate legacy patterns by default (see \prettyref{sec:patterns}).
%             The option \Lopt{german} uses the newer patterns whenever it is configured to refer to post-1996 orthography,
%             legacy patterns otherwise.
%    \end{enumerate}
%    Having unpacked all this rather intricate background, we now turn to the actual usage of the package.
%    
%
%    \section{Enabling German Support}\label{sec:usage}
%    
%    In order to use the language support provided by \babelde, you need to load
%    the \babel\ package (via |\usepackage{babel}|) and pass one of the following language options
%    either directly to \babel\ (via |\usepackage[<options>]{babel}|) or to |\documentclass|
%    (the latter has the advantage that also other packages are informed of the option\footnote{%
%         Side note to package authors; \babelde\ inserts the respective legacy options to the class
%         options list if new options are used. So the new options should also work with most
%         packages that only rely on the received ones.}).
%    If you use multiple languages\slash varieties (including different regional or
%    orthographic varieties of German), the one passed last is treated by \babel\
%    as the main language of the document.
%
%    The behavior of some language varieties can be adjusted by language variety options.
%    All of these can be set via the macro \newfeature{2.99}|\germansetup|, which takes a
%    comma-separated list of options as its mandatory argument and is to be used in the
%    document preamble after \babel\ has been loaded (see \prettyref{sec:options}).
%    Some options alternatively might be passed as a \babel\ modifier, which might give
%    a more granular setting, since |\germansetup| applies to all varieties that support a
%    specific option, \babel\ modifiers only to the variety that is being modified.\footnote{\label{fn:mod}%
%           If languages are loaded via \babel\ option, modifiers are appended to the language name with a dot, e.\,g.
%           \Lopt{german-at.capsz}; if languages are loaded via \texttt{\textbackslash documentclass} options,
%           use additionally \babel\ options of the form \Lopt{modifiers.german-at=capsz}.}
%
%    The available language and language variety options are introduced in what follows.
%
%    \subsection{Austrian Standard German}\label{sec:austrian}
%
%    \emph{Austrian Standard German} refers to the norms current in Austria and South Tyrol/Alto Adige.
%    The available choices are:
%    \begin{itemize}
%       \setlength{\itemsep}{0pt}
%       \item \newfeature{2.99}\Lopt{german-at} or \Lopt{german-austria} if you want contemporary (post-1996) patterns
%       \item \Lopt{german-at-1901} or \Lopt{german-austria-1901} if you want pre-reform (pre-1996) patterns
%    \end{itemize}
%    Contemporary\newfeature{2.14} (post-1996) Austrian Standard German provides an additional feature that is enabled
%    via the language variety option (|\germansetup| or \babel\ modifier) \BGopt{capsz} and disabled via |\germansetup|
%    option \BGopt{capsz=false} or \babel\ modifier \BGopt{nocapsz}:
%    \begin{itemize}
%       \setlength{\itemsep}{0pt}
%       \item \BGopt{capsz}: |\MakeUppercase{ß}|, |\MakeUppercase{"s}| and the |"S| shorthand expand to the capital
%	           eszett letter rather than \graph{SS} (see \prettyref{sec:capsz} for details).
%       \item \BGopt{nocapsz} (=~default): |\MakeUppercase{ß}|, |\MakeUppercase{"s}| and the |"S| expand to
%	           \graph{SS}. Within |\germansetup|, use \BGopt{capsz=false} instead.
%    \end{itemize}
%    The received options \Lopt{austrian} and \Lopt{naustrian} still work (the latter also with the \BGopt{capsz} option),
%    but you are discouraged to use them unless you share your document with co-authors who have an older
%    version of \babelde\ installed, or if you use a package that does not (yet) understand
%    the new options. Also note that these options use the legacy hyphenation patterns by default, whereas
%    the recommended options use the newer and better `experimental' patterns (see \prettyref{sec:patterns}).
%
%    \subsection{German Standard German}\label{sec:german}
%
%    \emph{German Standard German} refers to the norms current in Germany, Luxembourg, and
%    Belgium.
%    The available choices are:
%    \begin{itemize}
%       \setlength{\itemsep}{0pt}
%       \item \newfeature{2.99}\Lopt{german-de} or \Lopt{german-germany} if you want contemporary (post-1996) patterns
%       \item \Lopt{german-de-1901} or \Lopt{german-germany-1901} if you want pre-reform (pre-1996) patterns
%    \end{itemize}
%    Like\newfeature{2.14} Austrian Standard German, contemporary (post-1996) German Standard German optionally supports
%    the capital eszett letter. The feature is enabled via the language variety option (|\germansetup| or \babel\ modifier)
%    \BGopt{capsz} and disabled via \babel\ modifier \BGopt{nocapsz} or |\germansetup| option \BGopt{capsz=false}:
%    \begin{itemize}
%       \setlength{\itemsep}{0pt}
%       \item \BGopt{capsz}: |\MakeUppercase{ß}|, |\MakeUppercase{"s}| and the |"S| shorthand expand to the capital
%	           eszett letter rather than \graph{SS} (see \prettyref{sec:capsz} for details).
%       \item \BGopt{nocapsz} (=~default): |\MakeUppercase{ß}|, |\MakeUppercase{"s}| and the |"S| expand to
%	           \graph{SS}. Within |\germansetup|, use \BGopt{capsz=false} instead.
%    \end{itemize}
%    The received options \Lopt{german} and \Lopt{ngerman} still work (the latter also with the \BGopt{capsz} option),
%    but you are discouraged to use them unless you share your document with co-authors who have an older
%    version of \babelde\ installed, or if you use a package that does not (yet) understand the new options.
%    Also note that \Lopt{ngerman}, in contrast to the recommended options, uses the legacy hyphenation patterns
%    by default (for \Lopt{ngerman}, see below).
%
%    So what is the problem with \Lopt{german}? While this option seems the obvious choice to typeset German,
%    it is in many ways ambiguous due to its terminological tradition in \babel\ (as well as in other packages
%    such as \file{german.sty}) and due to the fact that there are multiple parallel standards (see \prettyref{sec:glottonyms}).
%    So it is always advisable to use a more precise option such as \Lopt{german-de}.
%
%    If\breakingchange{3.0} you use \Lopt{german}, be aware that its meaning depends on settings:
%    By default, \Lopt{german} nowadays (as of version 3.0 of \babelde) refers to contemporary (1996) German orthography
%    and, like the options recommended above, loads the newer (`experimental') hyphenation patterns (see \prettyref{sec:patterns}).
%    If the document also uses one of the options \Lopt{ngerman}, \Lopt{naustrian} or \Lopt{nswissgerman}, however,
%    \Lopt{german} is interpreted in the old sense as pre-1996 German and uses legacy hyphenation patterns
%    unless you use \BGopt{glottonyms=contemporary} (see \prettyref{sec:glottonyms}).
%
%    Also note that if you send your documents to peers who use older versions of \babelde\ (before v. 2.99),
%    their system will interpret \Lopt{german} \emph{always} as pre-1996 German. In this case, you are advised to use the legacy options
%    \Lopt{ngerman} (for post-1996 orthography) and \Lopt{german} (for pre-1996 orthography). If you only
%    use pre-1996 orthography in your document, still pass \Lopt{ngerman} as a secondary language (i.\,e., \Lopt{ngerman,german})
%    to get consistent output both with \babelde\ 3.0 and earlier.
%
%    \subsection{Swiss Standard German}\label{sec:swiss}
%
%    \emph{Swiss Standard German} refers to the norms current in Switzerland and Liechtenstein.
%    The available choices are:
%    \begin{itemize}
%       \setlength{\itemsep}{0pt}
%       \item \newfeature{2.99}\Lopt{german-ch} or \Lopt{german-switzerland} if you want contemporary (post-1996) patterns
%       \item \Lopt{german-ch-1901} or \Lopt{german-switzerland-1901} if you want pre-reform (pre-1996) patterns
%    \end{itemize}
%    Swiss\newfeature{2.10} Standard German (both pre-and post-1996) provides an additional feature that is enabled
%    via the language variety option (|\germansetup| or \babel\ modifier) \BGopt{toss}:
%    \begin{itemize}
%       \item \BGopt{toss}: the shorthands |"s| and |"z| will expand to \graph{ss} rather
%             than \graph{ß} (see \prettyref{sec:toss} for details).
%
%    \end{itemize}
%    The received options \Lopt{swissgerman} and \Lopt{nswissgerman} still work (also with the \BGopt{toss} option),
%    but you are discouraged to use them unless you share your document with co-authors who have an older
%    version of \babelde\ installed, or if you use a package that does not (yet) understand
%    the new options. Also note that \Lopt{nswissgerman} uses the legacy hyphenation patterns by default, whereas
%    the recommended options use the newer and better `experimental' patterns (see \prettyref{sec:patterns}).
%
%    \subsection{Options}\label{sec:options}
%
%    The behavior of \babelde\ can be configured by a number of options. They are all set in the preamble via
%    the command |\germansetup{<options>}| which takes a comma-separated list of key-value options.
%    Available options are:
%\begin{itemize}
%  \setlength\itemsep{0pt}
%     \item \BGopt{abbr-space=<space>}\newfeature{3.3} the space used after the abbreviation dot produced by the
%           \babel\ shorthand |".| (see \prettyref{sec:shorthands}). Default: \BGopt{\textbackslash ,}.
%     \item \BGopt{capsz=true\textbar false} determines whether capital \graph{ß} is output as a capital eszett
%           letter or as \graph{SS}. Only available for Austrian and German 1996 German.
%            See \prettyref{sec:capsz}. Default: \BGopt{false}.
%     \item \BGopt{gendermark=<symbol>} the symbol used for marking gender forms as entered via the
%           \babel\ shorthand |"x| (see \prettyref{sec:shorthands}). Default: \BGopt{*}.
%     \item \BGopt{glottonyms=auto\textbar contemporary\textbar legacy}\breakingchange{3.0} sets how the language option \Lopt{german} is
%           interpreted (1901 or 1996 orthography). See \prettyref{sec:glottonyms}. Default: \BGopt{auto}.
%     \item \BGopt{hyphenrules=latest\textbar legacy\textbar <date>} determines which hyphenation patterns are used.
%            See \prettyref{sec:patterns}. Default: \BGopt{legacy} for \Lopt{austrian}, \Lopt{german} with
%            1901 meaning (see \prettyref{sec:glottonyms}), \Lopt{swissgerman}, \Lopt{naustrian},
%            \Lopt{ngerman} and \Lopt{nswissgerman}, \BGopt{latest} for all other language options.
%     \item \BGopt{toss=true\textbar false} determines whether the shorthands |"s| and |"z| will expand to \graph{ss}
%            or than \graph{ß}. Only available for Swiss Standard German. See \prettyref{sec:toss}.
%            Default: \BGopt{false}.
%\end{itemize}
%    Note that these options are internally set only at the end of the preamble, not immediately at
%    |\germansetup| (this is since \babelde\ needs to have information that is only available later to properly
%    handle some options).
%    Therefore, if you need to adjust settings after |\germansetup|,  e.\,g. via |\babelprovide|, you need to do this within
%    |\AtBeginDocument{...}|, otherwise it might be overwritten again when the |\germansetup| options are being employed.
%
%    \section{Configuring the Meaning of \texttt{german}}\label{sec:glottonyms}
%
%    In\newfeature{2.99} \prettyref{sec:langnaming}, we have elaborated on the intricate situation with how pre- and
%    post-1996 spelling variants have been traditionally named in \babelde. Meanwhile, \babelde\ has introduced
%    more appropriate names, but still the situation with the ambiguity of \Lopt{german} is challenging.\footnote{%
%              Arguable, this also applies to \Lopt{austrian} and \Lopt{swissgerman}, but these names are discouraged
%              anyway and will not change semantics.}
%
%    Since German is a pluricentric language (cf.\ \cite{clyne}), a label such as \Lopt{german} is of course inherently ambiguous
%    (does it mean Austrian, German, or Swiss Standard German? The answer arguably depends on where you are located\footnote{%
%        On a more global scale, it arguably also depends on politics and historical hegemonies.
%        Which variety a generic language name assumes as default is neither depending on the `origin' of the
%        language or whether the language name is associated with the name of a country (cf.\ \Lopt{english} which assumes
%        American, not British Standard English, as default), nor the number of speakers
%        (cf.\ \Lopt{spanish} which assumes Standard Spanish in Spain, not in Mexico, as default, or \Lopt{portuges} [sic!] which
%        assumes Standard Portuguese in Portugal, not in Brazil). Yet it is also not by coincidence.
%        The selection of a default (and this also accounts for norm authorities such as the ISO or the IETF) is mainly,
%        and inherently, political, ideological, and power-driven, notwithstanding the involved actors often stating that it is not.}).
%    Hence, it is better to use less ambiguous terms such as \Lopt{german-de} or \Lopt{german-germany}.
%
%    Having said this, we understand that an option \Lopt{german} which produces sensible results is expected
%    in the context of \babel\ and its (often rather awkward) language option terminology.
%    And in this context, the traditional meaning of \Lopt{german} (referring to the pre-1996 German Standard German)
%    obviously causes irritation. Whichever national variety of German \babel\ users might expect when using \Lopt{german}, they
%    most probably would expect \emph{contemporary} standards -- at least if they are not already familiar with the received
%    \babelde\ terminology.
%
%    In order to mitigate this for users who employ the \Lopt{german} option rather than the more precise alternatives,
%    and considering both novice and experienced users of \babelde,
%    an option \BGopt{glottonyms} is provided (\emph{glottonym} means `language name').
%    It has to be set via |\germansetup| and offers the following choices:
%    \begin{itemize}
%	   \item  \BGopt{glottomyms=legacy}: \Lopt{german} always enables pre-1996 
%             spelling, as it has been traditionally the case in \babelde\ (before v.\,3.0).
%             It also uses the legacy hyphenation patterns.
%             Use this if you need to maintain 100\,\% backwards compatibility.
%	   \item  \BGopt{glottomyms=contemporary}: \Lopt{german} always enables post-1996
%             spelling, which breaks with traditional package conventions and might
%             break documents that use those. It also uses the `experimental' hyphenation patterns by default.
%             Use with care!
%	   \item  \BGopt{glottomyms=auto}: \Lopt{german} \emph{as a rule} enables post-1996
%             spelling (and newer hyphenation patterns). However, as soon as \Lopt{ngerman}, \Lopt{naustrian} or
%             \Lopt{nswissgerman} are also used in the same document, we assume that \Lopt{german} is supposed to refer to the
%             pre-1996 variant instead and hence make \Lopt{german} enable pre-1996 German Standard German (and legacy patterns).
%             This should handle gracefully most contemporary uses of \Lopt{german}, although it
%             will break documents using only \Lopt{german} with the traditional meaning
%             (for which you should use \BGopt{glottomyms=legacy}).
%             This is also the default as of \babelde\ v.\,3.0.
%    \end{itemize}
%    Note, however, that the semantics is only changed here for \babelde\ itself.
%    If you use a third-party package which relies on the \BGopt{legacy} semantics, you need to stick
%    with this and report to the maintainer of that package.
%
%    A note on \textbf{backwards compatibility:} If you want to share a document that employs \Lopt{german-de-1901} spelling \emph{exclusively}
%    with a co-author who only has a version of \babelde\ older than 2.99 available, you cannot use \Lopt{german-de-1901}
%    or the \BGopt{glottonyms} option. Instead, load the two options \Lopt{ngerman,german} (in this order) and use \Lopt{german}
%    in the traditional way within the document. This will produce the appropriate result both in newer \babelde\
%    (with the default \BGopt{glottnonyms=auto} setting) and pre-2.99 versions of \babelde.
%
%   \section{Hyphenation Patterns}\label{sec:patterns}
%
%   For German, different hyphenation patterns are available. Which of these a given document employs
%   does not only depend on the varieties it uses, but also on the \TeX\ engine and on the language options you employ.
%   For most varieties and options, there are multiple options to select from. This is elaborated in what follows.
%
%   Hyphenation patterns for pre- and post-1996 German orthography have been available with \TeX\ distributions
%   for a long time (currently, these are shipped in form of the \texttt{dehypht} [=~traditional] and
%   \texttt{dehyphn} [=~new] files).
%   These established patterns, however, have many flaws: they are hard to maintain and improve since the
%   sources are not available and not much is known about their construction, since they do not work well
%   with loans, some compounds, and technical terms and often do not hyphenate where they could, and -- most gravely --
%   since they might produce wrong hyphenations (e.g., \emph{Mor-dopfer} instead of \emph{Mord-opfer}).
%   The patterns for post-1996 orthography are even worse: they have only been \emph{manually} adapted to the new rules
%   and intended to be just some intermediate solution right from the start (cf.\ \cite{schmidt}).
%
%   Therefore, a group of experienced germanophone \LaTeX\ users (including the author of the legacy \texttt{dehyphn} patterns)
%   took on the challenge and developed completely new patterns that do much better, the so-called `experimental'
%   new hyphenation patterns of German, distributed in the \textsf{dehyph-exptl} package \cite{exptl}.
%   As opposed to the established patterns, the new ones undergo constant improvement.
%   The price for this is that hyphenation and thus the typeset document is subject to change with,
%   and only due to, pattern updates.
%   However, the new patterns are around and used since 2008, they have largely stabilized and are really no
%   longer `experimental'.
%
%   Modern engines (i.\,e., \texttt{xetex} and \texttt{luatex}) who require utf8-encoded patterns have already embraced
%   those new patterns long ago, i.\,e., they are activated on these engines by default (cf.\ \cite{hyph-utf8}).
%   The classic \TeX\ engines (\texttt{tex}\slash\texttt{pdftex}) have been more reluctant and continue to use the old
%   patterns by default.
%   The reason for this are the \TeX\ quality standards already mentioned in \prettyref{sec:tangled}:
%   refrain, if ever possible, from changing the output of user's documents in the wake of software updates.
%   However, even there, there was an exception: with pre-1996 Swiss Standard German, the classic engines
%   use the `experimental' patterns by default since when Swiss German was introduced, the `experimental'
%   patterns have already been available.
%
%   In \babelde, we take the introduction of the new language options in v.\,2.99 as an opportunity to default
%   to the latest `experimental' patterns with these options. For \Lopt{german}, with \BGopt{glottonyms=auto} (the default)
%   and the use of an \Lopt{n}-option (i.\,e., if it refers to pre-1996 orthography) as well as with \BGopt{glottonyms=legacy},
%   the established (legacy) patterns will continue to be used. With the newer meaning (\BGopt{glottonyms=contemporary}
%   or \BGopt{glottonyms=auto} without the use of an \Lopt{n}-option), \babelde\ also defaults to the latest
%   `experimental' patterns.  The other legacy options (\Lopt{austrian}, \Lopt{naustrian},
%   \Lopt{ngerman}, and \Lopt{nswissgerman}) will continue to default to the established (legacy) patterns.
%   This way, we assure existing documents will not change their hyphenation behind your back.
%
%   In all these cases (except for pre-1996 Swiss Standard German where no `legacy' patterns exist), however,
%   you can opt-in to a different setting.
%   If you want to use the experimental patterns also with the legacy language options, use
%\begin{verbatim}
%    \germansetup{hyphenrules=latest}
%\end{verbatim}
%   in the document preamble after \babel\ has been loaded.
%   This will activate the experimental hyphenation patterns in their most recent version for all used varieties of German.
%   Reversely,
%\begin{verbatim}
%    \germansetup{hyphenrules=legacy}
%\end{verbatim}
%   will switch to the established patterns for all used varieties of German.
%
%   The \textsf{dehyph-exptl} package also allows to load patterns of a given (fixed) date instead of the latest ones,
%   e.g. \BGopt{2024-02-28}. Therewith, you can prevent future changes in hyphenation due to package updates.
%   The feature is also supported by \babelde: Simply pass the date to \BGopt{hyphenrules} (e.\,g., \BGopt{hyphenrules=2024-02-28}).
%   Of course, you need to assure patterns of this date exist in your tree. Cf.\ \cite{exptl} for details, also for ways
%   to set specific patterns to specific varieties of German only.
%
%    \section{Shorthands and Convenience Macros}\label{sec:shorthands}
%
%    For all varieties of German, the character |"| is made active
%    in order to provide some shorthand macros.
%
%    Some of these shorthands address peculiarities of pre-1996 German spelling with which you do not need to bother
%    if you adhere to contemporary orthography:
%    \begin{enumerate}
%    \item the so-called \emph{Dreikonsonanten-Regel} (`three consonant rule')
%          which required specific handling of specific compounds in hyphenation\footnote{\label{fn:threecons}%
%             The three consonant rule (cf.\ \cite[R\,204]{duden91}) prescribed that one of three identical consonants had to be omitted
%             if a vowel followed the three consonants (i.\,e., you wrote \emph{Schiffahrt}, not \emph{Schifffahrt},
%             \emph{schnellebig}, not \emph{schnelllebig}, \emph{wetturnen}, not \emph{wettturnen}).
%             If the word was hyphenated at this position, however, the third consonant needed to reappear (\emph{Schiff-fahrt},
%             \emph{schnell-lebig}, \emph{wett-turnen}); the shorthands |"f|, |"l|, |"t| etc. account for that.
%             With the 1996 reform, the rule has been taken out of force (cf.\ \cite[R\,136]{duden96}).
%             Now, all consonants are always written (some lexicalized exceptions  are \emph{dennoch} and \emph{Mittag},
%             but these get no additional consonant on hyphenation either: \emph{den-noch}, \emph{Mit-tag}).
%             Note also that \graph{s} (as in \emph{Kongresssaal}, if \graph{ss} is used as an alternative to \graph{\ss} or in Swiss writing)
%             has always  been excluded from this rule (cf.\ \cite[R\,204]{duden91}), which is why no shorthand for that case is needed.}, and
%    \item the hyphenation of the digraph\footnote{\label{fn:digraph}%
%             In graphematics, the term \emph{digraph} denotes two characters that make a functional pair (which means, depending on the
%             theoretical assumptions: they represent a single sound or they are semantically distinctive).}
%          \graph{ck} as \graph{k-k} (e.\,g., \emph{Bäcker}, \emph{Bäk-ker}), which has been dropped with
%          the reform in favor of shifting the whole digraph to the next line (\emph{Bä-cker}).
%    \end{enumerate}
%    Other shorthands are provided for frequently used special characters as well as for better control of hyphenation,
%    line breaks, and ligatures, and are useful for all varieties of German.
%
%    \prettyref{tab:german-quote} provides an overview of the shorthands
%    that are provided by \textsf{babel-german} for all its variants.
%    \prettyref{tab:more-quote} lists some \babel\ macros for quotation marks
%    that might be used as an alternative to the quotation mark shorthands listed above.
%
%    \begin{table}[!tbp]
%     \small
%     \newlength\firstcolumnwidth
%     \settowidth\firstcolumnwidth{\texttt{"ck}}
%     \addtolength\leftmarginnotesep{\dimexpr\firstcolumnwidth+3\tabcolsep}
%     \caption{Shorthands provided by \babelde}\label{tab:german-quote}
%     \begin{tabular}{l>{\raggedright}p{.897\textwidth}}
%      \toprule
%      |"a|	& 	Umlaut \graph{\"a} (shorthand for |\"a|). Similar shorthands are
%                  	available for all other lower- and uppercase
%                  	vowels (umlauts: |"a|, |"o|, |"u|, |"A|, |"O|,
%                  	|"U|; tremata: |"e|, |"i|, |"E|, |"I|).			               \tabularnewline
%      |"s|	& 	German \graph{\ss} (shorthand for |\ss|);
%                       but cf.\ \prettyref{sec:toss} for specifics with Swiss Standard German.  \tabularnewline
%      |"z|	& 	German \graph{\ss} (shorthand for |\ss|). 
% 			The difference to |"s| is the uppercase version;
%                       again, cf.\ \prettyref{sec:toss} for specifics with Swiss Standard German.  \tabularnewline
%      |"ck|	& 	\graph{ck}, hyphenated as \graph{k-k} in pre-1996 variants.
%                       Behaves like ordinary \emph{ck} in post-1996.			        \tabularnewline
%      |"ff|	& 	\graph{ff}, hyphenated as \graph{ff-f} in pre-1996 variants; outputs \graph{fff} in post-1996 variants;
%                  	this is also implemented for \graph{l}, \graph{m}, 
%                 	\graph{n}, \graph{p}, \graph{r} and \graph{t}. 		
%                       Please refer to \prettyref{fn:threecons} for why this does not
%                       include \graph{s}.                                      \tabularnewline
%      |"S|	& 	|\uppercase{"s}|, typeset as \graph{SS} -- \graph{\ss}
%			is traditonally written as \graph{SS} (or, in 1901 spelling, also
%                       optionally \graph{SZ}, see below) in uppercase writing;
%                       cf.\ \prettyref{sec:capsz} if you prefer a capital eszett. \tabularnewline
%      |"Z|	& 	|\uppercase{"z}|, typeset as \graph{SZ}. In 1901
%			spelling, \graph{\ss} could also be written as \graph{SZ}
%			instead of \graph{SS} in uppercase writing. Note that,
%			with reformed orthography, the \graph{SZ} variant has
%			been deprecated in favour of \graph{SS} only.		\tabularnewline
%     \verb="|= & 	Disable ligature at this position (e.\,g., at morpheme
%			boundaries, as in \verb=Auf"|lage=).                 	\tabularnewline
%      |"-|	& 	An additional breakpoint that does still
%             		allow for hyphenation at the breakpoints preset in
%             		the hyphenation patterns (as opposed to |\-|).       	\tabularnewline
%      |"=|	& 	An explicit hyphen with a breakpoint, allowing
%             		for hyphenation at the other points preset in the
%             		hyphenation patterns (as opposed to plain |-|);
%			useful for long compounds such as
%			|IT"=Dienstleisterinnen|.      				\tabularnewline
%      |"~|	& 	An explicit hyphen without a breakpoint. Useful for
%              		cases where the hyphen should stick at the following
%			syllable, e.\,g., |bergauf und "~ab|.			\tabularnewline
%      |""|	& 	A breakpoint that does not output a hyphen if the line 
%             		break is performed (consider parenthetical extensions
%			as in |(pseudo"~)""wissenschaftlich|).           	\tabularnewline
%      |"/|	& 	\newfeature{2.9}A slash that allows for a linebreak. 
%			As opposed to |\slash|, hyphenation at the breakpoints
%             		preset in the hyphenation patterns is still allowed.	\tabularnewline
%      |".|	& 	\newfeature{3.3}A dot with ensuing spacing appropriate for
%                       abbreviations, as in |u".a.| (u.\,a.). By default, this is a non-breakable thinspace,
%                       but it can be globally redefined via |\germansetup{abbr-space=<space>}|.
%                       Note that the shorthand eats all preceding and following spaces, so |u".a.|
%                       and |u". a.| produce identical output.\tabularnewline
%      |"*|	& 	\newfeature{2.14}An asterisk which assures the word can
%                       still be hyphenated at its defined breakpoints.
%                       Useful if you want to employ gender-sensitive writing
%                       (`gender star').					
%                       Similar shorthands are available for the alternative
%                       gender-sensitive spellings, |":| and |"_|.		\tabularnewline
%      |"x|	& 	\newfeature{2.14}Inserts a gender mark which assures
%                       the word can still be hyphenated at its defined breakpoints.
%                       This is predefined to |*| but can be globally redefined
%                       via |\germansetup{gendermark=<symbol>}|.		\tabularnewline
%      |"`|	& 	German left double quotes \graph{,,}.               	\tabularnewline
%      |"'|	& 	German right double quotes \graph{``}.              	\tabularnewline
%      |"<|	& 	French/Swiss left double quotes \graph{<<}.   		\tabularnewline
%      |">|	& 	French/Swiss right double quotes \graph{>>}.  		\tabularnewline
%     \bottomrule
%     \end{tabular}
%    \end{table}
%
%    \begin{table}
%     \small
%     \caption{Alternative commands for quotation marks (provided by \babel)}\label{tab:more-quote}
%     \begin{tabular}{lp{.874\textwidth}}
%      \toprule
%      |\glqq|	&	German left double quotes \graph{,,}.				\tabularnewline
%      |\grqq|	&	German right double quotes \graph{``}.				\tabularnewline
%      |\glq|	&	German left single quotes \graph{,}.				\tabularnewline
%      |\grq|	&	German right single quotes \graph{`}.				\tabularnewline
%      |\flqq|	&	French/Swiss left double quotes \graph{<<}.			\tabularnewline
%      |\frqq|	&	French/Swiss right double quotes \graph{>>}.			\tabularnewline
%      |\flq|	&	French/Swiss left single quotes \graph{\guilsinglleft}.		\tabularnewline
%      |\frq|	&	French/Swiss right single quotes \graph{\guilsinglright}.	\tabularnewline
%      |\dq|	&	The straight quotation mark character \graph{\textquotedbl}.	\tabularnewline
%      \bottomrule
%     \end{tabular}
%    \end{table}
%
%
%   \section{Variety-Specific Options}
%
%    \subsection{Capital Eszett Letter}\label{sec:capsz}
%
%    In\newfeature{2.14} 2008, a capital variant of the letter \graph{\ss} has been included to the Unicode standard
%    (U+1E9E), and in 2017, the capital eszett letter has been acknowledged in German orthography as a valid alternative
%    to \graph{SS} in uppercase writing of \graph{\ss}. The letter differs from its miniscule counterpart in that it is
%    usually wider to match the form of uppercase letters.
%
%    If you want to use this letter, you can do so by using the variety option \BGopt{capsz}, which is supported
%    for the contemporary (post-1996) Austrian (cf.\ \prettyref{sec:austrian}) and German (cf.\ \prettyref{sec:german})
%    varieties. If you pass the option to |germansetup|, i.\,e.,
%\begin{verbatim}
%    \germansetup{capsz}
%\end{verbatim}
%    it will apply to both those varieties. If you want a more
%    granular setting, use a \babel\ modifier instead (see \prettyref{sec:usage}).
%    As the eszett letter is not common in Swiss German writing in general, the option is not supported there.
%    Similarly, the pre-1996 varieties do not support the letter either.
%
%    The option causes both |\MakeUppercase| and the |"S| shorthand (but not |"Z|) to use the capital eszett letter.
%    Note that this requires a font which actually contains the glyph (otherwise, you still get \graph{SS})
%    and \LaTeX\ kernel 2023/06 at least.
%
%    Note\newfeature{2.15} that you can also set the casing via |\babelprovide[casing=eszett]{<lang>}|.
%    This is adhered to. If you want to disable such a global setting, you can do so by means of the
%    |\germansetup| option \BGopt{capsz=false} or \babel\ modifier \BGopt{nocapsz}.
%
%   \subsection{Handling of \texttt{"s} and \texttt{"z} in Swiss German}\label{sec:toss}
%
%   In\newfeature{2.10} Swiss (and Liechtensteinian) German writing, the use of \graph{\ss} is rather uncommon.
%   Swiss writers would normally use \graph{ss} where German or Austrian writers use the \graph{\ss} character
%   (e.\,g., \emph{Fuss} vs.\,\emph{Fu\ss} `foot'). When texts (or names) from other German speaking areas are quoted,
%   however, the spelling and hence the \graph{\ss} is often maintained  (particularly in scholarly writing where
%   the spelling of quoted text is not supposed to be touched).
%
%   We assume that Swiss writers will normally input \graph{ss} directly when they mean \graph{ss}, and we assume furthermore
%   that the \graph{\ss}-related shorthands |"s| and |"z| are useful also for Swiss writers when they actually need \graph{\ss},
%   the more so since the \graph{\ss} is not as directly accessible on Swiss keyboards as it is on German and Austrian ones.
%   On the other hand, there might be occasions where writers want to transfer a text from German or Austrian Standard into Swiss
%   Standard German and adapt the spelling on the fly, i.\,e., transform all \graph{\ss} into \graph{ss}.
%
%   For this special case, we provide an option to make the \graph{\ss}-related shorthands |"s| and |"z| expand to the
%   respective digraphs\footnote{See \prettyref{fn:digraph} for what this means.}
%   \graph{ss} and \graph{sz} rather than to \graph{\ss}. This is not the default behavior with \Lopt{german-ch} and
%   \Lopt{german-ch-1901} since, as mentioned, there are situations when the \graph{\ss} is (and has to be)
%   used in Swiss writing, and normally, no shorthand is needed to input (or output) two simple \graph{s} characters.
%   You can opt-in (and out) digraphical expansion of |"s| and |"z| on a global and local level:
%   \begin{itemize}
%   \item To globally switch on the digraphical expansion, use the |\germansetup| option or the \babel\ modifier \BGopt{toss}
%         (read: `to \graph{ss}') with \Lopt{german-ch}, \Lopt{german-ch-1901} or its aliases (see \prettyref{sec:usage}).
%         The former will apply to all Swiss German varieties, the latter only to the language option that is being modified.
%
%   \item To switch on the digraphical expansion only locally, you can use the boolean switch |\tosstrue|. Likewise,
%         |\tossfalse| switches off (both locally and globally set) digraphical expansion.
%   \end{itemize}
%   All these changes result in the following deviant behavior of two shorthands:\smallskip
%
%     \begin{tabular}{ll}
%      |"s|	& 	expands to digraph \graph{ss}             \tabularnewline
%      |"z|	& 	expands to digraph \graph{sz}             \tabularnewline
%     \end{tabular}\smallskip
%
%    \noindent One further note related to the use of \graph{ss} in pre-1996 Swiss Standard German. As opposed to other consonantial letters,
%    the \graph{s} is excluded from the three consonant rule (\emph{Dreikonsonantenregel}) of traditional (i.\,e., 1901) German
%    spelling (cf.\ \prettyref{fn:threecons}). This is why we don't provide a shorthand for the \graph{sss} case.
%
%
%   \section{Captions, Extras, and Dates}
%
%   The caption strings (such as ``figure'') are defined in the macros |\captions<language>|, where |<language>|
%   resolves to the current language option. With the new names, however, captions macros of traditional names
%   are still defined and inherited. So redefining |\captionsngerman| and |\captionsgerman-de| will have the
%   same effect with the option \Lopt{german-de}. Vice versa, however, redefining |\captionsgerman-de| will
%   \emph{not} have any effect if the alias \Lopt{german-germany} is used.
%   The same applies to |\extras<language>| and |\noextras<language>| which hold extra language settings.
%
%   The recommended way to change or add caption strings is the \babel\ macro
%\begin{verbatim}
%     \setlocalecaption{<language-name>}{<caption-name>}{<string>}
%\end{verbatim}
%   where |<language-name>| is the respective language option, |<caption-name>| the respective
%   caption macro (without preceding backslash and trailing |name|), and |<string>| the string to which
%   it should expand. E.g.,
%\begin{verbatim}
%     \setlocalecaption{german-de}{ref}{Bibliografie}
%\end{verbatim}
%   The predefined caption names are (the macros have an appended |name|):
%\begin{itemize}
%\setlength\itemsep{0pt}
%   \item \texttt{preface}: \emph{Vorwort}
%   \item \texttt{ref}: \emph{Literatur}
%   \item \texttt{abstract}: \emph{Zusammenfassung}
%   \item \texttt{bib}: \emph{Literaturverzeichnis}
%   \item \texttt{chapter}: \emph{Kapitel}
%   \item \texttt{appendix}: \emph{Anhang}
%   \item \texttt{contents}: \emph{Inhaltsverzeichnis}
%   \item \texttt{listfigure}: \emph{Abbildungsverzeichnis}
%   \item \texttt{listtable}: \emph{Tabellenverzeichnis}
%   \item \texttt{index}: \emph{Index}
%   \item \texttt{figure}: \emph{Abbildung}
%   \item \texttt{table}: \emph{Tabelle}
%   \item \texttt{part}: \emph{Teil}
%   \item \texttt{encl}: \emph{Anlage(n)} (de) or \emph{Beilage(n)} (ch and at)
%   \item \texttt{cc}: \emph{Verteiler}
%   \item \texttt{headto}: \emph{An}
%   \item \texttt{page}: \emph{Seite}
%   \item \texttt{see}: \emph{siehe}
%   \item \texttt{also}: \emph{siehe auch}
%   \item \texttt{proof}: \emph{Beweis}
%   \item \texttt{glossary}: \emph{Glossar}
%\end{itemize}
%   If you want to change captions of all German varieties at once, you can use the |<language-name>| |allgerman|
%   with the |\setlocalecaption| macro (|\captionsallgerman| is inherited by all varieties). To redefine all
%   Austrian or Swiss varieties, respectively, use |allatgerman| and |allchgerman|.
%
%   As opposed to this, |\extras<language>|, |\noextras<language>| and |\date<language>| are appended
%   by |\addto|.
%   Note, however, that the extension via |\addto| is not straightforward in the case of
%   language options containing hyphens (such as \Lopt{german-de}) since the hyphen has a different catcode
%   normally (e.g., in document preambles) and hence terminates command parsing.
%   So you either need to resort to the legacy names (such as \Lopt{ngerman}), control command parsing via 
%\begin{verbatim}
%     \expandafter\addto\csname <macro>\endcsname{<code>}
%\end{verbatim}
%   or use the \babelde\ helper macro |\addtocs{<macro>}{<code>}|, which does the latter under the hood,
%   taking as first argument the macro name without backslash. E.g.,
%\begin{verbatim}
%     \addtocs{extrasgerman-de}{\bbl@nonfrenchspacing}
%\end{verbatim}
%   Packages that want to change extras and noextras of all German varieties at once might append code to the internal
%   macros |\@extrasgerman| and |\@noextrasgerman| that are inherited by all varieties.
%
%   For date redefinitions, packages should redefine the internal macros |\date@german@at|, |\date@german@ch|,
%   and |\date@german@de| that hold the definitions for the respective regions and are being inherited in the
%   respective varieties.
%
%
% \StopEventually{}
%
%    \section{Implementation}
%
%    \subsection{General Settings}
%
%   The file \file{babel-german.def} holds the common code for all varieties of German. In this file,
%   which is inputted by all \file{*.ldf} files of \babelde, the main work is done.
%
% \iffalse
%<*gbdef>
% \fi
%
%    We define some helper macros that help us to identify later on
%    whether we use an option that conforms with the internal language naming.
% \changes{Version 2.9a=Version 2.10}{2016/11/03}{Add helper macros to identify the current option.}
% \changes{Version 2.9d=Version 2.13}{2021/02/27}{Move option helper macros after \cs{LdfInit} to fix plain tex usage.}
%    \begin{macrocode}
\def\bbl@opt@german{german}
\def\bbl@opt@swissgerman{swissgerman}
\def\bbl@opt@ngerman{ngerman}
%    \end{macrocode}
%
%    Also, we define helpers to identify the region
%    \begin{macrocode}
\def\bbl@german@region@at{AT}
\def\bbl@german@region@ch{CH}
\def\bbl@german@region@de{DE}
%    \end{macrocode}
%
%  \ldots\ and legacy hyphenation patterns:
%    \begin{macrocode}
\def\bbl@german@legacy@patterns{legacy}
%    \end{macrocode}
%
%  \begin{macro}{\ifbbl@german@newterms}
%  \begin{macro}{\ifbbl@german@maybe@newterms}
%  \begin{macro}{\tosstrue}
%  \begin{macro}{\tossfalse}
%  \begin{macro}{\capsztrue}
%  \begin{macro}{\capszfalse}
%  \begin{macro}{\@bbl@german@at@capsztrue}
%  \begin{macro}{\@bbl@german@at@capszfalse}
%  \begin{macro}{\@bbl@german@ge@capsztrue}
%  \begin{macro}{\@bbl@german@ge@capszfalse}
%  \begin{macro}{\bbl@german@patterns@oldterms}
%  \begin{macro}{\bbl@german@patterns@newterms}
%  We provide (key-val) variety options.
%  To this end, we first define some booleans and macros to store the settings.
% \changes{Version 3.0}{2026/02/09}{Make \BGopt{auto} default for \BGopt{glottonyms}}
%    \begin{macrocode}
\newif\ifbbl@german@newterms
\bbl@german@newtermsfalse
\newif\ifbbl@german@maybe@newterms
\bbl@german@maybe@newtermstrue
\newif\iftoss
\tossfalse
\newif\ifcapsz
\capszfalse
\newif\if@bbl@german@at@capsz
\@bbl@german@at@capszfalse
\newif\if@bbl@german@ge@capsz
\@bbl@german@ge@capszfalse
\providecommand*\bbl@german@patterns@oldterms{legacy}
\providecommand*\bbl@german@patterns@newterms{latest}
%    \end{macrocode}
%   \end{macro}
%   \end{macro}
%   \end{macro}
%   \end{macro}
%   \end{macro}
%   \end{macro}
%   \end{macro}
%   \end{macro}
%   \end{macro}
%   \end{macro}
%   \end{macro}
%   \end{macro}
%  \begin{macro}{\mkgender}
%  \begin{macro}{\mkngender}
%  |\mkgender| holds the string to which the |"x| shorthand resolves. |\mkngender| is just for backwards
%  compatibilty (has been used in previous versions for 1996 orthography).
%    \begin{macrocode}
\def\mkgender{*}
\def\bbl@german@abbrv@space{\,}
\AtBeginDocument{%
   \ifx\mkngender\@undefined\else
       \let\mkgender\mkngender
   \fi
}
%    \end{macrocode}
%   \end{macro}
%   \end{macro}
%
%    Now, the actual option definitions that set the booleans and macros:
%    \begin{macrocode}
\ExplSyntaxOn
\DeclareKeys[bblgerman]
  {
    % glottonyms=<legacy|contemporary|auto>
    glottonyms.choice:,
    % a. legacy
    glottonyms / legacy.code:n =
        { \bbl@german@newtermsfalse
          \bbl@german@maybe@newtermsfalse },
    % b. contemporary
    glottonyms / contemporary.code:n =
        { \bbl@german@newtermstrue
          \bbl@german@maybe@newtermsfalse },
    % c. auto
    glottonyms / auto.code:n =
        { \bbl@german@newtermsfalse
          \bbl@german@maybe@newtermstrue },
    glottonyms.default:n = { auto },
    % toss={true|false}
    toss.legacy_if_set:n = toss,
    % capsz={true|false}
    capsz.code:n =
        {
         \str_if_eq:nnTF { #1 } { true }
         {
            \capsztrue
            \@bbl@german@at@capsztrue
            \@bbl@german@ge@capsztrue
         }{
            \capszfalse
            \@bbl@german@at@capszfalse
            \@bbl@german@ge@capszfalse
         }
       },
    capsz.default:n = { true },
    % hyphenrules={version}
    hyphenrules.code:n = 
     {
       \def\bbl@german@patterns@oldterms{#1}
       \def\bbl@german@patterns@newterms{#1}
       \def\bbl@german@xptl@patterns{}
     },
    % gendermark={mark}
    gendermark.store = \mkgender,
    % abbr-space={spacing}
    abbr-space.store = \bbl@german@abbrv@space,
}
\ExplSyntaxOff
%    \end{macrocode}
%
%  \begin{macro}{\germansetup}
% \changes{Version 2.9g=Version 2.99}{2025/12/21}{Add macro}
% \changes{Version 2.9g=Version 2.99}{2025/12/21}{Allow to set \BGopt{toss} and \BGopt{capsz}}
% \changes{Version 2.9h=Version 2.99b}{2026/01/28}{Allow to set gender mark via \BGopt{gendermark} option}
%   Provide a command to set macros. Assure it can only be used in preamble.
%    \begin{macrocode}
\providecommand*{\germansetup}[1]{%
  \SetKeys[bblgerman]{#1}%
}
\@onlypreamble\germansetup
%    \end{macrocode}
%   \end{macro}
%
% \changes{Version 2.0}{1991/04/23}{Now use \cs{adddialect} if
%    language undefined}
% \changes{Version 2.2d}{1991/10/27}{Removed use of \cs{@ifundefined}}
% \changes{Version 2.3e}{1991/11/10}{Added warning, if no german
%    patterns loaded}
% \changes{Version 2.5c}{1994/06/26}{Now use \cs{@nopatterns} to
%    produce the warning}
% \changes{Version 2.9g=Version 2.99}{2025/12/05}{Complete rewrite to support new aliases}
%
%   In all cases, we check for the existence of the required hyphenation patterns,
%   and if it is unknown, we issue a warning (and fall back to the null language).
%   If required we set |\l@<langoption>| as a `dialect' of the hyphenation language.
%
%  \changes{Version 3.1}{2026/03/12}{Also check if exptl hyphenation patterns are available}
%  \begin{macro}{\bbl@german@tryxptlpatterns}
%  This helper macro checks if exptl patterns (package \textsf{dehyph-exptl}) are available
%  and falls back to legacy (which might be null language) with a warning if not:
%    \begin{macrocode}
\def\bbl@german@tryxptlpatterns#1#2{
    \expandafter\ifcsname l@#2\endcsname
        \expandafter\adddialect\csname l@#1\expandafter
        \endcsname\csname l@#2\endcsname
    \else
        \PackageWarning{babel-german}{Hyphenation patterns `#2',
            requested by #1, not available. Falling back to legacy!}        
   \fi
}
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\l@tgerman}
%  Since |\l@german| is ambiguous depending on the setting of
%  \BGopt{glottonyms}, we define |\l@tgerman| which always represents
%  1901 patterns:
%    \begin{macrocode}
\ifx\l@tgerman\@undefined
   \ifx\l@german\@undefined\else
        \let\l@tgerman\l@german
   \fi
\fi
%    \end{macrocode}
%   \end{macro}
%
%  Now, as this has been set, handle the \BGopt{glottonyms} option
%  if we are within \Lopt{german}:
%    \begin{macrocode}
\ifx\CurrentOption\bbl@opt@german
  \AddToHook{begindocument/before}{%
%    \end{macrocode}
%  \changes{Version 3.3}{2026/04/13}{Fix log message}
%   First, if we have \BGopt{glottonyms=auto}, check whether
%   we have an n-variety that forces legacy semantics:
%    \begin{macrocode}
    \ifbbl@german@maybe@newterms
       \@ifundefined{bbl@german@force@legacy}{%
          \bbl@german@newtermstrue
          \PackageInfo{babel-german}{Using contemporary glottonyms\MessageBreak
                       `german' denotes post-1996 spelling.}%
       }{%
          \PackageInfo{babel-german}{Using legacy glottonyms\MessageBreak
                       `german' denotes pre-1996 spelling.}%
       }%
    \fi
%    \end{macrocode}
%   We know now if \Lopt{german} means 1901 or 1996, so
%   set the hyphenation patterns if needed. Here,
%   we also consider the \BGopt{hyphenrules} option
%   for \Lopt{german}. The following is either
%   \BGopt{glottonyms=contemporary} or \BGopt{glottonyms=auto}
%   without n-variety:
%    \begin{macrocode}
    \ifbbl@german@newterms
%    \end{macrocode}
%   If we do not find legacy \Lopt{ngerman} patterns, warn
%   and fall back to null language:
%    \begin{macrocode}
      \ifx\l@ngerman\@undefined
          \@nopatterns{German (current orthography),
                       falling back to 1901 orthography!}%
      \else
%    \end{macrocode}
% \changes{Version 3.0}{2026/02/09}{Fix BCP47 info for contemporary \Lopt{german}}
%   (Re-)load ini files. This is a hack to fix the locale info:
%    \begin{macrocode}
        \babelprovide[identification/tag.bcp47=de-DE,
                      identification/region.local=Deutschland,
                      identification/region.english=Germany,
                      identification/region.tag.bcp47=DE]{german}
%    \end{macrocode}
%   If \BGopt{hyphenrules} have not been set, use \Lopt{ngerman}:
%    \begin{macrocode}
          \ifx\bbl@german@patterns@newterms\bbl@german@legacy@patterns
              \adddialect\l@german\l@ngerman
%    \end{macrocode}
%   otherwise, use what is requested:
%    \begin{macrocode}
          \else
            \bbl@german@tryxptlpatterns{german}%
                {ngerman-x-\bbl@german@patterns@newterms}                  
          \fi
%    \end{macrocode}
%   and record that we use \Lopt{german} in the modern sense:
%    \begin{macrocode}
          \addto\extrasgerman{\bbl@german@tradspellingfalse}%
      \fi
    \else
%    \end{macrocode}
%   The following is either \BGopt{glottonyms=legacy} or \BGopt{glottonyms=auto}
%   with n-variety. Here, we only set patterns if requested via
%   \BGopt{hyphenrules}:
%    \begin{macrocode}
       \ifx\bbl@german@patterns@oldterms\bbl@german@legacy@patterns\else
          \bbl@german@tryxptlpatterns{german}%
              {german-x-\bbl@german@patterns@oldterms}                  
       \fi
    \fi
  }
\fi
%    \end{macrocode}
%
%  \changes{Version 3.1}{2026/03/12}{Remove internal catcode change which is no longer necessary}
%
%  We begin with region DE, first 1901 spelling:
%    \begin{macrocode}
\ifx\bbl@german@region\bbl@german@region@de
  \ifbbl@german@tradspelling
      \ifx\l@tgerman\@undefined
        \@nopatterns{German (1901 orthography)}
        \adddialect\l@german0
        \adddialect\l@tgerman0
      \fi
    \ifx\CurrentOption\bbl@opt@german\else
       \expandafter\adddialect\csname l@\CurrentOption\endcsname\l@tgerman
    \fi
%    \end{macrocode}
%
%   Then DE-1996:
%    \begin{macrocode}
  \else% 1996 spelling
    \ifx\l@ngerman\@undefined
      \@nopatterns{German (current orthography)}
      \adddialect\l@ngerman0
    \fi
    \ifx\CurrentOption\bbl@opt@ngerman\else
       \expandafter\adddialect\csname l@\CurrentOption\endcsname\l@ngerman
    \fi
  \fi
\fi
%    \end{macrocode}
%
%    For AT-1901, we set \Lopt{<langopt>} as a dialect of \Lopt{german},
%    since the Austrian variety uses the same hyphenation patterns as
%    Germany's Standard German (both in pre- and post-1996 spelling).
%
%    If no German patterns are found, we issue a warning and fall back to null language.
% \changes{Version 2.0}{1991/04/23}{Now use \cs{adddialect} for
%    austrian}
% \changes{Version 2.8}{2016/11/01}{Only add Austrian dialect if \Lopt{austrian} is loaded}
% \changes{Version 2.9}{2016/11/02}{Do not attempt to load \cs{l@austrian}, which does not exist}
%    \begin{macrocode}
\ifx\bbl@german@region\bbl@german@region@at
  \ifbbl@german@tradspelling
      \ifx\l@tgerman\@undefined
        \@nopatterns{German (1901 orthography), needed by Austrian (1901 orthography)}
        \expandafter\adddialect\csname l@\CurrentOption\endcsname0
      \else
        \expandafter\adddialect\csname l@\CurrentOption\endcsname\l@tgerman
     \fi
%    \end{macrocode}
%   Same for AT-1996, but as a dialect of \Lopt{ngerman}:
%    \begin{macrocode}
  \else% 1996 spelling
    \ifx\l@ngerman\@undefined
      \@nopatterns{German (current orthography), needed by Austrian (current orthography)}
        \expandafter\adddialect\csname l@\CurrentOption\endcsname0
    \else
       \expandafter\adddialect\csname l@\CurrentOption\endcsname\l@ngerman
    \fi
  \fi
\fi
%    \end{macrocode}
%
%    For the pre-1996 Swiss variety, we attempt to load the specific
%    \Lopt{swissgerman} hyphenation patterns and fall back to
%    \Lopt{german} if those are not available.
%    If no patterns are found, we issue a warning and go for null language.
% \changes{Version 2.7b}{2014/10/10}{Do not warn about missing swissgerman patterns
%    if \Lopt{swissgerman} is not loaded}
%    \begin{macrocode}
\ifx\bbl@german@region\bbl@german@region@ch
  \ifbbl@german@tradspelling
     \ifx\l@swissgerman\@undefined
        \ifx\l@tgerman\@undefined
          \@nopatterns{Swiss Standard German (1901 orthography) and German (1901 orthography)}
          \expandafter\adddialect\csname l@\CurrentOption\endcsname0
        \else
          \@nopatterns{Swiss Standard German (1901 orthography), 
                       falling back to German (1901 orthography)}
          \expandafter\adddialect\csname l@\CurrentOption\endcsname\l@tgerman
        \fi
     \else
       \ifx\CurrentOption\bbl@opt@swissgerman\else
         \expandafter\adddialect\csname l@\CurrentOption\endcsname\l@swissgerman
       \fi
     \fi
%    \end{macrocode}
%    Post-1996 Swiss German uses \Lopt{ngerman} hyphenation patterns, so try those:
%    \begin{macrocode}
  \else% 1996 spelling
    \ifx\l@ngerman\@undefined
      \@nopatterns{German (current orthography),
                   needed by Swiss Standard German (current orthography)}
        \expandafter\adddialect\csname l@\CurrentOption\endcsname0
    \else
       \expandafter\adddialect\csname l@\CurrentOption\endcsname\l@ngerman
    \fi
  \fi
\fi
%    \end{macrocode}
%
%
%  \begin{macro}{\addtocs}
%  \changes{Version 2.9h=Version 2.99b}{2026/01/27}{Add macro}
%  Since the hyphen has catcode 12 normally and hence terminates a command name,
%  we provide a helper command to easily append captions, extras etc.
%  for the language names with hyphen: 
%    \begin{macrocode}
\providecommand*\addtocs[2]{\expandafter\addto\csname #1\endcsname{#2}}
%    \end{macrocode}
%  \end{macro}
%
% \changes{Version 2.9g=Version 2.99}{2025/12/21}{Allow to load experimental hyphenation patterns via macro \cs{germansetup}} 
%    With the option \BGopt{hyphenrules}, we load experimental hyphenation patterns (package \textsf{dehyph-exptl}).
%    The following passes the respective code for a given variety to an internal hook that is being executed
%    at document begin (when we know the setting of \BGopt{hyphenrules}).
%  \begin{macro}{\bbl@german@patternshook}
%  First, we define the internal hook to collect the respective code:
%    \begin{macrocode}
\providecommand\bbl@german@patternshook{}
%    \end{macrocode}
%  \end{macro}
%
%   Now the code. We do not handle \Lopt{german} here, as this is already done in the code that also considers
%   \BGopt{glottonyms}. Also, 1901 Swiss German already uses exptl patterns, so we ignore this.
%   We begin with 1901 variants:
%    \begin{macrocode}
\ifbbl@german@tradspelling
    \ifx\bbl@german@region\bbl@german@region@ch\else
       \def\bbl@tmpa{austrian}
       \ifx\CurrentOption\bbl@tmpa
           \addto\bbl@german@patternshook{%
             \ifx\bbl@german@patterns@oldterms\bbl@german@legacy@patterns\else
               \bbl@german@tryxptlpatterns{austrian}%
                   {german-x-\bbl@german@patterns@oldterms}                  
             \fi}
       \fi
       \def\bbl@tmpa{german-at-1901}
       \ifx\CurrentOption\bbl@tmpa
           \addto\bbl@german@patternshook{%
             \ifx\bbl@german@patterns@newterms\bbl@german@legacy@patterns\else
                 \bbl@german@tryxptlpatterns{german-at-1901}%
                     {german-x-\bbl@german@patterns@newterms}                  
             \fi}
       \fi
       \def\bbl@tmpa{german-austria-1901}
       \ifx\CurrentOption\bbl@tmpa
           \addto\bbl@german@patternshook{%
             \ifx\bbl@german@patterns@newterms\bbl@german@legacy@patterns\else
                \bbl@german@tryxptlpatterns{german-austria-1901}%
                    {german-x-\bbl@german@patterns@newterms}                  
             \fi}
       \fi
       \def\bbl@tmpa{german-de-1901}
       \ifx\CurrentOption\bbl@tmpa
           \addto\bbl@german@patternshook{%
             \ifx\bbl@german@patterns@newterms\bbl@german@legacy@patterns\else
                \bbl@german@tryxptlpatterns{german-de-1901}%
                    {german-x-\bbl@german@patterns@newterms}                  
             \fi}
       \fi
       \def\bbl@tmpa{german-germany-1901}
       \ifx\CurrentOption\bbl@tmpa
           \addto\bbl@german@patternshook{%
             \ifx\bbl@german@patterns@newterms\bbl@german@legacy@patterns\else
                 \bbl@german@tryxptlpatterns{german-germany-1901}%
                     {german-x-\bbl@german@patterns@newterms}                  
             \fi}
       \fi
    \fi
\else
%    \end{macrocode}
%
%   Then 1996 variants:
%    \begin{macrocode}
   \ifx\CurrentOption\bbl@opt@ngerman
       \addto\bbl@german@patternshook{%
         \ifx\bbl@german@patterns@oldterms\bbl@german@legacy@patterns\else
            \bbl@german@tryxptlpatterns{ngerman}%
                {ngerman-x-\bbl@german@patterns@oldterms}                  
         \fi}
   \fi
   \def\bbl@tmpa{german-at}
   \ifx\CurrentOption\bbl@tmpa
       \addto\bbl@german@patternshook{%
         \ifx\bbl@german@patterns@newterms\bbl@german@legacy@patterns\else
            \bbl@german@tryxptlpatterns{german-at}%
                {ngerman-x-\bbl@german@patterns@newterms}                  
         \fi}
   \fi
   \def\bbl@tmpa{naustrian}
   \ifx\CurrentOption\bbl@tmpa
       \addto\bbl@german@patternshook{%
         \ifx\bbl@german@patterns@oldterms\bbl@german@legacy@patterns\else
            \bbl@german@tryxptlpatterns{naustrian}%
                {ngerman-x-\bbl@german@patterns@oldterms}                  
         \fi}
   \fi
   \def\bbl@tmpa{german-austria}
   \ifx\CurrentOption\bbl@tmpa
       \addto\bbl@german@patternshook{%
         \ifx\bbl@german@patterns@newterms\bbl@german@legacy@patterns\else
            \bbl@german@tryxptlpatterns{german-austria}%
                {ngerman-x-\bbl@german@patterns@newterms}                  
         \fi}
   \fi
   \def\bbl@tmpa{german-ch}
   \ifx\CurrentOption\bbl@tmpa
       \addto\bbl@german@patternshook{%
         \ifx\bbl@german@patterns@newterms\bbl@german@legacy@patterns\else
            \bbl@german@tryxptlpatterns{german-ch}%
                {ngerman-x-\bbl@german@patterns@newterms}                  
         \fi}
   \fi
   \def\bbl@tmpa{german-switzerland}
   \ifx\CurrentOption\bbl@tmpa
       \addto\bbl@german@patternshook{%
         \ifx\bbl@german@patterns@newterms\bbl@german@legacy@patterns\else
            \bbl@german@tryxptlpatterns{german-switzerland}%
                {ngerman-x-\bbl@german@patterns@newterms}                  
         \fi}
   \fi
   \def\bbl@tmpa{german-de}
   \ifx\CurrentOption\bbl@tmpa
       \addto\bbl@german@patternshook{%
         \ifx\bbl@german@patterns@newterms\bbl@german@legacy@patterns\else
            \bbl@german@tryxptlpatterns{german-de}%
                {ngerman-x-\bbl@german@patterns@newterms}                  
         \fi}
   \fi
   \def\bbl@tmpa{german-germany}
   \ifx\CurrentOption\bbl@tmpa
       \addto\bbl@german@patternshook{%
         \ifx\bbl@german@patterns@newterms\bbl@german@legacy@patterns\else
           \bbl@german@tryxptlpatterns{german-germany}%
               {ngerman-x-\bbl@german@patterns@newterms}                  
         \fi}
   \fi
   \def\bbl@tmpa{nswissgerman}
   \ifx\CurrentOption\bbl@tmpa
       \addto\bbl@german@patternshook{%
         \ifx\bbl@german@patterns@oldterms\bbl@german@legacy@patterns\else
            \bbl@german@tryxptlpatterns{nswissgerman}%
                {ngerman-x-\bbl@german@patterns@oldterms}
         \fi}
   \fi
\fi
%    \end{macrocode}
%   We only want to add the patterns code to begindocument/before
%   once, so we clear what has been added before (the empty code
%   addition is to make sure the label exists):
%    \begin{macrocode}
\AddToHook{begindocument/before}[babel-german-patterns]{}
\RemoveFromHook{begindocument/before}[babel-german-patterns]
%    \end{macrocode}
%  Now add the code to the hook:
%    \begin{macrocode}
\AddToHook{begindocument/before}[babel-german-patterns]{%
   \ifdefined\bbl@german@xptl@patterns
     \bbl@german@patternshook
   \fi
}
%    \end{macrocode}
%
%    \subsection{Language-Specific Strings (Captions)}
%
%    The next step consists of defining macros that provide language specific strings
%    and settings.
%
%  \begin{macro}{\@captionsgerman}
%    The macro |\@captionsgerman| defines all strings used in the four
%    standard document classes provided with \LaTeX\ for German.
%    This is an internal macro that is inherited and modified by the following
%    macros for the respective language varieties.
%
% \changes{Version 2.2}{1991/06/06}{Removed \cs{global} definitions}
% \changes{Version 2.2}{1991/06/06}{\cs{pagename} should be
%    \cs{headpagename}}
% \changes{Version 2.3e}{1991/11/10}{Added \cs{prefacename},
%    \cs{seename} and \cs{alsoname}}
% \changes{Version 2.4}{1993/07/15}{\cs{headpagename} should be
%    \cs{pagename}}
% \changes{Version 2.6b}{1995/07/04}{Added \cs{proofname} for
%    AMS-\LaTeX}
% \changes{Version 2.6d}{1996/07/10}{Construct control sequence on the
%    fly}
% \changes{Version 2.6j}{2000/09/20}{Added \cs{glossaryname}}
% \changes{Version 2.7}{2013/12/13}{Split \cs{captionsgerman} from
%                                    \cs{captionsaustrian} and
%                                    \cs{captionsswissgerman}.}
% \changes{Version 2.7}{2013/12/13}{Changed \cs{enclname} in
%                                    \Lopt{austrian} to
%                                    \emph{Beilage(n)}.}
% \changes{Version 2.8}{2016/11/01}{Define trans-variational base captions
%                                   which are loaded and modified by the varieties}
%    \begin{macrocode}
\@namedef{@captionsgerman}{%
  \def\prefacename{Vorwort}%
  \def\refname{Literatur}%
  \def\abstractname{Zusammenfassung}%
  \def\bibname{Literaturverzeichnis}%
  \def\chaptername{Kapitel}%
  \def\appendixname{Anhang}%
  \def\contentsname{Inhaltsverzeichnis}%
  \def\listfigurename{Abbildungsverzeichnis}%
  \def\listtablename{Tabellenverzeichnis}%
  \def\indexname{Index}%
  \def\figurename{Abbildung}%
  \def\tablename{Tabelle}%
  \def\partname{Teil}%
  \def\enclname{Anlage(n)}%
  \def\ccname{Verteiler}%
  \def\headtoname{An}%
  \def\pagename{Seite}%
  \def\seename{siehe}%
  \def\alsoname{siehe auch}%
  \def\proofname{Beweis}%
  \def\glossaryname{Glossar}%
}
%    \end{macrocode}
%  \end{macro}
%  \begin{macro}{\captionsallgerman}
%  \changes{Version 2.9h=Version 2.99b}{2026/01/27}{Add macro}
%   The macro |\captionsallgerman| is a more accessible intermediate
%   copy of |\@captionsgerman|.
%    \begin{macrocode}
\@namedef{captionsallgerman}{%
    \@nameuse{@captionsgerman}%
}
%    \end{macrocode}
%  \end{macro}
%  \begin{macro}{\captionsallatgerman}
%  \changes{Version 2.9h=Version 2.99b}{2026/01/27}{Rename from \cs{@captionsgerman@at}}
%   The macro |\captionsallatgerman| redefines the variants
%   common in AT and is inherited by all Austrian varieties.
%    \begin{macrocode}
\@namedef{captionsallatgerman}{%
    \@nameuse{captionsallgerman}%
    \def\enclname{Beilage(n)}%
}
%    \end{macrocode}
%  \end{macro}
%  \begin{macro}{\captionsallchgerman}
%  \changes{Version 2.9h=Version 2.99b}{2026/01/27}{Rename from \cs{@captionsgerman@ch}}
%   The macro |\captionsallchgerman| redefines the variants
%   common in CH and is inherited by all Swiss varieties
%   (currently identical to AT).
%    \begin{macrocode}
\@namedef{captionsallchgerman}{%
    \@nameuse{captionsallgerman}%
    \def\enclname{Beilage(n)}%
}
%    \end{macrocode}
%  \end{macro}
%  \begin{macro}{\captionsgerman}
%    The macro |\captionsgerman| is identical to |\captionsallgerman|,
%    but only defined if \Lopt{german}, \Lopt{german-de-1901} or \Lopt{german-germany-1901}
%    are requested.
%  \changes{Version 2.8}{2016/11/01}{Only define \cs{captionsgerman} if
%                                    \Lopt{german} is requested.}
%    \begin{macrocode}
\ifx\CurrentOption\bbl@opt@german
  \@namedef{captionsgerman}{%
    \@nameuse{captionsallgerman}%
}
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\captionsgerman-de-1901}
%  \begin{macro}{\captionsgerman-germany-1901}
%    For \Lopt{german-de-1901} and \Lopt{german-germany-1901}, we define both |\captionsgerman|
%    and |\captionsgerman-de-1901| or |\captionsgerman-germany-1901|, respectively,
%    which import the former.
%    \begin{macrocode}
\else
  \ifx\bbl@german@region\bbl@german@region@de
    \ifbbl@german@tradspelling
       \@namedef{captionsgerman}{%
          \@nameuse{captionsallgerman}%
       }
       \@namedef{captions\CurrentOption}{%
          \@nameuse{captionsgerman}%
       }
    \fi
  \fi
\fi
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%
%  \begin{macro}{\captionsngerman}
%    The macro |\captionsngerman| is identical to |\captionsallgerman|,
%    but only defined if \Lopt{ngerman}, \Lopt{german-de} or \Lopt{german-germany} is requested.
%  \changes{Version 2.8}{2016/11/01}{Only define \cs{captionsngerman} if
%                                    \Lopt{ngerman} is requested.}
%    \begin{macrocode}
\ifx\CurrentOption\bbl@opt@ngerman
  \@namedef{captionsngerman}{%
      \@nameuse{captionsallgerman}%
}
%    \end{macrocode}
%
%  \begin{macro}{\captionsgerman-de}
%  \begin{macro}{\captionsgerman-germany}
%    For \Lopt{german-de} and \Lopt{german-germany}, we define both |\captionsngerman|
%    and |\captionsgerman-de| or |\captionsgerman-germany|, respectively, which import the former.
%    \begin{macrocode}
\else
  \ifx\bbl@german@region\bbl@german@region@de
     \ifbbl@german@tradspelling\else
        \@namedef{captionsngerman}{%
           \@nameuse{captionsallgerman}%
        }
        \@namedef{captions\CurrentOption}{%
           \@nameuse{captionsngerman}%
        }
     \fi
  \fi
\fi
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%
%  \begin{macro}{\captionsaustrian}
%  \begin{macro}{\captionsnaustrian}
%  \begin{macro}{\captionsgerman-at-1901}
%  \begin{macro}{\captionsgerman-at}
%  \begin{macro}{\captionsgerman-austria-1901}
%  \begin{macro}{\captionsgerman-austria}
%    The Austrian |\caption*|s build on |\captionsallgerman|, but
%    redefine some strings following Austrian conventions (for the
%    respective variants, cf.\ \cite{vwb}). They are only defined if
%    an Austrian variety is requested.
%  \changes{Version 2.8}{2016/11/01}{Only define \cs{captionsaustrian} if
%                                    \Lopt{austrian} is requested.}
%    \begin{macrocode}
\ifx\bbl@german@region\bbl@german@region@at
 \ifbbl@german@tradspelling
    \def\bbl@tmpa{austrian}
    \ifx\CurrentOption\bbl@tmpa
       \@namedef{captions\CurrentOption}{%
         \@nameuse{captionsallatgerman}%
       }
     \else
       \@namedef{captionsaustrian}{%
         \@nameuse{captionsallatgerman}%
       }
       \@namedef{captions\CurrentOption}{%
         \@nameuse{captionsaustrian}%
       }
     \fi
  \else
    \def\bbl@tmpa{naustrian}
    \ifx\CurrentOption\bbl@tmpa
      \@namedef{captions\CurrentOption}{%
        \@nameuse{captionsallatgerman}%
      }
     \else
       \@namedef{captionsnaustrian}{%
         \@nameuse{captionsallatgerman}%
       }
       \@namedef{captions\CurrentOption}{%
         \@nameuse{captionsnaustrian}%
       }
     \fi
  \fi
\fi
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%  \begin{macro}{\captionsswissgerman}
%  \begin{macro}{\captionsnswissgerman}
%  \begin{macro}{\captionsgerman-ch-1901}
%  \begin{macro}{\captionsgerman-ch}
%  \begin{macro}{\captionsgerman-switzerland-1901}
%  \begin{macro}{\captionsgerman-switzerland}
%    The Swiss |\caption*|s build on |\captionsallgerman|, but
%    redefine some strings following Swiss conventions (for the
%    respective variants, cf.\ \cite{vwb}). They are only defined if
%    a Swiss German variety is requested.
%  \changes{Version 2.8}{2016/11/01}{Only define \cs{captionsswissgerman} if
%                                    \Lopt{swissgerman} is requested.}
%    \begin{macrocode}
\ifx\bbl@german@region\bbl@german@region@ch
 \ifbbl@german@tradspelling
    \ifx\CurrentOption\bbl@opt@swissgeman
       \@namedef{captions\CurrentOption}{%
         \@nameuse{captionsallchgerman}%
       }
     \else
       \@namedef{captionsswissgeman}{%
         \@nameuse{captionsallchgerman}%
       }
       \@namedef{captions\CurrentOption}{%
         \@nameuse{captionsswissgeman}%
       }
     \fi
  \else
    \def\bbl@tmpa{nswissgeman}
    \ifx\CurrentOption\bbl@tmpa
      \@namedef{captions\CurrentOption}{%
        \@nameuse{captionsallchgerman}%
      }
     \else
       \@namedef{captionsnswissgeman}{%
         \@nameuse{captionsallchgerman}%
       }
       \@namedef{captions\CurrentOption}{%
         \@nameuse{captionsnswissgeman}%
       }
     \fi
  \fi
\fi
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%
%
%  \subsection{Date Localizations}
%
%  \begin{macro}{\month@german}
%    The macro |\month@german| defines German month names for all varieties.
% \changes{Version 2.3e}{1991/11/10}{Added \cs{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}
%    \end{macrocode}
%  \end{macro}
%
% \changes{Version 2.6f}{1997/10/01}{Use \cs{edef} to define
%    \cs{today} to save memory}
% \changes{Version 2.6f}{1998/03/28}{use \cs{def} instead of
%    \cs{edef}}
%  \changes{Version 2.8}{2016/11/01}{Only define \cs{dateaustrian} if
%                                    \Lopt{austrian} is requested.}
%  \begin{macro}{\date@german@at}
%  \begin{macro}{\date@german@ch}
%  \begin{macro}{\date@german@de}
%  We define some internal macros with common settings for each region.
%  From these, only Austrian differs in the naming of January (\emph{J\"anner}): 
%    \begin{macrocode}
\@namedef{date@german@at}{\def\today{\number\day.~\ifnum1=\month
    J\"anner\else \month@german\fi \space\number\year}}
\@namedef{date@german@ch}{\def\today{\number\day.~\month@german
      \space\number\year}}
\@namedef{date@german@de}{\def\today{\number\day.~\month@german
      \space\number\year}}
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%  \begin{macro}{\dateaustrian}
%  \begin{macro}{\datenaustrian}
%  \begin{macro}{\dategerman-at-1901}
%  \begin{macro}{\dategerman-at}
%  \begin{macro}{\dategerman-austria-1901}
%  \begin{macro}{\dategerman-austria}
%    The Austrian |\date*| macros redefine the command
%    |\today| to produce Austrian versions of the German dates
%    (with the specific naming of January which differs from the
%    other German varieties). The macro is only defined if
%    an Austrian variety is requested.
%    \begin{macrocode}
\ifx\bbl@german@region\bbl@german@region@at
   \@namedef{date\CurrentOption}{\@nameuse{date@german@at}}
\else
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%
% \changes{Version 2.6f}{1997/10/01}{Use \cs{edef} to define
%    \cs{today} to save memory}
% \changes{Version 2.6f}{1998/03/28}{use \cs{def} instead of
%    \cs{edef}}
%  \changes{Version 2.8}{2016/11/01}{Only define \cs{dategerman} if
%                                    \Lopt{german} is requested.}
%  \begin{macro}{\dateswissgerman}
%  \begin{macro}{\datenswissgerman}
%  \begin{macro}{\dategerman-ch-1901}
%  \begin{macro}{\dategerman-ch}
%  \begin{macro}{\dategerman-switzerland-1901}
%  \begin{macro}{\dategerman-switzerland}
%    The other |\date*| macros redefine the command
%    |\today| to produce the respective dates for Swiss and German
%    Standard German. They are all identical, both for all Swiss varieties:
%    \begin{macrocode}
    \ifx\bbl@german@region\bbl@german@region@ch
      \@namedef{date\CurrentOption}{\@nameuse{date@german@ch}}
    \else
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%  \begin{macro}{\dategerman}
%  \begin{macro}{\datengerman}
%  \begin{macro}{\dategerman-de-1901}
%  \begin{macro}{\dategerman-de}
%  \begin{macro}{\dategerman-germany-1901}
%  \begin{macro}{\dategerman-germany}
%  as well as for all German varieties:
%    \begin{macrocode}
      \@namedef{date\CurrentOption}{\@nameuse{date@german@de}}
    \fi
\fi
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%
%
%  \subsection{Extras}
%
% \changes{Version 2.0b}{1991/05/29}{added some comment chars to
%    prevent white space}
% \changes{Version 2.2}{1991/06/11}{Save all redefined macros}
%  \changes{Version 2.7}{2013/12/13}{Added \cs{extrasswissgerman}.}
% \changes{Version 1.1}{1990/07/30}{Added \cs{dieresis}}
% \changes{Version 2.0b}{1991/05/29}{added some comment chars to
%    prevent white space}
% \changes{Version 2.2}{1991/06/11}{Try to restore everything to its
%    former state}
% \changes{Version 2.6d}{1996/07/10}{Construct control sequence
%    \cs{extrasgerman} or \cs{extrasaustrian} on the fly}
%
%    The |\extras*| macros will perform all the extra 
%    definitions needed for the respective
%    variety. The |\noextras*| macros are used to cancel the
%    actions of |\extras*|.
%
%    First, the character \texttt{"} is declared active for all German
%    varieties. This is done once, later on its definition may vary.
%    \begin{macrocode}
\initiate@active@char{"}
%    \end{macrocode}
%
%  \begin{macro}{\@extrasgerman}
%    The macro |\@extrasgerman| holds all the default extras setting.
%    This is an internal macro that is inherited and modified by the following
%    macros for the respective language varieties.
%    \begin{macrocode}
\@namedef{@extrasgerman}{%
%    \end{macrocode}
%    First, we load the shorthands defined below and activate the \texttt{"}
%    character
%    \begin{macrocode}
   \languageshorthands{german}%
   \bbl@activate{"}%
%    \end{macrocode}
%    In order for \TeX\ to be able to hyphenate German words which
%    contain `\ss' (in the \texttt{OT1} position |^^Y|), we furthermore
%    have to give the character a nonzero |\lccode| (see Appendix H, the \TeX
%    book).
% \changes{Version 2.6c}{1996/04/08}{Use decimal number instead of
%    hat-notation as the hat may be activated}
%    \begin{macrocode}
   \babel@savevariable{\lccode25}%
   \lccode25=25%
%    \end{macrocode}
% \changes{Version 2.6a}{1995/02/15}{Removed \cs{3} as it is no
%    longer in \file{germanb.ldf}} 
%    The umlaut accent macro |\"| is changed to lower the umlaut dots.
%    The redefinition is done with the help of |\umlautlow|.
% \changes{Version 2.6a}{1995/02/15}{\cs{umlautlow} and
%    \cs{umlauthigh} moved to \file{glyphs.dtx}, as well as
%    \cs{newumlaut} (now \cs{lower@umlaut}}
%    \begin{macrocode}
   \babel@save\"\umlautlow
%    \end{macrocode}
%    For German texts, we finally need to assure that |\frenchspacing| is
%    turned on.
% \changes{Version 2.6k}{2001/01/26}{Turn frenchspacing on, as in
%    \file{german.sty}}
%    \begin{macrocode}
   \bbl@frenchspacing
}
%    \end{macrocode}
%   \end{macro}
%
%    Depending on the option with which the language definition file
%    has been loaded, a respective |\extras*| macro is defined.
%    Each of those is identical: it simply inherits |\@extrasgerman|.
%    However, the traditional names (\Lopt{german}, \Lopt{ngerman}, \Lopt{austrian},
%    \Lopt{naustrian}, \Lopt{swissgerman}, and \Lopt{nswissgerman}) are used as an
%    intermediate layer, so redefining those will also redefine
%    the newer aliases.
%  \begin{macro}{\extrasgerman}
%  First, the legacy |extras| macro for pre-1996 German German:
%    \begin{macrocode}
\ifx\CurrentOption\bbl@opt@german
  \@namedef{extrasgerman}{%
      \@nameuse{@extrasgerman}%
  }
\else
%    \end{macrocode}
%   \end{macro}
%  \begin{macro}{\extrasngerman}
%  Then, the legacy |extras| macro for post-1996 German German:
%    \begin{macrocode}
  \ifx\CurrentOption\bbl@opt@ngerman
    \@namedef{extrasngerman}{%
        \@nameuse{@extrasgerman}%
    }
  \else
%    \end{macrocode}
%   \end{macro}
%  \begin{macro}{\extrasgerman-de-1901}
%  \begin{macro}{\extrasgerman-germany-1901}
% Now newer alias names for pre-1996 German German:
%    \begin{macrocode}
    \ifx\bbl@german@region\bbl@german@region@de
       \ifbbl@german@tradspelling
          \@namedef{extrasgerman}{%
             \@nameuse{@extrasgerman}%
          }
          \@namedef{extras\CurrentOption}{%
             \@nameuse{extrasgerman}%
          }
       \else
%    \end{macrocode}
%   \end{macro}
%   \end{macro}
%  \begin{macro}{\extrasgerman-de}
%  \begin{macro}{\extrasgerman-germany}
%  and post-1996 German German:
%    \begin{macrocode}
         \@namedef{extrasngerman}{%
            \@nameuse{@extrasgerman}%
         }
         \@namedef{extras\CurrentOption}{%
            \@nameuse{extrasngerman}%
         }
       \fi
    \fi
  \fi
\fi
%    \end{macrocode}
%   \end{macro}
%   \end{macro}
%  \begin{macro}{\extrasaustrian}
%  Same for Autrian: first, the legacy |extras| macro for pre-1996 Austrian German:
%    \begin{macrocode}
\def\bbl@tmpa{austrian}
\def\bbl@tmpb{naustrian}
\ifx\CurrentOption\bbl@tmpa
  \@namedef{extrasaustrian}{%
      \@nameuse{@extrasgerman}%
  }
\else
%    \end{macrocode}
%   \end{macro}
%  \begin{macro}{\extrasnaustrian}
%  Then, the legacy |extras| macro for post-1996 Austrian German:
%    \begin{macrocode}
  \ifx\CurrentOption\bbl@tmpb
    \@namedef{extrasnaustrian}{%
      \@nameuse{@extrasgerman}%
    }
  \else
%    \end{macrocode}
%   \end{macro}
%  \begin{macro}{\extrasgerman-at-1901}
%  \begin{macro}{\extrasgerman-austria-1901}
% Now newer alias names for pre-1996 Austrian German:
%    \begin{macrocode}
     \ifx\bbl@german@region\bbl@german@region@at
        \ifbbl@german@tradspelling
           \@namedef{extrasaustrian}{%
              \@nameuse{@extrasgerman}%
           }
           \@namedef{extras\CurrentOption}{%
              \@nameuse{extrasaustrian}%
           }
        \else
%    \end{macrocode}
%   \end{macro}
%   \end{macro}
%  \begin{macro}{\extrasgerman-at}
%  \begin{macro}{\extrasgerman-austria}
%  Then, the newer |extras| macro for post-1996 Austrian German:
%    \begin{macrocode}
           \@namedef{extrasnaustrian}{%
              \@nameuse{@extrasgerman}%
           }
           \@namedef{extras\CurrentOption}{%
              \@nameuse{extrasnaustrian}%
           }
        \fi
     \fi
  \fi
\fi
%    \end{macrocode}
%   \end{macro}
%   \end{macro}
%  \begin{macro}{\extrasswissgerman}
%  Finally, same for Swiss German; first, the legacy |extras| macros for pre-1996 Swiss German:
%    \begin{macrocode}
\ifx\CurrentOption\bbl@opt@swissgerman
  \@namedef{extrasswissgerman}{%
      \@nameuse{@extrasgerman}%
  }
\else
%    \end{macrocode}
%   \end{macro}
%  \begin{macro}{\extrasnswissgerman}
%  Then, the legacy |extras| macro for post-1996 Swiss German:
%    \begin{macrocode}
  \def\bbl@tmpa{nswissgerman}
  \ifx\CurrentOption\bbl@tmpa
    \@namedef{extrasnswissgerman}{%
       \@nameuse{@extrasgerman}%
    }
  \else
%    \end{macrocode}
%   \end{macro}
%  \begin{macro}{\extrasgerman-ch-1901}
%  \begin{macro}{\extrasgerman-switzerland-1901}
% Now newer alias names for pre-1996 Swiss German:
%    \begin{macrocode}
     \ifx\bbl@german@region\bbl@german@region@ch
        \ifbbl@german@tradspelling
           \@namedef{extrasswissgerman}{%
              \@nameuse{@extrasgerman}%
           }
           \@namedef{extras\CurrentOption}{%
              \@nameuse{extrasswissgerman}%
           }
        \else
%    \end{macrocode}
%   \end{macro}
%   \end{macro}
%  \begin{macro}{\extrasgerman-ch}
%  \begin{macro}{\extrasgerman-switzerland}
%  Then, the newer |extras| macro for post-1996 Swiss German:
%    \begin{macrocode}
           \@namedef{extrasnswissgerman}{%
              \@nameuse{@extrasgerman}%
           }
           \@namedef{extras\CurrentOption}{%
              \@nameuse{extrasnswissgerman}%
           }
        \fi
     \fi
  \fi
\fi
%    \end{macrocode}
%   \end{macro}
%   \end{macro}
% Register spelling state:
%    \begin{macrocode}
\ifbbl@german@tradspelling
    \expandafter\addto\csname extras\CurrentOption\endcsname{%
        \bbl@german@tradspellingtrue}
\else
    \expandafter\addto\csname extras\CurrentOption\endcsname{%
        \bbl@german@tradspellingfalse}
\fi
%    \end{macrocode}
%
%   \changes{Version 2.9a=Version 2.10}{2018/03/28}{Implement boolean switch
%            \cs{tosstrue}\slash\cs{tossfalse} to customize \graph{\ss}-related
%            shorthands in Swiss Standard German context.}
%   \changes{Version 2.9a=Version 2.10}{2018/03/28}{Implement modifier \BGopt{toss}
%            to customize \graph{\ss}-related shorthands in Swiss Standard German context.}
%   \begin{macro}{toss}
%    For Swiss Standard German, we allow optionally to expand the \graph{\ss}-related
%    shorthands the Swiss way, i.\,e. as \graph{ss} (globally, if the modifier or
%    variety option \BGopt{toss} is used or locally if |\tosstrue|).
%    \begin{macrocode}
\newif\ifbbl@toss\bbl@tossfalse
\def\bbl@tmpa{german-ch-1901}
%    \end{macrocode}
%    First, query the modifiers for 1901 Swiss German:
%    \begin{macrocode}
\ifx\CurrentOption\bbl@tmpa
  \expandafter\let\expandafter\bbl@mod@swissgerman\csname bbl@mod@\bbl@tmpa\endcsname
\fi
\def\bbl@tmpa{german-switzerland-1901}
\ifx\CurrentOption\bbl@tmpa
  \expandafter\let\expandafter\bbl@mod@swissgerman\csname bbl@mod@\bbl@tmpa\endcsname
\fi
\ifx\bbl@mod@swissgerman\@undefined\else
  \@expandtwoargs\in@{,toss,}{,\bbl@mod@swissgerman,}
  \ifin@
    \tosstrue
  \fi
\fi
%    \end{macrocode}
%   \end{macro}
%   \begin{macro}{\ntosstrue}
%   \begin{macro}{\ntossfalse}
%  Now to 1996 Swiss German.
%  For backwards compatibility reasons, we also still provide |\ntosstrue|
%  which had been promoted in earlier versions of \babelde.
%    \begin{macrocode}
\newif\ifntoss\ntossfalse
\newif\ifbbl@ntoss\bbl@ntossfalse
\def\bbl@tmpa{german-ch}
%    \end{macrocode}
%    Again, query the modifiers for 1996 Swiss German:
%    \begin{macrocode}
\ifx\CurrentOption\bbl@tmpa
  \expandafter\let\expandafter\bbl@mod@nswissgerman\csname bbl@mod@\bbl@tmpa\endcsname
\fi
\def\bbl@tmpa{german-switzerland}
\ifx\CurrentOption\bbl@tmpa
  \expandafter\let\expandafter\bbl@mod@nswissgerman\csname bbl@mod@\bbl@tmpa\endcsname
\fi
\ifx\bbl@mod@nswissgerman\@undefined\else
  \@expandtwoargs\in@{,toss,}{,\bbl@mod@nswissgerman,}
  \ifin@
    \tosstrue
  \fi
\fi 
%    \end{macrocode}
%    Now set |extras<lang>| for Swiss German (1901 and 1996) to consider toss setting.
%    Also set toss at document begin if one of these is main language.
%    This all needs to be done at document begin when we have the options set:
%    \begin{macrocode}
\AtBeginDocument{%
   \edef\bbl@tmpa{\localeinfo*{language.tag.bcp47}}%
   \edef\bbl@tmpb{de}%
   \ifx\bbl@tmpa\bbl@tmpb
       \edef\bbl@tmpa{\localeinfo*{region.tag.bcp47}}%
       \ifx\bbl@tmpa\bbl@german@region@ch
          \ifntoss
             \bbl@tosstrue
          \else
             \iftoss
                 \bbl@tosstrue
             \else
                 \bbl@tossfalse
             \fi
          \fi
       \fi
   \fi
  \ifdefined\extrasswissgerman
    \addto\extrasswissgerman{%
      \iftoss\bbl@tosstrue\else\bbl@tossfalse\fi}%
  \fi
  \ifdefined\extrasnswissgerman
      \addto\extrasnswissgerman{%
          \ifntoss
             \bbl@tosstrue
          \else
              \iftoss
                 \bbl@tosstrue
             \else
                 \bbl@tossfalse
             \fi
           \fi
      }%
   \fi
}
%    \end{macrocode}
%   \end{macro}
%   \end{macro}
%
%   \begin{macro}{capsz}
%   \changes{Version 2.9e=Version 2.14}{2024/01/19}{Implement modifier \BGopt{capsz}
%            to use capital eszett letter in Austrian and German varieties if possible.}
%   \changes{Version 2.9f=Version 2.15}{2024/12/10}{Implement modifier \BGopt{nocapsz}
%            to deactivate global capital eszett casing in Austrian and German varieties.
%            Global settings are now adhered to if no modifier is used.}
%   \changes{Version 2.9g=Version 2.99}{2025/12/24}{Fix setting of \BGopt{capsz}
%             and \BGopt{toss} for main language.}
%    For German and Austrian Standard German, we allow optionally to uppercase \graph{\ss}
%    with the capital eszett letter rather as \graph{SS} if the font provides the glyph
%    (if the modifier or variety option \BGopt{capsz} is used).
%    \begin{macrocode}
\newif\ifnocapsz\nocapszfalse
\newif\ifbbl@capsz\bbl@capszfalse
%    \end{macrocode}
%    Save current casing, since it needs to be reset afterwards (this is important
%    particularly if casing had been altered externally, e.g. via \cs{babelprovide}).
%    \begin{macrocode}
\ifdefined\casing@german
  \let\save@casing@german\casing@german
\else
  \xdef\save@casing@german{de}
\fi
\ifdefined\casing@ngerman
  \let\save@casing@ngerman\casing@ngerman
\else
  \xdef\save@casing@ngerman{de}
\fi
\ifdefined\casing@naustrian
  \let\save@casing@naustrian\casing@naustrian
\else
  \xdef\save@casing@naustrian{de}
\fi
%    \end{macrocode}
%    Now query the modifiers for 1996 German:
%    \begin{macrocode}
\def\bbl@tmpa{german-de}
\ifx\CurrentOption\bbl@tmpa
  \expandafter\let\expandafter\bbl@mod@ngerman\csname bbl@mod@\bbl@tmpa\endcsname
\fi
\def\bbl@tmpa{german-germany}
\ifx\CurrentOption\bbl@tmpa
  \expandafter\let\expandafter\bbl@mod@ngerman\csname bbl@mod@\bbl@tmpa\endcsname
\fi
\ifx\bbl@mod@ngerman\@undefined\else
  \@expandtwoargs\in@{,capsz,}{,\bbl@mod@ngerman,}
  \ifin@
    \capsztrue
  \fi
  \@expandtwoargs\in@{,nocapsz,}{,\bbl@mod@ngerman,}
  \ifin@
    \nocapsztrue
  \fi
\fi
%    \end{macrocode}
%    and 1996 Austrian:
%    \begin{macrocode}
\newif\if@bbl@german@naustrian
\@bbl@german@naustrianfalse
\def\bbl@tmpa{german-at}
\ifx\CurrentOption\bbl@tmpa
  \@bbl@german@naustriantrue
  \expandafter\let\expandafter\bbl@mod@naustrian\csname bbl@mod@\bbl@tmpa\endcsname
\fi
\def\bbl@tmpa{german-austria}
\ifx\CurrentOption\bbl@tmpa
  \@bbl@german@naustriantrue
  \expandafter\let\expandafter\bbl@mod@naustrian\csname bbl@mod@\bbl@tmpa\endcsname
\fi
\ifx\bbl@mod@naustrian\@undefined\else
  \@expandtwoargs\in@{,capsz,}{,\bbl@mod@naustrian,}
  \ifin@
    \@bbl@german@at@capsztrue
  \fi
  \@expandtwoargs\in@{,nocapsz,}{,\bbl@mod@naustrian,}
  \ifin@
    \nocapsztrue
  \fi
\fi
%    \end{macrocode}
%    We also do it for \Lopt{german} for the case of it meaning 1996:
%    \begin{macrocode}
\ifx\bbl@mod@german\@undefined\else
  \@expandtwoargs\in@{,capsz,}{,\bbl@mod@german,}
  \ifin@
    \@bbl@german@ge@capsztrue
  \fi
  \@expandtwoargs\in@{,nocapsz,}{,\bbl@mod@german,}
  \ifin@
    \nocapsztrue
  \fi
\fi
%    \end{macrocode}
%
%    Now set |extras<lang>| for 1996 Austrian and German to consider caps setting.
%    Also set caps at document begin if one of these is main language:
%    \begin{macrocode}
\AtBeginDocument{%
   \iflanguage{ngerman}{%
       \edef\bbl@tmpa{\localeinfo*{region.tag.bcp47}}%
       \ifx\bbl@tmpa\bbl@german@region@ch\else
          \ifcapsz\bbl@capsztrue\bbl@csarg\xdef{casing@\languagename}{de-x-eszett}\fi
       \fi
   }{%
      \ifbbl@german@newterms
        \edef\bbl@tmpa{\localename}%
        \ifx\bbl@tmpa\bbl@opt@german
          \ifcapsz\bbl@capsztrue\bbl@csarg\xdef{casing@\languagename}{de-x-eszett}\fi
        \fi
      \fi
   }%
   \ifdefined\extrasngerman
     \addto\extrasngerman{%
        \ifcapsz\bbl@capsztrue\bbl@csarg\xdef{casing@ngerman}{de-x-eszett}%
         \else\ifnocapsz\bbl@csarg\xdef{casing@ngerman}{de}\fi\bbl@capszfalse\fi}%
   \fi
   \ifbbl@german@newterms
      \ifdefined\extrasgerman
          \addto\extrasgerman{%
            \if@bbl@german@ge@capsz\bbl@capsztrue\bbl@csarg\xdef{casing@german}{de-x-eszett}%
             \else\ifnocapsz\bbl@csarg\xdef{casing@german}{de}\fi\bbl@capszfalse\fi}%
        \fi
   \fi
}
\if@bbl@german@naustrian
  \AtBeginDocument{%
     \addto\extrasnaustrian{%
         \if@bbl@german@at@capsz\bbl@capsztrue\bbl@csarg\xdef{casing@naustrian}{de-x-eszett}%
         \else\ifnocapsz\bbl@csarg\xdef{casing@naustrian}{de}\fi\bbl@capszfalse\fi}%
  }
\fi
%    \end{macrocode}
%   \end{macro}
%
%  \begin{macro}{\@noextrasgerman}
% \changes{Version 2.6i}{1999/12/16}{Deactivate shorthands outside of
%    German.}
% \changes{Version 2.7}{2013/12/13}{Deactivate shorthands also outside of
%    \Lopt{austrian} and \Lopt{swissgerman}.}
% \changes{Version 2.6a}{1995/02/15}{All the code to handle the active
%    double quote has been moved to \file{babel.def}}
%    The macro |\@noextrasgerman| holds all the default noextras setting.
%    This is an internal macro that is inherited and modified by the following
%    macros for the respective language varieties.
%    \begin{macrocode}
\@namedef{@noextrasgerman}{%
%    \end{macrocode}
%    First, we deactivate the \texttt{"} character and thus turn the shorthands
%    off again outside of the respective variety:
%    \begin{macrocode}
   \bbl@deactivate{"}%
%    \end{macrocode}
% \changes{Version 2.7}{2013/12/13}{Do not use \cs{@namedef} when
%    \cs{noextras} is already defined and should not be overwritten.}
%    Also, undo redefinition of umlaut accent macro |\"| to lower the umlaut dots,
%    \begin{macrocode}
   \umlauthigh
%    \end{macrocode}
%    and turn off |\frenchspacing|:
%    \begin{macrocode}
   \bbl@nonfrenchspacing
}
%    \end{macrocode}
%   \end{macro}
%
%    Depending on the option with which the language definition file
%    has been loaded, a respective |\noextras*| macro is defined.
%    Each of those is identical: it simply inherits |\@noextrasgerman|.
%    However, the traditional names (\Lopt{german}, \Lopt{ngerman}, \Lopt{austrian},
%    \Lopt{naustrian}, \Lopt{swissgerman}, and \Lopt{nswissgerman}) are used as an
%    intermediate layer, so redefining those will also redefine
%    the newer aliases.
%  \begin{macro}{\noextrasgerman}
%  First, the legacy |noextras| macro for pre-1996 German German:
%    \begin{macrocode}
\ifx\CurrentOption\bbl@opt@german
  \@namedef{noextrasgerman}{%
      \@nameuse{@noextrasgerman}%
  }
\else
%    \end{macrocode}
%   \end{macro}
%  \begin{macro}{\noextrasngerman}
%  Then, the legacy |noextras| macro for post-1996 German German:
%    \begin{macrocode}
  \ifx\CurrentOption\bbl@opt@ngerman
    \@namedef{noextrasngerman}{%
        \@nameuse{@noextrasgerman}%
    }
  \else
%    \end{macrocode}
%   \end{macro}
%  \begin{macro}{\noextrasgerman-de-1901}
%  \begin{macro}{\noextrasgerman-germany-1901}
% Now newer alias names for pre-1996 German German:
%    \begin{macrocode}
    \ifx\bbl@german@region\bbl@german@region@de
       \ifbbl@german@tradspelling
          \@namedef{noextrasgerman}{%
             \@nameuse{@noextrasgerman}%
          }
          \@namedef{noextras\CurrentOption}{%
             \@nameuse{noextrasgerman}%
          }
       \else
%    \end{macrocode}
%   \end{macro}
%   \end{macro}
%  \begin{macro}{\noextrasgerman-de}
%  \begin{macro}{\noextrasgerman-germany}
%  and post-1996 German German:
%    \begin{macrocode}
         \@namedef{noextrasngerman}{%
            \@nameuse{@noextrasgerman}%
         }
         \@namedef{noextras\CurrentOption}{%
            \@nameuse{noextrasngerman}%
         }
       \fi
    \fi
  \fi
\fi
%    \end{macrocode}
%   \end{macro}
%   \end{macro}
%    Now deactivate casing if needed:
%    \begin{macrocode}
\ifdefined\noextrasgerman
  \if@bbl@german@ge@capsz
    \addto\noextrasgerman{%
        \bbl@capszfalse\bbl@csarg\xdef{casing@german}{\save@casing@german}}
  \fi
\fi
\ifdefined\noextrasngerman
  \ifbbl@capsz
    \addto\noextrasngerman{%
        \bbl@capszfalse\bbl@csarg\xdef{casing@ngerman}{\save@casing@ngerman}}
  \fi
\fi
%    \end{macrocode}
%  \begin{macro}{\noextrasaustrian}
%  Same for Autrian: first, the legacy |noextras| macro for pre-1996 Austrian German:
%    \begin{macrocode}
\def\bbl@tmpa{austrian}
\def\bbl@tmpb{naustrian}
\ifx\CurrentOption\bbl@tmpa
  \@namedef{noextrasaustrian}{%
      \@nameuse{@noextrasgerman}%
  }
\else
%    \end{macrocode}
%   \end{macro}
%  \begin{macro}{\noextrasnaustrian}
%  Then, the legacy |noextras| macro for post-1996 Austrian German:
%    \begin{macrocode}
  \ifx\CurrentOption\bbl@tmpb
    \@namedef{noextrasnaustrian}{%
      \@nameuse{@noextrasgerman}%
    }
  \else
%    \end{macrocode}
%   \end{macro}
%  \begin{macro}{\noextrasgerman-at-1901}
%  \begin{macro}{\noextrasgerman-austria-1901}
% Now newer alias names for pre-1996 Austrian German:
%    \begin{macrocode}
     \ifx\bbl@german@region\bbl@german@region@at
        \ifbbl@german@tradspelling
           \@namedef{noextrasaustrian}{%
              \@nameuse{@noextrasgerman}%
           }
           \@namedef{noextras\CurrentOption}{%
              \@nameuse{noextrasaustrian}%
           }
        \else
%    \end{macrocode}
%   \end{macro}
%   \end{macro}
%  \begin{macro}{\noextrasgerman-at}
%  \begin{macro}{\noextrasgerman-austria}
%  Then, the newer |noextras| macro for post-1996 Austrian German:
%    \begin{macrocode}
           \@namedef{noextrasnaustrian}{%
              \@nameuse{@noextrasgerman}%
           }
           \@namedef{noextras\CurrentOption}{%
              \@nameuse{noextrasnaustrian}%
           }
        \fi
     \fi
  \fi
\fi
%    \end{macrocode}
%   \end{macro}
%   \end{macro}
%  Also de-activate casing if needed:
%    \begin{macrocode}
\if@bbl@german@naustrian
  \if@bbl@german@at@capsz
     \addto\noextrasnaustrian{%
         \bbl@capszfalse\bbl@csarg\xdef{casing@naustrian}{\save@casing@naustrian}}
  \fi
\fi
%    \end{macrocode}
%  \begin{macro}{\noextrasswissgerman}
%    \changes{Version 2.7}{2013/12/13}{Added \cs{noextrasswissgerman} and \cs{noextrasnswissgerman}.}
%  Finally, same for Swiss German; first, the legacy |noextras| macros for pre-1996 Swiss German:
%    \begin{macrocode}
\ifx\CurrentOption\bbl@opt@swissgerman
  \@namedef{noextrasswissgerman}{%
      \@nameuse{@noextrasgerman}%
  }
\else
%    \end{macrocode}
%   \end{macro}
%  \begin{macro}{\noextrasnswissgerman}
%  Then, the legacy |noextras| macro for post-1996 Swiss German:
%    \begin{macrocode}
  \def\bbl@tmpa{nswissgerman}
  \ifx\CurrentOption\bbl@tmpa
    \@namedef{noextrasnswissgerman}{%
       \@nameuse{@noextrasgerman}%
    }
  \else
%    \end{macrocode}
%   \end{macro}
%  \begin{macro}{\noextrasgerman-ch-1901}
%  \begin{macro}{\noextrasgerman-switzerland-1901}
% Now newer alias names for pre-1996 Swiss German:
%    \begin{macrocode}
     \ifx\bbl@german@region\bbl@german@region@ch
        \ifbbl@german@tradspelling
           \@namedef{noextrasswissgerman}{%
              \@nameuse{@noextrasgerman}%
           }
           \@namedef{noextras\CurrentOption}{%
              \@nameuse{noextrasswissgerman}%
           }
        \else
%    \end{macrocode}
%   \end{macro}
%   \end{macro}
%  \begin{macro}{\noextrasgerman-ch}
%  \begin{macro}{\noextrasgerman-switzerland}
%  Then, the newer |noextras| macro for post-1996 Swiss German:
%    \begin{macrocode}
           \@namedef{noextrasnswissgerman}{%
              \@nameuse{@noextrasgerman}%
           }
           \@namedef{noextras\CurrentOption}{%
              \@nameuse{noextrasnswissgerman}%
           }
        \fi
     \fi
  \fi
\fi
%    \end{macrocode}
%   \end{macro}
%   \end{macro}
%
% For the Swiss varieties, we need to deactivate |\toss|.
%    \begin{macrocode}
\ifx\bbl@german@region\bbl@german@region@ch
  \expandafter\addto\csname noextras\CurrentOption\endcsname{%
    \bbl@tossfalse}
\fi
%    \end{macrocode}
%
%    The German hyphenation patterns can be used with |\lefthyphenmin|
%    and |\righthyphenmin| set to~2.
% \changes{Version 2.6a}{1995/05/13}{use \cs{germanhyphenmins} to store
%    the correct values}
% \changes{Version 2.6j}{2000/09/22}{Now use \cs{providehyphenmins} to
%    provide a default value}
%    \begin{macrocode}
\providehyphenmins{\CurrentOption}{\tw@\tw@}
%    \end{macrocode}
%
%
%    \subsection{Active Characters, Macros, and Shorthands}
%
%    The following code is necessary because we need an extra active
%    character. This character is then used as indicated in
%    \prettyref{tab:german-quote}.
%
%    In order to be able to define the function of |"|, we first define a
%    couple of `support' macros.
%
% \changes{Version 2.3e}{1991/11/10}{Added \cs{save@sf@q} macro and
%    rewrote all quote macros to use it}
% \changes{Version 2.3h}{1991/02/16}{moved definition of
%    \cs{allowhyphens}, \cs{set@low@box} and \cs{save@sf@q} to
%    \file{babel.com}}
% \changes{Version 2.6a}{1995/02/15}{Moved all quotation characters to
%    \file{glyphs.dtx}}
%
%  \begin{macro}{\dq}
%    We save the original double quotation mark character in |\dq| to keep
%    it available, the math accent |\"| can now be typed as |"|.
%
%    Furthermore, we define some helper macros for contextual \graph{\ss} handling.
%    \begin{macrocode}
\begingroup \catcode`\"12
\def\x{\endgroup
  \def\dq{"}
  \def\@SS{\mathchar"7019 }
  \def\bbl@ss{\ifbbl@toss ss\else\textormath{\ss}{\@SS{}}\fi}
  \def\bbl@SS{{\ifbbl@capsz\MakeUppercase{\ss}\else SS\fi}}
  \def\bbl@sz{\ifbbl@toss sz\else\textormath{\ss}{\@SS{}}\fi}
  \def\bbl@SZ{SZ}
}
\x
%    \end{macrocode}
%  \end{macro}
% \changes{Version 2.6c}{1996/01/24}{Moved \cs{german@dq@disc} to
%    babel.def, calling it \cs{bbl@disc}}
%
% \changes{Version 2.6a}{1995/02/15}{Use \cs{ddot} instead of
%    \cs{@MATHUMLAUT}}
%
%    Since we need to add special cases for hyperref which needs hyperref's |\texorpdfstring|,
%    we provide a dummy command for the case that hyperref is not loaded.
% \changes{Version 2.9c=Version 2.12}{2020/07/21}{Properly handle shorthands in hyperref pdf strings}
%    \begin{macrocode}
\providecommand\texorpdfstring[2]{#1}
%    \end{macrocode}
%
%  \begin{macro}{\bbl@german@allowhyphenationbefore}
%   \changes{Version 2.9g=Version 2.99}{2026/01/06}{Add macro}
%  \begin{macro}{\bbl@german@allowhyphenationafter}
%   \changes{Version 2.9g=Version 2.99}{2026/01/06}{Add macro}
%   We also define two helper commands to allow hyphenation before and after
%   a character as defined in shorthands. These are similar to \babel's
%   \cs{bbl@allowhyphens} but differentiate the position:
%    \begin{macrocode}
\def\bbl@german@allowhyphenationbefore{\ifvmode\else\nobreak\fi}
\def\bbl@german@allowhyphenationafter{\nobreak\hskip\z@skip}
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%
%   Now we can define the doublequote shorthands: the umlauts,
% \changes{Version 2.6c}{1996/05/30}{added the \cs{allowhyphens}}
% \changes{Version 2.9g=Version 2.99}{2026/01/06}{Check for vmode before all relevant shorthands}
%    \begin{macrocode}
\declare@shorthand{german}{"a}{\textormath{\"{a}}{\ddot a}}
\declare@shorthand{german}{"o}{\textormath{\"{o}}{\ddot o}}
\declare@shorthand{german}{"u}{\textormath{\"{u}}{\ddot u}}
\declare@shorthand{german}{"A}{\textormath{\"{A}}{\ddot A}}
\declare@shorthand{german}{"O}{\textormath{\"{O}}{\ddot O}}
\declare@shorthand{german}{"U}{\textormath{\"{U}}{\ddot U}}
%    \end{macrocode}
%    tremata,
%    \begin{macrocode}
\declare@shorthand{german}{"e}{\textormath{\"{e}}{\ddot e}}
\declare@shorthand{german}{"E}{\textormath{\"{E}}{\ddot E}}
\declare@shorthand{german}{"i}{\textormath{\"{\i}}%
                              {\ddot\imath}}
\declare@shorthand{german}{"I}{\textormath{\"{I}}{\ddot I}}
%    \end{macrocode}
%    German \graph{\ss},
% \changes{Version 2.6f}{1997/05/08}{use \cs{SS} instead of
%    \texttt{SS}, removed braces after \cs{ss}} 
%    \begin{macrocode}
\declare@shorthand{german}{"s}{\bbl@ss}
\declare@shorthand{german}{"S}{\bbl@SS}
\declare@shorthand{german}{"z}{\bbl@sz}
\declare@shorthand{german}{"Z}{\bbl@SZ}
%    \end{macrocode}
%    German and French/Swiss quotation marks,
%    \begin{macrocode}
\declare@shorthand{german}{"`}{\glqq}
\declare@shorthand{german}{"'}{\grqq}
\declare@shorthand{german}{"<}{\flqq}
\declare@shorthand{german}{">}{\frqq}
%    \end{macrocode}
%  \begin{macro}{\bbl@german@disc}
%   \changes{Version 2.9g=Version 2.99}{2026/01/06}{Add macro}
%   \changes{Version 2.9h=Version 2.99b}{2026/01/25}{Simplify}
%   \changes{Version 2.9h=Version 2.99b}{2026/01/25}{Fix math mode for 1996 orthography}
%    and discretionary commands. Here we discriminate contemporary (post-1996)
%    German from pre-1996 German (due to the hyphenation specifics).
%    In the macro, \verb|#1| is what is output for 1901 spelling in unhyphenated
%    context (incl. math), \verb|#2| is printed before the hyphen in hyphenated
%    context. \verb|#3| is printed in 1996 spelling in all contexts.
%    \begin{macrocode}
\def\bbl@german@disc#1#2#3{%
  \ifbbl@german@tradspelling
%    \end{macrocode}
%    For pre-1996 spelling, we apply ck->k-k hyphenation for |"ck|
%    and |"CK|, or the three-consonant rule (e.g., ll -> ll-l)
%    for the other relevant shorthands. Therefore, \verb|#2|
%    is output if a hyphenation follows, otherwise \verb|#1|:
%    \begin{macrocode}
    \textormath{%
      \bbl@german@allowhyphenationbefore\discretionary{#2-}{}{#1}%
      \bbl@german@allowhyphenationafter
%    \end{macrocode}
%    No hyphenation in math, so unconditionally go for \verb|#1|:
%    \begin{macrocode}
    }{#1}% math
  \else
%    \end{macrocode}
%    For post-1996 spelling, we simply output \graph{c} or \graph{C} for |"c| and |"C|,
%    or the two consonants in all contexts (passed as \verb|#3|):
%    \begin{macrocode}
    #3%
  \fi
}
%    \end{macrocode}
%   \end{macro}
%    And here are the actual shorthands for these 1901 specifics:
% \changes{Version 2.6f}{1998/06/15}{Copied the coding for \texttt{"f}
%    from german.dtx version 2.5d} 
% \changes{Version 2.9g=Version 2.99}{2025/12/21}{Remove special coding for \texttt{"f}
%    which is broken and not needed (ff ligatures are preserved with
%    the standard \cs{bbl@german@disc} routine).}
%    \begin{macrocode}
\declare@shorthand{german}{"c}{\bbl@german@disc{c}{k}{c}}
\declare@shorthand{german}{"C}{\bbl@german@disc{C}{K}{C}}
\declare@shorthand{german}{"f}{\bbl@german@disc{f}{ff}{ff}}
\declare@shorthand{german}{"F}{\bbl@german@disc{F}{FF}{FF}}
\declare@shorthand{german}{"l}{\bbl@german@disc{l}{ll}{ll}}
\declare@shorthand{german}{"L}{\bbl@german@disc{L}{LL}{LL}}
\declare@shorthand{german}{"m}{\bbl@german@disc{m}{mm}{mm}}
\declare@shorthand{german}{"M}{\bbl@german@disc{M}{MM}{MM}}
\declare@shorthand{german}{"n}{\bbl@german@disc{n}{nn}{nn}}
\declare@shorthand{german}{"N}{\bbl@german@disc{N}{NN}{NN}}
\declare@shorthand{german}{"p}{\bbl@german@disc{p}{pp}{pp}}
\declare@shorthand{german}{"P}{\bbl@german@disc{P}{PP}{PP}}
\declare@shorthand{german}{"r}{\bbl@german@disc{r}{rr}{rr}}
\declare@shorthand{german}{"R}{\bbl@german@disc{R}{RR}{RR}}
\declare@shorthand{german}{"t}{\bbl@german@disc{t}{tt}{tt}}
\declare@shorthand{german}{"T}{\bbl@german@disc{T}{TT}{TT}}
%    \end{macrocode}
%   Furthermore, and for contemporary orthography as well, we define some additional useful shorthands
%   (hyphenation, line breaking and ligature control):
% \changes{Version 2.9}{2016/11/02}{Add \texttt{"/} shortcut for breakable slash
%                                   (taken from \file{dutch.ldf})}
% \changes{Version 2.9b=Version 2.11}{2018/12/08}{Fix old hyphenation regression introduced with \babel\ 3.7
%                                     (2002) in a number of shorthands (change of meaning of \cs{allowhyphens}
%                                     vs. \cs{bbl@allowhyphens})}
% \changes{Version 2.9g=Version 2.99}{2026/01/06}{Charge \cs{exhyphenpenalty} when needed with shorthands}
% \changes{Version 2.9g=Version 2.99}{2026/01/08}{Let \texttt{"/} output a slash in math mode as well}
% \changes{Version 3.0}{2026/02/13}{Remove unnecessary \cs{texorpdfstring} from \texttt{"\textasciitilde}}
%    \begin{macrocode}
\declare@shorthand{german}{"-}{%
    \bbl@german@allowhyphenationbefore\-\bbl@german@allowhyphenationafter
}
\declare@shorthand{german}{"|}{%
  \texorpdfstring{%
    \textormath{% text
      \bbl@german@allowhyphenationbefore\discretionary{-}{}{\kern.03em}%
      \bbl@german@allowhyphenationafter
    }{}% math
  }{}% PDF string
}
\declare@shorthand{german}{""}{%
  \bbl@german@allowhyphenationbefore\discretionary{}{}{}%
  \bbl@german@allowhyphenationafter
}
\declare@shorthand{german}{"~}{%
  \textormath{% text
    \bbl@german@allowhyphenationbefore\mbox{-}%
    \bbl@german@allowhyphenationafter
  }{-}% math
}
\declare@shorthand{german}{"=}{%
   \bbl@german@allowhyphenationbefore-\bbl@german@allowhyphenationafter
}
\declare@shorthand{german}{"/}{%
  \bbl@german@allowhyphenationbefore/\discretionary{}{}{}%
  \bbl@german@allowhyphenationafter
}
%    \end{macrocode}
%  a shorthand for abbreviation dots:
%  \changes{Version 3.3}{2026/04/10}{Add \texttt{".} shorthand}
%    \begin{macrocode}
\declare@shorthand{german}{".}{%
  \leavevmode\ifdim\lastskip>\z@\unskip\fi
  .\bbl@german@abbrv@space\ignorespaces
}
%    \end{macrocode}
%  and some shorthands to support gender-sensitive spelling:
%  \changes{Version 2.9e=Version 2.14}{2024/01/19}{Add \texttt{"*}, \texttt{":}, \texttt{"\_}, and \texttt{"x}
%                                     shorthands to support gender-sensitive writing}
%    \begin{macrocode}
\declare@shorthand{german}{":}{%
  \bbl@german@allowhyphenationbefore:\bbl@german@allowhyphenationafter
}
\declare@shorthand{german}{"*}{%
  \bbl@german@allowhyphenationbefore*\bbl@german@allowhyphenationafter
}
\declare@shorthand{german}{"_}{%
  \bbl@german@allowhyphenationbefore\_\bbl@german@allowhyphenationafter
}
\declare@shorthand{german}{"x}{%
  \bbl@german@allowhyphenationbefore\mkgender\bbl@german@allowhyphenationafter
}
%    \end{macrocode}
%
%  \subsection{Compatibility of External Packages}
%
%  \begin{macro}{\mdqon}
%  \begin{macro}{\mdqoff}
%  \begin{macro}{\ck}
%    We define a couple of commands for reasons of compatibility with \file{german.sty} and \file{ngerman.sty}.
% \changes{Version 2.6f}{1998/06/07}{Now use \cs{shorthandon} and
%    \cs{shorthandoff}}
% \changes{Version 2.9h=Version 2.99b}{2026/01/25}{Fix definition}
%    \begin{macrocode}
\def\mdqon{\shorthandon{"}}
\def\mdqoff{\shorthandoff{"}}
\def\ck{%
  \ifbbl@german@tradspelling
    \bbl@german@allowhyphenationbefore\discretionary{k-}{k}{ck}%
    \bbl@german@allowhyphenationafter
  \else
    ck%
  \fi
}
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%
%  \begin{macro}{\bbl@mk@class@alias}
%  For external packages that rely on legacy option names, we provide
%  a method to transmit those (in addition to newer ones) in the global
%  options list.
% \changes{Version 2.9i=Version 2.99c}{2026/02/13}{Fix class options patching}
%    \begin{macrocode}
\def\bbl@mk@class@alias#1{%
  \def\bbl@class@alias{#1}%
  \def\bbl@tmp@classoptionslist{}%
  \bbl@foreach\@raw@classoptionslist{%
    \def\bbl@tmpa{##1}%
    \ifx\bbl@tmp@classoptionslist\@empty\else
       \edef\bbl@tmp@classoptionslist{%
         \bbl@tmp@classoptionslist,}%
    \fi
    \ifx\CurrentOption\bbl@tmpa
      \edef\bbl@tmp@classoptionslist{%
        \bbl@tmp@classoptionslist\zap@space\bbl@class@alias,##1 \@empty}%
    \else
      \edef\bbl@tmp@classoptionslist{%
        \bbl@tmp@classoptionslist\zap@space##1 \@empty}%
    \fi
  }%
  \let\@raw@classoptionslist\bbl@tmp@classoptionslist
  \def\bbl@tmp@classoptionslist{}%
  \bbl@foreach\@classoptionslist{%
     \def\bbl@tmpa{##1}%
     \ifx\bbl@tmp@classoptionslist\@empty\else
       \edef\bbl@tmp@classoptionslist{%
         \bbl@tmp@classoptionslist,}%
     \fi
     \ifx\CurrentOption\bbl@tmpa
        \edef\bbl@tmp@classoptionslist{%
          \bbl@tmp@classoptionslist\zap@space\bbl@class@alias,##1 \@empty}%
     \else
        \edef\bbl@tmp@classoptionslist{%
          \bbl@tmp@classoptionslist\zap@space##1 \@empty}%
     \fi
  }%
  \let\@classoptionslist\bbl@tmp@classoptionslist
%    \end{macrocode}
%  For biblatex, we also adopt \cs{bbl@main@language} locally:
%    \begin{macrocode}
  \AddToHook{package/biblatex/after}{%
    \let\bbl@german@mkautolangbabel\blx@mkautolangbabel
    \def\blx@mkautolangbabel{%
      \let\bbl@main@language\bbl@class@alias
      \bbl@german@mkautolangbabel
    }%
  }%
}
%    \end{macrocode}
%  \end{macro}
%
%    The macro |\ldf@finish| takes care of looking for a
%    configuration file, setting the main language to be switched on
%    at |\begin{document}| and resetting the category code of
%    \texttt{@} to its original value.
% \changes{Version 2.6d}{1996/11/02}{Now use \cs{ldf@finish} to wrap
%    up} 
%    \begin{macrocode}
\ldf@finish\CurrentOption
%    \end{macrocode}
% \iffalse
%</gbdef>
% \fi
%
%
%  \subsection{Portmanteau \file{*.ldf} Files}
%
% \changes{Version 2.7}{2013/12/13}{Generate portmanteau files \file{austrian.ldf},
%            \file{german.ldf} and \file{swissgerman.ldf}.}
% \changes{Version 2.9g=Version 2.99}{2025/12/01}{Generate portmanteau files \file{german-de.ldf},
%            \file{german-germany.ldf}, \file{german-de-1901.ldf}, \file{german-germany-1901.ldf},
%            \file{german-at.ldf}, \file{german-austria.ldf}, \file{german-at-1901.ldf}, \file{german-austria-1901.ldf},
%            \file{german-ch.ldf}, \file{german-switzerland.ldf}, \file{german-ch-1901.ldf}, and \file{german-switzerland-1901.ldf}.}
%
%  \Babel\ expects a \file{\langvar{}.ldf} file for each \langvar. So we create portmanteau
%    ldf files for
%    \begin{itemize}\setlength{\itemsep}{0pt}
%    \item \file{german.ldf}
%    \item \file{german-de.ldf}
%    \item \file{german-germany.ldf}
%    \item \file{german-de-1901.ldf}
%    \item \file{german-germany-1901.ldf}
%    \item \file{german-at.ldf}
%    \item \file{german-austria.ldf}
%    \item \file{german-at-1901.ldf}
%    \item \file{german-austria-1901.ldf}
%    \item \file{german-ch.ldf}
%    \item \file{german-switzerland.ldf}
%    \item \file{german-ch-1901.ldf}
%    \item \file{german-switzerland-1901.ldf}
%    \end{itemize}
%    and the deprecated
%    \begin{itemize}\setlength{\itemsep}{0pt}
%    \item \Lopt{austrian}
%    \item \Lopt{ngerman}
%    \item \Lopt{swissgerman}
%    \item \Lopt{nswissgerman}
%    \end{itemize}
%    All these files themselves load \file{babel-german.def}, which does the real work, with the appropriate option.
%
% \iffalse
%<*!gbdef>
% \fi
%
% \changes{Version 2.9g=Version 2.99}{2025/12/01}{\Lopt{austrian}, \Lopt{naustrian}, \Lopt{ngerman}, \Lopt{nswissgerman}
%          and \Lopt{swissgerman} are deprecated in favour of \Lopt{german-at-1901}, \Lopt{german-at},
%          \Lopt{german-de}, \Lopt{german-ch}, and \Lopt{german-ch-1901}}
%  \iffalse
%  TODO: do not warn yet. Let the new scheme settle first.
%  For the deprecated options, add some deprecation warnings:
% \iffalse
%<*austrian>
% \fi
%    \begin{macrocode}
%\PackageWarning{babel-german}{Option `austrian' is deprecated!\MessageBreak
%                              Please use `german-at-1901' instead!}
%    \end{macrocode}
% \iffalse
%</austrian>
%<*naustrian>
% \fi
%    \begin{macrocode}
%\PackageWarning{babel-german}{Option `naustrian' is deprecated!\MessageBreak
%                              Please use `german-at' instead!}
%    \end{macrocode}
% \iffalse
%</naustrian>
%<*ngerman>
% \fi
%    \begin{macrocode}
%\PackageWarning{babel-german}{Option `ngerman' is deprecated!\MessageBreak
%                              Please use `german-de' instead!}
%    \end{macrocode}
% \iffalse
%</ngerman>
%<*nswissgerman>
% \fi
%    \begin{macrocode}
%\PackageWarning{babel-german}{Option `nswissgerman' is deprecated!\MessageBreak
%                              Please use `german-ch' instead!}
%    \end{macrocode}
% \iffalse
%</nswissgerman>
%<*swissgerman>
% \fi
%    \begin{macrocode}
%\PackageWarning{babel-german}{Option `swissgerman' is deprecated!\MessageBreak
%                              Please use `german-ch-1901' instead!}
%    \end{macrocode}
% \iffalse
%</swissgerman>
% \fi
% \fi
%
% \iffalse
%<*ngerman|naustrian|nswissgerman>
% \fi
%  With \Lopt{ngerman}, \Lopt{naustrian}, and \Lopt{nswissgerman},
%  we force german to 1901 with |glottonyms=auto|.
%  This is simply determined by the existence of the following macro:
%    \begin{macrocode}
\def\bbl@german@force@legacy{}
%    \end{macrocode}
% \iffalse
%</ngerman|naustrian|nswissgerman>
% \fi
% \iffalse
%<*!german&!austrian&!swissgerman&!ngerman&!naustrian&!nswissgerman>
% \fi
%  With the newer options, we load exptl hyphenation patterns by default.
%  This is determined by the existence of the following macro:
%    \begin{macrocode}
\def\bbl@german@xptl@patterns{}
%    \end{macrocode}
% \iffalse
%</!german&!austrian&!swissgerman&!ngerman&!naustrian&!nswissgerman>
% \fi
%
%    The macro |\LdfInit| takes care of preventing that each \file{*.ldf} file is
%    loaded more than once with the same option, checking the category
%    code of the \texttt{@} sign, etc.
% \changes{Version 2.6d}{1996/11/02}{Now use \cs{LdfInit} to perform
%    initial checks}
% \changes{Version 3.2}{2026/04/01}{Use date rather than captions in \cs{LdfInit} to perform
%    loading check, since \cs{captionsgerman} is defined for multiple options} 
%    \begin{macrocode}
\LdfInit\CurrentOption{date\CurrentOption}
%    \end{macrocode}
%
%  Track whether we have 1901 spelling:
%    \begin{macrocode}
\newif\ifbbl@german@tradspelling
%    \end{macrocode}
% \iffalse
%<*german|germande1901|germangermany1901|germanb>
% \fi
%  Set spelling and region params. First \Lopt{german}, \Lopt{germanb}, \Lopt{german-de-1901}
%  or \Lopt{german-germany-1901}:
%    \begin{macrocode}
\bbl@german@tradspellingtrue
\def\bbl@german@region{DE}
%    \end{macrocode}
% \iffalse
%</german|germande1901|germangermany1901|germanb>
% \fi
% \iffalse
%<*ngerman|germande|germangermany|ngermanb>
% \fi
%  Now, \Lopt{ngerman}, \Lopt{ngermanb}, \Lopt{german-de} or \Lopt{german-germany}:
%    \begin{macrocode}
\bbl@german@tradspellingfalse
\def\bbl@german@region{DE}
%    \end{macrocode}
% \iffalse
%</ngerman|germande|germangermany|ngermanb>
% \fi
% \iffalse
%<*austrian|germanat1901|germanaustria1901>
% \fi
%  Now, \Lopt{austrian}, \Lopt{german-at-1901} or \Lopt{german-austria-1901}:
%    \begin{macrocode}
\bbl@german@tradspellingtrue
\def\bbl@german@region{AT}
%    \end{macrocode}
% \iffalse
%</austrian|germanat1901|germanaustria1901>
% \fi
% \iffalse
%<*naustrian|germanat|germanaustria>
% \fi
%  Now, \Lopt{naustrian}, \Lopt{german-at} or \Lopt{german-austria}:
%    \begin{macrocode}
\bbl@german@tradspellingfalse
\def\bbl@german@region{AT}
%    \end{macrocode}
% \iffalse
%</naustrian|germanat|germanaustria>
% \fi
% \iffalse
%<*swissgerman|germanch1901|germanswitzerland1901>
% \fi
%  Now, \Lopt{swissgerman}, \Lopt{german-ch-1901} or \Lopt{german-switzerland-1901}:
%    \begin{macrocode}
\bbl@german@tradspellingtrue
\def\bbl@german@region{CH}
%    \end{macrocode}
% \iffalse
%</swissgerman|germanch1901|germanswitzerland1901>
% \fi
% \iffalse
%<*nswissgerman|germanch|germanswitzerland>
% \fi
%  And finally, \Lopt{nswissgerman}, \Lopt{german-ch} or \Lopt{german-switzerland}:
%    \begin{macrocode}
\bbl@german@tradspellingfalse
\def\bbl@german@region{CH}
%    \end{macrocode}
% \iffalse
%</nswissgerman|germanch|germanswitzerland>
% \fi
%  Now load the common file;
%    \begin{macrocode}
\input babel-german.def\relax
%    \end{macrocode}
% Finally, set legacy class options if needed:
% \iffalse
%<*germanat1901|germanaustria1901>
% \fi
%
% \noindent german-at-1901 and german-austria-1901,
%    \begin{macrocode}
\bbl@mk@class@alias{austrian}
%    \end{macrocode}
% \iffalse
%</germanat1901|germanaustria1901>
% \fi
% \iffalse
%<*germanat|germanaustria>
% \fi
% german-at and german-austria,
%    \begin{macrocode}
\bbl@mk@class@alias{naustrian}
%    \end{macrocode}
% \iffalse
%</germanat|germanaustria>
% \fi
% \iffalse
%<*germanch1901|germanswitzerland1901>
% \fi
% german-ch-1901 and german-switzerland-1901,
%    \begin{macrocode}
\bbl@mk@class@alias{swissgerman}
%    \end{macrocode}
% \iffalse
%</germanch1901|germanswitzerland1901>
% \fi
% \iffalse
%<*germanch|germanswitzerland>
% \fi
% german-ch and german-switzerland,
%    \begin{macrocode}
\bbl@mk@class@alias{nswissgerman}
%    \end{macrocode}
% \iffalse
%</germanch|germanswitzerland>
% \fi
% \iffalse
%<*germande1901|germangermany1901>
% \fi
% german-de-1901 and german-germany-1901,
%    \begin{macrocode}
\bbl@mk@class@alias{german}
%    \end{macrocode}
% \iffalse
%</germande1901|germangermany1901>
% \fi
% \iffalse
%<*germande|germangermangermany>
% \fi
% as well as german-de and german-germany
%    \begin{macrocode}
\bbl@mk@class@alias{ngerman}
%    \end{macrocode}
% \iffalse
%</germande|germangermangermany>
% \fi
% That's it! Fertig.
% \iffalse
%</!gbdef>
% \fi
%
%\PrintChanges
%
%  \begin{thebibliography}{10}
%    \setlength\itemsep{0pt}
%    \bibitem{vwb} Ammon, Ulrich, Hans Bickel \& Alexandra Lenz. 2026.
%       \emph{Variantenw\"orterbuch des Deutschen: Die Standardsprache in Österreich,
%	    der Schweiz, Deutschland, Liechtenstein, Luxemburg, Ostbelgien und Südtirol
%        sowie Rumänien, Namibia und Mennonitensiedlungen}.
%        2nd ed. Berlin, Boston: De Gruyter.
%    \bibitem{babel} Braams, Johannes and Bezos, Javier:
%       \emph{Babel}.
%       \url{http://www.ctan.org/pkg/babel}.
%    \bibitem{clyne} Clyne, Michael. 1991. German as a pluricentric language.
%        In \emph{Pluricentric Languages: Differing Norms in Different Nations},
%        ed. by Michael Clyne, 117--148. Berlin \& Boston: De Gruyter Mouton. 
%    \bibitem{duden91} Dudenredaktion. 1991. \emph{Duden: Die deutsche Rechtschreibung}.
%          20th ed. Mannheim: Bibliographisches Institut \& F.\,A. Brockhaus.
%    \bibitem{duden96} Dudenredaktion. 1996. \emph{Duden: Die deutsche Rechtschreibung}.
%          21th ed. Mannheim: Bibliographisches Institut \& F.\,A. Brockhaus. 
%    \bibitem{exptl} Deutschsprachige Trennmustermannschaft:
%       \emph{dehyph-exptl -- Experimental hyphenation patterns for the German language}.
%       \url{https://ctan.org/pkg/dehyph-exptl}.
%    \bibitem{johnson} Johnson, Sally. 2005. \emph{Spelling trouble: Language, ideology and the reform
%         of German orthography}. Clevedon: Multilingual Matters.
%    \bibitem{HP} Partl, Hubert. 1988.
%      \emph{German \TeX}, \emph{TUGboat} 9(1): 70--72.
%    \bibitem{gerdoc} Raichle, Bernd:
%       \emph{German}.
%       \url{http://www.ctan.org/pkg/german}.
%    \bibitem{hyph-utf8} P\'egouri\'e-Gonnard, Manuel et al.:
%      \emph{hyph-utf8 -- Hyphenation patterns expressed in UTF-8}.
%       \url{https://ctan.org/pkg/hyph-utf8}.
%    \bibitem{schmidt} Schmidt, Walter. 1998. \TeX\ und die neue deutsche Rechtschreibung.
%        \emph{Die \TeX nische Komödie} 10(2): 35--37.
%  \end{thebibliography}
%
% \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
