% \iffalse meta-comment
%
% Copyright 1989-2005 Johannes L. Braams and any individual authors
% listed elsewhere in this file.  All rights reserved.
% 
% This file is part of 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 Johannes Braams.
% 
% The list of all files belonging to the Babel system is
% given in the file `manifest.bbl. See also `legal.bbl' for additional
% information.
% 
% The list of derived (unpacked) files belonging to the distribution
% and covered by LPPL is defined by the unpacking scripts (with
% extension .ins) which are part of the distribution.
% \fi
% \CheckSum{3805}
%%
% \def\filename{babel.dtx}
% \let\thisfilename\filename
%
%\iffalse
% \changes{babel~3.5g}{1996/10/10}{We need at least \LaTeX\ from
%    December 1994}
% \changes{babel~3.6k}{1999/03/18}{We need at least \LaTeX\ from
%    June 1998}
%    \begin{macrocode}
%<+package>\NeedsTeXFormat{LaTeX2e}[1998/06/01]
%    \end{macrocode}
%
%% File 'babel.dtx'
%\fi
%%\ProvidesFile{babel.dtx}[2005/05/21 v3.8g The Babel package]
%\iffalse
%
% Babel DOCUMENT-STYLE option for LaTeX version 2.09 or plain TeX;
%% Babel package for LaTeX2e.
%
%% Copyright (C) 1989 -- 2005 by Johannes Braams,
%%                            TeXniek
%%                            all rights reserved.
%
%% Please report errors to: J.L. Braams
%%                          babel at braams.cistron.nl
%<*filedriver>
\documentclass{ltxdoc}
\usepackage{supertabular}
\font\manual=logo10 % font used for the METAFONT logo, etc.
\newcommand*\MF{{\manual META}\-{\manual FONT}}
\newcommand*\TeXhax{\TeX hax}
\newcommand*\babel{\textsf{babel}}
\newcommand*\Babel{\textsf{Babel}}
\newcommand*\m[1]{\mbox{$\langle$\it#1\/$\rangle$}}
\newcommand*\langvar{\m{lang}}
\newcommand*\note[1]{}
\newcommand*\bsl{\protect\bslash}
\newcommand*\Lopt[1]{\textsf{#1}}
\newcommand*\Lenv[1]{\textsf{#1}}
\newcommand*\file[1]{\texttt{#1}}
\newcommand*\cls[1]{\texttt{#1}}
\newcommand*\pkg[1]{\texttt{#1}}
\begin{document}
 \DocInput{babel.dtx}
\end{document}
%</filedriver>
% \changes{babel~3.7a}{1997/04/16}{Make multiple loading of
%    \file{babel.def} impossible} 
%    \begin{macrocode}
%<*core>
\ifx\bbl@afterfi\@undefined
\else
  \bbl@afterfi\endinput
\fi
%</core>
%    \end{macrocode}
%<*dtx>
\ProvidesFile{babel.dtx}
%</dtx>
%\fi
%
% \GetFileInfo{babel.dtx}
%
% \changes{babel~2.0a}{1990/04/02}{Added text about \file{german.sty}}
% \changes{babel~2.0b}{1990/04/18}{Changed order of code to prevent
%    plain \TeX from seeing all of it}
% \changes{babel~2.1}{1990/04/24}{Modified user interface,
%    \cs{langTeX} no longer necessary}
% \changes{babel~2.1a}{1990/05/01}{Incorporated Nico's comments}
% \changes{babel~2.1b}{1990/05/01}{rename \cs{language} to
%    \cs{current@language}}
% \changes{babel~2.1c}{1990/05/22}{abstract for report fixed, missing
%    \texttt{\}}, found by Nicolas Brouard}
% \changes{babel~2.1d}{1990/07/04}{Missing right brace in definition of
%    abstract environment, found by Werenfried Spit}
% \changes{babel~2.1e}{1990/07/16}{Incorporated more comments from
%    Nico}
% \changes{babel~2.2}{1990/07/17}{Renamed \cs{newlanguage} to
%    \cs{addlanguage}}
% \changes{babel~2.2a}{1990/08/27}{Modified the documentation
%    somewhat}
% \changes{babel~3.0}{1991/04/23}{Moved part of the code to hyphen.doc
%    in preparation for \TeX~3.0}
% \changes{babel~3.0a}{1991/05/21}{Updated comments in various places}
% \changes{babel~3.0b}{1991/05/25}{Removed some problems in change log}
% \changes{babel~3.0c}{1991/07/15}{Renamed \file{babel.sty} and
%    \file{latexhax.sty} to \file{.com}}
% \changes{babel~3.1}{1991/10/31}{Added the support for active
%    characters and for extending a macro}
% \changes{babel~3.1}{1991/11/05}{Removed the need for
%    \file{latexhax}}
% \changes{babel~3.2}{1991/11/10}{Some Changes by br}
% \changes{babel~3.2a}{1992/02/15}{Fixups of the code and
%    documentation}
% \changes{babel~3.3}{1993/07/06}{Included driver file, and prepared
%    for distribution}
% \changes{babel~3.4}{1994/01/30}{Updated for \LaTeXe}
% \changes{babel~3.4}{1994/02/28}{Added language definition file for
%    bahasa}
% \changes{babel~3.4b}{1994/05/18}{Added a small driver to be able to
%    process just this file}
% \changes{babel~3.5a}{1995/02/03}{Provided common code to handle the
%    active double quote}
% \changes{babel~3.5c}{1995/06/14}{corrected a few typos (PR1652)}
% \changes{babel~3.5d}{1995/07/02}{Merged glyphs.dtx into this file}
% \changes{babel~3.5f}{1995/07/13}{repaired a typo}
% \changes{babel~3.5f}{1996/01/09}{replaced \cs{tmp}, \cs{bbl@tmp} and
%    \cs{bbl@temp} with \cs{bbl@tempa}}
% \changes{babel~3.5g}{1996/07/09}{replaced \cs{undefined} with
%    \cs{@undefined} to be consistent with \LaTeX}
% \changes{babel~3.7d}{1999/05/05}{Fixed a few typos in \cs{changes}
%    entries which made typesetting the code impossible}
% \changes{babel~3.7h}{2001/03/01}{Added a number of missing comment
%    characters which caused spurious white space}
% \changes{babel~3.8e}{2005/03/24}{Many enhancements to the text by
%    Andrew Young} 
%
% \title {Babel, a multilingual package for use with \LaTeX's standard
%    document classes\thanks{During the development ideas from Nico
%    Poppelier, Piet van Oostrum and many others have been used.
%    Bernd Raichle has provided many helpful suggestions.}}
%
% \author{Johannes Braams\\
%         Kersengaarde 33\\
%         2723 BP Zoetermeer\\
%         The Netherlands\\
%         \texttt{babel@braams.cistron.nl}}
%
% \date{Printed \today}
%
% \maketitle
%
%  \begin{abstract}
%    The standard distribution of \LaTeX\ contains a number of
%    document classes that are meant to be used, but also serve as
%    examples for other users to create their own document classes.
%    These document classes have become very popular among \LaTeX\
%    users. But it should be kept in mind that they were designed for
%    American tastes and typography. At one time they contained a
%    number of hard-wired texts. This report describes \babel{}, a
%    package that makes use of the new capabilities of \TeX\ version 3
%    to provide an environment in which documents can be typeset in
%    a non-American language, or in more than one language.
%  \end{abstract}
%
%  \begin{multicols}{2}
%    \tableofcontents
%  \end{multicols}
%
% \section{The user interface}\label{U-I}
%
%    The user interface of this package is quite simple. It consists
%    of a set of commands that switch from one language to another, and
%    a set of commands that deal with shorthands. It is also possible
%    to find out what the current language is.
%
%  \DescribeMacro{\selectlanguage}
%    When a user wants to switch from one language to another he can
%    do so using the macro |\selectlanguage|. This macro takes the
%    language, defined previously by a language definition file, as
%    its argument. It calls several macros that should be defined in
%    the language definition files to activate the special definitions
%    for the language chosen.
%
%  \DescribeEnv{otherlanguage}
%    The environment \Lenv{otherlanguage} does basically the same as
%    |\selectlanguage|, except the language change is local to the
%    environment. This environment is required for intermixing
%    left-to-right typesetting with right-to-left typesetting.
%    The language to switch to is specified as an
%    argument to |\begin{otherlanguage}|.
%
%  \DescribeMacro{\foreignlanguage}
%    The command |\foreignlanguage| takes two arguments; the second
%    argument is a phrase to be typeset according to the rules of the
%    language named in its first argument. This command only switches
%    the extra definitions and the hyphenation rules for the language,
%    \emph{not} the names and dates.
%
%  \DescribeEnv{otherlanguage*}
%    In the environment \Lenv{otherlanguage*} only the typesetting
%    is done according to the rules of the other language, but the
%    text-strings such as `figure', `table', etc. are left as they
%    were set outside this environment.
%
%  \DescribeEnv{hyphenrules}
%    The environment \Lenv{hyphenrules} can be used to select
%    \emph{only} the hyphenation rules to be used. This can for
%    instance be used to select `nohyphenation', provided that in
%    \file{language.dat} the `language' nohyphenation is defined by
%    loading \file{serohyph.tex}.
%
%  \DescribeMacro{\languagename}
%    The control sequence |\languagename| contains the name of the
%    current language.
%
%  \DescribeMacro{\iflanguage}
%    If more than one language is used, it might be necessary to know
%    which language is active at a specific time. This can be checked
%    by a call to |\iflanguage|. This macro takes three arguments.
%    The first argument is the name of a language; the second and
%    third arguments are the actions to take if the result of the test
%    is \texttt{true} or \texttt{false} respectively.
%
%  \DescribeMacro{\useshorthands}
%    The command |\useshorthands| initiates the definition of
%    user-defined shorthand sequences. It has one argument, the
%    character that starts these personal shorthands.
%
%  \DescribeMacro{\defineshorthand}
%     The command |\defineshorthand| takes two arguments: the first
%     is a one- or two-character shorthand sequence, and the second is
%     the code the shorthand should expand to.
%
%  \DescribeMacro{\aliasshorthand}
%    The command |\aliasshorthand| can be used to let another
%    character perform the same functions as the default shorthand
%    character. If one prefers for example to use the character |/|
%    over |"| in typing polish texts, this can be achieved by entering
%    |\aliasshorthand{"}{/}|. \emph{Please note} that the substitute
%    shorthand character must have been declared in the preamble of
%    your document, using a command such as |\useshorthands{/}| in this
%    example.
%
%  \DescribeMacro{\languageshorthands}
%     The command |\languageshorthands| can be used to switch the
%     shorthands on the language level. It takes one argument, the
%     name of a language. Note that for this to work the language
%     should have been specified as an option when loading the \babel\
%     package.
%
%  \DescribeMacro{\shorthandon}
%  \DescribeMacro{\shorthandoff}
%    It is sometimes necessary to switch a shorthand
%    character off temporarily, because it must be used in an
%    entirely different way. For this purpose, the user commands
%    |\shorthandoff| and |\shorthandon| are provided. They each take a
%    list of characters as their arguments. The command |\shorthandoff|
%    sets the |\catcode| for each of the characters in its argument to
%    other (12); the command |\shorthandon| sets the |\catcode| to
%    active (13). Both commands only work on `known'
%    shorthand characters. If a character is not known to be a
%    shorthand character its category code will be left unchanged.
%
%  \DescribeMacro{\languageattribute}
%    This is a user-level command, to be used in the preamble of a
%    document (after |\usepackage[...]{babel}|), that declares which
%    attributes are to be used for a given language. It takes two
%    arguments: the first is the name of the language; the second,
%    a (list of) attribute(s) to used.
%    The command checks whether the language is known in this document
%    and whether the attribute(s) are known for this language.
%
% \subsection{Languages supported by \Babel}
%
%    In the following table all the languages supported by \Babel\ are
%    listed, together with the names of the options with which you can
%    load \babel\ for each language.
%
%    \begin{center}
%      \tablehead{Language & Option(s)\\\hline}
%      \tabletail{\hline}
%      \begin{supertabular}{l p{8cm}}
%        Afrikaans  & afrikaans\\
%        Bahasa     & bahasa\\
%        Basque     & basque\\
%        Breton     & breton\\
%        Bulgarian  & bulgarian\\
%        Catalan    & catalan\\
%        Croatian   & croatian\\
%        Czech      & czech\\
%        Danish     & danish\\
%        Dutch      & dutch\\
%        English    & english, USenglish, american, UKenglish,
%                     british, canadian, australian, newzealand\\
%        Esperanto  & esperanto\\
%        Estonian   & estonian\\
%        Finnish    & finnish\\
%        French     & french, francais, canadien, acadian\\
%        Galician   & galician\\
%        German     & austrian, german, germanb, ngerman, naustrian\\
%        Greek      & greek, polutonikogreek \\
%        Hebrew     & hebrew \\
%        Hungarian  & magyar, hungarian\\
%        Icelandic  & icelandic \\
%        Interlingua & interlingua \\
%        Irish Gaelic & irish\\
%        Italian    & italian\\
%^^A        Kannada    & kannada \\
%        Latin      & latin \\
%        Lower Sorbian & lowersorbian\\
%^^A        Devnagari  & nagari \\
%        North Sami & samin \\
%        Norwegian  & norsk, nynorsk\\
%        Polish     & polish\\
%        Portuguese & portuges, portuguese, brazilian, brazil\\
%        Romanian   & romanian\\
%        Russian    & russian\\
%^^A        Sanskrit   & sanskrit\\
%        Scottish Gaelic & scottish\\
%        Spanish    & spanish\\
%        Slovakian  & slovak\\
%        Slovenian  & slovene\\
%        Swedish    & swedish\\
%        Serbian    & serbian\\
%^^A        Tamil      & tamil \\
%        Turkish    & turkish\\
%        Ukrainian  & ukrainian\\
%        Upper Sorbian & uppersorbian\\
%        Welsh      & welsh\\
%      \end{supertabular}
%    \end{center}
%
%    For some languages \babel\ supports the options
%    \Lopt{activeacute} and \Lopt{activegrave}; for typestting Russian
%    texts, \babel\ knows about the options \Lopt{LWN} and \Lopt{LCY}
%    to specify the fontencoding of the cyrillic font used. Currently
%    only \Lopt{LWN} is supported.
%
% \subsection{Workarounds}
%
%    If you use the document class \cls{book} \emph{and} you use
%    |\ref| inside the argument of |\chapter|,
%    \LaTeX\ will keep complaining about an undefined
%    label. The reason is that the argument of |\ref| is passed through
%    |\uppercase| at some time during processing. To prevent such
%    problems, you could revert to using uppercase labels, or you can
%    use |\lowercase{\ref{foo}}| inside the argument of |\chapter|.
%
% \section{Changes for \LaTeXe}
%
%    With the advent of \LaTeXe\ the interface to \babel\ in the
%    preamble of the document has changed. With \LaTeX2.09 one used to
%    call up the \babel\ system with a line such as:
%
%\begin{verbatim}
%\documentstyle[dutch,english]{article}
%\end{verbatim}
%
%    which would tell \LaTeX\ that the document would be written in
%    two languages, Dutch and English, and that English would be the
%    first language in use.
%
%    The \LaTeXe\ way of providing the same information is:
%
%\begin{verbatim}
%\documentclass{article}
%\usepackage[dutch,english]{babel}
%\end{verbatim}
%
%    or, making \Lopt{dutch} and \Lopt{english} global options in
%    order to let other packages detect and use them:
%
%\begin{verbatim}
%\documentclass[dutch,english]{article}
%\usepackage{babel}
%\usepackage{varioref}
%\end{verbatim}
%
%    In this last example, the package \texttt{varioref} will also see
%    the options and will be able to use them.
%
% \section{Changes in \Babel\ version 3.7}
%
%    In \Babel\ version 3.7 a number of bugs that were found in
%    version~3.6 are fixed. Also a number of changes and additions
%    have occurred:
%    \begin{itemize}
%    \item Shorthands are expandable again. The disadvantage is that
%      one has to type |'{}a| when the acute accent is used as a
%      shorthand character. The advantage is that a number of other
%      problems (such as the breaking of ligatures, etc.) have
%      vanished.
%    \item Two new commands, |\shorthandon| and |\shorthandoff| have
%      been introduced to enable to temporarily switch off one or more
%      shorthands.
%^^A    \item Support for typesetting Sanskrit in transliteration is now
%^^A      available, thanks to Jun Takashima.
%^^A    \item Support for typesetting Kannada, Devnagari and Tamil is now
%^^A      available thanks to Jun Takashima.
%    \item Support for typesetting Greek has been enhanced. Code from
%      the \pkg{kdgreek} package (suggested by the author) was added
%      and |\greeknumeral| has been added.
%    \item Support for typesetting Basque is now available thanks to
%      Juan Aguirregabiria.
%    \item Support for typesetting Serbian with Latin script is now
%      available thanks to Dejan Muhamedagi\'{c} and Jankovic
%      Slobodan.
%    \item Support for typesetting Hebrew (and potential support for
%      typesetting other right-to-left written languages) is now
%      available thanks to Rama Porrat and Boris Lavva.
%    \item Support for typesetting Bulgarian is now available thanks to
%      Georgi Boshnakov.
%    \item Support for typesetting Latin is now available, thanks to
%      Claudio Beccari and Krzysztof Konrad \.Zelechowski.
%    \item Support for typesetting North Sami is now available, thanks
%      to Regnor Jernsletten.
%    \item The options \Lopt{canadian}, \Lopt{canadien} and
%      \Lopt{acadien} have been added for Canadian English and French
%      use.
%    \item A language attribute has been added to the |\mark...|
%      commands in order to make sure that a Greek header line comes
%      out right on the last page before a language switch.
%    \item Hyphenation pattern files are now read \emph{inside a
%      group}; therefore any changes a pattern file needs to make to
%      lowercase codes, uppercase codes, and category codes are kept
%      local to that group. If they are needed for the language, these
%      changes will need to be repeated and stored in |\extras...|
%    \item The concept of language attributes is introduced. It is
%      intended to give the user some control over the
%      features a language-definition file provides. Its
%      first use is for the Greek language, where the user can choose
%      the  $\pi o\lambda\upsilon\tau o\nu\kappa\acute{o}$
%      (``Polutoniko'' or multi-accented) Greek way of typesetting
%      texts. These attributes will possibly find wider use in future
%      releases.
%    \item The environment \Lenv{hyphenrules} is introduced.
%    \item The syntax of the file \file{language.dat} has been
%      extended to allow (optionally) specifying the font
%      encoding to be used while processing the patterns file.
%    \item The command |\providehyphenmins| should now be used in
%      language definition files in order to be able to keep any
%      settings provided by the pattern file.
%    \end{itemize}
%
% \section{Changes in \Babel\ version 3.6}
%
%    In \Babel\ version 3.6 a number of bugs that were found in
%    version~3.5 are fixed. Also a number of changes and additions
%    have occurred:
%    \begin{itemize}
%    \item A new environment \Lenv{otherlanguage*} is introduced. it
%      only switches the `specials', but leaves the `captions'
%      untouched.
%    \item The shorthands are no longer fully expandable. Some
%      problems could only be solved by peeking at the token following
%      an active character. The advantage is that |'{}a| works as
%      expected for languages that have the |'| active.
%    \item Support for typesetting french texts is much enhanced; the
%      file \file{francais.ldf} is now replaced by \file{frenchb.ldf}
%      which is maintained by Daniel Flipo.
%    \item Support for typesetting the russian language is again
%      available. The language definition file was originally
%      developed by Olga Lapko from CyrTUG. The fonts needed to
%      typeset the russian language are now part of the \babel\
%      distribution. The support is not yet up to the level which is
%      needed according to Olga, but this is a start.
%    \item Support for typesetting greek texts is now also
%      available. What is offered in this release is a first attempt;
%      it will be enhanced later on by Yannis Haralambous.
%    \item in \babel\ 3.6j some hooks have been added for the
%      development of support for Hebrew typesetting.
%    \item Support for typesetting texts in Afrikaans (a variant of
%      Dutch, spoken in South Africa) has been added to
%      \file{dutch.ldf}.
%    \item Support for typesetting Welsh texts is now available.
%    \item A new command |\aliasshorthand| is introduced. It seems
%      that in Poland various conventions are used to type the
%      necessary Polish letters. It is now possible to use the
%      character~|/| as a shorthand character instead of the
%      character~|"|, by issuing the command |\aliasshorthand{"}{/}|.
%    \item The shorthand mechanism now deals correctly with characters
%      that are already active.
%    \item Shorthand characters are made active at |\begin{document}|,
%      not earlier. This is to prevent problems with other packages.
%    \item A \emph{preambleonly} command |\substitutefontfamily| has
%      been added to create \file{.fd} files on the fly when the font
%      families of the Latin text differ from the families used for
%      the Cyrillic or Greek parts of the text.
%    \item Three new commands |\LdfInit|, |\ldf@quit| and
%      |\ldf@finish| are introduced that perform a number of standard
%      tasks.
%    \item In babel 3.6k the language Ukrainian has been added and the
%      support for Russian typesetting has been adapted to the package
%      'cyrillic' to be released with the December 1998 release of
%      \LaTeXe.
%    \end{itemize}
%
% \section{Changes in \Babel\ version 3.5}
%
%    In \Babel\ version 3.5 a lot of changes have been made when
%    compared with the previous release. Here is a list of the most
%    important ones:
%    \begin{itemize}
%    \item the selection of the language is delayed until
%      |\begin{document}|, which means you must
%      add appropriate |\selectlanguage| commands if you include
%      |\hyphenation| lists in the preamble of your document.
%    \item \babel\ now has a \Lenv{language} environment and a new
%      command |\foreignlanguage|;
%    \item the way active characters are dealt with is completely
%      changed. They are called `shorthands'; one can have three
%      levels of shorthands: on the user level, the language level, and
%      on `system level'. A consequence of the new way of handling
%      active characters is that they are now written to auxiliary
%      files `verbatim';
%    \item A language change now also writes information in the
%      \file{.aux} file, as the change might also affect typesetting
%      the table of contents. The consequence is that an .aux file
%      generated by a LaTeX format with babel preloaded gives errors
%      when read with a LaTeX format without babel; but I think this
%      probably doesn't occur;
%    \item \babel\ is now compatible with the \pkg{inputenc} and
%      \pkg{fontenc} packages;
%    \item the language definition files now have a new extension,
%      \file{ldf};
%    \item the syntax of the file \file{language.dat} is extended to
%      be compatible with the \pkg{french} package by Bernard Gaulle;
%    \item each language definition file looks for a configuration
%      file which has the same name, but the extension \file{.cfg}. It
%    can contain any valid \LaTeX\ code.
%    \end{itemize}
%
% \section{The interface between the core of \babel{} and the language
%    definition files}
%
%    In the core of the \babel{} system, several macros are defined
%    for use in language definition files. Their purpose
%    is to make a new language known.
%
%  \DescribeMacro{\addlanguage}
%    The macro |\addlanguage| is a non-outer version of the macro
%    |\newlanguage|, defined in \file{plain.tex} version~3.x. For
%    older versions of \file{plain.tex} and \file{lplain.tex} a
%    substitute definition is used.
%
%  \DescribeMacro{\adddialect}
%    The macro |\adddialect| can be used when two
%    languages can (or must) use the same hyphenation
%    patterns. This can also be useful for
%    languages for which no patterns are preloaded in the format. In
%    such cases the default behaviour of the \babel{} system is to
%    define this language as a `dialect' of the language for which the
%    patterns were loaded as |\language0|.
%
%    The language definition files must conform to a number of
%    conventions, because these files have to fill
%    in the gaps left by the common code in \file{babel.def}, i.\,e.,
%    the definitions of the macros that produce texts.  Also the
%    language-switching possibility which has been built into the
%    \babel{} system has its implications.
%
%    The following assumptions are made:
%   \begin{itemize}
%    \item Some of the language-specific definitions might be used by
%    plain \TeX\ users, so the files have to be coded so that they
%    can be read by both \LaTeX\ and plain \TeX. The current
%    format can be checked by looking at the value of the macro
%    |\fmtname|.
%
%    \item The common part of the \babel{} system redefines a number
%    of macros and environments (defined previously in the document
%    style) to put in the names of macros that replace the previously
%    hard-wired texts.  These macros have to be defined in the
%    language definition files.
%
%    \item The language definition files define five macros, used to
%    activate and deactivate the language-specific definitions.  These
%    macros are |\|\langvar|hyphenmins|, |\captions|\langvar,
%    |\date|\langvar, |\extras|\langvar\ and |\noextras|\langvar; where
%    \langvar\ is either the name of the language definition file or
%    the name of the \LaTeX\ option that is to be used. These
%    macros and their functions are discussed below.
%
%    \item When a language definition file is loaded, it can define
%    |\l@|\langvar\ to be a dialect of |\language0| when
%    |\l@|\langvar\ is undefined.
%
%    \item The language definition files can be read in the preamble of
%    the document, but also in the middle of document processing. This
%    means that they have to function independently of the current
%    |\catcode| of the \texttt{@}~sign.
%   \end{itemize}
%
%  \DescribeMacro{\providehyphenmins}
%    The macro |\providehyphenmins| should be used in the language
%    definition files to set the |\lefthyphenmin| and
%    |\righthyphenmin|. This macro will check whether these parameters
%    were provided by the hyphenation file before it takes any action.
%
%  \DescribeMacro{\langhyphenmins}
%    The macro |\|\langvar|hyphenmins| is used to store the values of
%    the |\lefthyphenmin| and |\righthyphenmin|.
%
%  \DescribeMacro{\captionslang}
%    The macro |\captions|\langvar\ defines the macros that
%    hold the texts to replace the original hard-wired texts.
%
%  \DescribeMacro{\datelang}
%    The macro |\date|\langvar\ defines |\today| and
%
%  \DescribeMacro{\extraslang}
%    The macro |\extras|\langvar\ contains all the extra definitions
%    needed for a specific language.
%
%  \DescribeMacro{\noextraslang}
%    Because we want to let the user switch
%    between languages, but we do not know what state \TeX\ might be in
%    after the execution of |\extras|\langvar, a macro that brings
%    \TeX\ into a predefined state is needed. It will be no surprise
%    that the name of this macro is |\noextras|\langvar.
%
%  \DescribeMacro{\bbl@declare@ttribute}
%    This is a command to be used in the language definition files for
%    declaring a language attribute. It takes three arguments: the
%    name of the language, the attribute to be defined, and the code
%    to be executed when the attribute is to be used.
%
%  \DescribeMacro{\main@language}
%    To postpone the activation of the definitions needed for a
%    language until the beginning of a document, all language
%    definition files should use |\main@language| instead of
%    |\selectlanguage|. This will just store the name of the language,
%    and the proper language will be activated at the start of the
%    document.
%
%  \DescribeMacro{\ProvidesLanguage}
%    The macro |\ProvidesLanguage| should be used to identify the
%    language definition files. Its syntax is similar to the syntax
%    of the \LaTeX\ command |\ProvidesPackage|.
%
%  \DescribeMacro{\LdfInit}
%    The macro |\LdfInit| performs a couple of standard checks that
%    must be made at the beginning of a language definition file,
%    such as checking the category code of the @-sign, preventing
%    the \file{.ldf} file from being processed twice, etc.
%
%  \DescribeMacro{\ldf@quit}
%    The macro |\ldf@quit| does work needed
%    if a \file{.ldf} file was processed
%    earlier. This includes resetting the category code
%    of the @-sign, preparing the language to be activated at
%    |\begin{document}| time, and ending the input stream.
%
%  \DescribeMacro{\ldf@finish}
%    The macro |\ldf@finish| does work needed
%    at the end of each \file{.ldf} file. This
%    includes resetting the category code of the @-sign,
%    loading a local configuration file, and preparing the language
%    to be activated at |\begin{document}| time.
%
%  \DescribeMacro{\loadlocalcfg}
%    After processing a language definition file,
%    \LaTeX\ can be instructed to load a local configuration
%    file. This file can, for instance, be used to add strings to
%    |\captions|\langvar\ to support local document
%    classes. The user will be informed that this
%    configuration file has been loaded. This macro is called by
%    |\ldf@finish|.
%
%  \DescribeMacro{\substitutefontfamily}
%    This command takes three arguments, a font encoding and two font
%    family names. It creates a font description file for the first
%    font in the given encoding. This \file{.fd} file will instruct
%    \LaTeX\ to use a font from the second family when a font from the
%    first family in the given encoding seems to be needed.
%
% \subsection{Support for active characters}
%
%    In quite a number of language definition files, active characters
%    are introduced. To facilitate this, some support macros are
%    provided.
%
% \DescribeMacro{\initiate@active@char}
%    The internal macro |\initiate@active@char| is used in language
%    definition files to instruct \LaTeX\ to give a character the
%    category code `active'. When a character has been made active it
%    will remain that way until the end of the document. Its
%    definition may vary.
%
% \DescribeMacro{\bbl@activate}
% \DescribeMacro{\bbl@deactivate}
%    The command |\bbl@activate| is used to change the way an active
%    character expands. |\bbl@activate| `switches on' the active
%    behaviour of the character. |\bbl@deactivate| lets the active
%    character expand to its former (mostly) non-active self.
%
% \DescribeMacro{\declare@shorthand}
%    The macro |\declare@shorthand| is used to define the various
%    shorthands. It takes three arguments: the name for the collection
%    of shorthands this definition belongs to; the character
%    (sequence) that makes up the shorthand, i.e.\ |~| or |"a|; and the
%    code to be executed when the shorthand is encountered.
%
% \DescribeMacro{\bbl@add@special}
% \DescribeMacro{\bbl@remove@special}
%    The \TeX book states: ``Plain \TeX\ includes a macro called
%    |\dospecials| that is
%    essentially a set macro, representing the set of all characters
%    that have a special category code.'' \cite[p.~380]{DEK} It is
%    used to set text `verbatim'.  To make this work if more
%    characters get a special category code, you have to add this
%    character to the macro |\dospecial|.  \LaTeX\ adds another macro
%    called |\@sanitize| representing the same character set, but
%    without the curly braces.  The macros
%    |\bbl@add@special|\meta{char} and
%    |\bbl@remove@special|\meta{char} add and remove the character
%    \meta{char} to these two sets.
%
% \subsection{Support for saving macro definitions}
%
%    Language definition files may want to \emph{re}define macros that
%    already exist. Therefor a mechanism for saving (and restoring)
%    the original definition of those macros is provided. We provide
%    two macros for this\footnote{This mechanism was introduced by
%    Bernd Raichle.}.
%
% \DescribeMacro{\babel@save} To save the current meaning of any
%    control sequence, the macro |\babel@save| is provided. It takes
%    one argument, \meta{csname}, the control sequence for which the
%    meaning has to be saved.
%
% \DescribeMacro{\babel@savevariable} A second macro is provided to
%    save the current value of a variable.  In this context, anything
%    that is allowed after the |\the| primitive is considered to be a
%    variable. The macro takes one argument, the \meta{variable}.
%
%    The effect of the preceding macros is to append a piece of code
%    to the current definition of |\originalTeX|. When
%    |\originalTeX| is expanded, this code restores the previous
%    definition of the control sequence or the previous value of the
%    variable.
%
% \subsection{Support for extending macros}
%
% \DescribeMacro{\addto}
%    The macro |\addto{|\meta{control sequence}|}{|\meta{\TeX\
%    code}|}| can be used to extend the definition of a macro. The
%    macro need not be defined. This macro can, for instance, be used
%    in adding instructions to a macro like |\extrasenglish|.
%
% \subsection{Macros common to a number of languages}
%
% \DescribeMacro{\allowhyphens}
%    In a couple of European languages compound words are used. This
%    means that when \TeX\ has to hyphenate such a compound word, it
%    only does so at the `\texttt{-}' that is used in such words. To
%    allow hyphenation in the rest of such a compound word, the macro
%    |\allowhyphens| can be used.
%
% \DescribeMacro{\set@low@box}
%    For some languages, quotes need to be lowered to the baseline. For
%    this purpose the macro |\set@low@box| is available. It takes one
%    argument and puts that argument in an |\hbox|, at the
%    baseline. The result is available in |\box0| for further
%    processing.
%
% \DescribeMacro{\save@sf@q}
%    Sometimes it is necessary to preserve the |\spacefactor|.  For
%    this purpose the macro |\save@sf@q| is available. It takes one
%    argument, saves the current spacefactor, executes the argument,
%    and restores the spacefactor.
%
% \DescribeMacro{\bbl@frenchspacing}
% \DescribeMacro{\bbl@nonfrenchspacing}
%    The commands |\bbl@frenchspacing| and |\bbl@nonfrenchspacing| can
%    be used to properly switch French spacing on and off.
%
% \section{Compatibility with \file{german.sty}}\label{l-h}
%
%    The file \file{german.sty} has been
%    one of the sources of inspiration for the \babel{}
%    system. Because of this I wanted to include \file{german.sty} in
%    the \babel{} system.  To be able to do that I had to allow for
%    one incompatibility: in the definition of the macro
%    |\selectlanguage| in \file{german.sty} the argument is used as the
%    {$\langle \it number \rangle$} for an |\ifcase|. So in this case
%    a call to |\selectlanguage| might look like
%    |\selectlanguage{\german}|.
%
%    In the definition of the macro |\selectlanguage| in
%    \file{babel.def} the argument is used as a part of other
%    macronames, so a call to |\selectlanguage| now looks like
%    |\selectlanguage{german}|.  Notice the absence of the escape
%    character.  As of version~3.1a of \babel{} both syntaxes are
%    allowed.
%
%    All other features of the original \file{german.sty} have been
%    copied into a new file, called \file{germanb.sty}\footnote{The
%    `b' is added to the name to distinguish the file from Partls'
%    file.}.
%
%    Although the \babel{} system was developed to be used with
%    \LaTeX, some of the features implemented in the language
%    definition files might be needed by plain \TeX\ users. Care has
%    been taken that all files in the system can be processed by plain
%    \TeX.
%
% \section{Compatibility with \file{ngerman.sty}}
%
%    When used with the options \Lopt{ngerman} or \Lopt{naustrian},
%    \babel{} will provide all features of the package \pkg{ngerman}.
%    There is however one exception:  The commands for special
%    hyphenation of double consonants (|"ff| etc.) and ck (|"ck|),
%    which are no longer required with the new German orthography, are
%    undefined. With the \pkg{ngerman} package, however, these
%    commands will generate appropriate warning messages only.
%
% \section{Compatibility with the \pkg{french} package}
%
%    It has been reported to me that the package \pkg{french} by
%    Bernard Gaulle (\texttt{gaulle@idris.fr}) works
%    together with \babel. On the other hand, it seems \emph{not} to
%    work well together with a lot of other packages. Therefore I have
%    decided to no longer load \file{french.ldf} by default. Instead,
%    when you want to use the package by Bernard Gaulle, you will have
%    to request it specifically, by passing either \Lopt{frenchle} or
%    \Lopt{frenchpro} as an option to \babel.
%
%\StopEventually{%
% \clearpage
% \let\filename\thisfilename
% \section{Conclusion}
%
%    A system of document options has been presented that enable the
%    user of \LaTeX\ to adapt the standard document classes of \LaTeX\
%    to the language he or she prefers to use. These options offer the
%    possibility of switching between languages in one document. The
%    basic interface consists of using one option, which is the same
%    for \emph{all} standard document classes.
%
%    In some cases the language definition files provide macros that
%    can be useful to plain \TeX\ users as well as to \LaTeX\ users.
%    The \babel{} system has been implemented so that it
%    can be used by both groups of users.
%
% \section{Acknowledgements}
%
%    I would like to thank all who volunteered as $\beta$-testers for
%    their time. I would like to mention Julio Sanchez who supplied
%    the option file for the Spanish language and Maurizio Codogno who
%    supplied the option file for the Italian language. Michel Goossens
%    supplied contributions for most of the other languages.  Nico
%    Poppelier helped polish the text of the documentation and
%    supplied parts of the macros for the Dutch language.  Paul
%    Wackers and Werenfried Spit helped find and repair bugs.
%
%    During the further development of the babel system I received
%    much help from Bernd Raichle, for which I am grateful.
%
%  \begin{thebibliography}{9}
%    \bibitem{DEK} Donald E. Knuth,
%      \emph{The \TeX book}, Addison-Wesley, 1986.
%    \bibitem{LLbook} Leslie Lamport,
%       \emph{\LaTeX, A document preparation System}, Addison-Wesley,
%       1986.
%    \bibitem{treebus} K.F. Treebus.
%       \emph{Tekstwijzer, een gids voor het grafisch verwerken van
%       tekst.}
%       SDU Uitgeverij ('s-Gravenhage, 1988). A Dutch book on layout
%       design and typography.
%    \bibitem{HP} Hubert Partl,
%      \emph{German \TeX}, \emph{TUGboat} 9 (1988) \#1, p.~70--72.
%     \bibitem{LLth} Leslie Lamport,
%       in: \TeXhax\ Digest, Volume 89, \#13, 17 February 1989.
%    \bibitem{BEP} Johannes Braams, Victor Eijkhout and Nico Poppelier,
%      \emph{The development of national \LaTeX\ styles},
%      \emph{TUGboat} 10 (1989) \#3, p.~401--406.
%    \bibitem{ilatex} Joachim Schrod,
%      \emph{International \LaTeX\ is ready to use},
%      \emph{TUGboat} 11 (1990) \#1, p.~87--90.
%  \end{thebibliography}
% }
%
% \section{Identification}
%
%    The file \file{babel.sty}\footnote{The file described in this
%    section is called \texttt{\filename}, has version
%    number~\fileversion\ and was last revised on~\filedate.} is meant
%    for \LaTeXe, therefor we make sure that the format file used is
%    the right one.
%
%  \begin{macro}{\ProvidesLanguage}
% \changes{babel~3.7a}{1997/03/18}{Added macro to prevent problems
%    with unexpected \cs{ProvidesFile} in plain formats because of
%    \babel.}
%    The identification code for each file is something that was
%    introduced in \LaTeXe. When the command |\ProvidesFile| does not
%    exist, a dummy definition is provided temporarily. For use in the
%    language definition file the command |\ProvidesLanguage| is
%    defined by \babel.
% \changes{babel~3.4e}{1994/06/24}{Redid the identification code,
%    provided dummy definition of \cs{ProvidesFile} for plain \TeX}
% \changes{babel~3.5f}{1995/07/26}{Store version in \cs{fileversion}}
% \changes{babel~3.5f}{1995/12/18}{Need to temporarily change the
%    definition of \cs{ProvidesFile} for December 1995 release}
% \changes{babel~3.5g}{1996/07/09}{Save a few csnames; use
%    \cs{bbl@tempa} instead of \cs{\@ProvidesFile} and store message
%    in \cs{toks8}}
%    \begin{macrocode}
%<*!package>
\ifx\ProvidesFile\@undefined
  \def\ProvidesFile#1[#2 #3 #4]{%
    \wlog{File: #1 #4 #3 <#2>}%
%<*kernel&patterns>
    \toks8{Babel <#3> and hyphenation patterns for }%
%</kernel&patterns>
    \let\ProvidesFile\@undefined
    }
%    \end{macrocode}
%    As an alternative for |\ProvidesFile| we define
%    |\ProvidesLanguage| here to be used in the language definition
%    files.
%    \begin{macrocode}
%<*kernel>
  \def\ProvidesLanguage#1[#2 #3 #4]{%
    \wlog{Language: #1 #4 #3 <#2>}%
    }
\else
%    \end{macrocode}
%    In this case we save the original definition of |\ProvidesFile| in
%    |\bbl@tempa| and restore it after we have stored the version of
%    the file in |\toks8|.
% \changes{babel~3.7a}{1997/11/04}{Removed superfluous braces}
%    \begin{macrocode}
%<*kernel&patterns>
  \let\bbl@tempa\ProvidesFile
  \def\ProvidesFile#1[#2 #3 #4]{%
    \toks8{Babel <#3> and hyphenation patterns for }%
    \bbl@tempa#1[#2 #3 #4]%
    \let\ProvidesFile\bbl@tempa}
%</kernel&patterns>
%    \end{macrocode}
%    When |\ProvidesFile| is defined we give |\ProvidesLanguage| a
%    similar definition.
%    \begin{macrocode}
  \def\ProvidesLanguage#1{%
    \begingroup
      \catcode`\ 10 %
      \@makeother\/%
      \@ifnextchar[%]
        {\@provideslanguage{#1}}{\@provideslanguage{#1}[]}}
  \def\@provideslanguage#1[#2]{%
    \wlog{Language: #1 #2}%
    \expandafter\xdef\csname ver@#1.ldf\endcsname{#2}%
    \endgroup}
%</kernel>
\fi
%</!package>
%    \end{macrocode}
%  \end{macro}
%
%    Identify each file that is produced from this source file.
% \changes{babel~3.4c}{1995/04/28}{lhyphen.cfg has become
%    lthyphen.cfg}
% \changes{babel~3.5b}{1995/01/25}{lthyphen.cfg has become hyphen.cfg}
%    \begin{macrocode}
%<+package>\ProvidesPackage{babel}
%<+core>\ProvidesFile{babel.def}
%<+kernel&patterns>\ProvidesFile{hyphen.cfg}
%<+kernel&!patterns>\ProvidesFile{switch.def}
%<+driver&!user>\ProvidesFile{babel.drv}
%<+driver&user>\ProvidesFile{user.drv}
                [2005/05/21 v3.8g %
%<+package>     The Babel package]
%<+core>         Babel common definitions]
%<+kernel>      Babel language switching mechanism]
%<+driver>]
%    \end{macrocode}
%
% \section{The Package File}
%
%    In order to make use of the features of \LaTeXe, the \babel\
%    system contains a package file, \file{babel.sty}. This file
%    is loaded by the |\usepackage| command and defines all the
%    language options known in the \babel\ system. It also takes care
%    of a number of compatibility issues with other packages.
%
%  \subsection{Language options}
%
% \changes{babel~3.6c}{1997/01/05}{When \cs{LdfInit} is undefined we
%    need to load \file{babel.def} from \file{babel.sty}}
% \changes{babel~3.6l}{1999/04/03}{Don't load \file{babel.def} now,
%    but rather define \cs{LdfInit} temporarily in order to load
%    \file{babel.def} at the right time, preventing problems with the
%    temporary definition of \cs{bbl@redefine}}
% \changes{babel~3.6r}{1999/04/12}{We \textbf{do} need to load
%    \file{babel.def} right now as \cs{ProvidesLanguage} needs to be
%    defined before the \file{.ldf} files are read and the reason for
%    for 3.6l has been removed}
%    \begin{macrocode}
%<*package>
\ifx\LdfInit\@undefined\input babel.def\relax\fi
%    \end{macrocode}
%
%    For all the languages supported we need to declare an option.
% \changes{babel~3.5a}{1995/03/14}{Changed extension of language
%    definition files to \texttt{ldf}}
% \changes{babel~3.5d}{1995/07/02}{Load language definition files
%    \emph{after} the check for the hyphenation patterns}
% \changes{babel~3.5g}{1996/10/04}{Added option \Lopt{afrikaans}}
% \changes{babel~3.7g}{2001/02/09}{Added option \Lopt{acadian}}
% \changes{babel~3.8c}{2004/06/12}{Added option \Lopt{australian}}
%    \begin{macrocode}
\DeclareOption{acadian}{\input{frenchb.ldf}}
\DeclareOption{afrikaans}{\input{dutch.ldf}}
\DeclareOption{american}{\input{english.ldf}}
\DeclareOption{australian}{\input{english.ldf}}
%    \end{macrocode}
%    Austrian is really a dialect of German.
% \changes{babel~3.6i}{1997/02/20}{Added the \Lopt{Basque} option}
%    \begin{macrocode}
\DeclareOption{austrian}{\input{germanb.ldf}}
\DeclareOption{bahasa}{\input{bahasa.ldf}}
\DeclareOption{basque}{\input{basque.ldf}}
\DeclareOption{brazil}{\input{portuges.ldf}}
%    \end{macrocode}
% \changes{babel~3.5b}{1995/05/25}{Added \Lopt{brazilian} as
%    alternative for \Lopt{brazil}}
%    \begin{macrocode}
\DeclareOption{brazilian}{\input{portuges.ldf}}
\DeclareOption{breton}{\input{breton.ldf}}
%    \end{macrocode}
% \changes{babel~3.5d}{1995/07/02}{Added \Lopt{british} as an
%    alternative for \Lopt{english} with a preference for british
%    hyphenation}
% \changes{babel~3.7f}{2000/09/21}{Added the \Lopt{bulgarian} option}
% \changes{babel~3.7g}{2001/02/07}{Added option \Lopt{canadian}}
% \changes{babel~3.7g}{2001/02/09}{Added option \Lopt{canadien}}
%    \begin{macrocode}
\DeclareOption{british}{\input{english.ldf}}
\DeclareOption{bulgarian}{\input{bulgarian.ldf}}
\DeclareOption{canadian}{\input{english.ldf}}
\DeclareOption{canadien}{\input{frenchb.ldf}}
\DeclareOption{catalan}{\input{catalan.ldf}}
\DeclareOption{croatian}{\input{croatian.ldf}}
\DeclareOption{czech}{\input{czech.ldf}}
\DeclareOption{danish}{\input{danish.ldf}}
\DeclareOption{dutch}{\input{dutch.ldf}}
%    \end{macrocode}
% \changes{babel~3.5b}{1995/06/06}{Added the \Lopt{estonian} option}
%    \begin{macrocode}
\DeclareOption{english}{\input{english.ldf}}
\DeclareOption{esperanto}{\input{esperanto.ldf}}
\DeclareOption{estonian}{\input{estonian.ldf}}
\DeclareOption{finnish}{\input{finnish.ldf}}
%    \end{macrocode}
%    The \babel\ support or French used to be stored in
%    \file{francais.ldf}; therefor the \LaTeX2.09 option used to be
%    \Lopt{francais}. The hyphenation patterns may be loaded as either
%    `french' or as `francais'.
% \changes{babel~3.5f}{1996/01/10}{Now use the file \file{frenchb.ldf}
%    from Daniel Flipo for french support}
% \changes{babel~3.6e}{1997/01/08}{Added option \Lopt{frenchb} an
%    alias for \Lopt{francais}}
%    \begin{macrocode}
\DeclareOption{francais}{\input{frenchb.ldf}}
\DeclareOption{frenchb}{\input{frenchb.ldf}}
%    \end{macrocode}
%    With \LaTeXe\ we can now also use the option \Lopt{french} and
%    still call the file \file{frenchb.ldf}.
% \changes{babel~3.5d}{1995/07/02}{Load \file{french.ldf} when it is
%    found instead of \file{frenchb.ldf}}
% \changes{babel~3.7j}{2003/06/07}{\emph{only} load
%    \file{frenchb.ldf}}
%    \begin{macrocode}
\DeclareOption{french}{\input{frenchb.ldf}}%
\DeclareOption{galician}{\input{galician.ldf}}
\DeclareOption{german}{\input{germanb.ldf}}
\DeclareOption{germanb}{\input{germanb.ldf}}
%    \end{macrocode}
% \changes{babel~3.5f}{1996/05/31}{Added the \Lopt{greek} option}
% \changes{babel~3.7a}{1997/11/13}{Added the \Lopt{polutonikogreek}
%    option}
% \changes{babel~3.7c}{1999/04/22}{set the correct language attribute
%    for polutoniko greek}
%    \begin{macrocode}
\DeclareOption{greek}{\input{greek.ldf}}
\DeclareOption{polutonikogreek}{%
  \input{greek.ldf}%
  \languageattribute{greek}{polutoniko}}
%    \end{macrocode}
% \changes{babel~3.7a}{1998/03/27}{Added the \Lopt{hebrew} option}
%    \begin{macrocode}
\DeclareOption{hebrew}{%
  \input{rlbabel.def}%
  \input{hebrew.ldf}}
%    \end{macrocode}
%    \Lopt{hungarian} is just a synonym for \Lopt{magyar}
%^^A \changes{babel~3.6i}{1997/02/21}{Added the \Lopt{kannada} option}
% \changes{babel~3.7a}{1997/05/21}{Added the \Lopt{icelandic} option}
%^^A \changes{babel~3.7a}{1998/03/30}{{Added the \Lopt{nagari} option}
% \changes{babel~3.7b}{1998/06/25}{Added the \Lopt{latin} option}
% \changes{babel~3.7m}{2003/11/13}{Added the \Lopt{interlingua}
%    option}
%    \begin{macrocode}
\DeclareOption{hungarian}{\input{magyar.ldf}}
\DeclareOption{icelandic}{\input{icelandic.ldf}}
\DeclareOption{interlingua}{\input{interlingua.ldf}}
\DeclareOption{irish}{\input{irish.ldf}}
\DeclareOption{italian}{\input{italian.ldf}}
\DeclareOption{latin}{\input{latin.ldf}}
\DeclareOption{lowersorbian}{\input{lsorbian.ldf}}
%^^A\DeclareOption{kannada}{\input{kannada.ldf}}
\DeclareOption{magyar}{\input{magyar.ldf}}
%^^A\DeclareOption{nagari}{\input{nagari.ldf}}
%    \end{macrocode}
%    `New' German orthography, including Austrian variant:
% \changes{babel~3.6p}{1999/04/10}{Added the \Lopt{ngerman} and
%    \Lopt{naustrian} options}
% \changes{babel~3.7f}{2000/09/26}{Added the \Lopt{samin} option}
% \changes{babel~3.8c}{2004/06/12}{Added the \Lopt{newzealand} option}
%    \begin{macrocode}
\DeclareOption{naustrian}{\input{ngermanb.ldf}}
\DeclareOption{newzealand}{\input{english.ldf}}
\DeclareOption{ngerman}{\input{ngermanb.ldf}}
\DeclareOption{norsk}{\input{norsk.ldf}}
\DeclareOption{samin}{\input{samin.ldf}}
%    \end{macrocode}
%    For Norwegian two spelling variants are provided.
%    \begin{macrocode}
\DeclareOption{nynorsk}{\input{norsk.ldf}}
\DeclareOption{polish}{\input{polish.ldf}}
\DeclareOption{portuges}{\input{portuges.ldf}}
\DeclareOption{portuguese}{\input{portuges.ldf}}
\DeclareOption{romanian}{\input{romanian.ldf}}
\DeclareOption{russian}{\input{russianb.ldf}}
%    \end{macrocode}
%^^A \changes{babel~3.7a}{1997/02/07}{Added the \Lopt{sanskrit} option}
% \changes{babel~3.6i}{1997/02/21}{Added the \Lopt{ukrainian} option}
%^^A \changes{babel~3.7a}{1998/03/30}{Added the \Lopt{tamil} option}
%    \begin{macrocode}
%^^A\DeclareOption{sanskrit}{\input{sanskrit.ldf}}
\DeclareOption{scottish}{\input{scottish.ldf}}
\DeclareOption{serbian}{\input{serbian.ldf}}
\DeclareOption{slovak}{\input{slovak.ldf}}
\DeclareOption{slovene}{\input{slovene.ldf}}
\DeclareOption{spanish}{\input{spanish.ldf}}
\DeclareOption{swedish}{\input{swedish.ldf}}
%^^A\DeclareOption{tamil}{\input{tamil.ldf}}
\DeclareOption{turkish}{\input{turkish.ldf}}
\DeclareOption{ukrainian}{\input{ukraineb.ldf}}
\DeclareOption{uppersorbian}{\input{usorbian.ldf}}
\DeclareOption{welsh}{\input{welsh.ldf}}
%    \end{macrocode}
% \changes{babel~3.6e}{1997/01/08}{Added options \Lopt{UKenglish} and
%    \Lopt{USenglish}}
%    \begin{macrocode}
\DeclareOption{UKenglish}{\input{english.ldf}}
\DeclareOption{USenglish}{\input{english.ldf}}
%    \end{macrocode}
%
%    For all those languages for which the option name is the same as
%    the name of the language specific file we specify a default
%    option, which tries to load the file specified. If this doesn't
%    succeed an error is signalled.
% \changes{babel~3.6i}{1997/03/12}{Added default option}
%    \begin{macrocode}
\DeclareOption*{%
  \InputIfFileExists{\CurrentOption.ldf}{}{%
    \PackageError{babel}{%
      Language definition file \CurrentOption.ldf not found}{%
      Maybe you misspelled the language option?}}%
  }
%    \end{macrocode}
%    Another way to extend the list of `known' options for \babel\ is
%    to create the file \file{bblopts.cfg} in which one can add
%    option declarations.
% \changes{babel~3.6i}{1997/03/15}{Added the possibility to have a
%    \file{bblopts.cfg} file with option declarations.}
%    \begin{macrocode}
\InputIfFileExists{bblopts.cfg}{%
  \typeout{*************************************^^J%
           * Local config file bblopts.cfg used^^J%
           *}%
  }{}
%    \end{macrocode}
%
%    Apart from all the language options we also have a few options
%    that influence the behaviour of language definition files.
%
%    The following options don't do anything themselves, they are just
%    defined in order to make it possible for language definition
%    files to check if one of them was specified by the user.
% \changes{babel~3.5d}{1995/07/04}{Added options to influence
%    behaviour of active acute and grave accents}
%    \begin{macrocode}
\DeclareOption{activeacute}{}
\DeclareOption{activegrave}{}
%    \end{macrocode}
%    The next option tells \babel\ to leave shorthand characters
%    active at the end of processing the package. This is \emph{not}
%    the default as it can cause problems with other packages, but for
%    those who want to use the shorthand characters in the preamble of
%    their documents this can help.
% \changes{babel~3.6f}{1997/01/14}{Added option
%    \Lopt{KeepShorthandsActive}}
% \changes{babel~3.7a}{1997/03/21}{No longer define the control
%    sequence \cs{KeepShorthandsActive}}
%    \begin{macrocode}
\DeclareOption{KeepShorthandsActive}{}
%    \end{macrocode}
%
%    The options have to be processed in the order in which the user
%    specified them:
%    \begin{macrocode}
\ProcessOptions*
%    \end{macrocode}
% \changes{babel~3.7c}{1999/03/13}{Added an error message for when no
%    language option was specified}
%    In order to catch the case where the user forgot to specify a
%    language we check whether |\bbl@main@language|, has become
%    defined. If not, no language has been loaded and an error
%    message is displayed.
% \changes{babel~3.7c}{1999/04/09}{No longer us a redefinition of an
%    internal macro, just check \cs{bbl@main@language} and load
%    \file{babel.def}}
%    \begin{macrocode}
\ifx\bbl@main@language\@undefined
  \PackageError{babel}{%
    You haven't specified a language option}{%
    You need to specify a language, either as a global
    option\MessageBreak
    or as an optional argument to the \string\usepackage\space
    command; \MessageBreak
    You shouldn't try to proceed from here, type x to quit.}
%    \end{macrocode}
%    To prevent undefined command errors when the user insists on
%    continuing we load \file{babel.def} here. He should expect more
%    errors though.
%    \begin{macrocode}
  \input{babel.def}
\fi
%    \end{macrocode}
%
%  \begin{macro}{\substitutefontfamily}
%    The command |\substitutefontfamily| creates an \file{.fd} file on
%    the fly. The first argument is an encoding mnemonic, the second
%    and third arguments are font family names.
% \changes{babel~3.7j}{2003/06/15}{create file with lowercase name}
%    \begin{macrocode}
\def\substitutefontfamily#1#2#3{%
  \lowercase{\immediate\openout15=#1#2.fd\relax}%
  \immediate\write15{%
    \string\ProvidesFile{#1#2.fd}%
    [\the\year/\two@digits{\the\month}/\two@digits{\the\day}
     \space generated font description file]^^J
    \string\DeclareFontFamily{#1}{#2}{}^^J
    \string\DeclareFontShape{#1}{#2}{m}{n}{<->ssub * #3/m/n}{}^^J
    \string\DeclareFontShape{#1}{#2}{m}{it}{<->ssub * #3/m/it}{}^^J
    \string\DeclareFontShape{#1}{#2}{m}{sl}{<->ssub * #3/m/sl}{}^^J
    \string\DeclareFontShape{#1}{#2}{m}{sc}{<->ssub * #3/m/sc}{}^^J
    \string\DeclareFontShape{#1}{#2}{b}{n}{<->ssub * #3/bx/n}{}^^J
    \string\DeclareFontShape{#1}{#2}{b}{it}{<->ssub * #3/bx/it}{}^^J
    \string\DeclareFontShape{#1}{#2}{b}{sl}{<->ssub * #3/bx/sl}{}^^J
    \string\DeclareFontShape{#1}{#2}{b}{sc}{<->ssub * #3/bx/sc}{}^^J
    }%
  \closeout15
  }
%    \end{macrocode}
%    This command should only be used in the preamble of a document.
%    \begin{macrocode}
\@onlypreamble\substitutefontfamily
%    \end{macrocode}
%  \end{macro}
%
%    \begin{macrocode}
%</package>
%    \end{macrocode}
%
% \section{The Kernel of Babel}
%
%    The kernel of the \babel\ system is stored in either
%    \file{hyphen.cfg} or \file{switch.def} and \file{babel.def}. The
%    file \file{hyphen.cfg} is a file that can be loaded into the
%    format, which is necessary when you want to be able to switch
%    hyphenation patterns. The file \file{babel.def} contains some
%    \TeX\ code that can be read in at run time. When \file{babel.def}
%    is loaded it checks if \file{hyphen.cfg} is in the format; if
%    not the file \file{switch.def} is loaded.
%
%    Because plain \TeX\ users might want to use some of the features
%    of the \babel{} system too, care has to be taken that plain \TeX\
%    can process the files. For this reason the current format will
%    have to be checked in a number of places. Some of the code below
%    is common to plain \TeX\ and \LaTeX, some of it is for the
%    \LaTeX\ case only.
%
%    When the command |\AtBeginDocument| doesn't exist we assume that
%    we are dealing with a plain-based format. In that case the file
%    \file{plain.def} is needed.
%
%    \begin{macrocode}
%<*kernel|core>
\ifx\AtBeginDocument\@undefined
%    \end{macrocode}
%    But we need to use the second part of \file{plain.def} (when we
%    load it from \file{switch.def}) which we can do by defining
%    |\adddialect|.
% \changes{babel~3.7c}{1999/04/20}{define \cs{adddialect} before
%    loading \file{plain.def} here}
%    \begin{macrocode}
%<kernel&!patterns>  \def\adddialect{}
  \input plain.def\relax
\fi
%</kernel|core>
%    \end{macrocode}
%
%    Check the presence of the command |\iflanguage|, if it is
%    undefined read the file \file{switch.def}.
% \changes{babel~3.0d}{1991/10/29}{Removed use of \cs{@ifundefined}}
%    \begin{macrocode}
%<*core>
\ifx\iflanguage\@undefined
  \input switch.def\relax
\fi
%</core>
%    \end{macrocode}
% \changes{babel~3.6a}{1996/11/02}{Removed \cs{babel@core@loaded}, no
%    longer needed with the advent of \cs{LdfInit}}
%
%  \subsection{Encoding issues (part 1)}
%
%    The first thing we need to do is to determine, at
%    |\begin{document}|, which latin fontencoding to use.
%
%  \begin{macro}{\latinencoding}
% \changes{babel~3.6i}{1997/03/15}{Macro added, moved from
%    \file{.ldf} files}
%    When text is being typeset in an encoding other than `latin'
%    (\texttt{OT1} or \texttt{T1}), it would be nice to still have
%    Roman numerals come out in the Latin encoding.
%    So we first assume that the current encoding at the end
%    of processing the package is the Latin encoding.
%    \begin{macrocode}
%<*core>
\AtEndOfPackage{\edef\latinencoding{\cf@encoding}}
%    \end{macrocode}
%    But this might be overruled with a later loading of the package
%    \pkg{fontenc}. Therefor we check at the execution of
%    |\begin{document}| whether it was loaded with the \Lopt{T1}
%    option. The normal way to do this (using |\@ifpackageloaded|) is
%    disabled for this package. Now we have to revert to parsing the
%    internal macro |\@filelist| which contains all the filenames
%    loaded.
% \changes{babel~3.6k}{1999/03/15}{Use T1 encoding when it is a known
%    encoding}
% \changes{babel~3.6m}{1999/04/06}{Can't use \cs{@ifpackageloaded}
%    need to parse \cs{@filelist}}
% \changes{babel~3.6n}{1999/04/07}{moved checking for fontenc right to
%    the top of \file{babel.sty}}
% \changes{babel~3.6n}{1999/04/07}{Added a check for `manual' selection
%    of \texttt{T1} encoding, without loading \pkg{fontenc}}
% \changes{babel~3.6q}{1999/04/12}{Better solution then parsing
%    \cs{@filelist}, use \cs{@ifl@aded}}
% \changes{babel~3.6u}{1999/04/20}{Moved this code to
%    \file{babel.def}}
%    \begin{macrocode}
\AtBeginDocument{%
  \gdef\latinencoding{OT1}%
  \ifx\cf@encoding\bbl@t@one
    \xdef\latinencoding{\bbl@t@one}%
  \else
    \@ifl@aded{def}{t1enc}{\xdef\latinencoding{\bbl@t@one}}{}%
  \fi
  }
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\latintext}
% \changes{babel~3.6i}{1997/03/15}{Macro added, moved from
%    \file{.ldf} files}
%    Then we can define the command |\latintext| which is a
%    declarative switch to a latin font-encoding.
%    \begin{macrocode}
\DeclareRobustCommand{\latintext}{%
  \fontencoding{\latinencoding}\selectfont
  \def\encodingdefault{\latinencoding}}
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\textlatin}
% \changes{babel~3.6i}{1997/03/15}{Macro added, moved from
%    \file{.ldf} files}
% \changes{babel~3.7j}{2003/03/19}{added \cs{leavevmode} to prevent a
%    paragraph starting \emph{inside} the group}
% \changes{babel~3.7k}{2003/10/12}{Use \cs{DeclareTextFontComand}}
%    This command takes an argument which is then typeset using the
%    requested font encoding. In order to avoid many encoding switches
%    it operates in a local scope.
%    \begin{macrocode}
\ifx\@undefined\DeclareTextFontCommand
  \DeclareRobustCommand{\textlatin}[1]{\leavevmode{\latintext #1}}
\else
  \DeclareTextFontCommand{\textlatin}{\latintext}
\fi
%</core>
%    \end{macrocode}
%  \end{macro}
%
%    We also need to redefine a number of commands to ensure that the
%    right font encoding is used, but this can't be done before
%    \file{babel.def} is loaded.
% \changes{babel~3.6o}{1999/04/07}{Moved the rest of the font encoding
%    related definitions to their original place}
%
% \subsection{Multiple languages}
%
%    With \TeX\ version~3.0 it has become possible to load hyphenation
%    patterns for more than one language. This means that some extra
%    administration has to be taken care of.  The user has to know for
%    which languages patterns have been loaded, and what values of
%    |\language| have been used.
%
%    Some discussion has been going on in the \TeX\ world about how to
%    use |\language|. Some have suggested to set a fixed standard,
%    i.\,e., patterns for each language should \emph{always} be loaded
%    in the same location. It has also been suggested to use the
%    \textsc{iso} list for this purpose. Others have pointed out that
%    the \textsc{iso} list contains more than 256~languages, which
%    have \emph{not} been numbered consecutively.
%
%    I think the best way to use |\language|, is to use it
%    dynamically.  This code implements an algorithm to do so. It uses
%    an external file in which the person who maintains a \TeX\
%    environment has to record for which languages he has hyphenation
%    patterns \emph{and} in which files these are stored\footnote{This
%    is because different operating systems sometimes use \emph{very}
%    different file-naming conventions.}. When hyphenation exceptions
%    are stored in a separate file this can be indicated by naming
%    that file \emph{after} the file with the hyphenation patterns.
%
%    This ``configuration file'' can contain empty lines and comments,
%    as well as lines which start with an equals (\texttt{=})
%    sign. Such a line will instruct \LaTeX\ that the hyphenation
%    patterns just processed have to be known under an alternative
%    name. Here is an example:
%  \begin{verbatim}
%    % File    : language.dat
%    % Purpose : tell iniTeX what files with patterns to load.
%    english    english.hyphenations
%    =british
%
%    dutch      hyphen.dutch exceptions.dutch % Nederlands
%    german hyphen.ger
%  \end{verbatim}
%
%    As the file \file{switch.def} needs to be read only once, we
%    check whether it was read before.  If it was, the command
%    |\iflanguage| is already defined, so we can stop processing.
%    \begin{macrocode}
%<*kernel>
%<*!patterns>
\expandafter\ifx\csname iflanguage\endcsname\relax \else
\expandafter\endinput
\fi
%</!patterns>
%    \end{macrocode}
%
%  \begin{macro}{\language}
%    Plain \TeX\ version~3.0 provides the primitive |\language| that
%    is used to store the current language. When used with a pre-3.0
%    version this function has to be implemented by allocating a
%    counter.
%    \begin{macrocode}
\ifx\language\@undefined
  \csname newcount\endcsname\language
\fi
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\last@language}
%    Another counter is used to store the last language defined.  For
%    pre-3.0 formats an extra counter has to be allocated,
%    \begin{macrocode}
\ifx\newlanguage\@undefined
  \csname newcount\endcsname\last@language
%    \end{macrocode}
%    plain \TeX\ version 3.0 uses |\count 19| for this purpose.
%    \begin{macrocode}
\else
  \countdef\last@language=19
\fi
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\addlanguage}
%
%    To add languages to \TeX's memory plain \TeX\ version~3.0
%    supplies |\newlanguage|, in a pre-3.0 environment a similar macro
%    has to be provided. For both cases a new macro is defined here,
%    because the original |\newlanguage| was defined to be |\outer|.
%
%    For a format based on plain version~2.x, the definition of
%    |\newlanguage| can not be copied because |\count 19| is used for
%    other purposes in these formats. Therefor |\addlanguage| is
%    defined using a definition based on the macros used to define
%    |\newlanguage| in plain \TeX\ version~3.0.
% \changes{babel~3.2}{1991/11/11}{Added a \texttt{\%}, removed
%    \texttt{by}}
%    \begin{macrocode}
\ifx\newlanguage\@undefined
  \def\addlanguage#1{%
    \global\advance\last@language \@ne
    \ifnum\last@language<\@cclvi
    \else
        \errmessage{No room for a new \string\language!}%
    \fi
    \global\chardef#1\last@language
    \wlog{\string#1 = \string\language\the\last@language}}
%    \end{macrocode}
%
%    For formats based on plain version~3.0 the definition of
%    |\newlanguage| can be simply copied, removing |\outer|.
%
%    \begin{macrocode}
\else
  \def\addlanguage{\alloc@9\language\chardef\@cclvi}
\fi
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\adddialect}
%    The macro |\adddialect| can be used to add the name of a dialect
%    or variant language, for which an already defined hyphenation
%    table can be used.
% \changes{babel~3.2}{1991/11/11}{Added \cs{relax}}
%    \begin{macrocode}
\def\adddialect#1#2{%
    \global\chardef#1#2\relax
    \wlog{\string#1 = a dialect from \string\language#2}}
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\iflanguage}
%    Users might want to test (in a private package for instance)
%    which language is currently active. For this we provide a test
%    macro, |\iflanguage|, that has three arguments.  It checks
%    whether the first argument is a known language. If so, it
%    compares the first argument with the value of |\language|. Then,
%    depending on the result of the comparison, it executes either the
%    second or the third argument.
% \changes{babel~3.0a}{1991/05/29}{Added \cs{@bsphack} and
%    \cs{@esphack}}
% \changes{babel~3.0c}{1991/07/21}{Added comment character after
%    \texttt{\#2}}
% \changes{babel~3.0d}{1991/08/08}{Removed superfluous
%    \cs{expandafter}}
% \changes{babel~3.0d}{1991/10/07}{Removed space hacks and use of
%    \cs{@ifundefined}}
% \changes{babel~3.2}{1991/11/11}{Rephrased \cs{ifnum} test}
% \changes{babel~3.7a}{1998/06/10}{Now evaluate the \cs{ifnum} test
%    \emph{after} the \cs{fi} from the \cs{ifx} test and use
%    \cs{@firstoftwo} and \cs{@secondoftwo}}
% \changes{babel~3.7b}{1998/06/29}{Slight enhancement: added braces
%    around first argument of \cs{bbl@afterfi}}
%    \begin{macrocode}
\def\iflanguage#1{%
  \expandafter\ifx\csname l@#1\endcsname\relax
    \@nolanerr{#1}%
  \else
    \bbl@afterfi{\ifnum\csname l@#1\endcsname=\language
      \expandafter\@firstoftwo
    \else
      \expandafter\@secondoftwo
    \fi}%
  \fi}
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\selectlanguage}
%    The macro |\selectlanguage| checks whether the language is
%    already defined before it performs its actual task, which is to
%    update |\language| and activate language-specific definitions.
%
%    To allow the call of |\selectlanguage| either with a control
%    sequence name or with a simple string as argument, we have to use
%    a trick to delete the optional escape character.
%
%    To convert a control sequence to a string, we use the |\string|
%    primitive.  Next we have to look at the first character of this
%    string and compare it with the escape character.  Because this
%    escape character can be changed by setting the internal integer
%    |\escapechar| to a character number, we have to compare this
%    number with the character of the string.  To do this we have to
%    use \TeX's backquote notation to specify the character as a
%    number.
%
%    If the first character of the |\string|'ed argument is the
%    current escape character, the comparison has stripped this
%    character and the rest in the `then' part consists of the rest of
%    the control sequence name.  Otherwise we know that either the
%    argument is not a control sequence or |\escapechar| is set to a
%    value outside of the character range~$0$--$255$.
%
%    If the user gives an empty argument, we provide a default
%    argument for |\string|.  This argument should expand to nothing.
%
% \changes{babel~3.0c}{1991/06/06}{Made \cs{selectlanguage}
%    robust}
% \changes{babel~3.2}{1991/11/11}{Modified to allow arguments that
%    start with an escape character}
% \changes{babel~3.2a}{1991/11/17}{Simplified the modification to
%    allow the use in a \cs{write} command}
% \changes{babel~3.5b}{1995/05/13}{Store the name of the current
%    language in a control sequence instead of passing the whole macro
%    construct to strip the escape character in the argument of
%    \cs{selectlanguage }.}
% \changes{babel~3.5f}{1995/08/30}{Added a missing percent character}
% \changes{babel~3.5f}{1995/11/16}{Moved check for escape character
%    one level down in the expansion}
%    \begin{macrocode}
\edef\selectlanguage{%
  \noexpand\protect
  \expandafter\noexpand\csname selectlanguage \endcsname
  }
%    \end{macrocode}
%    Because the command |\selectlanguage| could be used in a moving
%    argument it expands to \verb*=\protect\selectlanguage =.
%    Therefor, we have to make sure that a macro |\protect| exists.
%    If it doesn't it is |\let| to |\relax|.
%    \begin{macrocode}
\ifx\@undefined\protect\let\protect\relax\fi
%    \end{macrocode}
%    As \LaTeX$\:$2.09 writes to files \textit{expanded} whereas
%    \LaTeXe\ takes care \textit{not} to expand the arguments of
%    |\write| statements we need to be a bit clever about the way we
%    add information to \file{.aux} files. Therefor we introduce the
%    macro |\xstring| which should expand to the right amount of
%    |\string|'s.
%    \begin{macrocode}
\ifx\documentclass\@undefined
  \def\xstring{\string\string\string}
\else
  \let\xstring\string
\fi
%    \end{macrocode}
%
% \changes{babel~3.5b}{1995/03/04}{Changed the name of the internal
%    macro to \cs{selectlanguage }.}
% \changes{babel~3.5b}{1995/03/05}{Added an extra level of expansion to
%    separate the switching mechanism from writing to aux files}
% \changes{babel~3.7f}{2000/09/25}{Use \cs{aftergroup} to keep the
%    language grouping correct in auxiliary files {PR3091}}
%    Since version 3.5 \babel\ writes entries to the auxiliary files in
%    order to typeset table of contents etc. in the correct language
%    environment.
%  \begin{macro}{\bbl@pop@language}
%    \emph{But} when the language change happens \emph{inside} a group
%    the end of the group doesn't write anything to the auxiliary
%    files. Therefor we need \TeX's |aftergroup| mechanism to help
%    us. The command |\aftergroup| stores the token immediately
%    following it to be executed when the current group is closed. So
%    we define a temporary control sequence |\bbl@pop@language| to be
%    executed at the end of the group. It calls |\bbl@set@language|
%    with the name of the current language as its argument.
%
% \changes{babel~3.7j}{2003/03/18}{Introduce the language stack
%    mechanism}
%  \begin{macro}{\bbl@language@stack}
%    The previous solution works for one level of nesting groups, but
%    as soon as more levels are used it is no longer adequate. For
%    that case we need to keep track of the nested languages using a
%    stack mechanism. This stack is called |\bbl@language@stack| and
%    initially empty.
%    \begin{macrocode}
\xdef\bbl@language@stack{}
%    \end{macrocode}
%    When using a stack we need a mechanism to push an element on the
%    stack and to retrieve the information afterwards.
%  \begin{macro}{\bbl@push@language}
%  \begin{macro}{\bbl@pop@language}
%    The stack is simply a list of languagenames, separated with a `+'
%    sign; the push function can be simple:
%    \begin{macrocode}
\def\bbl@push@language{%
  \xdef\bbl@language@stack{\languagename+\bbl@language@stack}%
  }
%    \end{macrocode}
%    Retrieving information from the stack is a little bit less simple,
%    as we need to remove the element from the stack while storing it
%    in the macro |\languagename|. For this we first define a helper function.
%  \begin{macro}{\bbl@pop@lang}
%    This macro stores its first element (which is delimited by the
%    `+'-sign) in |\languagename| and stores the rest of the string
%    (delimited by `-') in its third argument.
%    \begin{macrocode}
\def\bbl@pop@lang#1+#2-#3{%
  \def\languagename{#1}\xdef#3{#2}%
  }
%    \end{macrocode}
%  \end{macro}
%    The reason for the somewhat weird arrangement of arguments to the
%    helper function is the fact it is called in the following way:
%    \begin{macrocode}
\def\bbl@pop@language{%
  \expandafter\bbl@pop@lang\bbl@language@stack-\bbl@language@stack
%    \end{macrocode}
%    This means that before |\bbl@pop@lang| is executed \TeX\ first
%    \emph{expands} the stack, stored in |\bbl@language@stack|. The
%    result of that is that the argument string of |\bbl@pop@lang|
%    contains one or more language names, each followed by a `+'-sign
%    (zero language names won't occur as this macro will only be
%    called after something has been pushed on the stack) followed by
%    the `-'-sign and finally the reference to the stack.
%    \begin{macrocode}$$
  \expandafter\bbl@set@language\expandafter{\languagename}%
  }
%    \end{macrocode}
%    Once the name of the previous language is retrieved from the stack,
%    it is fed to |\bbl@set@language| to do the actual work of
%    switching everything that needs switching.
%  \end{macro}
%  \end{macro}
%  \end{macro}
%
% \changes{babel~3.7j}{2003/03/18}{Now use the language stack mechanism}
%    \begin{macrocode}
\expandafter\def\csname selectlanguage \endcsname#1{%
  \bbl@push@language
  \aftergroup\bbl@pop@language
  \bbl@set@language{#1}}
%    \end{macrocode}
% \changes{babel~3.7m}{2003/11/12}{Removed the superfluous empty
%    definition of \cs{bbl@pop@language}}
%  \end{macro}
%
%  \begin{macro}{\bbl@set@language}
% \changes{babel~3.5f}{1995/11/16}{Now also define \cs{languagename}
%    at this level}
% \changes{babel~3.7f}{2000/09/25}{Macro \cs{bbl@set@language}
%    introduced}
%    The macro |\bbl@set@language| takes care of switching the language
%    environment \emph{and} of writing entries on the auxiliary files.
%    \begin{macrocode}
\def\bbl@set@language#1{%
  \edef\languagename{%
    \ifnum\escapechar=\expandafter`\string#1\@empty
    \else \string#1\@empty\fi}%
  \select@language{\languagename}%
%    \end{macrocode}
%    We also write a command to change the current language in the
%    auxiliary files.
% \changes{babel~3.5a}{1995/02/17}{write the language change to the
%    auxiliary files}
%    \begin{macrocode}
  \if@filesw
    \protected@write\@auxout{}{\string\select@language{\languagename}}%
    \addtocontents{toc}{\xstring\select@language{\languagename}}%
    \addtocontents{lof}{\xstring\select@language{\languagename}}%
    \addtocontents{lot}{\xstring\select@language{\languagename}}%
  \fi}
%    \end{macrocode}
%  \end{macro}
%
%    First, check if the user asks for a known language. If so,
%    update the value of |\language| and call |\originalTeX|
%    to bring \TeX\ in a certain pre-defined state.
% \changes{babel~3.0a}{1991/05/29}{Added \cs{@bsphack} and
%    \cs{@esphack}}
% \changes{babel~3.0d}{1991/08/08}{Removed superfluous
%    \cs{expandafter}}
% \changes{babel~3.0d}{1991/10/07}{Removed space hacks and use of
%    \cs{@ifundefined}}
% \changes{babel~3.2a}{1991/11/17}{Added \cs{relax} as first command
%    to stop an expansion if \cs{protect} is empty}
% \changes{babel~3.6a}{1996/11/07}{Check for the existence of
%    \cs{date...} instead of \cs{l@...}}
% \changes{babel~3.7m}{2003/11/16}{Check for the existence of both
%    \cs{l@...} and \cs{date...}}
%    \begin{macrocode}
\def\select@language#1{%
  \expandafter\ifx\csname l@#1\endcsname\relax
    \@nolanerr{#1}%
  \else
    \expandafter\ifx\csname date#1\endcsname\relax
      \@noopterr{#1}%
    \else
      \language=\csname l@#1\endcsname\relax
      \originalTeX
%    \end{macrocode}
%    The name of the language is stored in the control sequence
%    |\languagename|. The contents of this control sequence could be
%    tested in the following way:
%  \begin{verbatim}
%    \edef\tmp{\string english}
%    \ifx\languagename\tmp
%        ...
%    \else
%        ...
%    \fi
%  \end{verbatim}
%    The construction with |\string| is necessary because
%    |\languagename| returns the name with characters of category code
%    \texttt{12} (other).  Then we have to \emph{re}define
%    |\originalTeX| to compensate for the things that have been
%    activated.  To save memory space for the macro definition of
%    |\originalTeX|, we construct the control sequence name for the
%    |\noextras|\langvar\ command at definition time by expanding the
%    |\csname| primitive.
% \changes{babel~3.0a}{1991/06/06}{Replaced \cs{gdef} with \cs{def}}
% \changes{babel~3.1}{1991/10/31}{\cs{originalTeX} should only be
%    executed once}
% \changes{babel~3.2a}{1991/11/17}{Added three \cs{expandafter}s
%    to save macro space for \cs{originalTeX}}
% \changes{babel~3.2a}{1991/11/20}{Moved definition of
%    \cs{originalTeX} before \cs{extras\langvar}}
% \changes{babel~3.2a}{1991/11/24}{Set \cs{originalTeX} to
%    \cs{empty}, because it should be expandable.}
%    \begin{macrocode}
      \expandafter\def\expandafter\originalTeX
          \expandafter{\csname noextras#1\endcsname
                       \let\originalTeX\@empty}%
%    \end{macrocode}
% \changes{babel~3.6d}{1997/01/07}{set the language shorthands to
%    `none' before switching on the extras}
%    \begin{macrocode}
      \languageshorthands{none}%
      \babel@beginsave
%    \end{macrocode}
%    Now activate the language-specific definitions. This is done by
%    constructing the names of three macros by concatenating three
%    words with the argument of |\selectlanguage|, and calling these
%    macros.
% \changes{babel~3.5b}{1995/05/13}{Separated the setting of the
%    hyphenmin values}
%    \begin{macrocode}
      \csname captions#1\endcsname
      \csname date#1\endcsname
      \csname extras#1\endcsname\relax
%    \end{macrocode}
%    The switching of the values of |\lefthyphenmin| and
%    |\righthyphenmin| is somewhat different. First we save their
%    current values, then we check if |\|\langvar|hyphenmins| is
%    defined. If it is not, we set default values (2 and 3), otherwise
%    the values in |\|\langvar|hyphenmins| will be used.
% \changes{babel~3.5b}{1995/06/05}{Addedd default setting of hyphenmin
%    parameters}
%    \begin{macrocode}
      \babel@savevariable\lefthyphenmin
      \babel@savevariable\righthyphenmin
      \expandafter\ifx\csname #1hyphenmins\endcsname\relax
        \set@hyphenmins\tw@\thr@@\relax
      \else
        \expandafter\expandafter\expandafter\set@hyphenmins
          \csname #1hyphenmins\endcsname\relax
      \fi
    \fi
  \fi}
%    \end{macrocode}
%  \end{macro}
%
%  \begin{environment}{otherlanguage}
%    The \Lenv{otherlanguage} environment can be used as an
%    alternative to using the |\selectlanguage| declarative
%    command. When you are typesetting a document which mixes
%    left-to-right and right-to-left typesetting you have to use this
%    environment in order to let things work as you expect them to.
%
%    The first thing this environment does is store the name of the
%    language in |\languagename|; it then calls
%    \verb*=\selectlanguage = to switch on everything that is needed for
%    this language The |\ignorespaces| command is necessary to hide
%    the environment when it is entered in horizontal mode.
% \changes{babel~3.5d}{1995/06/22}{environment added}
% \changes{babel~3.5e}{1995/07/07}{changed name}
% \changes{babel~3.7j}{2003/03/18}{rely on \cs{selectlanguage } to
%    keep track of the nesting}
%    \begin{macrocode}
\long\def\otherlanguage#1{%
  \csname selectlanguage \endcsname{#1}%
  \ignorespaces
  }
%    \end{macrocode}
%    The |\endotherlanguage| part of the environment calls
%    |\originalTeX| to restore (most of) the settings and tries to
%    hide itself when it is called in horizontal mode.
%    \begin{macrocode}
\long\def\endotherlanguage{%
  \originalTeX
  \global\@ignoretrue\ignorespaces
  }
%    \end{macrocode}
%  \end{environment}
%
%
%  \begin{environment}{otherlanguage*}
%    The \Lenv{otherlanguage} environment is meant to be used when a
%    large part of text from a different language needs to be typeset,
%    but without changing the translation of words such as `figure'.
%
%    This environment makes use of |\foreign@language|.
% \changes{babel~3.5f}{1996/05/29}{environment added}
% \changes{babel~3.6d}{1997/01/07}{Introduced \cs{foreign@language}}
%    \begin{macrocode}
\expandafter\def\csname otherlanguage*\endcsname#1{%
  \foreign@language{#1}%
  }
%    \end{macrocode}
%    At the end of the environment we need to switch off the extra
%    definitions. The grouping mechanism of the environment will take
%    care of resetting the correct hyphenation rules.
%    \begin{macrocode}
\expandafter\def\csname endotherlanguage*\endcsname{%
  \csname noextras\languagename\endcsname
  }
%    \end{macrocode}
%  \end{environment}
%
%  \begin{macro}{\foreignlanguage}
%    The |\foreignlanguage| command is another substitute for the
%    |\selectlanguage| command. This command takes two arguments, the
%    first argument is the name of the language to use for typesetting
%    the text specified in the second argument.
%
%    Unlike |\selectlanguage| this command doesn't switch
%    \emph{everything}, it only switches the hyphenation rules and the
%    extra definitions for the language specified. It does this within
%    a group and assumes the |\extras|\langvar\ command doesn't make
%    any |\global| changes. The coding is very similar to part of
%    |\selectlanguage|.
% \changes{babel~3.5d}{1995/06/22}{Macro added}
% \changes{babel~3.6d}{1997/01/07}{Introduced \cs{foreign@language}}
% \changes{babel~3.7a}{1998/03/12}{Added executing \cs{originalTeX}}
%    \begin{macrocode}
\def\foreignlanguage{\protect\csname foreignlanguage \endcsname}
\expandafter\def\csname foreignlanguage \endcsname#1#2{%
  \begingroup
    \originalTeX
    \foreign@language{#1}%
    #2%
    \csname noextras#1\endcsname
  \endgroup
  }
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\foreign@language}
% \changes{babel~3.6d}{1997/01/07}{New macro}
%    This macro does the work for |\foreignlanguage| and the
%    \Lenv{otherlanguage*} environment.
%    \begin{macrocode}
\def\foreign@language#1{%
%    \end{macrocode}
%    First we need to store the name of the language and check that it
%    is a known language.
%    \begin{macrocode}
  \def\languagename{#1}%
  \expandafter\ifx\csname l@#1\endcsname\relax
    \@nolanerr{#1}%
  \else
%    \end{macrocode}
%    If it is we can select the proper hyphenation table and switch on
%    the extra definitions for this language.
% \changes{babel~3.6d}{1997/01/07}{set the language shorthands to
%    `none' before switching on the extras}
%    \begin{macrocode}
    \language=\csname l@#1\endcsname\relax
    \languageshorthands{none}%
%    \end{macrocode}
%    Then we set the left- and right hyphenmin variables.
% \changes{babel~3.6d}{1997/01/07}{Added \cs{relax} to prevent
%    disappearance of the first token after this command.}
%    \begin{macrocode}
    \csname extras#1\endcsname
    \expandafter\ifx\csname #1hyphenmins\endcsname\relax
      \set@hyphenmins\tw@\thr@@\relax
    \else
      \expandafter\expandafter\expandafter\set@hyphenmins
        \csname #1hyphenmins\endcsname\relax
    \fi
  \fi
  }
%    \end{macrocode}
%  \end{macro}
%
%  \begin{environment}{hyphenrules}
% \changes{babel~3.7e}{2000/01/28}{Added environment hyphenrules}
%    The environment \Lenv{hyphenrules} can be used to select
%    \emph{just} the hyphenation rules. This environment does
%    \emph{not} change |\languagename| and when the hyphenation rules
%    specified were not loaded it has no effect.
%    \begin{macrocode}
\def\hyphenrules#1{%
  \expandafter\ifx\csname l@#1\endcsname\@undefined
    \@nolanerr{#1}%
  \else
    \language=\csname l@#1\endcsname\relax
    \languageshorthands{none}%
  \fi
  }
\def\endhyphenrules{}
%    \end{macrocode}
%  \end{environment}
%
%  \begin{macro}{\providehyphenmins}
% \changes{babel~3.7f}{2000/02/18}{added macro}
%    The macro |\providehyphenmins| should be used in the language
%    definition files to provide a \emph{default} setting for the
%    hyphenation parameters |\lefthyphenmin| and |\righthyphenmin|. If
%    the macro |\|\langvar|hyphenmins| is already defined this command
%    has no effect.
%    \begin{macrocode}
\def\providehyphenmins#1#2{%
  \expandafter\ifx\csname #1hyphenmins\endcsname\relax
    \@namedef{#1hyphenmins}{#2}%
  \fi}
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\set@hyphenmins}
%    This macro sets the values of |\lefthyphenmin| and
%    |\righthyphenmin|. It expects two values as its argument.
%    \begin{macrocode}
\def\set@hyphenmins#1#2{\lefthyphenmin#1\righthyphenmin#2}
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\LdfInit}
% \changes{babel~3.6a}{1996/10/16}{Macro added}
%    This macro is defined in two versions. The first version is to be
%    part of the `kernel' of \babel, ie. the part that is loaded in
%    the format; the second version is defined in \file{babel.def}.
%    The version in the format just checks the category code of the
%    ampersand and then loads \file{babel.def}.
%    \begin{macrocode}
\def\LdfInit{%
  \chardef\atcatcode=\catcode`\@
  \catcode`\@=11\relax
  \input babel.def\relax
%    \end{macrocode}
%    The category code of the ampersand is restored and the macro
%    calls itself again with the new definition from
%    \file{babel.def}
%    \begin{macrocode}
  \catcode`\@=\atcatcode \let\atcatcode\relax
  \LdfInit}
%</kernel>
%    \end{macrocode}
%    The second version of this macro takes two arguments. The first
%    argument is the name of the language that will be defined in the
%    language definition file; the second argument is either a control
%    sequence or a string from which a control sequence should be
%    constructed. The existence of the control sequence indicates that
%    the file has been processed before.
%
%    At the start of processing a language definition file we always
%    check the category code of the ampersand. We make sure that it is
%    a `letter' during the processing of the file.
%    \begin{macrocode}
%<*core>
\def\LdfInit#1#2{%
  \chardef\atcatcode=\catcode`\@
  \catcode`\@=11\relax
%    \end{macrocode}
%    Another character that needs to have the correct category code
%    during processing of language definition files is the equals sign,
%    `=', because it is sometimes used in constructions with the
%    |\let| primitive. Therefor we store its current catcode and
%    restore it later on.
% \changes{babel~3.7o}{2003/11/26}{make sure the equals sign has its
%    default category code}
%    \begin{macrocode}
  \chardef\eqcatcode=\catcode`\=
  \catcode`\==12\relax
%    \end{macrocode}
%    Now we check whether we should perhaps stop the processing of
%    this file. To do this we first need to check whether the second
%    argument that is passed to |\LdfInit| is a control sequence. We
%    do that by looking at the first token after passing |#2| through
%    |string|. When it is equal to |\@backslashchar| we are dealing
%    with a control sequence which we can compare with |\@undefined|.
%    \begin{macrocode}
  \let\bbl@tempa\relax
  \expandafter\if\expandafter\@backslashchar
                 \expandafter\@car\string#2\@nil
    \ifx#2\@undefined
    \else
%    \end{macrocode}
%    If so, we call |\ldf@quit| (but after the end of this |\if|
%    construction) to set the main language, restore the category code
%    of the @-sign and call |\endinput|.
%    \begin{macrocode}
      \def\bbl@tempa{\ldf@quit{#1}}
    \fi
  \else
%    \end{macrocode}
%    When |#2| was \emph{not} a control sequence we construct one and
%    compare it with |\relax|.
%    \begin{macrocode}
    \expandafter\ifx\csname#2\endcsname\relax
    \else
      \def\bbl@tempa{\ldf@quit{#1}}
    \fi
  \fi
  \bbl@tempa
%    \end{macrocode}
%    Finally we check |\originalTeX|.
%    \begin{macrocode}
  \ifx\originalTeX\@undefined
    \let\originalTeX\@empty
  \else
    \originalTeX
  \fi}
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\ldf@quit}
% \changes{babel~3.6a}{1996/10/29}{Macro added}
%    This macro interrupts the processing of a language definition file.
% \changes{babel~3.7o}{2003/11/26}{Also restore the category code of
%    the equals sign}
%    \begin{macrocode}
\def\ldf@quit#1{%
  \expandafter\main@language\expandafter{#1}%
  \catcode`\@=\atcatcode \let\atcatcode\relax
  \catcode`\==\eqcatcode \let\eqcatcode\relax
  \endinput
}
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\ldf@finish}
% \changes{babel~3.6a}{1996/10/16}{Macro added}
%    This macro takes one argument. It is the name of the language
%    that was defined in the language definition file.
%
%    We load the local configuration file if one is present, we set
%    the main language (taking into account that the argument might be
%    a control sequence that needs to be expanded) and reset the
%    category code of the @-sign.
% \changes{babel~3.7o}{2003/11/26}{Also restore the category code of
%    the equals sign}
%    \begin{macrocode}
\def\ldf@finish#1{%
  \loadlocalcfg{#1}%
  \expandafter\main@language\expandafter{#1}%
  \catcode`\@=\atcatcode \let\atcatcode\relax
  \catcode`\==\eqcatcode \let\eqcatcode\relax
  }
%    \end{macrocode}
%  \end{macro}
%
%    After the preamble of the document the commands |\LdfInit|,
%    |\ldf@quit| and |\ldf@finish| are no longer needed. Therefor
%    they are turned into warning messages in \LaTeX.
%    \begin{macrocode}
\@onlypreamble\LdfInit
\@onlypreamble\ldf@quit
\@onlypreamble\ldf@finish
%    \end{macrocode}
%
%  \begin{macro}{\main@language}
% \changes{babel~3.5a}{1995/02/17}{Macro added}
% \changes{babel~3.6a}{1996/10/16}{\cs{main@language} now also sets
%    \cs{languagename} and \cs{l@languagename} for use by other
%    packages in the preamble of a document}
%  \begin{macro}{\bbl@main@language}
% \changes{babel~3.5a}{1995/02/17}{Macro added}
%    This command should be used in the various language definition
%    files. It stores its argument in |\bbl@main@language|; to be used
%    to switch to the correct language at the beginning of the
%    document.
%    \begin{macrocode}
\def\main@language#1{%
  \def\bbl@main@language{#1}%
  \let\languagename\bbl@main@language
  \language=\csname l@\languagename\endcsname\relax
  }
%    \end{macrocode}
%    The default is to use English as the main language.
% \changes{babel~3.6c}{1997/01/05}{When \file{hyphen.cfg} is not
%    loaded in the format \cs{l@english} might not be defined; assume
%    english is language 0}
%    \begin{macrocode}
\ifx\l@english\@undefined
  \let\l@english\z@
\fi
\main@language{english}
%    \end{macrocode}
%    We also have to make sure that some code gets executed at the
%    beginning of the document.
%    \begin{macrocode}
\AtBeginDocument{%
  \expandafter\selectlanguage\expandafter{\bbl@main@language}}
%</core>
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%
%  \begin{macro}{\originalTeX}
%    The macro|\originalTeX| should be known to \TeX\ at this moment.
%    As it has to be expandable we |\let| it to |\@empty| instead of
%    |\relax|.
% \changes{babel~3.2a}{1991/11/24}{Set \cs{originalTeX} to
%    \cs{empty}, because it should be expandable.}
%    \begin{macrocode}
%<*kernel>
\ifx\originalTeX\@undefined\let\originalTeX\@empty\fi
%    \end{macrocode}
%    Because this part of the code can be included in a format, we
%    make sure that the macro which initialises the save mechanism,
%    |\babel@beginsave|, is not considered to be undefined.
%    \begin{macrocode}
\ifx\babel@beginsave\@undefined\let\babel@beginsave\relax\fi
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\@nolanerr}
% \changes{babel~3.4e}{1994/06/25}{Use \cs{PackageError} in \LaTeXe\
%    mode}
%  \begin{macro}{\@nopatterns}
% \changes{babel~3.4e}{1994/06/25}{Macro added}
%    The \babel\ package will signal an error when a documents tries
%    to select a language that hasn't been defined earlier. When a
%    user selects a language for which no hyphenation patterns were
%    loaded into the format he will be given a warning about that
%    fact. We revert to the patterns for |\language|=0 in that case.
%    In most formats that will be (US)english, but it might also be
%    empty.
%  \begin{macro}{\@noopterr}
% \changes{babel~3.7m}{2003/11/16}{Macro added}
%    When the package was loaded without options not everything will
%    work as expected. An error message is issued in that case.
%
%    When the format knows about |\PackageError| it must be \LaTeXe,
%    so we can safely use its error handling interface. Otherwise
%    we'll have to `keep it simple'.
% \changes{babel~3.0d}{1991/10/07}{Added a percent sign to remove
%    unwanted white space}
% \changes{babel~3.5a}{1995/02/15}{Added \cs{@activated} to log active
%    characters}
% \changes{babel~3.5c}{1995/06/19}{Added missing closing brace}
%    \begin{macrocode}
\ifx\PackageError\@undefined
  \def\@nolanerr#1{%
    \errhelp{Your command will be ignored, type <return> to proceed}%
    \errmessage{You haven't defined the language #1\space yet}}
  \def\@nopatterns#1{%
    \message{No hyphenation patterns were loaded for}%
    \message{the language `#1'}%
    \message{I will use the patterns loaded for \string\language=0
          instead}}
  \def\@noopterr#1{%
    \errmessage{The option #1 was not specified in \string\usepackage}
    \errhelp{You may continue, but expect unexpected results}}
  \def\@activated#1{%
    \wlog{Package babel Info: Making #1 an active character}}
\else
  \newcommand*{\@nolanerr}[1]{%
    \PackageError{babel}%
                 {You haven't defined the language #1\space yet}%
        {Your command will be ignored, type <return> to proceed}}
  \newcommand*{\@nopatterns}[1]{%
    \PackageWarningNoLine{babel}%
        {No hyphenation patterns were loaded for\MessageBreak
          the language `#1'\MessageBreak
          I will use the patterns loaded for \string\language=0
          instead}}
  \newcommand*{\@noopterr}[1]{%
    \PackageError{babel}%
                 {You haven't loaded the option #1\space yet}%
             {You may proceed, but expect unexpected results}}
  \newcommand*{\@activated}[1]{%
    \PackageInfo{babel}{%
      Making #1 an active character}}
\fi
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%
%    The following code is meant to be read by ini\TeX\ because it
%    should instruct \TeX\ to read hyphenation patterns. To this end
%    the \texttt{docstrip} option \texttt{patterns} can be used to
%    include this code in the file \file{hyphen.cfg}.
%    \begin{macrocode}
%<*patterns>
%    \end{macrocode}
%
% \changes{babel~3.5g}{1996/07/09}{Removed the use of
%    \cs{patterns@loaded} altogether}
%
%  \begin{macro}{\process@line}
% \changes{babel~3.5b}{1995/04/28}{added macro}
%    Each line in the file \file{language.dat} is processed by
%    |\process@line| after it is read. The first thing this macro does
%    is to check whether the line starts with \texttt{=}.
%    When the first token of a line is an \texttt{=}, the macro
%    |\process@synonym| is called; otherwise the macro
%    |\process@language| will continue.
% \changes{babel~3.5g}{1996/07/09}{Simplified code, removing
%    \cs{bbl@eq@}}
% \changes{babel~3.7c}{1999/04/09}{added an extra argument in order to
%    prevent a trailing space from becoming part of the control
%    sequence when defining a synonym (PR 2851)}
%    \begin{macrocode}
\def\process@line#1#2 #3/{%
  \ifx=#1
    \process@synonym#2 /
  \else
    \process@language#1#2 #3/%
  \fi
  }
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\process@synonym}
% \changes{babel~3.5b}{1995/04/28}{added macro}
%    This macro takes care of the lines which start with an
%    \texttt{=}. It needs an empty token register to begin with.
%    \begin{macrocode}
\toks@{}
\def\process@synonym#1 /{%
  \ifnum\last@language=\m@ne
%    \end{macrocode}
%    When no languages have been loaded yet, the name following the
%    \texttt{=} will be a synonym for hyphenation register 0.
%    \begin{macrocode}
    \expandafter\chardef\csname l@#1\endcsname0\relax
    \wlog{\string\l@#1=\string\language0}
%    \end{macrocode}
%    As no hyphenation patterns are read in yet, we can not yet set
%    the hyphenmin parameters. Therefor a commands to do so is stored
%    in a token register and executed when the first pattern file has
%    been processed.
% \changes{babel~3.7c}{1999/04/27}{Use a token register to temporarily
%    store a command to set hyphenmin parameters for the synonym which
%    is defined \emph{before} the first pattern file is processed}
%    \begin{macrocode}
    \toks@\expandafter{\the\toks@
      \expandafter\let\csname #1hyphenmins\expandafter\endcsname
      \csname\languagename hyphenmins\endcsname}%
  \else
%    \end{macrocode}
%    Otherwise the name will be a synonym for the language loaded last.
%    \begin{macrocode}
    \expandafter\chardef\csname l@#1\endcsname\last@language
    \wlog{\string\l@#1=\string\language\the\last@language}
%    \end{macrocode}
%    We also need to copy the hyphenmin parameters for the synonym.
% \changes{babel~3.7c}{1999/04/22}{Now also store hyphenmin parameters
%    for language synonyms}
%    \begin{macrocode}
    \expandafter\let\csname #1hyphenmins\expandafter\endcsname
    \csname\languagename hyphenmins\endcsname
  \fi
  }
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\process@language}
%    The macro |\process@language| is used to process a non-empty line
%    from the `configuration file'. It has three arguments, each
%    delimited by white space. The third argument is optional,
%    so a |/| character is expected to delimit the last
%    argument.  The first argument is the `name' of a language; the
%    second is the name of the file that contains the patterns. The
%    optional third argument is the name of a file containing
%    hyphenation exceptions.
%
%    The first thing to do is call |\addlanguage| to allocate a
%    pattern register and to make that register `active'.
% \changes{babel~3.0d}{1991/08/08}{Removed superfluous
%    \cs{expandafter}}
% \changes{babel~3.0d}{1991/08/21}{Reinserted \cs{expandafter}}
% \changes{babel~3.0d}{1991/10/27}{Added the collection of pattern
%    names.}
% \changes{babel~3.7c}{1999/04/22}{Also store \cs{languagename} for
%    possible later use in \cs{process@synonym}}
%    \begin{macrocode}
\def\process@language#1 #2 #3/{%
  \expandafter\addlanguage\csname l@#1\endcsname
  \expandafter\language\csname l@#1\endcsname
  \def\languagename{#1}%
%    \end{macrocode}
%    Then the `name' of the language that will be loaded now is
%    added to the token register |\toks8|. and finally
%    the pattern file is read.
%    \begin{macrocode}
  \global\toks8\expandafter{\the\toks8#1, }%
%    \end{macrocode}
% \changes{babel~3.7f}{2000/02/18}{Allow for the encoding to be used
%    as part of the language name} 
%    For some hyphenation patterns it is needed to load them with a
%    specific font encoding selected. This can be specified in the
%    file \file{language.dat} by adding for instance `\texttt{:T1}' to
%    the name of the language. The macro |\bbl@get@enc| extracts the
%    font encoding from the language name and stores it in
%    |\bbl@hyph@enc|.
%    \begin{macrocode}
  \begingroup
    \bbl@get@enc#1:\@@@
    \ifx\bbl@hyph@enc\@empty
    \else
      \fontencoding{\bbl@hyph@enc}\selectfont
    \fi
%    \end{macrocode}
%
% \changes{babel~3.4e}{1994/06/24}{Added code to detect assignments to
%    left- and righthyphenmin in the patternfile.}
%    Some pattern files contain assignments to |\lefthyphenmin| and
%    |\righthyphenmin|. \TeX\ does not keep track of these
%    assignments. Therefor we try to detect such assignments and
%    store them in the |\|\langvar|hyphenmins| macro. When no
%    assignments were made we provide a default setting.
%    \begin{macrocode}
    \lefthyphenmin\m@ne
%    \end{macrocode}
%    Some pattern files contain changes to the |\lccode| en |\uccode|
%    arrays. Such changes should remain local to the language;
%    therefor we process the pattern file in a group; the |\patterns|
%    command acts globally so its effect will be remembered.
% \changes{babel~3.7a}{1998/03/27}{Read pattern files in a group}
% \changes{babel~3.7c}{1999/04/05}{need to set hyphenmin values
%    globally}
% \changes{babel~3.7c}{1999/04/22}{Set \cs{lefthyphenmin} to \cs{m@ne}
%    \emph{inside} the group; explicitly set the hyphenmin parameters
%    for language 0}
%    \begin{macrocode}
    \input #2\relax
%    \end{macrocode}
%    Now we globally store the settings of |\lefthyphenmin| and
%    |\righthyphenmin| and close the group.
% \changes{babel~3.7c}{1999/04/25}{Only set hyphenmin values when the
%    pattern file changed them}
%    \begin{macrocode}
    \ifnum\lefthyphenmin=\m@ne
    \else
      \expandafter\xdef\csname #1hyphenmins\endcsname{%
        \the\lefthyphenmin\the\righthyphenmin}%
    \fi
  \endgroup
%    \end{macrocode}
%    If the counter |\language| is still equal to zero we set the
%    hyphenmin parameters to the values for the language loaded on
%    pattern register 0.
%    \begin{macrocode}
  \ifnum\the\language=\z@
    \expandafter\ifx\csname #1hyphenmins\endcsname\relax
      \set@hyphenmins\tw@\thr@@\relax
    \else
      \expandafter\expandafter\expandafter\set@hyphenmins
        \csname #1hyphenmins\endcsname
    \fi
%    \end{macrocode}
%    Now execute the contents of token register zero as it may
%    contain commands which set the hyphenmin parameters for synonyms
%    that were defined before the first pattern file is read in.
% \changes{babel~3.7c}{1999/04/27}{Added the execution of the contents
%    of \cs{toks@}}
%    \begin{macrocode}
    \the\toks@
  \fi
%    \end{macrocode}
%    Empty the token register after use.
%    \begin{macrocode}
  \toks@{}%
%    \end{macrocode}
%    When the hyphenation patterns have been processed we need to see
%    if a file with hyphenation exceptions needs to be read. This is
%    the case when the third argument is not empty and when it does
%    not contain a space token.
% \changes{babel~3.5b}{1995/04/28}{Added optional reading of file with
%    hyphenation exceptions}
% \changes{babel~3.5f}{1995/07/25}{Use \cs{empty} instead of
%    \cs{@empty} as the latter is unknown in plain}
%    \begin{macrocode}
  \def\bbl@tempa{#3}%
  \ifx\bbl@tempa\@empty
  \else
    \ifx\bbl@tempa\space
    \else
      \input #3\relax
    \fi
  \fi
  }
%    \end{macrocode}
%
%  \begin{macro}{\bbl@get@enc}
% \changes{babel~3.7f}{2000/02/18}{Added macro}
%  \begin{macro}{\bbl@hyph@enc}
%    The macro |\bbl@get@enc| extracts the font encoding from the
%    language name and stores it in |\bbl@hyph@enc|. It uses delimited
%    arguments to achieve this.
%    \begin{macrocode}
\def\bbl@get@enc#1:#2\@@@{%
%    \end{macrocode}
%    First store both arguments in temporary macros,
%    \begin{macrocode}
  \def\bbl@tempa{#1}%
  \def\bbl@tempb{#2}%
%    \end{macrocode}
%    then, if the second argument was empty, no font encoding was
%    specified and we're done.
%    \begin{macrocode}
  \ifx\bbl@tempb\@empty
    \let\bbl@hyph@enc\@empty
  \else
%    \end{macrocode}
%    But if the second argument was \emph{not} empty it will now have
%    a superfluous colon attached to it which we need to remove. This
%    done by feeding it to |\bbl@get@enc|. The string that we are
%    after will then be in the first argument and be stored in
%    |\bbl@tempa|.
%    \begin{macrocode}
    \bbl@get@enc#2\@@@
    \edef\bbl@hyph@enc{\bbl@tempa}%
  \fi}
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%
%  \begin{macro}{\readconfigfile}
%    The configuration file can now be opened for reading.
%    \begin{macrocode}
\openin1 = language.dat
%    \end{macrocode}
%
%    See if the file exists, if not, use the default hyphenation file
%    \file{hyphen.tex}. The user will be informed about this.
%
%    \begin{macrocode}
\ifeof1
  \message{I couldn't find the file language.dat,\space
           I will try the file hyphen.tex}
  \input hyphen.tex\relax
\else
%    \end{macrocode}
%
%    Pattern registers are allocated using count register
%    |\last@language|. Its initial value is~0. The definition of the
%    macro |\newlanguage| is such that it first increments the count
%    register and then defines the language. In order to have the
%    first patterns loaded in pattern register number~0 we initialize
%    |\last@language| with the value~$-1$.
%
% \changes{babel~3.1}{1991/05/21}{Removed use of \cs{toks0}}
%    \begin{macrocode}
  \last@language\m@ne
%    \end{macrocode}
%
%    We now read lines from the file until the end is found
%
%    \begin{macrocode}
  \loop
%    \end{macrocode}
%
%    While reading from the input, it is useful to switch off
%    recognition of the end-of-line character. This saves us stripping
%    off spaces from the contents of the control sequence.
%
%    \begin{macrocode}
    \endlinechar\m@ne
    \read1 to \bbl@line
    \endlinechar`\^^M
%    \end{macrocode}
%
%    Empty lines are skipped.
%    \begin{macrocode}
    \ifx\bbl@line\@empty
    \else
%    \end{macrocode}
%
%    Now we add a space and a |/| character to the end of
%    |\bbl@line|. This is needed to be able to recognize the third,
%    optional, argument of |\process@language| later on.
% \changes{babel~3.5b}{1995/04/28}{Now add a \cs{space} and a /
%    character}
%    \begin{macrocode}
      \edef\bbl@line{\bbl@line\space/}%
      \expandafter\process@line\bbl@line
    \fi
%    \end{macrocode}
%
%    Check for the end of the file.  To avoid a new \texttt{if}
%    control sequence we create the necessary |\iftrue| or |\iffalse|
%    with the help of |\csname|.  But there is one complication with
%    this approach: when skipping the \texttt{loop...repeat} \TeX\ has
%    to read |\if|/|\fi| pairs.  So we have to insert a `dummy'
%    |\iftrue|.
% \changes{babel~3.1}{1991/10/31}{Removed the extra \texttt{if}
%    control sequence}
%    \begin{macrocode}
    \iftrue \csname fi\endcsname
    \csname if\ifeof1 false\else true\fi\endcsname
  \repeat
%    \end{macrocode}
%
%    Reactivate the default patterns,
%    \begin{macrocode}
  \language=0
\fi
%    \end{macrocode}
%    and close the configuration file.
% \changes{babel~3.2a}{1991/11/20}{Free macro space for
%    \cs{process@language}}
%    \begin{macrocode}
\closein1
%    \end{macrocode}
%    Also remove some macros from memory
%    \begin{macrocode}
\let\process@language\@undefined
\let\process@synonym\@undefined
\let\process@line\@undefined
\let\bbl@tempa\@undefined
\let\bbl@tempb\@undefined
\let\bbl@eq@\@undefined
\let\bbl@line\@undefined
\let\bbl@get@enc\@undefined
%    \end{macrocode}
%
% \changes{babel~3.5f}{1995/11/08}{Moved the fiddling with \cs{dump}
%     to \file{bbplain.dtx} as it is no longer needed for \LaTeX}
%    We add a message about the fact that babel is loaded in the
%    format and with which language patterns to the \cs{everyjob}
%    register.
% \changes{babel~3.6h}{1997/01/23}{Added a couple of \cs{expandafter}s
%    to copy the contents of \cs{toks8} into \cs{everyjob} instead of
%    the reference}
%    \begin{macrocode}
\ifx\addto@hook\@undefined
\else
  \expandafter\addto@hook\expandafter\everyjob\expandafter{%
    \expandafter\typeout\expandafter{\the\toks8 loaded.}}
\fi
%    \end{macrocode}
%    Here the code for ini\TeX\ ends.
%    \begin{macrocode}
%</patterns>
%</kernel>
%    \end{macrocode}
%  \end{macro}
%
% \subsection{Support for active characters}
%
%  \begin{macro}{\bbl@add@special}
% \changes{babel~3.2}{1991/11/10}{Added macro}
%    The macro |\bbl@add@special| is used to add a new character (or
%    single character control sequence) to the macro |\dospecials|
%    (and |\@sanitize| if \LaTeX\ is used).
%
%    To keep all changes local, we begin a new group.  Then we
%    redefine the macros |\do| and |\@makeother| to add themselves and
%    the given character without expansion.
%    \begin{macrocode}
%<*core|shorthands>
\def\bbl@add@special#1{\begingroup
    \def\do{\noexpand\do\noexpand}%
    \def\@makeother{\noexpand\@makeother\noexpand}%
%    \end{macrocode}
%    To add the character to the macros, we expand the original macros
%    with the additional character inside the redefinition of the
%    macros.  Because |\@sanitize| can be undefined, we put the
%    definition inside a conditional.
%    \begin{macrocode}
    \edef\x{\endgroup
      \def\noexpand\dospecials{\dospecials\do#1}%
      \expandafter\ifx\csname @sanitize\endcsname\relax \else
        \def\noexpand\@sanitize{\@sanitize\@makeother#1}%
      \fi}%
%    \end{macrocode}
%    The macro |\x| contains at this moment the following:\\
%    |\endgroup\def\dospecials{|\textit{old contents}%
%    |\do|\meta{char}|}|.\\
%    If |\@sanitize| is defined, it contains an additional definition
%    of this macro.  The last thing we have to do, is the expansion of
%    |\x|.  Then |\endgroup| is executed, which restores the old
%    meaning of |\x|, |\do| and |\@makeother|.  After the group is
%    closed, the new definition of |\dospecials| (and |\@sanitize|) is
%    assigned.
%    \begin{macrocode}
  \x}
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\bbl@remove@special}
% \changes{babel~3.2}{1991/11/10}{Added macro}
%    The companion of the former macro is |\bbl@remove@special|.  It
%    is used to remove a character from the set macros |\dospecials|
%    and |\@sanitize|.
%
%    To keep all changes local, we begin a new group.  Then we define
%    a help macro |\x|, which expands to empty if the characters
%    match, otherwise it expands to its nonexpandable input.  Because
%    \TeX\ inserts a |\relax|, if the corresponding |\else| or |\fi|
%    is scanned before the comparison is evaluated, we provide a `stop
%    sign' which should expand to nothing.
%    \begin{macrocode}
\def\bbl@remove@special#1{\begingroup
    \def\x##1##2{\ifnum`#1=`##2\noexpand\@empty
                 \else\noexpand##1\noexpand##2\fi}%
%    \end{macrocode}
%    With the help of this macro we define |\do| and |\make@other|.
%    \begin{macrocode}
    \def\do{\x\do}%
    \def\@makeother{\x\@makeother}%
%    \end{macrocode}
%    The rest of the work is similar to |\bbl@add@special|.
%    \begin{macrocode}
    \edef\x{\endgroup
      \def\noexpand\dospecials{\dospecials}%
      \expandafter\ifx\csname @sanitize\endcsname\relax \else
        \def\noexpand\@sanitize{\@sanitize}%
      \fi}%
  \x}
%    \end{macrocode}
%  \end{macro}
%
%  \subsection{Shorthands}
%
%  \begin{macro}{\initiate@active@char}
% \changes{babel~3.5a}{1995/02/11}{Added macro}
% \changes{babel~3.5b}{1995/03/03}{Renamed macro}
%    A language definition file can call this macro to make a
%    character active. This macro takes one argument, the character
%    that is to be made active. When the character was already active
%    this macro does nothing. Otherwise, this macro defines the
%    control sequence |\normal@char|\m{char} to expand to the
%    character in its `normal state' and it defines the active
%    character to expand to |\normal@char|\m{char} by default
%    (\m{char} being the character to be made active). Later its
%    definition can be changed to expand to |\active@char|\m{char}
%    by calling |\bbl@activate{|\m{char}|}|.
%
%    For example, to make the double quote character active one could
%    have the following line in a language definition file:
%  \begin{verbatim}
%    \initiate@active@char{"}
%  \end{verbatim}
%
%  \begin{macro}{\bbl@afterelse}
%  \begin{macro}{\bbl@afterfi}
%    Because the code that is used in the handling of active
%    characters may need to look ahead, we take extra care to `throw'
%    it over the |\else| and |\fi| parts of an
%    |\if|-statement\footnote{This code is based on code presented in
%    TUGboat vol. 12, no2, June 1991 in ``An expansion Power Lemma''
%    by Sonja Maus.}. These macros will break if another |\if...\fi|
%    statement appears in one of the arguments.
% \changes{babel~3.6i}{1997/02/20}{Made \cs{bbl@afterelse} and
%    \cs{bbl@afterfi} \cs{long}}
%    \begin{macrocode}
\long\def\bbl@afterelse#1\else#2\fi{\fi#1}
\long\def\bbl@afterfi#1\fi{\fi#1}
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%
% \changes{babel~3.7a}{1997/02/23}{Commented out \c{peek@token} and
%    \cs{test@token} as shorthands are made expandable again}
%
%  \begin{macro}{\peek@token}
% \changes{babel~3.5f}{1995/12/06}{macro added}
% \changes{babel~3.6i}{1998/03/10}{Renamed \cs{test@token} to
%    \cs{bbl@test@token} to prevent a clash with Arab\TeX}
%    To prevent error messages when a shorthand, which
%    normally takes an argument, sees a |\par|, or |}|, or similar
%    tokens, we need to be able to `peek' at what is coming up next in
%    the input stream. Depending on the category code of the token
%    that is seen, we need to either continue the code for the active
%    character, or insert the non-active version of that character in
%    the output. The macro |\peek@token| therefore takes two
%    arguments, with which it constructs the control sequence to
%    expand next. It |\let|'s |\bbl@nexta| and |\bbl@nextb| to the two
%    possible macros. This is necessary for |\bbl@test@token| to take
%    the right decision.
%    \begin{macrocode}
%\def\peek@token#1#2{%
%  \expandafter\let\expandafter\bbl@nexta\csname #1\string#2\endcsname
%  \expandafter\let\expandafter\bbl@nextb
%    \csname system@active\string#2\endcsname
%  \futurelet\bbl@token\bbl@test@token}
%    \end{macrocode}
%
%  \begin{macro}{\bbl@test@token}
% \changes{babel~3.5f}{1995/12/06}{macro added}
% \changes{babel~3.6i}{1998/03/10}{renamed \cs{bbl@token} to
%    \cs{bbl@test@token} to prevent a clash with Arab\TeX}
%    When the result of peeking at the next token has yielded a token
%    with category `letter', `other' or `active' it is safe to proceed
%    with evaluating the code for the shorthand. When a token is found
%    with any other category code proceeding is unsafe and therefor
%    the original shorthand character is inserted in the output. The
%    macro that calls |\bbl@test@token| needs to setup |\bbl@nexta|
%    and |\bbl@nextb| in order to achieve this.
%    \begin{macrocode}
%\def\bbl@test@token{%
%  \let\bbl@next\bbl@nexta
%  \ifcat\noexpand\bbl@token a%
%  \else
%    \ifcat\noexpand\bbl@token=%
%    \else
%      \ifcat\noexpand\bbl@token\noexpand\bbl@next
%      \else
%        \let\bbl@next\bbl@nextb
%      \fi
%    \fi
%  \fi
%  \bbl@next}
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%
%^^A
%^^A Tekens met mathcode >"8000 zorgen voor problemen.
%^^A hier kan op getest worden door ze catcode13 te geven 
%^^A en te vragen of er een undefined macro ontstaat:
%^^A \ifx#1\undefined{matchcode<"8000}\else get active definition 
%^^A using \let \fi
%^^A
%    The macro |\initiate@active@char| takes all the necessary actions
%    to make its argument a shorthand character. The real work is
%    performed once for each character.
% \changes{babel~3.7c}{1999/04/30}{Only execute
%    \cs{initiate@active@char} for each character}
%    \begin{macrocode}
\def\initiate@active@char#1{%
  \expandafter\ifx\csname active@char\string##1\endcsname\relax
    \bbl@afterfi{\@initiate@active@char{#1}}%
  \fi}
%    \end{macrocode}
%    Note that the definition of |\@initiate@active@char| needs an
%    active character, for this the |~| is used. Some of the changes
%    we need, do not have to become available later on, so we do it
%    inside a group.
%    \begin{macrocode}
\begingroup
  \catcode`\~\active
  \def\x{\endgroup
    \def\@initiate@active@char##1{%
%    \end{macrocode}
%    If the character is already active we provide the default
%    expansion under this shorthand mechanism.
% \changes{babel~3.5f}{1996/01/09}{Deal correctly with already active
%    characters, provide top level expansion and define all lower
%    level expansion macros outside of the \cs{else} branch.}
% \changes{babel~3.5g}{1996/08/13}{Top level expansion of
%    \cs{normal@char char} where char is already active, should be the
%    expansion of the active character, not the active character
%    itself as this causes an endless loop}
% \changes{babel~3.7d}{1999/08/19}{Make sure the active character
%    doesn't get expanded more then once by the \cs{edef} by adding
%    \cs{expandafter}\cs{strip@prefix}\cs{meaning}}
% \changes{babel~3.7e}{1999/09/06}{previous change was rubbish; use
%    \cs{let} instead of \cs{edef}}
%    \begin{macrocode}
      \ifcat\noexpand##1\noexpand~\relax
        \@ifundefined{normal@char\string##1}{%
          \expandafter\let\csname normal@char\string##1\endcsname##1%
          \expandafter\gdef
            \expandafter##1%
            \expandafter{%
              \expandafter\active@prefix\expandafter##1%
              \csname normal@char\string##1\endcsname}}{}%
      \else
%    \end{macrocode}
%    Otherwise we write a message in the transcript file,
%    \begin{macrocode}
        \@activated{##1}%
%    \end{macrocode}
%    and define |\normal@char|\m{char} to expand to the character in
%    its default state.
%    \begin{macrocode}
        \@namedef{normal@char\string##1}{##1}%
%    \end{macrocode}
%    If we are making the right quote active we need to change
%    |\pr@m@s| as well.
% \changes{babel~3.5a}{1995/03/10}{Added a check for right quote and
%    adapt \cs{pr@m@s} if necessary}
% \changes{babel~3.7f}{1999/12/18}{The redefinition needs to take
%    place on level higher, \cs{prim@s} needs to be redefined.}
%    \begin{macrocode}
        \ifx##1'%
          \let\prim@s\bbl@prim@s
%    \end{macrocode}
%    Also, make sure that a single |'| in math mode `does the right
%    thing'.
% \changes{babel~3.7f}{1999/12/18}{Insert a check for math mode in the
%    definition of \cs{normal@char'}}
% \changes{babel~3.7g}{2000/10/02}{use \cs{textormath} to get rid of
%    the \cs{fi} (PR 3266)}
%    \begin{macrocode}
          \@namedef{normal@char\string##1}{%
            \textormath{##1}{^\bgroup\prim@s}}%
        \fi
%    \end{macrocode}
%    If we are using the caret as a shorthand character special care
%    should be taken to make sure math still works. Therefor an extra
%    level of expansion is introduced with a check for math mode on
%    the upper level.
% \changes{babel~3.7f}{1999/12/18}{Introduced an extra level of
%    expansion in the definition of an active caret}
%    \begin{macrocode}
        \ifx##1^%
          \gdef\bbl@act@caret{%
            \ifmmode
              \csname normal@char\string^\endcsname
            \else
              \bbl@afterfi
              {\if@safe@actives
                \bbl@afterelse\csname normal@char\string##1\endcsname
               \else
                \bbl@afterfi\csname user@active\string##1\endcsname
               \fi}%
            \fi}
        \fi
%    \end{macrocode}
%    To prevent problems with the loading of other packages after
%    \babel\ we reset the catcode of the character at the end of the
%    package.
% \changes{babel~3.5f}{1995/12/01}{Restore the category code of a
%    shorthand char at end of package}
% \changes{babel~3.6f}{1997/01/14}{Made restoring of the category code
%    of shorthand characters optional}
% \changes{babel~3.7a}{1997/03/21}{Use \cs{@ifpackagewith} to
%    determine whether shorthand characters need to remain active}
%    \begin{macrocode}
        \@ifpackagewith{babel}{KeepShorthandsActive}{}{%
          \edef\bbl@tempa{\catcode`\noexpand##1\the\catcode`##1}%
          \expandafter\AtEndOfPackage\expandafter{\bbl@tempa}}%
%    \end{macrocode}
%    Now we set the lowercase code of the |~| equal to that of the
%    character to be made active and execute the rest of the code
%    inside a |\lowercase| `environment'.
% \changes{babel~3.5f}{1996/01/25}{store the \cs{lccode} of the tie
%    before changing it}
%    \begin{macrocode}
        \@tempcnta=\lccode`\~
        \lccode`~=`##1%
        \lowercase{%
%    \end{macrocode}
%    Make the character active and add it to |\dospecials| and
%    |\@sanitize|.
%    \begin{macrocode}
          \catcode`~\active
          \expandafter\bbl@add@special
            \csname \string##1\endcsname
%    \end{macrocode}
%    Also re-activate it again at |\begin{document}|.
%    \begin{macrocode}
            \AtBeginDocument{%
              \catcode`##1\active
%    \end{macrocode}
%    We also need to make sure that the shorthands are active during
%    the processing of the \file{.aux} file. Otherwise some citations
%    may give unexpected results in the printout when a shorthand was
%    used in the optional argument of |\bibitem| for example.
% \changes{babel~3.6i}{1997/03/01}{Make shorthands active during
%    \file{.aux} file processing}
%    \begin{macrocode}
              \if@filesw
                \immediate\write\@mainaux{%
                  \string\catcode`##1\string\active}%
              \fi}%
%    \end{macrocode}
%    Define the character to expand to
%    \begin{center}
%    |\active@prefix| \m{char} |\normal@char|\m{char}
%    \end{center}
%    (where |\active@char|\m{char} is \emph{one} control sequence!).
% \changes{babel~3.5f}{1996/01/25}{restore the \cs{lccode} of the tie}
%    \begin{macrocode}
          \expandafter\gdef
            \expandafter~%
            \expandafter{%
            \expandafter\active@prefix\expandafter##1%
            \csname normal@char\string##1\endcsname}}%
        \lccode`\~\@tempcnta
      \fi
%    \end{macrocode}
%    For the active caret we first expand to |\bbl@act@caret| in order
%    to be able to handle math mode correctly.
% \changes{babel~3.7f}{2000/09/25}{Make an exception for the active
%    caret which needs an extra level of expansion}
%    \begin{macrocode}
      \ifx##1^%
        \@namedef{active@char\string##1}{\bbl@act@caret}%
      \else
%    \end{macrocode}
%    We define the first level expansion of |\active@char|\m{char} to
%    check the status of the |@safe@actives| flag. If it is set to
%    true we expand to the `normal' version of this character,
%    otherwise we call |\@active@char|\m{char}.
%    \begin{macrocode}
        \@namedef{active@char\string##1}{%
          \if@safe@actives
            \bbl@afterelse\csname normal@char\string##1\endcsname
          \else
            \bbl@afterfi\csname user@active\string##1\endcsname
          \fi}%
      \fi
%    \end{macrocode}
%    The next level of the code checks whether a user has defined a
%    shorthand for himself with this character. First we check for a
%    single character shorthand. If that doesn't exist we check for a
%    shorthand with an argument.
% \changes{babel~3.5d}{1995/07/02}{Skip the user-level active char
%    with argument if no shorthands with arguments were defined}
% \changes{babel~3.8b}{2004/04/19}{Now use \cs{bbl@sh@select}}
%    \begin{macrocode}
      \@namedef{user@active\string##1}{%
        \expandafter\ifx
        \csname \user@group @sh@\string##1@\endcsname
        \relax
          \bbl@afterelse\bbl@sh@select\user@group##1%
        {user@active@arg\string##1}{language@active\string##1}%
        \else
          \bbl@afterfi\csname \user@group @sh@\string##1@\endcsname
        \fi}%
%    \end{macrocode}
%    When there is also no user-level shorthand with an argument we
%    will check whether there is a language defined shorthand for
%    this active character. Before the next token is absorbed as
%    argument we need to make sure that this is safe. Therefor
%    |\peek@token| is called to decide that.
% \changes{babel~3.5f}{1995/12/07}{use \cs{peek@token} to check whether
%    it is safe to proceed}
% \changes{babel~3.6i}{1997/02/20}{Remove the use of \cs{peek@token}
%    again and make the \cs{...active@arg...} commands \cs{long}}
% \changes{babel~3.7e}{1999/09/24}{pass the argument on with braces in
%    order to prevent it from breaking up}
% \changes{babel~3.7f}{2000/02/18}{remove the braces again}
%    \begin{macrocode}
      \long\@namedef{user@active@arg\string##1}####1{%
        \expandafter\ifx
        \csname \user@group @sh@\string##1@\string####1@\endcsname
        \relax
          \bbl@afterelse
          \csname language@active\string##1\endcsname####1%
        \else
          \bbl@afterfi
          \csname \user@group @sh@\string##1@\string####1@%
          \endcsname
        \fi}%
%    \end{macrocode}
%    In order to do the right thing when a shorthand with an argument
%    is used by itself at the end of the line we provide a definition
%    for the case of an empty argument. For that case we let the
%    shorthand character expand to its non-active self.
%    \begin{macrocode}
      \@namedef{\user@group @sh@\string##1@@}{%
        \csname normal@char\string##1\endcsname}
%    \end{macrocode}
%
%    Like the shorthands that can be defined by the user, a language
%    definition file can also define shorthands with and without an
%    argument, so we need two more macros to check if they exist.
% \changes{babel~3.5d}{1995/07/02}{Skip the language-level active char
%    with argument if no shorthands with arguments were defined}
% \changes{babel~3.8b}{2004/04/19}{Now use \cs{bbl@sh@select}}
%    \begin{macrocode}
      \@namedef{language@active\string##1}{%
        \expandafter\ifx
        \csname \language@group @sh@\string##1@\endcsname
        \relax
          \bbl@afterelse\bbl@sh@select\language@group##1%
          {language@active@arg\string##1}{system@active\string##1}%
        \else
          \bbl@afterfi
          \csname \language@group @sh@\string##1@\endcsname
        \fi}%
%    \end{macrocode}
% \changes{babel~3.5f}{1995/12/07}{use \cs{peek@token} to check whether
%    it is safe to proceed}
% \changes{babel~3.6i}{1997/02/20}{Remove the use of \cs{peek@token}
%    again}
% \changes{babel~3.7e}{1999/09/24}{pass the argument on with braces in
%    order to prevent it from breaking up}
% \changes{babel~3.7f}{2000/02/18}{remove the braces again}
%    \begin{macrocode}
      \long\@namedef{language@active@arg\string##1}####1{%
        \expandafter\ifx
        \csname \language@group @sh@\string##1@\string####1@\endcsname
        \relax
          \bbl@afterelse
          \csname system@active\string##1\endcsname####1%
        \else
          \bbl@afterfi
          \csname \language@group @sh@\string##1@\string####1@%
          \endcsname
        \fi}%
%    \end{macrocode}
%    And the same goes for the system level.
% \changes{babel~3.8b}{2004/04/19}{Now use \cs{bbl@sh@select}}
%    \begin{macrocode}
      \@namedef{system@active\string##1}{%
        \expandafter\ifx
        \csname \system@group @sh@\string##1@\endcsname
        \relax
          \bbl@afterelse\bbl@sh@select\system@group##1%
          {system@active@arg\string##1}{normal@char\string##1}%
        \else
          \bbl@afterfi\csname \system@group @sh@\string##1@\endcsname
        \fi}%
%    \end{macrocode}
%    When no shorthands were found the `normal' version of the active
%    character is inserted.
% \changes{babel~3.5f}{1995/12/07}{use \cs{peek@token} to check whether
%    it is safe to proceed}
% \changes{babel~3.6i}{1997/02/20}{Remove the use of \cs{peek@token}
%    again}
%    \begin{macrocode}
      \long\@namedef{system@active@arg\string##1}####1{%
        \expandafter\ifx
        \csname \system@group @sh@\string##1@\string####1@\endcsname
        \relax
          \bbl@afterelse\csname normal@char\string##1\endcsname####1%
        \else
          \bbl@afterfi
          \csname \system@group @sh@\string##1@\string####1@\endcsname
        \fi}%
%    \end{macrocode}
%    When a shorthand combination such as |''| ends up in a heading
%    \TeX\ would see |\protect'\protect'|. To prevent this from
%    happening a shorthand needs to be defined at user level.
% \changes{babel~3.7f}{1999/12/09}{Added an extra shorthand
%    combination on user level to catch an interfering \cs{protect}}
%    \begin{macrocode}
      \@namedef{user@sh@\string##1@\string\protect@}{%
        \csname user@active\string##1\endcsname}%
      }%
    }\x
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\bbl@sh@select}
%    This command helps the shorthand supporting macros to select how
%    to proceed. Note that this macro needs to be expandable as do all
%    the shorthand macros in order for them to work in expansion-only
%    environments such as the argument of |\hyphenation|.
%
%    This macro expects the name of a group of shorthands in its first
%    argument and a shorthand character in its second argument. It
%    will expand to either |\bbl@firstcs| or |\bbl@scndcs|. Hence two
%    more arguments need to follow it.
% \changes{babel~3.8b}{2004/04/19}{Added command}
%    \begin{macrocode}
\def\bbl@sh@select#1#2{%
  \expandafter\ifx\csname#1@sh@\string#2@sel\endcsname\relax
    \bbl@afterelse\bbl@scndcs
  \else
    \bbl@afterfi\csname#1@sh@\string#2@sel\endcsname
  \fi
}
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\active@prefix}
%    The command |\active@prefix| which is used in the expansion of
%    active characters has a function similar to |\OT1-cmd| in that it
%    |\protect|s the active character whenever |\protect| is
%    \emph{not} |\@typeset@protect|.
% \changes{babel~3.5d}{1995/07/02}{\cs{@protected@cmd} has vanished
%    from \file{ltoutenc.dtx}}
% \changes{babel~3.7o}{2003/11/17}{Added handling of the situation
%    where \cs{protect} is set to \cs{@unexpandable@protect}}
%    \begin{macrocode}
\def\active@prefix#1{%
  \ifx\protect\@typeset@protect
  \else
%    \end{macrocode}
%    When |\protect| is set to |\@unexpandable@protect| we make sure
%    that the active character is als \emph{not} expanded by inserting
%    |\noexpand| in front of it. The |\@gobble| is needed to remove
%    a token such as |\activechar:| (when the double colon was the
%    active character to be dealt with).
%    \begin{macrocode}
    \ifx\protect\@unexpandable@protect
      \bbl@afterelse\bbl@afterfi\noexpand#1\@gobble
    \else
      \bbl@afterfi\bbl@afterfi\protect#1\@gobble
    \fi
  \fi}
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\if@safe@actives}
%    In some circumstances it is necessary to be able to change the
%    expansion of an active character on the fly. For this purpose the
%    switch |@safe@actives| is available. The setting of this switch
%    should be checked in the first level expansion of
%    |\active@char|\m{char}.
%    \begin{macrocode}
\newif\if@safe@actives
\@safe@activesfalse
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\bbl@restore@actives}
% \changes{babel~3.7m}{2003/11/15}{New macro added}
%    When the output routine kicks in while the
%    active characters were made ``safe'' this must be undone in
%    the headers to prevent unexpected typeset results. For this
%    situation we define a command to make them ``unsafe'' again.
%    \begin{macrocode}
\def\bbl@restore@actives{\if@safe@actives\@safe@activesfalse\fi}
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\bbl@activate}
% \changes{babel~3.5a}{1995/02/11}{Added macro}
%
%    This macro takes one argument, like |\initiate@active@char|. The
%    macro is used to change the definition of an active character to
%    expand to |\active@char|\m{char} instead of
%    |\normal@char|\m{char}.
%    \begin{macrocode}
\def\bbl@activate#1{%
  \expandafter\def
  \expandafter#1\expandafter{%
    \expandafter\active@prefix
    \expandafter#1\csname active@char\string#1\endcsname}%
}
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\bbl@deactivate}
% \changes{babel~3.5a}{1995/02/11}{Added macro}
%    This macro takes one argument, like |\bbl@activate|. The macro
%    doesn't really make a character non-active; it changes its
%    definition to expand to |\normal@char|\m{char}.
%    \begin{macrocode}
\def\bbl@deactivate#1{%
  \expandafter\def
  \expandafter#1\expandafter{%
    \expandafter\active@prefix
    \expandafter#1\csname normal@char\string#1\endcsname}%
}
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\bbl@firstcs}
%  \begin{macro}{\bbl@scndcs}
%    These macros have two arguments. They use one of their arguments
%    to build a control sequence from.
%    \begin{macrocode}
\def\bbl@firstcs#1#2{\csname#1\endcsname}
\def\bbl@scndcs#1#2{\csname#2\endcsname}
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%
%  \begin{macro}{\declare@shorthand}
%    The command |\declare@shorthand| is used to declare a shorthand
%    on a certain level. It takes three arguments:
%    \begin{enumerate}
%    \item a name for the collection of shorthands, i.e. `system', or
%      `dutch';
%    \item the character (sequence) that makes up the shorthand,
%      i.e. |~| or |"a|;
%    \item the code to be executed when the shorthand is encountered.
%    \end{enumerate}
% \changes{babel~3.5d}{1995/07/02}{Make a `note' when a shorthand with
%    an argument is defined.}
% \changes{babel~3.6i}{1997/02/23}{Make it possible to distinguish the
%    constructed control sequences for the case with argument}
% \changes{babel~3.8b}{2004/04/19}{We need to support shorthands with
%    and without argument in different groups; added the name of the
%    group to the storage macro}
%    \begin{macrocode}
\def\declare@shorthand#1#2{\@decl@short{#1}#2\@nil}
\def\@decl@short#1#2#3\@nil#4{%
  \def\bbl@tempa{#3}%
  \ifx\bbl@tempa\@empty
    \expandafter\let\csname #1@sh@\string#2@sel\endcsname\bbl@scndcs
    \@namedef{#1@sh@\string#2@}{#4}%
  \else
    \expandafter\let\csname #1@sh@\string#2@sel\endcsname\bbl@firstcs
    \@namedef{#1@sh@\string#2@\string#3@}{#4}%
  \fi}
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\textormath}
%    Some of the shorthands that will be declared by the language
%    definition files have to be usable in both text and mathmode. To
%    achieve this the helper macro |\textormath| is provided.
%    \begin{macrocode}
\def\textormath#1#2{%
  \ifmmode
    \bbl@afterelse#2%
  \else
    \bbl@afterfi#1%
  \fi}
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\user@group}
%  \begin{macro}{\language@group}
%  \begin{macro}{\system@group}
%    The current concept of `shorthands' supports three levels or
%    groups of shorthands. For each level the name of the level or
%    group is stored in a macro. The default is to have a user group;
%    use language group `english' and have a system group called
%    `system'.
% \changes{babel~3.6i}{1997/02/24}{Have a user group called `user' by
%    default}
%    \begin{macrocode}
\def\user@group{user}
\def\language@group{english}
\def\system@group{system}
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%
%  \begin{macro}{\useshorthands}
%    This is the user level command to tell \LaTeX\ that user level
%    shorthands will be used in the document. It takes one argument,
%    the character that starts a shorthand.
% \changes{babel~3.7j}{2001/11/11}{When \TeX\ has seen a character
%    its category code is fixed; need to use a `stand-in' for the
%    call of \cs{bbl@activate}} 
%    \begin{macrocode}
\def\useshorthands#1{%
%    \end{macrocode}
%    First note that this is user level.
%    \begin{macrocode}
  \def\user@group{user}%
%    \end{macrocode}
%    Then initialize the character for use as a shorthand character.
%    \begin{macrocode}
  \initiate@active@char{#1}%
%    \end{macrocode}
%    Now that \TeX\ has seen the character its category code is
%    fixed, but for the actions of |\bbl@activate| to succeed we need
%    it to be active. Hence the trick with the |\lccode| to circumvent
%    this.
% \changes{babel~3.7j}{2003/09/11}{The change from 11/112001 was
%    incomplete} 
%    \begin{macrocode}
  \@tempcnta\lccode`\~
  \lccode`~=`#1%
  \lowercase{\catcode`~\active\bbl@activate{~}}%
  \lccode`\~\@tempcnta}
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\defineshorthand}
%    Currently we only support one group of user level shorthands,
%    called `user'.
%    \begin{macrocode}
\def\defineshorthand{\declare@shorthand{user}}
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\languageshorthands}
%    A user level command to change the language from which shorthands
%    are used.
%    \begin{macrocode}
\def\languageshorthands#1{\def\language@group{#1}}
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\aliasshorthand}
% \changes{babel~3.5f}{1996/01/25}{New command}
%    \begin{macrocode}
\def\aliasshorthand#1#2{%
%    \end{macrocode}
%    First the new shorthand needs to be initialized,
%    \begin{macrocode}
  \expandafter\ifx\csname active@char\string#2\endcsname\relax
     \ifx\document\@notprerr
       \@notshorthand{#2}
     \else
       \initiate@active@char{#2}%
%    \end{macrocode}
%    Then we need to use the |\lccode| trick to make the new shorthand
%    behave like the old one. Therefore we save the current |\lccode|
%    of the |~|-character and restore it later. Then we |\let| the new
%    shorthand character be equal to the original. 
%    \begin{macrocode}
       \@tempcnta\lccode`\~
       \lccode`~=`#2%
       \lowercase{\let~#1}%
       \lccode`\~\@tempcnta
     \fi
   \fi
}
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\@notshorthand}
% \changes{v3.8d}{2004/11/20}{Error message added}
%    
%    \begin{macrocode}
\def\@notshorthand#1{%
       \PackageError{babel}{%
         The character `\string #1´ should be made
         a shorthand character;\MessageBreak
         add the command \string\useshorthands\string{#1\string} to
         the preamble.\MessageBreak
         I will ignore your instruction}{}%
   }
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\shorthandon}
% \changes{babel~3.7a}{1998/06/07}{Added command}
%  \begin{macro}{\shorthandoff}
% \changes{babel~3.7a}{1998/06/07}{Added command}
%    The first level definition of these macros just passes the
%    argument on to |\bbl@switch@sh|, adding |\@nil| at the end to
%    denote the end of the list of characters.
%    \begin{macrocode}
\newcommand*\shorthandon[1]{\bbl@switch@sh{on}#1\@nil}
\newcommand*\shorthandoff[1]{\bbl@switch@sh{off}#1\@nil}
%    \end{macrocode}
%
%  \begin{macro}{\bbl@switch@sh}
% \changes{babel~3.7a}{1998/06/07}{Added command}
%    The macro |\bbl@switch@sh| takes the list of characters apart one
%    by  one and subsequently switches the category code of the
%    shorthand character according to the first argument of
%    |\bbl@switch@sh|.
%    \begin{macrocode}
\def\bbl@switch@sh#1#2#3\@nil{%
%    \end{macrocode}
%    But before any of this switching takes place we make sure that
%    the character we are dealing with is known as a shorthand
%    character. If it is, a macro such as |\active@char"| should
%    exist.
%    \begin{macrocode}
  \@ifundefined{active@char\string#2}{%
    \PackageError{babel}{%
      The character '\string #2' is not a shorthand character
      in \languagename}{%
      Maybe you made a typing mistake?\MessageBreak
      I will ignore your instruction}}{%
    \csname bbl@switch@sh@#1\endcsname#2}%
%    \end{macrocode}
%    Now that, as the first character in the list has been taken care
%    of, we pass the rest of the list back to |\bbl@switch@sh|.
%    \begin{macrocode}
  \ifx#3\@empty\else
    \bbl@afterfi\bbl@switch@sh{#1}#3\@nil
  \fi}
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\bbl@switch@sh@off}
%    All that is left to do is define the actual switching
%    macros. Switching off is easy, we just set the category code to
%    `other' (12).
%    \begin{macrocode}
\def\bbl@switch@sh@off#1{\catcode`#112\relax}
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\bbl@switch@sh@on}
%    But switching the shorthand character back on is a bit more
%    tricky. It involves making sure that we have an active character
%    to begin with when the macro is being defined. It also needs the
%    use of |\lowercase| and |\lccode| trickery to get everything to
%    work out as expected. And to keep things local that need to
%    remain local a group is opened, which is closed as soon as |\x|
%    gets executed.
%    \begin{macrocode}
\begingroup
  \catcode`\~\active
  \def\x{\endgroup
    \def\bbl@switch@sh@on##1{%
      \lccode`~=`##1%
      \lowercase{%
        \catcode`~\active
        }%
      }%
    }
%    \end{macrocode}
%  \end{macro}
%    The next operation makes the above definition effective.
%    \begin{macrocode}
\x
%
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%
%    To prevent problems with constructs such as |\char"01A| when the
%    double quote is made active, we define a shorthand on
%    system level.
% \changes{babel~3.5a}{1995/03/10}{Replaced 16 system shorthands to
%    deal with hex numbers by one}
%    \begin{macrocode}
\declare@shorthand{system}{"}{\csname normal@char\string"\endcsname}
%    \end{macrocode}
%
%    When the right quote is made active we need to take care of
%    handling it correctly in mathmode. Therefore we define a
%    shorthand at system level to make it expand to a non-active right
%    quote in textmode, but expand to its original definition in
%    mathmode. (Note that the right quote is `active' in mathmode
%    because of its mathcode.)
% \changes{babel~3.5a}{1995/03/10}{Added a system shorthand for the
%    right quote}
%    \begin{macrocode}
\declare@shorthand{system}{'}{%
  \textormath{\csname normal@char\string'\endcsname}%
             {\sp\bgroup\prim@s}}
%    \end{macrocode}
%
%    When the left quote is  made active we need to take care of
%    handling it correctly when it is followed by for instance an open
%    brace token. Therefore we define a shorthand at system level to
%    make it expand to a non-active left quote.
% \changes{babel~3.5f}{1996/03/06}{Added a system shorthand for the
%    left quote}
%    \begin{macrocode}
\declare@shorthand{system}{`}{\csname normal@char\string`\endcsname}
%    \end{macrocode}
%
%  \begin{macro}{\bbl@prim@s}
% \changes{babel~3.7f}{1999/12/01}{Need to redefine \cs{prim@s} as
%    well as plain \TeX's definition uses \cs{next}}
%  \begin{macro}{\bbl@pr@m@s}
% \changes{babel~3.5a}{1995/03/10}{Added macro}
%    One of the internal macros that are involved in substituting
%    |\prime| for each right quote in mathmode is |\prim@s|. This
%    checks if the next character is a right quote. When the right
%    quote is active, the definition of this macro needs to be adapted
%    to look for an active right quote.
%    \begin{macrocode}
\def\bbl@prim@s{%
  \prime\futurelet\@let@token\bbl@pr@m@s}
\begingroup
  \catcode`\'\active\let'\relax
  \def\x{\endgroup
    \def\bbl@pr@m@s{%
      \ifx'\@let@token
        \expandafter\pr@@@s
      \else
        \ifx^\@let@token
          \expandafter\expandafter\expandafter\pr@@@t
        \else
          \egroup
        \fi
      \fi}%
    }
\x
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%
%    \begin{macrocode}
%</core|shorthands>
%    \end{macrocode}
%
%    Normally the |~| is active and expands to \verb*=\penalty\@M\ =.
%    When it is written to the \file{.aux} file it is written
%    expanded. To prevent that and to be able to use the character |~|
%    as a start character for a shorthand, it is redefined here as a
%    one character shorthand on system level.
% \changes{babel~3.5f}{1996/04/02}{No need to reset the category code
%    of the tilde as \cs{initiate@active@char} now correctly deals
%    with active characters}
%    \begin{macrocode}
%<*core>
\initiate@active@char{~}
\declare@shorthand{system}{~}{\leavevmode\nobreak\ }
\bbl@activate{~}
%    \end{macrocode}
%
%  \begin{macro}{\OT1dqpos}
%  \begin{macro}{\T1dqpos}
%    The position of the double quote character is different for the
%    OT1 and T1 encodings. It will later be selected using the
%    |\f@encoding| macro. Therefor we define two macros here to store
%    the position of the character in these encodings.
%    \begin{macrocode}
\expandafter\def\csname OT1dqpos\endcsname{127}
\expandafter\def\csname T1dqpos\endcsname{4}
%    \end{macrocode}
%    When the macro |\f@encoding| is undefined (as it is in plain
%    \TeX) we define it here to expand to \texttt{OT1}
%    \begin{macrocode}
\ifx\f@encoding\@undefined
  \def\f@encoding{OT1}
\fi
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%
%  \subsection{Language attributes}
%
%    Language attributes provide a means to give the user control over
%    which features of the language definition files he wants to
%    enable.
% \changes{babel~3.7c}{1998/07/02}{Added support for language
%    attributes}
%  \begin{macro}{\languageattribute}
%    The macro |\languageattribute| checks whether its arguments are
%    valid and then activates the selected language attribute.
%    \begin{macrocode}
\newcommand\languageattribute[2]{%
%    \end{macrocode}
%    First check whether the language is known.
%    \begin{macrocode}
  \expandafter\ifx\csname l@#1\endcsname\relax
    \@nolanerr{#1}%
  \else
%    \end{macrocode}
%    Than process each attribute in the list.
%    \begin{macrocode}
    \@for\bbl@attr:=#2\do{%
%    \end{macrocode}
%    We want to make sure that each attribute is selected only once;
%    therefor we store the already selected attributes in
%    |\bbl@known@attribs|. When that control sequence is not yet
%    defined this attribute is certainly not selected before.
%    \begin{macrocode}
      \ifx\bbl@known@attribs\@undefined
        \in@false
      \else
%    \end{macrocode}
%    Now we need to see if the attribute occurs in the list of
%    already selected attributes.
%    \begin{macrocode}
        \edef\bbl@tempa{\noexpand\in@{,#1-\bbl@attr,}%
          {,\bbl@known@attribs,}}%
        \bbl@tempa
      \fi
%    \end{macrocode}
%    When the attribute was in the list we issue a warning; this might
%    not be the users intention.
%    \begin{macrocode}
      \ifin@
        \PackageWarning{Babel}{%
          You have more than once selected the attribute
          '\bbl@attr'\MessageBreak for language #1}%
      \else
%    \end{macrocode}
%    When we end up here the attribute is not selected before. So, we
%    add it to the list of selected attributes and execute the
%    associated \TeX-code.
%    \begin{macrocode}
        \edef\bbl@tempa{%
          \noexpand\bbl@add@list\noexpand\bbl@known@attribs{#1-\bbl@attr}}%
        \bbl@tempa
        \edef\bbl@tempa{#1-\bbl@attr}%
        \expandafter\bbl@ifknown@ttrib\expandafter{\bbl@tempa}\bbl@attributes%
        {\csname#1@attr@\bbl@attr\endcsname}%
        {\@attrerr{#1}{\bbl@attr}}%
     \fi
      }
  \fi}
%    \end{macrocode}
%    This command should only be used in the preamble of a document.
%    \begin{macrocode}
\@onlypreamble\languageattribute
%    \end{macrocode}
%    The error text to be issued when an unknown attribute is
%    selected.
%    \begin{macrocode}
  \newcommand*{\@attrerr}[2]{%
    \PackageError{babel}%
                 {The attribute #2 is unknown for language #1.}%
        {Your command will be ignored, type <return> to proceed}}
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\bbl@declare@ttribute}
%    This command adds the new language/attribute combination to the
%    list of known attributes.
%    \begin{macrocode}
\def\bbl@declare@ttribute#1#2#3{%
  \bbl@add@list\bbl@attributes{#1-#2}%
%    \end{macrocode}
%    Then it defines a control sequence to be executed when the
%    attribute is used in a document. The result of this should be
%    that the macro |\extras...| for the current language is extended,
%    otherwise the attribute will not work as its code is removed from
%    memory at |\begin{document}|.
%    \begin{macrocode}
  \expandafter\def\csname#1@attr@#2\endcsname{#3}%
  }
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\bbl@ifattributeset}
% \changes{babel~3.7f}{2000/02/12}{macro added}
%    This internal macro has 4 arguments. It can be used to interpret
%    \TeX\ code based on whether a certain attribute was set. This
%    command should appear inside the argument to |\AtBeginDocument|
%    because the attributes are set in the document preamble,
%    \emph{after} \babel\ is loaded.
%
%    The first argument is the language, the second argument the
%    attribute being checked, and the third and fourth arguments are
%    the true and false clauses.
%    \begin{macrocode}
\def\bbl@ifattributeset#1#2#3#4{%
%    \end{macrocode}
%    First we need to find out if any attributes were set; if not
%    we're done.
%    \begin{macrocode}
  \ifx\bbl@known@attribs\@undefined
    \in@false
  \else
%    \end{macrocode}
%    The we need to check the list of known attributes.
%    \begin{macrocode}
    \edef\bbl@tempa{\noexpand\in@{,#1-#2,}%
      {,\bbl@known@attribs,}}%
    \bbl@tempa
  \fi
%    \end{macrocode}
%    When we're this far |\ifin@| has a value indicating if the
%    attribute in question was set or not. Just to be safe the code to
%    be executed is `thrown over the |\fi|'.
%    \begin{macrocode}
  \ifin@
    \bbl@afterelse#3%
  \else
    \bbl@afterfi#4%
  \fi
  }
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\bbl@add@list}
%    This internal macro adds its second argument to a comma
%    separated list in its first argument. When the list is not
%    defined yet (or empty), it will be initiated
%    \begin{macrocode}
\def\bbl@add@list#1#2{%
  \ifx#1\@undefined
    \def#1{#2}%
  \else
    \ifx#1\@empty
      \def#1{#2}%
    \else
      \edef#1{#1,#2}%
    \fi
  \fi
  }
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\bbl@ifknown@ttrib}
%    An internal macro to check whether a given language/attribute is
%    known. The macro takes 4 arguments, the language/attribute, the
%    attribute list, the \TeX-code to be executed when the attribute
%    is known and the \TeX-code to be executed otherwise.
%    \begin{macrocode}
\def\bbl@ifknown@ttrib#1#2{%
%    \end{macrocode}
%    We first assume the attribute is unknown.
%    \begin{macrocode}
  \let\bbl@tempa\@secondoftwo
%    \end{macrocode}
%    Then we loop over the list of known attributes, trying to find a
%    match.
%    \begin{macrocode}
  \@for\bbl@tempb:=#2\do{%
    \expandafter\in@\expandafter{\expandafter,\bbl@tempb,}{,#1,}%
    \ifin@
%    \end{macrocode}
%    When a match is found the definition of |\bbl@tempa| is changed.
%    \begin{macrocode}
      \let\bbl@tempa\@firstoftwo
    \else
    \fi}%
%    \end{macrocode}
%    Finally we execute |\bbl@tempa|.
%    \begin{macrocode}
  \bbl@tempa
}
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\bbl@clear@ttribs}
%    This macro removes all the attribute code from \LaTeX's memory at
%    |\begin{document}| time (if any is present).
% \changes{babel~3.7e}{1999/09/24}{When \cs{bbl@attributes} is
%    undefined this should be a no-op} 
%    \begin{macrocode}
\def\bbl@clear@ttribs{%
  \ifx\bbl@attributes\@undefined\else
    \@for\bbl@tempa:=\bbl@attributes\do{%
      \expandafter\bbl@clear@ttrib\bbl@tempa.
      }%
    \let\bbl@attributes\@undefined
  \fi
  }
\def\bbl@clear@ttrib#1-#2.{%
  \expandafter\let\csname#1@attr@#2\endcsname\@undefined}
\AtBeginDocument{\bbl@clear@ttribs}
%    \end{macrocode}
%  \end{macro}
%
%  \subsection{Support for saving macro definitions}
%
%    To save the meaning of control sequences using |\babel@save|, we
%    use temporary control sequences.  To save hash table entries for
%    these control sequences, we don't use the name of the control
%    sequence to be saved to construct the temporary name.  Instead we
%    simply use the value of a counter, which is reset to zero each
%    time we begin to save new values.  This works well because we
%    release the saved meanings before we begin to save a new set of
%    control sequence meanings (see |\selectlanguage| and
%    |\originalTeX|).
%
%  \begin{macro}{\babel@savecnt}
% \changes{babel~3.2}{1991/11/10}{Added macro}
%  \begin{macro}{\babel@beginsave}
% \changes{babel~3.2}{1991/11/10}{Added macro}
%    The initialization of a new save cycle: reset the counter to
%    zero.
%    \begin{macrocode}
\def\babel@beginsave{\babel@savecnt\z@}
%    \end{macrocode}
%    Before it's forgotten, allocate the counter and initialize all.
%    \begin{macrocode}
\newcount\babel@savecnt
\babel@beginsave
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%
%  \begin{macro}{\babel@save}
% \changes{babel~3.2}{1991/11/10}{Added macro}
%    The macro |\babel@save|\meta{csname} saves the current meaning of
%    the control sequence \meta{csname} to
%    |\originalTeX|\footnote{\cs{originalTeX} has to be
%    expandable, i.\,e.\ you shouldn't let it to \cs{relax}.}.
%    To do this, we let the current meaning to a temporary control
%    sequence, the restore commands are appended to |\originalTeX| and
%    the counter is incremented.
% \changes{babel~3.2c}{1992/03/17}{missing backslash led to errors
%    when executing \cs{originalTeX}}
% \changes{babel~3.2d}{1992/07/02}{saving in \cs{babel@i} and
%    restoring from \cs{@babel@i} doesn't work very well...}
%    \begin{macrocode}
\def\babel@save#1{%
  \expandafter\let\csname babel@\number\babel@savecnt\endcsname #1\relax
  \begingroup
    \toks@\expandafter{\originalTeX \let#1=}%
    \edef\x{\endgroup
      \def\noexpand\originalTeX{\the\toks@ \expandafter\noexpand
         \csname babel@\number\babel@savecnt\endcsname\relax}}%
  \x
  \advance\babel@savecnt\@ne}
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\babel@savevariable}
% \changes{babel~3.2}{1991/11/10}{Added macro}
%    The macro |\babel@savevariable|\meta{variable} saves the value of
%    the variable.  \meta{variable} can be anything allowed after the
%    |\the| primitive.
%    \begin{macrocode}
\def\babel@savevariable#1{\begingroup
    \toks@\expandafter{\originalTeX #1=}%
    \edef\x{\endgroup
      \def\noexpand\originalTeX{\the\toks@ \the#1\relax}}%
  \x}
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\bbl@frenchspacing}
%  \begin{macro}{\bbl@nonfrenchspacing}
%    Some languages need to have |\frenchspacing| in effect. Others
%    don't want that. The command |\bbl@frenchspacing| switches it on
%    when it isn't already in effect and |\bbl@nonfrenchspacing|
%    switches it off if necessary.
%    \begin{macrocode}
\def\bbl@frenchspacing{%
  \ifnum\the\sfcode`\.=\@m
    \let\bbl@nonfrenchspacing\relax
  \else
    \frenchspacing
    \let\bbl@nonfrenchspacing\nonfrenchspacing
  \fi}
\let\bbl@nonfrenchspacing\nonfrenchspacing
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%
% \subsection{Support for extending macros}
%
%  \begin{macro}{\addto}
%    For each language four control sequences have to be defined that
%    control the language-specific definitions. To be able to add
%    something to these macro once they have been defined the macro
%    |\addto| is introduced. It takes two arguments, a \meta{control
%    sequence} and \TeX-code to be added to the \meta{control
%    sequence}.
%
%    If the \meta{control sequence} has not been defined before it is
%    defined now.
% \changes{babel~3.1}{1991/11/05}{Added macro}
% \changes{babel~3.4}{1994/02/04}{Changed to use toks register}
% \changes{babel~3.6b}{1996/12/30}{Also check if control sequence
%    expands to \cs{relax}}
%    \begin{macrocode}
\def\addto#1#2{%
  \ifx#1\@undefined
    \def#1{#2}%
  \else
%    \end{macrocode}
%    The control sequence could also expand to |\relax|, in which case
%    a circular definition results. The net result is a stack overflow.
%    \begin{macrocode}
    \ifx#1\relax
      \def#1{#2}%
    \else
%    \end{macrocode}
%    Otherwise the replacement text for the \meta{control sequence} is
%    expanded and stored in a token register, together with the
%    \TeX-code to be added.  Finally the \meta{control sequence} is
%    \emph{re}defined, using the contents of the token register.
%    \begin{macrocode}
      {\toks@\expandafter{#1#2}%
        \xdef#1{\the\toks@}}%
    \fi
  \fi
}
%    \end{macrocode}
%  \end{macro}
%
% \subsection{Macros common to a number of languages}
%
%  \begin{macro}{\allowhyphens}
% \changes{babel~3.2b}{1992/02/16}{Moved macro from language
%    definition files}
% \changes{babel~3.7a}{1998/03/12}{Make \cs{allowhyphens} a no-op for
%    T1 fontencoding}
%    This macro makes hyphenation possible. Basically its definition
%    is nothing more than |\nobreak| |\hskip| \texttt{0pt plus
%    0pt}\footnote{\TeX\ begins and ends a word for hyphenation at a
%    glue node. The penalty prevents a linebreak at this glue node.}.
%    \begin{macrocode}
\def\bbl@t@one{T1}
\def\allowhyphens{%
  \ifx\cf@encoding\bbl@t@one\else\bbl@allowhyphens\fi}
\def\bbl@allowhyphens{\nobreak\hskip\z@skip}
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\set@low@box}
% \changes{babel~3.2b}{1992/02/16}{Moved macro from language
%    definition files}
%    The following macro is used to lower quotes to the same level as
%    the comma.  It prepares its argument in box register~0.
%    \begin{macrocode}
\def\set@low@box#1{\setbox\tw@\hbox{,}\setbox\z@\hbox{#1}%
    \dimen\z@\ht\z@ \advance\dimen\z@ -\ht\tw@%
    \setbox\z@\hbox{\lower\dimen\z@ \box\z@}\ht\z@\ht\tw@ \dp\z@\dp\tw@}
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\save@sf@q}
% \changes{babel~3.2b}{1992/02/16}{Moved macro from language
%    definition files}
%    The macro |\save@sf@q| is used to save and reset the current
%    space factor.
% \changes{babel~3.7f}{2000/09/19}{PR3119, don't start a paragraph in
%    a local group}
%    \begin{macrocode}
\def\save@sf@q #1{\leavevmode
 \begingroup 
  \edef\@SF{\spacefactor \the\spacefactor}#1\@SF
 \endgroup
}
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\bbl@disc}
% \changes{babel~3.5f}{1996/01/24}{Macro moved from language
%    definition files}
%    For some languages the macro |\bbl@disc| is used to ease the
%    insertion of discretionaries for letters that behave `abnormally'
%    at a breakpoint.
%    \begin{macrocode}
\def\bbl@disc#1#2{%
  \nobreak\discretionary{#2-}{}{#1}\allowhyphens}
%    \end{macrocode}
%  \end{macro}
%
% \changes{babel~3.5c}{1995/06/14}{Repaired a typo (itlaic, PR1652)}
%
%  \subsection{Making glyphs available}
%
%    The file \file{\filename}\footnote{The file described in this
%    section has version number \fileversion, and was last revised on
%    \filedate.} makes a number of glyphs available that either do not
%    exist in the \texttt{OT1} encoding and have to be `faked', or
%    that are not accessible through \file{T1enc.def}.
%
%  \subsection{Quotation marks}
%
%  \begin{macro}{\quotedblbase}
%    In the \texttt{T1} encoding the opening double quote at the
%    baseline is available as a separate character, accessible via
%    |\quotedblbase|. In the \texttt{OT1} encoding it is not
%    available, therefor we make it available by lowering the normal
%    open quote character to the baseline.
%    \begin{macrocode}
\ProvideTextCommand{\quotedblbase}{OT1}{%
  \save@sf@q{\set@low@box{\textquotedblright\/}%
    \box\z@\kern-.04em\allowhyphens}}
%    \end{macrocode}
%    Make sure that when an encoding other than \texttt{OT1} or
%    \texttt{T1} is used this glyph can still be typeset.
%    \begin{macrocode}
\ProvideTextCommandDefault{\quotedblbase}{%
  \UseTextSymbol{OT1}{\quotedblbase}}
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\quotesinglbase}
%    We also need the single quote character at the baseline.
%    \begin{macrocode}
\ProvideTextCommand{\quotesinglbase}{OT1}{%
  \save@sf@q{\set@low@box{\textquoteright\/}%
    \box\z@\kern-.04em\allowhyphens}}
%    \end{macrocode}
%    Make sure that when an encoding other than \texttt{OT1} or
%    \texttt{T1} is used this glyph can still be typeset.
%    \begin{macrocode}
\ProvideTextCommandDefault{\quotesinglbase}{%
  \UseTextSymbol{OT1}{\quotesinglbase}}
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\guillemotleft}
%  \begin{macro}{\guillemotright}
%    The guillemet characters are not available in \texttt{OT1}
%    encoding. They are faked.
%    \begin{macrocode}
\ProvideTextCommand{\guillemotleft}{OT1}{%
  \ifmmode
    \ll
  \else
    \save@sf@q{\nobreak
      \raise.2ex\hbox{$\scriptscriptstyle\ll$}\allowhyphens}%
  \fi}
\ProvideTextCommand{\guillemotright}{OT1}{%
  \ifmmode
    \gg
  \else
    \save@sf@q{\nobreak
      \raise.2ex\hbox{$\scriptscriptstyle\gg$}\allowhyphens}%
  \fi}
%    \end{macrocode}
%    Make sure that when an encoding other than \texttt{OT1} or
%    \texttt{T1} is used these glyphs can still be typeset.
%    \begin{macrocode}
\ProvideTextCommandDefault{\guillemotleft}{%
  \UseTextSymbol{OT1}{\guillemotleft}}
\ProvideTextCommandDefault{\guillemotright}{%
  \UseTextSymbol{OT1}{\guillemotright}}
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%
%  \begin{macro}{\guilsinglleft}
%  \begin{macro}{\guilsinglright}
%    The single guillemets are not available in \texttt{OT1}
%    encoding. They are faked.
%    \begin{macrocode}
\ProvideTextCommand{\guilsinglleft}{OT1}{%
  \ifmmode
    <%
  \else
    \save@sf@q{\nobreak
      \raise.2ex\hbox{$\scriptscriptstyle<$}\allowhyphens}%
  \fi}
\ProvideTextCommand{\guilsinglright}{OT1}{%
  \ifmmode
    >%
  \else
    \save@sf@q{\nobreak
      \raise.2ex\hbox{$\scriptscriptstyle>$}\allowhyphens}%
  \fi}
%    \end{macrocode}
%    Make sure that when an encoding other than \texttt{OT1} or
%    \texttt{T1} is used these glyphs can still be typeset.
%    \begin{macrocode}
\ProvideTextCommandDefault{\guilsinglleft}{%
  \UseTextSymbol{OT1}{\guilsinglleft}}
\ProvideTextCommandDefault{\guilsinglright}{%
  \UseTextSymbol{OT1}{\guilsinglright}}
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%
%
%  \subsection{Letters}
%
%  \begin{macro}{\ij}
%  \begin{macro}{\IJ}
%    The dutch language uses the letter `ij'. It is available in
%    \texttt{T1} encoded fonts, but not in the \texttt{OT1} encoded
%    fonts. Therefor we fake it for the \texttt{OT1} encoding.
% \changes{dutch-3.7a}{1995/02/04}{Changed the kerning in the faked ij
%    to match the dc-version of it}
%    \begin{macrocode}
\DeclareTextCommand{\ij}{OT1}{%
  \allowhyphens i\kern-0.02em j\allowhyphens}
\DeclareTextCommand{\IJ}{OT1}{%
  \allowhyphens I\kern-0.02em J\allowhyphens}
\DeclareTextCommand{\ij}{T1}{\char188}
\DeclareTextCommand{\IJ}{T1}{\char156}
%    \end{macrocode}
%    Make sure that when an encoding other than \texttt{OT1} or
%    \texttt{T1} is used these glyphs can still be typeset.
%    \begin{macrocode}
\ProvideTextCommandDefault{\ij}{%
  \UseTextSymbol{OT1}{\ij}}
\ProvideTextCommandDefault{\IJ}{%
  \UseTextSymbol{OT1}{\IJ}}
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%
%  \begin{macro}{\dj}
%  \begin{macro}{\DJ}
%    The croatian language needs the letters |\dj| and |\DJ|; they are
%    available in the \texttt{T1} encoding, but not in the
%    \texttt{OT1} encoding by default.
%
%    Some code to construct these glyphs for the \texttt{OT1} encoding
%    was made available to me by Stipcevic Mario,
%    (\texttt{stipcevic@olimp.irb.hr}).
% \changes{babel~3.5f}{1996/03/28}{New definition of \cs{dj}, see PR
%    2058}
%    \begin{macrocode}
\def\crrtic@{\hrule height0.1ex width0.3em}
\def\crttic@{\hrule height0.1ex width0.33em}
%
\def\ddj@{%
  \setbox0\hbox{d}\dimen@=\ht0
  \advance\dimen@1ex
  \dimen@.45\dimen@
  \dimen@ii\expandafter\rem@pt\the\fontdimen\@ne\font\dimen@
  \advance\dimen@ii.5ex
  \leavevmode\rlap{\raise\dimen@\hbox{\kern\dimen@ii\vbox{\crrtic@}}}}
\def\DDJ@{%
  \setbox0\hbox{D}\dimen@=.55\ht0
  \dimen@ii\expandafter\rem@pt\the\fontdimen\@ne\font\dimen@
  \advance\dimen@ii.15ex %            correction for the dash position
  \advance\dimen@ii-.15\fontdimen7\font %     correction for cmtt font
  \dimen\thr@@\expandafter\rem@pt\the\fontdimen7\font\dimen@
  \leavevmode\rlap{\raise\dimen@\hbox{\kern\dimen@ii\vbox{\crttic@}}}}
%
\DeclareTextCommand{\dj}{OT1}{\ddj@ d}
\DeclareTextCommand{\DJ}{OT1}{\DDJ@ D}
%    \end{macrocode}
%    Make sure that when an encoding other than \texttt{OT1} or
%    \texttt{T1} is used these glyphs can still be typeset.
%    \begin{macrocode}
\ProvideTextCommandDefault{\dj}{%
  \UseTextSymbol{OT1}{\dj}}
\ProvideTextCommandDefault{\DJ}{%
  \UseTextSymbol{OT1}{\DJ}}
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%
%  \begin{macro}{\SS}
%    For the \texttt{T1} encoding |\SS| is defined and selects a
%    specific glyph from the font, but for other encodings it is not
%    available. Therefor we make it available here.
%    \begin{macrocode}
\DeclareTextCommand{\SS}{OT1}{SS}
\ProvideTextCommandDefault{\SS}{\UseTextSymbol{OT1}{\SS}}
%    \end{macrocode}
%  \end{macro}
%
% \subsection{Shorthands for quotation marks}
%
%    Shorthands are provided for a number of different quotation
%    marks, which make them usable both outside and inside mathmode.
%
%  \begin{macro}{\glq}
%  \begin{macro}{\grq}
% \changes{babel~3.7a}{1997/04/25}{Make the definition of \cs{grq}
%    dependent on the font encoding}
% \changes{babel~3.8b}{2004/05/02}{Made \cs{glq} fontencoding
%    dependent as well} 
%    The `german' single quotes.
%    \begin{macrocode}
\ProvideTextCommand{\glq}{OT1}{%
  \textormath{\quotesinglbase}{\mbox{\quotesinglbase}}}
\ProvideTextCommand{\glq}{T1}{%
  \textormath{\quotesinglbase}{\mbox{\quotesinglbase}}}
\ProvideTextCommandDefault{\glq}{\UseTextSymbol{OT1}\glq}
%    \end{macrocode}
%    The definition of |\grq| depends on the fontencoding. With
%    \texttt{T1} encoding no extra kerning is needed.
%    \begin{macrocode}
\ProvideTextCommand{\grq}{T1}{%
  \textormath{\textquoteleft}{\mbox{\textquoteleft}}}
\ProvideTextCommand{\grq}{OT1}{%
  \save@sf@q{\kern-.0125em%
  \textormath{\textquoteleft}{\mbox{\textquoteleft}}%
  \kern.07em\relax}}
\ProvideTextCommandDefault{\grq}{\UseTextSymbol{OT1}\grq}
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%
%  \begin{macro}{\glqq}
%  \begin{macro}{\grqq}
% \changes{babel~3.7a}{1997/04/25}{Make the definition of \cs{grqq}
%    dependent on the font encoding}
% \changes{babel~3.8b}{2004/05/02}{Made \cs{grqq} fontencoding
%    dependent as well} 
%    The `german' double quotes.
%    \begin{macrocode}
\ProvideTextCommand{\glqq}{OT1}{%
  \textormath{\quotedblbase}{\mbox{\quotedblbase}}}
\ProvideTextCommand{\glqq}{T1}{%
  \textormath{\quotedblbase}{\mbox{\quotedblbase}}}
\ProvideTextCommandDefault{\glqq}{\UseTextSymbol{OT1}\glqq}
%    \end{macrocode}
%    The definition of |\grqq| depends on the fontencoding. With
%    \texttt{T1} encoding no extra kerning is needed.
%    \begin{macrocode}
\ProvideTextCommand{\grqq}{T1}{%
  \textormath{\textquotedblleft}{\mbox{\textquotedblleft}}}
\ProvideTextCommand{\grqq}{OT1}{%
  \save@sf@q{\kern-.07em%
  \textormath{\textquotedblleft}{\mbox{\textquotedblleft}}%
  \kern.07em\relax}}
\ProvideTextCommandDefault{\grqq}{\UseTextSymbol{OT1}\grqq}
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%
%  \begin{macro}{\flq}
%  \begin{macro}{\frq}
% \changes{babel~3.5f}{1995/08/07}{corrected spelling of
%    \cs{quilsingl...}}
% \changes{babel~3.5f}{1995/09/05}{now use \cs{textormath} in these
%    definitions}
% \changes{babel~3.8b}{2004/05/02}{Made \cs{flq} and \cs{frq}
%    fontencoding dependent} 
%    The `french' single guillemets.
%    \begin{macrocode}
\ProvideTextCommand{\flq}{OT1}{%
  \textormath{\guilsinglleft}{\mbox{\guilsinglleft}}}
\ProvideTextCommand{\flq}{T1}{%
  \textormath{\guilsinglleft}{\mbox{\guilsinglleft}}}
\ProvideTextCommandDefault{\flq}{\UseTextSymbol{OT1}\flq}
%    \end{macrocode}
%    
%    \begin{macrocode}
\ProvideTextCommand{\frq}{OT1}{%
  \textormath{\guilsinglright}{\mbox{\guilsinglright}}}
\ProvideTextCommand{\frq}{T1}{%
  \textormath{\guilsinglright}{\mbox{\guilsinglright}}}
\ProvideTextCommandDefault{\frq}{\UseTextSymbol{OT1}\frq}
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%
%  \begin{macro}{\flqq}
%  \begin{macro}{\frqq}
% \changes{babel~3.5f}{1995/08/07}{corrected spelling of
%    \cs{quillemot...}}
% \changes{babel~3.5f}{1995/09/05}{now use \cs{textormath} in these
%    definitions}
% \changes{babel~3.8b}{2004/05/02}{Made \cs{flqq} and \cs{frqq}
%    fontencoding dependent} 
%    The `french' double guillemets.
%    \begin{macrocode}
\ProvideTextCommand{\flqq}{OT1}{%
  \textormath{\guillemotleft}{\mbox{\guillemotleft}}}
\ProvideTextCommand{\flqq}{T1}{%
  \textormath{\guillemotleft}{\mbox{\guillemotleft}}}
\ProvideTextCommandDefault{\flqq}{\UseTextSymbol{OT1}\flqq}
%    \end{macrocode}
%    
%    \begin{macrocode}
\ProvideTextCommand{\frqq}{OT1}{%
  \textormath{\guillemotright}{\mbox{\guillemotright}}}
\ProvideTextCommand{\frqq}{T1}{%
  \textormath{\guillemotright}{\mbox{\guillemotright}}}
\ProvideTextCommandDefault{\frqq}{\UseTextSymbol{OT1}\frqq}
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%
%  \subsection{Umlauts and trema's}
%
%    The command |\"| needs to have a different effect for different
%    languages. For German for instance, the `umlaut' should be
%    positioned lower than the default position for placing it over
%    the letters a, o, u, A, O and U. When placed over an e, i, E or I
%    it can retain its normal position. For Dutch the same glyph is
%    always placed in the lower position.
%
%  \begin{macro}{\umlauthigh}
% \changes{v3.8a}{2004/02/19}{Use \cs{leavevmode}\cs{bgroup} to
%    prevent problems when this command occurs in vertical mode.}
%  \begin{macro}{\umlautlow}
%    To be able to provide both positions of |\"| we provide two
%    commands to switch the positioning, the default will be
%    |\umlauthigh| (the normal positioning).
%    \begin{macrocode}
\def\umlauthigh{%
  \def\bbl@umlauta##1{\leavevmode\bgroup%
      \expandafter\accent\csname\f@encoding dqpos\endcsname
      ##1\allowhyphens\egroup}%
  \let\bbl@umlaute\bbl@umlauta}
\def\umlautlow{%
  \def\bbl@umlauta{\protect\lower@umlaut}}
\def\umlautelow{%
  \def\bbl@umlaute{\protect\lower@umlaut}}
\umlauthigh
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%
%  \begin{macro}{\lower@umlaut}
%    The command |\lower@umlaut| is used to position the |\"| closer
%    the the letter.
%
%    We want the umlaut character lowered, nearer to the letter. To do
%    this we need an extra \meta{dimen} register.
%    \begin{macrocode}
\expandafter\ifx\csname U@D\endcsname\relax
  \csname newdimen\endcsname\U@D
\fi
%    \end{macrocode}
%    The following code fools \TeX's \texttt{make\_accent} procedure
%    about the current x-height of the font to force another placement
%    of the umlaut character.
%    \begin{macrocode}
\def\lower@umlaut#1{%
%    \end{macrocode}
%    First we have to save the current x-height of the font, because
%    we'll change this font dimension and this is always done
%    globally.
% \changes{v3.8a}{2004/02/19}{Use \cs{leavevmode}\cs{bgroup} to
%    prevent problems when this command occurs in vertical mode.}
%    \begin{macrocode}
  \leavevmode\bgroup
    \U@D 1ex%
%    \end{macrocode}
%    Then we compute the new x-height in such a way that the umlaut
%    character is lowered to the base character.  The value of
%    \texttt{.45ex} depends on the \MF\ parameters with which the
%    fonts were built.  (Just try out, which value will look best.)
%    \begin{macrocode}
    {\setbox\z@\hbox{%
      \expandafter\char\csname\f@encoding dqpos\endcsname}%
      \dimen@ -.45ex\advance\dimen@\ht\z@
%    \end{macrocode}
%    If the new x-height is too low, it is not changed.
%    \begin{macrocode}
      \ifdim 1ex<\dimen@ \fontdimen5\font\dimen@ \fi}%
%    \end{macrocode}
%    Finally we call the |\accent| primitive, reset the old x-height
%    and insert the base character in the argument.
% \changes{babel~3.5f}{1996/04/02}{Added a \cs{allowhyphens}}
% \changes{babel~3.5f}{1996/06/25}{removed \cs{allowhyphens}}
%    \begin{macrocode}
    \expandafter\accent\csname\f@encoding dqpos\endcsname
    \fontdimen5\font\U@D #1%
  \egroup}
%    \end{macrocode}
%  \end{macro}
%
%    For all vowels we declare |\"| to be a composite command which
%    uses |\bbl@umlauta| or |\bbl@umlaute| to position the umlaut
%    character. We need to be sure that these definitions override the
%    ones that are provided when the package \pkg{fontenc} with
%    option \Lopt{OT1} is used. Therefor these declarations are
%    postponed until the beginning of the document.
%    \begin{macrocode}
\AtBeginDocument{%
  \DeclareTextCompositeCommand{\"}{OT1}{a}{\bbl@umlauta{a}}%
  \DeclareTextCompositeCommand{\"}{OT1}{e}{\bbl@umlaute{e}}%
  \DeclareTextCompositeCommand{\"}{OT1}{i}{\bbl@umlaute{\i}}%
  \DeclareTextCompositeCommand{\"}{OT1}{\i}{\bbl@umlaute{\i}}%
  \DeclareTextCompositeCommand{\"}{OT1}{o}{\bbl@umlauta{o}}%
  \DeclareTextCompositeCommand{\"}{OT1}{u}{\bbl@umlauta{u}}%
  \DeclareTextCompositeCommand{\"}{OT1}{A}{\bbl@umlauta{A}}%
  \DeclareTextCompositeCommand{\"}{OT1}{E}{\bbl@umlaute{E}}%
  \DeclareTextCompositeCommand{\"}{OT1}{I}{\bbl@umlaute{I}}%
  \DeclareTextCompositeCommand{\"}{OT1}{O}{\bbl@umlauta{O}}%
  \DeclareTextCompositeCommand{\"}{OT1}{U}{\bbl@umlauta{U}}%
}
%    \end{macrocode}
%
% \subsection{The redefinition of the style commands}
%
%    The rest of the code in this file can only be processed by
%    \LaTeX, so we check the current format. If it is plain \TeX,
%    processing should stop here. But, because of the need to limit
%    the scope of the definition of |\format|, a macro that is used
%    locally in the following |\if|~statement, this comparison is done
%    inside a group. To prevent \TeX\ from complaining about an
%    unclosed group, the processing of the command |\endinput| is
%    deferred until after the group is closed. This is accomplished by
%    the command |\aftergroup|.
%    \begin{macrocode}
{\def\format{lplain}
\ifx\fmtname\format
\else
  \def\format{LaTeX2e}
  \ifx\fmtname\format
  \else
    \aftergroup\endinput
  \fi
\fi}
%    \end{macrocode}
%
%    Now that we're sure that the code is seen by \LaTeX\ only, we
%    have to find out what the main (primary) document style is
%    because we want to redefine some macros.  This is only necessary
%    for releases of \LaTeX\ dated before December~1991. Therefor
%    this part of the code can optionally be included in
%    \file{babel.def} by specifying the \texttt{docstrip} option
%    \texttt{names}.
%    \begin{macrocode}
%<*names>
%    \end{macrocode}
%
%    The standard styles can be distinguished by checking whether some
%    macros are defined. In table~\ref{styles} an overview is given of
%    the macros that can be used for this purpose.
%  \begin{table}[htb]
%  \begin{center}
% \DeleteShortVerb{\|}
%  \begin{tabular}{|lcp{8cm}|}
%   \hline
%   article         & : & both the \verb+\chapter+ and \verb+\opening+
%                         macros are undefined\\
%   report and book & : & the \verb+\chapter+ macro is defined and
%                         the \verb+\opening+ is undefined\\
%   letter          & : & the \verb+\chapter+ macro is undefined and
%                         the \verb+\opening+ is defined\\
%   \hline
%  \end{tabular}
% \caption{How to determine the main document style}\label{styles}
% \MakeShortVerb{\|}
%  \end{center}
%  \end{table}
%
%    \noindent The macros that have to be redefined for the
%    \texttt{report} and \texttt{book} document styles happen to be
%    the same, so there is no need to distinguish between those two
%    styles.
%
%  \begin{macro}{\doc@style}
%    First a parameter |\doc@style| is defined to identify the current
%    document style. This parameter might have been defined by a
%    document style that already uses macros instead of hard-wired
%    texts, such as \file{artikel1.sty}~\cite{BEP}, so the existence of
%    |\doc@style| is checked. If this macro is undefined, i.\,e., if
%    the document style is unknown and could therefore contain
%    hard-wired texts, |\doc@style| is defined to the default
%    value~`0'.
% \changes{babel~3.0d}{1991/10/29}{Removed use of \cs{@ifundefined}}
%    \begin{macrocode}
\ifx\@undefined\doc@style
  \def\doc@style{0}%
%    \end{macrocode}
%    This parameter is defined in the following \texttt{if}
%    construction (see table~\ref{styles}):
%
%    \begin{macrocode}
  \ifx\@undefined\opening
    \ifx\@undefined\chapter
      \def\doc@style{1}%
    \else
      \def\doc@style{2}%
    \fi
  \else
    \def\doc@style{3}%
  \fi%
\fi%
%    \end{macrocode}
%  \end{macro}
%
% \changes{babel~3.1}{1991/11/05}{Removed definition of
%    \cs{if@restonecol}}
%
%    \subsubsection{Redefinition of macros}
%
%    Now here comes the real work: we start to redefine things and
%    replace hard-wired texts by macros. These redefinitions should be
%    carried out conditionally, in case it has already been done.
%
%    For the \texttt{figure} and \texttt{table} environments we have
%    in all styles:
%    \begin{macrocode}
\@ifundefined{figurename}{\def\fnum@figure{\figurename{} \thefigure}}{}
\@ifundefined{tablename}{\def\fnum@table{\tablename{} \thetable}}{}
%    \end{macrocode}
%
%    The rest of the macros have to be treated differently for each
%    style.  When |\doc@style| still has its default value nothing
%    needs to be done.
%    \begin{macrocode}
\ifcase \doc@style\relax
\or
%    \end{macrocode}
%
%    This means that \file{babel.def} is read after the
%    \texttt{article} style, where no |\chapter| and |\opening|
%    commands are defined\footnote{A fact that was pointed out to me
%    by Nico Poppelier and was already used in Piet van Oostrum's
%    document style option~\texttt{nl}.}.
%
%    First we have the |\tableofcontents|,
%    |\listoffigures| and |\listoftables|:
%    \begin{macrocode}
\@ifundefined{contentsname}%
    {\def\tableofcontents{\section*{\contentsname\@mkboth
          {\uppercase{\contentsname}}{\uppercase{\contentsname}}}%
      \@starttoc{toc}}}{}

\@ifundefined{listfigurename}%
    {\def\listoffigures{\section*{\listfigurename\@mkboth
          {\uppercase{\listfigurename}}{\uppercase{\listfigurename}}}%
     \@starttoc{lof}}}{}

\@ifundefined{listtablename}%
    {\def\listoftables{\section*{\listtablename\@mkboth
          {\uppercase{\listtablename}}{\uppercase{\listtablename}}}%
      \@starttoc{lot}}}{}
%    \end{macrocode}
%
% Then the |\thebibliography| and |\theindex| environments.
%
%    \begin{macrocode}
\@ifundefined{refname}%
    {\def\thebibliography#1{\section*{\refname
      \@mkboth{\uppercase{\refname}}{\uppercase{\refname}}}%
      \list{[\arabic{enumi}]}{\settowidth\labelwidth{[#1]}%
        \leftmargin\labelwidth
        \advance\leftmargin\labelsep
        \usecounter{enumi}}%
        \def\newblock{\hskip.11em plus.33em minus.07em}%
        \sloppy\clubpenalty4000\widowpenalty\clubpenalty
        \sfcode`\.=1000\relax}}{}

\@ifundefined{indexname}%
    {\def\theindex{\@restonecoltrue\if@twocolumn\@restonecolfalse\fi
     \columnseprule \z@
     \columnsep 35pt\twocolumn[\section*{\indexname}]%
       \@mkboth{\uppercase{\indexname}}{\uppercase{\indexname}}%
       \thispagestyle{plain}%
       \parskip\z@ plus.3pt\parindent\z@\let\item\@idxitem}}{}
%    \end{macrocode}
%
% The |abstract| environment:
%
%    \begin{macrocode}
\@ifundefined{abstractname}%
    {\def\abstract{\if@twocolumn
    \section*{\abstractname}%
    \else \small
    \begin{center}%
    {\bf \abstractname\vspace{-.5em}\vspace{\z@}}%
    \end{center}%
    \quotation
    \fi}}{}
%    \end{macrocode}
%
% And last but not least, the macro |\part|:
%
%    \begin{macrocode}
\@ifundefined{partname}%
{\def\@part[#1]#2{\ifnum \c@secnumdepth >\m@ne
        \refstepcounter{part}%
        \addcontentsline{toc}{part}{\thepart
        \hspace{1em}#1}\else
      \addcontentsline{toc}{part}{#1}\fi
   {\parindent\z@ \raggedright
    \ifnum \c@secnumdepth >\m@ne
      \Large \bf \partname{} \thepart
      \par \nobreak
    \fi
    \huge \bf
    #2\markboth{}{}\par}%
    \nobreak
    \vskip 3ex\@afterheading}%
}{}
%    \end{macrocode}
%
%    This is all that needs to be done for the \texttt{article} style.
%
%    \begin{macrocode}
\or
%    \end{macrocode}
%
%    The next case is formed by the two styles \texttt{book} and
%    \texttt{report}.  Basically we have to do the same as for the
%    \texttt{article} style, except now we must also change the
%    |\chapter| command.
%
%    The tables of contents, figures and tables:
%    \begin{macrocode}
\@ifundefined{contentsname}%
    {\def\tableofcontents{\@restonecolfalse
      \if@twocolumn\@restonecoltrue\onecolumn
      \fi\chapter*{\contentsname\@mkboth
          {\uppercase{\contentsname}}{\uppercase{\contentsname}}}%
      \@starttoc{toc}%
      \csname if@restonecol\endcsname\twocolumn
      \csname fi\endcsname}}{}

\@ifundefined{listfigurename}%
    {\def\listoffigures{\@restonecolfalse
      \if@twocolumn\@restonecoltrue\onecolumn
      \fi\chapter*{\listfigurename\@mkboth
          {\uppercase{\listfigurename}}{\uppercase{\listfigurename}}}%
      \@starttoc{lof}%
      \csname if@restonecol\endcsname\twocolumn
      \csname fi\endcsname}}{}

\@ifundefined{listtablename}%
    {\def\listoftables{\@restonecolfalse
      \if@twocolumn\@restonecoltrue\onecolumn
      \fi\chapter*{\listtablename\@mkboth
          {\uppercase{\listtablename}}{\uppercase{\listtablename}}}%
      \@starttoc{lot}%
      \csname if@restonecol\endcsname\twocolumn
      \csname fi\endcsname}}{}
%    \end{macrocode}
%
%    Again, the |bibliography| and |index| environments; notice that
%    in this case we use |\bibname| instead of |\refname| as in the
%    definitions for the \texttt{article} style.  The reason for this
%    is that in the \texttt{article} document style the term
%    `References' is used in the definition of |\thebibliography|. In
%    the \texttt{report} and \texttt{book} document styles the term
%    `Bibliography' is used.
%    \begin{macrocode}
\@ifundefined{bibname}%
    {\def\thebibliography#1{\chapter*{\bibname
     \@mkboth{\uppercase{\bibname}}{\uppercase{\bibname}}}%
     \list{[\arabic{enumi}]}{\settowidth\labelwidth{[#1]}%
     \leftmargin\labelwidth \advance\leftmargin\labelsep
     \usecounter{enumi}}%
     \def\newblock{\hskip.11em plus.33em minus.07em}%
     \sloppy\clubpenalty4000\widowpenalty\clubpenalty
     \sfcode`\.=1000\relax}}{}

\@ifundefined{indexname}%
    {\def\theindex{\@restonecoltrue\if@twocolumn\@restonecolfalse\fi
    \columnseprule \z@
    \columnsep 35pt\twocolumn[\@makeschapterhead{\indexname}]%
      \@mkboth{\uppercase{\indexname}}{\uppercase{\indexname}}%
    \thispagestyle{plain}%
    \parskip\z@ plus.3pt\parindent\z@ \let\item\@idxitem}}{}
%    \end{macrocode}
%
% Here is the |abstract| environment:
%    \begin{macrocode}
\@ifundefined{abstractname}%
    {\def\abstract{\titlepage
    \null\vfil
    \begin{center}%
    {\bf \abstractname}%
    \end{center}}}{}
%    \end{macrocode}
%
%     And last but not least the |\chapter|, |\appendix| and
%    |\part| macros.
%    \begin{macrocode}
\@ifundefined{chaptername}{\def\@chapapp{\chaptername}}{}
%
\@ifundefined{appendixname}%
    {\def\appendix{\par
      \setcounter{chapter}{0}%
      \setcounter{section}{0}%
      \def\@chapapp{\appendixname}%
      \def\thechapter{\Alph{chapter}}}}{}
%
\@ifundefined{partname}%
    {\def\@part[#1]#2{\ifnum \c@secnumdepth >-2\relax
            \refstepcounter{part}%
            \addcontentsline{toc}{part}{\thepart
            \hspace{1em}#1}\else
            \addcontentsline{toc}{part}{#1}\fi
       \markboth{}{}%
       {\centering
        \ifnum \c@secnumdepth >-2\relax
          \huge\bf \partname{} \thepart
        \par
        \vskip 20pt \fi
        \Huge \bf
        #1\par}\@endpart}}{}%
%    \end{macrocode}
%
%    \begin{macrocode}
\or
%    \end{macrocode}
%
%    Now we address the case where \file{babel.def} is read after the
%    \texttt{letter} style. The \texttt{letter} document style
%    defines the macro |\opening| and some other macros that are
%    specific to \texttt{letter}. This means that we have to redefine
%    other macros, compared to the previous two cases.
%
%    First two macros for the material at the end of a letter, the
%    |\cc| and |\encl| macros.
%    \begin{macrocode}
\@ifundefined{ccname}%
    {\def\cc#1{\par\noindent
     \parbox[t]{\textwidth}%
     {\@hangfrom{\rm \ccname : }\ignorespaces #1\strut}\par}}{}

\@ifundefined{enclname}%
    {\def\encl#1{\par\noindent
     \parbox[t]{\textwidth}%
     {\@hangfrom{\rm \enclname : }\ignorespaces #1\strut}\par}}{}
%    \end{macrocode}
%
%    The last thing we have to do here is to redefine the
%    \texttt{headings} pagestyle:
% \changes{babel~3.3}{1993/07/11}{\cs{headpagename} should be
%    \cs{pagename}}
%    \begin{macrocode}
\@ifundefined{headtoname}%
    {\def\ps@headings{%
        \def\@oddhead{\sl \headtoname{} \ignorespaces\toname \hfil
                      \@date \hfil \pagename{} \thepage}%
        \def\@oddfoot{}}}{}
%    \end{macrocode}
%
%    This was the last of the four standard document styles, so if
%    |\doc@style| has another value we do nothing and just close the
%    \texttt{if} construction.
%    \begin{macrocode}
\fi
%    \end{macrocode}
%    Here ends the code that can be optionally included when a version
%    of \LaTeX\ is in use that is dated \emph{before} December~1991.
%    \begin{macrocode}
%</names>
%</core>
%    \end{macrocode}
%
% \subsection{Cross referencing macros}
%
%    The \LaTeX\ book states:
%  \begin{quote}
%    The \emph{key} argument is any sequence of letters, digits, and
%    punctuation symbols; upper- and lowercase letters are regarded as
%    different.
%  \end{quote}
%    When the above quote should still be true when a document is
%    typeset in a language that has active characters, special care
%    has to be taken of the category codes of these characters when
%    they appear in an argument of the cross referencing macros.
%
%    When a cross referencing command processes its argument, all
%    tokens in this argument should be character tokens with category
%    `letter' or `other'.
%
%    The only way to accomplish this in most cases is to use the trick
%    described in the \TeX book~\cite{DEK} (Appendix~D, page~382).
%    The primitive |\meaning| applied to a token expands to the
%    current meaning of this token.  For example, `|\meaning\A|' with
%    |\A| defined as `|\def\A#1{\B}|' expands to the characters
%    `|macro:#1->\B|' with all category codes set to `other' or
%    `space'.
%
%  \begin{macro}{\bbl@redefine}
% \changes{babel~3.5f}{1995/11/15}{Macro added}
%    To redefine a command, we save the old meaning of the macro.
%    Then we redefine it to call the original macro with the
%    `sanitized' argument.  The reason why we do it this way is that
%    we don't want to redefine the \LaTeX\ macros completely in case
%    their definitions change (they have changed in the past).
%
%    Because we need to redefine a number of commands we define the
%    command |\bbl@redefine| which takes care of this. It creates a
%    new control sequence, |\org@...|
%    \begin{macrocode}
%<*core|shorthands>
\def\bbl@redefine#1{%
  \edef\bbl@tempa{\expandafter\@gobble\string#1}%
  \expandafter\let\csname org@\bbl@tempa\endcsname#1
  \expandafter\def\csname\bbl@tempa\endcsname}
%    \end{macrocode}
%
%    This command should only be used in the preamble of the document.
%    \begin{macrocode}
\@onlypreamble\bbl@redefine
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\bbl@redefine@long}
% \changes{babel~3.6f}{1997/01/14}{Macro added}
%    This version of |\babel@redefine| can be used to redefine |\long|
%    commands such as |\ifthenelse|.
%    \begin{macrocode}
\def\bbl@redefine@long#1{%
  \edef\bbl@tempa{\expandafter\@gobble\string#1}%
  \expandafter\let\csname org@\bbl@tempa\endcsname#1
  \expandafter\long\expandafter\def\csname\bbl@tempa\endcsname}
\@onlypreamble\bbl@redefine@long
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\bbl@redefinerobust}
% \changes{babel~3.5f}{1995/11/15}{Macro added}
%    For commands that are redefined, but which \textit{might} be
%    robust we need a slightly more intelligent macro. A robust
%    command |foo| is defined to expand to |\protect|\verb*|\foo |. So
%    it is necessary to check whether \verb*|\foo | exists.
%    \begin{macrocode}
\def\bbl@redefinerobust#1{%
  \edef\bbl@tempa{\expandafter\@gobble\string#1}%
  \expandafter\ifx\csname \bbl@tempa\space\endcsname\relax
    \expandafter\let\csname org@\bbl@tempa\endcsname#1
    \expandafter\edef\csname\bbl@tempa\endcsname{\noexpand\protect
      \expandafter\noexpand\csname\bbl@tempa\space\endcsname}%
  \else
    \expandafter\let\csname org@\bbl@tempa\expandafter\endcsname
                    \csname\bbl@tempa\space\endcsname
  \fi
%    \end{macrocode}
%    The result of the code above is that the command that is being
%    redefined is always robust afterwards. Therefor all we need to do
%    now is define \verb*|\foo |.
% \changes{babel~3.5f}{1996/04/09}{Define \cs*{foo } instead of
%    \cs{foo}}
%    \begin{macrocode}
  \expandafter\def\csname\bbl@tempa\space\endcsname}
%    \end{macrocode}
%
%    This command should only be used in the preamble of the document.
%    \begin{macrocode}
\@onlypreamble\bbl@redefinerobust
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\newlabel}
% \changes{babel~3.5f}{1995/11/15}{Now use \cs{bbl@redefine}}
%    The macro |\label| writes a line with a |\newlabel| command
%    into the |.aux| file to define labels.
%    \begin{macrocode}
%\bbl@redefine\newlabel#1#2{%
%  \@safe@activestrue\org@newlabel{#1}{#2}\@safe@activesfalse}
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\@newl@bel}
% \changes{babel~3.6i}{1997/03/01}{Now redefine \cs{@newl@bel} instead
%    of \cs{@lbibitem} and \cs{newlabel}}
%    We need to change the definition of the \LaTeX-internal macro
%    |\@newl@bel|. This is needed because we need to make sure that
%    shorthand characters expand to their non-active version.
%
%^^A The following lines commented out in preparation for a change
%^^A in the LaTeX definition of \@enwl@bel... JLB 2000/10/01
%^^A
%^^A    To play it safe when redefining a \LaTeX-internal command we
%^^A    first check whether its definition didn't change.
%^^A    \begin{macrocode}
%^^A\CheckCommand*\@newl@bel[3]{%
%^^A  \@ifundefined{#1@#2}%
%^^A    \relax
%^^A    {\gdef \@multiplelabels {%
%^^A       \@latex@warning@no@line{There were multiply-defined labels}}%
%^^A     \@latex@warning@no@line{Label `#2' multiply defined}}%
%^^A  \global\@namedef{#1@#2}{#3}}
%^^A    \end{macrocode}
%^^A    Then we give the new definition.
%    \begin{macrocode}
\def\@newl@bel#1#2#3{%
%    \end{macrocode}
%    First we open a new group to keep the changed setting of
%    |\protect| local and then we set the |@safe@actives| switch to
%    true to make sure that any shorthand that appears in any of the
%    arguments immediately expands to its non-active self.
% \changes{babel~3.7a}{1997/12/19}{Call \cs{@safe@activestrue}
%    directly}
%    \begin{macrocode}
  {%
    \@safe@activestrue
    \@ifundefined{#1@#2}%
      \relax
      {%
        \gdef \@multiplelabels {%
          \@latex@warning@no@line{There were multiply-defined labels}}%
        \@latex@warning@no@line{Label `#2' multiply defined}%
      }%
    \global\@namedef{#1@#2}{#3}%
    }%
  }
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\@testdef}
%    An internal \LaTeX\ macro used to test if the labels that have
%    been written on the |.aux| file have changed.  It is called by
%    the |\enddocument| macro. This macro needs to be completely
%    rewritten, using |\meaning|. The reason for this is that in some
%    cases the expansion of |\#1@#2| contains the same characters as
%    the |#3|; but the character codes differ. Therefor \LaTeX\ keeps
%    reporting that the labels may have changed.
% \changes{babel~3.4g}{1994/08/30}{Moved the \cs{def} inside the
%    macrocode environment}
% \changes{babel~3.5f}{1995/11/15}{Now use \cs{bbl@redefine}}
% \changes{babel~3.5f}{1996/01/09}{Complete rewrite of this macro as
%    the same character ended up with different category codes in the
%    labels that are being compared. Now use \cs{meaning}}
% \changes{babel~3.5f}{1996/01/16}{Use \cs{strip@prefix} only on
%    \cs{bbl@tempa} when it is not \cs{relax}}
% \changes{babel~3.6i}{1997/02/28}{Make sure that shorthands don't get
%    expanded at the wrong moment.}
% \changes{babel~3.6i}{1997/03/01}{\cs{@safe@activesfalse} is now
%    part of the label definition}
% \changes{babel~3.7a}{1998/03/13}{Removed \cs{@safe@activesfalse}
%    from the label definition}
%    \begin{macrocode}
\CheckCommand*\@testdef[3]{%
  \def\reserved@a{#3}%
  \expandafter \ifx \csname #1@#2\endcsname \reserved@a
  \else
    \@tempswatrue
  \fi}
%    \end{macrocode}
%    Now that we made sure that |\@testdef| still has the same
%    definition we can rewrite it. First we make the shorthands
%    `safe'.
%    \begin{macrocode}
\def\@testdef #1#2#3{%
  \@safe@activestrue
%    \end{macrocode}
%    Then we use |\bbl@tempa| as an `alias' for the macro that
%    contains the label which is being checked.
%    \begin{macrocode}
  \expandafter\let\expandafter\bbl@tempa\csname #1@#2\endcsname
%    \end{macrocode}
%    Then we define |\bbl@tempb| just as |\@newl@bel| does it.
%    \begin{macrocode}
  \def\bbl@tempb{#3}%
  \@safe@activesfalse
%    \end{macrocode}
%    When the label is defined we replace the definition of
%    |\bbl@tempa| by its meaning.
%    \begin{macrocode}
  \ifx\bbl@tempa\relax
  \else
    \edef\bbl@tempa{\expandafter\strip@prefix\meaning\bbl@tempa}%
  \fi
%    \end{macrocode}
%    We do the same for |\bbl@tempb|.
%    \begin{macrocode}
  \edef\bbl@tempb{\expandafter\strip@prefix\meaning\bbl@tempb}%
%    \end{macrocode}
%    If the label didn't change, |\bbl@tempa| and |\bbl@tempb| should
%    be identical macros.
%    \begin{macrocode}
  \ifx \bbl@tempa \bbl@tempb
  \else
    \@tempswatrue
  \fi}
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\ref}
%  \begin{macro}{\pageref}
%    The same holds for the macro |\ref| that references a label
%    and |\pageref| to reference a page. So we redefine |\ref| and
%    |\pageref|. While we change these macros, we make them robust as
%    well (if they weren't already) to prevent problems if they should
%    become expanded at the wrong moment.
% \changes{babel~3.5b}{1995/03/07}{Made \cs{ref} and \cs{pageref}
%    robust (PR1353)}
% \changes{babel~3.5d}{1995/07/04}{use a different control sequence
%    while making \cs{ref} and \cs{pageref} robust}
% \changes{babel~3.5f}{1995/11/06}{redefine \cs*{ref } if it exists
%    instead of \cs{ref}}
% \changes{babel~3.5f}{1995/11/15}{Now use \cs{bbl@redefinerobust}}
% \changes{babel~3.5f}{1996/01/19}{redefine \cs{\@setref} instead of
%    \cs{ref} and \cs{pageref} in \LaTeXe.}
% \changes{babel~3.5f}{1996/01/21}{Reverse the previous change as it
%    inhibits the use of active characters in labels}
%    \begin{macrocode}
\bbl@redefinerobust\ref#1{%
  \@safe@activestrue\org@ref{#1}\@safe@activesfalse}
\bbl@redefinerobust\pageref#1{%
  \@safe@activestrue\org@pageref{#1}\@safe@activesfalse}
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%
%  \begin{macro}{\@citex}
% \changes{babel~3.5f}{1995/11/15}{Now use \cs{bbl@redefine}}
%    The macro used to cite from a bibliography, |\cite|, uses an
%    internal macro, |\@citex|.
%    It is this internal macro that picks up the argument(s),
%    so we redefine this internal macro and leave |\cite| alone. The
%    first argument is used for typesetting, so the shorthands need
%    only be deactivated in the second argument.
% \changes{babel~3.7g}{2000/10/01}{The shorthands need to be
%    deactivated for the second argument of \cs{@citex} only.}
%    \begin{macrocode}
\bbl@redefine\@citex[#1]#2{%
  \@safe@activestrue\edef\@tempa{#2}\@safe@activesfalse
  \org@@citex[#1]{\@tempa}}
%    \end{macrocode}
%    Unfortunately, the packages \pkg{natbib} and \pkg{cite} need a
%    different definition of |\@citex|...
%    To begin with, \pkg{natbib} has a definition for |\@citex| with
%    \emph{three} arguments... We only know that a package is loaded
%    when |\begin{document}| is executed, so we need to postpone the
%    different redefinition.
%    \begin{macrocode}
\AtBeginDocument{%
  \@ifpackageloaded{natbib}{%
%    \end{macrocode}
%    Notice that we use |\def| here instead of |\bbl@redefine| because
%    |\org@@citex| is already defined and we don't want to overwrite
%    that definition (it would result in parameter stack overflow
%    because of a circular definition).
%    \begin{macrocode}
    \def\@citex[#1][#2]#3{%
      \@safe@activestrue\edef\@tempa{#3}\@safe@activesfalse
      \org@@citex[#1][#2]{\@tempa}}%
  }{}}
%    \end{macrocode}
%    The package \pkg{cite} has a definition of |\@citex| where the
%    shorthands need to be turned off in both arguments.
%    \begin{macrocode}
\AtBeginDocument{%
  \@ifpackageloaded{cite}{%
    \def\@citex[#1]#2{%
      \@safe@activestrue\org@@citex[#1]{#2}\@safe@activesfalse}%
    }{}}
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\nocite}
% \changes{babel~3.5f}{1995/11/15}{Now use \cs{bbl@redefine}}
%    The macro |\nocite| which is used to instruct BiB\TeX\ to
%    extract uncited references from the database.
%    \begin{macrocode}
\bbl@redefine\nocite#1{%
  \@safe@activestrue\org@nocite{#1}\@safe@activesfalse}
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\bibcite}
% \changes{babel~3.5f}{1995/11/15}{Now use \cs{bbl@redefine}}
%    The macro that is used in the |.aux| file to define citation
%    labels. When packages such as \pkg{natbib} or \pkg{cite} are not
%    loaded its second argument is used to typeset the citation
%    label. In that case, this second argument can contain active
%    characters but is used in an environment where
%    |\@safe@activestrue| is in effect. This switch needs to be reset
%    inside the |\hbox| which contains the citation label. In order to
%    determine during \file{.aux} file processing which definition of
%    |\bibcite| is needed we define |\bibcite| in such a way that it
%    redefines itself with the proper definition.
% \changes{babel~3.6s}{1999/04/13}{Need to determine `online' which
%    definition of \cs{bibcite} is needed}
% \changes{babel~3.6v}{1999/04/21}{Also check for \pkg{cite} it can't
%    handle \cs{@safe@activesfalse} in its second argument}
%    \begin{macrocode}
\bbl@redefine\bibcite{%
%    \end{macrocode}
%    We call |\bbl@cite@choice| to select the proper definition for
%    |\bibcite|. This new definition is then activated.
%    \begin{macrocode}
  \bbl@cite@choice
  \bibcite}
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\bbl@bibcite}
% \changes{babel~3.6v}{1999/04/21}{Macro \cs{bbl@bibcite} added}
%    The macro |\bbl@bibcite| holds the definition of |\bibcite|
%    needed when neither \pkg{natbib} nor \pkg{cite} is loaded.
%    \begin{macrocode}
\def\bbl@bibcite#1#2{%
  \org@bibcite{#1}{\@safe@activesfalse#2}}
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\bbl@cite@choice}
% \changes{babel~3.6v}{1999/04/21}{Macro \cs{bbl@cite@choice} added}
%    The macro |\bbl@cite@choice| determines which definition of
%    |\bibcite| is needed.
%    \begin{macrocode}
\def\bbl@cite@choice{%
%    \end{macrocode}
%    First we give |\bibcite| its default definition.
%    \begin{macrocode}
  \global\let\bibcite\bbl@bibcite
%    \end{macrocode}
%    Then, when \pkg{natbib} is loaded we restore the original
%    definition of |\bibcite| .
%    \begin{macrocode}
  \@ifpackageloaded{natbib}{\global\let\bibcite\org@bibcite}{}%
%    \end{macrocode}
%    For \pkg{cite} we do the same.
%    \begin{macrocode}
  \@ifpackageloaded{cite}{\global\let\bibcite\org@bibcite}{}%
%    \end{macrocode}
%    Make sure this only happens once.
%    \begin{macrocode}
  \global\let\bbl@cite@choice\relax
  }
%    \end{macrocode}
%
%    When a document is run for the first time, no \file{.aux} file is
%    available, and |\bibcite| will not yet be properly defined. In
%    this case, this has to happen before the document starts.
%    \begin{macrocode}
\AtBeginDocument{\bbl@cite@choice}
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\@bibitem}
% \changes{babel~3.5f}{1995/11/15}{Now use \cs{bbl@redefine}}
%    One of the two internal \LaTeX\ macros called by |\bibitem|
%    that write the citation label on the |.aux| file.
%    \begin{macrocode}
\bbl@redefine\@bibitem#1{%
  \@safe@activestrue\org@@bibitem{#1}\@safe@activesfalse}
%    \end{macrocode}
%  \end{macro}
%
%  \subsection{marks}
%
%  \begin{macro}{\markright}
%  \begin{macro}{\markboth}
% \changes{babel~3.6i}{1997/03/15}{Added redefinition of \cs{mark...}
%    commands}
%    Because the output routine is asynchronous, we must
%    pass the current language attribute to the head lines, together
%    with the text that is put into them. To achieve this we need to
%    adapt the definition of |\markright| and |\markboth| somewhat.
% \changes{babel~3.7c}{1999/04/08}{Removed the use of \cs{head@lang}
%    (PR 2990)}
% \changes{babel~3.7c}{1999/04/09}{Avoid expanding the arguments by
%    storing them in token registers}
% \changes{babel~3.7m}{2003/11/15}{added \cs{bbl@restore@actives} to
%    the mark}
% \changes{babel~3.8c}{2004/05/26}{No need to add \emph{anything} to
%    an empty mark; prevented this by checking the contents of the
%    argument}
% \changes{babel~3.8f}{2005/05/15}{Make the definition independent of
%    the original definition; expand \cs{languagename} before passing
%    it into the token registers} 
%    \begin{macrocode}
\bbl@redefine\markright#1{%
%    \end{macrocode}
%    First of all we temporarily store the language switching command,
%    using an expanded definition in order to get the current value of
%    |\languagename|. 
%    \begin{macrocode}
  \edef\bbl@tempb{\noexpand\protect
    \noexpand\foreignlanguage{\languagename}}%
%    \end{macrocode}
%    Then, we check whether the argument is empty; if it is, we
%    just make sure the scratch token register is empty.
%    \begin{macrocode}
  \def\bbl@arg{#1}%
  \ifx\bbl@arg\@empty
    \toks@{}%
  \else
%    \end{macrocode}
%    Next, we store the argument to |\markright| in the scratch token
%    register, together with the expansion of |\bbl@tempb| (containing
%    the language switching command) as defined before. This way
%    these commands will not be expanded by using |\edef| later
%    on, and we make sure that the text is typeset using the
%    correct language settings. While doing so, we make sure that
%    active characters that may end up in the mark are not disabled by
%    the output routine kicking in while \cs{@safe@activestrue} is in
%    effect.
%    \begin{macrocode}
    \expandafter\toks@\expandafter{%
             \bbl@tempb{\protect\bbl@restore@actives#1}}%
  \fi
%    \end{macrocode}
%    Then we define a temporary control sequence using |\edef|.
%    \begin{macrocode}
  \edef\bbl@tempa{%
%    \end{macrocode}
%     When |\bbl@tempa| is executed, only |\languagename| will be
%    expanded, because of the way the token register was filled.
%    \begin{macrocode}
    \noexpand\org@markright{\the\toks@}}%
  \bbl@tempa
}
%    \end{macrocode}
%    The definition of |\markboth| is equivalent to that of
%    |\markright|, except that we need two token registers.
% \changes{babel~3.7m}{2003/11/15}{added \cs{bbl@restore@actives} to
%    the mark}
% \changes{babel~3.8c}{2004/05/26}{No need to add \emph{anything} to
%    an empty mark, prevented this by checking the contents of the
%    arguments} 
% \changes{babel~3.8f}{2005/05/15}{Make the definition independent of
%    the original definition; expand \cs{languagename} before passing
%    it into the token registers} 
%    \begin{macrocode}
\bbl@redefine\markboth#1#2{%
  \edef\bbl@tempb{\noexpand\protect
    \noexpand\foreignlanguage{\languagename}}%
  \def\bbl@arg{#1}%
  \ifx\bbl@arg\@empty
    \toks@{}%
  \else
   \expandafter\toks@\expandafter{%
             \bbl@tempb{\protect\bbl@restore@actives#1}}%
  \fi
  \def\bbl@arg{#2}%
  \ifx\bbl@arg\@empty
    \toks8{}%
  \else
    \expandafter\toks8\expandafter{%
             \bbl@tempb{\protect\bbl@restore@actives#2}}%
  \fi
  \edef\bbl@tempa{%
    \noexpand\org@markboth{\the\toks@}{\the\toks8}}%
  \bbl@tempa
}
%</core|shorthands>
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%
%  \subsection{Encoding issues (part 2)}
%
% \changes{babel~3.7c}{1999/04/16}{Removed redefinition of \cs{@roman}
%    and \cs{@Roman}}
%
%  \begin{macro}{\TeX}
%  \begin{macro}{\LaTeX}
% \changes{babel~3.7a}{1998/03/12}{Make \TeX\ and \LaTeX\ logos
%    encoding-independent}
%    Because documents may use font encodings other than one of the
%    latin encodings, we make sure that the logos of \TeX\ and
%    \LaTeX\ always come out in the right encoding.
%    \begin{macrocode}
%<*core>
\bbl@redefine\TeX{\textlatin{\org@TeX}}
\bbl@redefine\LaTeX{\textlatin{\org@LaTeX}}
%</core>
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%
%  \subsection{Preventing clashes with other packages}
%
%  \subsubsection{\pkg{ifthen}}
%
%  \begin{macro}{\ifthenelse}
% \changes{babel~3.5g}{1996/08/11}{Redefinition of \cs{ifthenelse}
%    added to circumvent problems with \cs{pageref} in the argument of
%    \cs{isodd}}
%    Sometimes a document writer wants to create a special effect
%    depending on the page a certain fragment of text appears on. This
%    can be achieved by the following piece of code:
% \begin{verbatim}
%    \ifthenelse{\isodd{\pageref{some:label}}}
%               {code for odd pages}
%               {code for even pages}
% \end{verbatim}
%    In order for this to work the argument of |\isodd| needs to be
%    fully expandable. With the above redefinition of |\pageref| it is
%    not in the case of this example. To overcome that, we add some
%    code to the definition of |\ifthenelse| to make things work.
%
%    The first thing we need to do is check if the package
%    \pkg{ifthen} is loaded. This should be done at |\begin{document}|
%    time.
%    \begin{macrocode}
%<*package>
\AtBeginDocument{%
  \@ifpackageloaded{ifthen}{%
%    \end{macrocode}
%    Then we can redefine |\ifthenelse|:
% \changes{babel~3.6f}{1997/01/14}{\cs{ifthenelse} needs to be long}
%    \begin{macrocode}
    \bbl@redefine@long\ifthenelse#1#2#3{%
%    \end{macrocode}
%    We want to revert the definition of |\pageref| to its original
%    definition for the duration of |\ifthenelse|, so we first need to
%    store its current meaning.
%    \begin{macrocode}
      \let\bbl@tempa\pageref
      \let\pageref\org@pageref
%    \end{macrocode}
%    Then we can set the |\@safe@actives| switch and call the original
%    |\ifthenelse|. In order to be able to use shorthands in the
%    second and third arguments of |\ifthenelse| the resetting of the
%    switch \emph{and} the definition of |\pageref| happens inside
%    those arguments. 
% \changes{babel~3.6i}{1997/02/25}{Now reset the @safe@actives switch
%    inside the 2nd and 3rd arguments of \cs{ifthenelse}}
% \changes{babel~3.7f}{2000/06/29}{\cs{pageref} needs to have its
%    babel definition reinstated in the second and third arguments}
%    \begin{macrocode}
      \@safe@activestrue
      \org@ifthenelse{#1}{%
        \let\pageref\bbl@tempa
        \@safe@activesfalse
        #2}{%
        \let\pageref\bbl@tempa
        \@safe@activesfalse
        #3}%
      }%
%    \end{macrocode}
%    When the package wasn't loaded we do nothing.
%    \begin{macrocode}
    }{}%
  }
%    \end{macrocode}
%  \end{macro}
%
%  \subsubsection{\pkg{varioref}}
%
%  \begin{macro}{\@@vpageref}
% \changes{babel~3.6a}{1996/10/29}{Redefinition of \cs{@@vpageref}
%    added to circumvent problems with active \texttt{:} in the
%    argument of \cs{vref} when \pkg{varioref} is used}
%  \begin{macro}{\vrefpagenum}
% \changes{babel~3.7o}{2003/11/18}{Added redefinition of
%    \cs{vrefpagenum} which deals with ranges of pages}
%  \begin{macro}{\Ref}
% \changes{babel~3.8g}{2005/05/21}{We also need to adapt \cs{Ref}
%    which needs to be able to uppercase the first letter of the
%    expansion of \cs{ref}} 
%    When the package varioref is in use we need to modify its
%    internal command |\@@vpageref| in order to prevent problems when
%    an active character ends up in the argument of |\vref|.
%    \begin{macrocode}
\AtBeginDocument{%
  \@ifpackageloaded{varioref}{%
    \bbl@redefine\@@vpageref#1[#2]#3{%
      \@safe@activestrue
      \org@@@vpageref{#1}[#2]{#3}%
      \@safe@activesfalse}%
%    \end{macrocode}
%    The same needs to happen for |\vrefpagenum|.
%    \begin{macrocode}
    \bbl@redefine\vrefpagenum#1#2{%
      \@safe@activestrue
      \org@vrefpagenum{#1}{#2}%
      \@safe@activesfalse}%
%    \end{macrocode}
%    The package \pkg{varioref} defines |\Ref| to be a robust command
%    wich uppercases the first character of the reference text. In
%    order to be able to do that it needs to access the exandable form
%    of |\ref|. So we employ a little trick here. We redefine the
%    (internal) command \verb*|\Ref | to call |\org@ref| instead of
%    |\ref|. The disadvantgage of this solution is that whenever the
%    derfinition of |\Ref| changes, this definition needs to be updated
%    as well.
%    \begin{macrocode}
    \expandafter\def\csname Ref \endcsname#1{%
      \protected@edef\@tempa{\org@ref{#1}}\expandafter\MakeUppercase\@tempa}
    }{}%
  }
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%
%  \subsubsection{\pkg{hhline}}
%
%  \begin{macro}{\hhline}
%    Delaying the activation of the shorthand characters has introduced
%    a problem with the \pkg{hhline} package. The reason is that it
%    uses the `:' character which is made active by the french support
%    in \babel. Therefor we need to \emph{reload} the package when
%    the `:' is an active character.
%
%    So at |\begin{document}| we check whether \pkg{hhline} is loaded.
%    \begin{macrocode}
\AtBeginDocument{%
  \@ifpackageloaded{hhline}%
%    \end{macrocode}
%    Then we check whether the expansion of |\normal@char:| is not
%    equal to |\relax|.
% \changes{babel~3.8b}{2004/04/19}{added \cs{string} to prevent
%    unwanted expansion of the colon}
%    \begin{macrocode}
    {\expandafter\ifx\csname normal@char\string:\endcsname\relax
     \else
%    \end{macrocode}
%    In that case we simply reload the package. Note that this happens
%    \emph{after} the category code of the @-sign has been changed to
%    other, so we need to temporarily change it to letter again.
%    \begin{macrocode}
       \makeatletter
       \def\@currname{hhline}\input{hhline.sty}\makeatother
     \fi}%
    {}}
%    \end{macrocode}
%  \end{macro}
%
%    \subsubsection{General}
%
%  \begin{macro}{\FOREIGNLANGUAGE}
%    The package \pkg{fancyhdr} treats the running head and fout lines
%    somewhat differently as the standard classes. A symptom of this is
%    that the command |\foreignlanguage| which \babel\ adds to the
%    marks can end up inside the argument of |\MakeUppercase|. To
%    prevent unexpected results we need to define |\FOREIGNLANGUAGE|
%    here.
% \changes{babel~3.7j}{2003/05/23}{Define \cs{FOREIGNLANGUAGE}
%    unconditionally}
%    \begin{macrocode}
\DeclareRobustCommand{\FOREIGNLANGUAGE}[1]{%
  \lowercase{\foreignlanguage{#1}}}
%</package>
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\nfss@catcodes}
% \changes{babel~3.5g}{1996/08/18}{Need to add the double quote and
%    acute characters to \cs{nfss@catcodes} to prevent problems when
%    reading in .fd files}
%    \LaTeX's font selection scheme sometimes wants to read font
%    definition files in the middle of processing the document. In
%    order to guard against any characters having the wrong
%    |\catcode|s it always calls |\nfss@catcodes| before loading a
%    file. Unfortunately, the characters |"| and |'| are not dealt
%    with. Therefor we have to add them until \LaTeX\ does that
%    herself.
%    \begin{macrocode}
%<*core|shorthands>
\ifx\nfss@catcodes\@undefined
\else
  \addto\nfss@catcodes{%
    \@makeother\'%
    \@makeother\"%
    }
\fi
%    \end{macrocode}
%  \end{macro}
%
%    \begin{macrocode}
%</core|shorthands>
%    \end{macrocode}
%
% \section{Local Language Configuration}
%
%  \begin{macro}{\loadlocalcfg}
%    At some sites it may be necessary to add site-specific actions to
%    a language definition file. This can be done by creating a file
%    with the same name as the language definition file, but with the
%    extension \file{.cfg}. For instance the file \file{norsk.cfg}
%    will be loaded when the language definition file \file{norsk.ldf}
%    is loaded.
%
% \changes{babel~3.5d}{1995/06/22}{Added macro}
%    \begin{macrocode}
%<*core>
%    \end{macrocode}
%    For plain-based formats we don't want to override the definition
%    of |\loadlocalcfg| from \file{plain.def}.
%    \begin{macrocode}
\ifx\loadlocalcfg\@undefined
  \def\loadlocalcfg#1{%
    \InputIfFileExists{#1.cfg}
           {\typeout{*************************************^^J%
                     * Local config file #1.cfg used^^J%
                     *}%
            }
           {}}
\fi
%    \end{macrocode}
%    Just to be compatible with \LaTeX$\:$2.09 we add a few more lines
%    of code:
%    \begin{macrocode}
\ifx\@unexpandable@protect\@undefined
  \def\@unexpandable@protect{\noexpand\protect\noexpand}
  \long\def \protected@write#1#2#3{%
        \begingroup
         \let\thepage\relax
         #2%
         \let\protect\@unexpandable@protect
         \edef\reserved@a{\write#1{#3}}%
         \reserved@a
        \endgroup
        \if@nobreak\ifvmode\nobreak\fi\fi
  }
\fi
%</core>
%    \end{macrocode}
%  \end{macro}
%
%
% \clearpage
% \section{Driver files for the documented source code}
%
%    Since \babel\ version 3.4 all source files that are part of the
%    \babel\ system can be typeset separately. But to typeset
%    them all in one document, the file \file{babel.drv} can be used.
%    If you only want the information on how to use the \babel\ system
%    and what goodies are provided by the language-specific files, you
%    can run the file \file{user.drv} through \LaTeX\ to get a user
%    guide.
%
% \changes{babel~3.4b}{1994/05/18}{Use the ltxdoc class instead of
%    article}
% \changes{babel~3.7a}{1997/05/21}{Now need packages t1enc and
%    supertabular to be loaded; the documentation for icelandic needs
%    its \file{.ldf} file to be present}
% \changes{babel~3.8a}{2004/02/20}{Also load package url}
%    \begin{macrocode}
%<*driver>
\documentclass{ltxdoc}
\usepackage{url,t1enc,supertabular}
\usepackage[icelandic,english]{babel}
\DoNotIndex{\!,\',\,,\.,\-,\:,\;,\?,\/,\^,\`,\@M}
\DoNotIndex{\@,\@ne,\@m,\@afterheading,\@date,\@endpart}
\DoNotIndex{\@hangfrom,\@idxitem,\@makeschapterhead,\@mkboth}
\DoNotIndex{\@oddfoot,\@oddhead,\@restonecolfalse,\@restonecoltrue}
\DoNotIndex{\@starttoc,\@unused}
\DoNotIndex{\accent,\active}
\DoNotIndex{\addcontentsline,\advance,\Alph,\arabic}
\DoNotIndex{\baselineskip,\begin,\begingroup,\bf,\box,\c@secnumdepth}
\DoNotIndex{\catcode,\centering,\char,\chardef,\clubpenalty}
\DoNotIndex{\columnsep,\columnseprule,\crcr,\csname}
\DoNotIndex{\day,\def,\dimen,\discretionary,\divide,\dp,\do}
\DoNotIndex{\edef,\else,\@empty,\end,\endgroup,\endcsname,\endinput}
\DoNotIndex{\errhelp,\errmessage,\expandafter,\fi,\filedate}
\DoNotIndex{\fileversion,\fmtname,\fnum@figure,\fnum@table,\fontdimen}
\DoNotIndex{\gdef,\global}
\DoNotIndex{\hbox,\hidewidth,\hfil,\hskip,\hspace,\ht,\Huge,\huge}
\DoNotIndex{\ialign,\if@twocolumn,\ifcase,\ifcat,\ifhmode,\ifmmode}
\DoNotIndex{\ifnum,\ifx,\immediate,\ignorespaces,\input,\item}
\DoNotIndex{\kern}
\DoNotIndex{\labelsep,\Large,\large,\labelwidth,\lccode,\leftmargin}
\DoNotIndex{\lineskip,\leavevmode,\let,\list,\ll,\long,\lower}
\DoNotIndex{\m@ne,\mathchar,\mathaccent,\markboth,\month,\multiply}
\DoNotIndex{\newblock,\newbox,\newcount,\newdimen,\newif,\newwrite}
\DoNotIndex{\nobreak,\noexpand,\noindent,\null,\number}
\DoNotIndex{\onecolumn,\or}
\DoNotIndex{\p@,par, \parbox,\parindent,\parskip,\penalty}
\DoNotIndex{\protect,\ps@headings}
\DoNotIndex{\quotation}
\DoNotIndex{\raggedright,\raise,\refstepcounter,\relax,\rm,\setbox}
\DoNotIndex{\section,\setcounter,\settowidth,\scriptscriptstyle}
\DoNotIndex{\sfcode,\sl,\sloppy,\small,\space,\spacefactor,\strut}
\DoNotIndex{\string}
\DoNotIndex{\textwidth,\the,\thechapter,\thefigure,\thepage,\thepart}
\DoNotIndex{\thetable,\thispagestyle,\titlepage,\tracingmacros}
\DoNotIndex{\tw@,\twocolumn,\typeout,\uppercase,\usecounter}
\DoNotIndex{\vbox,\vfil,\vskip,\vspace,\vss}
\DoNotIndex{\widowpenalty,\write,\xdef,\year,\z@,\z@skip}
%    \end{macrocode}
%
%     Here |\dlqq| is defined so that  an example of |"'| can be
%     given.
%    \begin{macrocode}
\makeatletter
\gdef\dlqq{{\setbox\tw@=\hbox{,}\setbox\z@=\hbox{''}%
  \dimen\z@=\ht\z@ \advance\dimen\z@-\ht\tw@
  \setbox\z@=\hbox{\lower\dimen\z@\box\z@}\ht\z@=\ht\tw@
  \dp\z@=\dp\tw@ \box\z@\kern-.04em}}
%    \end{macrocode}
%
%    The code lines are numbered within sections,
%    \begin{macrocode}
%<*!user>
\@addtoreset{CodelineNo}{section}
\renewcommand\theCodelineNo{%
  \reset@font\scriptsize\thesection.\arabic{CodelineNo}}
%    \end{macrocode}
%    which should also be visible in the index; hence this
%    redefinition of a macro from \file{doc.sty}.
%    \begin{macrocode}
\renewcommand\codeline@wrindex[1]{\if@filesw
        \immediate\write\@indexfile
            {\string\indexentry{#1}%
            {\number\c@section.\number\c@CodelineNo}}\fi}
%    \end{macrocode}
%
%    The glossary environment is used or the change log, but its
%    definition needs changing for this document.
%    \begin{macrocode}
\renewenvironment{theglossary}{%
    \glossary@prologue%
    \GlossaryParms \let\item\@idxitem \ignorespaces}%
   {}
%</!user>
\makeatother
%    \end{macrocode}
%
%    A few shorthands used in the documentation
% \changes{babel~3.5g}{1996/07/06}{Added definition of \cs{Babel}}
%    \begin{macrocode}
\font\manual=logo10 % font used for the METAFONT logo, etc.
\newcommand*\MF{{\manual META}\-{\manual FONT}}
\newcommand*\TeXhax{\TeX hax}
\newcommand*\babel{\textsf{babel}}
\newcommand*\Babel{\textsf{Babel}}
\newcommand*\m[1]{\mbox{$\langle$\it#1\/$\rangle$}}
\newcommand*\langvar{\m{lang}}
%    \end{macrocode}
%
%     Some more definitions needed in the documentation.
%    \begin{macrocode}
%\newcommand*\note[1]{\textbf{#1}}
\newcommand*\note[1]{}
\newcommand*\bsl{\protect\bslash}
\newcommand*\Lopt[1]{\textsf{#1}}
\newcommand*\Lenv[1]{\textsf{#1}}
\newcommand*\file[1]{\texttt{#1}}
\newcommand*\cls[1]{\texttt{#1}}
\newcommand*\pkg[1]{\texttt{#1}}
\newcommand*\langdeffile[1]{%
%<-user>  \clearpage
  \DocInput{#1}}
%    \end{macrocode}
%
%    When a full index should be generated uncomment the line with
%    |\EnableCrossrefs|. Beware, processing may take some time.
%    Use |\DisableCrossrefs| when the index is ready.
%    \begin{macrocode}
%  \EnableCrossrefs
\DisableCrossrefs
%    \end{macrocode}
%
%    Inlude the change log.
%    \begin{macrocode}
%<-user>\RecordChanges
%    \end{macrocode}
%    The index should use the linenumbers of the code.
%    \begin{macrocode}
%<-user>\CodelineIndex
%    \end{macrocode}
%
% Set everything in |\MacroFont| instead of |\AltMacroFont|
%    \begin{macrocode}
\setcounter{StandardModuleDepth}{1}
%    \end{macrocode}
%
%    For the user guide we only want the description parts of all the
%    files.
%    \begin{macrocode}
%<+user>\OnlyDescription
%    \end{macrocode}
%    Here starts the document
%    \begin{macrocode}
\begin{document}
\DocInput{babel.dtx}
%    \end{macrocode}
%
%    All the language definition files.
% \changes{babel~3.2e}{1992/07/07}{Added slovak}
% \changes{babel~3.3}{1993/07/11}{Added catalan and galician}
% \changes{babel~3.3}{1993/07/11}{Added turkish}
% \changes{babel~3.4}{1994/02/28}{Added bahasa}
% \changes{babel~3.5a}{1995/02/16}{Added breton, irish, scottish}
% \changes{babel~3.5b}{1995/05/19}{Added lsorbian, usorbian}
% \changes{babel~3.5c}{1995/06/14}{Changed the order of including the
%    language files somewhat (PR1652)}
% \changes{babel~3.5g}{1996/07/06}{Added greek}
% \changes{babel~3.6a}{1996/12/14}{Added welsh}
%^^A \changes{babel~3.6i}{1997/02/07}{Added sanskrit}
% \changes{babel~3.6i}{1997/02/22}{Added basque}
^^A% \changes{babel~3.6i}{1997/02/22}{Added kannada}
% \changes{babel~3.7a}{1997/05/21}{Added icelandic}
% \changes{babel~3.7b}{1998/06/25}{Added Latin}
% \changes{babel~3.7c}{1999/03/09}{Added ukrainian}
% \changes{babel~3.7c}{1999/05/09}{Added hebrew and serbian}
% \changes{babel~3.7e}{1999/11/22}{Added missing hebrew files}
% \changes{babel~3.7f}{2000/09/21}{Added bulgarian}
% \changes{babel~3.7f}{2000/09/26}{Added samin}
% \changes{babel~3.8a}{2004/02/20}{Added interlingua}
%    \begin{macrocode}
%<+user>\clearpage
\langdeffile{esperanto.dtx}
\langdeffile{interlingua.dtx}
%
\langdeffile{dutch.dtx}
\langdeffile{english.dtx}
\langdeffile{germanb.dtx}
\langdeffile{ngermanb.dtx}
%
\langdeffile{breton.dtx}
\langdeffile{welsh.dtx}
\langdeffile{irish.dtx}
\langdeffile{scottish.dtx}
%
\langdeffile{greek.dtx}
%
\langdeffile{frenchb.dtx}
\langdeffile{italian.dtx}
\langdeffile{latin.dtx}
\langdeffile{portuges.dtx}
\langdeffile{spanish.dtx}
\langdeffile{catalan.dtx}
\langdeffile{galician.dtx}
\langdeffile{basque.dtx}
\langdeffile{romanian.dtx}
%
\langdeffile{danish.dtx}
\langdeffile{icelandic.dtx}
\langdeffile{norsk.dtx}
\langdeffile{swedish.dtx}
\langdeffile{samin.dtx}
%
\langdeffile{finnish.dtx}
\langdeffile{magyar.dtx}
\langdeffile{estonian.dtx}
%
\langdeffile{croatian.dtx}
\langdeffile{czech.dtx}
\langdeffile{polish.dtx}
\langdeffile{serbian.dtx}
\langdeffile{slovak.dtx}
\langdeffile{slovene.dtx}
\langdeffile{russianb.dtx}
\langdeffile{bulgarian.dtx}
\langdeffile{ukraineb.dtx}
%
\langdeffile{lsorbian.dtx}
\langdeffile{usorbian.dtx}
\langdeffile{turkish.dtx}
%
\langdeffile{hebrew.dtx}
\DocInput{hebinp.dtx}
\DocInput{hebrew.fdd}
\DocInput{heb209.dtx}
\langdeffile{bahasa.dtx}
%\langdeffile{sanskrit.dtx}
%\langdeffile{kannada.dtx}
%\langdeffile{nagari.dtx}
%\langdeffile{tamil.dtx}
\clearpage
\DocInput{bbplain.dtx}
%    \end{macrocode}
%    Finally print the index and change log (not for the user guide).
%    \begin{macrocode}
%<*!user>
\clearpage
\def\filename{index}
\PrintIndex
\clearpage
\def\filename{changes}
\PrintChanges
%</!user>
\end{document}
%</driver>
%    \end{macrocode}
%
% \Finale
%
%%
%% \CharacterTable
%%  {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
%%   Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
%%   Digits        \0\1\2\3\4\5\6\7\8\9
%%   Exclamation   \!     Double quote  \"     Hash (number) \#
%%   Dollar        \$     Percent       \%     Ampersand     \&
%%   Acute accent  \'     Left paren    \(     Right paren   \)
%%   Asterisk      \*     Plus          \+     Comma         \,
%%   Minus         \-     Point         \.     Solidus       \/
%%   Colon         \:     Semicolon     \;     Less than     \<
%%   Equals        \=     Greater than  \>     Question mark \?
%%   Commercial at \@     Left bracket  \[     Backslash     \\
%%   Right bracket \]     Circumflex    \^     Underscore    \_
%%   Grave accent  \`     Left brace    \{     Vertical bar  \|
%%   Right brace   \}     Tilde         \~}
\endinput

