% \iffalse meta-comment
%
% Copyright 1989-2008 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{3865}
%%
% \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}[2005/12/01]
% \end{macrocode}
%
%% File 'babel.dtx'
%\fi
%%\ProvidesFile{babel.dtx}[2008/03/16 v3.8l The Babel package]
%\iffalse
%
% Babel DOCUMENT-STYLE option for LaTeX version 2.09 or plain TeX;
%% Babel package for LaTeX2e.
%
%% Copyright (C) 1989 -- 2008 by Johannes Braams,
%% TeXniek
%% all rights reserved.
%
%% Please report errors to: J.L. Braams
%% babel at braams.xs4all.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}
%
% \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
%
% \end{macrocode}
%<*dtx>
\ProvidesFile{babel.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\char64 braams.xs4all.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 language other than US English, or in more than one language.
% \end{abstract}
%
% \tableofcontents
%
% \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, indonesian, indon, bahasai,
% bahasam, malay, meyalu\\
% 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 }%
%
\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}
%
% \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}
%
\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}
[2008/07/06 v3.8l %
%<+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}}
% \changes{babel~3.8h}{2005/11/23}{Added option \Lopt{albanian}}
% \begin{macrocode}
\DeclareOption{acadian}{\input{frenchb.ldf}}
\DeclareOption{albanian}{\input{albanian.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}}
% \end{macrocode}
% \changes{babel~3.8h}{2005/11/23}{added synonyms \Lopt{indonesian},
% \Lopt{indon} and \Lopt{bahasai} for the original bahasa
% (indonesia) support}
% \changes{babel~3.8h}{2005/11/23}{added \Lopt{malay}, \Lopt{meyaluy}
% and \Lopt{bahasam} for the Bahasa Malaysia support}
% \begin{macrocode}
\DeclareOption{bahasa}{\input{bahasai.ldf}}
\DeclareOption{indonesian}{\input{bahasai.ldf}}
\DeclareOption{indon}{\input{bahasai.ldf}}
\DeclareOption{bahasai}{\input{bahasai.ldf}}
\DeclareOption{malay}{\input{bahasam.ldf}}
\DeclareOption{meyalu}{\input{bahasam.ldf}}
\DeclareOption{bahasam}{\input{bahasam.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}
%
% \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}
% \def\adddialect{}
\input plain.def\relax
\fi
%
% \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
%
% \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
%
% \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...}}
% \changes{babel~3.8l}{2008/07/06}{Use \cs{bbl@patterns}}
% \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
\bbl@patterns{\languagename}%
\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}
% \changes{babel~3.8l}{2008/07/06}{use \cs{bbl@patterns}}
% \begin{macrocode}
\bbl@patterns{\languagename}%
\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{macro}{\bbl@patterns}
% \changes{babel~3.8l}{2008/07/06}{Macro added}
% This macro selects the hyphenation patterns by changing the
% \cs{language} register. If special hyphenation patterns
% are available specifically for the current font encoding,
% use them instead of the default.
% \begin{macrocode}
\def\bbl@patterns#1{%
\language=\expandafter\ifx\csname l@#1:\f@encoding\endcsname\relax
\csname l@#1\endcsname
\else
\csname l@#1:\f@encoding\endcsname
\fi\relax
}
% \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.
% \changes{babel~3.8j}{2008/03/16}{Also set the hyphenmin paramters to
% the correct value (PR3997)}
% \changes{babel~3.8l}{2008/07/06}{Use \cs{bbl@patterns}}
% \begin{macrocode}
\def\hyphenrules#1{%
\expandafter\ifx\csname l@#1\endcsname\@undefined
\@nolanerr{#1}%
\else
\bbl@patterns{#1}%
\languageshorthands{none}%
\expandafter\ifx\csname #1hyphenmins\endcsname\relax
\set@hyphenmins\tw@\thr@@\relax
\else
\expandafter\expandafter\expandafter\set@hyphenmins
\csname #1hyphenmins\endcsname\relax
\fi
\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}
%
% \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.
% \changes{babel~3.8l}{2008/07/06}{Use \cs{bbl@patterns}}
% \begin{macrocode}
\def\main@language#1{%
\def\bbl@main@language{#1}%
\let\languagename\bbl@main@language
\bbl@patterns{\languagename}%
}
% \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}}
%
% \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 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 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}
%
%
% \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} once 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 one 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