% \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{1783} % % \iffalse % Tell the \LaTeX\ system who we are and write an entry on the % transcript. %<*dtx> \ProvidesFile{babel-german.dtx} % %\ProvidesLanguage{austrian} %\ProvidesLanguage{german} %\ProvidesLanguage{german-at} %\ProvidesLanguage{german-at-1901} %\ProvidesLanguage{german-austria} %\ProvidesLanguage{german-austria-1901} %\ProvidesLanguage{german-ch} %\ProvidesLanguage{german-ch-1901} %\ProvidesLanguage{german-switzerland} %\ProvidesLanguage{german-switzerland-1901} %\ProvidesLanguage{german-de} %\ProvidesLanguage{german-de-1901} %\ProvidesLanguage{german-germany} %\ProvidesLanguage{german-germany-1901} %\ProvidesLanguage{swissgerman} %\ProvidesLanguage{germanb} %\ProvidesLanguage{naustrian} %\ProvidesLanguage{ngerman} %\ProvidesLanguage{swissgerman} %\ProvidesLanguage{ngermanb} %\fi %\ProvidesFile{babel-german.dtx} % [2026/01/24 v2.99 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=black, filecolor=Maroon, urlcolor=Maroon, citecolor=black } \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{#1}} \newcommand*\file[1]{\texttt{#1}} \newcommand*\newfeature[1]{% \leavevmode\vadjust{\smash{\llap{\parbox[t]{\marginparwidth}% {\raggedleft\footnotesize New feature\\in v.\,#1!}% \kern\marginparsep\hspace{3em}}}}% } \GlossaryMin = .33\textheight \begin{document} \DocInput{babel-german.dtx} \end{document} % %\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} % % \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 sec.~\ref{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/Alte 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/Alte 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 as of version 2.99. If you have been a user of \babelde\ before % that version, 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 section~\ref{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 mentioned 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}) % 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 terms \emph{german} and \emph{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 been used in \babel\ for a couple of years, but of course they adhered to 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 \emph{naustrian} and \emph{ngerman} 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'). % 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\newfeature{2.99} v.\,2.99 of this package, a new and more appropriate naming scheme is introduced. % As of v.\,3.0, we will also change the (default) semantics of \Lopt{german}. % All of these are major changes which might break backwards compatibility (but only the change of \Lopt{german} % will do 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 % section~\ref{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 will also have 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). % If the semantics of \Lopt{german} is changed, |\l@german| also has to be redefined. Hence, a new name for pre-1996 German is 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 introduce an option where you can select whether \Lopt{german} % should still always load pre-1996 patterns (this will remain to be 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 |n|-options are used or not (the default as of v.\,3.0). % See section~\ref{sec:glottonyms} for details. % \item While we are at it, we introduce more appropriate terms (language options) for the selection of language varieties and deprecate % some of the problematic ones together with the |n|-forms (but of course, those received options will % 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 sec.~\ref{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[]{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. % 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/Alte 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) \Lopt{capsz} and disabled via |\germansetup| % option \Lopt{capsz=false} or \babel\ modifier \Lopt{nocapsz}: % \begin{itemize} % \setlength{\itemsep}{0pt} % \item \Lopt{capsz}: |\MakeUppercase{ß}|, |\MakeUppercase{"s}| and the |"S| shorthand expand to the capital % eszett letter rather than \graph{SS} (see sec.~\ref{sec:capsz} for details). % \item \Lopt{nocapsz} (=~default): |\MakeUppercase{ß}|, |\MakeUppercase{"s}| and the |"S| expand to % \graph{SS}. Within |\germansetup|, use \Lopt{capsz=false} instead. % \end{itemize} % The received options \Lopt{austrian} and \Lopt{naustrian} still work (the latter also with the |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 sec.~\ref{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) % \Lopt{capsz} and disabled via \babel\ modifier \Lopt{nocapsz} or |\germansetup| option \Lopt{capsz=false}: % \begin{itemize} % \setlength{\itemsep}{0pt} % \item \Lopt{capsz}: |\MakeUppercase{ß}|, |\MakeUppercase{"s}| and the |"S| shorthand expand to the capital % eszett letter rather than \graph{SS} (see sec.~\ref{sec:capsz} for details). % \item \Lopt{nocapsz} (=~default): |\MakeUppercase{ß}|, |\MakeUppercase{"s}| and the |"S| expand to % \graph{SS}. Within |\germansetup|, use \Lopt{capsz=false} instead. % \end{itemize} % The received options \Lopt{german} and \Lopt{ngerman} still work (the latter also with the |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. % % While \Lopt{german} 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 sec.\ref{sec:glottonyms}). % So it is always advisable to use a more precise option such as \Lopt{german-de}. % % Also, unless |glottonyms=contemporary| or |glottonyms=auto| is set (see section~\ref{sec:glottonyms}), % \Lopt{german} will still load pre-reform (pre-1996) and legacy hyphenation patterns % (this will change as of \babelde\ v.\,3.0), \Lopt{ngerman} also uses the legacy hyphenation patterns % by default. The options recommended above, by contrast, use the newer and better `experimental' % patterns (see sec.~\ref{sec:patterns}). % % \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) \Lopt{toss}: % \begin{itemize} % \item \Lopt{toss}: the shorthands |"s| and |"z| will expand to \graph{ss} rather % than \graph{ß} (see sec.~\ref{sec:toss} for details). % % \end{itemize} % The received options \Lopt{swissgerman} and \Lopt{nswissgerman} still work (also with the |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 sec.~\ref{sec:patterns}). % % \section{Configuring the Meaning of \Lopt{german}}\label{sec:glottonyms} % % In\newfeature{2.99} section~\ref{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 |german-de| or |german-germany|. % % Having said this, we understand that an option |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 |glottonyms| is provided (\emph{glottonym} means `language name'). % It has to be set via |\germansetup| and offers the following choices: % \begin{itemize} % \item |glottomyms=legacy|: \Lopt{german} always enables pre-1996 % spelling, as it has been traditionally the case in \babelde. It also uses the legacy hyphenation patterns. % Use this if you need to maintain 100\,\% backwards compatibility. This is also the current default. % \item |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 |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 |glottomyms=legacy|). % This choice will be the new 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 |legacy| semantics, you need to stick % with this and report to the maintainer of that package. % %\iffalse % %enable with 3.0 % If you want to share a document that employs \Lopt{german-de-1901} spelling \emph{exclusively} % with a co-author who only has an older version of \babelde\ available, we suggest to % load the options |ngerman,german| and use \Lopt{german} in the traditional way within the % document. %\fi % % \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 sec.~\ref{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 \Lopt{glottonyms=legacy} % or \Lopt{glottonyms=auto} and the use of an |n-|option (i.\,e., if it refers to pre-1996 orthography), % the established (legacy) patterns will continue to be used. With the newer meaning (\Lopt{glottonyms=contemporary} % or \Lopt{glottonyms=auto} without the use of an |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. |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 |hyphenrules| (e.\,g., |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} % % 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. % % Table~\ref{tab:german-quote} provides an overview of the shorthands % that are provided by \textsf{babel-german} for all its variants. % Table~\ref{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}[!htb] % \begin{center} % \small % \caption{Shorthands provided by \babelde}\label{tab:german-quote} % \begin{tabular}{l>{\raggedright}p{.9\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. sec.~\ref{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. sec.~\ref{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 footnote~\ref{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. sec.~\ref{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{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 % by redefining the macro |\def\mkgender{*}|. \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{center} % \end{table} % % \begin{table}[!h] % \begin{center} % \small % \caption{Alternative commands for quotation marks (provided by \babel)}\label{tab:more-quote} % \begin{tabular}{lp{.88\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{center} % \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 \Lopt{capsz}, which is supported % for the contemporary (post-1996) Austrian (cf. sec.~\ref{sec:austrian}) and German (cf. sec.~\ref{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 sec.~\ref{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]{}|. % This is adhered to. If you want to disable such a global setting, you can do so by means of the % |\germansetup| option \Lopt{capsz=false} or \babel\ modifier \Lopt{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{Bu\ss e} vs.\,\emph{Busse} `penance'). 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 footnote~\ref{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 \Lopt{toss} % (read: `to \graph{ss}') with \Lopt{german-ch}, \Lopt{german-ch-1901} or its aliases (see sec.~\ref{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}{l>{\raggedright}p{.9\textwidth}} % |"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.\ footnote~\ref{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|, where || % 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| and |\noextras| which hold extra language settings. % % Packages that want to change captions of all German varieties at once might append code to the internal % macros |\@captionsgerman| (that is inherited by all varieties) or |\@captionsgerman@at| and |\@captionsgerman@ch| % (for the Austrian and Swiss varieties, respectively). For extras and noextras, append 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. % \begin{macrocode} \newif\ifbbl@german@newterms \bbl@german@newtermsfalse \newif\ifbbl@german@maybe@newterms \bbl@german@maybe@newtermsfalse \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} % % Now, the actual option definitions that set the booleans and macros: % \begin{macrocode} \ExplSyntaxOn \DeclareKeys[bblgerman] { % glottonyms= 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{} }, } \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 |toss| and |capsz| also via \cs{germansetup}} % 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} % % We check for the existence of the required hyphenation % patterns, issue a warning (and fall back to the null language) % if it is unknown. If required we set |\l@| as % a `dialect' of the hyphenation language. % % \begin{macro}{\l@tgerman} % Since |\l@german| is ambiguous depending on the setting of % |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 |glottonyms| option % if we are within |german|: % \begin{macrocode} \ifx\CurrentOption\bbl@opt@german \AddToHook{begindocument/before}{% % \end{macrocode} % First, if we have |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 legacy glottonyms\MessageBreak `german' denotes pre-1996 spelling.}% }{% \PackageInfo{babel-german}{Using contemporary glottonyms\MessageBreak `german' denotes post-1996 spelling.}% }% \fi % \end{macrocode} % We know now if |german| means 1901 or 1996, so % set the hyphenation patterns if needed. Here, % we also consider the |hyphenrules| option % for |german|. The following is either % |glottonyms=contemporary| or |glottonyms=auto| % without n-variety: % \begin{macrocode} \ifbbl@german@newterms % \end{macrocode} % If we do not find legacy |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} % If |hyphenrules| have not been set, use |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 \expandafter\adddialect\csname l@german\expandafter \endcsname\csname l@ngerman-x-\bbl@german@patterns@newterms\endcsname \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 |glottonyms=legacy| or |glottonyms=auto| % with n-variety. Here, we only set patterns if requested via % |hyphenrules|: % \begin{macrocode} \ifx\bbl@german@patterns@oldterms\bbl@german@legacy@patterns\else \expandafter\adddialect\csname l@german\expandafter \endcsname\csname l@german-x-\bbl@german@patterns@oldterms\endcsname \fi \fi } \fi % \end{macrocode} % % For the following, we need to temporarily give the hyphen % `letter' catcode as our options might consist of hyphens: % \begin{macrocode} \edef\bbl@german@save@hyphen@catcode{\the\catcode`\-} \catcode`\-=11 % \end{macrocode} % % 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{} 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} % % Reset hyphen catcode: % \begin{macrocode} \catcode`\-=\bbl@german@save@hyphen@catcode % \end{macrocode} % % \changes{Version 2.9g=Version 2.99}{2025/12/21}{Allow to load experimental hyphenation patterns via macro \cs{germansetup}} % With the option |hyphenrules|, we load experimental hyphenation patterns (package \textsf{dehyph-exptl}). % The following passes the respective code for a given variety to a hook that is being executed % at document begin (when we know the setting of |hyphenrules|). We do not handle |german| here, as this % is already done in the code that also considers |glottonyms|. Also, 1901 Swiss German already uses % exptl patterns, so we ignore this: % \begin{macrocode} \ActivateGenericHook{babel/german/patterns} % \end{macrocode} % % First 1901 variants: % \begin{macrocode} \ifbbl@german@tradspelling \ifx\bbl@german@region\bbl@german@region@ch\else \def\tmpa{austrian} \ifx\CurrentOption\tmpa \AddToHook{babel/german/patterns}{% \ifx\bbl@german@patterns@oldterms\bbl@german@legacy@patterns\else \expandafter\adddialect\csname l@austrian\expandafter \endcsname\csname l@german-x-\bbl@german@patterns@oldterms\endcsname\fi} \fi \def\tmpa{german-at-1901} \ifx\CurrentOption\tmpa \AddToHook{babel/german/patterns}{% \ifx\bbl@german@patterns@newterms\bbl@german@legacy@patterns\else \expandafter\adddialect\csname l@german-at-1901\expandafter \endcsname\csname l@german-x-\bbl@german@patterns@newterms\endcsname\fi} \fi \def\tmpa{german-austria-1901} \ifx\CurrentOption\tmpa \AddToHook{babel/german/patterns}{% \ifx\bbl@german@patterns@newterms\bbl@german@legacy@patterns\else \expandafter\adddialect\csname l@german-austria-1901\expandafter \endcsname\csname l@german-x-\bbl@german@patterns@newterms\endcsname\fi} \fi \def\tmpa{german-de-1901} \ifx\CurrentOption\tmpa \AddToHook{babel/german/patterns}{% \ifx\bbl@german@patterns@newterms\bbl@german@legacy@patterns\else \expandafter\adddialect\csname l@german-de-1901\expandafter \endcsname\csname l@german-x-\bbl@german@patterns@newterms\endcsname\fi} \fi \def\tmpa{german-germany-1901} \ifx\CurrentOption\tmpa \AddToHook{babel/german/patterns}{% \ifx\bbl@german@patterns@newterms\bbl@german@legacy@patterns\else \expandafter\adddialect\csname l@german-germany-1901\expandafter \endcsname\csname l@german-x-\bbl@german@patterns@newterms\endcsname\fi} \fi \fi \else % \end{macrocode} % % Then 1996 variants: % \begin{macrocode} \ifx\CurrentOption\bbl@opt@ngerman \AddToHook{babel/german/patterns}{% \ifx\bbl@german@patterns@oldterms\bbl@german@legacy@patterns\else \expandafter\adddialect\csname l@ngerman\expandafter \endcsname\csname l@ngerman-x-\bbl@german@patterns@oldterms\endcsname\fi} \fi \def\tmpa{german-at} \ifx\CurrentOption\tmpa \AddToHook{babel/german/patterns}{% \ifx\bbl@german@patterns@newterms\bbl@german@legacy@patterns\else \expandafter\adddialect\csname l@german-at\expandafter \endcsname\csname l@ngerman-x-\bbl@german@patterns@newterms\endcsname\fi} \fi \def\tmpa{naustrian} \ifx\CurrentOption\tmpa \AddToHook{babel/german/patterns}{% \ifx\bbl@german@patterns@oldterms\bbl@german@legacy@patterns\else \expandafter\adddialect\csname l@naustrian\expandafter \endcsname\csname l@ngerman-x-\bbl@german@patterns@oldterms\endcsname\fi} \fi \def\tmpa{german-austria} \ifx\CurrentOption\tmpa \AddToHook{babel/german/patterns}{% \ifx\bbl@german@patterns@newterms\bbl@german@legacy@patterns\else \expandafter\adddialect\csname l@german-austria\expandafter \endcsname\csname l@ngerman-x-\bbl@german@patterns@newterms\endcsname\fi} \fi \def\tmpa{german-ch} \ifx\CurrentOption\tmpa \AddToHook{babel/german/patterns}{% \ifx\bbl@german@patterns@newterms\bbl@german@legacy@patterns\else \expandafter\adddialect\csname l@german-ch\expandafter \endcsname\csname l@ngerman-x-\bbl@german@patterns@newterms\endcsname\fi} \fi \def\tmpa{german-switzerland} \ifx\CurrentOption\tmpa \AddToHook{babel/german/patterns}{% \ifx\bbl@german@patterns@newterms\bbl@german@legacy@patterns\else \expandafter\adddialect\csname l@german-switzerland\expandafter \endcsname\csname l@ngerman-x-\bbl@german@patterns@newterms\endcsname\fi} \fi \def\tmpa{german-de} \ifx\CurrentOption\tmpa \AddToHook{babel/german/patterns}{% \ifx\bbl@german@patterns@newterms\bbl@german@legacy@patterns\else \expandafter\adddialect\csname l@german-de\expandafter \endcsname\csname l@ngerman-x-\bbl@german@patterns@newterms\endcsname\fi} \fi \def\tmpa{german-germany} \ifx\CurrentOption\tmpa \AddToHook{babel/german/patterns}{% \ifx\bbl@german@patterns@newterms\bbl@german@legacy@patterns\else \expandafter\adddialect\csname l@german-germany\expandafter \endcsname\csname l@ngerman-x-\bbl@german@patterns@newterms\endcsname\fi} \fi \def\tmpa{nswissgerman} \ifx\CurrentOption\tmpa \AddToHook{babel/german/patterns}{% \ifx\bbl@german@patterns@oldterms\bbl@german@legacy@patterns\else \expandafter\adddialect\csname l@nswissgerman\expandafter \endcsname\csname l@ngerman-x-\bbl@german@patterns@oldterms\endcsname\fi} \fi \fi % \end{macrocode} % % Execute the hook (once) before document begin if |hyphenrules| are requested: % \begin{macrocode} \AddToHook{begindocument/before}{% \ifdefined\bbl@german@xptl@patterns \UseOneTimeHook{babel/german/patterns}% \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}{\@captionsgerman@at} % The macro |\@captionsgerman@at| is another internal macro % that redefines the variants common in AT. % \begin{macrocode} \@namedef{@captionsgerman@at}{% \@nameuse{@captionsgerman}% \def\enclname{Beilage(n)}% } % \end{macrocode} % \end{macro} % \begin{macro}{\@captionsgerman@ch} % The macro |\@captionsgerman@ch| is yet another internal macro % that redefines the variants common in CH (currently identical to AT). % \begin{macrocode} \@namedef{@captionsgerman@ch}{% \@nameuse{@captionsgerman}% \def\enclname{Beilage(n)}% } % \end{macrocode} % \end{macro} % \begin{macro}{\captionsgerman} % The macro |\captionsgerman| is identical to |\@captionsgerman|, % 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{@captionsgerman}% } % \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{@captionsgerman}% } \@namedef{captions\CurrentOption}{% \@nameuse{captionsgerman}% } \fi \fi \fi % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\captionsngerman} % The macro |\captionsngerman| is identical to |\@captionsgerman|, % 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{@captionsgerman}% } % \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{@captionsgerman}% } \@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 |\@captionsgerman|, 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{@captionsgerman@at}% } \else \@namedef{captionsaustrian}{% \@nameuse{@captionsgerman@at}% } \@namedef{captions\CurrentOption}{% \@nameuse{captionsaustrian}% } \fi \else \def\bbl@tmpa{naustrian} \ifx\CurrentOption\bbl@tmpa \@namedef{captions\CurrentOption}{% \@nameuse{@captionsgerman@at}% } \else \@namedef{captionsnaustrian}{% \@nameuse{@captionsgerman@at}% } \@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 |\@captionsgerman|, 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{@captionsgerman@ch}% } \else \@namedef{captionsswissgeman}{% \@nameuse{@captionsgerman@ch}% } \@namedef{captions\CurrentOption}{% \@nameuse{captionsswissgeman}% } \fi \else \def\bbl@tmpa{nswissgeman} \ifx\CurrentOption\bbl@tmpa \@namedef{captions\CurrentOption}{% \@nameuse{@captionsgerman@ch}% } \else \@namedef{captionsnswissgeman}{% \@nameuse{@captionsgerman@ch}% } \@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 (|german|, |ngerman|, |austrian|, % |naustrian|, |swissgerman|, and |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} % \begin{macro}{\extrasgerman-at-1901} \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 \Lopt{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 \Lopt{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| 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\tmpa{\localeinfo*{language.tag.bcp47}}% \edef\tmpb{de}% \ifx\tmpa\tmpb \edef\tmpa{\localeinfo*{region.tag.bcp47}}% \ifx\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 \Lopt{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 \Lopt{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 \Lopt{capsz} % and \Lopt{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 \Lopt{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 |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| 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\tmpa{\localeinfo*{region.tag.bcp47}}% \ifx\tmpa\bbl@german@region@ch\else \ifcapsz\bbl@capsztrue\bbl@csarg\xdef{casing@\languagename}{de-x-eszett}\fi \fi }{% \ifbbl@german@newterms \edef\tmpa{\localename}% \ifx\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 (|german|, |ngerman|, |austrian|, % |naustrian|, |swissgerman|, and |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} % \begin{macro}{\noextrasgerman-at-1901} \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 % table~\ref{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} % and discretionary commands. Here we discriminate % contemporary (post-1996) German from pre-1996 German % (due to the hyphenation specifics). % \begin{macrocode} \def\bbl@german@disc#1#2{% \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: % \begin{macrocode} {\bbl@german@allowhyphenationbefore\discretionary{#2-}{}{#1}% \bbl@german@allowhyphenationafter}% \else % \end{macrocode} % For post-1996 spelling, we simply output \graph{c} or \graph{C} for |"c| and |"C|, % or all two consonants passed in the second argument for the other % relevant shorthands: % \begin{macrocode} \def\bbl@tmpa{c}\def\bbl@tmpb{C}% \if#1\bbl@tmpa #1% \else \if#1\bbl@tmpb #1% \else #2% \fi \fi \fi } % \end{macrocode} % 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}{\textormath{\bbl@german@disc ck}{c}} \declare@shorthand{german}{"C}{\textormath{\bbl@german@disc CK}{C}} \declare@shorthand{german}{"f}{\textormath{\bbl@german@disc f{ff}}{f}} \declare@shorthand{german}{"F}{\textormath{\bbl@german@disc F{FF}}{F}} \declare@shorthand{german}{"l}{\textormath{\bbl@german@disc l{ll}}{l}} \declare@shorthand{german}{"L}{\textormath{\bbl@german@disc L{LL}}{L}} \declare@shorthand{german}{"m}{\textormath{\bbl@german@disc m{mm}}{m}} \declare@shorthand{german}{"M}{\textormath{\bbl@german@disc M{MM}}{M}} \declare@shorthand{german}{"n}{\textormath{\bbl@german@disc n{nn}}{n}} \declare@shorthand{german}{"N}{\textormath{\bbl@german@disc N{NN}}{N}} \declare@shorthand{german}{"p}{\textormath{\bbl@german@disc p{pp}}{p}} \declare@shorthand{german}{"P}{\textormath{\bbl@german@disc P{PP}}{P}} \declare@shorthand{german}{"r}{\textormath{\bbl@german@disc r{rr}}{r}} \declare@shorthand{german}{"R}{\textormath{\bbl@german@disc R{RR}}{R}} \declare@shorthand{german}{"t}{\textormath{\bbl@german@disc t{tt}}{t}} \declare@shorthand{german}{"T}{\textormath{\bbl@german@disc T{TT}}{T}} % \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} % \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}{"~}{% \texorpdfstring{% \textormath{% text \bbl@german@allowhyphenationbefore\mbox{-}% \bbl@german@allowhyphenationafter }{-}% math }{-}% PDF string } \declare@shorthand{german}{"=}{% \bbl@german@allowhyphenationbefore-\bbl@german@allowhyphenationafter } \declare@shorthand{german}{"/}{% \bbl@german@allowhyphenationbefore/\discretionary{}{}{}% \bbl@german@allowhyphenationafter } % \end{macrocode} % \begin{macro}{\mkgender} % \begin{macro}{\mkngender} % 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} \def\mkgender{*} \AtBeginDocument{% \ifx\mkngender\@undefined\else \let\mkgender\mkngender \fi } \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} % \end{macro} % \end{macro} % % \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}} % \begin{macrocode} \def\mdqon{\shorthandon{"}} \def\mdqoff{\shorthandoff{"}} \ifbbl@german@tradspelling \def\ck{\bbl@german@allowhyphenationbefore\discretionary{k-}{k}{ck}% \bbl@german@allowhyphenationafter} \else \def\ck{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. % \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\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\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 % % \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}{|austrian|, |naustrian|, |ngerman|, |nswissgerman| % and |swissgerman| are deprecated in favour of |german-at-1901|, |german-at|, % |german-de|, |german-ch|, and |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 % %<*naustrian> % \fi % \begin{macrocode} %\PackageWarning{babel-german}{Option `naustrian' is deprecated!\MessageBreak % Please use `german-at' instead!} % \end{macrocode} % \iffalse % %<*ngerman> % \fi % \begin{macrocode} %\PackageWarning{babel-german}{Option `ngerman' is deprecated!\MessageBreak % Please use `german-de' instead!} % \end{macrocode} % \iffalse % %<*nswissgerman> % \fi % \begin{macrocode} %\PackageWarning{babel-german}{Option `nswissgerman' is deprecated!\MessageBreak % Please use `german-ch' instead!} % \end{macrocode} % \iffalse % %<*swissgerman> % \fi % \begin{macrocode} %\PackageWarning{babel-german}{Option `swissgerman' is deprecated!\MessageBreak % Please use `german-ch-1901' instead!} % \end{macrocode} % \iffalse % % \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 % % \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 % % \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} % \begin{macrocode} \LdfInit\CurrentOption{captions\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 % % \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 % % \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 % % \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 % % \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 % % \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 % % \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 % % \fi % \iffalse %<*germanat|germanaustria> % \fi % german-at and german-austria, % \begin{macrocode} \bbl@mk@class@alias{naustrian} % \end{macrocode} % \iffalse % % \fi % \iffalse %<*germanch1901|germanswitzerland1901> % \fi % german-ch-1901 and german-switzerland-1901, % \begin{macrocode} \bbl@mk@class@alias{swissgerman} % \end{macrocode} % \iffalse % % \fi % \iffalse %<*germanch|germanswitzerland> % \fi % german-ch and german-switzerland, % \begin{macrocode} \bbl@mk@class@alias{nswissgerman} % \end{macrocode} % \iffalse % % \fi % \iffalse %<*germande1901|germangermany1901> % \fi % german-de-1901 and german-germany-1901, % \begin{macrocode} \bbl@mk@class@alias{german} % \end{macrocode} % \iffalse % % \fi % \iffalse %<*germande|germangermangermany> % \fi % as well as german-de and german-germany % \begin{macrocode} \bbl@mk@class@alias{ngerman} % \end{macrocode} % \iffalse % % \fi % That's it! Fertig. % \iffalse % % \fi % %\PrintChanges % % \begin{thebibliography}{9} % \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