% \iffalse meta-comment
%
% Copyright 1989-2001 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.7.
% --------------------------------------------------
% 
% 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.2 or, at your option, any later version.
% \fi
% \CheckSum{1826}
%
% \iffalse
%    Tell the \LaTeX\ system who we are and write an entry on the
%    transcript. Nothing to write to the .cfg file, if generated.
%<*dtx>
\ProvidesFile{frenchb.dtx}
%</dtx>
%<code>\ProvidesLanguage{french}
%\ProvidesFile{frenchb.dtx}
%<*!cfg>
        [2001/09/09 v1.5g French support from the babel system]
%</!cfg>
%<*cfg>
%% frenchb.cfg: configuration file for frenchb.ldf
%% Daniel Flipo <Daniel.Flipo@univ-lille1.fr>
%</cfg>
%%    File `frenchb.dtx'
%%    Babel package for LaTeX version 2e
%%    Copyright (C) 1989 - 2001
%%              by Johannes Braams, TeXniek
%
%<*!cfg>
%%    Frenchb language Definition File
%%    Copyright (C) 1989 - 2001
%%              by Johannes Braams, TeXniek
%%                 Daniel Flipo, GUTenberg
%
%%    Please report errors to: Daniel Flipo, GUTenberg
%%                             Daniel.Flipo@univ-lille1.fr
%</!cfg>
%
%    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 sectioning 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!
%
%    The command |\selectlanguage{french}| switches to the French 
%    language%
%    \footnote{\texttt{\textbackslash selectlanguage\{francais\}}
%    and \texttt{\textbackslash selectlanguage\{frenchb\}} are kept
%    for backward compatibility but should no longer be used.},
%    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|);
%          it is possible to change `--' to something else (`---'
%          for instance) by redefining |\FrenchLabelItem|;
%          apart from the global hook |\FrenchLabelItem|, it is
%          also possible to change the `labelitems' at any level
%          (1 to 4) in French, using the standard \LaTeX{} syntax,
%          for instance: |\renewcommand{\labelitemii}{\textbullet}|;
%          in order to be effective in French, the redefinitions
%          have to be made when French is the current language
%          (i.e.\ \emph{after} the |\begin{document}|), the changes are
%          saved when switching to another language and will be
%          remembered of, when switching back to French;
%    \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 the space after |\dots| is removed in French.
%    \end{enumerate}
%
%    Some commands are provided in |frenchb| to make typesetting
%    easier:
%    \begin{enumerate}
%    \item French quotation marks can be entered 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{} \emph{and}
%          |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 and better
%          horizontal spacing).
%          |\og| and |\fg| can be used outside French, they provide
%          then English quotes `` and ''.
%    \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 the symbol 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 In math-mode the comma has to be surrounded with
%          braces to avoid a spurious space being inserted after it,
%          in decimal numbers for instance (see the \TeX{}book p.~134).
%          The command |\DecimalMathComma| makes the comma be an
%          ordinary character \emph{in French only} (no space added);
%          as a counterpart, if |\DecimalMathComma| is active, an
%          explicit space has to be added in lists and intervals:
%          |$[0,\ 1]$|, |$(x,\ y)$|. |\StandardMathComma| switches back
%          to the standard behaviour of the comma.
%    \item A command |\nombre| is provided to easily typeset 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):
%          each slice of three digits will be separated either with
%          a comma in English or with a space in French (if you prefer
%          a thin space instead of a normal space, just add the command
%          |\ThinSpaceInFrenchNumbers| to the preamble of your document,
%          or to |frenchb.cfg|).
%          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|, |\ieme|,
%          |\dots|, \dots, 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|).
%    \item Two commands, |\FrenchLayout| and |\StandardLayout| (to be
%          used \emph{only in the preamble}) are provided to unify the
%          layout of multilingual documents (it mainly concerns lists)
%          regardless the current language (see section~\ref{sec-global}
%          for details).
%    \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 (see the example
%    configuration file below in section~\ref{sec-cfg}), 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). \\[3mm]^^A\]
%      |%%% Test file for French hyphenation.|\\
%      |\documentclass{article}|\\
%      |\usepackage[|\textit{my-encoding}|]{inputenc}|\\
%      |\usepackage[T1]{fontenc} % Use EC fonts for French|\\
%      |%\usepackage{mltex}      % Uncomment this line and|\\
%      |                         % comment out the preceeding one|\\
%      |                         % to use standard CM fonts.|\\
%      |\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.
%    Using EC fonts with built-in accented characters or Ml\TeX{}
%    with CM fonts avoids this type of mismatch.
%    \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| (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.\\
%            In case Cyrillic guillemets do not fit, it is possible
%            to pick French guillemets from any font using the
%            command |\FrenchGuillemetsFrom| which requires 4 arguments
%            |\FrenchGuillemetsFrom{|{\it coding}|}{|{\it font}\relax
%            |}{|{\it char-left}|}{|{\it char-right}|}|, for instance,
%            add |\FrenchGuillemetsFrom{T1}{ppl}{19}{20}| to the
%            preamble of your document or to |frenchb.cfg|, to pick
%            French guillemets from Palatino (fontname=ppl, char 19
%            and 20 are left and right guillemets in T1-encoding).
%            This was suggested by Michel~Bovani.
%      \item the environment `itemize' has been redesigned in French
%            according to specifications from Jacques~Andr\'e
%            and Thierry~Bouche; it is possible to switch back to the
%            settings of version~1.2: add |\FrenchItemizeSpacingfalse|
%            \emph{after} loading |frenchb| in the preamble (this can
%             be useful to process old documents);
%      \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, with the standard \LaTeX{} classes, captions
%            in figures and tables are printed with an endash instead
%            of a colon.
%    \end{itemize}
%
%    \textbf{Changes in version 1.4}:
%    \begin{itemize}
%      \item the redefinition of|\@makecaption| is changed not to
%         overwrite the changes made by some classes (koma-script,
%         amsart, ua-thesis\dots) as pointed out by Werner~Lemberg;
%      \item a hook, |\FrenchGuillemetsFrom|, is provided to pick
%          French guillemets from any font (suggested by
%          Michel~Bovani);
%      \item a hook, |\FrenchLabelItem|, is provided to enable marks
%          other than `--' (|\textendash|) in French lists
%          (also suggested by Michel~Bovani);
%      \item |\DecimalMathComma|, |\StandardMathComma|,
%        |\ThinSpaceInFrenchNumbers| added;
%      \item |\FrenchLayout| and |\StandardLayout| added;
%      \item an example of customization file |frenchb.cfg| is
%          included in |frenchb.dtx|.
%    \end{itemize}
%
%    \textbf{Changes in version 1.5}:
%    \begin{itemize}
%      \item The settings for spacing in French lists are no longer
%         tuned at the |\@trivlist| level but within |\list|; this
%         enables the users to provide their own settings for the
%         lists they define with |\list| (suggested by P. Pichaureau).
%         Although the layout of the standard lists
%         \emph{has not changed}, some lists, based directly on
%         |\@trivlist| or |\trivlist|, could possibly be typeset
%          differently when upgrading from version 1.4 to 1.5.
%         The command |\FrenchOldTrivlisttrue| could then, be useful
%         to process older documents.
%      \item Apart from the global hook |\FrenchLabelItem|, it is
%         now also possible to change the `labelitems' at any level
%         (1 to 4) in French, using the standard \LaTeX{} syntax,
%         for instance: |\renewcommand{\labelitemii}{\textbullet}|.
%      \item The internal name for the French language has been
%         changed from |frenchb| to |french|, it means that
%         |\captionsfrench|, |\datefrench|, |\extrasfrench|, 
%         |\noextrasfrench|, are to be used now instead of
%         |\captionsfrenchb|, |\datefrenchb|, |\extrasfrenchb|,
%         |\noextrasfrenchb|.
%      \item From version 1.5f on, it is possible to customize
%         the space inserted before a colon in French; its default
%         value is |\space| (as in previous versions of |frenchb|),
%         but it can now be changed to |\thinspace| by redefining
%         |\Fcolonspace|.
%    \end{itemize}
%
% \StopEventually{}
%
%  \subsection*{Customizing frenchb: an example of configuration file}
%  \label{sec-cfg}
%
% \changes{frenchb-1.4d}{1999/12/19}{Do NOT set catcodes of French
%    quotes to 12 before launching \cs{initiate@active@char} in
%    frenchb.cfg, (problem on Mac reported by M.Bovani).}
%
%    \begin{macrocode}
%<*cfg>
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% If you want to customize frenchb, please DO NOT hack into the code,
%% copy this file into a directory searched by TeX, preferably a
%% personal one on multi-user systems, and customize it as you like.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% WARNING: If you exchange your documents with colleagues using
%% a different TeX installation, it is best NOT TO HAVE a frenchb.cfg
%% file, and add instead the customization commands to the preamble
%% of your documents after babel and frenchb have been loaded.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%% Uncomment the following line if you dislike frenchb automatically
%% adding a space before French double punctuation (see frenchb.dtx
%% for more information).
%%
%%\NoAutoSpaceBeforeFDP
%%
%% frenchb inserts a normal space before a colon in French (following
%% I.N. specifications), but some people prefer a thinspace instead;
%% uncomment the following line if you prefer a thinspace.
%%
%%\renewcommand{\Fcolonspace}{\thinspace}
%%
%% Uncomment the following line to force lasy font emulation for
%% French guillemets; Cyrillic guillemets are FAR BETTER LOOKING,
%% you should normally leave this line commented out.
%%
%%\LasyGuillemets
%%
%% If you dislike Cyrillic guillemets in OT1-encoding and prefer,
%% those from the Palatino font or Polish guillemets, you can comment
%% out one of the following lines.
%% The four arguments are: encoding, font name, character codes of
%% the opening and closing guillemets in the selected font.
%%
%%\FrenchGuillemetsFrom{T1}{ppl}{19}{20}
%%\FrenchGuillemetsFrom{OT4}{cmr}{174}{175}
%%
%% Vertical spacing in itemize lists has been changed in version 1.3.
%% Uncomment the following line if you want to have the same settings
%% as in version 1.2 (to process older documents for instance).
%%
%%\FrenchItemizeSpacingfalse
%%
%% frenchb tunes vertical spaces in all lists (at \list level),
%% uncomment the following line if you prefer LaTeX standard settings
%% (this flag is new in version 1.3). When \ifFrenchItemizeSpacing is
%% `true' (default setting), this flag has no effect on itemize lists.
%%
%%\FrenchListSpacingfalse
%%
%% The command \FrenchLabelItem can be used to set the `labelitems'
%% for all levels in French. For instance, to get long dashes, use:
%%
%%\renewcommand{\FrenchLabelItem}{\textemdash}
%%
%% You can also have different `labelitems' for each level in French:
%%
%%\renewcommand{\Frlabelitemi}{\textemdash}
%%\renewcommand{\Frlabelitemii}{\bfseries\textendash}
%%\renewcommand{\Frlabelitemiii}{\textbullet}
%%\renewcommand{\Frlabelitemiv}{}
%%
%% Uncomment the following line if you want the command \nombre to
%% insert thin spaces (1/6em) instead of normal spaces (0.3em)
%% between slices of 3 digits when typesetting numbers in French.
%%
%%\ThinSpaceInFrenchNumbers
%%
%% If you are bored to type {,} every time you want a decimal comma in
%% math-mode, uncomment the following line (and don't forget to add a
%% forced space after the comma in lists and intervals: $(x,\ y)$ and
%% $[0,\ 1]$). I suggest NOT TO UNCOMMENT the following line,
%% and to switch between the decimal comma and the standard comma
%% using \DecimalMathComma and \StandardMathComma inside the document.
%%
%%\DecimalMathComma
%%
%% If you do not want the appearance of lists to depend on the current
%% language, add ONE of these two commands: \FrenchLayout (for a
%% document mainly in French) or \StandardLayout (for a document
%% mainly in English).
%%
%%\FrenchLayout
%%\StandardLayout
%%
%% With the standard LaTeX classes (article.cls, report.cls, book.cls)
%% you can change the separator used in figure and table captions in
%% French with \CaptionSeparator , for instance (the default value of
%% \CaptionSeparator in French is '\space\textendash\space'):
%%
%%\addto\captionsfrench{\def\CaptionSeparator{\space\textemdash\space}}
%%
%% You might want to change some of the translations of caption names,
%% you can do it this way, for instance:
%%
%%\addto\captionsfrench{\def\figurename{{\scshape Figure}}}
%%\addto\captionsfrench{\def\tablename{{\scshape Table}}}
%%\addto\captionsfrench{\def\proofname{Preuve}}
%%
%% If French guillemets are available on your keyboard, you can use
%% them instead of the commands \og and \fg: REPLACE << and >> in
%% the following code by your ready-made guillemets (2 occurrences
%% for each) AND uncomment the resulting code.
%% WARNINGS:
%% 1) This will reduce the portability of your source files!
%% 2) This adds two active characters.
%% 3) If you add this stuff to the preamble of a document, you'll
%%    need to wrap it in \makeatletter ... \makeatother.
%%
%% \ifx\mule@def\undefined
%%   \initiate@active@char{<<}
%%   \initiate@active@char{>>}
%%   \AtBeginDocument{%
%%     \def<<{\og\ignorespaces}%
%%     \def>>{{\fg}}%
%%     }%
%% \else %%% For the CJK package, see MULEenc.sty.
%%   \mule@def{11}{\og\ignorespaces}
%%   \mule@def{27}{{\fg}}
%% \fi
%%
%% The rest is for compatibility with Bernard Gaulle's french.sty:
%% if you want to typeset with babel/frenchb files originally written
%% for french.sty, you will probably want to uncomment these lines.
%%
%% Uncomment these lines if you want the aliases \numero and \Numero
%% (as in french.sty) for \no and \No.
%%
%%\let\numero=\no
%%\let\Numero=\No
%%
%% Uncomment the following lines if you want to substitute `\bsc' to
%% either (or both) of french.sty macros `\fsc' and `\lsc'.
%%
%%\let\fsc=\bsc
%%\let\lsc=\bsc
%%
%% Uncomment the following line if you want to substitute `\up' to
%% french.sty macro `\fup'.
%%
%%\let\fup=\up
%%
%% Uncomment the following lines if you intend to use  commands \french
%% and \english to switch between languages, as in french.sty.
%%
%%\def\french{\leavevmode\selectlanguage{french}}
%%\def\english{\leavevmode\selectlanguage{english}}
%%
%% Uncomment the following lines if you intend to use the command
%% \AllTeX to refer to all flavours of TeX, (this command has been
%% made popular by french.sty).
%%
%%\newcommand*{\AllTeX}{%
%%                (L\kern-.36em\raise.3ex\hbox{\sc a}\kern-.15em)%
%%                   T\kern-.1667em\lower.7ex\hbox{E}\kern-.125emX}
%</cfg>
%    \end{macrocode}
%
%  \section{\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}
% \changes{frenchb-1.5g}{2001/09/09}{Let \cs{LdfInit} check for
%     \cs{datefrench} instead of \cs{NoAutoSpaceBeforeFDP},
%     as the later is also defined by russianb.ldf!}
%    \begin{macrocode}
%<*code>
%%
\LdfInit\CurrentOption\datefrench
%    \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}
%
% \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; we allow for the names `french',
%    `francais', `canadien' or `acadian'. The latter two are both
%    names used in Canada for variants of French that are in use in
%    that country.
% \changes{frenchb-1.5b}{2001/02/09}{Added support for canadien and
%    acadian}
%    \begin{macrocode}
\ifx\l@french\@undefined
  \ifx\l@francais\@undefined
    \ifx\l@canadien\@undefined
      \ifx\l@acadian\@undefined
        \@nopatterns{French}
        \adddialect\l@french0
      \else
        \let\l@french\l@acadian
      \fi
    \else
      \let\l@french\l@canadien
    \fi
  \else
    \let\l@french\l@francais
  \fi
\fi
%    \end{macrocode}
%    After the statement above |\l@french| is sure to always be
%    defined.
%
% \changes{frenchb-1.2}{1997/01/05}{`french' `frenchb' and
%    `francais' are synonymous regardless of \cs{CurrentOption}.}
%    The internal name for the French language will be `french';
%    `francais' and `frenchb' will be synonymous for `french':
%    first let both names use the same hyphenation patterns.
%    Later we will have to set aliases for |\captionsfrench|,
%    |\datefrench|, |\extrasfrench| and |\noextrasfrench|.
%    As French uses the standard values of |\lefthyphenmin| (2)
%    and |\righthyphenmin| (3), no special setting is required here.
%    
% \changes{frenchb-1.5d}{2001/02/16}{The internal name for the
%    French language is changed from `frenchb' to `french'.}
%
%    \begin{macrocode}
\def\CurrentOption{french}
\ifx\l@francais\@undefined
  \let\l@francais\l@french
\fi
\ifx\l@frenchb\@undefined
  \let\l@frenchb\l@french
\fi
%    \end{macrocode}
%    When this language definition file was loaded for one of the
%    Canadian versions of French we need to make sure that a suitable
%    hyphenation pattern register will be found by \TeX.
% \changes{babel-1.5b}{2001/02/09}{Added support for canadien and
%    acadian}
%    \begin{macrocode}
\ifx\l@canadien\@undefined
  \let\l@canadien\l@french
\fi
\ifx\l@acadian\@undefined
  \let\l@acadian\l@french
\fi
%    \end{macrocode}
%
% \changes{frenchb-1.5g}{2001/09/09}{Instead of issuing a warning when
%    \cs{captionsfrancais} or \cs{captionsfrenchb} are customized in
%    the preamble, we merge the changes into \cs{captionsfrench}.}
%
%    This language definition can be loaded for different variants of
%    the French language. The `key' \babel\ macros are only defined
%    once, using `french' as the language name, but |frenchb| and
%    |francais| are synonymous. As some users who choose |frenchb|
%    or |francais| as option of \babel, might customize
%    |\captionsfrenchb| or |\captionsfrancais| in the preamble,
%    we merge their changes at the |\begin{document}| when they do so
%    (only possible in \LaTeXe).
%    The other three commands for |\date|, |\extras|, and |\noextras|
%    are not likely to be modified by end-users.
%    The other variants of languages are defined by checking if the
%    relevant option was used and then adding one extra level of
%    expansion.
%    \begin{macrocode}
\def\datefrancais{\datefrench}
\def\extrasfrancais{\extrasfrench}
\def\noextrasfrancais{\noextrasfrench}
\def\datefrenchb{\datefrench}
\def\extrasfrenchb{\extrasfrench}
\def\noextrasfrenchb{\noextrasfrench}
\ifLaTeXe
  \AtBeginDocument{\let\captions@French\captionsfrench
                   \ifx\captionsfrenchb\@undefined
                      \let\captions@Frenchb\relax
                   \else
                      \let\captions@Frenchb\captionsfrenchb
                   \fi
                   \ifx\captionsfrancais\@undefined
                      \let\captions@Francais\relax
                   \else
                      \let\captions@Francais\captionsfrancais
                   \fi
                   \def\captionsfrench{\captions@French
                          \captions@Francais\captions@Frenchb}%
                   \def\captionsfrancais{\captionsfrench}%
                   \def\captionsfrenchb{\captionsfrench}%
                  }
\else
  \def\captionsfrancais{\captionsfrench}
  \def\captionsfrenchb{\captionsfrench}
\fi
\@ifpackagewith{babel}{canadien}{%
  \def\captionscanadien{\captionsfrench}%
  \def\datecanadien{\datefrench}%
  \def\extrascanadien{\extrasfrench}%
  \def\noextrascanadien{\noextrasfrench}%
  }{}
\@ifpackagewith{babel}{acadian}{%
  \def\captionsacadian{\captionsfrench}%
  \def\dateacadian{\datefrench}%
  \def\extrasacadian{\extrasfrench}%
  \def\noextrasacadian{\noextrasfrench}%
  }{}
%    \end{macrocode}
%
% \begin{macro}{\extrasfrench}
% \begin{macro}{\noextrasfrench}
%    The macro |\extrasfrench| will perform all the extra
%    definitions needed for the French language.
%    The macro |\noextrasfrench| is used to cancel the actions of
%    |\extrasfrench|.\\
%    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}
%    \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
%    endash (`--') instead of the standard `:'. If another separator
%    is preferred, see in the example configuration file above
%    (section~\ref{sec-cfg}) how to change the default value of
%    |\CaptionSeparator|.
%
% \changes{frenchb-1.4a}{1999/10/23}{frenchb-1.3 silently redefined
%    \cs{@makecaption}, overwriting changes made by some classes
%    like koma-script, ua-thesis\dots (pointed out by Werner~Lemberg).
%    New implementation suggested by Vincent~Jalby.}
%
% \changes{frenchb-1.4e}{2000/03/12}{Captions print twice with AMS
%    classes (amsart, amsbook). Bug reported by Jean-Fran\c cois
%    Mertens. Revert to implementation of version 1.4, which is
%    safer as \@makecaption can be changed unpredictably.}
%
%    We first store the standard definition of |\@makecaption|
%    (e.g., the one provided in article.cls, report.cls, book.cls
%    which is frozen for \LaTeXe{} according to Frank Mittelbach),
%    in |\STD@makecaption|. `ATBeginDocument' we compare it  to its
%    current definition (some classes like koma-script classes,
%    AMS classes, ua-thesis.cls\dots change it).
%    If they are identical, frenchb just adds a hook called
%    |\CaptionSeparator| to |\@makecaption|, |\CaptionSeparator|
%    defaults to ': ' as in the standard |\@makecaption|, and will be
%    changed to ' -- ' in French.
%    If the definitions differ, frenchb doesn't overwrite the changes,
%    but prints a message in the .log file.
% \changes{frenchb-1.4f}{2000/04/07}{Only issue a warning if
%    \cs{@makecaption} exists}
%    \begin{macrocode}
\ifLaTeXe
  \long\def\STD@makecaption#1#2{%
    \vskip\abovecaptionskip
    \sbox\@tempboxa{#1: #2}%
    \ifdim \wd\@tempboxa >\hsize
      #1: #2\par
    \else
      \global \@minipagefalse
      \hb@xt@\hsize{\hfil\box\@tempboxa\hfil}%
    \fi
    \vskip\belowcaptionskip}
  \def\CaptionSeparator{\string:\space}
  \long\def\FB@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}
  \AtBeginDocument{%
  \ifx\@makecaption\STD@makecaption
      \let\@makecaption\FB@makecaption
  \else
    \ifx\@makecaption\@undefined\else
      \PackageWarning{frenchb.ldf}%
        {The definition of \protect\@makecaption\space
         has been changed,\MessageBreak
         frenchb will NOT customize it;\MessageBreak reported}%
    \fi
  \fi
  \let\FB@makecaption\relax
  \let\STD@makecaption\relax}
  \expandafter\addto\csname noextras\CurrentOption\endcsname{%
    \def\CaptionSeparator{\string:\space}}
\fi
%    \end{macrocode}
%
% \begin{macro}{\captionsfrench}
%    The macro |\captionsfrench| 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\captionsfrench{\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{captionsfrenchb}
%    and \cs{captionsfrancais}.}
% \changes{frenchb-1.3c}{1997/10/08}{Added \cs{CaptionSeparator}.}
% \changes{frenchb-1.4a}{1999/10/23}{Changed `--' to
%    \cs{textendash} in \cs{CaptionSeparator} in case the ligature
%    doesn't exist (tt-fonts).}
% \changes{frenchb-1.4f}{2000/04/06}{Added \cs{glossaryname}}
%    \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\textendash\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\glossaryname{Glossaire}%
   }
\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{french}}
%    \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 |\extrasfrench| needs to do is to make sure that
%    |\frenchspacing| is in effect.  If this is not the case the
%    execution of |\noextrasfrench| 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}{\french@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{french}{;}{%
    \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}{\french@sh@!@}
% \begin{macro}{\french@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{french}{!}{%
    \ifhmode
      \ifdim\lastskip>\z@
        \unskip\penalty\@M\thinspace
      \else
        \FDP@thinspace
      \fi
    \fi
    \string!}
%    \end{macrocode}
%
%    \begin{macrocode}
\declare@shorthand{french}{?}{%
    \ifhmode
      \ifdim\lastskip>\z@
        \unskip\penalty\@M\thinspace
      \else
        \FDP@thinspace
      \fi
    \fi
    \string?}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\french@sh@:@}
%
%    The `:' requires a normal space before it, instead of
%    a |\thinspace|.
%
%    \begin{macrocode}
\declare@shorthand{french}{:}{%
    \ifhmode
      \ifdim\lastskip>\z@
        \unskip\penalty\@M\Fcolonspace
      \else
        \FDP@colonspace
      \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'.}
% \changes{frenchb-1.5f}{2001/06/02}{Added a hook to customize
%    the space before the colon in French (thin or normal).}
%  \begin{macro}{\Fcolonspace}
%  \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}
\newcommand{\Fcolonspace}{\space}
\def\AutoSpaceBeforeFDP{%
      \def\FDP@thinspace{\penalty\@M\thinspace}%
      \def\FDP@colonspace{\penalty\@M\Fcolonspace}}
\def\NoAutoSpaceBeforeFDP{\let\FDP@thinspace\@empty
                          \let\FDP@colonspace\@empty}
\AutoSpaceBeforeFDP
%    \end{macrocode}
%  \end{macro}
%  \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.4}{1999/07/08}{Add a hook to pick French
%    guillemets from any font (suggested by Michel Bovani).}
% \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 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 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{always} be used together with
%    T1-encoding (\emph{not} OT1), for proper hyphenation and 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 |\extrasfrench| |\noextrasfrench|
%    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}{\FrenchGuillemetsFrom}
%  \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).}
% \changes{frenchb-1.5f}{2001/04/21}{\cs{og} and \cs{fg} should not
%     be expanded when written to a file; use \cs{renewcommand} (in 
%     \cs{LaTeX}) to redefine them instead of \cs{let} or \cs{def}.}
%
%    \begin{macrocode}
\newcommand{\og}{\@empty}
\newcommand{\fg}{\@empty}
\ifLaTeXe
   \def\FrenchGuillemetsFrom#1#2#3#4{%
     \DeclareFontEncoding{#1}{}{}%
     \DeclareFontSubstitution{#1}{#2}{m}{n}%
     \DeclareTextCommand{\guillemotleft}{OT1}{%
        {\fontencoding{#1}\fontfamily{#2}\selectfont\char#3}}%
     \DeclareTextCommand{\guillemotright}{OT1}{%
        {\fontencoding{#1}\fontfamily{#2}\selectfont\char#4}}}
   \def\CyrillicGuillemets{\FrenchGuillemetsFrom{OT2}{wncyr}{60}{62}}
   \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}
   \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}
   \def\bbl@frenchguillemets{\renewcommand{\og}{\begin@guill}%
                             \renewcommand{\fg}{\end@guill}}
   \def\bbl@nonfrenchguillemets{\renewcommand{\og}{``}%
            \renewcommand{\fg}{\ifdim\lastskip>\z@\unskip\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
   \def\bbl@frenchguillemets{\let\og\begin@guill
                             \let\fg\end@guill}
   \def\bbl@nonfrenchguillemets{\def\og{``}%
                     \def\fg{\ifdim\lastskip>\z@\unskip\fi ''}}
\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}
%  \end{macro}
%
%  \subsection{French lists}
%  \label{sec-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; as most lists are based on
%    |\list| we will redefine |\list| (up to version~1.4, the more
%    internal command |\@trivlist| was redefined, this ensured that
%    all lists would have common settings, but didn't allow the users
%    to provide their own settings, as pointed out by P.~Pichaureau).
%    If standard LaTeX{} settings are preferred, 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.}
% \changes{frenchb-1.5a}{2001/01/02}{Redefine \cs{list} instead of
%    \cs{@trivlist} to provide more freedom to the user, but still
%    allow the former way with \cs{ifFrenchOldTrivlist}.}
%    \begin{macrocode}
% \changes{frenchb-1.5g}{2001/09/09}{\cs{parskip} is of type `skip',
%    its mean value only (not the glue) should be moved from
%    \cs{topsep} to \cs{partopsep}: substracting glue can lead to 
%    weird results. Bug pointed out by Michel Bovani.}
\newif\ifFrenchListSpacing \FrenchListSpacingtrue
\newif\ifFrenchOldTrivlist
\ifLaTeX
  \let\listORI\list
%    \end{macrocode}
%    |\endlist| is not redefined, but |\endlistORI| is provided for
%    the users who prefer to define their own lists from the original
%    command, they can code: |\begin{listORI}{}{} \end{listORI}|.
%    \begin{macrocode}
  \let\endlistORI\endlist
  \def\FR@listsettings{%
     \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}%
%    \end{macrocode}
%    |\parskip| is of type `skip', its mean value only (\emph{not
%    the glue}) should be substracted from |\topsep| and added to
%    |\partopsep|, so convert |\parskip| to a `dimen' using
%    |\@tempdima|.
%    \begin{macrocode}
     \@tempdima=\parskip
     \addtolength{\topsep}{-\@tempdima}%
     \addtolength{\partopsep}{\@tempdima}}%
  \def\listFR#1#2{\listORI{#1}{\FR@listsettings #2}}%
%    \end{macrocode}
%    Keep the |\@trivlist| redefinition from version 1.4 (only
%    for compatibility reasons). The flag |\ifFrenchOldTrivlist|
%    could happen to be useful to process older documents.
%    \begin{macrocode}
  \let\@trivlistORI\@trivlist
  \def\@trivlistFR{\FR@listsettings\@trivlistORI}
  \def\bbl@frenchlistspacing{\ifFrenchListSpacing\let\list\listFR\fi
                   \ifFrenchOldTrivlist\let\@trivlist\@trivlistFR
                                       \let\list\listORI\fi}
  \def\bbl@nonfrenchlistspacing{\let\list\listORI
                                \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 preferred for all levels. The item label used
%    in French is stored in |\FrenchLabelItem}|, it defaults to '--' and
%    can be changed using |\renewcommand| (see the example
%    configuration file above).
%
% \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.}
% \changes{frenchb-1.4}{1999/07/08}{\cs{newif} only in LaTeX.}
% \changes{frenchb-1.4}{1999/07/08}{Add a hook \cs{FrenchLabelItem}
%    which defaults to \cs{textendash}, this was suggested by
%    Michel Bovani to allow some customization of label items.}
% \changes{frenchb-1.5a}{2001/01/02}{Redesign \cs{itemize} to allow
%    users to change the markers of any level in itemize lists.}
%    \begin{macrocode}
% \changes{frenchb-1.5g}{2001/09/09}{\cs{parskip} is of type `skip',
%    its mean value only (not the glue) should be moved from
%    \cs{topsep} to \cs{partopsep}: substracting glue can lead to 
%    weird results. Bug pointed out by Michel Bovani.}
\newif\ifFrenchItemizeSpacing \FrenchItemizeSpacingtrue
\ifLaTeX
  \newcommand{\FrenchLabelItem}{\textendash}
  \newcommand{\Frlabelitemi}{\FrenchLabelItem}
  \newcommand{\Frlabelitemii}{\FrenchLabelItem}
  \newcommand{\Frlabelitemiii}{\FrenchLabelItem}
  \newcommand{\Frlabelitemiv}{\FrenchLabelItem}
  \def\bbl@frenchitemize{%
    \let\@ltiORI\labelitemi
    \let\@ltiiORI\labelitemii
    \let\@ltiiiORI\labelitemiii
    \let\@ltivORI\labelitemiv
    \let\itemizeORI\itemize
    \let\labelitemi\Frlabelitemi
    \let\labelitemii\Frlabelitemii
    \let\labelitemiii\Frlabelitemiii
    \let\labelitemiv\Frlabelitemiv
    \ifFrenchItemizeSpacing
%    \end{macrocode}
%    Make sure |\itemize| uses |\@trivlistORI| even with 
%    |\FrenchOldTrivlisttrue|.
%    \begin{macrocode}
      \def\itemize{\let\@trivlist\@trivlistORI
        \ifnum \@itemdepth >\thr@@\@toodeep\else
        \advance\@itemdepth\@ne
        \edef\@itemitem{labelitem\romannumeral\the\@itemdepth}%
        \expandafter
        \listORI
        \csname\@itemitem\endcsname
        {\settowidth{\labelwidth}{\csname\@itemitem\endcsname}%
         \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@}%
%    \end{macrocode}
%    |\parskip| is of type `skip', its mean value only (\emph{not
%    the glue}) should be substracted from |\topsep| and added to
%    |\partopsep|, so convert |\parskip| to a `dimen' using
%    |\@tempdima|.
%    \begin{macrocode}
         \@tempdima=\parskip
         \addtolength{\topsep}{-\@tempdima}%
         \addtolength{\partopsep}{\@tempdima}}%
        \fi}%
     \fi}
%    \end{macrocode}
%  The user's changes in labelitems are saved when leaving French
%  for further use when switching back to French.
%    \begin{macrocode}
  \def\bbl@nonfrenchitemize{\let\Frlabelitemi\labelitemi
                            \let\Frlabelitemii\labelitemii
                            \let\Frlabelitemiii\labelitemiii
                            \let\Frlabelitemiv\labelitemiv
                            \let\labelitemi\@ltiORI
                            \let\labelitemii\@ltiiORI
                            \let\labelitemiii\@ltiiiORI
                            \let\labelitemiv\@ltivORI
                            \let\itemize\itemizeORI}
  \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}
%  \label{sec-indent}
%
%  \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{sec-numbers}
%
% \changes{frenchb-1.4}{1999/10/02}{Add a hook to let the comma
%    be in math-mode of type \cs{mathord} in French, as a decimal
%    separator should be.}
%  \begin{macro}{\DecimalMathComma}
%  \begin{macro}{\StandardMathComma}
%    As mentioned in the \TeX{}book p.~134, the comma is of type
%    |\mathpunct| in math-mode: it is automatically followed by a
%    space. This is convenient in lists and intervals but
%    unpleasant when the comma is used as a decimal separator
%    in French: it has to be entered as |{,}|.
%    |\DecimalMathComma| makes the comma be an ordinary character
%    (of type |\mathord|) in French \emph{only} (no space added);
%    |\StandardMathComma| switches back to the standard behaviour
%    of the comma.
%    \begin{macrocode}
\newcommand{\DecimalMathComma}{\iflanguage{french}%
                                 {\mathcode`\,="013B}{}%
              \addto\extrasfrench{\mathcode`\,="013B}}
\newcommand{\StandardMathComma}{\mathcode`\,="613B%
            \addto\extrasfrench{\mathcode`\,="613B}}
\expandafter\addto\csname noextras\CurrentOption\endcsname{%
   \mathcode`\,="613B}
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%
% \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: in math-mode, 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.}
% \changes{frenchb-1.4g}{2000/10/07}{Added a new hook
%   \cs{ThinSpaceInFrenchNumbers} to have thin spaces instead of
%    normal spaces (the default) when formatting French numbers.}
%    \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}
\def\ThinSpaceInFrenchNumbers{\def\f@thousandsep{%
                   \ifmmode\mskip3mu\else\penalty\@M\kern.16667em\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{sec-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).
%
% \changes{frenchb-1.4c}{1999/11/17}{Bug correction: \cs{xspace}
%    didn't work in \cs{dots} without amsmath.sty.}
%    The |\if| construction in the \LaTeXe{} definition of |\dots|
%    doesn't allow the use of |xspace| (|xspace| is always followed
%    by a |\fi|), so we use the AMS-\LaTeX{} construction of |\dots|;
%    this has to be done `AtBeginDocument' not to be overwritten
%    when \file{amsmath.sty} is loaded after babel.
% \changes{frenchb-1.4d}{2000/02/01}{AMS-LaTeX 2.0 provides a much
%    better spacing for \cs{dots} than 1.2, so let's take advantage
%    of it when amsmath (up to 1.2 or newer) is loaded.}
%  \begin{macro}{\Frtextellipsis}
%    \begin{macrocode}
\ifLaTeXe
  \DeclareTextCommandDefault{\Frtextellipsis}{%
    .\kern\fontdimen3\font.\kern\fontdimen3\font.\xspace}
%    \end{macrocode}
%    |\Mdots@| and |\Tdots@ORI| hold the definitions of |\dots| in
%    Math and Text mode. They default to those of amsmath-2.0, and
%    will revert to standard \LaTeX{} definitions `AtBeginDocument',
%    if amsmath has not been loaded. |\Mdots@| doesn't change when
%    switching from/to French, while |\Tdots@| is |\Frtextellipsis|
%    in French and |\Tdots@ORI| otherwise.
%    \begin{macrocode}
  \newcommand{\Tdots@ORI}{\@xp\textellipsis}
  \newcommand{\Tdots@}{\Tdots@ORI}
  \newcommand{\Mdots@}{\@xp\mdots@}
  \AtBeginDocument{\DeclareRobustCommand{\dots}{\relax
                   \csname\ifmmode M\else T\fi dots@\endcsname}%
                   \ifx\@xp\@undefined\let\@xp\relax\fi
                   \ifx\mdots@\@undefined\let\Tdots@ORI\textellipsis
                                         \let\Mdots@\mathellipsis\fi}
  \def\bbl@frenchdots{\let\Tdots@\Frtextellipsis}
  \def\bbl@nonfrenchdots{\let\Tdots@\Tdots@ORI}
  \expandafter\addto\csname extras\CurrentOption\endcsname{%
    \bbl@frenchdots}
  \expandafter\addto\csname noextras\CurrentOption\endcsname{%
    \bbl@nonfrenchdots}
\fi
%    \end{macrocode}
%  \end{macro}
%
%  \subsection{Global layout}
%  \label{sec-global}
%
% \changes{frenchb-1.4}{1999/10/03}{Added this section.}
%
%    In multilingual documents, some typographic rules must depend
%    on the current language (e.g., hyphenation, typesetting of
%    numbers, spacing before double punctuation\dots),
%    others should, IMHO, be kept global to the document:
%    especially the layout of lists (see~\ref{sec-lists})
%    and the indentation of the first paragraph of sections
%    (see~\ref{sec-indent}).
%
%  \begin{macro}{\FrenchLayout}
%  \begin{macro}{\StandardLayout}
%    In a multilingual document, a unified look, either the French
%    one or the standard one, can be assigned to the whole document:
%    adding |\FrenchLayout| will give a global ``French look'' to
%    the document (e.g., lists, regardless the current language, will
%    be typeset as in French) and |\StandardLayout| forces a global
%    ``US-English'' look.
%    Both of these commands can only be used \emph{before} the
%    |\begin{document}|.
%    |\StandardLayout| can also be of interest for class designers
%    who do not want |frenchb| to interfere with their global layout
%    choices.
%
%    As of version~1.4, |\FrenchLayout| and |\StandardLayout| only
%    affect:
%    \begin{itemize}
%      \item the layout of lists (see~\ref{sec-lists}),
%      \item the indentation of the first paragraph of sections
%        (see~\ref{sec-indent}).
%    \end{itemize}
%    \begin{macrocode}
\ifLaTeXe
  \newcommand{\FrenchLayout}{%
    \renewcommand{\StandardLayout}{%
      \PackageWarning{frenchb.ldf}%
        {\protect\StandardLayout\space makes no change\MessageBreak
         (\protect\FrenchLayout\space has been selected before
         \MessageBreak for the whole document)}%
    }%
    \AtBeginDocument{\bbl@frenchitemize\bbl@frenchlistspacing
                     \bbl@frenchindent}%
    \let\bbl@nonfrenchitemize\relax
    \let\bbl@nonfrenchlistspacing\relax
    \let\bbl@nonfrenchindent\relax}
  \newcommand{\StandardLayout}{%
    \renewcommand{\FrenchLayout}{%
      \PackageWarning{frenchb.ldf}%
        {\protect\FrenchLayout\space makes no change\MessageBreak
         (\protect\StandardLayout\space has been selected before
         \MessageBreak for the whole document)}%
    }%
    \let\bbl@frenchitemize\relax
    \let\bbl@frenchlistspacing\relax
    \let\bbl@frenchindent\relax}
  \@onlypreamble\FrenchLayout
  \@onlypreamble\StandardLayout
\fi
%    \end{macrocode}
%  \end{macro}
%  \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.}
% \changes{frenchb-1.4}{1999/10/03}{Add definitions for \cs{at},
%   \cs{circonflexe} and \cs{tild} in other encodings (mlTeX's LO1).}
%    \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}
  \DeclareTextSymbolDefault{\at}{OT1}
  \DeclareTextSymbolDefault{\circonflexe}{OT1}
  \DeclareTextSymbolDefault{\tild}{OT1}
  \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, EC 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}{\datefrench}
%    The macro |\datefrench| redefines the command |\today| to
%    produce French dates.
% \changes{frenchb-1.2}{1997/01/05}{Added aliases \cs{datefrenchb}
%    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{frenchb-1.3g}{1999/08/18}{Replaced \cs{edef} with \cs{def}
%    to prevent problems with unexpandable accent commands}
% \changes{frenchb-1.4d}{2000/02/01}{Changed \cs{noexpand}\cs{ier}
%    to \cs{ier}, as a result of the replacement of \cs{edef} by
%    \cs{def}, see previous change. Also add braces around \cs{ier}
%    for xspace.sty.}
%    \begin{macrocode}
\@namedef{date\CurrentOption}{%
  \def\today{\number\day
    \ifnum1=\day {\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}}
%    \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@quit| takes care for setting the main language
%    to be switched on at |\begin{document}| and resetting the
%    category code of \texttt{@} to its original value.
%    The config file searched for has to be `frenchb.cfg', and
%    |\CurrentOption| has been set to `french', so
%    |\ldf@finish\CurrentOption| cannot be used: we first load
%    `frenchb.cfg', then call |\ldf@quit\CurrentOption|.
% \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}.}
% \changes{frenchb-1.5d}{2001/02/16}{Load frenchb.cfg first and
%    change \cs{ldf@finish} to \cs{ldf@quit}.}
%    \begin{macrocode}
\loadlocalcfg{frenchb}
\ldf@quit\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
