% \iffalse meta-comment
%
% Copyright 1989-1999 Johannes L. Braams and any individual authors
% listed elsewhere in this file.  All rights reserved.
% 
% This file is part of the Babel system release 3.6.
% --------------------------------------------------
% 
% It may be distributed under the terms of the LaTeX Project Public
% License, as described in lppl.txt in the base LaTeX distribution.
% Either version 1.0 or, at your option, any later version.
% \fi
% \CheckSum{1326}
%
% \iffalse
%    Tell the \LaTeX\ system who we are and write an entry on the
%    transcript.
%<*dtx>
\ProvidesFile{frenchb.dtx}
%</dtx>
%<code>\ProvidesLanguage{frenchb}
%\fi
%\ProvidesFile{frenchb.dtx}
        [1999/08/18 v1.3g French support from the babel system]
%\iffalse
%% File `frenchb.dtx'
%%    Babel package for LaTeX version 2e
%%    Copyright (C) 1989 - 1999
%%              by Johannes Braams, TeXniek
%
%%    Frenchb language Definition File
%%    Copyright (C) 1989 - 1999
%%              by Johannes Braams, TeXniek
%%                 Daniel Flipo, GUTenberg
%
%%    Please report errors to: Daniel Flipo, GUTenberg
%%                             Daniel.Flipo@univ-lille1.fr
%
%    This file is part of the babel system, it provides the source
%    code for the French language definition file.
%    For differences with francais.sty (author J. Braams) and with
%    french.sty (author B. Gaulle), see documentation printed by
%    |latex frenchb.dtx|.
%
%<*filedriver>
\documentclass{ltxdoc}
\newcommand*\TeXhax{\TeX hax}
\newcommand*\babel{\textsf{babel}}
\newcommand*\langvar{$\langle \mathit lang \rangle$}
\newcommand*\note[1]{}
\newcommand*\Lopt[1]{\textsf{#1}}
\newcommand*\file[1]{\texttt{#1}}
\begin{document}
\parindent = 0pt
\begin{center}
  \textbf{\Large A Babel language definition file for French}\\[3mm]^^A\]
  Daniel \textsc{Flipo}\\
  \texttt{Daniel.Flipo@univ-lille1.fr}
\end{center}
 \DocInput{frenchb.dtx}
\end{document}
%</filedriver>
%\fi
% \GetFileInfo{frenchb.dtx}
%
% \changes{frenchb-1.1}{1995/12/23}{Added a hook to insert space or
%    not before `double punctuation'.}
% \changes{frenchb-1.1b}{1996/08/07}{Replaced \cs{undefined} with
%    \cs{@undefined} and \cs{empty} with \cs{@empty} for consistency
%    with \LaTeX}
% \changes{frenchb-1.1b}{1996/10/10}{Moved the definition of
%    \cs{atcatcode} right to the beginning.}
% \changes{frenchb-1.3f}{1999/04/11}{Deleted sectionning command
%    \cs{section}\{About French Typography\}.}
%
%  \section{The French language}
%
%    The file \file{\filename}\footnote{The file described in this
%    section has version number \fileversion\ and was last revised on
%    \filedate.}, derived from \file{frenchy.sty}, defines all
%    the language definition macros for the French language.
%
%    Customization for the French language is achieved following the
%    book ``Lexique des r\`egles typographiques en usage \`a
%    l'Imprimerie nationale'' troisi\`eme \'edition (1994),
%    ISBN-2-11-081075-0.
%
%    This file has been designed to be used with \LaTeXe, \LaTeX-2.09
%    and Plain\TeX{} formats. If you are still using \LaTeX-2.09, you
%    \emph{should} consider switching to \LaTeXe!
%
%    Any of the commands |\selectlanguage{french}|,
%    |\selectlanguage{francais}|,  or |\selectlanguage{frenchb}|
%    switches to the French language with the following effects:
%    \begin{enumerate}
%
%    \item French hyphenation patterns are made active;
%    \item `double punctuation' is made active for correct spacing
%          in French;
%    \item |\today| prints the date in French;
%    \item the caption names are translated into French
%          (\LaTeX{} only);
%    \item the default items in itemize environment are set to `--'
%          instead of \textbullet, and no vertical spacing and no
%          glue is added, a hook to reset standard \LaTeX{} spacing
%          is provided (|\FrenchItemizeSpacingfalse|);
%    \item vertical spacing in general \LaTeX{} lists is
%          shortened, a hook to reset standard \LaTeX{} settings
%          is provided (|\FrenchListSpacingfalse|) ;
%    \item the first paragraph of each section is indented
%          (\LaTeX{} only);
%    \item French quotation marks can be typeset using the commands
%          |\og| and |\fg| which work in \LaTeXe, \LaTeX-2.09 and
%          Plain\TeX{}, their appearance depending on what is
%          available to draw them; if you use \LaTeXe{} with
%          |T1|-encoding you can also enter them as
%          |<<~French quotation marks~>>| but then
%          \emph{don't forget} the unbreakable spaces, (|\og| and
%          |\fg| provide for correct line breaks);
%    \item a command |\up| is provided to typeset superscripts like
%          |M\up{me}| (abbreviation for ``Madame''), |1\up{er}| (for
%          ``premier'');
%    \item family names should be typeset in small capitals and never
%          be hyphenated, the macro |\bsc| (boxed small caps) does
%          this, e.g., |Leslie~\bsc{Lamport}| will produce
%          Leslie~\mbox{\textsc{Lamport}};
%    \item commands |\primo|, |\secundo|, |\tertio| and |\quarto|
%          may be used to enumerate in lists;
%    \item abbreviations for ``Num\'ero'' and ``num\'ero'' are
%          obtained via the commands |\No|, |\no|;
%    \item two commands are provided to typeset abbreviations for
%          ``degr\'e'': |\degre| prints the raw character and
%          |\degres| should be used to typeset temperatures (e.g.,
%          ``|20~\degres C|'' with an unbreakable space), or for
%          alcohols' strengths (e.g., ``|45\degres|'' with \emph{no}
%          space in French);
%    \item a new command |\nombre| is provided to ease the typesetting
%          of numbers: it works both in text and in math-mode:
%          inputting |\nombre{3141,592653}| will format this number
%          properly according to the current language (French or
%          non-French)%
%          \footnote{In math-mode the comma has to be surrounded with
%          braces to avoid a spurious space being inserted after it
%          (see the \TeX{}book p.~134). Besides this, each slice of
%          three digits should be separated either with a comma in
%          English or with a space in French.}.
%          The command |\nombre| is a contribution of Vincent Jalby
%          using ideas of David Carlisle in comma.sty.
%    \item |frenchb| has been designed to take advantage of the |xspace|
%          package if present: adding |\usepackage{xspace}| in the 
%          preamble will force macros like |\fg|, |\ier|, \dots, |\ieme|
%          to respect the spaces you type after them, for instance
%          typing `|1\ier juin|' will print `1\textsuperscript{er} juin'
%          (no need for a forced space after |1\ier|).
%    \end{enumerate}
%
%    \vspace{\baselineskip}
%    All commands previously available in |francais.ldf| have been
%    included in |frenchb.ldf| for compatibility, sometimes with
%    updated definitions.
%
%    The |french| package, by Bernard~\textsc{Gaulle}, was not
%    designed to run with \babel\ (although the latest versions claim
%    to be \babel\ compatible), but rather as a stand-alone package
%    for the French language.
%    It provides many more functionalities (like |\lettrine|,
%    |\sommaire|\dots) not available in |frenchb|,
%    at the cost of a much greater complexity and possible
%    incompatibilities with other languages.
%
%    As |french| is known to produce the best layout available for
%    French typography, I have borrowed many ideas from Bernard's file.
%    I did my best to help users of both packages (|french| and
%    |frenchb|) to exchange their sources files easily, with one
%    exception which affects the way French quotation marks are
%    entered: |frenchb| uses \emph{macros} (|\og| and |\fg|) while
%    |french| uses active characters (|<<| and |>>|).
%
%    \vspace{\baselineskip}
%    French typographic rules specify that some white space should be
%    present before `double punctuation' characters. These characters
%    are |;| |!| |?| and |:|.
%    In order to get this white space automatically, the category code
%    of these characters is made |\active|. In French, the user
%    \emph{should} input these four characters preceded with a space,
%    but as many people forget about it (even among native French
%    writers!), the default behaviour of |frenchb| is to automatically
%    add a |\thinspace| before `|;|' `|!|' `|?|' and a normal
%    (unbreakable) space before~`|:|' (this is the rule in French
%    typography).  It's up to the user to add or not a space
%    \emph{after} `double punctuation' characters: usually a space is
%    necessary, but not always (before a full point or a closing brace
%    for instance), so this cannot done automatically.
%
%    In (rare) cases where no space should be added before a `double
%    punctuation', either use |\string;| |\string:| |\string!|
%    |\string?| instead of |;| |:| |!| |?|, or switch locally to
%    |english|.  For instance you can type |C\string:TEX| or
%    |\begin{otherlanguage}{english}{C:TEX}\end{otherlanguage}| to
%    avoid the space before~|:| in a MS-DOS path.
%
%    Some users dislike this automatic insertion of a space before
%    `double punctuation', and prefer to decide themselves whether a
%    space should be added or not; so a hook |\NoAutoSpaceBeforeFDP|
%    is provided: if this command is added (in file |frenchb.cfg|, or
%    anywhere in a document) |frenchb| will respect your typing, and
%    introduce a suitable space before `double punctuation' \emph{if
%    and only if} a space is typed in the source file before those
%    signs.
%
%    The command |\AutoSpaceBeforeFDP| switches back to the
%    default behaviour of |frenchb|.
%
%    \vspace{\baselineskip}
%    Once you have built your format, a good precaution would be to
%    perform some basic tests about hyphenation in French. For
%    \LaTeXe{} I suggest this:
%    \begin{itemize}
%    \item run the following file, with the encoding suitable for
%      your machine (\textit{my-encoding} will be |latin1| for
%      \textsc{unix} machines and PCs running~Windows, |applemac|
%      for Macintoshs, or |cp850| for PCs running~DOS. If you are
%      using Ml\TeX{} together with CM fonts, comment out the
%      line \\
%      |\usepackage[|\textit{my-encoding}|]{inputenc}|.\\[3mm]^^A\]
%      |%%% Test file for French hyphenation.|\\
%      |\documentclass{article}|\\
%      |\usepackage[|\textit{my-encoding}|]{inputenc}|\\
%      |\usepackage[francais]{babel}|\\
%      |\begin{document}|\\
%      |\showhyphens{signal container \'ev\'enement alg\`ebre}|\\
%      |\showhyphens{|\texttt{signal container \'ev\'enement
%                     alg\`ebre}|}|\\
%      |\end{document}|
%    \item check the hyphenations proposed by \TeX{} in your log-file;
%      in French you should get with both 7-bit and 8-bit encodings\\
%      \texttt{si-gnal contai-ner \'ev\'e-ne-ment al-g\`ebre}.\\
%      Do not care about how accented characters are displayed in the
%      log-file, what matters is the position of the `|-|' hyphen
%      signs \emph{only}.
%    \end{itemize}
%    If they are all correct, your installation (probably) works fine,
%    if one (or more) is (are) wrong, ask a local wizard to see what's
%    going wrong and perform the test again (or e-mail me about what
%    happens).\\
%    Frequent mismatches:
%    \begin{itemize}
%    \item you get |sig-nal con-tainer|, this probably means that the
%    hyphenation patterns you are using are for US-english, not for
%    French;
%    \item you get no hyphen at all in \texttt{\'ev\'e-ne-ment}, this
%    probably means that you are using CM fonts and the macro
%    |\accent| to produce accented characters.
%    Consider switching to DC/EC fonts and T1-encoding or use Ml\TeX.
%    \end{itemize}
%
%    \vspace{\baselineskip}
%    |frenchb| has been improved using helpful suggestions from many
%    people, the main contributions came from Vincent~Jalby.
%    Thanks to all of them!
%
%  \subsection*{Changes}
%
%    First version released: 1.1 as of 1996/05/31 part of
%    \babel-3.6beta.
%
%    \textbf{Changes in version 1.1b}: update for \babel-3.6.
%
%    \textbf{Changes in version 1.2}: new command |\nombre| to
%    format numbers; removed command |\fup| borrowed from the
%    |french| package (|\up| does a better job in \LaTeXe);
%    also removed aliases |\french| and |\english| (\file{frenchb.cfg}
%    is a better place for these).
%
%    \textbf{Changes in version 1.3}: 
%    \begin{itemize}
%      \item The `xspace' package, when present, now controls
%            spacing after all (sensible) macros, formerly `xspace'
%            worked on |\fg| (suggested by Vincent~Jalby);
%      \item spacing after opening and before closing guillemets
%            improved as suggested by Thierry~Bouche;
%      \item a replacement for poor looking guillemets in OT1 encoding
%            (\emph{math} fonts are used to emulate them) is provided
%            if the file |ot2wncyr.fd| is found: this file defines an
%            OT2 encoding using AMS Cyrillic fonts; these
%            have built-in guillemets, they are \emph{text} fonts,
%            are free, and are distributed as METAFONT and Type1 fonts
%            (good for pdftex!), the replacement was suggested by
%            G\'erard~Degrez; if the files |ot2wncyr.fd|, |wncy*.mf|,
%            |wncy*.tfm|, and |wncy*.pfb| aren't available on your
%            system, you \emph{should} get them from \mbox{CTAN};
%            if your system complains about missing |wncy*.tfm| fonts,
%            it means your \TeX{} system is \emph{incomplete}, as a
%            quick fix, you can either remove |ot2wncyr.fd| or add the
%            command |LasyGuillemets| to the preamble of your document
%            or to |frenchb.cfg|, then |frenchb| will behave as it did
%            in the previous versions.
%      \item environment `itemize' has been redesigned in French
%            according to specifications from Jacques~Andr\'e
%            and Thierry~Bouche;
%      \item two switches have been added to go back to standard
%            \LaTeX{} list spacing |\FrenchItemizeSpacingfalse|
%            and |\FrenchListSpacingfalse|;
%      \item |\nombre| now properly handles signs in \LaTeXe;
%      \item definition of |\dots| changed in French;
%      \item in French, captions in figures and tables are printed
%            with an endash instead of a colon.
%    \end{itemize}
%
% \StopEventually{}
%
%  \subsection*{\TeX{}nical details}
%
%    The macro |\LdfInit| takes care of preventing that this file is
%    loaded more than once, checking the category code of the
%    \texttt{@} sign, etc.
% \changes{frenchb-1.1b}{1996/11/02}{Now use \cs{LdfInit} to perform
%    initial checks}
%    \begin{macrocode}
%<*code>
%% Please report errors to: Daniel Flipo, GUTenberg
%%                          Daniel.Flipo@univ-lille1.fr
%%
\LdfInit{frenchb}\NoAutoSpaceBeforeFDP
%    \end{macrocode}
%
% \changes{frenchb-1.1b}{1996/11/07}{Removed test for \cs{l@english}}
% \changes{frenchb-1.2}{1997/01/05}{Check for hyphenation patterns}
%    Check if hyphenation patterns for the French language have been
%    loaded in language.dat: requested name `french' or `francais'.
%    \begin{macrocode}
\ifx\l@french\@undefined
  \ifx\l@francais\@undefined
    \@nopatterns{French}
    \adddialect\l@french0
  \fi
\fi
%    \end{macrocode}
%
% \changes{frenchb-1.2}{1997/01/05}{`french' `frenchb' and
%    `francais' are synonymous regardless of \cs{CurrentOption}.}
%    Regardless of |\CurrentOption| the internal name for the
%    French language will be `frenchb'; `francais' and `french'
%    will be synonymous for `frenchb': first let both names use the
%    same hyphenation patterns. Later we will have to set aliases
%    for |\captionsfrenchb|, |\datefrenchb|, |\extrasfrenchb| and
%    |\noextrasfrenchb|. As French uses the standard values of
%    |\lefthyphenmin| (2) and |\righthyphenmin| (3), no special
%    setting is required here.
%
%    \begin{macrocode}
\def\CurrentOption{frenchb}
\ifx\l@francais\@undefined
  \let\l@francais\l@french
\else
  \let\l@french\l@francais
\fi
\let\l@frenchb\l@french
%    \end{macrocode}
%
%  \begin{macro}{\ifLaTeX}
%  \begin{macro}{\ifLaTeXe}
% \changes{frenchb-1.1}{1996/02/12}{Use \cs{fmtname} to check
%   the format instead of \cs{newcommand}; define \cs{PlainFmtName}
%   and \cs{LaTeXeFmtName}.}
% \changes{frenchb-1.3f}{1999/04/11}{Use \cs{magnification} to check
%   if the format is plain (i.e \emph{not} \LaTeX). Checking the
%   format's name was not reliable: plain-like formats may not be
%   called just `plain' but `babel-plain'.}
%    To check the format in use (plain, \LaTeX{} or \LaTeXe),
%    we'll need two new `if'.
%    \begin{macrocode}
\newif\ifLaTeX
\ifx\magnification\@undefined\LaTeXtrue\fi
\newif\ifLaTeXe
\ifx\@compatibilitytrue\@undefined\else\LaTeXetrue\fi
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%
%  \begin{macro}{\if@Two@E}
% \changes{frenchb~1.1}{1996/03/01}{New test \cs{if@Two@E}.}
%    We will need another `if' : |\if@Two@E| is true if and only if
%    \LaTeXe{} is running \emph{not} in compatibility mode. It is
%    used in the definitions of the command |\nombre| and |\up|.
%    The definition is somewhat complicated, due to the fact that
%    |\if@compatibility| is not recognized as a |\if| in
%    \LaTeX-2.09 based formats.
%    \begin{macrocode}
\newif\if@Two@E \@Two@Etrue
\def\@FI@{\fi}
\ifx\@compatibilitytrue\@undefined
  \@Two@Efalse \def\@FI@{\relax}
\else
  \if@compatibility \@Two@Efalse \fi
\@FI@
%    \end{macrocode}
%  \end{macro}
%
% \begin{macro}{\extrasfrenchb}
% \begin{macro}{\noextrasfrenchb}
%    The macro |\extrasfrenchb| will perform all the extra
%    definitions needed for the French language.
%    The macro |\noextrasfrenchb| is used to cancel the actions of
%    |\extrasfrenchb|.\\
%    In French ``apostrophe'' is used in hyphenation in expressions
%    like |l'ambulance| (French patterns provide entries for this kind
%    of words).  This means that the |\lccode| of ``apostrophe'' has
%    to be non null in French for proper hyphenation of those
%    expressions, and to be reset to null when exiting French.
% \changes{frenchb-1.2}{1997/01/05}{`french' `frenchb' and
%    `francais' are synonymous regardless of \cs{CurrentOption}.}
%    \begin{macrocode}
\@namedef{extras\CurrentOption}{\lccode`\'=`\'}
\@namedef{noextras\CurrentOption}{\lccode`\'=0}
\def\extrasfrancais{\extrasfrenchb}
\def\extrasfrench{\extrasfrenchb}
\def\noextrasfrancais{\noextrasfrenchb}
\def\noextrasfrench{\noextrasfrenchb}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \changes{frenchb-1.1}{1996/01/29}{Add some font changing
%    definitions.}
%    It is best to use \LaTeXe{}'s font changing commands, and to
%    emulated those we need when they are not available, as in
%    Plain\TeX{} or \LaTeX-2.09. Be aware that old commands |\sc|,
%    |\it|, \textit{etc.} exist in \LaTeXe{}, but they behave like
%    they did in \LaTeX-2.09 (i.\,e., they switch back to
%    |\normalfont| instead of keeping the other font attributes
%    unchanged).
%    \begin{macrocode}
\ifx\scshape\@undefined
  \ifx\sc\@undefined
     \let\scshape\relax
  \else
     \let\scshape\sc
  \fi
\fi
\ifx\emph\@undefined
  \ifx\em\@undefined
     \let\emph\relax
  \else
     \def\emph#1{\em #1}
  \fi
\fi
%    \end{macrocode}
%
%  \subsection{Caption names}
%
%    The next step consists of defining the French equivalents for
%    the \LaTeX{} caption names.
%
% \changes{frenchb-1.3c}{1997/10/08}{changed \cs{@makecaption}
%    definition to add a hook \cs{CaptionSeparator}.}
%    In French, captions in figures and tables should be printed with 
%    an endash instead of the standard `:', so we add a hook called
%    |\CaptionSeparator| to the definition of |\@makecaption| 
%    (this definition set in classes.dtx is frozen for \LaTeXe{} 
%    according to Frank Mittelbach).
%    \begin{macrocode}
\def\CaptionSeparator{\string:\space}
\long\def\@makecaption#1#2{%
  \vskip\abovecaptionskip
  \sbox\@tempboxa{#1\CaptionSeparator #2}%
  \ifdim \wd\@tempboxa >\hsize
    #1\CaptionSeparator #2\par
  \else
    \global \@minipagefalse
    \hb@xt@\hsize{\hfil\box\@tempboxa\hfil}%
  \fi
  \vskip\belowcaptionskip}
\expandafter\addto\csname noextras\CurrentOption\endcsname{%
  \def\CaptionSeparator{\string:\space}}
%    \end{macrocode}
%
% \begin{macro}{\captionsfrenchb}
%    The macro |\captionsfrenchb| defines all strings used in the four
%    standard document classes provided with \LaTeX.  Some authors do
%    not like some of these names; it is easy to change them in the
%    preamble \emph{after} loading |frenchb| (or in your file
%    |frenchb.cfg|), e.g
%    |\addto\captionsfrenchb{\def\figurename{Figure}}| will print
%    `Figure' in Roman instead of `\textsc{Fig.}'.
% \changes{frenchb-1.1}{1996/01/30}{This code is useless in Plain\TeX,
%    check the format before loading it.}
% \changes{frenchb-1.2}{1997/01/05}{added aliases \cs{captionsfrench}
%    and \cs{captionsfrancais}.}
% \changes{frenchb-1.3c}{1997/10/08}{1997/09/19}{added \cs{CaptionSeparator}}
%    \begin{macrocode}
\ifLaTeX
\@namedef{captions\CurrentOption}{%
   \def\refname{R\'ef\'erences}%
   \def\abstractname{R\'esum\'e}%
   \def\bibname{Bibliographie}%
   \def\prefacename{Pr\'eface}%
   \def\chaptername{Chapitre}%
   \def\appendixname{Annexe}%
   \def\contentsname{Table des mati\`eres}%
   \def\listfigurename{Table des figures}%
   \def\listtablename{Liste des tableaux}%
   \def\indexname{Index}%
   \def\figurename{{\scshape Fig.}}%
   \def\tablename{{\scshape Tab.}}%
   \def\CaptionSeparator{\space--\space}%
%    \end{macrocode}
%   ``Premi\`ere partie'' instead of ``Part I''
%    \begin{macrocode}
   \def\partname{\protect\@Fpt partie}%
   \def\@Fpt{{\ifcase\value{part}\or Premi\`ere\or Deuxi\`eme\or
   Troisi\`eme\or Quatri\`eme\or Cinqui\`eme\or Sixi\`eme\or
   Septi\`eme\or Huiti\`eme\or Neuvi\`eme\or Dixi\`eme\or Onzi\`eme\or
   Douzi\`eme\or Treizi\`eme\or Quatorzi\`eme\or Quinzi\`eme\or
   Seizi\`eme\or Dix-septi\`eme\or Dix-huiti\`eme\or Dix-neuvi\`eme\or
   Vingti\`eme\fi}\space\def\thepart{}}%
   \def\pagename{page}%
   \def\seename{{\emph{voir}}}%
   \def\alsoname{{\emph{voir aussi}}}%
   \def\enclname{P.~J. }%
   \def\ccname{Copie \`a }%
   \def\headtoname{}%
   \def\proofname{D\'emonstration}% for AMS-\LaTeX
   }
   \def\captionsfrench{\captionsfrenchb}
   \def\captionsfrancais{\captionsfrenchb}
\fi
%    \end{macrocode}
% \end{macro}
%
%  \subsection{Punctuation}
%
%    The `double punctuation' characters (|;| |!| |?| and |:|) have to
%    be made |\active| for an automatic control of the amount of space
%    to insert before them.
%    \begin{macrocode}
\initiate@active@char{:}
\initiate@active@char{;}
\initiate@active@char{!}
\initiate@active@char{?}
%    \end{macrocode}
%    We specify that the French group of shorthands should be used.
%    \begin{macrocode}
\expandafter\addto\csname extras\CurrentOption\endcsname{%
  \languageshorthands{frenchb}}
%    \end{macrocode}
%    These characters are `turned on' once, later their definition may
%    vary.
%    \begin{macrocode}
\expandafter\addto\csname extras\CurrentOption\endcsname{%
  \bbl@activate{:}\bbl@activate{;}%
  \bbl@activate{!}\bbl@activate{?}}
\expandafter\addto\csname noextras\CurrentOption\endcsname{%
  \bbl@deactivate{:}\bbl@deactivate{;}%
  \bbl@deactivate{!}\bbl@deactivate{?}}
%    \end{macrocode}
%
%    One more thing |\extrasfrenchb| needs to do is to make sure that
%    |\frenchspacing| is in effect.  If this is not the case the
%    execution of |\noextrasfrenchb| will switch it off again.
%    \begin{macrocode}
\expandafter\addto\csname extras\CurrentOption\endcsname{%
  \bbl@frenchspacing}
\expandafter\addto\csname noextras\CurrentOption\endcsname{%
  \bbl@nonfrenchspacing}
%    \end{macrocode}
%
% \begin{macro}{\frenchb@sh@;@}
%    We have to tune the amount of white space before \texttt{;}
%    \texttt{!}  \texttt{?} and \texttt{:}.  This should only happen
%    in horizontal mode, hence the test |\ifhmode|.
% \changes{frenchb-1.1}{1995/12/23}{Added a hook to insert space
%    or not before `double punctuation'.}
%    In horizontal mode, if a space has been typed before `;' we
%    remove it and put an unbreakable |\thinspace| instead. If no
%    space has been typed, we add |\FDP@thinspace| which will be
%    defined, up to the user's wishes, as an automatic added
%    thin space, or as |\@empty|.
%
%    \begin{macrocode}
\declare@shorthand{frenchb}{;}{%
    \ifhmode
      \ifdim\lastskip>\z@
        \unskip\penalty\@M\thinspace
      \else
        \FDP@thinspace
      \fi
    \fi
%    \end{macrocode}
%    Now we can insert a |;| character.
%    \begin{macrocode}
    \string;}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\frenchb@sh@!@}
% \begin{macro}{\frenchb@sh@?@}
%
%    Because these definitions are very similar only one is displayed
%    in a way that the definition can be easily checked.
%
%    \begin{macrocode}
\declare@shorthand{frenchb}{!}{%
    \ifhmode
      \ifdim\lastskip>\z@
        \unskip\penalty\@M\thinspace
      \else
        \FDP@thinspace
      \fi
    \fi
    \string!}
%    \end{macrocode}
%
%    \begin{macrocode}
\declare@shorthand{frenchb}{?}{%
    \ifhmode
      \ifdim\lastskip>\z@
        \unskip\penalty\@M\thinspace
      \else
        \FDP@thinspace
      \fi
    \fi
    \string?}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\frenchb@sh@:@}
%
%    The `:' requires a normal space before it, instead of
%    a |\thinspace|.
%
%    \begin{macrocode}
\declare@shorthand{frenchb}{:}{%
    \ifhmode
      \ifdim\lastskip>\z@
        \unskip\penalty\@M\
      \else
        \FDP@space
      \fi
    \fi
    \string:}
%    \end{macrocode}
% \end{macro}
%
% \changes{frenchb-1.1}{1995/12/23}{Added a hook to insert space
%    or not before `double punctuation'.}
%  \begin{macro}{\AutoSpaceBeforeFDP}
%  \begin{macro}{\NoAutoSpaceBeforeFDP}
%    |\FDP@thinspace| and |\FDP@space| are defined as unbreakable
%    spaces by\\ |\AutoSpaceBeforeFDP| or as |\@empty| by
%    |\NoAutoSpaceBeforeFDP|.\\
%    Default is |\AutoSpaceBeforeFDP|.
%    \begin{macrocode}
\def\AutoSpaceBeforeFDP{%
      \def\FDP@thinspace{\penalty\@M\thinspace}%
      \def\FDP@space{\penalty\@M\ }}
\def\NoAutoSpaceBeforeFDP{\let\FDP@thinspace\@empty
                          \let\FDP@space\@empty}
\AutoSpaceBeforeFDP
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%
%  \begin{macro}{\system@sh@:@}
%  \begin{macro}{\system@sh@!@}
%  \begin{macro}{\system@sh@?@}
%  \begin{macro}{\system@sh@;@}
%
%    When the active characters appear in an environment where their
%    French behaviour is not wanted they should give an `expected'
%    result. Therefore we define shorthands at system level as well.
%
%    \begin{macrocode}
\declare@shorthand{system}{:}{\string:}
\declare@shorthand{system}{!}{\string!}
\declare@shorthand{system}{?}{\string?}
\declare@shorthand{system}{;}{\string;}
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%
%  \subsection{French quotation marks}
%
% \changes{frenchb-1.3}{1997/04/24}{New implementation of guillemets.}
%
% \changes{frenchb-1.3e}{1999/01/02}{Try to use AMS Cyrillic fonts
%    to provide better looking guillemets in OT1 encoding.}
%    Several shapes of French quotation marks are provided for use
%    with CM or EC/DC fonts, or PostScript fonts.  CM fonts have no
%    quotation marks built-in, so we have to emulate them:
%    \begin{itemize}
%      \item if a file `ot2wncyr.fd' is found, we expect AMS Cyrillic
%        fonts `wncy*' to be present on the system, so we use them;
%      \item otherwise we use math symbols, either \LaTeX's `lasy' font
%        if available, or \TeX{}~symbols |\ll| and |\gg| otherwise;
%      \item as incomplete \LaTeX{} installations might include a file
%        `ot2wncyr.fd', but no `wncy*.mf' or `wncy*.tfm' files, a
%         command |\LasyGuillemets| is provided to force usage
%         of \LaTeX's `lasy' symbols to emulate French quotation marks.
%    \end{itemize}
%    EC/DC fonts and PostScript fonts have built-in quotation marks.
%
%    The standard names for French quotation marks are |\guillemotleft|
%    and |\guillemotright|, these commands are defined in |t1enc.def|
%    for T1-encoding.
%    In \LaTeXe{} formats, we first define these commands for 
%    OT1-encoding (for CM fonts), using either AMS Cyrillic `wncy*'
%    or  \LaTeX{}'s `lasy' fonts.
%    Other local text encodings \emph{should} define them too,
%    but if they don't, the OT1 definitions will be used.
%    PostScript fonts should \emph{not} be used together 
%    with OT1-encoding, in order to take advantage of the built-in
%    (better looking) French quotation marks.
%
% \changes{frenchb-1.2b}{1997/04/24}{Spacing after opening and before
%    closing guillemets slightly enlarged and some glue added,
%    as suggested by Th.~Bouche. Unlike \cs{kern}, \cs{hskip} doesn't
%    inhibit hyphenation, nothing like \cs{allowhyphens} is required.}
%    The next step is to provide correct spacing after |\guillemotleft|
%    and before |\guillemotright| : a space precedes and follows
%    quotation marks but no line break is allowed neither \emph{after}
%    the opening one, nor \emph{before} the closing one.
%    |\guill@spacing| which does the spacing,  has been fine tuned by
%    Thierry Bouche. 
% \changes{frenchb-1.3d}{1998/04/20}{Spacing after opening and before
%    closing guillemets changed again: normal space with little glue
%    (suggested by Th. Bouche).}
%
%    The top macros for quotation marks will be called |\og|
%    (``\underline{o}uvrez \underline{g}uillemets'') and |\fg|
%    (``\underline{f}ermez \underline{g}uillemets'').\\
%    The top level definitions for French quotation marks are switched
%    on and off through the |\extrasfrenchb| |\noextrasfrenchb|
%    mechanism. Outside French, |\og| and |\fg| will typeset standard
%    English opening and closing double quotes.\\
%    As |\DeclareTextCommand| cannot be used after the
%    |\begin{document}| we introduce internal definitions
%    |\begin@guill| and |\end@guill|.\\
%    We'll try to be smart to users of D.~\textsc{Carlisle}'s |xspace|
%    package: if this package is loaded there will be no need for |{}|
%    or |\ | to get a space after |\fg|.
%
%  \begin{macro}{\guillemotleft}
%  \begin{macro}{\guillemotright}
%  \begin{macro}{\og}
%  \begin{macro}{\fg}
%  \begin{macro}{\CyrillicGuillemets}
%  \begin{macro}{\LasyGuillemets}
%  \begin{macro}{\bbl@frenchguillemets}
%  \begin{macro}{\bbl@nonfrenchguillemets}
% \changes{frenchb-1.1}{1996/01/20}{A warning is now issued if \cs{og}
%    or \cs{fg} have been defined elsewhere in a \LaTeXe{} document
%    (suggested by Vincent Jalby).}
%    In \LaTeXe{} we provide a dummy definition for |\og| and |\fg|,
%    just to display an error message in case |\og| or |\fg| have been
%    defined elsewhere.
% \changes{frenchb-1.2b}{1997/04/24}{Define \cs{xspace} as \relax if
%    it is not defined by D. Carlisle `xspace.sty'. Will be used in
%    \cs{fg}, and \cs{ieme} ... \cs{ieres} (new for this release).}
%
%    \begin{macrocode}
\ifLaTeXe
   \def\CyrillicGuillemets{\DeclareFontEncoding{OT2}{}{}%
     \DeclareFontSubstitution{OT2}{wncyr}{m}{n}%
     \DeclareTextCommand{\guillemotleft}{OT1}{%
        {\fontencoding{OT2}\fontfamily{wncyr}\selectfont\char60}}%
     \DeclareTextCommand{\guillemotright}{OT1}{%
        {\fontencoding{OT2}\fontfamily{wncyr}\selectfont\char62}}}
   \def\LasyGuillemets{%
     \DeclareTextCommand{\guillemotleft}{OT1}{\hbox{%
        \fontencoding{U}\fontfamily{lasy}\selectfont(\kern-0.20em(}}%
     \DeclareTextCommand{\guillemotright}{OT1}{\hbox{%
        \fontencoding{U}\fontfamily{lasy}\selectfont)\kern-0.20em)}}}
   \IfFileExists{ot2wncyr.fd}{\CyrillicGuillemets}{\LasyGuillemets}
   \DeclareTextSymbolDefault{\guillemotleft}{OT1}
   \DeclareTextSymbolDefault{\guillemotright}{OT1}
   \def\guill@spacing{\penalty\@M\hskip.8\fontdimen2\font
                               plus.3\fontdimen3\font
                               minus.8\fontdimen4\font}
   \newcommand{\og}{\@empty}
   \newcommand{\fg}{\@empty}
   \DeclareRobustCommand*{\begin@guill}{\leavevmode
                             \guillemotleft\penalty\@M\guill@spacing}
   \DeclareRobustCommand*{\end@guill}{\ifdim\lastskip>\z@\unskip\fi
                     \penalty\@M\guill@spacing\guillemotright\xspace}
   \AtBeginDocument{\ifx\xspace\@undefined\let\xspace\relax\fi}
%    \end{macrocode}
%    For \emph{Plain}\TeX, and \LaTeX-2.09 we define |\begin@guill|
%    and |\end@guill| using math symbols |\ll| and |\gg|.
%    \begin{macrocode}
\else
   \def\begin@guill{\leavevmode\raise0.25ex%
                    \hbox{$\scriptscriptstyle\ll$}%
                    \penalty\@M\hskip.8\fontdimen2\font 
                                plus.3\fontdimen3\font 
                                minus.3\fontdimen4\font}
   \def\end@guill{\ifdim\lastskip>\z@\unskip\penalty\@M\fi
                  \penalty\@M\hskip.8\fontdimen2\font 
                  plus.3\fontdimen3\font minus.3\fontdimen4\font
                  \raise0.25ex\hbox{$\scriptscriptstyle\gg$}}
   \let\xspace\relax
\fi
\def\bbl@frenchguillemets{\let\og\begin@guill
                          \let\fg\end@guill}
\def\bbl@nonfrenchguillemets{\def\og{``}%
                             \def\fg{\ifdim\lastskip>\z@\unskip\fi ''}}
\expandafter\addto\csname extras\CurrentOption\endcsname{%
  \bbl@frenchguillemets}
\expandafter\addto\csname noextras\CurrentOption\endcsname{%
  \bbl@nonfrenchguillemets}
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%
%  \subsection{French lists}
%
%  \begin{macro}{\bbl@frenchlistspacing}
%  \begin{macro}{\bbl@nonfrenchlistspacing}
%    Vertical spacing in general lists should be shorter in French
%    texts than the defaults provided by \LaTeX.
%    Note that the easy way, just changing values of vertical spacing
%    parameters when entering French and restoring them to their
%    defaults on exit would not work. We will redefine
%    |\@trivlist| as |\list| and |trivlist| rely on |\@trivlist|,
%    so that all lists have common settings. If standard LaTeX{}
%    settings are prefered, it is easy to issue the command
%    |\FrenchListSpacingfalse| in the preamble or in |frenchb.cfg|.
%    Please note that changing the flag |\FrenchListSpacing| will
%    \emph{not} take effect immediately, but next time language French
%    is switched on.
%
%    The amount of vertical space before and after a list is given by
%    |\topsep| + |\parskip| (+ |\partopsep| if the list starts a new
%    paragraph). IMHO, |\parskip| should be added \emph{only} when
%    the list starts a new paragraph, so I subtract |\parskip| from
%    |\topsep| and add it back to |\partopsep|; this will normally
%    make no difference because |\parskip|'s default value is 0pt, but
%    will be noticeable when |\parskip| is \emph{not} null.\\
%    Of course, this code is only for \LaTeX.
%
% \changes{frenchb-1.3}{1997/05/30}{Add a switch to allow \cs{LaTeXe}
%    standard settings.}
%    \begin{macrocode}
\newif\ifFrenchListSpacing \FrenchListSpacingtrue
\ifLaTeX
  \let\@trivlistORI\@trivlist
  \def\bbl@frenchlistspacing{%
    \ifFrenchListSpacing
      \def\@trivlist{%
          \setlength{\itemsep}{0.4ex plus 0.2ex minus 0.2ex}%
          \setlength{\parsep}{0.4ex plus 0.2ex minus 0.2ex}%
          \setlength{\topsep}{0.8ex plus 0.4ex minus 0.4ex}%
          \setlength{\partopsep}{0.4ex plus 0.2ex minus 0.2ex}%
          \addtolength{\topsep}{-\parskip}%
          \addtolength{\partopsep}{\parskip}%
          \@trivlistORI}%
    \fi}
  \def\bbl@nonfrenchlistspacing{\let\@trivlist\@trivlistORI}
  \expandafter\addto\csname extras\CurrentOption\endcsname{%
    \bbl@frenchlistspacing}
  \expandafter\addto\csname noextras\CurrentOption\endcsname{%
    \bbl@nonfrenchlistspacing}
\fi
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%
%  \begin{macro}{\bbl@frenchitemize}
%  \begin{macro}{\bbl@nonfrenchitemize}
%    The layout of French itemize-lists has changed between version~1.2
%    and~1.3. Jacques Andr\'e and Thierry Bouche pointed out to me
%    that vertical spacing between items, before and after the list,
%    should \emph{null} with \emph{no glue} added. Moreover 
%    horizontal spacing was not correct either: the item labels of a
%    first level list should be vertically aligned on the paragraph's 
%    first character (at |\parindent| from the left margin). 
%    Checking the book ``Lexique des r\`egles typographiques en usage
%    \`a l'Imprimerie nationale'' confirmed their points, so the itemize
%    environment has been totally redefined for French in version~1.3.
%
%    Several people pointed out to me that the layout of lists can
%    either be set by the current language or be tuned independently of
%    the language as part of the layout of the document. So hooks should
%    be provided to switch off the special settings made in |frenchb|.
%    Setting |\FrenchItemizeSpacingfalse| \emph{after} loading |frenchb|
%    in the preamble switches back to settings of version~1.2 (this can
%    be useful to process old documents). If you want all list spacings
%    to be exactly what they are in standard \LaTeXe{}, then add also
%    |\FrenchListSpacingfalse| in the preamble \emph{after} loading
%    |frenchb|. Both switches can also be set in |frenchb.cfg|.
%    Please note that changing the flags |\FrenchItemizeSpacing| and 
%    |\FrenchListSpacing| will \emph{not} take effect immediately,
%    but next time language French is switched on.
%
%    The \textbullet{} is never used in French itemize-lists,
%    a long dash `--' is prefered for all levels.
%
% \changes{frenchb-1.1}{1996/01/25}{Save original definitions of label
%    items, instead of hard coding them in \cs{bbl@nonfrenchitems}
%    (suggested by Vincent Jalby).}
% \changes{frenchb-1.1}{1996/01/26}{Tune vertical spacing in
%    French lists.}
% \changes{frenchb-1.3}{1997/05/30}{Change -{}- to \cs{textendash},
%    completely redesign the itemize environment in French and add
%    a hook to switch back to \cs{LaTeXe} standard itemize lists.}
%    \begin{macrocode}
\newif\ifFrenchItemizeSpacing \FrenchItemizeSpacingtrue
\ifLaTeX
  \let\@ltiORI\labelitemi
  \let\@ltiiORI\labelitemii
  \let\@ltiiiORI\labelitemiii
  \let\@ltivORI\labelitemiv
  \let\itemizeORI\itemize
  \let\enditemizeORI\enditemize
  \def\bbl@frenchitemize{%
    \ifFrenchItemizeSpacing
      \renewenvironment{itemize}%
        {\begin{list}{\textendash}%
          {\let\@trivlist\@trivlistORI
             \settowidth{\labelwidth}{\textendash}%
             \setlength{\leftmargin}{\labelwidth}%
             \addtolength{\leftmargin}{\labelsep}%
             \ifnum\@listdepth=0
               \setlength{\itemindent}{\parindent}%
             \else
               \addtolength{\leftmargin}{\parindent}%
             \fi
             \setlength{\itemsep}{\z@}%
             \setlength{\parsep}{\z@}%
             \setlength{\topsep}{\z@}%
             \setlength{\partopsep}{\z@}%
             \addtolength{\topsep}{-\parskip}%
             \addtolength{\partopsep}{\parskip}%
          }%
        }%
        {\end{list}}%
    \else
      \def\labelitemi{\textendash}%
      \def\labelitemii{\textendash}%
      \def\labelitemiii{\textendash}%
      \def\labelitemiv{\textendash}%
    \fi}
  \def\bbl@nonfrenchitemize{\let\labelitemi\@ltiORI
                            \let\labelitemii\@ltiiORI
                            \let\labelitemiii\@ltiiiORI
                            \let\labelitemiv\@ltivORI
                            \let\itemize\itemizeORI
                            \let\enditemize\enditemizeORI}
  \expandafter\addto\csname extras\CurrentOption\endcsname{%
    \bbl@frenchitemize}
  \expandafter\addto\csname noextras\CurrentOption\endcsname{%
    \bbl@nonfrenchitemize}
\fi
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%
%  \subsection{French indentation of sections}
%
%  \begin{macro}{\bbl@frenchindent}
%  \begin{macro}{\bbl@nonfrenchindent}
%    In French the first paragraph of each section should be indented,
%    this is another difference with US-english.
%    Add this code only in \LaTeX.
% \changes{frenchb-1.2}{1996/12/27}{Corrected typo
%    \cs{bbl@nonfrenchident}.}
%
%    \begin{macrocode}
\ifLaTeX
  \let\@aifORI\@afterindentfalse
  \def\bbl@frenchindent{\let\@afterindentfalse\@afterindenttrue
                        \@afterindenttrue}
  \def\bbl@nonfrenchindent{\let\@afterindentfalse\@aifORI
                          \@afterindentfalse}
  \expandafter\addto\csname extras\CurrentOption\endcsname{%
    \bbl@frenchindent}
  \expandafter\addto\csname noextras\CurrentOption\endcsname{%
    \bbl@nonfrenchindent}
\fi
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%
%  \subsection{Formatting numbers}
%  \label{numbers}
%
% \changes{frenchb~1.2}{1996/12/27}{New macros \cs{nombre}
%    \cs{decimalsep} and \cs{thousandsep} added to format numbers.}
%    In English the decimal part starts with a point and thousands
%    should be separated by a comma: an approximation of $1000\pi$
%    should be inputed as |$3{,}141.592{,}653$| in math-mode and
%    as |3,141.592,653| in text.\\
%    In French the decimal part starts with a comma and thousands
%    should be separated by a space; the same approximation of
%    $1000\pi$ should be inputed as |$3\;141{,}592\;653$| in math-mode
%    and as something like |3~141,592~653| in text.
%    Remember braces are mandatory around the comma in math-mode, the
%    reason is mentioned in the \TeX{}book p.~134: the comma is
%    of type |\mathpunct| (thus normally followed by a space) while
%    the point is of type |\mathord| (no space added).
%
%    Thierry Bouche suggested that a second type of comma, of type
%    |\mathord| would be useful in math-mode, and proposed to
%    introduce a command (named |\decimalsep| in this package),
%    the expansion of which would depend on the current language.
%
%    Vincent Jalby suggested a command |\nombre| to conveniently
%    typeset numbers: inputting |\nombre{3141,592653}| either in
%    text or in math-mode will format this number properly according
%    to the current language (French or non-French).
%
%    |\nombre| accepts an optional argument which happens to be
%    useful with the package `dcolumn', it specifies the decimal
%    separator used in the \emph{source code}:
%    |\newcolumntype{d}{D{,}{\decimalsep}{-1}}| \\
%    |\begin{tabular}{|d|}\hline    |    \\
%    |  3,14 \\                     |    \\
%    |  \nombre[,]{123,4567} \\     |    \\
%    |  \nombre[,]{9876,543}\\\hline|    \\
%    |\end{tabular}                 |    \\
%    will print a column of numbers aligned on the decimal point
%    (comma or point depending on the current language), each slice
%    of 3 digits being separated by a space or a comma according to
%    the current language.
%
%  \begin{macro}{\decimalsep}
%  \begin{macro}{\thousandsep}
%    We need a internal definition, valid in both text and math-mode,
%    for the comma (|\@comma@|) and another one for the unbreakable
%    fixed length space (no glue) used in French (|\f@thousandsep|).
%
%    The commands |\decimalsep| and |\thousandsep| get default
%    definitions (for the English language) when |frenchb| is loaded;
%    these definitions will be updated when the current language is
%    switched to or from French.
% \changes{frenchb-1.2b}{1997/04/24}{Extra care taken to handle
%    signs properly inside \cs{nombre} in \LaTeXe.}
% \changes{frenchb-1.2b}{1997/04/24}{Definition of \cs{nombre} changed
%   to correct a bug with moving arguments in \LaTeX-2.09.}
%    \begin{macrocode}
%    \begin{macrocode}
\mathchardef\m@comma="013B
\def\@comma@{\ifmmode\m@comma\else,\fi}
\def\f@thousandsep{\ifmmode\mskip5.5mu\else\penalty\@M\kern.3em\fi}
\newcommand{\decimalsep}{.}
\newcommand{\thousandsep}{\@comma@}
\expandafter\addto\csname extras\CurrentOption\endcsname{%
            \def\decimalsep{\@comma@}%
            \def\thousandsep{\f@thousandsep}}
\expandafter\addto\csname noextras\CurrentOption\endcsname{%
            \def\decimalsep{.}%
            \def\thousandsep{\@comma@}}
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%
% \changes{frenchb-1.3}{1997/05/24}{Avoid mixing text- and math-mode
%   whenever possible: check if \cs{textminus} and co. are available.}
%    Signs can now be entered inside |\nombre|. When |\nombre| is
%    used in text-mode, signs should be text symbols to get the 
%    series, shape... from the current text-font. When signs are not
%    available in text-mode, we provide some defaults.
%    \begin{macrocode}
\providecommand{\textminus}{\textendash}%
\providecommand{\textplusminus}{\ensuremath{\pm}}
\providecommand{\textminusplus}{\ensuremath{\mp}}
\def\fb@minus{\ifmmode-\else\textminus\fi}
\def\fb@plusminus{\ifmmode\pm\else\textplusminus\fi}
\def\fb@minusplus{\ifmmode\mp\else\textminusplus\fi}
%    \end{macrocode}
%
%  \begin{macro}{\nombre}
%    The decimal separator used when \emph{inputing} a number
%    with |\nombre| \emph{has to be a comma}.
%    |\nombre| splits the inputed number into two parts: what
%    comes before the first comma will be formatted by
%    \cs{@integerpart} while the rest (if not empty) will be
%    formatted by \cs{@decimalpart}. Both parts, once formatted
%    separately will be merged together with between them, either
%    the decimal separator \cs{decimalsep} or (in \LaTeXe{}
%    \emph{only}) the optional argument of |\nombre|.
%
% \changes{frenchb-1.3}{1997/05/24}{Added \cs{@empty} to the
%    definitions of \cs{nb@first} and \cs{nb@suite}, as suggested
%    by V. Jalby, to cope with possibly empty integer part as in 
%    \cs{nombre{,123}}.}
%    \begin{macrocode}
\if@Two@E
  \newcommand{\nombre}[2][\decimalsep]{\def\@decimalsep{#1}%
         \@@nombre#2\@empty,\@empty,\@nil}
\else
  \def\@decimalsep{\decimalsep}
  \newcommand{\nombre}[1]{\@nombre#1\@empty,\@empty,\@nil}
\fi
\def\@firstofmany#1#2,{#1}
\def\@@nombre#1,#2,#3\@nil{%
       \def\nb@sign{}%
       \edef\nb@first{\@firstofmany #1\@empty,}%
       \edef\nb@suite{\@secondoftwo #1\@empty,}%
       \if+\nb@first   \def\nb@sign{+}\fi
       \if-\nb@first   \def\nb@sign{\fb@minus}\fi
       \expandafter\ifx\nb@first\pm \def\nb@sign{\fb@plusminus}\fi
       \expandafter\ifx\nb@first\mp \def\nb@sign{\fb@minusplus}\fi
       \ifx\@empty\nb@sign
         \let\@tmp\nb@suite\edef\nb@suite{\nb@first\@tmp}%
       \fi
    \nb@sign\expandafter\@nombre\nb@suite#2,#3\@nil}
\def\@nombre#1,#2,#3\@nil{%
       \ifx\@empty#2%
         \@integerpart{#1}%
       \else
         \@integerpart{#1}\@decimalsep\@decimalpart{#2}%
       \fi}
%    \end{macrocode}
%    The easiest bit is the decimal part:
%    We attempt to read the first four digits of the decimal part, if
%    it has less than 4 digits, we just have to print them, otherwise
%    |\thousandsep| has to be appended after the third digit, and the
%    algorithm is applied recursively to the rest of the decimal part.
%    \begin{macrocode}
\def\@decimalpart#1{\@@decimalpart#1\@empty\@empty\@empty}
\def\@@decimalpart#1#2#3#4{#1#2#3%
  \ifx\@empty#4%
  \else
    \thousandsep\expandafter\@@decimalpart\expandafter#4%
  \fi}
%    \end{macrocode}
%    Formatting the integer part is more difficult because the slices
%    of 3 digits start from the \emph{bottom} while the number is
%    read from the top!
%    This (tricky) code is borrowed from David Carlisle's comma.sty.
%    \begin{macrocode}
\def\@integerpart#1{\@@integerpart{}#1\@empty\@empty\@empty}
\def\@@integerpart#1#2#3#4{%
  \ifx\@empty#2%
    \@addthousandsep#1\relax
  \else
    \ifx\@empty#3%
      \@addthousandsep\@empty\@empty#1#2\relax
    \else
      \ifx\@empty#4%
        \@addthousandsep\@empty#1#2#3\relax
      \else
        \@@integerpartafterfi{#1#2#3#4}%
      \fi
    \fi
  \fi}
\def\@@integerpartafterfi#1\fi\fi\fi{\fi\fi\fi\@@integerpart{#1}}
\def\@addthousandsep#1#2#3#4{#1#2#3%
  \if#4\relax
  \else
    \thousandsep\expandafter\@addthousandsep\expandafter#4%
  \fi}
%    \end{macrocode}
%  \end{macro}
%
%  \subsection{Dots\dots}
%  \label{dots}
%
% \changes{frenchb-1.3}{1997/06/03}{Added this section.}
%    \LaTeXe's standard definition of |\dots| in text-mode is
%    |\textellipsis| which includes a |\kern| at the end;
%    this space is not wanted in some cases (before a closing brace
%    for instance) and |\kern| breaks hyphenation of the next word.
%    We define |\Frtextellipsis| for French (in \LaTeXe{} only);
%    AMS\LaTeX{} redefines |\dots|, as |\tdots@| in text-mode, so
%    we also overwrite |\tdots@| with |\Frtextellipsis| in French.
%  \begin{macro}{\Frtextellipsis}
%    \begin{macrocode}
\ifLaTeXe
  \let\textellipsisORI\textellipsis
  \AtBeginDocument{\ifx\tdots@ORI\@undefined\let\tdots@ORI\tdots@\fi}
  \DeclareTextCommandDefault{\Frtextellipsis}{%
    .\kern\fontdimen3\font.\kern\fontdimen3\font.\xspace}
  \def\bbl@frenchdots{\let\textellipsis\Frtextellipsis
                      \let\tdots@ORI\tdots@
                      \let\tdots@\Frtextellipsis}
  \def\bbl@nonfrenchdots{\let\textellipsis\textellipsisORI
           \ifx\tdots@ORI\@undefined\else\let\tdots@\tdots@ORI\fi}
  \expandafter\addto\csname extras\CurrentOption\endcsname{%
    \bbl@frenchdots}
  \expandafter\addto\csname noextras\CurrentOption\endcsname{%
    \bbl@nonfrenchdots}
\fi
%    \end{macrocode}
%  \end{macro}
%
%  \subsection{Extra utilities}
%
%    All that is left to do now is to provide the French user
%    with some extra utilities.
%
%  \begin{macro}{\up}
%  \begin{macro}{\ieme}
%    |\up| eases the typesetting of superscripts like
%    `1\raise0.55ex\hbox{\small er}'.  |\up| relies on
%    |\textsuperscript| when available (i.\,e., in \LaTeXe).
% \changes{frenchb-1.1}{1996/01/20}{Use \cs{textsuperscript} in \LaTeXe,
%    as suggested by Vincent Jalby.}
% \changes{frenchb-1.1}{1996/01/26}{Internal macro \cs{up@size}
%    introduced by Johannes Braams to replace \cs{small},
%    too fragile in 2.09).}
% \changes{frenchb-1.1}{1996/05/03}{\cs{@ptsize} may not be undefined,
%    i.\,e. in slides.cls.}
%  \begin{macro}{\up@size}
%    The internal macro |\up@size| holds the size at which the
%    superscript will be typeset. The reason for this is that we have
%    to specify it differently for different formats.
%    \begin{macrocode}
\ifx\sevenrm\@undefined
  \ifx\@ptsize\@undefined
    \let\up@size\small
  \else
    \ifx\selectfont\@undefined
%    \end{macrocode}
%    In this case the format is the original \LaTeX-2.09:
%    \begin{macrocode}
      \ifcase\@ptsize
        \let\up@size\ixpt\or
        \let\up@size\xpt\or
        \let\up@size\xipt
      \fi
%    \end{macrocode}
%    When |\selectfont| is defined we probably have NFSS available:
%    \begin{macrocode}
    \else
      \ifcase\@ptsize
        \def\up@size{\fontsize\@ixpt{10pt}\selectfont}\or
        \def\up@size{\fontsize\@xpt{11pt}\selectfont}\or
        \def\up@size{\fontsize\@xipt{12pt}\selectfont}
      \fi
    \fi
  \fi
\else
%    \end{macrocode}
%    If we end up here it must be a plain based \TeX{} format, so:
%    \begin{macrocode}
    \let\up@size\sevenrm
\fi
%    \end{macrocode}
%  \end{macro}
%    Now we can define |\up|. When \LaTeXe{} runs in
%    compatibility mode (\LaTeX-2.09 emulation), |\textsuperscript| is
%    also defined, but does no good job, so we give two different
%    definitions for |\up| using |\if@Two@E|.
%    \begin{macrocode}
\if@Two@E
  \DeclareRobustCommand*{\up}[1]{\textsuperscript{#1}}
\else
  \DeclareRobustCommand*{\up}[1]{\leavevmode\raise1ex\hbox{\up@size#1}}
\fi
%    \end{macrocode}
% \changes{frenchb-1.1}{1996/05/31}{Added 5 macros from french.sty and
%    missing \cs{lowercase}.}
%    |\ieme| is provided for compatibility with |francais.sty|,
%    the other 5 for compatibility with |french.sty|:
% \changes{frenchb-1.2b}{1997/04/24}{Use \cs{xspace} to control spacing
%    after \cs{ieme} ... \cs{ieres}.}
%    \begin{macrocode}
\def\ieme{\up{\lowercase{e}}\xspace}
\def\iemes{\up{\lowercase{es}}\xspace}
\def\ier{\up{\lowercase{er}}\xspace}
\def\iers{\up{\lowercase{ers}}\xspace}
\def\iere{\up{\lowercase{re}}\xspace}
\def\ieres{\up{\lowercase{res}}\xspace}
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%
%  \begin{macro}{\No}
%  \begin{macro}{\no}
%  \begin{macro}{\primo}
%  \begin{macro}{\fprimo)}
%    And some more macros for numbering, first two support macros.
% \changes{frenchb-1.1}{1996/01/25}{Avoid using math superscripts
%   in text mode (suggested by V.~Jalby), use \cs{up} instead.
%   The symbol `degree' has nothing to do in
%   \cs{FrenchPopularEnumerate}, replace it by a small `o'.}
%    \begin{macrocode}
\DeclareRobustCommand*{\FrenchEnumerate}[1]{%
                       #1\up{\lowercase{o}}\kern+.3em}
\DeclareRobustCommand*{\FrenchPopularEnumerate}[1]{%
                       #1\up{\lowercase{o}})\kern+.3em}
%    \end{macrocode}
%
%    Typing |\primo| should result in `$1^{\rm o}$\kern+.3em',
% \changes{frenchb-1.3c}{1997/10/08}{Typos corrected: quatro, fquatro}
%    \begin{macrocode}
\def\primo{\FrenchEnumerate1}
\def\secundo{\FrenchEnumerate2}
\def\tertio{\FrenchEnumerate3}
\def\quarto{\FrenchEnumerate4}
%    \end{macrocode}
%    while typing |\fprimo)| gives `1$^{\rm o}$)\kern+.3em.
%    \begin{macrocode}
\def\fprimo){\FrenchPopularEnumerate1}
\def\fsecundo){\FrenchPopularEnumerate2}
\def\ftertio){\FrenchPopularEnumerate3}
\def\fquarto){\FrenchPopularEnumerate4}
%    \end{macrocode}
%
%    Let's provide two macros for the common abbreviations
%    of ``Num\'ero''.
%    \begin{macrocode}
\DeclareRobustCommand*{\No}{N\up{\lowercase{o}}\kern+.2em}
\DeclareRobustCommand*{\no}{n\up{\lowercase{o}}\kern+.2em}
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%
% \changes{frenchb-1.1}{1996/01/29}{Added command \cs{bsc}.}
% \changes{frenchb-1.1}{1996/05/31}{Added \cs{leavevmode} in \cs{bsc}}
%  \begin{macro}{\bsc}
%    As family names should be written in small capitals and never be
%    hyphenated, we provide a command (its name comes from Boxed Small
%    Caps) to input them easily; this is a simpler implementation of
%    commands |\fsc| and |\lsc| from |french.sty| : no automatic
%    uppercase/lowercase conversion is performed.
%    Usage: |Jean~\bsc{Duchemin}|.
%    \begin{macrocode}
\DeclareRobustCommand*{\bsc}[1]{\leavevmode\hbox{\scshape #1}}
%    \end{macrocode}
%  \end{macro}
%
% \changes{frenchb-1.1}{1996/05/31}{Added \cs{AllTeX}.}
% \changes{frenchb-1.2}{1997/01/08}{Removed \cs{AllTeX}.}
%
% \changes{frenchb-1.1}{1996/02/12}{Added T1-encodings for \oe, \OE,
%   \ae, \AE. \emph{Do not} re-define these symbols outside \LaTeXe.}
% \changes{frenchb-1.1}{1996/02/14}{Corrected definitions of
%    \cs{boi}.}
% \changes{frenchb-1.3}{1997/05/24}{Use \cs{textbackslash} to define
%    \cs{boi}.}
%    Some definitions for special characters. The first eight are
%    mandatory for |\oe| etc. to work properly in moving arguments,
%    the others just for convenience. We won't define |\tilde| as a
%    Text Symbol not to conflict with the macro |\tilde| for math-mode
%    and use the name |\tild| instead. Note that |\boi| may \emph{not}
%    be used in math-mode, its name in math-mode is |\backslash|.
% \changes{frenchb-1.3}{1997/05/24}{Use \cs{r{}} to access the
%    character `degree', as suggested by V. Jalby.}
%    |\degre| needs a special treatment: it is |\char6|
%    in T1-encoding and |\char23| in OT1-encoding, both can be
%    accessed by the command |\r{}| for ring accent.
% \changes{frenchb-1.1}{1996/03/03}{Do not use commands related to
%   encodings outside \LaTeXe.}
%    \begin{macrocode}
\ifLaTeXe
  \DeclareTextSymbol{\ae}{T1}{230}
  \DeclareTextSymbol{\ae}{OT1}{26}
  \DeclareTextSymbol{\oe}{T1}{247}
  \DeclareTextSymbol{\oe}{OT1}{27}
  \DeclareTextSymbol{\AE}{T1}{198}
  \DeclareTextSymbol{\AE}{OT1}{29}
  \DeclareTextSymbol{\OE}{T1}{215}
  \DeclareTextSymbol{\OE}{OT1}{30}
  \DeclareTextSymbol{\at}{T1}{64}
  \DeclareTextSymbol{\at}{OT1}{64}
  \DeclareTextSymbol{\circonflexe}{T1}{94}
  \DeclareTextSymbol{\circonflexe}{OT1}{94}
  \DeclareTextSymbol{\tild}{T1}{126}
  \DeclareTextSymbol{\tild}{OT1}{126}
  \DeclareRobustCommand*{\boi}{\textbackslash}
  \DeclareRobustCommand*{\degre}{\r{}}
\else
  \def\T@one{T1}
  \ifx\f@encoding\T@one
    \newcommand{\degre}{\char6}
  \else
    \newcommand{\degre}{\char23}
  \fi
  \newcommand{\at}{\char64}
  \newcommand{\circonflexe}{\char94}
  \newcommand{\tild}{\char126}
  \newcommand{\boi}{{$\backslash$}}
\fi
%    \end{macrocode}
%
%  \begin{macro}{\degres}
%    Macro for typesetting the abbreviation for `degrees' (as in
%    `degrees Celsius'). As the bounding box of the character `degree'
%    has \emph{very} different widths in CM/EC and PostScript fonts,
%    we fix the width of the bounding box of |\degres| to 0.3\,em,
%    this lets the symbol `degree' stick to the preceding
%    (e.g., |45\degres|) or following character (e.g., |20~\degres C|).
% \changes{frenchb-1.1}{1996/01/25}{Fixed width bounding box for
%   correct spacing with both CM/DC and PostScript fonts}
% \changes{frenchb-1.1}{1996/05/31}{Added \cs{leavevmode} in the
%   \cs{degres}'s definition}
%    \begin{macrocode}
\DeclareRobustCommand*{\degres}{%
                       \leavevmode\hbox to 0.3em{\hss\degre\hss}}
%    \end{macrocode}
%  \end{macro}
%
% \changes{frenchb-1.1}{1996/01/16}{Special care has to be taken
%  with Ml\TeX.}
%    The following macros are used in the redefinition of |\^| and
%    |\"| to handle the letter~i: they allow users to type simply
%    |\^i| and |\"i| instead of |\^{\i}| and |\"{\i}|.\\
%    Ml\TeX{}'s macros dealing with accents conflict with those of
%    \LaTeXe{}, so we check whether |\csubinverse| is defined or not.
%    If |\csubinverse| is \emph{defined}, we are in Ml\TeX.
% \changes{frenchb-1.1}{1996/03/02}{Do this only in \LaTeXe.}
% \changes{frenchb-1.1}{1996/03/12}{Do not redefine \cs{\char94} and
%    \cs{"} in Ml\TeX, because it would break hyphenation. The correct
%    place to redefine \cs{\char94i} and \cs{"i} is in the format
%    itself, see MLTeX.cfg.}
%    \begin{macrocode}
\ifLaTeXe
  \AtBeginDocument{%
    \ifx\csubinverse\@undefined
      \DeclareTextCompositeCommand{\^}{OT1}{i}{\^\i}%
      \DeclareTextCompositeCommand{\"}{OT1}{i}{\"\i}%
    \fi}
\fi
%    \end{macrocode}
%
%  \subsection{Date and clean up}
%
% \begin{macro}{\datefrenchb}
%    The macro |\datefrenchb| redefines the command |\today| to
%    produce French dates.
% \changes{frenchb-1.2}{1997/01/05}{added aliases \cs{datefrench}
%    and \cs{datefrancais}. Use \cs{ier} instead of \cs{up}.}
% \changes{frenchb-1.3b}{1997/10/01}{Use \cs{edef} to define
%    \cs{today} to save memory}
% \changes{frenchb-1.3d}{1998/07/04}{Move this code to the end
%    of file, until \cs{ier} is defined (due to use of \cs{edef});
%    expansion of \cs{ier} has to be stopped anyway.}
% \changes{french-1.3g}{1999/08/18}{Replaced \cs{edef} with \cs{def}
%    to prevent problems with unexpandable accent commands}
%    \begin{macrocode}
\@namedef{date\CurrentOption}{%
  \def\today{\number\day
    \ifnum1=\day \noexpand\ier\fi
    \space \ifcase\month
    \or janvier\or f\'evrier\or mars\or avril\or mai\or juin\or
    juillet\or ao\^ut\or septembre\or octobre\or novembre\or
    d\'ecembre\fi
    \space \number\year}}
\def\datefrench{\datefrenchb}
\def\datefrancais{\datefrenchb}
%    \end{macrocode}
% \end{macro}
%
%    Finally the macro-space used by some control sequences we do not
%    need any longer, is freed.
%    \begin{macrocode}
\let\T@one\relax
\let\@FI@\relax
\let\ifLaTeX\@undefined
\let\LaTeXtrue\@undefined
\let\LaTeXfalse\@undefined
\let\ifLaTeXe\@undefined
\let\LaTeXetrue\@undefined
\let\LaTeXefalse\@undefined
%    \end{macrocode}
%
%    The macro |\ldf@finish| takes care of looking for a
%    configuration file, setting the main language to be switched on
%    at |\begin{document}| and resetting the category code of
%    \texttt{@} to its original value.
% \changes{frenchb-1.1b}{1996/11/02}{Now use \cs{ldf@finish} to wrap
%    up}
% \changes{frenchb-1.2}{1997/01/05}{The config file searched for is
%    `frenchb.cfg' regardless \cs{CurrentOption}.}
%    The config file searched for will always be `frenchb.cfg'.
%    Remember that |\CurrentOption| has been set to `frenchb', and
%    that `francais' and `french' are aliases for `frenchb'.
%    \begin{macrocode}
\ldf@finish\CurrentOption
%</code>
%    \end{macrocode}
%
% \Finale
%%
%% \CharacterTable
%%  {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
%%   Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
%%   Digits        \0\1\2\3\4\5\6\7\8\9
%%   Exclamation   \!     Double quote  \"     Hash (number) \#
%%   Dollar        \$     Percent       \%     Ampersand     \&
%%   Acute accent  \'     Left paren    \(     Right paren   \)
%%   Asterisk      \*     Plus          \+     Comma         \,
%%   Minus         \-     Point         \.     Solidus       \/
%%   Colon         \:     Semicolon     \;     Less than     \<
%%   Equals        \=     Greater than  \>     Question mark \?
%%   Commercial at \@     Left bracket  \[     Backslash     \\
%%   Right bracket \]     Circumflex    \^     Underscore    \_
%%   Grave accent  \`     Left brace    \{     Vertical bar  \|
%%   Right brace   \}     Tilde         \~}
%%
\endinput

