summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/babel-contrib/french/frenchb.dtx
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/babel-contrib/french/frenchb.dtx
Initial commit
Diffstat (limited to 'macros/latex/contrib/babel-contrib/french/frenchb.dtx')
-rw-r--r--macros/latex/contrib/babel-contrib/french/frenchb.dtx5899
1 files changed, 5899 insertions, 0 deletions
diff --git a/macros/latex/contrib/babel-contrib/french/frenchb.dtx b/macros/latex/contrib/babel-contrib/french/frenchb.dtx
new file mode 100644
index 0000000000..d916f838ac
--- /dev/null
+++ b/macros/latex/contrib/babel-contrib/french/frenchb.dtx
@@ -0,0 +1,5899 @@
+%\CheckSum{3769}
+%
+%\iffalse
+% Tell the LaTeX system who we are and write an entry on the
+% transcript.
+%<*dtx>
+\ProvidesFile{frenchb.dtx}
+%</dtx>
+%<acadian>\ProvidesLanguage{acadian}
+%<canadien>\ProvidesLanguage{canadien}
+%<francais>\ProvidesLanguage{francais}
+%<french>\ProvidesLanguage{french}
+%<frenchb>\ProvidesLanguage{frenchb}
+%<lua>--[[
+%<lua> File `frenchb.lua’ generated from frenchb.dtx
+ [2019/03/30 v3.5e French support from the babel system]
+%<*internal>
+\iffalse
+%</internal>
+%<*lua>
+ Copyright © 2014-2019 Daniel Flipo
+ <daniel (dot) flipo (at) free (dot) fr>
+ License LPPL: see french.ldf.
+--]]
+%</lua>
+%<*internal>
+\fi
+%</internal>
+%<*dtx>
+%% File `frenchb.dtx’
+%</dtx>
+%<*dtx|french>
+%%
+%% Babel package for LaTeX version 2e
+%% Copyright © 1996-2019
+%% by Daniel Flipo <daniel (dot) flipo (at) free (dot) fr>
+%%
+%</dtx|french>
+%<*dtx>
+%% This file is part of the babel system, it provides the source
+%% code for the French language definition file.
+%%
+%</dtx>
+%<*filedriver>
+\documentclass[a4paper]{ltxdoc}
+\usepackage[left=42mm,right=42mm,top=40mm,bottom=40mm]{geometry}
+\usepackage[utf8]{inputenc}
+\usepackage{bera,textcomp}
+\renewcommand{\rmdefault}{fvs}
+\usepackage{array}
+\usepackage[dvipsnames]{xcolor}
+\def\PrintMacroName#1{%
+ \strut\MacroFont\color{Sepia}\normalsize\string#1}
+\usepackage[expansion=true,protrusion=true]{microtype}
+\def\ColorArg{\color{PineGreen}}
+\usepackage{url}
+\usepackage[numbered]{hypdoc}
+\hypersetup{colorlinks,urlcolor=blue,unicode}
+\newcommand*{\hlabel}[1]{\phantomsection\label{#1}}
+\newcommand*\babel{\textsf{babel}}
+\newcommand*\frenchb{\textsf{babel-french}}
+\newcommand*\file[1]{\texttt{#1}}
+\newcommand*\cls[1]{\texttt{#1}}
+\newcommand*\pkg[1]{\texttt{#1}}
+\newcommand*\opt[1]{\texttt{#1}}
+\newcommand*\env[1]{\texttt{#1}}
+\newcommand*\exe[1]{\texttt{#1}}
+\newcommand*\fbo[1]{\texttt{\ColorArg #1}}
+\newcommand*\fbsetup[1]{\cs{frenchsetup\{\fbo{#1}\}}}
+\renewcommand\meta[1]{\textit{<#1>}} % no math mode (see doc.sty)
+\let\Module\meta % no math mode (see doc.sty)
+\renewcommand*\descriptionlabel[1]{%
+ \hspace\labelsep \normalfont \fbo{#1}}
+\let\up\textsuperscript
+\newcommand*{\FRguillspace}{\penalty 10000
+ \hskip.8\fontdimen2\font
+ plus.3\fontdimen3\font
+ minus.8\fontdimen4\font}
+\hyphenation{Lua-TeX Lua-LaTeX Xe-LaTeX}
+\lefthyphenmin=2 \righthyphenmin=3
+\RecordChanges
+\AtEndDocument{%
+ \clearpage
+ \section{Change History}%
+ \GlossaryPrologue{}%
+ Changes are listed in reverse order (latest first) and limited to
+ \frenchb{}~v3.
+ \PrintChanges
+}
+\begin{document}
+\setlength{\parindent}{0pt}
+\GetFileInfo{frenchb.dtx}
+\begin{center}
+ \textbf{\Large A Babel language definition file for French}\\[2mm]^^A\]
+ \textbf{\large frenchb.dtx \fileversion, \filedate}\\[3mm]^^A\]
+ Daniel Flipo\\
+ \texttt{daniel.flipo@free.fr}
+\end{center}
+\vspace{2\baselineskip}
+\thispagestyle{empty}
+\tableofcontents
+\clearpage
+\DocInput{frenchb.dtx}
+\end{document}
+%</filedriver>
+%\fi
+%
+% \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.}, defines all the language definition macros for the
+% French language.
+%
+% Customisation for the French language is achieved following the
+% book ``Lexique des règles typographiques en usage à
+% l’Imprimerie Nationale’’ troisième édition (1994),
+% ISBN-2-11-081075-0.
+%
+% First version released: 1.1 (May 1996) as part of
+% \babel-3.6beta. Version~2.0a was released in February 2007 and
+% version~3.0a in February 2014.
+%
+% \frenchb{} has been improved using helpful suggestions from many
+% people, mainly from Jacques André, Michel Bovani, Thierry Bouche,
+% Vincent Jalby, Denis Bitouzé and Ulrike Fisher.
+% Thanks to all of them!
+%
+% LaTeX-2.09 is no longer supported.
+% This new version (3.x) has been designed to be used only with
+% LaTeX2e and Plain formats based on TeX, pdfTeX, LuaTeX or XeTeX
+% engines.
+%
+% Changes between version 3.0 and \fileversion{} are listed in
+% subsection~\ref{ssec-changes} p.~\pageref{ssec-changes}.
+%
+% An extensive documentation in French (file \file{frenchb-doc.pdf}) is
+% now included in \frenchb.
+%
+% \subsection{Basic interface}
+%
+% In a multilingual document, some typographic rules are language
+% dependent, i.e.\ spaces before `high punctuation’ (|:| |;| |!|
+% |?|) in French, others modify the general layout (i.e.\ layout of
+% lists, footnotes, indentation of first paragraphs of sections) and
+% should apply to the whole document.
+%
+% The French language can be loaded with \babel{} by a command like:
+% \\ |\usepackage[german,spanish,french,british]{babel}|%
+% \footnote{\emph{Always} use \opt{french} as option name for the
+% French language, former aliases \opt{frenchb} or \opt{francais}
+% are \emph{depreciated}; expect them to be removed sooner or later!}
+%
+% \frenchb{} takes account of \babel’s \emph{main language} defined
+% as the \emph{last} option at \babel’s loading. When French is
+% not \babel’s main language, \frenchb{} does not alter the general
+% layout of the document (even in parts where French is the current
+% language): the layout of lists, footnotes, indentation of first
+% paragraphs of sections are not customised by \frenchb.
+%
+% When French is loaded as the last option of \babel, \frenchb{}
+% makes the following changes to the global layout, \emph{both in
+% French and in all other languages}\footnote{%
+% For each item, hooks are provided to reset standard
+% LaTeX settings or to emulate the behavior of former versions
+% of \frenchb{} (see command \fbsetup{},
+% section~\ref{ssec-custom} p.~\pageref{ssec-custom}).}:
+% \begin{enumerate}
+% \item the first paragraph of each section is indented
+% (LaTeX only);
+% \item the default items in itemize environment are set to `---’
+% instead of `\textbullet’, and all vertical spacing and glue
+% is deleted; it is possible to change `---’ to something else
+% (`--’ for instance) using \fbsetup{} (see
+% section~\ref{ssec-custom} p.~\pageref{ssec-custom});
+% \item vertical spacing in general LaTeX lists is
+% shortened;
+% \item footnotes are displayed ``à la française’’.
+% \item the separator following the table or figure number in
+% captions is printed as `~--~’ instead of `:~’;
+% for changing this see~\ref{sssec-captions-fig}
+% p.~\pageref{sssec-captions-fig}.
+% \end{enumerate}
+%
+% Regarding local typography, the command |\selectlanguage{french}|
+% switches to the French language\footnote{%
+% \cs{selectlanguage\{francais\}} and
+% \cs{selectlanguage\{frenchb\}} are no longer supported.},
+% with the following effects:
+% \begin{enumerate}
+% \item French hyphenation patterns are made active;
+% \item `high punctuation’ characters (|:| |;| |!| |?|)
+% automatically add correct spacing%
+% \footnote{Well, the automatic insertion may add unwanted
+% spaces in some cases, for correction see
+% \fbo{AutoSpacePunctuation} option and \cs{NoAutoSpacing}
+% command p.~\pageref{autospacepunctuation}.}
+% in French; this is achieved using callbacks in Lua(La)TeX
+% or `XeTeXinterchar’ mechanism in Xe(La)TeX; with TeX’82 and
+% pdf(La)TeX these four characters are made active in the
+% whole document;
+% \item |\today| prints the date in French;
+% \item the caption names are translated into French
+% (LaTeX only). For customisation of caption names see
+% section~\ref{sssec-captions-name}
+% p.~\pageref{sssec-captions-name}.
+% \item the space after |\dots| is removed in French.
+% \end{enumerate}
+%
+% Some commands are provided by \frenchb{} to make typesetting
+% easier:
+% \begin{enumerate}
+% \item French quotation marks can be entered using the commands
+% |\og| and |\fg| which work in LaTeX2e and PlainTeX,
+% their appearance depending on what is available to draw
+% them; even if you use LaTeX2e \emph{and} |T1|-encoding,
+% you should refrain from entering them as
+% |<<~French quotation~>>|: |\og| and |\fg| provide
+% better horizontal spacing (controlled by |\FBguillspace|).
+% If French quote characters are available on your keyboard,
+% you can use them, to get proper spacing in LaTeX2e see
+% option \fbo{og=«, fg=»} p.~\pageref{option-og-fg}.
+%
+% |\og| and |\fg| can be used outside French, they typeset
+% then English quotes `` and ’’.
+%
+% A new command |\frquote{}| has been added in version~3.1 to
+% enter French quotations. |\frquote{|\textit{texte}|}| is
+% equivalent to |\og| \textit{texte} |\fg{}| for short
+% quotations.\hlabel{frquote}
+% For quotations spreading over more than one paragraph,
+% |\frquote| will add at the beginning of every paragraph of
+% the quotation either an opening French guillemet («), or
+% a closing one (») or nothing depending on option
+% \fbo{EveryParGuill=open} or \fbo{=close} or \fbo{=none},
+% see p.~\pageref{everyparguill}.
+% Command |\NoEveryParQuote| is provided to locally suppress
+% unwanted guillemets (typically when lists are embedded in
+% |\frquote{}|), it is meant to be used inside an environment
+% or a group.
+%
+% |\frquote| is recommended to enter embedded quotations ``à la
+% française’’, several variants are provided through options.
+% \begin{itemize}
+% \item with all engines: the inner quotation
+% is surrounded by double quotes (``\textit{texte}’’)
+% unless option \fbo{InnerGuillSingle=true}, then
+% a) the inner quotation is printed as
+% \guilsinglleft\FRguillspace\textit{texte}\FRguillspace
+% \guilsinglright{} and b) if the inner quotation
+% spreads over more than one paragraph, every paragraph
+% included in the inner quotation starts with
+% a \guilsinglleft{} or a \guilsinglright{} or nothing,
+% depending on option \fbo{EveryParGuill=open} (default)
+% or \fbo{=close} or \fbo{=none}.
+% \item with LuaTeX based engines, it is possible to add a
+% French opening or closing guillemet (« or ») at the
+% beginning of every line of the inner quotation using
+% option \fbo{EveryLineGuill=open} or \fbo{=close}; note
+% that with any of these options, the inner quotation is
+% surrounded by French guillemets (« and ») regardless
+% option \fbo{InnerGuillSingle};
+% the default is \fbo{EveryLineGuill=none} so that
+% |\frquote{}| behaves as with non-LuaTeX engines.
+% \end{itemize}
+% A starred variant |\frquote*| is meant for inner quotations
+% which end together with the outer one: using |\frquote*| for
+% the inner quotation will print only one closing quote
+% character (the outer one) as recommended by the French
+% `Imprimerie Nationale’.
+%
+% \item |\frenchdate|\marg{year}\marg{month}\marg{day} helps
+% typesetting dates in French: |\frenchdate{2001}{01}{01}|
+% will print 1\up{er} janvier 2001 in a box without any
+% linebreak.\label{frenchdate}
+%
+% \item A command |\up| is provided to typeset superscripts like
+% |M\up{me}| (abbreviation for ``Madame’’), |1\up{er}| (for
+% ``premier’’). Other commands are also provided for
+% ordinals: |\ier|, |\iere|, |\iers|, |\ieres|, |\ieme|,
+% |\iemes| (|3\iemes| prints 3\up{es}).
+% All these commands take advantage of real superscript
+% letters when they are available in the current font.
+%
+% \item Family names should be typeset in small capitals and never
+% be hyphenated, the macro |\bsc| (boxed small caps) does
+% this, e.g., |L.~\bsc{Lamport}| will print the same as
+% |L.~\mbox{\textsc{Lamport}}|. Note that composed names
+% (such as Dupont-Durant) may now be hyphenated on explicit
+% hyphens, this differs from \frenchb~v.~1.x.
+%
+% \item Commands |\primo|, |\secundo|, |\tertio| and |\quarto|
+% print 1\up{o}, 2\up{o}, 3\up{o}, 4\up{o}.
+% |\FrenchEnumerate{6}| prints 6\up{o}.
+% \item Abbreviations for ``Numéro(s)’’ and ``numéro(s)’’
+% (N\up{o} N\up{os} n\up{o} and n\up{os}~) are obtained
+% via the commands |\No|, |\Nos|, |\no|, |\nos|.
+%
+% \item Two commands are provided to typeset the symbol for
+% ``degré’’: |\degre| prints the raw character and
+% |\degres| should be used to typeset temperatures (e.g.,
+% ``|20~\degres C|’’ with a non-breaking 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 behave as an
+% ordinary character \emph{when the current language is French}
+% (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 in French.
+%
+% The \pkg{icomma} package is an alternative workaround.
+%
+% \item A command |\nombre| was provided in 1.x versions to easily
+% format numbers in slices of three digits separated either
+% by a comma in English or with a space in French; |\nombre|
+% is now mapped to |\numprint| from \file{numprint.sty}, see
+% \file{numprint.pdf} for more information.
+%
+% \item \frenchb{} has been designed to take advantage of the
+% \pkg{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\up{er} juin’
+% (no need for a forced space after |1\ier|).
+% \end{enumerate}
+%
+% \subsection{Customisation}
+% \label{ssec-custom}
+%
+% Customisation of \frenchb{} relies on command \fbsetup{}
+% (formerly called |\frenchbsetup{}|, the latter name will be kept
+% for ever to ensure backwards compatibility), options are entered
+% using the \file{keyval} syntax.
+% The command \fbsetup{} is to appear in the preamble only
+% (after loading \babel).
+%
+% \subsubsection[\textbackslash frenchsetup{}]
+% {\fbsetup{options}}
+% \label{sssec-frenchbsetup}
+%
+% \vspace{.5\baselineskip}
+% |\frenchsetup{}| and |\frenchbsetup{}| are synonymous;
+% the latter should be preferred as the language name for
+% French in \babel{} is no longer |frenchb| but |french|.
+%
+% \fbsetup{ShowOptions} prints all available options to
+% the \file{.log} file, it is just meant as a remainder of the
+% list of offered options. As usual with \file{keyval} syntax,
+% boolean options (as \fbo{ShowOptions}) can be entered as
+% \fbo{ShowOptions=true} or just \fbo{ShowOptions}, the
+% \fbo{=true} part can be omitted.
+%
+% \vspace{.5\baselineskip}
+% The other options are listed below. Their default value is
+% shown between braces, sometimes followed be a `\texttt{*}’.
+% The `\texttt{*}’ means that the default shown applies when
+% \frenchb{} is loaded as the \emph{last} option of \babel{}
+% ---\babel’s \emph{main language}---, and is toggled otherwise.
+% \begin{description}
+% \item [StandardLayout=true (false*)] forces \frenchb{} not to
+% interfere with the layout: no action on any kind of lists,
+% first paragraphs of sections are not indented (as in English),
+% no action on footnotes; it useless unless French is the main
+% language. This option can be used to avoid conflicts with
+% classes or packages which customise lists or footnotes.
+% \item [GlobalLayoutFrench=false (true*)] can only be used when
+% French is the main language; setting it to \fbo{false} will
+% emulate what prior versions of \frenchb{} (pre-2.2) did:
+% lists, and first paragraphs of sections will be displayed
+% the standard way in other languages than French, and ``à la
+% française’’ in French (changing the layout inside a document
+% is a bad practice imho). Note that the layout of footnotes is
+% language independent anyway (see below \fbo{FrenchFootnotes}
+% and \fbo{AutoSpaceFootnotes}).
+% \item [IndentFirst=false (true*)]; set this option to \fbo{false}
+% if you do not want \frenchb{} to force indentation of the
+% first paragraph of sections. When French is the main language,
+% this option applies to all languages.
+% \item [PartNameFull=false (true)]; when true, \frenchb{} numbers
+% the title of |\part{}| commands as ``Première partie’’,
+% ``Deuxième partie’’ and so on. With some classes which
+% change the |\part{}| command (AMS classes do so), you could
+% get ``Première partie~1’’, ``Deuxième partie~2’’ in the toc;
+% when this occurs, this option should be set to
+% \fbo{false}, part titles will then be printed as ``Partie I’’,
+% ``Partie II’’.
+%
+% \item [ListItemsAsPar=true (false)] setting this option to
+% \fbo{true} is recommended: list items will be displayed as
+% paragraphs with indented labels (in the ``Imprimerie Nationale’’
+% way) instead of having labels hanging into the left margin.
+% How these two layouts differ is shown below:\\[.5\baselineskip]
+% \fbox{\parbox[t]{.4\textwidth}{\raggedright
+% \parindent=1.5em
+% \def\FBlabel{\textemdash}%
+% \settowidth{\labelwidth}{\FBlabel}%
+% Text starting at `parindent’ \\
+% \noindent<= Leftmargin\par
+% \textemdash{} first item running on two
+% \hspace*{\parindent}\hspace*{\labelwidth}
+% lines or more\dots{}\par
+% \hspace*{\labelwidth} \textemdash{} first second level
+% \hspace*{\parindent}\hspace*{\labelwidth}%
+% \hspace*{\labelwidth} item on two lines\dots{}\par
+% \hspace*{\labelwidth} \textemdash{} next one\dots{}\par
+% \textemdash{} second item\dots
+% }}
+% \hfill \hlabel{ListAsPar}%
+% \fbox{\parbox[t]{.4\textwidth}{\raggedright
+% \parindent=1.5em
+% \def\FBlabel{\textemdash}%
+% \settowidth{\labelwidth}{\FBlabel}%
+% Text starting at `parindent’ \\
+% \noindent<= Leftmargin\par
+% \textemdash{} first item running on two
+% lines or more\dots{}\par
+% \hspace*{\labelwidth} \textemdash{} first second level
+% \hspace*{\parindent} item on two lines\dots{}\par
+% \hspace*{\labelwidth} \textemdash{} next one\dots{}\par
+% \textemdash{} second item\dots
+% }}\par
+% Default French layout%
+% \hspace{\fill}With \fbo{ListItemsAsPar=true}%
+% \item [StandardListSpacing=true (false*)]%
+% \footnote{This option should be used instead of former option
+% \fbo{ReduceListSpacing} (kept for backward compatibility) which
+% could be misleading: with some classes (smfart, smfbook f.i.)
+% you had to set \fbo{ReduceListSpacing=false} to revert to the
+% class settings which actually reduce list’s spacings even more
+% than \frenchb! \fbo{StandardListSpacing=true} replaces
+% \fbo{ReduceListSpacing=false}.}; \frenchb{} customises
+% the vertical spaces in the \env{list} environment, this affects
+% all lists, including \env{itemize} \env{enumerate},
+% \env{description}, but also \env{abstract}, \env{quote},
+% \env{quotation}, \env{verse}, etc. which are based on \env{list}.
+% Setting this option to \fbo{true} reverts to the standard
+% settings of the \env{list} environment as defined by the document
+% class.
+% \item [StandardItemizeEnv=true (false*)]; \frenchb{} redefines
+% the \env{itemize} environment to suppress any vertical space
+% between items of \env{itemize} lists in French and customises
+% left margins. Setting this option to \fbo{true} reverts to
+% the standard definition of \env{itemize}.
+% \item [StandardEnumerateEnv=true (false*)]; starting with
+% version~2.6 \frenchb{} redefines the \env{enumerate} and
+% \env{description} environments to make left margins match those
+% of the French version of \env{itemize} lists. Setting this
+% option to \fbo{true} reverts to the standard definition of
+% \env{enumerate} and \env{description}.
+% \item [StandardItemLabels=true (false*)] when set to \fbo{true}
+% this option prevents \frenchb{} from changing the labels in
+% \env{itemize} lists in French.
+% \item [ItemLabels=\cs{textbullet}, \cs{textendash},
+% \cs{ding\{43\}},...(\cs{textemdash}*)];\\
+% when \fbo{StandardItemLabels=false} (the default), this option
+% enables to choose the label used in French \env{itemize} lists
+% for all levels. The next four options do the same but each
+% one for a specific level only. Note that the example
+% |\ding{43}| requires |\usepackage{pifont}|.
+% \item [ItemLabeli=\cs{textbullet}, \cs{textendash},
+% \cs{ding\{43\}},...(\cs{textemdash}*)]
+% \item [ItemLabelii=\cs{textbullet}, \cs{textendash},
+% \cs{ding\{43\}},...(\cs{textemdash}*)]
+% \item [ItemLabeliii=\cs{textbullet}, \cs{textendash},
+% \cs{ding\{43\}},..(\cs{textemdash}*)]
+% \item [ItemLabeliv=\cs{textbullet}, \cs{textendash},
+% \cs{ding\{43\}},...(\cs{textemdash}*)]
+% \item [StandardLists=true (false*)] forbids \frenchb{} to
+% customise any kind of list. Try the option \fbo{StandardLists}
+% in case of conflicts with classes or packages that customise
+% lists too. This option is just a shorthand setting all four
+% options \fbo{StandardListSpacing=true},
+% \fbo{StandardItemizeEnv=true}, \fbo{StandardEnumerateEnv=true}
+% and \fbo{StandardItemLabels=true}.
+% \item [ListOldLayout=true (false)]; starting with version~2.6a,
+% the layout of lists has changed regarding leftmargins’ sizes
+% and default itemize label (`---’ instead of `--’ up to~2.5k).
+% This option, provided for backward compatibility, displays
+% lists as they were up to version~2.5k.
+%
+% \item [FrenchFootnotes=false (true*)] reverts to the standard
+% layout of footnotes. By default \frenchb{} typesets leading
+% numbers as `1.\hspace{.5em}’ instead of `\up{1}’, but
+% has no effect on footnotes numbered with symbols (as in the
+% |\thanks| command). Two commands |\StandardFootnotes|
+% and |\FrenchFootnotes| are available to change the layout of
+% footnotes locally; |\StandardFootnotes| can help when some
+% footnotes are numbered with letters (inside minipages for
+% instance).
+% \item [AutoSpaceFootnotes=false (true*)]; by default \frenchb{}
+% adds a thin space in the running text before the number or
+% symbol calling the footnote. Making this option \fbo{false}
+% reverts to the standard setting (no space added).
+%
+% \item [AutoSpacePunctuation=false (true)]; in French, the user
+% \hlabel{autospacepunctuation}
+% \emph{should} input a space before the four characters `|:;!?|’
+% but as many people forget about it (even among native French
+% writers!), the default behaviour of \frenchb{} is to
+% automatically typeset non-breaking spaces the width of which is
+% either |\FBthinspace| (defauts to a thin space) before `|;|’
+% `|!|’ `|?|’ or |\FBcolonspace| (defauts to |\space|) before
+% `|:|’; the defaults follow the French `Imprimerie Nationale’s
+% recommendations. This is convenient in most cases but can lead
+% to addition of spurious spaces in URLs, in MS-DOS paths or in
+% timetables (10:55) ---this no longer occurs with LuaTeX---,
+% except if they are typed in |\texttt| or verbatim mode.
+% When the current font is a monospaced (typewriter) font,
+% no spurious space is added in that case%
+% \footnote{Unless option \fbo{OriginalTypewriter} is set,
+% \cs{ttfamily} is redefined in French to switch off space
+% tuning, see below.},
+% so the default behaviour of of \frenchb{} in that area should
+% be fine in most circumstances.
+%
+% Choosing \fbo{AutoSpacePunctuation=false} will ensure that
+% a proper space is added before `|:;!?|’ \emph{if and only if}
+% a (normal) space has been typed in. This option gives full
+% control on space insertion before `|:;!?|’. Those who are
+% unsure about their typing in this area should stick to the
+% default option and use the provided |\NoAutoSpacing| command
+% inside a group in case an unwanted space is added by \frenchb{}
+% (i.e.\ |{\NoAutoSpacing http://mysite}|%
+% \footnote{Actually, this is needed only with the XeTeX and
+% pdfTeX engines. LuaTeX no longer inserts any space in strings
+% like http://mysite, C:\textbackslash Foo, 10:55…}
+% or |{\NoAutoSpacing ???}| (needed for pdfTeX only).
+% \item [ThinColonSpace=true (false)] changes the inter-word
+% non-breaking space added before the colon `:’ to a thin space,
+% so that the same amount of space is added before any of the
+% four `high punctuation’ characters. The default setting is
+% supported by the French `Imprimerie Nationale’.
+% \item [OriginalTypewriter=true (false)] prevents any
+% customisation of |\ttfamily| and |\texttt{}| in French.
+% This option should only be used to ensure backward compatibility.
+% The current default behaviour is to switch off any addition of
+% space before high punctuation with typewriter fonts
+% (\textit{e.g.} verbatim).
+% \item [UnicodeNoBreakSpaces=true (false)];\hlabel{ucs-nbsp}
+% (experimental) this option should be set to \fbo{true}
+% \emph{only while converting LuaLaTeX files} to HTML.
+% It ensures that non-breaking spaces added by \frenchb{} are
+% inserted in the PDF file as U+A0 or U+202F (thin) instead of
+% penalties and glues.
+% Note that \exe{lwarp} (v.~0.37 and up) is fully compatible with
+% \frenchb{} for translating PDFLaTeX or XeLaTeX files to HTML.
+%
+% \item [og=«, fg=»]; when guillemets characters are available on
+% the keyboard (through a compose key for instance), it is nice
+% to use them instead of typing |\og| and |\fg|. This option
+% tells \frenchb{} which characters are opening and closing
+% French guillemets (they depend on the input encoding), then
+% you can type either \hlabel{option-og-fg}
+% \texttt{« guillemets »} or \texttt{«guillemets»} (with or
+% without spaces) to get properly typeset French quotes.
+% This option works with LuaLaTeX and XeLaTeX; with pdfLaTeX it
+% requires \file{inputenc} to be loaded with a proper encoding:
+% 8-bits encoding (latin1, latin9, ansinew, applemac,\dots) or
+% multi-byte encoding (utf8, utf8x).
+% \item [INGuillSpace=true (false)] resets the dimensions of spaces
+% after opening French quotes and before closing French quotes to
+% the French `Imprimerie Nationale’ standards (inter-word space).
+% \frenchb’s default setting produces slightly narrower spaces
+% with less stretchability.
+% \item [EveryParGuill=open, close, none (open)]; sets whether
+% an opening quote (\texttt{«}) or a closing one (\texttt{»}) or
+% nothing should be printed by |\frquote{}| at the beginning of
+% every parapraph included in a level 1 (outer) quotation.
+% This option is also considered for level 2 (inner) quotations
+% to decide between \texttt{\guilsinglleft} and
+% \texttt{\guilsinglright} when \fbo{InnerGuillSingle=true}
+% (see below). \hlabel{everyparguill}
+% \item [EveryLineGuill=open, close, none (none)]; with LuaTeX
+% based engines \emph{only}, it is possible to set this option
+% to \fbo{open} [resp. \fbo{close}]; this ensures that a `«’
+% [resp. `»’] followed by a proper space will be inserted at the
+% beginning of every line of embedded (inner) quotations
+% spreading over more than one line (provided that both outer
+% and inner quotations are entered with |\frquote{}|). When
+% \fbo{EveryLineGuill=open} or \fbo{=close} the inner quotation is
+% always surrounded by « and », the next option is ineffective.
+% \item [InnerGuillSingle=true (false)];
+% if \fbo{InnerGuillSingle=false} (default), inner quotations
+% entered with |\frquote{}| start with~\texttt{``} and end
+% with~\texttt{’’}.
+% If \fbo{InnerGuillSingle=true}, \texttt{\guilsinglleft} and
+% \texttt{\guilsinglright} are used instead of British double
+% quotes; moreover if option \fbo{EveryParGuill=open} (or
+% \fbo{close}) is set, a \texttt{\guilsinglleft} (or
+% \texttt{\guilsinglright}) is added at the beginning of every
+% parapraph included in the inner quotation.
+%
+% \item [ThinSpaceInFrenchNumbers=true (false)]; if \pkg{numprint}
+% has been loaded with the \opt{autolanguage} option, while
+% typesetting numbers with the |\numprint{}| command,
+% |\npthousandsep| is defined as a non-breaking space (|~|)%
+% \footnote{Actually without stretch nor shrink.} in French;
+% when set to true, this option redefines |\npthousandsep|
+% as a thin space (|\,|).
+%
+% \item [SmallCapsFigTabCaptions=false (true*)]; when set to
+% \fbo{false}, |\figurename| and |\tablename| will be printed in
+% French captions as ``Figure’’ and ``Table’’ instead of being
+% printed in small caps (the default).
+% \item [CustomiseFigTabCaptions=false (true*)]; when \fbo{false}
+% the default separator (colon) is used instead of
+% |\CaptionSeparator|. Anyway, \frenchb{} tries hard to insert
+% a proper space before it and warns if it fails to do so.
+% \item [OldFigTabCaptions=true (false)] is to be used when
+% figures’ and tables’ captions must be typeset as with pre~3.0
+% versions of \frenchb{} (with |\CaptionSeparator| in French and
+% colon otherwise). Intended for standard LaTeX classes only.
+%
+% \item [FrenchSuperscripts=false (true)]; then
+% |\up=\textsuperscript|. % (option added in version 2.1).
+% Should only be made \fbo{false} to recompile documents written
+% before 2008 without changes: by default |\up| now relies on
+% |\fup| designed to produce better looking superscripts.
+% \item [LowercaseSuperscripts=false (true)]; by default \frenchb{}
+% inhibits the uppercasing of superscripts (for instance when
+% they are moved to page headers). Making this option
+% \fbo{false} will disable this behaviour (not recommended).
+% \item [SuppressWarning=true (false)]; can be turned to \fbo{true}
+% if you are bored with \frenchb’s warnings; use this option as
+% \emph{first} option of \fbsetup{} to cancel warnings launched
+% by other options.
+% \end{description}
+%
+% \textbf{Options’ order} -- Please remember that options are read
+% in the order they appear in the \fbsetup{} command.
+% Someone wishing that \frenchb{} leaves the layout of lists
+% and footnotes untouched but caring for indentation of first
+% paragraph of sections should choose\\
+% \fbsetup{StandardLayout,IndentFirst} to get the expected
+% layout. The reverse order
+% \fbsetup{IndentFirst,StandardLayout} would lead to option
+% \fbo{IndentFirst} being overwritten by \fbo{StandardLayout}.
+%
+% \subsubsection{Caption names}
+% \label{sssec-captions-name}
+%
+% All caption names can easily be customised in French using the
+% simplified syntax introduced by \babel~3.9, for instance
+% |\def\frenchproofname{Preuve}| or
+% |\def\acadianproofname{Preuve}| for the \opt{acadian} dialect.
+% The older syntax |\addto\captionsfrench{\def\proofname{Preuve}}|
+% still works. Keep in mind that \emph{only} |french| can be used
+% to redefine captions, even if \babel{}’s option was entered as
+% |frenchb| or |francais|.
+%
+% \subsubsection{Figure and table captions}
+% \label{sssec-captions-fig}
+%
+% In French, captions in figures and tables should never be printed
+% as ‘Figure~1: ’ which is the default in standard LaTeX2e
+% classes (a space should \emph{always} preceed a colon in French),
+% anyway ‘Figure 1 -- ’ is preferred.
+%
+% When French is the main language, the default behaviour of
+% \frenchb{} is to change the separator (colon) used in figures’ and
+% tables’ captions \emph{for all languages} to |\CaptionSeparator|
+% which defaults to ` -- ’ and can be redefined in the preamble with
+% |\renewcommand*{\CaptionSeparator}{...}|.
+% This works for the standard LaTeX2e classes, for the \cls{memoir}
+% and koma-script classes.
+% In case this procedure fails a warning is issued.
+%
+% When French is not the main language, the colon is preserved for
+% all languages including French but \frenchb{} tries hard to insert
+% a proper space before it and warns if it fails to do so.
+%
+% Three options are provided to customise figure and table captions:
+% \begin{itemize}
+% \item if \fbo{CustomiseFigTabCaptions} is set to \fbo{false} the
+% colon will be used as separator in all languages, with a proper
+% space before the colon in French (if possible);
+% \item the second option, \fbo{OldFigTabCaptions}, can be set to
+% \fbo{true} to print figures’ and tables’ captions as they were
+% with versions pre~3.0 of \frenchb{} (using |\CaptionSeparator|
+% in French and colon in other languages); this option only makes
+% sense with the standard LaTeX classes \cls{article},
+% \cls{report} and \cls{book};
+% \item the last option, \fbo{SmallCapsFigTabCaptions}, can be set
+% to \fbo{false} to typeset |\figurename| and |\tablename| in
+% French as ``Figure’’ and ``Table’’ rather than in small caps
+% (the default).
+% \end{itemize}
+%
+% \subsection{Hyphenation checks}
+% \label{ssec-hyphen}
+%
+% Once you have built your format, a good precaution would be to
+% perform some basic tests about hyphenation in French.
+% For LaTeX2e I suggest this:
+% \begin{itemize}
+% \item run |pdfLaTeX| on the following file:\\[3mm]^^A\]
+% |%%% Test file for French hyphenation.|\\
+% |\documentclass[french]{article}|\\
+% |\usepackage[utf8]{inputenc} % utf8, what else?|\\
+% |\usepackage[T1]{fontenc} % mandatory for French|\\
+% |\usepackage{lmodern} % or erewhon, palatino…|\\
+% |\usepackage{babel}|\\
+% |\begin{document}|\\
+% |\showhyphens{signal container \'ev\'enement alg\`ebre}|\\
+% |\showhyphens{signal container événement algèbre}|\\
+% |\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 évé-ne-ment al-gèbre}.\\
+% 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{évé-ne-ment}, this
+% probably means that you are using CM fonts and the macro
+% |\accent| to produce accented characters.
+% Using 8-bits fonts with built-in accented characters avoids
+% this kind of mismatch.
+% \end{itemize}
+%
+% \subsection{Changes}
+% \label{ssec-changes}
+%
+% \subsubsection*{What’s new in version 3.5?}
+%
+% Version 3.5a offers a new option \fbo{ListItemsAsPar}. The default
+% layout of lists is unchanged (for backward compatibility), but
+% users should try this new option which ensures a layout of lists
+% closer to French typographic standards: see f.i.\ how lists are
+% typeset in the book ``Lexique des règles typographiques en usage
+% à l’Imprimerie Nationale’’.
+%
+% Version 3.5b fixes a bug due to wrong |\everypar|’s management in
+% |\frquote{}|; it showed up when |\frquote{}| immediately followed
+% a sectionning command.
+%
+% Starting with version 3.5d, a new option \fbo{StandardListSpacing}
+% has been added to supersede \fbo{ReduceListSpacing}.
+%
+% A new command |\NoEveryParQuote| has been added in version 3.5e:
+% it is meant to be used inside a group or environment to suppress
+% unwanted guillemets (typically when lists are embedded in
+% |\frquote{}|).
+%
+% \subsubsection*{What’s new in version 3.4?}
+%
+% Version 3.4a adds a new command |\frenchdate| (see
+% p.~\pageref{frenchdate}) and slightly changes number formatting:
+% |\FBthousandsep| is now a \textit{kern} instead of a rubber
+% length. |\renewcommand*{\FBthousandsep}{~}| will switch back
+% to the former (wrong) behaviour.
+%
+% Both options \opt{french} and \opt{acadian} can now be used
+% simultaneously in a document; currently \opt{french} and
+% \opt{acadian} are identical, it is up to the user to customise
+% \opt{acadian} in terms of hyphenation patterns, captionnames,
+% date format or high punctuation and quotes spacing if he/she
+% needs a variant for French.
+%
+% A new command |\FBsetspaces| has been added for easy customising of
+% spacing before high punctuation and inside quotes independently for
+% \opt{french} and \opt{acadian}, see p.~\pageref{FBsetspaces}.
+%
+% Version 3.4 requires eTeX and LuaTeX 1.0.4 or newer.
+%
+% \subsubsection*{What’s new in version 3.3?}
+%
+% In version~3.3d the automatic insertion of non-breaking spaces
+% before the colon character has been improved \emph{with engine
+% LuaTeX only}: a spurious space is no longer inserted in strings
+% like http://mysite, C:\textbackslash Program Files or 10:55.
+% Unfortunately, my attempts to do the same with XeTeX or pdfTeX
+% were unsuccessful.
+%
+% A few internal changes have been made in version~3.3c to improve
+% the convertion into HTML of non-breaking spaces added by \frenchb.
+% Usage of \exe{lwarp} (v.0.37 and up) is recommended for HTML
+% output, it works fine on files compiled with XeLaTeX or pdfLaTeX
+% formats.
+% A new experimental option \fbo{UnicodeNoBreakSpaces} has been
+% added for LuaLaTeX in version~3.3c, see p.~\pageref{ucs-nbsp}.
+%
+% According to current \babel’s standards, every dialect should
+% have it’s own \file{.ldf} file; starting with version~3.3b,
+% the main support for French is in \file{french.ldf}, portmanteau
+% files \file{frenchb.ldf},\file{francais.ldf}, \file{acadian.ldf}
+% and \file{canadien.ldf} have been added. Recommended options are
+% \opt{french} or \opt{acadian}, all other are deprecated.
+% BTW, options \opt{french} and \opt{acadian} are currently
+% strictly identical.
+%
+% Release 3.3a is compatible with LuaTeX v.~0.95 (TL2016) and up.
+% Former skips |\FBcolonskip|, |\FBthinskip| and |\FBguillskip|
+% controlling punctuation spacings in LuaTeX have been removed;
+% all three engines now rely on the same commands |\FBcolonspace|,
+% |\FBthinspace| and |\FBguillspace|.
+%
+% An alias |\frenchsetup{}| for |\frenchbsetup{}| has been added
+% in version 3.3a, it might appear more relevant in the future as
+% the language name |frenchb| should vanish.
+%
+% Further customisation of the |\part{}| command is provided via
+% three new commands |\frenchpartfirst|, |\frenchpartsecond| and
+% |\frenchpartnameord|.
+%
+% \subsubsection*{What’s new in version 3.2?}
+%
+% Version 3.2g changes the default behaviour of |\frquote{}|
+% with LuaTeX based engines, the output is now the same with
+% all engines; to recover the former behaviour, add option
+% \fbo{EveryLineGuill=open}.
+%
+% The handling of footnotes has been redesigned for the
+% \cls{beamer}, \cls{memoir} and koma-script classes.
+% The layout of footnotes ``à la française’’ should be unchanged
+% but footnotes’ customisations offered by these classes
+% (i.e.\ font or color changes) are now available even when option
+% \fbo{FrenchFootnotes} is \fbo{true}.
+%
+% A long standing bug regarding the \pkg{xspace} package has been
+% fixed: |\xspace| has been moved up from the internal command
+% |\FB@fg| to |\fg|; |\frquote{}| now works properly when the
+% \pkg{xspace} package is loaded.
+%
+% Version 3.2b is the first one designed to work with LuaTeX
+% v.~0.95 as included in TeXLive 2016 (LuaTeX’s new glue node
+% structure is not compatible with previous versions).
+%
+% \textbf{Warning to Lua(La)TeX users:} starting with version~3.2b
+% the lua code included in \file{frenchb.lua} will \emph{not work}
+% on older installations (TL2015 f.i.), so \frenchb{} reverts to
+% active characters while handling high punctuation with LuaTeX
+% engines older than 0.95!
+% The best way to go is to upgrade to TL2016 or equivalent asap.
+% Xe(La)TeX and pdf(La)TeX users can safely use \frenchb{} v.~3.2b
+% and later on older installations too.
+% \enlargethispage*{.5\baselineskip}
+%
+% Tne internals of commands |\NoAutoSpacing|, |\ttfamilyFB|,
+% |\rmfamilyFB| and |\sffamilyFB| have been completely redesigned
+% in version~3.2c, they behave now consistently with all engines.
+%
+% \subsubsection*{What’s new in version 3.1?}
+%
+% New command |\frquote{}| meant to enter French quotations,
+% especially long ones (spreading over several paragraphs) and/or
+% embedded ones. see p.~\pageref{frquote} for details.
+%
+% \subsubsection*{What’s new in version 3.0?}
+%
+% Many deep changes lead me to step \frenchb’s version number
+% to~3.0a:
+% \begin{itemize}
+% \item \babel{}~3.9 is required now to process
+% \file{frenchb.ldf}, this change allows for cleaner definitions
+% of dates and captions for the Unicode engines LuaTeX and
+% XeTeX and also provides a simpler syntax for end-users, see
+% section~\ref{sssec-captions-name}
+% p.\pageref{sssec-captions-name}.
+% \item \fbsetup{} options management has been completely
+% reworked; two new options added.
+% \item Canadian French didn’t work as a normal \babel’s dialect,
+% it should now; btw. the French language should now be loaded
+% as \opt{french}, \emph{not as} \opt{frenchb} or
+% \opt{francais} and preferably as a \emph{global} option of
+% |\documentclass|. Some tolerance still exists in v3.0, but
+% do not rely on it.
+% \item \frenchb{} no longer loads \file{frenchb.cfg}:
+% customisation should definitely be done using \fbsetup{}
+% options.
+% \item Description lists labels are now indented; try setting
+% |\descindentFB=0pt| (or |\listindentFB=0pt| for all lists)
+% in the preamble if you don’t like it.
+% \item The last but not least change affects the (recent)
+% LuaTeX-based engines, (this means version 0.76 as included in
+% TL2013 and up): active characters are no longer used in French
+% for `high punctuation’%
+% \footnote{The current \frenchb{} version requires LuaTeX
+% v.~1.0.4 as included in TL2017, see above.}.
+% Functionalities and user interface are unchanged.
+%
+% Many thanks to Paul Isambert who provided the basis for the
+% lua code (see his presentation at GUT’2010) and kindly
+% reviewed my first drafts suggesting significant improvements.
+%
+% Please note that this code, still experimental, is likely to
+% change until LuaTeX itself has reached version~1.0.
+% \end{itemize}
+%
+% Starting with version~3.0c, \frenchb{} no longer customises
+% lists with the \cls{beamer} class and offers a new option
+% (\fbo{INGuillSpace}) to follow French `Imprimerie Nationale’
+% recommendations regarding quotes’ spacing.
+%
+% \StopEventually{}
+%
+% \changes{v2.6c}{2013/05/20}{Dummy file frenchb.cfg is no longer
+% generated from frenchb.dtx.}
+%
+% \clearpage
+% \newgeometry{left=53mm,right=25mm}
+%
+% \section{The code}
+%
+% \subsection{Initial setup}
+%
+% \changes{v2.1d}{2008/05/02}{Argument of \cs{ProvidesLanguage} changed
+% above from `french’ to `frenchb’ (otherwise \cs{listfiles} prints
+% no date/version information). The real name of current language
+% (french) as to be corrected before calling \cs{LdfInit}.}
+%
+% \changes{v3.0a}{2014/02/28}{Support for options frenchb, francais,
+% canadien, acadian changed.}
+%
+% \changes{v3.0a}{2014/02/19}{\cs{LdfInit} checks \cs{captionsfrench}
+% instead of \cs{datefrench} to avoid a conflict with papertex.cls
+% which loads datetime.sty.}
+%
+% \changes{v3.4a}{2018/01/14}{\cs{LdfInit} checks \cs{FBclean@on@exit}
+% instead of \cs{captionsfrench} (undefined in PLain).
+% Prevents loading french.ldf again with acadian option.}
+%
+% The macro |\LdfInit| takes care of preventing that this file is
+% loaded more than once (even if both options \opt{french} and
+% \opt{acadian} are used in the same document), checking the
+% category code of the \texttt{@} sign, etc.
+%
+% \begin{macrocode}
+%<*french>
+\LdfInit\CurrentOption{FBclean@on@exit}
+% \end{macrocode}
+%
+% \changes{v3.0a}{2014/02/15}{In Plain, provide a substitute for
+% \cs{PackageWarning} and \cs{PackageInfo}.}
+%
+% Let’s provide a substitute for |\PackageError|, |\PackageWarning|
+% and |\PackageInfo| not defined in Plain:
+% \begin{macrocode}
+\def\fb@error#1#2{%
+ \begingroup
+ \newlinechar=`\^^J
+ \def\\{^^J(french.ldf) }%
+ \errhelp{#2}\errmessage{\\#1^^J}%
+ \endgroup}
+\def\fb@warning#1{%
+ \begingroup
+ \newlinechar=`\^^J
+ \def\\{^^J(french.ldf) }%
+ \message{\\#1^^J}%
+ \endgroup}
+\def\fb@info#1{%
+ \begingroup
+ \newlinechar=`\^^J
+ \def\\{^^J}%
+ \wlog{#1}%
+ \endgroup}
+% \end{macrocode}
+%
+% \changes{v3.4a}{2018/01/04}{babel-french now requires eTeX.}
+%
+% Quit if eTeX is not available.
+% \begin{macrocode}
+\let\bbl@tempa\relax
+\begingroup\expandafter\expandafter\expandafter\endgroup
+\expandafter\ifx\csname eTeXversion\endcsname\relax
+ \let\bbl@tempa\endinput
+ \fb@error{babel-french requires eTeX.\\
+ Aborting here}
+ {Orignal PlainTeX is not supported,\\
+ please use LuaTeX or XeTeX engines.}
+\fi
+\bbl@tempa
+% \end{macrocode}
+%
+% \changes{v3.0c}{2014/03/30}{babel-french requires babel-3.9i.}
+%
+% Quit if \babel’s version is less than 3.9i.
+% \begin{macrocode}
+\let\bbl@tempa\relax
+\ifdefined\babeltags
+\else
+ \let\bbl@tempa\endinput
+ \ifdefined\PackageError
+ \PackageError{french.ldf}
+ {babel-french requires babel v.3.16.\MessageBreak
+ Aborting here}
+ {Please upgrade Babel!}
+ \else
+ \fb@error{babel-french requires babel v.3.16.\\
+ Aborting here}
+ {Please upgrade Babel!}
+ \fi
+\fi
+\bbl@tempa
+% \end{macrocode}
+%
+% \changes{v3.0c}{2014/03/30}{No need to define \cs{l@french} as
+% \cs{lang@french}, babel.def (3.9j) takes care for this.}
+%
+% Make sure that |\l@french| is defined (fallbacks are
+% |\l@nohyphenation| if available or~0).
+% \file{babel.def} (3.9i and up) defines |\l@<languagename>| also for
+% eTeX, LuaTeX and XeTeX formats which set |\lang@<languagename>|.
+% \begin{macrocode}
+\def\FB@nopatterns{%
+ \ifdefined\l@nohyphenation
+ \adddialect\l@french\l@nohyphenation
+ \edef\bbl@nulllanguage{\string\language=nohyphenation}%
+ \else
+ \edef\bbl@nulllanguage{\string\language=0}%
+ \adddialect\l@french0
+ \fi
+ \@nopatterns{French}}
+\ifdefined\l@french \else \FB@nopatterns \fi
+% \end{macrocode}
+%
+% Babel’s French language can be loaded with option \opt{acadian}
+% which stands for Canadian French.
+% If no specific hyphenation patterns are available, Canadian French
+% will use the French ones.
+% \begin{macrocode}
+\ifdefined\l@acadian \else \adddialect\l@acadian\l@french \fi
+% \end{macrocode}
+%
+% French uses the standard values of |\lefthyphenmin| (2)
+% and |\righthyphenmin| (3); let’s provide their values though,
+% as required by \babel.
+%
+% \begin{macrocode}
+\providehyphenmins{french}{\tw@\thr@@}
+\providehyphenmins{acadian}{\tw@\thr@@}
+% \end{macrocode}
+%
+%\changes{v2.1d}{2008/05/04}{Avoid warning `\cs{end} occurred
+% when \cs{ifx} ... incomplete’ with LaTeX-2.09.}
+%
+% \begin{macro}{\ifLaTeXe}
+% No support is provided for late LaTeX-2.09: issue a warning
+% and exit if LaTeX-2.09 is in use. Plain is still supported.
+% \begin{macrocode}
+\newif\ifLaTeXe
+\let\bbl@tempa\relax
+\ifdefined\magnification
+\else
+ \ifdefined\@compatibilitytrue
+ \LaTeXetrue
+ \else
+ \PackageError{french.ldf}
+ {LaTeX-2.09 format is no longer supported.\MessageBreak
+ Aborting here}
+ {Please upgrade to LaTeX2e!}
+ \let\bbl@tempa\endinput
+ \fi
+\fi
+\bbl@tempa
+% \end{macrocode}
+% \end{macro}
+%
+%\begin{macro}{\ifFBunicode}
+% \begin{macro}{\ifFBLuaTeX}
+% \begin{macro}{\ifFBXeTeX}
+% French hyphenation patterns are now coded in Unicode, see file
+% \file{hyph-fr.tex}. XeTeX and LuaTeX engines require some extra
+% code to deal with the French ``apostrophe’’.
+% Let’s define three new `if’: |\ifFBLuaTeX|, |\ifFBXeTeX| and
+% |\ifFBunicode| which will be true for XeTeX and LuaTeX engines
+% and false for 8-bits engines.
+%
+% \changes{v2.4a}{2009/11/23}{Added a new `if’ \cs{FBunicode} and
+% some \cs{lccode} definitions to \cs{extrasfrench} and
+% \cs{noextrasfrench}.}
+%
+% \changes{v2.5d}{2011/01/17}{Added two new `if’ \cs{FBXeTeX} and
+% \cs{FBLuaTeX} as XeTeX and behave differently regarding the status
+% of the French `apostrophe’.}
+%
+% \changes{v2.6g}{2013/12/15}{lccode values for the French
+% `apostrophe’ are now the same for XeTeX and LuaTeX.}
+%
+% \changes{v3.4c}{2018/02/16}{Reverting to former test, beware of
+% \cs{XeTeXrevision} left as \cs{relax} by careless testing.}
+%
+% \begin{macrocode}
+\newif\ifFBunicode
+\newif\ifFBLuaTeX
+\newif\ifFBXeTeX
+\begingroup\expandafter\expandafter\expandafter\endgroup
+\expandafter\ifx\csname luatexversion\endcsname\relax
+\else
+ \FBunicodetrue \FBLuaTeXtrue
+\fi
+\begingroup\expandafter\expandafter\expandafter\endgroup
+\expandafter\ifx\csname XeTeXrevision\endcsname\relax
+\else
+ \FBunicodetrue \FBXeTeXtrue
+\fi
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \changes{v3.3b}{2017/07/08}{New `if’ \cs{ifFBfrench} to replace
+% \cs{iflanguage} test which is based on patterns.}
+%
+% \begin{macro}{\ifFBfrench}
+% True when the current language is French or any of its dialects;
+% will be set to true by |\extrasfrench| and to false by
+% |\noextrasfrench|. Used in |\DecimalMathComma| and
+% |frenchsetup{og=«, fg=»}|.
+% \begin{macrocode}
+\newif\ifFBfrench
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\extrasfrench}
+% \changes{v3.0a}{2014/02/18}{Take advantage of babel’s
+% \cs{babel@savevariable} to handle apostrophe’s \cs{lccode}.}
+%
+% \changes{v3.4a}{2018/01/06}{Change \cs{(no)extras}\cs{CurrentOption}
+% to \cs{(no)extrasfrench}. \cs{(no)extrasacadian} will be defined
+% as \cs{(no)extrasfrench} in file acadian.ldf.}
+%
+% \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, character ``apostrophe’’ (U+27 or U+2019) is a letter in
+% expressions like |l’ambulance| (French hyphenation 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 has to be reset to null when exiting
+% French.
+%
+% The following code ensures correct hyphenation of words like
+% |d’aventure|, |l’utopie|, with all TeX engines (XeTeX, LuaTeX,
+% pdfTeX) using \file{hyph-fr.tex} patterns.
+%
+% \changes{v3.5c}{2018/09/11}{\cs{lccode} of quote 0x27 changed from
+% 0x2019 to 0x27 for Unicode engines.}
+%
+% \begin{macrocode}
+\def\extrasfrench{%
+ \FBfrenchtrue
+ \babel@savevariable{\lccode"27}%
+ \lccode"27="27
+ \ifFBunicode
+ \babel@savevariable{\lccode"2019}%
+ \lccode"2019="2019
+ \fi
+}
+\def\noextrasfrench{\FBfrenchfalse}
+% \end{macrocode}
+%
+% One more thing |\extrasfrench| needs to do is to make sure that
+% ``Frenchspacing’’ is in effect. |\noextrasfrench| will switch
+% ``Frenchspacing’’ off again if necessary.
+% \begin{macrocode}
+\addto\extrasfrench{\bbl@frenchspacing}
+\addto\noextrasfrench{\bbl@nonfrenchspacing}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Punctuation}
+% \label{ssec-punct}
+%
+% \changes{v2.5a}{2010/08/10}{Punctation is no longer made active
+% with XeTeX-based engines.}
+%
+% As long as no better solution is available, the `high
+% punctuation’ characters (|;| |!| |?| and |:|) have to be made
+% |\active| for an automatic control of the amount of space to be
+% inserted before them. Both XeTeX and LuaTeX provide an
+% alternative to active characters (`XeTeXinterchar’ mechanism and
+% LuaTeX’s callbacks).
+%
+% \changes{v3.0a}{2014/01/10}{New flag \cs{ifFB@luatex@punct} for
+% `high punctuation’ management with LuaTeX engines.}
+%
+% \begin{macro}{\ifFB@active@punct}
+% Three internal flags are needed for the three different techniques
+% used for `high punctuation’ management.
+% \begin{macrocode}
+\newif\ifFB@active@punct \FB@active@puncttrue
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ifFB@luatex@punct}
+% With LuaTeX, starting with version 1.0.4, callbacks are used to
+% get rid of active punctuation. With previous versions, `high
+% punctuation’ characters remain active (see below).
+% \begin{macrocode}
+\newif\ifFB@luatex@punct
+\ifFBLuaTeX
+ \ifnum\luatexversion<100
+ \ifx\PackageWarning\@undefined
+ \fb@warning{Please upgrade LuaTeX to version 1.0.4 or above!\\%
+ babel-french will make high punctuation characters (;:!?)\\%
+ active with LuaTeX < 1.0.4.}%
+ \else
+ \PackageWarning{french.ldf}{Please upgrade LuaTeX
+ to version 1.0.4 or above!\MessageBreak
+ babel-french will make high punctuation characters%
+ \MessageBreak (;:!?) active with LuaTeX < 1.0.4;%
+ \MessageBreak reported}%
+ \fi
+ \else
+ \FB@luatex@puncttrue\FB@active@punctfalse
+ \fi
+\fi
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ifFB@xetex@punct}
+% For XeTeX, the availability of |\XeTeXinterchartokenstate|
+% decides whether the `high punctuation’ characters (|;| |!| |?|
+% and |:|) have to be made |\active| or not.
+%
+% \changes{v3.2b}{2016/04/18}{New counter \cs{FB@nonchar} needed for
+% non characters: it’s value will be 4095 for new engines and 255
+% for older ones.}
+%
+% The number of available character classes has been increased from
+% 256 to 4096 in XeTeX v.~0.99994, the class for non-characters is
+% now 4095 instead of 255.
+% \begin{macrocode}
+\newcount\FB@nonchar
+\newif\ifFB@xetex@punct
+\ifdefined\XeTeXinterchartokenstate
+ \FB@xetex@puncttrue\FB@active@punctfalse
+ \ifdim\the\XeTeXversion\XeTeXrevision pt<0.99994pt
+ \FB@nonchar=255 \relax
+ \else
+ \FB@nonchar=4095 \relax
+ \fi
+\fi
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\FBguillspace}
+% \begin{macro}{\FBcolonspace}
+% \begin{macro}{\FBthinspace}
+% \changes{v2.5a}{2010/08/10}{Define \cs{FBthinspace} for those who want
+% to customise the width of the space before ; and co.}
+%
+% \changes{v2.6d}{2013/06/19}{Rename \cs{Fthinspace} to
+% \cs{FBthinspace} and \cs{Fcolonspace} to \cs{FBcolonspace} to avoid
+% a conflict with fournier.sty.}
+%
+% \changes{v3.1f}{2015/05/31}{\cs{FBthinspace} is no longer a kern but
+% a skip (babel-french adds a nobreak penalty before it).}
+%
+% \changes{v3.2c}{2016/05/14}{Change .16667em to
+% .5\cs{fontdimen2}\cs{font} to get in XeTeX and pdfTeX
+% the same spacing as in LuaTeX.}
+%
+% \changes{v3.3a}{2016/04/30}{Skips \cs{FBcolonskip} and
+% \cs{FBthinskip} replaced by toks \cs{FBcolonsp} and
+% \cs{FBthinsp}.}
+%
+% These three commands are meant for basic French. Other French
+% dialects can use different settings, see below.
+% According to the I.N.\ specifications, the `:’ requires an
+% inter-word space before it, the other three require just a thin
+% space. We define |\FBcolonspace| as |\space| (inter-word space)
+% and |\FBthinspace| as an half inter-word space with no shrink nor
+% stretch.
+% |\FBguillspace| is defined btw. as spacing for French quotes is
+% handled together with high punctuation for LuaTeX and XeTeX.
+% |\FBguillspace| has been fine tuned by Thierry Bouche to 80\% of an
+% inter-word space with reduced stretchability.
+% All three are user customisable in the preamble, best using the
+% |\FBsetspaces| command described below.
+% A penalty will be added before these spaces to prevent line
+% breaking.
+% \begin{macrocode}
+\newcommand*{\FBguillspace}{\hskip .8\fontdimen2\font
+ plus .3\fontdimen3\font
+ minus .8\fontdimen4\font \relax}
+\newcommand*{\FBcolonspace}{\space}
+\newcommand*{\FBthinspace}{\hskip .5\fontdimen2\font \relax}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \changes{v3.3a}{2016/04/30}{Skip \cs{FBguillskip} for LuaTeX
+% replaced by toks \cs{FBguillsp}.}
+%
+% \changes{v3.4a}{2018/01/15}{Toks \cs{FBcolonsp}, \cs{FBthinsp} and
+% \cs{FBguillsp} removed.}
+%
+% \changes{v3.4a}{2018/01/26}{New command \cs{FBsetspaces} to fine tune
+% spacing independently in French and in French dialects.}
+%
+% \begin{macro}{\FBsetspaces}
+% This command makes it easy to fine tune |\FBguillspace|,
+% |\FBcolonspace| and |\FBthinspace| in French (defaut) or
+% independently in a French dialect using the optional argument.
+% They are meant for LaTeX2e \emph{only} and can only be used
+% in the preamble.
+% Four mandatory arguments are expected besides the optional one:
+% the first one is a \textit{string} either "guill", "colon", or
+% "thin", the last four are decimal numbers specifying
+% \textit{width}, \textit{stretch} and \textit{shrink} relative to
+% \textit{fontdimens}.\hlabel{FBsetspaces}
+% For instance |\FBsetspaces[acadian]{colon}{0.5}{0}{0}| defines
+% |\acadianFBcolonspace| as a thinspace which will be used for
+% the Acadian dialect only. When used without optional argument or
+% with argument `french’, the same command would tune the basic
+% |\FBcolonspace| command.
+% \begin{macrocode}
+\ifLaTeXe
+ \newcommand*{\FBsetspaces}[5][french]{%
+ \def\bbl@tempa{french}\def\bbl@tempb{#1}%
+ \ifx\bbl@tempa\bbl@tempb \def\bbl@tempb{}\fi
+ \@namedef{\bbl@tempb FB#2space}{\hskip #3\fontdimen2\font
+ plus #4\fontdimen3\font
+ minus #5\fontdimen4\font \relax}%
+% \end{macrocode}
+% With option "acadian", fill the corresponding LuaTeX table.
+% All unset values in the "acadian" subtables will be filled
+% `AtBeginDocument’ by |\set@glue@table| with the value available
+% for "french".
+% \begin{macrocode}
+ \ifFB@luatex@punct
+ \ifx\bbl@tempb\FB@acadian
+ \directlua{
+ FBsp.#2.gl.ac[1] = #3
+ FBsp.#2.gl.ac[2] = #4
+ FBsp.#2.gl.ac[3] = #5
+ if #3 > 0.6 then
+ FBsp.#2.ch.ac = 0xA0
+ elseif #3 > 0.2 then
+ FBsp.#2.ch.ac = 0x202F
+ else
+ FBsp.#2.ch.ac = 0x200B
+ end
+ }%
+ \fi
+ \fi
+ }
+ \@onlypreamble\FBsetspaces
+\fi
+% \end{macrocode}
+% \end{macro}
+%
+% Remember that the \emph{same} |\extrasfrench| command is executed
+% when switching to French or to a French dialect (Acadian).
+% Acadian and French may share the same patterns (or not), and may
+% use different spacing for high punctuation and/or quotes.
+% Basically, for pdfLaTeX and XeLaTeX, the spacing is set for French,
+% then potentially tuned differently for Acadian.
+% LuaTeX relies on an attribute |\FB@dialect| to decide what spacing
+% is needed for French or Acadian (see LuaTeX table |FBsp|).
+% \hlabel{extrapunct}
+% As a rough test on |\languagename| would be unreliable to set the
+% value of |\FB@dialect| (see \file{babel.pdf}), we use a trick
+% based on |\detokenize|; another option would be to use the
+% |\IfLanguageName| command from Oberdiek’s package \file{iflang}.
+% \begin{macrocode}
+\ifLaTeXe
+ \addto\extrasfrench{%
+ \ifFB@luatex@punct
+ \edef\bbl@tempa{\detokenize\expandafter{\languagename}}%
+ \edef\bbl@tempb{\detokenize{french}}%
+ \ifx\bbl@tempa\bbl@tempb \FB@dialect=0 \relax
+ \else \FB@dialect=1 \relax
+ \fi
+% \end{macrocode}
+% The first time whe enter French, we have to set the LuaTeX
+% tables for French (|\FB@dialet=0|) \emph{before} any dialect
+% redefines any |\FB...space| command. Doing this `AtBeginDocument’
+% would be too late: if French or a French dialect is the main
+% language, |\extrasfrench| has been executed before!
+% \begin{macrocode}
+ \ifdefined\FB@once\else
+ \set@glue@table{colon}%
+ \set@glue@table{thin}%
+ \set@glue@table{guill}%
+ \def\FB@once{}%
+ \fi
+ \fi
+% \end{macrocode}
+% Any dialect dependent customisation done using
+% |\FBsetspaces[|\textit{dialect}|]| command or alike is now
+% taken into account: the value of |\FBthinspace| (meant for French,
+% i.e.|\FB@dialect=0|) is first saved then changed (for Acadian).
+% \begin{macrocode}
+ \ifcsname\languagename FBthinspace\endcsname
+ \babel@save\FBthinspace
+ \renewcommand*{\FBthinspace}{%
+ \csname\languagename FBthinspace\endcsname}%
+ \fi
+% \end{macrocode}
+% Same for |\FBcolonspace|:
+% \begin{macrocode}
+ \ifcsname\languagename FBcolonspace\endcsname
+ \babel@save\FBcolonspace
+ \renewcommand*{\FBcolonspace}{%
+ \csname\languagename FBcolonspace\endcsname}%
+ \fi
+% \end{macrocode}
+% And for |\FBguillspace|:
+% \begin{macrocode}
+ \ifcsname\languagename FBguillspace\endcsname
+ \babel@save\FBguillspace
+ \renewcommand*{\FBguillspace}{%
+ \csname\languagename FBguillspace\endcsname}%
+ \fi
+ }
+\fi
+% \end{macrocode}
+%
+% \changes{v3.2c}{2016/05/14}{Newif \cs{ifFB@spacing} and new commands
+% \cs{FB@spacingon}, \cs{FB@spacingoff} to control space tuning in
+% French.}
+%
+% The conditional |\ifFB@spacing| will be used by pdfTeX and XeTeX
+% engines to switch on or off space tuning before high punctuation
+% and inside French quotes.
+% A matching attribute will be defined later for LuaTeX.
+% \begin{macrocode}
+\newif\ifFB@spacing \FB@spacingtrue
+% \end{macrocode}
+%
+% \begin{macro}{\FB@spacing@off}
+% \begin{macro}{\FB@spacing@on}
+% Two internal commands to switch on and off all space tuning
+% for all six characters `;:!?«»’.
+% They will be triggered by user command |\NoAutoSpacing| and by
+% font family switching commands |\ttfamilyFB| |\rmfamilyFB| and
+% |\sffamilyFB|. These four commands will now behave the same with
+% any engine (up to version 3.2b, results were engine dependent).
+% \begin{macrocode}
+\newcommand*{\FB@spacing@on}{%
+ \ifFB@luatex@punct
+ \FB@spacing=1 \relax
+ \else
+ \FB@spacingtrue
+ \fi}
+\newcommand*{\FB@spacing@off}{%
+ \ifFB@luatex@punct
+ \FB@spacing=0 \relax
+ \else
+ \FB@spacingfalse
+ \fi}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsubsection{Punctuation with LuaTeX}
+% \label{sssec-punct-luatex}
+%
+% \changes{v3.0a}{2014/01/10}{New handling of `high punctuation’
+% through callbacks with LuaTeX engines.}
+%
+% The following part holds specific code for punctuation with modern
+% LuaTeX engines, i.e. version 1.0.4 (included in TL2017) or newer.
+%
+% \changes{v3.0b}{2014/02/13}{Require luatexbase with LaTeX2e in case
+% fontspec has not been loaded before babel.}
+%
+% \changes{v3.0c}{2014/03/26}{Just load luatexbase.sty instead of
+% luaotfload.sty with plain formats.}
+%
+% \changes{v3.1a}{2014/05/30}{Misplaced \cs{fi} for plain formats.}
+%
+% \changes{v3.1j}{2015/10/16}{Loading luatexbase.sty is no longer
+% needed with LaTeX release 2015/10/01 or later.}
+%
+% \changes{v3.2b}{2016/04/18}{Load ltluatex.tex for plain LuaTeX to
+% ensure \cs{newattribute} is defined.}
+%
+% \changes{v3.2c}{2016/05/14}{New LuaTeX attribute \cs{FB@spacing}.}
+%
+% \changes{v3.3a}{2017/04/30}{Compatibility code for pre
+% 2015/10/01 LaTeX release removed, see ltnews23.tex.}
+%
+% \changes{v3.4a}{2018/01/15}{New attribute \cs{FB@dialect} for the
+% French dialect acadian.}
+%
+% \begin{macrocode}
+\ifFB@luatex@punct
+ \ifdefined\newluafunction\else
+% \end{macrocode}
+% This code is for Plain: load \file{ltluatex.tex} if it hasn’t been
+% loaded before \babel.
+% \begin{macrocode}
+ \input ltluatex.tex
+ \fi
+% \end{macrocode}
+% We define five LuaTeX attributes to control spacing in French
+% and/or Acadian for `high punctuation’ and quotes, making sure
+% that |\newattribute| is defined.
+%
+% |\FB@spacing=0| switches off any space tuning both before high
+% punctuation characters and inside French quotes (i.e.\ function
+% |french_punctuation| doesn’t alter the node list at all).
+%
+% |\FB@addDPspace=0| switches off automatic insertion of spaces
+% before high punctuation characters (but typed spaces are still
+% turned into non-breaking thin- or word-spaces).
+%
+% |\FB@addGUILspace| will be set to~1 by option \fbo{og=«, fg=»},
+% thus enabling automatic insertion of proper spaces after `«’ and
+% before `»’.
+%
+% |\FB@ucsNBSP| triggers the replacement of glues by characters, it
+% is controlled by option \fbo{UnicodeNoBreakSpaces}.
+%
+% |\FB@dialect| is 0 for French and 1 for Acadian; its value controls
+% which parts of the glue table (|.fr| or |.ac|) are taken into
+% account.
+% \begin{macrocode}
+ \newattribute\FB@spacing \FB@spacing=1 \relax
+ \newattribute\FB@addDPspace \FB@addDPspace=1 \relax
+ \newattribute\FB@addGUILspace \FB@addGUILspace=0 \relax
+ \newattribute\FB@ucsNBSP \FB@ucsNBSP=0 \relax
+ \newattribute\FB@dialect \FB@dialect=0 \relax
+ \ifLaTeXe
+ \PackageInfo{french.ldf}{No need for active punctuation
+ characters\MessageBreak with this version
+ of LuaTeX!\MessageBreak reported}
+ \else
+ \fb@info{No need for active punctuation characters\\
+ with this version of LuaTeX!}
+ \fi
+% \end{macrocode}
+% The next command will be used in the first call of |\extrasfrench|
+% to convert |\FBcolonspace|, |\FBthinspace| and |\FBguillspace|
+% into a table usable by LuaTeX. This way, any customisation done
+% in the preamble (by \fbsetup{}, redefinitions or |\FBsetspaces|
+% commands) are taken into account. Values not explicitly set for
+% Acadian by |\FBsetspaces[|\textit{acadian}|]| commands are copied
+% from the French ones.
+% In case parsing by the Lua function |FBget_glue| (defined in file
+% \file{frenchb.lua}) fails due to unexpected syntax in |\FB...space|
+% the table remains unchanged and a warning is issued.
+% The matching space characters for option \fbo{UnicodeNoBreakSpaces}
+% are set as word space, thin space or null space according to the
+% \textit{width} parameter.
+%
+% \changes{v3.4a}{2018/01/30}{Lua function token.get\_meaning requires
+% LuaTeX 1.0.}
+%
+% \begin{macrocode}
+ \newcommand*{\set@glue@table}[1]{%
+ \directlua {
+ local s = token.get_meaning("FB#1space")
+ local t = FBget_glue(s)
+ if t then
+ FBsp.#1.gl.fr = t
+ if not FBsp.#1.gl.ac[1] then
+ FBsp.#1.gl.ac = t
+ end
+ if FBsp.#1.gl.fr[1] > 0.6 then
+ FBsp.#1.ch.fr = 0xA0
+ elseif FBsp.#1.gl.fr[1] > 0.2 then
+ FBsp.#1.ch.fr = 0x202F
+ else
+ FBsp.#1.ch.fr = 0x200B
+ end
+ if not FBsp.#1.ch.ac then
+ FBsp.#1.ch.ac = FBsp.#1.ch.fr
+ end
+ else
+ texio.write_nl('term and log', '')
+ texio.write_nl('term and log',
+ '*** french.ldf warning: Unexpected syntax in FB#1space,')
+ texio.write_nl('term and log',
+ '*** french.ldf warning: LuaTeX table FBsp unchanged.')
+ texio.write_nl('term and log',
+ '*** french.ldf warning: Consider using FBsetspaces to ')
+ texio.write('term and log', 'customise FB#1space.')
+ texio.write_nl('term and log', '')
+ end
+ }%
+ }
+\fi
+%</french>
+% \end{macrocode}
+%
+% \begin{macro}{frenchb.lua}
+% This is \file{frenchb.lua}. It holds Lua code to deal with `high
+% punctuation’ and quotes. This code is based on suggestions from
+% Paul Isambert.
+%
+% First we define two flags to control spacing before French `high
+% punctuation’ (thin space or inter-word space).
+%
+% \changes{v3.1a}{2014/06/16}{Codes 0x13 and 0x14 added for French
+% quotes in T1-encoding.}
+%
+% \changes{v3.3c}{2017/09/07}{Function `get\_glue’ robustified.
+% `french\_punctuation’ can insert Unicode characters instead
+% of glues.}
+%
+% \begin{macrocode}
+%<*lua>
+local FB_punct_thin =
+ {[string.byte("!")] = true,
+ [string.byte("?")] = true,
+ [string.byte(";")] = true}
+local FB_punct_thick =
+ {[string.byte(":")] = true}
+% \end{macrocode}
+% Managing spacing after `«’ (U+00AB) and before `»’ (U+00BB) can be
+% done by the way; we define two flags, |FB_punct_left| for
+% characters requiring some space before them and |FB_punct_right|
+% for `\guillemotleft’ which must be followed by some space.
+% In case LuaTeX is used to output T1-encoded fonts instead of
+% OpenType fonts, codes \texttt{0x13} and \texttt{0x14} have to be
+% added for `«’ and `»’.
+% \begin{macrocode}
+local FB_punct_left =
+ {[string.byte("!")] = true,
+ [string.byte("?")] = true,
+ [string.byte(";")] = true,
+ [string.byte(":")] = true,
+ [0x14] = true,
+ [0xBB] = true}
+local FB_punct_right =
+ {[0x13] = true,
+ [0xAB] = true}
+% \end{macrocode}
+% Two more flags will be needed to avoid spurious spaces in
+% strings like !! ?? or (?)
+% \begin{macrocode}
+local FB_punct_null =
+ {[string.byte("!")] = true,
+ [string.byte("?")] = true,
+ [string.byte("[")] = true,
+ [string.byte("(")] = true,
+% \end{macrocode}
+% or if the user has typed a non-breaking space U+00A0 or U+202F
+% (thin) before a `high punctuation’ character: no space
+% should be added by \frenchb. Same is true inside French quotes.
+% \begin{macrocode}
+ [0xA0] = true,
+ [0x202F] = true}
+local FB_guil_null =
+ {[0xA0] = true,
+ [0x202F] = true}
+% \end{macrocode}
+% \changes{v3.1g}{2015/06/17}{Node HLIST added; node TEMP added
+% for the first node of \cs{hbox}es.}
+%
+% Local definitions for nodes:
+% \begin{macrocode}
+local new_node = node.new
+local copy_node = node.copy
+local node_id = node.id
+local HLIST = node_id("hlist")
+local TEMP = node_id("temp")
+local KERN = node_id("kern")
+local GLUE = node_id("glue")
+local GLYPH = node_id("glyph")
+local PENALTY = node_id("penalty")
+local nobreak = new_node(PENALTY)
+nobreak.penalty = 10000
+local insert_node_before = node.insert_before
+local insert_node_after = node.insert_after
+local remove_node = node.remove
+% \end{macrocode}
+%
+%\changes{v3.4a}{2018/01/26}{Global `FBsp’ table added; local function
+% `get\_glue’ changed into global `FBget\_glue’.}
+%
+% Commands |\FBthinspace|, |\FBcolonspace| and |\FBguillspace| are
+% converted `AtBeginDocument’ by the next function |FBget_glue| into
+% tables of three values which are fractions of |\fontdimen2|,
+% |\fontdimen3| and |\fontdimen4|. \hlabel{lua-scaling}
+% If parsing fails due to unexpected syntax, the function returns
+% \textit{nil} instead of a table.
+% \begin{macrocode}
+function FBget_glue(toks)
+ local t = nil
+ local f = string.match(toks,
+ "[^%w]hskip%s*([%d%.]*)%s*[^%w]fontdimen 2")
+ if f == "" then f = 1 end
+ if tonumber(f) then
+ t = {tonumber(f), 0, 0}
+ f = string.match(toks, "plus%s*([%d%.]*)%s*[^%w]fontdimen 3")
+ if f == "" then f = 1 end
+ if tonumber(f) then
+ t[2] = tonumber(f)
+ f = string.match(toks, "minus%s*([%d%.]*)%s*[^%w]fontdimen 4")
+ if f == "" then f = 1 end
+ if tonumber(f) then
+ t[3] = tonumber(f)
+ end
+ end
+ elseif string.match(toks, "[^%w]F?B?thinspace") then
+ t = {0.5, 0, 0}
+ elseif string.match(toks, "[^%w]space") then
+ t = {1, 1, 1}
+ end
+ return t
+end
+% \end{macrocode}
+% Let’s initialize the global LuaTeX table |FBsp|: it holds the
+% characteristics of the glues used in French and Acadian for
+% high punctuation and quotes and the corresponding no-breaking
+% space characters for option \fbo{UnicodeNoBreakSpaces}.
+% \begin{macrocode}
+FBsp = {}
+FBsp.thin = {}
+FBsp.thin.gl = {}
+FBsp.thin.gl.fr = {.5, 0, 0} ; FBsp.thin.gl.ac = {}
+FBsp.thin.ch = {}
+FBsp.thin.ch.fr = 0x202F ; FBsp.thin.ch.ac = nil
+FBsp.colon = {}
+FBsp.colon.gl = {}
+FBsp.colon.gl.fr = { 1, 1, 1} ; FBsp.colon.gl.ac = {}
+FBsp.colon.ch = {}
+FBsp.colon.ch.fr = 0xA0 ; FBsp.colon.ch.ac = nil
+FBsp.guill = {}
+FBsp.guill.gl = {}
+FBsp.guill.gl.fr = {.8, .3, .8} ; FBsp.guill.gl.ac = {}
+FBsp.guill.ch = {}
+FBsp.guill.ch.fr = 0xA0 ; FBsp.guill.ch.ac = nil
+% \end{macrocode}
+% The next function converts the glue table returned by function
+% |FBget_glue| into sp for the current font; beware of null values
+% for fid, see |\nullfont| in TikZ, and of special fonts like
+% lcircle1.pfb for which |font.getfont(fid)| does not return a proper
+% font table, in such cases the function returns |nil|.
+%
+% \changes{v3.1l}{2016/02/13}{font.getfont(fid) possibly
+% returns nil even for a positive fid (i.e. AMS lcircle1.pfb).
+% Reported by François Legendre.}
+%
+% \changes{v3.1m}{2016/02/16}{new\_glue\_scaled returns
+% nil in case of invalid font table (i.e. lcircle1.pfb). In such
+% cases babel-french leaves the node list unchanged.}
+%
+% \changes{v3.2b}{2016/04/18}{glue\_spec removed;
+% starting with LuaTeX 0.95, glue specifications fit in glue.}
+%
+% \begin{macrocode}
+local font_table = {}
+local function new_glue_scaled (fid,table)
+ if fid > 0 and table[1] then
+ local fp = font_table[fid]
+ if not fp then
+ local ft = font.getfont(fid)
+ if ft then
+ font_table[fid] = ft.parameters
+ fp = font_table[fid]
+ end
+ end
+ local gl = new_node(GLUE,0)
+ if fp then
+ node.setglue(gl, table[1]*fp.space,
+ table[2]*fp.space_stretch,
+ table[3]*fp.space_shrink)
+ return gl
+ else
+ return nil
+ end
+ else
+ return nil
+ end
+end
+% \end{macrocode}
+% Let’s catch LuaTeX attributes |\FB@spacing|, |\FB@addDPspace|
+% and |\FB@addGUILspace|.
+% \begin{macrocode}
+local FBspacing = luatexbase.attributes['FB@spacing']
+local addDPspace = luatexbase.attributes['FB@addDPspace']
+local addGUILspace = luatexbase.attributes['FB@addGUILspace']
+local FBucsNBSP = luatexbase.attributes['FB@ucsNBSP']
+local FBdialect = luatexbase.attributes['FB@dialect']
+local has_attribute = node.has_attribute
+% \end{macrocode}
+% The following function will be added to |kerning| callback.
+% It catches all nodes of type |GLYPH| in the list starting at
+% |head| and checks the language attributes of the current glyph:
+% nothing is done if the current language is not French and only
+% specific punctuation characters (those for which |FB_punct_left|
+% or |FB_punct_right| is true) need a special treatment.
+% In French, local variables are defined to hold the properties of
+% the current glyph (|item|) and of the previous one (|prev|) or the
+% next one (|next|). Constants |FR_fr| (french) and |FR_ca|
+% (acadian) are defined by command |\activate@luatexpunct|.
+%
+% \changes{v3.1b}{2014/09/16}{Add a check for null fid
+% in french\_punctuation (Tikz \cs{nullfont}).
+% Bug pointed out by Paul Gaborit.}
+%
+% \begin{macrocode}
+local function french_punctuation (head)
+ for item in node.traverse_id(GLYPH, head) do
+ local lang = item.lang
+ local char = item.char
+ local fid = item.font
+ local FRspacing = has_attribute(item, FBspacing)
+ FRspacing = FRspacing and FRspacing > 0
+ local FRucsNBSP = has_attribute(item, FBucsNBSP)
+ FRucsNBSP = FRucsNBSP and FRucsNBSP > 0
+ local FRdialect = has_attribute(item, FBdialect)
+ FRdialect = FRdialect and FRdialect > 0
+ local SIG = has_attribute(item, addGUILspace)
+ SIG = SIG and SIG >0
+ if lang ~= FR_fr and lang ~= FR_ca then
+ FRspacing = nil
+ end
+ local nbspace = new_node("glyph")
+ if FRspacing and FB_punct_left[char] and fid > 0 then
+ local prev = item.prev
+ local prev_id, prev_subtype, prev_char
+ if prev then
+ prev_id = prev.id
+ prev_subtype = prev.subtype
+ if prev_id == GLYPH then
+ prev_char = prev.char
+ end
+ end
+% \end{macrocode}
+%
+% \changes{v3.0c}{2014/04/18}{Null glues should not trigger space
+% insertion before high ponctuation. Bug pointed out by Benoit
+% Rivet for the `lstlisting’ environment of the listings package.}
+%
+% \changes{v3.1c}{2014/10/25}{Previous bug fix for null glues
+% (v3.0c) did not work properly. Fixed now (I hope!).
+% Pointed out by Jacques André.}
+%
+% If the previous node is a glue, check its natural width, only
+% positive glues (actually glues > 1 sp, for tabular `l’
+% columns) are to be replaced by a non-breaking space.
+% \begin{macrocode}
+ local is_glue = prev_id == GLUE
+ local glue_wd
+ if is_glue then
+ glue_wd = prev.width
+ end
+ local realglue = is_glue and glue_wd > 1
+% \end{macrocode}
+%
+% \changes{v3.3d}{2017/10/17}{In default mode, for `:’ only, check
+% if next node is a glyph or not. If it is, turn the `auto’ flag
+% to false (avoids spurious spaces in URLs, MSDOS paths or 10:35).}
+%
+% For characters for which |FB_punct_thin| or |FB_punct_thick| is
+% \emph{true}, the amount of spacing to be typeset before them
+% is controlled by commands |\FBthinspace| and |\FBcolonspace|
+% respectively.
+% Two options: if a space has been typed in before (turned into
+% \emph{glue} in the node list), we remove the \emph{glue} and add a
+% nobreak penalty and the required \emph{glue}.
+% Otherwise (|auto| option), the penalty and the required
+% \emph{glue} are inserted if attribute |\FB@addDPspace| is set,
+% unless any of these four conditions is met:
+% a) node is `:’ and the next one is of type GLYPH (avoids spurious
+% spaces in http://mysite, C:\textbackslash{} or 10:35);
+% b) the previous character is part of type |FB_punct_null|
+% (avoids spurious spaces in strings like |(!)| or |??|);
+% c) a null glue (actually glues <= 1 sp for tabulars) preceeds
+% the punctuation character (for tabulars and listings);
+% d) the punctuation character starts a paragraph or an |\hbox{}|.
+%
+% When option \fbo{UnicodeNoBreakSpaces} is set to \fbo{true},
+% a Unicode character U+00A0 or U+202F is inserted instead of
+% penalty and glue.
+% \begin{macrocode}
+ if FB_punct_thin[char] or FB_punct_thick[char] then
+ local SBDP = has_attribute(item, addDPspace)
+ local auto = SBDP and SBDP > 0
+ if FB_punct_thick[char] and auto then
+ local next = item.next
+ local next_id
+ if next then
+ next_id = next.id
+ end
+ if next_id and next_id == GLYPH then
+ auto = false
+ end
+ end
+ if auto then
+ if (prev_char and FB_punct_null[prev_char]) or
+ (is_glue and glue_wd <= 1) or
+ (prev_id == HLIST and prev_subtype == 3) or
+ (prev_id == TEMP) then
+ auto = false
+ end
+ end
+ local fbglue
+ local t
+ if FB_punct_thick[char] then
+ if FRdialect then
+ t = FBsp.colon.gl.ac
+ nbspace.char = FBsp.colon.ch.ac
+ else
+ t = FBsp.colon.gl.fr
+ nbspace.char = FBsp.colon.ch.fr
+ end
+ else
+ if FRdialect then
+ t = FBsp.thin.gl.ac
+ nbspace.char = FBsp.thin.ch.ac
+ else
+ t = FBsp.thin.gl.fr
+ nbspace.char = FBsp.thin.ch.fr
+ end
+ end
+ fbglue = new_glue_scaled(fid, t)
+% \end{macrocode}
+% In case |new_glue_scaled| fails (returns |nil|) the node list
+% remains unchanged.
+% \begin{macrocode}
+ if (realglue or auto) and fbglue then
+ if realglue then
+ head = remove_node(head,prev,true)
+ end
+ if (FRucsNBSP) then
+ nbspace.font = fid
+ insert_node_before(head, item, copy_node(nbspace))
+ else
+ insert_node_before(head, item, copy_node(nobreak))
+ insert_node_before(head, item, copy_node(fbglue))
+ end
+ end
+% \end{macrocode}
+% Let’s consider `»’ now (the only remaining glyph of
+% |FB_punct_left| class): we just have to remove any \emph{glue}
+% possibly preceeding `»’, then to insert the nobreak penalty and
+% the proper \emph{glue} (controlled by |\FBguillspace|).
+% This is done only if French quotes have been `activated’ by
+% options \fbo{og=«, fg=»} in \fbsetup{} and can be denied locally
+% with |\NoAutoSpacing| (this is controlled by the |SIG| flag).
+% If either a) the preceding glyph is member of |FB_guil_null|, or
+% b) `»’ is the first glyph of an |\hbox{}| or a paragraph, nothing
+% is done, this is controlled by the |addgl| flag.
+%
+% \changes{v3.1a}{2014/06/18}{Added flag addgl which must also be true
+% when prev or next is not a char (i.e. \cs{kern}0 in
+% «\cs{texttt}\{a\}»).}
+%
+% \changes{v3.1g}{2015/06/26}{flag addgl set to false for `»’
+% at the beginning of an \cs{hbox} or a paragraph or a tabular
+% `l’ and `c’ columns.}
+%
+% \begin{macrocode}
+ elseif SIG then
+ local addgl = (prev_char and not FB_guil_null[prev_char]) or
+ (not prev_char and
+ prev_id ~= TEMP and
+ not (prev_id == HLIST and prev_subtype == 3)
+ )
+% \end{macrocode}
+% Correction for tabular `c’ (glue 0 plus 1 fil) and `l’ (glue 1sp)
+% columns:
+% \begin{macrocode}
+ if is_glue and glue_wd <= 1 then
+ addgl = false
+ end
+ local t = FBsp.guill.gl.fr
+ nbspace.char = FBsp.guill.ch.fr
+ if FRdialect then
+ t = FBsp.guill.gl.ac
+ nbspace.char = FBsp.guill.ch.ac
+ end
+ local fbglue = new_glue_scaled(fid, t)
+ if addgl and fbglue then
+ if is_glue then
+ head = remove_node(head,prev,true)
+ end
+ if (FRucsNBSP) then
+ nbspace.font = fid
+ insert_node_before(head, item, copy_node(nbspace))
+ else
+ insert_node_before(head, item, copy_node(nobreak))
+ insert_node_before(head, item, copy_node(fbglue))
+ end
+ end
+ end
+ end
+% \end{macrocode}
+% Similarly, for `«’ (unique member of the |FB_punct_right| class):
+% unless either a) the next glyph is member of |FB_guil_null|, or
+% b) `«’ is the last glyph of an |\hbox{}| or a paragraph (then the
+% |addgl| flag is false, nothing is done), we remove any \emph{glue}
+% possibly following it and insert first the proper \emph{glue} then
+% a nobreak penalty so that finally the penalty preceeds the
+% \emph{glue}.
+%
+% \changes{v3.1a}{2014/06/18}{Look ahead when next is a kern
+% (i.e. in « \cs{texttt}\{a\} »).}
+%
+% \changes{v3.1g}{2015/06/26}{Flag addgl set to false for
+% `«’ at the end of an \cs{hbox} or a paragraph or when followed by
+% a null glue (i.e. springs).}
+%
+% \begin{macrocode}
+ if FRspacing and FB_punct_right[char]
+ and fid > 0 and SIG then
+ local next = item.next
+ local next_id, next_subtype, next_char, nextnext, kern_wd
+ if next then
+ next_id = next.id
+ next_subtype = next.subtype
+ if next_id == GLYPH then
+ next_char = next.char
+% \end{macrocode}
+% A |kern0| might hide a |glue|, so look ahead if |next| is a kern
+% (this occurs with |« \texttt{a} »|):
+% \begin{macrocode}
+ elseif next_id == KERN then
+ kern_wd = next.kern
+ if kern_wd == 0 then
+ nextnext = next.next
+ if nextnext then
+ next = nextnext
+ next_id = nextnext.id
+ next_subtype = nextnext.subtype
+ if next_id == GLYPH then
+ next_char = nextnext.char
+ end
+ end
+ end
+ end
+ end
+ local is_glue = next_id == GLUE
+ if is_glue then
+ glue_wd = next.width
+ end
+ local addgl = (next_char and not FB_guil_null[next_char]) or
+ (next and not next_char)
+% \end{macrocode}
+% Correction for tabular `c’ columns. For `r’ columns, a final
+% `«’ character needs to be coded as |\mbox{«}| for proper spacing
+% (|\NoAutoSpacing| is another option).
+% \begin{macrocode}
+ if is_glue and glue_wd == 0 then
+ addgl = false
+ end
+ local fid = item.font
+ local t = FBsp.guill.gl.fr
+ nbspace.char = FBsp.guill.ch.fr
+ if FRdialect then
+ t = FBsp.guill.gl.ac
+ nbspace.char = FBsp.guill.ch.ac
+ end
+ local fbglue = new_glue_scaled(fid, t)
+ if addgl and fbglue then
+ if is_glue then
+ head = remove_node(head,next,true)
+ end
+ if (FRucsNBSP) then
+ nbspace.font = fid
+ insert_node_after(head, item, copy_node(nbspace))
+ else
+ insert_node_after(head, item, copy_node(fbglue))
+ insert_node_after(head, item, copy_node(nobreak))
+ end
+ end
+ end
+ end
+ return head
+end
+return french_punctuation
+%</lua>
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\FB@luatex@punct@french}
+% As a language tag is part of glyph nodes in LuaTeX, no more
+% switching has to be done in |\extrasfrench|, setting the dialect
+% attribute has already be done (see above, p.~\pageref{extrapunct}).
+% We will just redefine |\shorthandoff| and |\shorthandon| in French
+% to issue a warning reminding the user that active characters are no
+% longer used in French with recent LuaTeX engines.
+%
+% \changes{v3.1l}{2016/02/07}{Use \cs{babel@save} to save and restore
+% \cs{shorthandon} and \cs{shorthandoff}.}
+%
+% \begin{macrocode}
+%<*french>
+\ifFB@luatex@punct
+ \newcommand*{\FB@luatex@punct@french}{%
+ \babel@save\shorthandon
+ \babel@save\shorthandoff
+ \def\shorthandoff##1{%
+ \ifx\PackageWarning\@undefined
+ \fb@warning{\noexpand\shorthandoff{;:!?} is helpless with
+ LuaTeX,\\ use \noexpand\NoAutoSpacing
+ *inside a group* instead.}%
+ \else
+ \PackageWarning{french.ldf}{\protect\shorthandoff{;:!?} is
+ helpless with LuaTeX,\MessageBreak use \protect\NoAutoSpacing
+ \space *inside a group* instead;\MessageBreak reported}%
+ \fi}%
+ \def\shorthandon##1{}%
+ }
+ \addto\extrasfrench{\FB@luatex@punct@french}
+% \end{macrocode}
+% \end{macro}
+%
+% \changes{v3.0b}{2014/02/13}{frenchb.lua was not found by
+% Lua function dofile (not kpathsea aware).
+% Call function kpse.find\_file first, as suggested by Paul Gaborit.}
+%
+% \changes{v3.1g}{2015/06/17}{Lua function french\_punctuation is now
+% inserted at the end of the `kerning’ callback (no priority)
+% instead of `hpack\_filter’ and `pre\_linebreak\_filter’.}
+%
+% The next definition will be used to activate Lua punctuation: it
+% loads \file{frenchb.lua} and adds function |french_punctuation|
+% at the end of the |kerning| callback (no priority).
+% \begin{macrocode}
+ \def\activate@luatexpunct{%
+ \directlua{%
+ FR_fr = \the\l@french ; FR_ca = \the\l@acadian ;
+ local path = kpse.find_file("frenchb.lua", "lua")
+ if path then
+ local f = dofile(path)
+ luatexbase.add_to_callback("kerning",
+ f, "frenchb.french_punctuation")
+ else
+ texio.write_nl('')
+ texio.write_nl('*****************************')
+ texio.write_nl('Error: frenchb.lua not found.')
+ texio.write_nl('*****************************')
+ texio.write_nl('')
+ end
+ }%
+ }
+\fi
+% \end{macrocode}
+% End of specific code for punctuation with LuaTeX engines.
+%
+% \subsubsection{Punctuation with XeTeX}
+% \label{sssec-punct-xetex}
+%
+% If |\XeTeXinterchartokenstate| is available, we use the
+% ``inter char’’ mechanism to provide correct spacing in French
+% before the four characters |;| |!| |?| and |:|. The basis of the
+% following code was borrowed from the \pkg{polyglossia} package,
+% see \file{gloss-french.ldf}. We use the same mechanism for French
+% quotes (\texttt{«} and \texttt{»}), when automatic spacing for
+% quotes is required by options \fbo{og=«} and \fbo{fg=»} in
+% \fbsetup{} (see section~\ref{ssec-keyval}).
+%
+% The default value for |\XeTeXcharclass| is 0 for characters tokens
+% and |\FB@nonchar| for all other tokens (glues, kerns, math and box
+% boundaries, etc.).
+% These defaults should not be changed otherwise the spacing before
+% the `high punctuation’ characters and inside quotes might not be
+% correct.
+%
+% We switch |\XeTeXinterchartokenstate| to 1 and change the
+% |\XeTeXcharclass| values of |;| |!| |?| |:| |(| |]|
+% \texttt{«} and \texttt{»} when
+% entering French. Special care is taken to restore them to their
+% inital values when leaving French.
+%
+% \changes{v2.5d}{2011/01/19}{Moved the \cs{newcount} command outside
+% \cs{ifFB@xetex@punct} ... \cs{fi} (it broke Plain formats).}
+%
+% \changes{v3.1g}{2015/06/14}{Use Babel defined loops \cs{bbl@for}
+% instead of \cs{@for} borrowed from file ltcntrl.dtx
+% (\cs{@for} is undefined in Plain).}
+%
+% The following part holds specific code for punctuation with XeTeX
+% engines.
+%
+% \begin{macrocode}
+\ifFB@xetex@punct
+ \ifLaTeXe
+ \PackageInfo{french.ldf}{No need for active punctuation characters%
+ \MessageBreak with this version of XeTeX!%
+ \MessageBreak reported}
+ \else
+ \fb@info{No need for active punctuation characters\\
+ with this version of XeTeX!}
+ \fi
+% \end{macrocode}
+%
+% \changes{v2.5i}{2012/04/20}{Temporary fix: as long as
+% \file{xeCJK.sty} will not use \cs{newXeTeXintercharclass} to
+% allocate its classes, we will have to define 3 fake classes.}
+%
+% \changes{v2.5j}{2012/05/08}{Previous fix removed: bug fixed in
+% \file{xeCJK.sty} version 3.0.4 (06-May-2012).}
+%
+% \changes{v2.6g}{2013/12/09}{U+00A0 (Unicode nobreakspace) and U+202F
+% (Unicode nobreakthinspace) added to class \cs{FB@punctnul}
+% to prevent frenchb from adding it’s own space before `high
+% punctuation’ characters.}
+%
+% \changes{v2.6h}{2014/01/03}{New class \cs{FB@guilnul} for characters
+% U+00A0 (Unicode nobreakspace) and U+202F (Unicode
+% nobreakthinspace), to prevent frenchb from adding spurious spaces
+% inside quotes.}
+%
+% Six new character classes are defined for \frenchb.
+% \begin{macrocode}
+ \newXeTeXintercharclass\FB@punctthick
+ \newXeTeXintercharclass\FB@punctthin
+ \newXeTeXintercharclass\FB@punctnul
+ \newXeTeXintercharclass\FB@guilo
+ \newXeTeXintercharclass\FB@guilf
+ \newXeTeXintercharclass\FB@guilnul
+% \end{macrocode}
+%
+% \changes{v3.1l}{2016/02/07}{Add a variant of \cs{babel@savevariable}
+% to save \cs{XeTeXcharclass}(es) in a loop.}
+%
+% As |\babel@savevariable| doesn’t work inside a |\bbl@for| loop,
+% we define a variant to save the |\XeTeXcharclass| values which
+% will be modified in French.
+% \begin{macrocode}
+ \def\FBsavevariable@loop#1#2{\begingroup
+ \toks@\expandafter{\originalTeX #1}%
+ \edef\x{\endgroup
+ \def\noexpand\originalTeX{\the\toks@ #2=\the#1#2\relax}}%
+ \x}
+% \end{macrocode}
+% |\FB@charlist| holds the all list of characters which have their
+% |\XeTeXcharclass| value modified in French: the first set includes
+% high punctuation, French quotes, opening delimiters and no-break
+% spaces \\[5pt]
+% \begin{tabular}{*{10}{|c}|}\hline
+% "21 &"3A &"3B &"3F &"AB &"BB &"28 &"5B &"A0 &"202F
+% \\ \hline
+% \char"21 &\char"3A &\char"3B &\char"3F & « & »
+% &\char"28 &\char"5B & & \\ \hline
+% \end{tabular}\\[5pt]
+% the second one holds those which need resetting in French when
+% \file{xeCJK.sty} is in use\\[5pt]
+% \begin{tabular}{*{12}{|c}|}\hline
+% "29 &"5D &"7B &"7D &"2C &"2D &"2E &"22 &"25 &"27 &"60 &"2019
+% \\ \hline
+% \char"29 &\char"5D &\char"7B &\char"7D &\char"2C &\char"2D
+% &\char"2E &\char"22 &\char"25 &\textquotesingle &\char"60
+% &\char"27 \\ \hline
+% \end{tabular}
+%
+% \begin{macrocode}
+ \def\FB@charlist{"21,"3A,"3B,"3F,"AB,"BB,"28,"5B,"A0,"202F,%
+ "29,"5D,"7B,"7D,"2C,"2D,"2E,"22,"25,"27,"60,"2019}
+% \end{macrocode}
+%
+% \begin{macro}{\FB@xetex@punct@french}
+% The following command will be executed when entering French, it
+% first saves the values to be modified, then fits them to our
+% needs. It also redefines |\shorthandoff| and |\shorthandon|
+% (locally) to avoid error messages with XeTeX-based engines.
+%
+% \changes{v2.5g}{2011/12/31}{XeTeXcharclass(es) for French quotes will
+% be set to \cs{FB@guilo} and \cs{FB@guilf} by options
+% `og’ and `fg’ in \cs{frenchbsetup}. French quotes should behave
+% as normal characters by default in XeLaTeX as in LaTeX.}
+%
+% \changes{v2.5i}{2012/04/20}{\file{xeCJK.sty} changes the
+% \cs{XeTeXcharclass} of ASCII chars `-’ `,’ `.’ `)’ `]’ `\}’
+% `\{’ `\%’ opening and closing single and double quotes.
+% We set their class to 0 in French and reset their class
+% to their original value when leaving French. See
+% \cs{FB@xetex@punct@nonfrench} below.}
+%
+% \changes{v3.1k}{2015/12/05}{Thin glues (less than 1sp) should not
+% trigger space insertion before high ponctuation. Add a check on
+% \cs{lastkip}.}
+%
+% \changes{v3.1l}{2016/02/07}{Save and restore
+% \cs{XeTeXinterchartokenstate}, \cs{shorthandon}, \cs{shorthandoff}
+% using \cs{babel@savevariable} and \cs{babel@save},
+% \cs{XeTeXcharclass}(es) using \cs{FB@savevariable@loop}.}
+%
+% \changes{v3.2c}{2016/05/14}{Switch \cs{ifFB@spacing} added to all
+% \cs{XeTeXinterchartoks} commands.}
+%
+% \begin{macrocode}
+ \newcommand*{\FB@xetex@punct@french}{%
+ \babel@savevariable{\XeTeXinterchartokenstate}%
+ \babel@save{\shorthandon}%
+ \babel@save{\shorthandoff}%
+ \bbl@for\FB@char\FB@charlist
+ {\FBsavevariable@loop{\XeTeXcharclass}{\FB@char}}%
+ \def\shorthandoff##1{%
+ \ifx\PackageWarning\@undefined
+ \fb@warning{\noexpand\shorthandoff{;:!?} is helpless with
+ XeTeX,\\ use \noexpand\NoAutoSpacing
+ *inside a group* instead.}%
+ \else
+ \PackageWarning{french.ldf}{\protect\shorthandoff{;:!?} is
+ helpless with XeTeX,\MessageBreak use \protect\NoAutoSpacing
+ \space *inside a group* instead;\MessageBreak reported}%
+ \fi}%
+ \def\shorthandon##1{}%
+% \end{macrocode}
+% Let’s now set the classes and interactions between classes.
+% When false, the flag |\ifFB@spacing| switches off any interaction
+% between classes (this flag is controlled by user-level command
+% |\NoAutoSpacing|; this flag is also set to false when the current
+% font is a typewriter font).
+% \begin{macrocode}
+ \XeTeXinterchartokenstate=1
+ \XeTeXcharclass `\: = \FB@punctthick
+ \XeTeXinterchartoks \z@ \FB@punctthick = {%
+ \ifFB@spacing\ifhmode\FDP@colonspace\fi\fi}%
+ \XeTeXinterchartoks \FB@guilf \FB@punctthick = {%
+ \ifFB@spacing\FDP@colonspace\fi}%
+% \end{macrocode}
+% Small glues such as ``glue 1sp’’ in tabular `l’ columns or ``glue
+% 0 plus 1 fil’’ in tabular `c’ columns or \env{lstlisting}
+% environment should not trigger any extra space; they will still do
+% when \fbo{AutoSpacePunctuation} is true: unfortunately
+% |\XeTeXcharclass=\FB@nonchar| isn’t specific to glue tokens (this
+% class includes box and math boundaries f.i.), so the |\else| part
+% cannot be omitted.
+% \begin{macrocode}
+ \XeTeXinterchartoks \FB@nonchar \FB@punctthick = {%
+ \ifFB@spacing
+ \ifhmode
+ \ifdim\lastskip>1sp
+ \unskip\penalty\@M\FBcolonspace
+ \else
+ \FDP@colonspace
+ \fi
+ \fi
+ \fi}%
+ \bbl@for\FB@char
+ {`\;,`\!,`\?}%
+ {\XeTeXcharclass\FB@char=\FB@punctthin}%
+ \XeTeXinterchartoks \z@ \FB@punctthin = {%
+ \ifFB@spacing\ifhmode\FDP@thinspace\fi\fi}%
+ \XeTeXinterchartoks \FB@guilf \FB@punctthin = {%
+ \ifFB@spacing\FDP@thinspace\fi}%
+ \XeTeXinterchartoks \FB@nonchar \FB@punctthin = {%
+ \ifFB@spacing
+ \ifhmode
+ \ifdim\lastskip>1sp
+ \unskip\penalty\@M\FBthinspace
+ \else
+ \FDP@thinspace
+ \fi
+ \fi
+ \fi}%
+ \XeTeXinterchartoks \FB@guilo \z@ = {%
+ \ifFB@spacing\FB@guillspace\fi}%
+ \XeTeXinterchartoks \FB@guilo \FB@nonchar = {%
+ \ifFB@spacing\FB@guillspace\ignorespaces\fi}%
+ \XeTeXinterchartoks \z@ \FB@guilf = {%
+ \ifFB@spacing\FB@guillspace\fi}%
+ \XeTeXinterchartoks \FB@punctthin \FB@guilf = {%
+ \ifFB@spacing\FB@guillspace\fi}%
+ \XeTeXinterchartoks \FB@nonchar \FB@guilf = {%
+ \ifFB@spacing\unskip\FB@guillspace\fi}%
+% \end{macrocode}
+% This will avoid spurious spaces in (!), [?] and with Unicode
+% non-breaking spaces (U+00A0, U+202F):
+% \begin{macrocode}
+ \bbl@for\FB@char
+ {`\[,`\(,"A0,"202F}%
+ {\XeTeXcharclass\FB@char=\FB@punctnul}%
+% \end{macrocode}
+% These characters have their class changed by \file{xeCJK.sty},
+% let’s reset them to 0 in French.
+% \begin{macrocode}
+ \bbl@for\FB@char
+ {`\{,`\,,`\.,`\-,`\),`\],`\},`\%,"22,"27,"60,"2019}%
+ {\XeTeXcharclass\FB@char=\z@}%
+ }
+ \addto\extrasfrench{\FB@xetex@punct@french}
+% \end{macrocode}
+% \end{macro}
+%
+% End of specific code for punctuation with modern XeTeX engines.
+% \begin{macrocode}
+\fi
+% \end{macrocode}
+%
+% \subsubsection{Punctuation with standard (pdf)TeX}
+% \label{sssec-punct-tex}
+%
+% In standard (pdf)TeX we need to make the four characters |;| |!| |?|
+% and |:| `active’ and provide their definitions.
+% \begin{macrocode}
+\ifFB@active@punct
+ \initiate@active@char{:}%
+ \initiate@active@char{;}%
+ \initiate@active@char{!}%
+ \initiate@active@char{?}%
+% \end{macrocode}
+% We first tune the amount of space before \texttt{;}
+% \texttt{!} \texttt{?} and \texttt{:}. This should only happen
+% in horizontal mode, hence the test |\ifhmode|.
+%
+% In horizontal mode, if a space has been typed before `;’ we
+% remove it and put a non-breaking |\FBthinspace| instead.
+% If no space has been typed, we add |\FDP@thinspace| which will be
+% defined, up to the user’s wishes, as a non-breaking |\FBthinspace|
+% or as |\@empty|.
+%
+% \changes{v3.1k}{2015/12/05}{(pdfTeX shorthands) test on \cs{lastskip}
+% changed from 0pt to 1sp for active punctuation for consistency
+% with XeTeX and LuaTeX.}
+%
+% \changes{v3.2c}{2016/05/14}{Switch \cs{ifFB@spacing} added to the
+% four French shorthands.}
+%
+% \begin{macrocode}
+ \declare@shorthand{french}{;}{%
+ \ifFB@spacing
+ \ifhmode
+ \ifdim\lastskip>1sp
+ \unskip\penalty\@M\FBthinspace
+ \else
+ \FDP@thinspace
+ \fi
+ \fi
+ \fi
+% \end{macrocode}
+% Now we can insert a |;| character.
+% \begin{macrocode}
+ \string;}
+% \end{macrocode}
+% The next three definitions are very similar.
+% \begin{macrocode}
+ \declare@shorthand{french}{!}{%
+ \ifFB@spacing
+ \ifhmode
+ \ifdim\lastskip>1sp
+ \unskip\penalty\@M\FBthinspace
+ \else
+ \FDP@thinspace
+ \fi
+ \fi
+ \fi
+ \string!}
+ \declare@shorthand{french}{?}{%
+ \ifFB@spacing
+ \ifhmode
+ \ifdim\lastskip>1sp
+ \unskip\penalty\@M\FBthinspace
+ \else
+ \FDP@thinspace
+ \fi
+ \fi
+ \fi
+ \string?}
+ \declare@shorthand{french}{:}{%
+ \ifFB@spacing
+ \ifhmode
+ \ifdim\lastskip>1sp
+ \unskip\penalty\@M\FBcolonspace
+ \else
+ \FDP@colonspace
+ \fi
+ \fi
+ \fi
+ \string:}
+% \end{macrocode}
+% 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}
+% We specify that the French group of shorthands should be used when
+% switching to French.
+% \begin{macrocode}
+ \addto\extrasfrench{\languageshorthands{french}%
+% \end{macrocode}
+% These characters are `turned on’ once, later their definition may
+% vary. Don’t misunderstand the following code: they keep being
+% active all along the document, even when leaving French.
+% \begin{macrocode}
+ \bbl@activate{:}\bbl@activate{;}%
+ \bbl@activate{!}\bbl@activate{?}%
+ }
+ \addto\noextrasfrench{%
+ \bbl@deactivate{:}\bbl@deactivate{;}%
+ \bbl@deactivate{!}\bbl@deactivate{?}%
+ }
+\fi
+% \end{macrocode}
+%
+% \subsubsection{Punctuation switches common to all engines}
+% \label{sssec-punct-switches}
+%
+% A new `if’ |\ifFBAutoSpacePunctuation| needs to be defined now to
+% control the two possible ways of dealing with `high punctuation’.
+% it’s default value is true, but it can be set to false by
+% \fbsetup{AutoSpacePunctuation=false} for finer control.
+% \begin{macrocode}
+\newif\ifFBAutoSpacePunctuation \FBAutoSpacePunctuationtrue
+% \end{macrocode}
+%
+% \begin{macro}{\AutoSpaceBeforeFDP}
+% \begin{macro}{\NoAutoSpaceBeforeFDP}
+%
+% \changes{v2.3a}{2008/10/10}{\cs{NoAutoSpaceBeforeFDP} and
+% \cs{AutoSpaceBeforeFDP} now set the flag
+% \cs{ifFBAutoSpacePunctuation} accordingly (LaTeX only).}
+%
+% \changes{v2.3e}{2009/10/10}{Execute \cs{AutoSpaceBeforeFDP}
+% also in LaTeX to define \cs{FDP@colonspace}: needed for
+% tex4ht, pointed out by MPG.}
+%
+% |\autospace@beforeFDP| and |\noautospace@beforeFDP| are internal
+% commands. |\autospace@beforeFDP| defines |\FDP@thinspace| and
+% |\FDP@colonspace| as non-breaking spaces and sets LuaTeX attribute
+% |\FB@addDPspace| to 1 (true), while |\noautospace@beforeFDP|
+% lets these spaces empty and sets flag |\FB@addDPspace|
+% to 0 (false). User commands |\AutoSpaceBeforeFDP| and
+% |\NoAutoSpaceBeforeFDP| do the same and take care of the flag
+% |\ifFBAutoSpacePunctuation| in \LaTeX{}.
+% Set the default now for Plain (done later for LaTeX).
+% \begin{macrocode}
+\def\autospace@beforeFDP{%
+ \ifFB@luatex@punct\FB@addDPspace=1 \fi
+ \def\FDP@thinspace{\penalty\@M\FBthinspace}%
+ \def\FDP@colonspace{\penalty\@M\FBcolonspace}}
+\def\noautospace@beforeFDP{%
+ \ifFB@luatex@punct\FB@addDPspace=0 \fi
+ \let\FDP@thinspace\@empty
+ \let\FDP@colonspace\@empty}
+\ifLaTeXe
+ \def\AutoSpaceBeforeFDP{\autospace@beforeFDP
+ \FBAutoSpacePunctuationtrue}
+ \def\NoAutoSpaceBeforeFDP{\noautospace@beforeFDP
+ \FBAutoSpacePunctuationfalse}
+ \AtEndOfPackage{\AutoSpaceBeforeFDP}
+\else
+ \let\AutoSpaceBeforeFDP\autospace@beforeFDP
+ \let\NoAutoSpaceBeforeFDP\noautospace@beforeFDP
+ \AutoSpaceBeforeFDP
+\fi
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \changes{v2.3a}{2008/10/10}{In LaTeX, frenchb no longer adds spaces
+% before `high punctuation’ characters in computer code.
+% Suggested by Yannis Haralambous.}
+%
+% \begin{macro}{\rmfamilyFB}
+% \begin{macro}{\sffamilyFB}
+% \begin{macro}{\ttfamilyFB}
+%
+% \changes{v2.3c}{2009/02/07}{Commands \cs{ttfamily}, \cs{rmfamily}
+% and \cs{sffamily} have to be robust. Bug introduced in 2.3a,
+% pointed out by Manuel Pégourié-Gonnard.}
+%
+% In LaTeX2e |\ttfamily| (and hence |\texttt|) will be redefined
+% `AtBeginDocument’ as |\ttfamilyFB| so that no space
+% is added before the four |; : ! ?| characters, even if
+% \fbo{AutoSpacePunctuation} is \fbo{true}. When
+% \fbo{AutoSpacePunctuation} is \fbo{false}, the eventually typed
+% spaces are left unchanged (not turned into thin spaces, no penalty
+% added). |\rmfamily| and |\sffamily| need to be redefined also
+% (|\ttfamily| is not always used inside a group, its effect can be
+% cancelled by |\rmfamily| or |\sffamily|).
+%
+% These redefinitions can be canceled if necessary, for instance to
+% recompile older documents, see option \fbo{OriginalTypewriter}
+% below.
+%
+% \changes{v2.4c}{2010/05/23}{In \cs{ttfamilyFB}, also cancel
+% automatic spaces inside French guillemets entered as characters
+% (see \cs{frenchbsetup}).}
+%
+% \changes{v3.2c}{2016/05/14}{New definitions of \cs{ttfamilyFB} and
+% co, common to all engines, based on \cs{FB@spacing@off}
+% and\cs{FB@spacing@on}.}
+%
+% To be consistent with what is done for the |; : ! ?|
+% characters, |\ttfamilyFB| also switches off insertion of spaces
+% inside French guillemets \emph{when they are typed in as
+% characters} with the `og’/`fg’ options in \fbsetup{}.
+% This is also a workaround for the weird behaviour of these
+% characters in verbatim mode.
+%
+% \begin{macrocode}
+\ifLaTeXe
+ \DeclareRobustCommand\ttfamilyFB{\FB@spacing@off \ttfamilyORI}
+ \DeclareRobustCommand\rmfamilyFB{\FB@spacing@on \rmfamilyORI}
+ \DeclareRobustCommand\sffamilyFB{\FB@spacing@on \sffamilyORI}
+\fi
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \changes{v2.5a}{2010/08/14}{New command \cs{NoAutoSpacing},
+% suggested by MPG.}
+%
+% \begin{macro}{\NoAutoSpacing}
+% The following command disables automatic spacing for high
+% punctuation and French quote characters; it also switches off
+% active punctuation characters (if any).
+% It is engine independent (works for TeX, LuaTeX and
+% XeTeX based engines) and is meant to be used inside a group.
+%
+% \changes{v3.2b}{2016/04/18}{\cs{NoAutoSpacing} made robust.}
+%
+% \changes{v3.2c}{2016/05/14}{New definition based on
+% \cs{FB@spacing@off} common to all engines.}
+%
+% \begin{macrocode}
+\DeclareRobustCommand*{\NoAutoSpacing}{%
+ \FB@spacing@off
+ \ifFB@active@punct\shorthandoff{;:!?}\fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Commands for French quotation marks}
+% \label{ssec-quotes}
+%
+% \begin{macro}{\guillemotleft}
+% \begin{macro}{\guillemotright}
+% \begin{macro}{\textquoteddblleft}
+% \begin{macro}{\textquoteddblright}
+% pdfLaTeX users are supposed to use 8-bit output
+% encodings (T1, LY1,\dots) to typeset French, those who still
+% stick to OT1 should load \pkg{aeguill} or a similar package.
+% In both cases the commands |\guillemotleft| and |\guillemotright|
+% will print the French opening and closing quote characters from
+% the output font.
+% For XeLaTeX and LuaLaTeX, |\guillemotleft| and |\guillemotright|
+% are defined by package \pkg{fontspec} (v.~2.5d and up).
+%
+% \changes{v2.5a}{2010/08/20}{Change \cs{guillemotleft} and
+% \cs{guillemotright} definitions for Unicode anf provide
+% definitions for \cs{textquotedblleft} and
+% \cs{textquotedbright}. Insures correct printing of quotes
+% by \cs{og} and \cs{fg} in French and outside.}
+%
+% We provide the following definitions for non-LaTeX users only as
+% fall-back, they are welcome to change them for anything better.
+% \begin{macrocode}
+\ifLaTeXe
+\else
+ \ifFBunicode
+ \def\guillemotleft{{\char"00AB}}
+ \def\guillemotright{{\char"00BB}}
+ \def\textquotedblleft{{\char"201C}}
+ \def\textquotedblright{{\char"201D}}
+ \else
+ \def\guillemotleft{\leavevmode\raise0.25ex
+ \hbox{$\scriptscriptstyle\ll$}}
+ \def\guillemotright{\raise0.25ex
+ \hbox{$\scriptscriptstyle\gg$}}
+ \def\textquotedblleft{``}
+ \def\textquotedblright{''}
+ \fi
+ \let\xspace\relax
+\fi
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \changes{v3.4a}{2018/01/18}{New \cs{FBgspchar} to customise the
+% space character to be used for \cs{og} and\cs{fg} with the
+% UnicodeNoBreakSpaces option.}
+%
+% \begin{macro}{\FBgspchar}
+% \begin{macro}{\FB@og}
+% \begin{macro}{\FB@fg}
+% The next step is to provide correct spacing after `«’ and before
+% `»’; no line break is allowed neither \emph{after} the opening
+% one, nor \emph{before} the closing one.
+% French quotes (including spacing) are printed by |\FB@og| and
+% |\FB@fg|, the expansion of the top level commands |\og| and |\og|
+% is different in and outside French.
+%
+% \changes{v3.0a}{2014/01/10}{Definitions of \cs{FB@og} and \cs{FB@fg}
+% now depend on punctuation handling (LuaTeX / XeTeX / active).}
+%
+% The definitions of |\FB@og| and |\FB@fg| need some engine-dependent
+% tuning: for LuaTeX, |\FB@spacing| is set to~0 locally to prevent
+% the quotes characters from adding space when option
+% \fbo{og=«, fg=»} is set.
+% \begin{macrocode}
+\newcommand*{\FB@guillspace}{\penalty\@M\FBguillspace}
+\newcommand*{\FBgspchar}{\char"A0\relax}
+\newif\ifFBucsNBSP
+\ifFB@luatex@punct
+ \DeclareRobustCommand*{\FB@og}{\leavevmode
+ \bgroup\FB@spacing=0 \guillemotleft\egroup
+ \ifFBucsNBSP\FBgspchar\else\FB@guillspace\fi}
+ \DeclareRobustCommand*{\FB@fg}{\ifdim\lastskip>\z@\unskip\fi
+ \ifFBucsNBSP\FBgspchar\else\FB@guillspace\fi
+ \bgroup\FB@spacing=0 \guillemotright\egroup}
+\fi
+% \end{macrocode}
+% With XeTeX, |\ifFB@spacing| is set to |false| locally for the
+% same reason.
+% \begin{macrocode}
+\ifFB@xetex@punct
+ \DeclareRobustCommand*{\FB@og}{\leavevmode
+ \bgroup\FB@spacingfalse\guillemotleft\egroup
+ \FB@guillspace}
+ \DeclareRobustCommand*{\FB@fg}{\ifdim\lastskip>\z@\unskip\fi
+ \FB@guillspace
+ \bgroup\FB@spacingfalse\guillemotright\egroup}
+\fi
+\ifFB@active@punct
+ \DeclareRobustCommand*{\FB@og}{\leavevmode
+ \guillemotleft
+ \FB@guillspace}
+ \DeclareRobustCommand*{\FB@fg}{\ifdim\lastskip>\z@\unskip\fi
+ \FB@guillspace
+ \guillemotright}
+\fi
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\og}
+% \begin{macro}{\fg}
+%
+% The user level macros for quotation marks are named |\og|
+% (``\underline{o}uvrez \underline{g}uillemets’’) and |\fg|
+% (``\underline{f}ermez \underline{g}uillemets’’).
+% Another option for typesetting quotes in French is to use the
+% command |\frquote| (see below).
+% Dummy definition of |\og| and |\fg| just to ensure that this
+% commands are not yet defined.
+% \begin{macrocode}
+\newcommand*{\og}{\@empty}
+\newcommand*{\fg}{\@empty}
+% \end{macrocode}
+%
+% The definitions of |\og| and |\fg| for 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.
+% We’ll try to be smart to users of David~Carlisle’s \pkg{xspace}
+% package: if this package is loaded there will be no need for |{}|
+% or |\ | to get a space after |\fg|, otherwise |\xspace| will be
+% defined as |\relax| (done at the end of this file).
+%
+% \changes{v2.5a}{2010/08/20}{\cs{og} and \cs{fg} do not print
+% correctly in English when using XeTeX or LuaTeX, fixed by using
+% \cs{textquotedblleft} and \cs{textquotedblright} defined above.}
+%
+% \changes{v3.2a}{2016/03/18}{\cs{xspace} moved from \cs{FB@fg} to
+% \cs{fg}: \cs{xspace} messes up \cs{frquote}, pointed out by Sonia
+% Labetoulle. As a side effect \cs{xspace} is now active in \cs{fg}
+% in and outside French.}
+%
+% \begin{macrocode}
+\ifLaTeXe
+ \def\bbl@frenchguillemets{%
+ \renewcommand*{\og}{\FB@og}%
+ \renewcommand*{\fg}{\FB@fg\xspace}}
+ \renewcommand*{\og}{\textquotedblleft}
+ \renewcommand*{\fg}{\ifdim\lastskip>\z@\unskip\fi
+ \textquotedblright\xspace}
+\else
+ \def\bbl@frenchguillemets{\let\og\FB@og
+ \let\fg\FB@fg}
+ \def\og{\textquotedblleft}
+ \def\fg{\ifdim\lastskip>\z@\unskip\fi\textquotedblright}
+\fi
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \changes{v3.0a}{2014/01/10}{\cs{bbl@nonfrenchguillemets} deleted,
+% use \cs{babel@save} instead.}
+%
+% \begin{macrocode}
+\addto\extrasfrench{\babel@save\og \babel@save\fg \bbl@frenchguillemets}
+% \end{macrocode}
+%
+% \changes{v3.1a}{2014/05/20}{New command \cs{frquote} for imbedded or
+% long French quotations.}
+%
+% \begin{macro}{\frquote}
+% Another way of entering French quotes relies on |\frquote{}|
+% with supports up to two levels of quotes.
+% Let’s define the default quote characters to be used for level one
+% or two of quotes\dots{}
+% \begin{macrocode}
+\newcommand*{\ogi}{\FB@og}
+\newcommand*{\fgi}{\FB@fg}
+\newcommand*{\@ogi}{\ifmmode\hbox{\ogi}\else\ogi\fi}
+\newcommand*{\@fgi}{\ifmmode\hbox{\fgi}\else\fgi\fi}
+\newcommand*{\ogii}{\textquotedblleft}
+\newcommand*{\fgii}{\textquotedblright}
+\newcommand*{\@ogii}{\ifmmode\hbox{\ogii}\else\ogii\fi}
+\newcommand*{\@fgii}{\ifmmode\hbox{\fgii}\else\fgii\fi}
+% \end{macrocode}
+% and the needed technical stuff to handle options:
+%
+% \changes{v3.2g}{2017/01/30}{Default options of \cs{frquote} are no
+% longer engine-dependent.}
+%
+% \changes{v3.5b}{2018/07/15}{New command \cs{FB@addquote@everypar} to
+% manage \cs{everypar}: \cs{frquote} failed when used immediately
+% after a sectionning command.}
+%
+% \begin{macrocode}
+\newcount\FBguill@level
+\newtoks\FBold@everypar
+% \end{macrocode}
+% |\FB@addquote@everypar| was borrowed from \file{csquotes.sty}.
+% \begin{macrocode}
+\def\FB@addquote@everypar{%
+ \let\FBnew@everypar\everypar
+ \FBold@everypar=\expandafter{\the\everypar}%
+ \FBnew@everypar={\the\FBold@everypar\FBeverypar@quote}%
+ \let\everypar\FBold@everypar
+ \let\FB@addquote@everypar\relax
+}
+\newif\ifFBcloseguill \FBcloseguilltrue
+\newif\ifFBInnerGuillSingle
+\def\FBguillopen{\bgroup\NoAutoSpacing\guillemotleft\egroup}
+\def\FBguillclose{\bgroup\NoAutoSpacing\guillemotright\egroup}
+\let\FBguillnone\empty
+\let\FBeveryparguill\FBguillopen
+\let\FBeverylineguill\FBguillnone
+\let\FBeverypar@quote\relax
+\let\FBeveryline@quote\empty
+% \end{macrocode}
+% The main command |\frquote| accepts (in LaTeX2e only) a starred
+% version which suppresses the closing quote; it is meant to be used
+% for inner quotations which end together with the outer one, then
+% only one closing guillemet (the outer one) should be printed.
+% \begin{macrocode}
+\ifLaTeXe
+ \DeclareRobustCommand\frquote{%
+ \@ifstar{\FBcloseguillfalse\fr@quote}%
+ {\FBcloseguilltrue\fr@quote}}
+\else
+ \newcommand\frquote[1]{\fr@quote{#1}}
+\fi
+% \end{macrocode}
+%
+% \changes{v3.1j}{2015/11/25}{\cs{fr@quote} completely rewritten:
+% \cs{leavevmode} added and explicitly save/retore \cs{everypar} and
+% \cs{localleftbox} instead of using a group in order to ensure
+% compatibility with package wrapfig.}
+%
+% \changes{v3.1j}{2015/11/21}{\cs{PackageWarning} is undefined in
+% Plain, use \cs{fb@warning} instead.}
+%
+% \changes{v3.3a}{2017/04/30}{\cs{FB@quotespace} (kern), changed
+% into \cs{FB@guillspace}.}
+%
+% The internal command |\fr@quote| takes one (long) argument: the
+% quotation text.
+% \begin{macrocode}
+\newcommand{\fr@quote}[1]{%
+ \leavevmode
+ \advance\FBguill@level by \@ne
+ \ifcase\FBguill@level
+ \or
+% \end{macrocode}
+% This for level 1 (outer) quotations: set |\FBeverypar@quote|
+% for level 1 quotations and add it to |\everypar| using
+% |\FB@addquote@everypar|, then print the quotation:
+% \begin{macrocode}
+ \ifx\FBeveryparguill\FBguillnone
+ \else
+ \def\FBeverypar@quote{\FBeveryparguill\FB@guillspace}%
+ \FB@addquote@everypar
+ \fi
+ \@ogi #1\@fgi
+ \or
+% \end{macrocode}
+% This for level 2 (inner) quotations: Omega’s command
+% |\localleftbox| included in LuaTeX, is convenient for repeating
+% guillemets at the beginning of every line.\hlabel{cs:localleftbox}
+%
+% \changes{v3.1i}{2015/10/04}{\cs{luatexlocalleftbox} changed to
+% \cs{localleftbox} by new LaTeX release 2015/10/01.}
+%
+% \changes{v3.5c}{2018/09/14}{\cs{FBeverypar@quote}’s value now properly
+% reset across level changes.}
+%
+% \changes{v3.5e}{2019/03/23}{reset \cs{FB@addGUILspace} attribute
+% inside \cs{localleftbox} (LuaTeX).}
+%
+% \begin{macrocode}
+ \ifx\FBeverylineguill\FBguillopen
+ \def\FBeveryline@quote{\FB@addGUILspace=0 \guillemotleft
+ \FB@guillspace}%
+ \localleftbox{\FBeveryline@quote}%
+ \let\FBeverypar@quote\relax
+ \@ogi #1\ifFBcloseguill\@fgi\fi
+ \else
+ \ifx\FBeverylineguill\FBguillclose
+ \def\FBeveryline@quote{\FB@addGUILspace=0 \guillemotright
+ \FB@guillspace}%
+ \localleftbox{\FBeveryline@quote}%
+ \let\FBeverypar@quote\relax
+ \@ogi #1\ifFBcloseguill\@fgi\fi
+ \else
+% \end{macrocode}
+% otherwise we need to redefine |\FBeverypar@quote| (and eventually
+% |\ogii|, |\fgii|) for level 2 quotations:
+% \begin{macrocode}
+ \let\FBeverypar@quote\relax
+ \ifFBInnerGuillSingle
+ \def\ogii{\leavevmode
+ \guilsinglleft\FB@guillspace}%
+ \def\fgii{\ifdim\lastskip>\z@\unskip\fi
+ \FB@guillspace\guilsinglright}%
+ \ifx\FBeveryparguill\FBguillopen
+ \def\FBeverypar@quote{\guilsinglleft\FB@guillspace}%
+ \fi
+ \ifx\FBeveryparguill\FBguillclose
+ \def\FBeverypar@quote{\guilsinglright\FB@guillspace}%
+ \fi
+ \fi
+ \@ogii #1\ifFBcloseguill \@fgii \fi
+ \fi
+ \fi
+ \else
+% \end{macrocode}
+% Warn if |\FBguill@level| >~2:
+% \begin{macrocode}
+ \ifx\PackageWarning\@undefined
+ \fb@warning{\noexpand\frquote\space handles up to
+ two levels.\\ Quotation not printed.}%
+ \else
+ \PackageWarning{french.ldf}{%
+ \protect\frquote\space handles up to two levels.
+ \MessageBreak Quotation not printed. Reported}
+ \fi
+ \fi
+% \end{macrocode}
+%
+% \changes{v3.5e}{2019/03/14}{Make resettings global on exit.}
+%
+% Closing: step down |\FBguill@level| and clean on exit.
+% Changes made global in case |\frquote{}| ends inside an
+% environment.
+% \begin{macrocode}
+ \global\advance\FBguill@level by \m@ne
+ \ifcase\FBguill@level \global\let\FBeverypar@quote\relax
+ \or \gdef\FBeverypar@quote{\FBeveryparguill\FB@guillspace}%
+ \global\let\FBeveryline@quote\empty
+ \ifx\FBeverylineguill\FBguillnone\else\localleftbox{}\fi
+ \fi
+}
+% \end{macrocode}
+% \changes{v3.5e}{2019/03/14}{new command \cs{NoEveryParQuote}.}
+%
+% The next command is intended to be used in list environments to
+% suppress quotes which might be added by |\FBeverypar@quote| after
+% items for instance.
+% \begin{macrocode}
+\newcommand*{\NoEveryParQuote}{\let\FBeveryparguill\FBguillnone}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Date in French}
+% \label{sssec-date}
+%
+% \begin{macro}{\frenchtoday}
+% \begin{macro}{\frenchdate}
+% \begin{macro}{\datefrench}
+% The following code creates a macro |\datefrench| which in turn
+% defines command |\frenchtoday| (|\today| is defined as
+% |\frenchtoday| in French).
+% The corresponding commands for the French dialect, |\dateacadian|
+% and |\acadiantoday| are also created btw.
+% This new implementation relies on commands |\SetString| and
+% |\SetStringLoop|, therefore requires \babel~3.10 or newer.
+%
+% \changes{v2.0}{2006/11/06}{2 `\cs{relax}’ added in
+% \cs{today}’s definition.}
+%
+% \changes{v2.1a}{2008/03/25}{\cs{today} changed (correction in 2.0
+% was wrong: \cs{today} was printed without spaces in toc).}
+%
+% \changes{v3.0a}{2014/02/18}{Take advantage of babel’s \cs{SetString}
+% commands for \cs{datefrench}. Doesn’t work with Plain (yet?).}
+%
+% \changes{v3.4a}{2018/01/04}{Specific code for Plain finally removed
+% (babel bug reported).}
+%
+% \changes{v3.4b}{2018/02/04}{Do not redefine \cs{date} as
+% \cs{frenchdate} in French.}
+%
+% Explicitly defining |\BabelLanguages| as the list of all French
+% dialects defines \emph{both} |\datefrench| and |\dateacadian|;
+% this is required as \file{french.ldf} is read only once even if
+% both language options \opt{french} and \opt{acadian} are supplied
+% to \babel. Note that coding |\StartBabelCommands*{french,acadian}|
+% would \emph{only} define |\csname date\CurrentOption\endcsname|,
+% leaving the second language undefined in \babel’s sens.
+% \begin{macrocode}
+\def\BabelLanguages{french,acadian}
+\StartBabelCommands*{\BabelLanguages}{date}
+ [unicode, fontenc=TU EU1 EU2, charset=utf8]
+ \SetString\monthiiname{février}
+ \SetString\monthviiiname{août}
+ \SetString\monthxiiname{décembre}
+\StartBabelCommands*{\BabelLanguages}{date}
+ \SetStringLoop{month#1name}{%
+ janvier,f\'evrier,mars,avril,mai,juin,juillet,%
+ ao\^ut,septembre,octobre,novembre,d\'ecembre}
+ \SetString\today{\FB@date{\year}{\month}{\day}}
+\EndBabelCommands
+% \end{macrocode}
+% |\frenchdate| (which produces an unbreakable string) and
+% |\frenchtoday| (breakable) both rely on |\FB@date|, the inner
+% group is needed for |\hbox|.
+% \begin{macrocode}
+\newcommand*{\FB@date}[3]{%
+ {{\number#3}\ifnum1=#3{\ier}\fi\FBdatespace
+ \csname month\romannumeral#2name\endcsname
+ \ifx#1\@empty\else\FBdatespace\number#1\fi}}
+\newcommand*{\FBdatebox}{\hbox}
+\newcommand*{\FBdatespace}{\space}
+\newcommand*{\frenchdate}{\FBdatebox\FB@date}
+\newcommand*{\acadiandate}{\FBdatebox\FB@date}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Extra utilities}
+%
+% Let’s provide the French user with some extra utilities.
+%
+% \changes{v2.1a}{2008/03/24}{Command \cs{fup} added to produce
+% better superscripts than \cs{textsuperscript}.}
+%
+% \begin{macro}{\up}
+%
+% \changes{v2.1c}{2008/04/29}{Provide a temporary definition
+% (hyperref safe) of \cs{up} in case it has to be expanded in
+% the preamble (by beamer’s \cs{title} command for instance).}
+%
+% \changes{v2.4d}{2010/07/28}{Command \cs{up} defined with
+% \cs{providecommand} instead of \cs{newcommand} as \cs{up} may be
+% defined elsewhere (catalan.ldf).
+% Bug pointed out by Felip Manyé i Ballester.}
+%
+% \begin{macro}{\fup}
+%
+% \changes{v2.1b}{2008/04/02}{Command \cs{fup} changed to use
+% real superscripts from fourier v.~1.6.}
+%
+% \changes{v2.2a}{2008/05/08}{\cs{newif} and \cs{newdimen} moved
+% before \cs{ifLaTeXe} to avoid an error with plainTeX.}
+%
+% \changes{v2.3a}{2008/09/30}{\cs{lowercase} changed to
+% \cs{MakeLowercase} as the former doesn’t work for non ASCII
+% characters in encodings like applemac, utf-8,\dots}
+%
+% |\up| eases the typesetting of superscripts like
+% `1\up{er}’. Up to version 2.0 of \frenchb{} |\up| was just a
+% shortcut for |\textsuperscript| in LaTeX2e, but several users
+% complained that |\textsuperscript| typesets superscripts
+% too high and too big, so we now define |\fup| as an attempt to
+% produce better looking superscripts. |\up| is defined as |\fup|
+% but \fbsetup{FrenchSuperscripts=false} redefines |\up|
+% as |\textsuperscript| for compatibility with previous versions.
+%
+% When a font has built-in superscripts, the best thing to do is
+% to just use them, otherwise |\fup| has to simulate superscripts
+% by scaling and raising ordinary letters. Scaling is done using
+% package \pkg{scalefnt} which will be loaded at the end of
+% \babel’s loading (\frenchb{} being an option of \babel, it cannot
+% load a package while being read).
+%
+% \begin{macrocode}
+\newif\ifFB@poorman
+\newdimen\FB@Mht
+\ifLaTeXe
+ \AtEndOfPackage{\RequirePackage{scalefnt}}
+% \end{macrocode}
+% |\FB@up@fake| holds the definition of fake superscripts.
+% The scaling ratio is 0.65, raising is computed to put the top of
+% lower case letters (like `m’) just under the top of upper case
+% letters (like `M’), precisely 12\% down. The chosen settings
+% look correct for most fonts, but can be tuned by the end-user
+% if necessary by changing |\FBsupR| and |\FBsupS| commands.
+%
+% |\FB@lc| is defined as |\MakeLowercase| to inhibit the uppercasing
+% of superscripts (this may happen in page headers with the standard
+% classes but is wrong); |\FB@lc| can be redefined to do nothing
+% by option \fbo{LowercaseSuperscripts=false} of \fbsetup{}.
+% \begin{macrocode}
+ \newcommand*{\FBsupR}{-0.12}
+ \newcommand*{\FBsupS}{0.65}
+ \newcommand*{\FB@lc}[1]{\MakeLowercase{#1}}
+ \DeclareRobustCommand*{\FB@up@fake}[1]{%
+ \settoheight{\FB@Mht}{M}%
+ \addtolength{\FB@Mht}{\FBsupR \FB@Mht}%
+ \addtolength{\FB@Mht}{-\FBsupS ex}%
+ \raisebox{\FB@Mht}{\scalefont{\FBsupS}{\FB@lc{#1}}}%
+ }
+% \end{macrocode}
+% The only packages I currently know to take advantage of real
+% superscripts are a) \pkg{realscripts} used in conjunction with
+% XeLaTeX or LuaLaTeX and OpenType fonts having the font feature
+% `VerticalPosition=Superior’ and b) \pkg{fourier}
+% (from version 1.6) when Expert Utopia fonts are available.
+%
+% |\FB@up| checks whether the current font is a Type1 `Expert’
+% (or `Pro’) font with real superscripts or not (the code works
+% currently only with \file{fourier-1.6} but could work with any
+% Expert Type1 font with built-in superscripts, see below), and
+% decides to use real or fake superscripts.
+% It works as follows: the content of |\f@family| (family name of
+% the current font) is split by |\FB@split| into two pieces, the
+% first three characters (`|fut|’ for Fourier, `|ppl|’ for Adobe’s
+% Palatino, \dots) stored in |\FB@firstthree| and the rest stored
+% in |\FB@suffix| which is expected to be `|x|’ or `|j|’ for expert
+% fonts.
+% \begin{macrocode}
+ \def\FB@split#1#2#3#4\@nil{\def\FB@firstthree{#1#2#3}%
+ \def\FB@suffix{#4}}
+ \def\FB@x{x}
+ \def\FB@j{j}
+ \DeclareRobustCommand*{\FB@up}[1]{%
+ \bgroup \FB@poormantrue
+ \expandafter\FB@split\f@family\@nil
+% \end{macrocode}
+% Then |\FB@up| looks for a \file{.fd} file named \file{t1fut-sup.fd}
+% (Fourier) or \file{t1ppl-sup.fd} (Palatino), etc.\ supposed to
+% define the subfamily (|fut-sup| or |ppl-sup|, etc.) giving access
+% to the built-in superscripts. If the \file{.fd} file is not found
+% by |\IfFileExists|, |\FB@up| falls back on fake superscripts,
+% otherwise |\FB@suffix| is checked to decide whether to use fake or
+% real superscripts.
+% \begin{macrocode}
+ \edef\reserved@a{\lowercase{%
+ \noexpand\IfFileExists{\f@encoding\FB@firstthree -sup.fd}}}%
+ \reserved@a
+ {\ifx\FB@suffix\FB@x \FB@poormanfalse\fi
+ \ifx\FB@suffix\FB@j \FB@poormanfalse\fi
+ \ifFB@poorman \FB@up@fake{#1}%
+ \else \FB@up@real{#1}%
+ \fi}%
+ {\FB@up@fake{#1}}%
+ \egroup}
+% \end{macrocode}
+% |\FB@up@real| just picks up the superscripts from the subfamily
+% (and forces lowercase).
+% \begin{macrocode}
+ \newcommand*{\FB@up@real}[1]{\bgroup
+ \fontfamily{\FB@firstthree -sup}\selectfont \FB@lc{#1}\egroup}
+% \end{macrocode}
+% |\fup| is defined as |\FB@up| unless |\realsuperscript| is
+% defined by \file{realscripts.sty}.
+% \begin{macrocode}
+ \DeclareRobustCommand*{\fup}[1]{%
+ \ifx\realsuperscript\@undefined
+ \FB@up{#1}%
+ \else
+ \bgroup\let\fakesuperscript\FB@up@fake
+ \realsuperscript{\FB@lc{#1}}\egroup
+ \fi}
+% \end{macrocode}
+% Let’s provide a temporary definition for |\up| (redefined
+% `AtBeginDocument’ as |\fup| or |\textsuperscript| according to
+% \fbsetup{} options).
+% \begin{macrocode}
+ \providecommand*{\up}{\relax}
+% \end{macrocode}
+% Poor man’s definition of |\up| for Plain.
+% \begin{macrocode}
+\else
+ \providecommand*{\up}[1]{\leavevmode\raise1ex\hbox{\sevenrm #1}}
+\fi
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\ieme}
+% \begin{macro}{\ier}
+% \begin{macro}{\iere}
+% \begin{macro}{\iemes}
+% \begin{macro}{\iers}
+% \begin{macro}{\ieres}
+% \changes{v3.1b}{2014/06/23}{Removed \cs{lowercase} from definitions
+% of \cs{ieme} and co: \cs{up} already does the conversion.}
+%
+% Some handy macros for those who don’t know how to abbreviate
+% ordinals:
+% \begin{macrocode}
+\def\ieme{\up{e}\xspace}
+\def\iemes{\up{es}\xspace}
+\def\ier{\up{er}\xspace}
+\def\iers{\up{ers}\xspace}
+\def\iere{\up{re}\xspace}
+\def\ieres{\up{res}\xspace}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \changes{v3.3c}{2017/07/23}{New configurable kerns \cs{FBmedkern},
+% and \cs{FBthickkern} suitable for HTML translation.}
+%
+% \begin{macro}{\FBmedkern}
+% \begin{macro}{\FBthickkern}
+% \begin{macrocode}
+\newcommand*{\FBmedkern}{\kern+.2em}
+\newcommand*{\FBthickkern}{\kern+.3em}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \changes{v2.1c}{2008/04/29}{Added commands \cs{Nos} and \cs{nos}.}
+%
+% \begin{macro}{\No}
+% \begin{macro}{\no}
+% \begin{macro}{\Nos}
+% \begin{macro}{\nos}
+% \begin{macro}{\primo}
+% \begin{macro}{\fprimo)}
+% \changes{v3.1b}{2014/06/23}{Removed \cs{lowercase} from definitions
+% of \cs{FrenchEnumerate}, \dots{} \cs{No} and co: \cs{up} already
+% does the conversion.}
+%
+% And some more macros relying on |\up| for numbering,
+% first two support macros.
+% \begin{macrocode}
+\newcommand*{\FrenchEnumerate}[1]{#1\up{o}\FBthickkern}
+\newcommand*{\FrenchPopularEnumerate}[1]{#1\up{o})\FBthickkern}
+% \end{macrocode}
+%
+% Typing |\primo| should result in `\up{o}\kern+.3em’,
+% \begin{macrocode}
+\def\primo{\FrenchEnumerate1}
+\def\secundo{\FrenchEnumerate2}
+\def\tertio{\FrenchEnumerate3}
+\def\quarto{\FrenchEnumerate4}
+% \end{macrocode}
+% while typing |\fprimo)| gives `\up{o})\kern+.3em.
+% \begin{macrocode}
+\def\fprimo){\FrenchPopularEnumerate1}
+\def\fsecundo){\FrenchPopularEnumerate2}
+\def\ftertio){\FrenchPopularEnumerate3}
+\def\fquarto){\FrenchPopularEnumerate4}
+% \end{macrocode}
+%
+% Let’s provide four macros for the common abbreviations
+% of ``Numéro’’.
+% \begin{macrocode}
+\DeclareRobustCommand*{\No}{N\up{o}\FBmedkern}
+\DeclareRobustCommand*{\no}{n\up{o}\FBmedkern}
+\DeclareRobustCommand*{\Nos}{N\up{os}\FBmedkern}
+\DeclareRobustCommand*{\nos}{n\up{os}\FBmedkern}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \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. Note that this command has changed
+% with version~2 of \frenchb: a |\kern0pt| is used instead of |\hbox|
+% because |\hbox| would break microtype’s font expansion; as a
+% (positive?) side effect, composed names (such as Dupont-Durand)
+% can now be hyphenated on explicit hyphens.
+% Usage: |Jean~\bsc{Duchemin}|.
+%
+% \changes{v2.0}{2006/11/06}{\cs{hbox} dropped, replaced by
+% \cs{kern0pt}.}
+%
+% \begin{macrocode}
+\DeclareRobustCommand*{\bsc}[1]{\leavevmode\begingroup\kern0pt
+ \scshape #1\endgroup}
+\ifLaTeXe\else\let\scshape\relax\fi
+% \end{macrocode}
+% \end{macro}
+%
+% Some definitions for special characters. 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|. |\degre| can be accessed by the command |\r{}|
+% for ring accent.
+%
+% \changes{v2.5f}{2011/07/18}{Changed definitions of \cs{at},
+% \cs{circonflexe}, \cs{tild}, \cs{boi} and \cs{degre} for
+% Unicode based engines.}
+%
+% \changes{v3.2g}{2017/01/24}{Changed Unicode definition of \cs{boi}.}
+%
+% \begin{macrocode}
+\ifFBunicode
+ \newcommand*{\at}{{\char"0040}}
+ \newcommand*{\circonflexe}{{\char"005E}}
+ \newcommand*{\tild}{{\char"007E}}
+ \newcommand*{\boi}{{\char"005C}}
+ \newcommand*{\degre}{{\char"00B0}}
+\else
+ \ifLaTeXe
+ \DeclareTextSymbol{\at}{T1}{64}
+ \DeclareTextSymbol{\circonflexe}{T1}{94}
+ \DeclareTextSymbol{\tild}{T1}{126}
+ \DeclareTextSymbolDefault{\at}{T1}
+ \DeclareTextSymbolDefault{\circonflexe}{T1}
+ \DeclareTextSymbolDefault{\tild}{T1}
+ \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
+\fi
+% \end{macrocode}
+%
+% \begin{macro}{\degres}
+% We now define a macro |\degres| 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{v2.6e}{2013/07/06}{Refrain from redefining \cs{textdegree}
+% from latin1.def, applemac.def, etc. as \cs{degres} because it
+% loops in hyperref’s bookmarks. Pointed out by Eddy Flas on fctt.}
+%
+% If \TeX{} Companion fonts are available (\file{textcomp.sty}),
+% we pick up |\textdegree| from them instead of emulating `degrees’
+% from the |\r{}| accent. Otherwise we advise the user (once only)
+% to use TS1-encoding.
+%
+% \changes{v2.1c}{2008/04/29}{Provide a temporary definition (hyperref
+% safe) of \cs{degres} in case it has to be expanded in the preamble
+% (by beamer’s \cs{title} command for instance).}
+%
+% \changes{v2.5h}{2012/03/21}{textcomp.sty has changed. The test
+% about \cs{M@TS1} is no longer relevant, let’s change it.}
+%
+% \begin{macrocode}
+\ifLaTeXe
+ \newcommand*{\degres}{\degre}
+ \ifFBunicode
+ \DeclareRobustCommand*{\degres}{\degre}
+ \else
+ \def\Warning@degree@TSone{\FBWarning
+ {Degrees would look better in TS1-encoding:%
+ \MessageBreak add \protect
+ \usepackage{textcomp} to the preamble.%
+ \MessageBreak Degrees used}}
+ \AtBeginDocument{\ifx\DeclareEncodingSubset\@undefined
+ \DeclareRobustCommand*{\degres}{%
+ \leavevmode\hbox to 0.3em{\hss\degre\hss}%
+ \Warning@degree@TSone
+ \global\let\Warning@degree@TSone\relax}%
+ \else
+ \DeclareRobustCommand*{\degres}{%
+ \hbox{\UseTextSymbol{TS1}{\textdegree}}}%
+ \fi
+ }
+ \fi
+\else
+ \newcommand*{\degres}{%
+ \leavevmode\hbox to 0.3em{\hss\degre\hss}}
+\fi
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Formatting numbers}
+% \label{ssec-numbers}
+%
+% \begin{macro}{\StandardMathComma}
+% \begin{macro}{\DecimalMathComma}
+% As mentioned in the \TeX{}book p.~134, the comma is of type
+% |\mathpunct| in math mode: it is automatically followed by a
+% thin 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.
+%
+% \changes{v3.2e}{2017/01/09}{\cs{DecimalMathComma} didn’t work
+% with LuaTeX. Fixed now.}
+%
+% \changes{v3.2f}{2017/01/15}{Fixed conflict with the icomma
+% package.}
+%
+% Unfortunately, |\newcount| inside |\if| breaks Plain formats.
+% \begin{macrocode}
+\newif\ifFB@icomma
+\newcount\mc@charclass
+\newcount\mc@charfam
+\newcount\mc@charslot
+\newcount\std@mcc
+\newcount\dec@mcc
+\ifFBLuaTeX
+ \mc@charclass=\Umathcharclass`\,
+ \newcommand*{\dec@math@comma}{%
+ \mc@charfam=\Umathcharfam`\,
+ \mc@charslot=\Umathcharslot`\,
+ \Umathcode`\,= 0 \mc@charfam \mc@charslot
+ }
+ \newcommand*{\std@math@comma}{%
+ \mc@charfam=\Umathcharfam`\,
+ \mc@charslot=\Umathcharslot`\,
+ \Umathcode`\,= \mc@charclass \mc@charfam \mc@charslot
+ }
+\else
+ \std@mcc=\mathcode`\,
+ \dec@mcc=\std@mcc
+ \@tempcnta=\std@mcc
+ \divide\@tempcnta by "1000
+ \multiply\@tempcnta by "1000
+ \advance\dec@mcc by -\@tempcnta
+ \newcommand*{\dec@math@comma}{\mathcode`\,=\dec@mcc}
+ \newcommand*{\std@math@comma}{\mathcode`\,=\std@mcc}
+\fi
+\newcommand*{\DecimalMathComma}{%
+ \ifFBfrench\dec@math@comma\fi
+ \ifFB@icomma\else\addto\extrasfrench{\dec@math@comma}\fi
+}
+\newcommand*{\StandardMathComma}{%
+ \std@math@comma
+ \ifFB@icomma\else\addto\extrasfrench{\std@math@comma}\fi
+}
+\ifLaTeXe
+ \AtBeginDocument{\@ifpackageloaded{icomma}%
+ {\FB@icommatrue}%
+ {\addto\noextrasfrench{\std@math@comma}}%
+ }
+\else
+ \addto\noextrasfrench{\std@math@comma}
+\fi
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\nombre}
+%
+% \changes{v2.0}{2006/11/06}{\cs{nombre} now requires numprint.sty.}
+%
+% The command |\nombre| is now borrowed from \file{numprint.sty} for
+% LaTeX2e. There is no point to maintain the former tricky code
+% when a package is dedicated to do the same job and more.
+% For Plain based formats, |\nombre| no longer formats numbers,
+% it prints them as is and issues a warning about the change.
+%
+% Fake command |\nombre| for Plain based formats, warning users of
+% \frenchb{} v.~1.x.\ about the change:
+% \begin{macrocode}
+\newcommand*{\nombre}[1]{{#1}\fb@warning{*** \noexpand\nombre
+ no longer formats numbers\string! ***}}
+% \end{macrocode}
+% \end{macro}
+%
+% Let’s activate LuaTeX punctuation if necessary (LaTeX or Plain)
+% so that |\FBsetspaces| commands can be used in the preamble,
+% then cleanup and exit without loading any \file{.cfg} file
+% in case of Plain formats.
+%
+% \begin{macrocode}
+\ifFB@luatex@punct
+ \activate@luatexpunct
+\fi
+\let\FBstop@here\relax
+\def\FBclean@on@exit{%
+ \let\ifLaTeXe\undefined
+ \let\LaTeXetrue\undefined
+ \let\LaTeXefalse\undefined
+ \let\FB@llc\loadlocalcfg
+ \let\loadlocalcfg\@gobble}
+\ifx\magnification\@undefined
+\else
+ \def\FBstop@here{%
+ \FBclean@on@exit
+ \ldf@finish\CurrentOption
+ \let\loadlocalcfg\FB@llc
+ \endinput}
+\fi
+\FBstop@here
+% \end{macrocode}
+%
+% What follows is for LaTeX2e \emph{only}.
+% We redefine |\nombre| for LaTeX2e. A warning is issued
+% at the first call of |\nombre| if |\numprint| is not
+% defined, suggesting what to do. The package \pkg{numprint}
+% is \emph{not} loaded automatically by \frenchb{} because of
+% possible options conflict.
+%
+% \changes{v3.1i}{2015/10/03}{\cs{nombre} command changed when
+% numprint.sty is not loaded: only one warning, no error.}
+%
+% \begin{macrocode}
+\renewcommand*{\nombre}[1]{\Warning@nombre{#1}}
+\newcommand*{\Warning@nombre}[1]{%
+ \ifdefined\numprint
+ \numprint{#1}%
+ \else
+ \PackageWarning{french.ldf}{%
+ \protect\nombre\space now relies on package numprint.sty,%
+ \MessageBreak add \protect
+ \usepackage[autolanguage]{numprint},\MessageBreak
+ see file numprint.pdf for more options.\MessageBreak
+ \protect\nombre\space called}%
+ \global\let\Warning@nombre\relax
+ {#1}%
+ \fi
+}
+% \end{macrocode}
+%
+% \changes{v3.3c}{2017/08/10}{New command \cs{FBthousandsep} to
+% customise numprint.}
+%
+% \changes{v3.4a}{2017/12/29}{Shrink/stretch removed in
+% \cs{FBthousandsep}.}
+%
+% \begin{macrocode}
+\newcommand*{\FBthousandsep}{\kern \fontdimen2\font \relax}
+% \end{macrocode}
+%
+% \changes{v2.0c}{2007/06/25}{There is no need to define here
+% numprint’s command \cs{npstylefrench}, it will be redefined
+% `AtBeginDocument’ by \cs{FBprocess@options}.}
+%
+% \subsection{Caption names}
+% \label{ssec-captions-name}
+%
+% The next step consists in defining the French equivalents for
+% the LaTeX caption names.
+%
+% \begin{macro}{\captionsfrench}
+% Let’s first define |\captionsfrench| which sets all strings used
+% in the four standard document classes provided with LaTeX.
+%
+% \changes{v2.0}{2006/11/06}{`Fig.’ changed to `Figure’ and
+% `Tab.’ to `Table’.}
+%
+% \changes{v2.5a}{2010/08/16}{\cs{emph} deleted in \cs{seename}
+% and \cs{alsoname} to match what is done for the other languages.
+% Suggested by Marc Baudoin.}
+%
+% \changes{v3.0a}{2014/02/18}{Take advantage of babel’s \cs{SetString}
+% commands for captionnames.}
+%
+% \changes{v3.1b}{2014/09/15}{Change \cs{scshape} to customisable
+% \cs{FBfigtabshape} for \cs{figurename} and \cs{tablename}.}
+%
+% \changes{v3.1g}{2015/05/10}{\cs{partname}’s definition depends now on
+% flag PartNameFull. No need to redefine it in \cs{frenchbsetup}.}
+%
+% \changes{v3.3a}{2017/04/30}{Commands \cs{frenchpartfirst},
+% \cs{frenchpartsecond} and \cs{frenchpartnameord} added.}
+%
+% Let’s give a chance to a class or a package read before \frenchb{}
+% to define |\FBfigtabshape| as |\relax|, otherwise |\FBfigtabshape|
+% will be defined as |\scshape| (can be changed with
+% \fbsetup{SmallCapsFigTabCaptions=false}).
+% \begin{macrocode}
+\providecommand*{\FBfigtabshape}{\scshape}
+% \end{macrocode}
+%
+% New implementation for caption names( requires \babel’s~3.10 or
+% newer).
+% \begin{macrocode}
+\StartBabelCommands*{\BabelLanguages}{captions}
+ [unicode, fontenc=TU EU1 EU2, charset=utf8]
+ \SetString{\refname}{Références}
+ \SetString{\abstractname}{Résumé}
+ \SetString{\prefacename}{Préface}
+ \SetString{\contentsname}{Table des matières}
+ \SetString{\ccname}{Copie à }
+ \SetString{\proofname}{Démonstration}
+ \SetString{\partfirst}{Première}
+ \SetString{\partsecond}{Deuxième}
+ \SetStringLoop{ordinal#1}{%
+ \frenchpartfirst,\frenchpartsecond,Troisième,Quatrième,%
+ Cinquième,Sixième,Septième,Huitième,Neuvième,Dixième,Onzième,%
+ Douzième,Treizième,Quatorzième,Quinzième,Seizième,%
+ Dix-septième,Dix-huitième,Dix-neuvième,Vingtième}
+\StartBabelCommands*{\BabelLanguages}{captions}
+ \SetString{\refname}{R\'ef\'erences}
+ \SetString{\abstractname}{R\'esum\'e}
+ \SetString{\bibname}{Bibliographie}
+ \SetString{\prefacename}{Pr\'eface}
+ \SetString{\chaptername}{Chapitre}
+ \SetString{\appendixname}{Annexe}
+ \SetString{\contentsname}{Table des mati\`eres}
+ \SetString{\listfigurename}{Table des figures}
+ \SetString{\listtablename}{Liste des tableaux}
+ \SetString{\indexname}{Index}
+ \SetString{\figurename}{{\FBfigtabshape Figure}}
+ \SetString{\tablename}{{\FBfigtabshape Table}}
+ \SetString{\pagename}{page}
+ \SetString{\seename}{voir}
+ \SetString{\alsoname}{voir aussi}
+ \SetString{\enclname}{P.~J. }
+ \SetString{\ccname}{Copie \`a }
+ \SetString{\headtoname}{}
+ \SetString{\proofname}{D\'emonstration}
+ \SetString{\glossaryname}{Glossaire}
+% \end{macrocode}
+% When \fbo{PartNameFull=true} (default), |\part{}| is printed in
+% French as ``Première partie’’ instead of ``Partie I’’.
+% As logic is prohibited inside |\SetString|, let’s hide the test
+% about \fbo{PartNameFull} in |\FB@partname|.
+% \begin{macrocode}
+ \SetString{\partfirst}{Premi\`ere}
+ \SetString{\partsecond}{Deuxi\`eme}
+ \SetString{\partnameord}{partie}
+ \SetStringLoop{ordinal#1}{%
+ \partfirst,\partsecond,Troisi\`eme,Quatri\`eme,%
+ Cinqui\`eme,Sixi\`eme,Septi\`eme,Huiti\`eme,Neuvi\`eme,Dixi\`eme,%
+ Onzi\`eme,Douzi\`eme,Treizi\`eme,Quatorzi\`eme,Quinzi\`eme,%
+ Seizi\`eme,Dix-septi\`eme,Dix-huiti\`eme,Dix-neuvi\`eme,%
+ Vingti\`eme}
+ \AfterBabelCommands{%
+ \DeclareRobustCommand*{\FB@emptypart}{\def\thepart{}}%
+ \DeclareRobustCommand*{\FB@partname}{%
+ \ifFBPartNameFull
+ \csname ordinal\romannumeral\value{part}\endcsname\space
+ \partnameord\FB@emptypart
+ \else
+ Partie%
+ \fi}%
+ }
+ \SetString{\partname}{\FB@partname}
+\EndBabelCommands
+% \end{macrocode}
+% \end{macro}
+%
+% \changes{v3.0a}{2014/02/28}{Merging of \cs{captionsfrenchb},
+% \cs{captionsfrancais} with \cs{captionsfrench} deleted in favor
+% of new babel 3.9 syntax.}
+%
+% \subsection{Figure and table captions}
+% \label{ssec-captions-fig}
+%
+% \changes{v2.4a}{2009/11/23}{\cs{PackageWarning} changed to
+% \cs{FBWarning} (in case \cs{@makecaption} has been customised).
+% \cs{FBWarning} is defined as \cs{PackageWarning} by default but
+% can be made silent using \cs{frenchbsetup}, (suggested by MPG).}
+%
+% \begin{macro}{\FBWarning}
+% |\FBWarning| is an alias of |\PackageWarning{french.ldf}| which
+% can be made silent by option \fbo{SuppressWarning}.
+% \begin{macrocode}
+\newcommand{\FBWarning}[1]{\PackageWarning{french.ldf}{#1}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\CaptionSeparator}
+% Let’s consider now captions in figures and tables.
+% In French, captions in figures and tables should never be printed
+% as `Figure 1:~’ which is the default in standard LaTeX2e classes
+% (a space should preceed the colon in French). This flaw may occur
+% with pdfLaTeX as `:’ is made active too late.
+% With LuaLaTeX and XeLaTeX, this glitch doesn’t occur, you get
+% `Figure 1~:~’ which is correct in French. With pdfLaTeX \frenchb{}
+% provides the following workaround.
+%
+% The standard definition of |\@makecaption| (e.g., the one provided
+% in article.cls, report.cls, book.cls which is frozen for LaTeX2e
+% according to Frank Mittelbach), is saved in |\STD@makecaption|.
+% `AtBeginDocument’ we compare it to its current definition (some
+% classes like \cls{memoir}, koma-script classes, AMS classes,
+% ua-thesis.cls\dots change it).
+% If they are identical, \frenchb{} just adds a hook called
+% |\FBCaption@Separator| to |\@makecaption|; |\FBCaption@Separator|
+% defaults to `:~’ as in the standard |\@makecaption| and will be
+% changed to `~:~’ in French `AtBeginDocument’; it can be also set to
+% |\CaptionSeparator| (` -- ’) using \fbo{CustomiseFigTabCaptions}.
+%
+% \changes{v2.6c}{2013/05/18}{Former \cs{CaptionSeparator}
+% has been renamed as \cs{FBCaption@Separator};
+% Newif \cs{if@FBwarning@capsep} added.}
+%
+% \changes{v2.6h}{2014/01/03}{No active catcodes in
+% \cs{STD@makecaption}’s definition.}
+%
+% \changes{v3.0a}{2014/02/28}{Remove \cs{FBCaption@SeparatorORI}, use
+% \cs{babel@save} instead.}
+%
+% While saving the standard definition of |\@makecaption| we have to
+% make sure that characters `:’ and `|>|’ have |\catcode| 12
+% (\frenchb{} makes `:’ active and \file{spanish.ldf} makes `|>|’
+% active).
+% \begin{macrocode}
+\bgroup
+ \catcode`:=12 \catcode`>=12 \relax
+ \long\gdef\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}
+\egroup
+% \end{macrocode}
+%
+% No warning is issued for SMF, AMS and ACM classes as their layout
+% of captions is compatible with French typographic standards.
+%
+% With \cls{memoir} and koma-script classes, \frenchb{} customises
+% |\captiondelim| or |\captionformat| in French (unless option
+% \fbo{CustomiseFigTabCaptions} is set to \fbo{false}) and issues
+% no warning.
+%
+% When |\@makecaption| has been changed by another class
+% or package, a warning is printed in the .log file.
+%
+% Enable the standard warning only if high punctuation is active.
+% \begin{macrocode}
+\newif\if@FBwarning@capsep
+\ifFB@active@punct\@FBwarning@capseptrue\fi
+\newcommand*{\CaptionSeparator}{\space\textendash\space}
+\def\FBCaption@Separator{: }
+\long\def\FB@makecaption#1#2{%
+ \vskip\abovecaptionskip
+ \sbox\@tempboxa{#1\FBCaption@Separator #2}%
+ \ifdim \wd\@tempboxa >\hsize
+ #1\FBCaption@Separator #2\par
+ \else
+ \global \@minipagefalse
+ \hb@xt@\hsize{\hfil\box\@tempboxa\hfil}%
+ \fi
+ \vskip\belowcaptionskip}
+% \end{macrocode}
+% \end{macro}
+%
+% \changes{v2.6c}{2013/05/18}{No warning about \cs{@makecaption} for
+% AMS classes.}
+%
+% \changes{v3.0a}{2014/02/20}{No warning about \cs{@makecaption} for
+% SMF classes.}
+%
+% Disable the standard warning with ACM, AMS and SMF classes.
+% \begin{macrocode}
+\@ifclassloaded{acmart}{\@FBwarning@capsepfalse}{}
+\@ifclassloaded{amsart}{\@FBwarning@capsepfalse}{}
+\@ifclassloaded{amsbook}{\@FBwarning@capsepfalse}{}
+\@ifclassloaded{amsdtx}{\@FBwarning@capsepfalse}{}
+\@ifclassloaded{amsldoc}{\@FBwarning@capsepfalse}{}
+\@ifclassloaded{amproc}{\@FBwarning@capsepfalse}{}
+\@ifclassloaded{smfart}{\@FBwarning@capsepfalse}{}
+\@ifclassloaded{smfbook}{\@FBwarning@capsepfalse}{}
+% \end{macrocode}
+%
+% \changes{v2.6c}{2013/05/18}{No warning about \cs{@makecaption} for
+% koma-script classes. \cs{captionformat} customised in French.}
+%
+% \changes{v2.6h}{2014/01/05}{If \cs{@makecaption} is undefined, no
+% warning.}
+%
+% No warning with \cls{memoir} or koma-script classes: they change
+% |\@makecaption| but we will manage to customise them in French
+% later on (see below after executing |\FBprocess@options|)
+% \hlabel{ifFB@koma}.
+% \begin{macrocode}
+\newif\ifFB@koma
+\@ifclassloaded{memoir}{\@FBwarning@capsepfalse}{}
+\@ifclassloaded{scrartcl}{\@FBwarning@capsepfalse\FB@komatrue}{}
+\@ifclassloaded{scrbook}{\@FBwarning@capsepfalse\FB@komatrue}{}
+\@ifclassloaded{scrreprt}{\@FBwarning@capsepfalse\FB@komatrue}{}
+% \end{macrocode}
+% No warning with the \cls{beamer} class which defines
+% |\beamer@makecaption| (customised below) instead of
+% |\@makecaption|. No warning either if |\@makecaption| is
+% undefined (i.e.\ \cls{letter}).
+% \begin{macrocode}
+\@ifclassloaded{beamer}{\@FBwarning@capsepfalse}{}
+\ifdefined\@makecaption\else\@FBwarning@capsepfalse\fi
+% \end{macrocode}
+%
+% \changes{v2.6c}{2013/05/18}{Warning added when the caption
+% or floatrow package is loaded before babel/french.}
+%
+% \changes{v3.2b}{2016/03/30}{Warning added when the subcaption
+% package is loaded before babel/french.}
+%
+% \changes{v3.3c}{2017/08/16}{Reorganise warnings when the caption,
+% subcaption or floatrow packages are loaded before babel/french.}
+%
+% The \pkg{caption}, \pkg{subcaption} and \pkg{floatrow} packages are
+% compatible with \frenchb{} if they are loaded after \babel{}.
+%
+% Check if packages \pkg{caption3} \pkg{subcaption} or \pkg{floatrow}
+% are loaded now (before \frenchb) and step counter |FBcaption@count|
+% accordingly; it’s value will be checked |\AtBeginDocument|.
+% N.B.: \pkg{caption} loads \pkg{caption3}, \pkg{subcaption} loads
+% \pkg{caption3} and \pkg{floatrow} loads \pkg{caption3}.
+% \begin{macrocode}
+\newcounter{FBcaption@count}
+\@ifpackageloaded{caption3}{\addtocounter{FBcaption@count}{4}}{}
+\@ifpackageloaded{subcaption}{\addtocounter{FBcaption@count}{2}}{}
+\@ifpackageloaded{floatrow}{\stepcounter{FBcaption@count}}{}
+% \end{macrocode}
+%
+% \changes{v3.0a}{2014/02/20}{More informative, less TeXnical warning
+% about \cs{@makecaption}.}
+%
+% First check the definition of |\@makecaption|, change it or issue
+% a warning in case it has been changed by a class or package not
+% (yet) compatible with \frenchb; then change the definition of
+% |\FBCaption@Separator|, taking care that the colon is typeset
+% correctly in French (\emph{not} `Figure~1: légende’).
+%
+% \changes{v3.1f}{2015/05/31}{\cs{FBCaption@Separator} changed when
+% option CustomiseFigTabCaptions is set to false.}
+%
+% \begin{macrocode}
+\AtBeginDocument{%
+ \ifx\@makecaption\STD@makecaption
+ \global\let\@makecaption\FB@makecaption
+% \end{macrocode}
+% If \fbo{OldFigTabCaptions=true}, do not overwrite
+% |\FBCaption@Separator| (already saved as `: ’ for other languages
+% and set to |\CaptionSeparator| by |\extrasfrench| when French is
+% the main language); otherwise add a space before the `:’ in French
+% in order to avoid problems when \fbo{AutoSpacePunctuation=false}.
+% \begin{macrocode}
+ \ifFBOldFigTabCaptions
+ \else
+ \def\FBCaption@Separator{\ifFBfrench\space\fi : }%
+ \fi
+ \ifFBCustomiseFigTabCaptions
+ \ifFB@mainlanguage@FR
+ \def\FBCaption@Separator{\CaptionSeparator}%
+ \fi
+ \fi
+ \@FBwarning@capsepfalse
+ \fi
+% \end{macrocode}
+% Cancel the warning if \file{caption3.sty} has been loaded
+% \emph{after} \babel.
+% \begin{macrocode}
+ \@ifpackageloaded{caption3}{%
+ \ifnum\value{FBcaption@count}=0 \@FBwarning@capsepfalse\fi
+ }{}%
+ \if@FBwarning@capsep
+ \ifnum\value{FBcaption@count}>0
+% \end{macrocode}
+% \file{caption3.sty} has been loaded \emph{before} babel, maybe by
+% the class\dots
+% \begin{macrocode}
+ \FBWarning
+ {Figures' and tables' captions might look like\MessageBreak
+ `Figure 1:' in French instead of `Figure 1 :'.\MessageBreak
+ If you have loaded any of the packages caption,\MessageBreak
+ subcaption or floatrow BEFORE babel/french,\MessageBreak
+ please move them AFTER babel/french.\MessageBreak
+ If one of them is loaded by your class,\MessageBreak
+ you can still add AFTER babel/french\MessageBreak
+ \protect\usepackage[labelsep=period]{caption} or\MessageBreak
+ \protect\usepackage[labelsep=endash]{caption} or\MessageBreak
+ ... live with it; reported}%
+ \else
+% \end{macrocode}
+% \file{caption3.sty} hasn’t been loaded at all.
+% \begin{macrocode}
+ \FBWarning
+ {Figures' and tables' captions might look like\MessageBreak
+ `Figure 1:' in French instead of `Figure 1 :'.\MessageBreak
+ If it happens, see your class documentation to\MessageBreak
+ fix this issue or add AFTER babel/french\MessageBreak
+ \protect\usepackage[labelsep=period]{caption} or\MessageBreak
+ \protect\usepackage[labelsep=endash]{caption} or\MessageBreak
+ or ... live with it; reported}%
+ \fi
+ \fi
+ \let\FB@makecaption\relax
+ \let\STD@makecaption\relax
+}
+% \end{macrocode}
+%
+% \subsection{Dots\dots}
+% \label{ssec-dots}
+%
+% \begin{macro}{\FBtextellipsis}
+% LaTeX’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 |\FBtextellipsis| for French (in LaTeX only).
+%
+% The |\if| construction in the LaTeX 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{v2.0}{2006/11/06}{Added special case for LY1 encoding,
+% see bug report from Bruno Voisin (2004/05/18).}
+%
+% \changes{v2.5f}{2011/06/18}{Unicode fonts also provide a ready made
+% character for \cs{textellipsis}, let’s just use it!
+% (reported by Maxime Chupin, 2011/06/04).}
+%
+% LY1 has a ready made character for |\textellipsis|, it should be
+% used in French too. The same is true for Unicode fonts in use
+% with XeTeX and LuaTeX.
+%
+% \begin{macrocode}
+\ifFBunicode
+ \let\FBtextellipsis\textellipsis
+\else
+ \DeclareTextSymbol{\FBtextellipsis}{LY1}{133}
+ \DeclareTextCommandDefault{\FBtextellipsis}{%
+ .\kern\fontdimen3\font.\kern\fontdimen3\font.\xspace}
+\fi
+% \end{macrocode}
+% |\Mdots@| and |\Tdots@| 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 redefined as
+% |\FBtextellipsis| in French.
+% \begin{macrocode}
+\newcommand*{\Tdots@}{\@xp\textellipsis}
+\newcommand*{\Mdots@}{\@xp\mdots@}
+\AtBeginDocument{\DeclareRobustCommand*{\dots}{\relax
+ \csname\ifmmode M\else T\fi dots@\endcsname}%
+ \ifdefined\@xp\else\let\@xp\relax\fi
+ \ifdefined\mdots@\else\let\Mdots@\mathellipsis\fi
+ }
+\def\bbl@frenchdots{\babel@save\Tdots@ \let\Tdots@\FBtextellipsis}
+\addto\extrasfrench{\bbl@frenchdots}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{More checks about packages’ loading order}
+% \label{ssec-loading-order}
+%
+% \changes{v3.1d}{2015/04/06}{New section: issue warnings if packages
+% listings, numprint and natbib are loaded too early or too late
+% vs babel.}
+%
+% \changes{v3.1i}{2015/10/03}{Remove restriction about loading
+% numprint.sty after babel.}
+%
+% Like packages \file{captions} and \file{floatrow} (see
+% section~\ref{ssec-captions-fig}), package \file{listings} should
+% be loaded after \frenchb{} due to active characters issues
+% (pdfLaTeX only).
+%
+% \begin{macrocode}
+\ifFB@active@punct
+ \@ifpackageloaded{listings}
+ {\AtBeginDocument{%
+ \FBWarning{Please load the "listings" package\MessageBreak
+ AFTER babel/french; reported}}%
+ }{}
+\fi
+% \end{macrocode}
+%
+% Package \file{natbib} should be loaded before \frenchb{}
+% due to active characters issues (pdfLaTeX only).
+%
+% \begin{macrocode}
+\newif\if@FBwarning@natbib
+\ifFB@active@punct
+ \@ifpackageloaded{natbib}{}{\@FBwarning@natbibtrue}
+\fi
+\AtBeginDocument{%
+ \if@FBwarning@natbib
+ \@ifpackageloaded{natbib}{}{\@FBwarning@natbibfalse}%
+ \fi
+ \if@FBwarning@natbib
+ \FBWarning{Please load the "natbib" package\MessageBreak
+ BEFORE babel/french; reported}%
+ \fi
+}
+% \end{macrocode}
+%
+% \changes{v3.2g}{2017/01/30}{Issue a warning if beamerarticle.sty
+% is loaded after babel.}
+%
+% Package \pkg{beamerarticle} should be loaded before \frenchb{}
+% to avoid list’s conflicts, see p.~\pageref{beamerarticle}.
+%
+% \begin{macrocode}
+\newif\if@FBwarning@beamerarticle
+\@ifpackageloaded{beamerarticle}{}{\@FBwarning@beamerarticletrue}
+\AtBeginDocument{%
+ \if@FBwarning@beamerarticle
+ \@ifpackageloaded{beamerarticle}{}%
+ {\@FBwarning@beamerarticlefalse}%
+ \fi
+ \if@FBwarning@beamerarticle
+ \FBWarning{Please load the "beamerarticle" package\MessageBreak
+ BEFORE babel/french; reported}%
+ \fi
+}
+% \end{macrocode}
+%
+% \subsection{Setup options: keyval stuff}
+% \label{ssec-keyval}
+%
+% \changes{v2.0}{2006/11/06}{New command \cs{frenchbsetup} added
+% for global customisation.}
+%
+% \changes{v3.0a}{2014/02/24}{Options processing completely
+% reorganised, now \cs{babel@save} and\cs{babel@savevariable} are
+% usable for French.}
+%
+% All setup options are handled by command \fbsetup{} using the
+% keyval syntax. A list of flags is defined and set to a default
+% value which will possibly be changed `AtEndOfPackage’ if French is
+% the main language. After this, \fbsetup{} eventually modifies the
+% preset values of these flags.
+%
+% Option processing can occur either in \fbsetup{}, but \emph{only
+% for options explicitly set} by \fbsetup{}, or `AtBeginDocument’;
+% any option affecting |\extrasfrench{}| \emph{must} be processed by
+% \fbsetup{}: when French is the main language, |\extrasfrench{}| is
+% executed by \babel{} when it switches the main language and this
+% occurs \emph{before} reading the stuff postponed by \frenchb{}
+% `AtBeginDocument’. Reexecuting |\extrasfrench{}| is an option
+% which was used up to v2.6h, it has been dropped in v3.0a because
+% of its side-effects (f.i.\ |\babel@save| and |\babel@savevariable|
+% did not work for French).
+%
+% \begin{macro}{\frenchsetup}
+% Let’s now define this command which reads and sets the options
+% to be processed either immediately (i.e.\ just after setting the
+% key) or later (at |\begin{document}|) by |\FBprocess@options|.
+% \fbsetup{} can only be called in the preamble.
+%
+% \changes{v2.0c}{2007/06/25}{Option ThinSpaceInFrenchNumbers added.}
+%
+% \changes{v2.0d}{2007/07/15}{Options og and fg changed: limit
+% the definition to French so that quote characters can be used
+% in German.}
+%
+% \changes{v2.0e}{2007/10/05}{New option: StandardLists.}
+%
+% \changes{v2.0f}{2008/03/23}{Two typos corrected in
+% option StandardLists.}
+%
+% \changes{v2.0f}{2008/03/23}{StandardLayout option had no
+% effect on lists. Test moved to \cs{FBprocess@options}.}
+%
+% \changes{v2.0g}{2008/03/23}{Revert previous change to
+% StandardLayout. This option must set the three flags
+% \cs{FBReduceListSpacingfalse}, \cs{FBCompactItemizefalse},
+% and \cs{FBStandardItemLabeltrue} instead of
+% \cs{FBStandardListstrue}, so that later options can still
+% change their value before executing \cs{FBprocess@options}.
+% Same thing for option StandardLists.}
+%
+% \changes{v2.1a}{2008/03/24}{New option: FrenchSuperscripts
+% to define \cs{up} as \cs{fup} or as \cs{textsuperscript}.}
+%
+% \changes{v2.1a}{2008/03/30}{New option: LowercaseSuperscripts.}
+%
+% \changes{v2.2a}{2008/05/08}{The global layout of the document is
+% no longer changed when frenchb is not the last option of babel
+% (\cs{bbl@main@language}). Suggested by Ulrike Fischer.}
+%
+% \changes{v2.2a}{2008/05/08}{Default values of flags changed:
+% default now means `StandardLayout’, they will be changed to
+% `FrenchLayout’ AtEndOfPackage only if french is
+% \cs{bbl@main@language}.}
+%
+% \changes{v2.2a}{2008/05/08}{When frenchb is babel’s last option,
+% French becomes the document’s main language, so
+% GlobalLayoutFrench applies.}
+%
+% \changes{v2.4a}{2009/11/23}{New option SuppressWarning.}
+%
+% \changes{v2.6a}{2013/01/30}{New options ListOldLayout,
+% StandardItemizeEnv and StandardEnumerateEnv (CompactItemize is
+% deprecated).}
+%
+% \changes{v3.0a}{2014/02/28}{New options OldFigTabCaptions and
+% CustomiseFigTabCaptions.}
+%
+% \changes{v3.0c}{2014/04/18}{New option INGuillSpace.}
+%
+% \changes{v3.1a}{2014/05/20}{New options InnerGuillSingle,
+% EveryParGuill and EveryLineGuill to control \cs{frquote}.}
+%
+% \changes{v3.1b}{2014/09/15}{New option SmallCapsFigTabCaptions.}
+%
+% \changes{v3.1e}{2015/04/10}{Corrected typo: SmallCapsFigTabcaptions
+% instead of SmallCapsFigTabCaptions. Pointed out by Céline
+% Chevalier.}
+%
+% \changes{v3.1g}{2015/05/10}{PartNameFull now just sets the flag,
+% nothing to add to \cs{captionsfrench} when false.}
+%
+% \changes{v3.3a}{2017/04/30}{\cs{frenchbsetup} is now an alias for
+% \cs{frenchsetup}.}
+%
+% \changes{v3.3a}{2017/04/30}{Options INGuillSpace, ThinColonSpace no
+% longer delayed AtBeginDocument.}
+%
+% \changes{v3.5a}{2018/07/04}{New option ListItemsAsPar for displaying
+% lists’ items ``as paragraphs’’.}
+%
+% \changes{v3.5d}{2019/01/24}{ReduceListSpacing option depreciated: see
+% StandardListSpacing.}
+%
+% \begin{macrocode}
+\newcommand*{\frenchsetup}[1]{%
+ \setkeys{FB}{#1}%
+}%
+\@onlypreamble\frenchsetup
+% \end{macrocode}
+% Keep the former name |\frenchbsetup| working for compatibility.
+% \begin{macrocode}
+\let\frenchbsetup\frenchsetup
+\@onlypreamble\frenchbsetup
+% \end{macrocode}
+%
+% We define a collection of conditionals with their defaults
+% (true or false).
+%
+% \begin{macrocode}
+\newif\ifFBShowOptions
+\newif\ifFBStandardLayout \FBStandardLayouttrue
+\newif\ifFBGlobalLayoutFrench \FBGlobalLayoutFrenchtrue
+\newif\ifFBReduceListSpacing
+\newif\ifFBStandardListSpacing \FBStandardListSpacingtrue
+\newif\ifFBListOldLayout
+\newif\ifFBListItemsAsPar
+\newif\ifFBCompactItemize
+\newif\ifFBStandardItemizeEnv \FBStandardItemizeEnvtrue
+\newif\ifFBStandardEnumerateEnv \FBStandardEnumerateEnvtrue
+\newif\ifFBStandardItemLabels \FBStandardItemLabelstrue
+\newif\ifFBStandardLists \FBStandardListstrue
+\newif\ifFBIndentFirst
+\newif\ifFBFrenchFootnotes
+\newif\ifFBAutoSpaceFootnotes
+\newif\ifFBOriginalTypewriter
+\newif\ifFBThinColonSpace
+\newif\ifFBThinSpaceInFrenchNumbers
+\newif\ifFBFrenchSuperscripts \FBFrenchSuperscriptstrue
+\newif\ifFBLowercaseSuperscripts \FBLowercaseSuperscriptstrue
+\newif\ifFBPartNameFull \FBPartNameFulltrue
+\newif\ifFBCustomiseFigTabCaptions
+\newif\ifFBOldFigTabCaptions
+\newif\ifFBSmallCapsFigTabCaptions \FBSmallCapsFigTabCaptionstrue
+\newif\ifFBSuppressWarning
+\newif\ifFBINGuillSpace
+% \end{macrocode}
+%
+% The defaults values of these flags have been choosen so that
+% \frenchb{} does not change anything regarding the global layout.
+% |\bbl@main@language|, set by the last option of \babel, controls
+% the global layout of the document. `AtEndOfPackage’ we check the
+% main language in |\bbl@main@language|; if it is French (or a
+% French dialect) the values of some flags have to be changed to
+% ensure a French looking layout for the whole document (even in
+% parts written in languages other than French); the end-user will
+% then be able to customise the values of all these flags with
+% \fbsetup{}.
+%
+% \changes{v2.5b}{2010/10/30}{Do not use the
+% test \cs{iflanguage}\{french\} to check whether French is the
+% main language or not, as it might be be erroneously positive
+% when English is the main language and no hyphenation patterns
+% are available for French.
+% In this case \cs{l@french} and \cs{l@english} are 0.
+% Pointed out by Günter Milde.}
+%
+% \changes{v3.1g}{2015/05/10}{Bug fix for koma-scripts classes:
+% a spurious dot was added by the \cs{partformat} command.}
+%
+% \changes{v3.4a}{2018/01/07}{Patch for koma-script classes moved here,
+% after \cs{ifFBPartNameFull} is defined, so that it applies to
+% \cs{extrasacadian} too: \cs{AtEndOfPackage} is too late.}
+%
+% The following patch is for koma-script classes: the |\partformat|
+% command, defined as |\partname~\thepart\autodot|, is incompatible
+% with our redefinition of |\partname|.
+% \begin{macrocode}
+\ifFB@koma
+ \ifdefined\partformat
+ \def\FB@partformat@fix{%
+ \ifFBPartNameFull
+ \babel@save\partformat
+ \renewcommand*{\partformat}{\partname}%
+ \fi}
+ \addto\extrasfrench{\FB@partformat@fix}%
+ \fi
+\fi
+% \end{macrocode}
+%
+% \changes{v3.0c}{2014/03/30}{No list customisation when beamer
+% class is loaded.}
+%
+% \changes{v3.2g}{2017/01/30}{Minimal list customisation when
+% beamerarticle.sty is loaded.}
+%
+% \changes{v3.2h}{2017/04/11}{Option GlobalLayoutFrench skipped
+% when French is not the main language.}
+%
+% \changes{v3.5e}{2019/03/14}{StandardLayout and GlobalLayoutFrench
+% options can no longer be toggled when French is not the main
+% language.}
+%
+% Our list customisation conflicts with the \cls{beamer} class and
+% with the \pkg{beamerarticle} package. The patch provided in
+% \pkg{beamerbasecompatibility} solves the conflict except in case
+% of language changes, so we provide our own patch.
+% When the \cls{beamer} is loaded, lists are not customised at all
+% to ensure compatibility.\hlabel{beamerarticle}
+% The \pkg{beamerarticle} package needs to be loaded \emph{before}
+% \babel, a warning is issued otherwise, see
+% section~\ref{ssec-loading-order}; a light customisation is
+% compatible with the \pkg{beamerarticle} package.
+%
+% \begin{macrocode}
+\def\FB@french{french}
+\def\FB@acadian{acadian}
+\newif\ifFB@mainlanguage@FR
+\AtEndOfPackage{%
+ \ifx\bbl@main@language\FB@french \FB@mainlanguage@FRtrue
+ \else \ifx\bbl@main@language\FB@acadian \FB@mainlanguage@FRtrue \fi
+ \fi
+ \ifFB@mainlanguage@FR
+ \FBGlobalLayoutFrenchtrue
+ \@ifclassloaded{beamer}%
+ {\PackageInfo{french.ldf}{%
+ No list customisation for the beamer class,%
+ \MessageBreak reported}}%
+ {\@ifpackageloaded{beamerarticle}%
+ {\FBStandardItemLabelsfalse
+ \FBStandardListSpacingfalse
+ \PackageInfo{french.ldf}{%
+ Minimal list customisation for the beamerarticle%
+ \MessageBreak package; reported}}%
+% \end{macrocode}
+% Otherwise customise lists ``à la française’’:
+% \begin{macrocode}
+ {\FBStandardListSpacingfalse
+ \FBStandardItemizeEnvfalse
+ \FBStandardEnumerateEnvfalse
+ \FBStandardItemLabelsfalse}%
+ }
+ \FBIndentFirsttrue
+ \FBFrenchFootnotestrue
+ \FBAutoSpaceFootnotestrue
+ \FBCustomiseFigTabCaptionstrue
+ \else
+ \FBGlobalLayoutFrenchfalse
+ \fi
+% \end{macrocode}
+% \frenchb{} being an option of \babel, it cannot load a package
+% (\pkg{keyval}) while \file{french.ldf} is read, so we defer the
+% loading of \file{keyval} and the options setup at the end of
+% \babel’s loading.
+% \begin{macrocode}
+ \RequirePackage{keyval}%
+ \define@key{FB}{ShowOptions}[true]%
+ {\csname FBShowOptions#1\endcsname}%
+% \end{macrocode}
+% The next two keys can only be toggled when French is the main
+% language.
+% \begin{macrocode}
+ \define@key{FB}{StandardLayout}[true]%
+ {\ifFB@mainlanguage@FR
+ \csname FBStandardLayout#1\endcsname
+ \else
+ \PackageWarning{french.ldf}%
+ {Option `StandardlLayout' skipped:\MessageBreak
+ French is *not* babel's last option.\MessageBreak
+ Reported}%
+ \fi
+ \ifFBStandardLayout
+ \FBStandardListSpacingtrue
+ \FBStandardItemizeEnvtrue
+ \FBStandardItemLabelstrue
+ \FBStandardEnumerateEnvtrue
+ \FBIndentFirstfalse
+ \FBFrenchFootnotesfalse
+ \FBAutoSpaceFootnotesfalse
+ \FBGlobalLayoutFrenchfalse
+ \else
+ \FBStandardListSpacingfalse
+ \FBStandardItemizeEnvfalse
+ \FBStandardItemLabelsfalse
+ \FBStandardEnumerateEnvfalse
+ \FBIndentFirsttrue
+ \FBFrenchFootnotestrue
+ \FBAutoSpaceFootnotestrue
+ \fi}%
+ \define@key{FB}{GlobalLayoutFrench}[true]%
+ {\ifFB@mainlanguage@FR
+ \csname FBGlobalLayoutFrench#1\endcsname
+ \else
+ \PackageWarning{french.ldf}%
+ {Option `GlobalLayoutFrench' skipped:\MessageBreak
+ French is *not* babel's last option.\MessageBreak
+ Reported}%
+ \fi}%
+% \end{macrocode}
+% If this key is set to \fbo{true} when French is the main language,
+% nothing to do: all flags keep their default value.
+% If this key is set to \fbo{false}, nothing to do either:
+% |\babel@save| will do the job.
+% \begin{macrocode}
+ \define@key{FB}{ReduceListSpacing}[true]%
+ {\csname FBReduceListSpacing#1\endcsname
+ \ifFBReduceListSpacing \FBStandardListSpacingfalse
+ \else \FBStandardListSpacingtrue\fi
+ }%
+ \define@key{FB}{StandardListSpacing}[true]%
+ {\csname FBStandardListSpacing#1\endcsname}%
+ \define@key{FB}{ListOldLayout}[true]%
+ {\csname FBListOldLayout#1\endcsname
+ \ifFBListOldLayout
+ \FBStandardEnumerateEnvtrue
+ \renewcommand*{\FrenchLabelItem}{\textendash}%
+ \fi}%
+ \define@key{FB}{CompactItemize}[true]%
+ {\csname FBCompactItemize#1\endcsname
+ \ifFBCompactItemize
+ \FBStandardItemizeEnvfalse
+ \FBStandardEnumerateEnvfalse
+ \else
+ \FBStandardItemizeEnvtrue
+ \FBStandardEnumerateEnvtrue
+ \fi}%
+ \define@key{FB}{StandardItemizeEnv}[true]%
+ {\csname FBStandardItemizeEnv#1\endcsname}%
+ \define@key{FB}{StandardEnumerateEnv}[true]%
+ {\csname FBStandardEnumerateEnv#1\endcsname}%
+ \define@key{FB}{StandardItemLabels}[true]%
+ {\csname FBStandardItemLabels#1\endcsname}%
+ \define@key{FB}{ItemLabels}%
+ {\renewcommand*{\FrenchLabelItem}{#1}}%
+ \define@key{FB}{ItemLabeli}%
+ {\renewcommand*{\Frlabelitemi}{#1}}%
+ \define@key{FB}{ItemLabelii}%
+ {\renewcommand*{\Frlabelitemii}{#1}}%
+ \define@key{FB}{ItemLabeliii}%
+ {\renewcommand*{\Frlabelitemiii}{#1}}%
+ \define@key{FB}{ItemLabeliv}%
+ {\renewcommand*{\Frlabelitemiv}{#1}}%
+ \define@key{FB}{StandardLists}[true]%
+ {\csname FBStandardLists#1\endcsname
+ \ifFBStandardLists
+ \FBStandardListSpacingtrue
+ \FBStandardItemizeEnvtrue
+ \FBStandardEnumerateEnvtrue
+ \FBStandardItemLabelstrue
+ \else
+ \FBStandardListSpacingfalse
+ \FBStandardItemizeEnvfalse
+ \FBStandardEnumerateEnvfalse
+ \FBStandardItemLabelsfalse
+ \fi}%
+ \define@key{FB}{ListItemsAsPar}[true]%
+ {\csname FBListItemsAsPar#1\endcsname}
+ \define@key{FB}{IndentFirst}[true]%
+ {\csname FBIndentFirst#1\endcsname}%
+ \define@key{FB}{FrenchFootnotes}[true]%
+ {\csname FBFrenchFootnotes#1\endcsname}%
+ \define@key{FB}{AutoSpaceFootnotes}[true]%
+ {\csname FBAutoSpaceFootnotes#1\endcsname}%
+ \define@key{FB}{AutoSpacePunctuation}[true]%
+ {\csname FBAutoSpacePunctuation#1\endcsname}%
+ \define@key{FB}{OriginalTypewriter}[true]%
+ {\csname FBOriginalTypewriter#1\endcsname}%
+ \define@key{FB}{ThinColonSpace}[true]%
+ {\csname FBThinColonSpace#1\endcsname
+ \ifFBThinColonSpace
+ \renewcommand*{\FBcolonspace}{\FBthinspace}%
+ \fi}%
+ \define@key{FB}{ThinSpaceInFrenchNumbers}[true]%
+ {\csname FBThinSpaceInFrenchNumbers#1\endcsname}%
+ \define@key{FB}{FrenchSuperscripts}[true]%
+ {\csname FBFrenchSuperscripts#1\endcsname}
+ \define@key{FB}{LowercaseSuperscripts}[true]%
+ {\csname FBLowercaseSuperscripts#1\endcsname}
+ \define@key{FB}{PartNameFull}[true]%
+ {\csname FBPartNameFull#1\endcsname}%
+ \define@key{FB}{CustomiseFigTabCaptions}[true]%
+ {\csname FBCustomiseFigTabCaptions#1\endcsname}%
+ \define@key{FB}{OldFigTabCaptions}[true]%
+ {\csname FBOldFigTabCaptions#1\endcsname
+ \ifFBOldFigTabCaptions
+ \def\FB@capsep@fix{\babel@save\FBCaption@Separator
+ \def\FBCaption@Separator{\CaptionSeparator}}%
+ \addto\extrasfrench{\FB@capsep@fix}%
+ \ifdefined\extrasacadian
+ \addto\extrasacadian{\FB@capsep@fix}%
+ \fi
+ \fi}%
+ \define@key{FB}{SmallCapsFigTabCaptions}[true]%
+ {\csname FBSmallCapsFigTabCaptions#1\endcsname
+ \ifFBSmallCapsFigTabCaptions
+ \let\FBfigtabshape\scshape
+ \else
+ \let\FBfigtabshape\relax
+ \fi}%
+ \define@key{FB}{SuppressWarning}[true]%
+ {\csname FBSuppressWarning#1\endcsname
+ \ifFBSuppressWarning
+ \renewcommand{\FBWarning}[1]{}%
+ \fi}%
+% \end{macrocode}
+% Here are the options controlling French guillemets spacing
+% and the output of |\frquote{}|.
+%
+% \changes{v3.2g}{2017/01/30}{Warn when wrong values are provided to
+% options EveryParGuill or EveryLineGuill.}
+%
+% \begin{macrocode}
+ \define@key{FB}{INGuillSpace}[true]%
+ {\csname FBINGuillSpace#1\endcsname
+ \ifFBINGuillSpace
+ \renewcommand*{\FBguillspace}{\space}%
+ \fi}%
+ \define@key{FB}{InnerGuillSingle}[true]%
+ {\csname FBInnerGuillSingle#1\endcsname}%
+ \define@key{FB}{EveryParGuill}[open]%
+ {\expandafter\let\expandafter
+ \FBeveryparguill\csname FBguill#1\endcsname
+ \ifx\FBeveryparguill\FBguillopen
+ \else\ifx\FBeveryparguill\FBguillclose
+ \else\ifx\FBeveryparguill\FBguillnone
+ \else
+ \let\FBeveryparguill\FBguillopen
+ \FBWarning{Wrong value for `EveryParGuill':
+ try `open',\MessageBreak
+ `close' or `none'. Reported}%
+ \fi
+ \fi
+ \fi}%
+ \define@key{FB}{EveryLineGuill}[open]%
+ {\ifFB@luatex@punct
+ \expandafter\let\expandafter
+ \FBeverylineguill\csname FBguill#1\endcsname
+ \ifx\FBeverylineguill\FBguillopen
+ \else\ifx\FBeverylineguill\FBguillclose
+ \else\ifx\FBeverylineguill\FBguillnone
+ \else
+ \let\FBeverylineguill\FBguillnone
+ \FBWarning{Wrong value for `EveryLineGuill':
+ try `open',\MessageBreak
+ `close' or `none'. Reported}%
+ \fi
+ \fi
+ \fi
+ \else
+ \FBWarning{Option `EveryLineGuill' skipped:%
+ \MessageBreak this option is for
+ LuaTeX *only*.\MessageBreak Reported}%
+ \fi}%
+% \end{macrocode}
+%
+% \changes{v3.3c}{2017/07/23}{New option `UnicodeNoBreakSpaces’ for
+% html translators (LuaLaTeX only).}
+%
+% Option \fbo{UnicodeNoBreakSpaces} (LuaLaTeX only) is meant for
+% HTML translators: when true, all non-breaking spaces added by
+% \frenchb{} are coded in the PDF file as Unicode characters, namely
+% U+A0 or U+202F, instead of penalties and glues.
+% \begin{macrocode}
+ \define@key{FB}{UnicodeNoBreakSpaces}[true]%
+ {\ifFB@luatex@punct
+ \csname FBucsNBSP#1\endcsname
+ \ifFBucsNBSP \FB@ucsNBSP=1 \fi
+ \else
+ \FBWarning{Option `UnicodeNoBreakSpaces' skipped:%
+ \MessageBreak this option is for
+ LuaTeX *only*.\MessageBreak Reported}%
+ \fi
+ }%
+% \end{macrocode}
+% Inputing French quotes as \emph{single characters} when they are
+% available on the keyboard (through a compose key for instance)
+% is more comfortable than typing |\og| and |\fg|.
+%
+% Life is simple here with modern LuaTeX or XeTeX engines: we just
+% have to activate the |\FB@addGUILspace| attribute for LuaTeX or
+% set |\XeTeXcharclass| of quotes to the proper value for XeTeX.
+%
+%\changes{v2.4c}{2010/05/23}{In \cs{ttfamilyFB}, also cancel
+% automatic spaces inside French guillemets coded as characters
+% (see \cs{frenchbsetup}).}
+%
+% \changes{v2.5g}{2011/12/31}{When \cs{ifFB@xetex@punct} is true,
+% `og’ and `fg’ options now set XeTeXcharclasses of these characters
+% to \cs{FB@guilo} and \cs{FB@guilf}. Otherwise French
+% quotes behave as normal characters (their XeTeXcharclass is 0).}
+%
+% \changes{v2.6h}{2014/01/03}{\cs{FG@og} and \cs{FG@fg} changed:
+% former clumsy code removed.}
+%
+% \changes{v3.1a}{2014/06/16}{Codes 0x13 and 0x14 added for French
+% quotes in T1-encoding. Support for older versions of LuaTeX and
+% XeTeX dropped.}
+%
+% \changes{v3.2c}{2016/05/03}{Add a warning about options og/fg for old
+% XeTeX or LuaTeX engines requiring active characters.}
+%
+% \changes{v3.4d}{2018/04/11}{New test for deciding about utf8 encoding
+% for keys og and fg (the former one fails with LaTeX 2018 release).}
+%
+% With pdfTeX (or old LuaTeX and XeTeX engines), quote characters
+% are made active and expand to |\og\ignorespaces| and |{\fg}|
+% respectively if the current language is French, and to
+% |\guillemotleft| and |\guillemotright| otherwise (think of German
+% quotes), this is done by |\FB@@og| and |\FB@@fg|; thus correct
+% non-breaking spaces will be added automatically to French quotes.
+% The quote characters typed in depend on the input encoding,
+% it can be single-byte (latin1, latin9, applemac,\dots) or
+% multi-bytes (utf-8, utf8x); the next command is meant for checking
+% whether a character is single-byte (|\FB@second| is empty) or not.
+% \begin{macrocode}
+ \def\FB@parse#1#2\endparse{\def\FB@second{#2}}%
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \define@key{FB}{og}%
+ {\ifFBunicode
+% \end{macrocode}
+% LuaTeX or XeTeX in use, first try modern LuaTeX: we just need
+% to set LuaTeX’s attribute |\FB@addGUILspace| to 1,
+% \begin{macrocode}
+ \ifFB@luatex@punct
+ \FB@addGUILspace=1 \relax
+ \fi
+% \end{macrocode}
+% then with XeTeX it is a bit more tricky:
+% \begin{macrocode}
+ \ifFB@xetex@punct
+% \end{macrocode}
+% |\XeTeXinterchartokenstate| is defined, we just need to set
+% |\XeTeXcharclass| to |\FB@guilo| for the French opening quote
+% in T1 and Unicode encoding (see subsection~\ref{ssec-punct}).
+% \begin{macrocode}
+ \XeTeXcharclass"13 = \FB@guilo
+ \XeTeXcharclass"AB = \FB@guilo
+ \XeTeXcharclass"A0 = \FB@guilnul
+ \XeTeXcharclass"202F = \FB@guilnul
+ \fi
+% \end{macrocode}
+% Issue a warning with older Unicode engines requiring active
+% characters.
+% \begin{macrocode}
+ \ifFB@active@punct
+ \FBWarning{Option og=« not supported with this version
+ of\MessageBreak LuaTeX/XeTeX; reported}%
+ \fi
+ \else
+% \end{macrocode}
+% This is for conventional TeX engines:
+% \begin{macrocode}
+ \newcommand*{\FB@@og}{%
+ \ifFBfrench
+ \ifFB@spacing\FB@og\ignorespaces
+ \else\guillemotleft
+ \fi
+ \else\guillemotleft\fi}%
+ \AtBeginDocument{%
+ \ifdefined\uc@dclc
+% \end{macrocode}
+% Package \pkg{inputenc} with utf8x (ucs) encoding loaded,
+% use |\uc@dclc|:
+% \begin{macrocode}
+ \uc@dclc{171}{default}{\FB@@og}%
+ \else
+% \end{macrocode}
+% if encoding is not utf8x, check if the argument of |og|
+% is a single-byte character:
+% \begin{macrocode}
+ \FB@parse#1\endparse
+ \ifx\FB@second\@empty
+% \end{macrocode}
+% This means 8-bit character encoding.
+% Package \pkg{MULEenc} (from CJK) defines |\mule@def|
+% to map characters to control sequences.
+% \begin{macrocode}
+ \ifdefined\mule@def
+ \mule@def{11}{\FB@@og}%
+ \else
+ \ifdefined\DeclareInputText
+ \@tempcnta`#1\relax
+ \DeclareInputText{\the\@tempcnta}{\FB@@og}%
+ \else
+% \end{macrocode}
+% Package \pkg{inputenc} not loaded, no way\dots{}
+% \begin{macrocode}
+ \FBWarning{Option `og' requires package
+ inputenc;\MessageBreak reported}%
+ \fi
+ \fi
+ \else
+% \end{macrocode}
+% This means multi-byte character encoding, we assume UTF-8
+% \begin{macrocode}
+ \DeclareUnicodeCharacter{00AB}{\FB@@og}%
+ \fi
+ \fi}%
+ \fi
+ }%
+% \end{macrocode}
+%
+% Same code for the closing quote.
+% \begin{macrocode}
+ \define@key{FB}{fg}%
+ {\ifFBunicode
+ \ifFB@luatex@punct
+ \FB@addGUILspace=1 \relax
+ \fi
+ \ifFB@xetex@punct
+ \XeTeXcharclass"14 = \FB@guilf
+ \XeTeXcharclass"BB = \FB@guilf
+ \XeTeXcharclass"A0 = \FB@guilnul
+ \XeTeXcharclass"202F = \FB@guilnul
+ \fi
+ \ifFB@active@punct
+ \FBWarning{Option fg=» not supported with this version
+ of\MessageBreak LuaTeX/XeTeX; reported}%
+ \fi
+ \else
+ \newcommand*{\FB@@fg}{%
+ \ifFBfrench
+ \ifFB@spacing\FB@fg
+ \else\guillemotright
+ \fi
+ \else\guillemotright\fi}%
+ \AtBeginDocument{%
+ \ifdefined\uc@dclc
+ \uc@dclc{187}{default}{\FB@@fg}%
+ \else
+ \FB@parse#1\endparse
+ \ifx\FB@second\@empty
+ \ifdefined\mule@def
+ \mule@def{27}{{\FB@@fg}}%
+ \else
+ \ifdefined\DeclareInputText
+ \@tempcnta`#1\relax
+ \DeclareInputText{\the\@tempcnta}{\FB@@fg}%
+ \else
+ \FBWarning{Option `fg' requires package
+ inputenc;\MessageBreak reported}%
+ \fi
+ \fi
+ \else
+ \DeclareUnicodeCharacter{00BB}{\FB@@fg}%
+ \fi
+ \fi}%
+ \fi
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\FBprocess@options}
+% |\FBprocess@options| will be executed at |\begin{document}|:
+% it first checks about packages loaded in the preamble (possibly
+% after \babel) which customise lists: currently \pkg{enumitem},
+% \pkg{paralist} and \pkg{enumerate}; then it processes the options
+% as set by \fbsetup{} or forced for compatibility with packages
+% loaded in the preamble.
+%
+% When French is the main language, |\extrasfrench| and
+% |\captionsfrench| \emph{have already been processed} by \babel{}
+% at |\begin{document}| \emph{before} |\FBprocess@options|.
+% \begin{macrocode}
+\newcommand*{\FBprocess@options}{%
+% \end{macrocode}
+% Update flags if a package customising lists has been loaded,
+% currently: \pkg{enumitem}, \pkg{paralist}, \pkg{enumerate}.
+% \begin{macrocode}
+ \@ifpackageloaded{enumitem}{%
+ \ifFBStandardItemizeEnv
+ \else
+ \FBStandardItemizeEnvtrue
+ \PackageInfo{french.ldf}%
+ {Setting StandardItemizeEnv=true for\MessageBreak
+ compatibility with enumitem package,\MessageBreak
+ reported}%
+ \fi
+ \ifFBStandardEnumerateEnv
+ \else
+ \FBStandardEnumerateEnvtrue
+ \PackageInfo{french.ldf}%
+ {Setting StandardEnumerateEnv=true for\MessageBreak
+ compatibility with enumitem package,\MessageBreak
+ reported}%
+ \fi}{}%
+ \@ifpackageloaded{paralist}{%
+ \ifFBStandardItemizeEnv
+ \else
+ \FBStandardItemizeEnvtrue
+ \PackageInfo{french.ldf}%
+ {Setting StandardItemizeEnv=true for\MessageBreak
+ compatibility with paralist package,\MessageBreak
+ reported}%
+ \fi
+ \ifFBStandardEnumerateEnv
+ \else
+ \FBStandardEnumerateEnvtrue
+ \PackageInfo{french.ldf}%
+ {Setting StandardEnumerateEnv=true for\MessageBreak
+ compatibility with paralist package,\MessageBreak
+ reported}%
+ \fi}{}%
+ \@ifpackageloaded{enumerate}{%
+ \ifFBStandardEnumerateEnv
+ \else
+ \FBStandardEnumerateEnvtrue
+ \PackageInfo{french.ldf}%
+ {Setting StandardEnumerateEnv=true for\MessageBreak
+ compatibility with enumerate package,\MessageBreak
+ reported}%
+ \fi}{}%
+% \end{macrocode}
+% Reset |\FB@ufl|’s normal meaning and update lists’ settings
+% now in case French is the main language: \hlabel{FB@ufl}
+% \begin{macrocode}
+ \def\FB@ufl{\update@frenchlists}
+ \ifFB@mainlanguage@FR
+ \update@frenchlists
+ \fi
+% \end{macrocode}
+% The layout of footnotes is handled at the |\begin{document}|
+% depending on the values of flags \fbo{FrenchFootnotes}
+% and \fbo{AutoSpaceFootnotes} (see section~\ref{ssec-footnotes}),
+% nothing has to be done here for footnotes.
+%
+% \fbo{AutoSpacePunctuation} adds a non-breaking space (in French
+% only) before the four active characters (:;!?) even if none has
+% been typed before them.
+% \begin{macrocode}
+ \ifFBAutoSpacePunctuation
+ \autospace@beforeFDP
+ \else
+ \noautospace@beforeFDP
+ \fi
+% \end{macrocode}
+% When \fbo{OriginalTypewriter} is set to \fbo{false} (the default),
+% |\ttfamily|, |\rmfamily| and |\sffamily| are redefined as
+% |\ttfamilyFB|, |\rmfamilyFB| and |\sffamilyFB| respectively
+% to prevent addition of automatic spaces before the four active
+% characters in computer code.
+% \begin{macrocode}
+ \ifFBOriginalTypewriter
+ \else
+ \let\ttfamilyORI\ttfamily
+ \let\rmfamilyORI\rmfamily
+ \let\sffamilyORI\sffamily
+ \let\ttfamily\ttfamilyFB
+ \let\rmfamily\rmfamilyFB
+ \let\sffamily\sffamilyFB
+ \fi
+% \end{macrocode}
+%
+% When package \pkg{numprint} is loaded with option
+% \opt{autolanguage}, \pkg{numprint}’s command |\npstylefrench| has
+% to be redefined differently according to the value of flag
+% \fbo{ThinSpaceInFrenchNumbers}.
+% As |\npstylefrench| was undefined in old versions of
+% \pkg{numprint}, we provide this command.
+% \begin{macrocode}
+ \@ifpackageloaded{numprint}%
+ {\ifnprt@autolanguage
+ \providecommand*{\npstylefrench}{}%
+ \ifFBThinSpaceInFrenchNumbers
+ \renewcommand*{\FBthousandsep}{\,}%
+ \fi
+ \g@addto@macro\npstylefrench{\npthousandsep{\FBthousandsep}}%
+ \fi
+ }{}%
+% \end{macrocode}
+% \fbo{FrenchSuperscripts}: if \fbo{true} |\up=\fup|, else
+% |\up=\textsuperscript|. Anyway |\up*=\FB@up@fake|. The star-form
+% |\up*{}| is provided for fonts that lack some superior letters:
+% Adobe Jenson Pro and Utopia Expert have no ``g superior’’ for
+% instance.
+% \begin{macrocode}
+ \ifFBFrenchSuperscripts
+ \DeclareRobustCommand*{\up}{\@ifstar{\FB@up@fake}{\fup}}%
+ \else
+ \DeclareRobustCommand*{\up}{\@ifstar{\FB@up@fake}%
+ {\textsuperscript}}%
+ \fi
+% \end{macrocode}
+% \fbo{LowercaseSuperscripts}: if \fbo{false} |\FB@lc| is redefined
+% to do nothing.
+% \begin{macrocode}
+ \ifFBLowercaseSuperscripts
+ \else
+ \renewcommand*{\FB@lc}[1]{##1}%
+ \fi
+% \end{macrocode}
+%
+% \changes{v3.0a}{2014/02/20}{With koma-script and memoir class,
+% customise \cs{captionformat} and \cs{captiondelim}.}
+%
+% \changes{v3.1f}{2015/05/31}{Definition of \cs{captionformat} and
+% \cs{captiondelim} changed when option CustomiseFigTabCaptions
+% is set to false.}
+%
+% \changes{v3.1f}{2015/05/31}{Bug fix for the beamer class:
+% figure and table captions are now consistent with babel-french’s
+% documentation. Pointed out by Denis Bitouzé.}
+%
+% Unless \fbo{CustomiseFigTabCaptions} has been set to \fbo{false},
+% use |\CaptionSeparator| for koma-script, \cls{memoir} and
+% \cls{beamer} classes.
+% \begin{macrocode}
+ \ifFBCustomiseFigTabCaptions
+ \ifFB@koma
+ \renewcommand*{\captionformat}{\CaptionSeparator}%
+ \fi
+ \@ifclassloaded{memoir}%
+ {\captiondelim{\CaptionSeparator}}{}%
+ \@ifclassloaded{beamer}%
+ {\defbeamertemplate{caption label separator}{FBcustom}{%
+ \CaptionSeparator}%
+ \setbeamertemplate{caption label separator}[FBcustom]}{}%
+ \else
+% \end{macrocode}
+% When \fbo{CustomiseFigTabCaptions} is \fbo{false}, have the colon
+% behave properly in French: locally force |\autospace@beforeFDP| in
+% case of \fbo{AutoSpacePunctuation=false}.
+% \begin{macrocode}
+ \ifFB@koma
+ \renewcommand*{\captionformat}{{\autospace@beforeFDP : }}%
+ \fi
+ \@ifclassloaded{memoir}%
+ {\captiondelim{{\autospace@beforeFDP : }}%
+ }{}%
+ \@ifclassloaded{beamer}%
+ {\defbeamertemplate{caption label separator}{FBcolon}{%
+ {\autospace@beforeFDP : }}%
+ \setbeamertemplate{caption label separator}[FBcolon]%
+ }{}%
+ \fi
+% \end{macrocode}
+% \fbo{ShowOptions}: if \fbo{true}, print the list of all options
+% to the \file{.log} file.
+% \begin{macrocode}
+ \ifFBShowOptions
+ \GenericWarning{* }{%
+ ***** List of possible options for babel-french ****\MessageBreak
+ [Default values between brackets when french is loaded *LAST*]%
+ \MessageBreak
+ ShowOptions=true [false]\MessageBreak
+ StandardLayout=true [false]\MessageBreak
+ GlobalLayoutFrench=false [true]\MessageBreak
+ PartNameFull=false [true]\MessageBreak
+ IndentFirst=false [true]\MessageBreak
+ ListItemsAsPar=true [false]\MessageBreak
+ StandardListSpacing=true [false]\MessageBreak
+ StandardItemizeEnv=true [false]\MessageBreak
+ StandardEnumerateEnv=true [false]\MessageBreak
+ StandardItemLabels=true [false]\MessageBreak
+ ItemLabels=\textemdash, \textbullet,
+ \protect\ding{43},... [\textendash]\MessageBreak
+ ItemLabeli=\textemdash, \textbullet,
+ \protect\ding{43},... [\textendash]\MessageBreak
+ ItemLabelii=\textemdash, \textbullet,
+ \protect\ding{43},... [\textendash]\MessageBreak
+ ItemLabeliii=\textemdash, \textbullet,
+ \protect\ding{43},... [\textendash]\MessageBreak
+ ItemLabeliv=\textemdash, \textbullet,
+ \protect\ding{43},... [\textendash]\MessageBreak
+ StandardLists=true [false]\MessageBreak
+ ListOldLayout=true [false]\MessageBreak
+ FrenchFootnotes=false [true]\MessageBreak
+ AutoSpaceFootnotes=false [true]\MessageBreak
+ AutoSpacePunctuation=false [true]\MessageBreak
+ ThinColonSpace=true [false]\MessageBreak
+ OriginalTypewriter=true [false]\MessageBreak
+ UnicodeNoBreakSpaces=true [false]\MessageBreak
+ og= <left quote character>, fg= <right quote character>%
+ INGuillSpace=true [false]\MessageBreak
+ EveryParGuill=open, close, none [open]\MessageBreak
+ EveryLineGuill=open, close, none
+ [open in LuaTeX, none otherwise]\MessageBreak
+ InnerGuillSingle=true [false]\MessageBreak
+ ThinSpaceInFrenchNumbers=true [false]\MessageBreak
+ SmallCapsFigTabCaptions=false [true]\MessageBreak
+ CustomiseFigTabCaptions=false [true]\MessageBreak
+ OldFigTabCaptions=true [false]\MessageBreak
+ FrenchSuperscripts=false [true]\MessageBreak
+ LowercaseSuperscripts=false [true]\MessageBreak
+ SuppressWarning=true [false]\MessageBreak
+ \MessageBreak
+ *********************************************%
+ \MessageBreak\protect\frenchsetup{ShowOptions}}
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \changes{v2.0}{2006/12/06}{Added warning for OT1 encoding.}
+%
+% \changes{v2.1b}{2008/04/07}{Disable some commands in bookmarks.}
+%
+% \changes{v2.5e}{2011/04/03}{\cs{pdfstringdefDisableCommands} should
+% redefine \cs{FB@og} and \cs{FB@fg} instead of \cs{og} and \cs{fg}
+% so that it works also when quotes are entered as characters.
+% Reported by Sébastien Gouezel.}
+%
+% At |\begin{document}|, we have to provide an |\xspace| command
+% in case the \pkg{xspace} package is not loaded, do some setup for
+% \file{hyperref}’s bookmarks, execute |\FBprocess@options|, switch
+% LuaTeX punctuation on and issue some warnings if necessary.
+% \begin{macrocode}
+\AtBeginDocument{%
+ \providecommand*{\xspace}{\relax}%
+% \end{macrocode}
+%
+% \changes{v2.5g}{2011/11/13}{Redefine \cs{degre}, \cs{degres} \cs{at}
+% \cs{circonflexe} and \cs{tild} for bookmarks. Add \cs{fup} also.}
+%
+% \changes{v3.2g}{2017/01/24}{Add \cs{boi} to redefinitions for
+% bookmarks.}
+%
+% \changes{v3.5d}{2018/12/16}{Add \cs{frquote} to redefinitions for
+% bookmarks.}
+%
+% Let’s redefine some commands in \file{hyperref}’s bookmarks.
+% \begin{macrocode}
+ \ifdefined\pdfstringdefDisableCommands
+ \pdfstringdefDisableCommands{%
+ \let\up\relax
+ \let\fup\relax
+ \let\degre\textdegree
+ \let\degres\textdegree
+ \def\ieme{e\xspace}%
+ \def\iemes{es\xspace}%
+ \def\ier{er\xspace}%
+ \def\iers{ers\xspace}%
+ \def\iere{re\xspace}%
+ \def\ieres{res\xspace}%
+ \def\FrenchEnumerate#1{#1\degre\space}%
+ \def\FrenchPopularEnumerate#1{#1\degre)\space}%
+ \def\No{N\degre\space}%
+ \def\no{n\degre\space}%
+ \def\Nos{N\degre\space}%
+ \def\nos{n\degre\space}%
+ \def\FB@og{\guillemotleft\space}%
+ \def\FB@fg{\space\guillemotright}%
+ \def\frquote#1{\FB@og #1\FB@fg}%
+ \def\at{@}%
+ \def\circonflexe{\string^}%
+ \def\tild{\string~}%
+ \def\boi{\textbackslash}%
+ \let\bsc\textsc
+ }%
+ \fi
+% \end{macrocode}
+% Let’s now process the remaining options, either not explicitly
+% set by \fbsetup{} or possibly modified by packages loaded after
+% \frenchb.
+% \begin{macrocode}
+ \FBprocess@options
+% \end{macrocode}
+% When option \fbo{UnicodeNoBreakSpaces} is \fbo{true}
+% (LuaLaTeX only) we need to redefine |\FBmedkern|, |\FBthickkern|
+% and |\FBthousandsep| as Unicode characters.
+% \begin{macrocode}
+ \ifFBucsNBSP
+ \renewcommand*{\FBmedkern}{\char"202F\relax}%
+ \renewcommand*{\FBthickkern}{\char"A0\relax}%
+ \ifFBThinSpaceInFrenchNumbers
+ \renewcommand*{\FBthousandsep}{\char"202F\relax}%
+ \else
+ \renewcommand*{\FBthousandsep}{\char"A0\relax}%
+ \fi
+ \fi
+% \end{macrocode}
+%
+% \changes{v3.0a}{2014/01/28}{Test \cs{ifXeTeX} changed to
+% \cs{ifFBunicode} and `xltxtra’ changed to `fontspec’.}
+%
+% \changes{v3.1a}{2014/06/14}{fontspec is not required for T1 fonts
+% used with the luainputenc.sty package.}
+%
+% \changes{v3.2g}{2017/01/24}{fontspec defines TU encoding now and
+% no longer loads xunicode.sty. Test changed.}
+%
+% \changes{v3.3c}{2017/09/06}{LaTeX 2017-04-15 defines TU encoding
+% for Unicode engines, fontspec is no longer required.}
+%
+% Finally, a warning is issued with pdfLaTeX when OT1 encoding
+% is in use at the |\begin{document}|; mind that |\encodingdefault|
+% is defined as `long’, the test would fail if |\FBOTone| was
+% defined with |\newcommand*|!
+% \begin{macrocode}
+ \begingroup
+ \newcommand{\FBOTone}{OT1}%
+ \ifx\encodingdefault\FBOTone
+ \FBWarning{OT1 encoding should not be used for French.%
+ \MessageBreak
+ Add \protect\usepackage[T1]{fontenc} to the
+ preamble\MessageBreak of your document; reported}%
+ \fi
+ \endgroup
+}
+% \end{macrocode}
+%
+% \subsection{French lists}
+% \label{ssec-lists}
+%
+% \changes{v2.6a}{2013/01/30}{Bug correction: changing \cs{leftmargin}
+% cannot be done only for itemize-lists: it messes up
+% embedded enumerate lists. Pointed out by Denis Bitouzé.
+% Lists have been completely redesigned in frenchb v.~2.6a.
+% An option for backward compatibility is provided.}
+%
+% \begin{macro}{\listFB}
+% \begin{macro}{\listORI}
+% \begin{macro}{\FB@listVsettings}
+% Vertical spacing in 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; so we define the command
+% |\FB@listVsettings| to hold the settings to be used by
+% the French variant |\listFB| of |\list|. Note that switching
+% to |\listFB| reduces vertical spacing in \emph{all} environments
+% built on |\list|: |itemize|, |enumerate|, |description|, but also
+% |abstract|, |quotation|, |quote| and |verse|\dots{}
+%
+% 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.
+%
+% \begin{macrocode}
+\let\listORI\list
+\let\endlistORI\endlist
+\def\FB@listVsettings{%
+ \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 subtracted 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\listFB#1#2{\listORI{#1}{\FB@listVsettings #2}}
+\let\endlistFB\endlist
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% Let’s now consider French itemize-lists. They differ from those
+% provided by the standard LaTeX classes:
+% \begin{itemize}
+% \item The `\textbullet’ is never used in French itemize-lists,
+% an emdash `---’ or an endash `--’ is preferred for all
+% levels. The item label to be used in French is stored in
+% |\FrenchLabelItem}|, it defaults to `---’ and can be changed
+% using \fbsetup{} (see section~\ref{ssec-keyval}).
+% \item Vertical spacing between items, before and after
+% the list, should be \emph{null} with \emph{no glue} added;
+% \item In French the labels of itemize-lists are vertically
+% aligned as shown p.~\pageref{ListAsPar}.
+% \end{itemize}
+%
+% \begin{macro}{\FrenchLabelItem}
+% \changes{v2.6a}{2013/01/30}{default changed from \cs{textendash} to
+% \cs{textemdash}.}
+% \begin{macro}{\Frlabelitemi}
+% \begin{macro}{\Frlabelitemii}
+% \begin{macro}{\Frlabelitemiii}
+% \begin{macro}{\Frlabelitemiv}
+% Default labels for French itemize-lists (same label for all levels):
+% \begin{macrocode}
+\newcommand*{\FrenchLabelItem}{\textemdash}
+\newcommand*{\Frlabelitemi}{\FrenchLabelItem}
+\newcommand*{\Frlabelitemii}{\FrenchLabelItem}
+\newcommand*{\Frlabelitemiii}{\FrenchLabelItem}
+\newcommand*{\Frlabelitemiv}{\FrenchLabelItem}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\listindentFB}
+% \begin{macro}{\descindentFB}
+% \begin{macro}{\labelindentFB}
+% \begin{macro}{\labelwidthFB}
+% Let’s define four dimens |\listindentFB|, |\descindentFB|,
+% |\labelindentFB| and |\labelwidthFB| to customise lists’ horizontal
+% indentations.
+% They are given silly negative values here in order to eventually
+% enable their customisation in the preamble. They will get
+% reasonnable defaults later when entering French (see
+% |\setlabelitemsFB| and |\setlistindentFB|) unless they have been
+% customised.
+% \begin{macrocode}
+\newdimen\listindentFB
+\setlength{\listindentFB}{-1pt}
+\newdimen\descindentFB
+\setlength{\descindentFB}{-1pt}
+\newdimen\labelindentFB
+\setlength{\labelindentFB}{-1pt}
+\newdimen\labelwidthFB
+\setlength{\labelwidthFB}{-1pt}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \changes{v3.2e}{2016/10/28}{Add missing redefinitions for
+% \cs{leftmarginv}, \cs{leftmarginvi}. Suggested by J.F. Burnol.}
+%
+% \changes{v3.5a}{2018/07/04}{New optional layout for lists:
+% lists’ items can be typeset as paragraphs with indented labels
+% while the default leaves the labels hanging into the left margin.}
+%
+% \begin{macro}{\leftmarginFB}
+% \begin{macro}{\FB@listHsettings}
+% |\FB@listHsettings| holds the new horizontal settings chosen for
+% French lists \env{itemize}, \env{enumerate} and \env{description}
+% (two possible layouts).
+% \begin{macrocode}
+\newdimen\leftmarginFB
+\def\FB@listHsettings{%
+ \ifFBListItemsAsPar
+% \end{macrocode}
+% Optional layout: lists’ items are typeset as paragraphs with
+% indented labels.
+% \begin{macrocode}
+ \itemindent=\labelindentFB
+ \advance\itemindent by \labelwidthFB
+ \advance\itemindent by \labelsep
+ \leftmargini\z@
+ \bbl@for\FB@dp {2, 3, 4, 5, 6}%
+ {\csname leftmargin\romannumeral\FB@dp\endcsname=\labelindentFB}%
+ \else
+% \end{macrocode}
+% Default layout: labels hanging into the left margin.
+% \begin{macrocode}
+ \leftmarginFB=\labelwidthFB
+ \advance\leftmarginFB by \labelsep
+ \bbl@for\FB@dp {1, 2, 3, 4, 5, 6}%
+ {\csname leftmargin\romannumeral\FB@dp\endcsname=\leftmarginFB}%
+ \advance\leftmargini by \listindentFB
+ \fi
+ \leftmargin=\csname leftmargin\ifnum\@listdepth=\@ne i\else
+ ii\fi\endcsname
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\itemizeFB}
+% \begin{macro}{\FB@itemizesettings}
+%
+% \changes{v2.6f}{2013/11/25}{\cs{labelwidth} must be reset, f.i. when
+% an itemize list occurs inside environments based on trivlist which
+% set \cs{labelwidth} to 0 (see proof environment in amsthm.sty).
+% Bug pointed out by Julien Hauseux.}
+%
+% \changes{v2.6g}{2013/12/30}{Suppress all vertical spaces only if
+% ReduceListSpacing is true. Pointed out by Pierre Willaime.}
+%
+% New environment for French itemize-lists.\\ |\FB@itemizesettings|
+% does two things: first suppress all vertical spaces including glue
+% unless option \fbo{StandardListSpacing} is set, then set horizontal
+% indentations according to |\FB@listHsettings| unless option
+% \fbo{ListOldLayout} is \fbo{true} (compatibility with lists
+% up to v.~2.5k).
+% \begin{macrocode}
+\def\FB@itemizesettings{%
+ \ifFBStandardListSpacing
+ \else
+ \setlength{\itemsep}{\z@}%
+ \setlength{\parsep}{\z@}%
+ \setlength{\topsep}{\z@}%
+ \setlength{\partopsep}{\z@}%
+ \@tempdima=\parskip
+ \addtolength{\topsep}{-\@tempdima}%
+ \addtolength{\partopsep}{\@tempdima}%
+ \fi
+ \settowidth{\labelwidth}{\csname\@itemitem\endcsname}%
+ \ifFBListOldLayout
+ \setlength{\leftmargin}{\labelwidth}%
+ \addtolength{\leftmargin}{\labelsep}%
+ \addtolength{\leftmargin}{\parindent}%
+ \else
+ \FB@listHsettings
+ \fi
+}
+% \end{macrocode}
+% The definition of |\itemizeFB| follows the one of |\itemize|
+% in standard LaTeX classes (see \file{ltlists.dtx}),
+% spaces are customised by |\FB@itemizesettings|.
+%
+% \begin{macrocode}
+\def\itemizeFB{%
+ \ifnum \@itemdepth >\thr@@\@toodeep\else
+ \advance\@itemdepth by \@ne
+ \edef\@itemitem{labelitem\romannumeral\the\@itemdepth}%
+ \expandafter
+ \listORI
+ \csname\@itemitem\endcsname
+ \FB@itemizesettings
+ \fi
+}
+\let\enditemizeFB\endlistORI
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macrocode}
+\def\setlabelitemsFB{%
+ \let\labelitemi\Frlabelitemi
+ \let\labelitemii\Frlabelitemii
+ \let\labelitemiii\Frlabelitemiii
+ \let\labelitemiv\Frlabelitemiv
+ \ifdim\labelwidthFB<\z@
+ \settowidth{\labelwidthFB}{\FrenchLabelItem}%
+ \fi
+}
+\def\setlistindentFB{%
+ \ifdim\labelindentFB<\z@
+ \ifdim\parindent=\z@
+ \setlength{\labelindentFB}{1.5em}%
+ \else
+ \setlength{\labelindentFB}{\parindent}%
+ \fi
+ \fi
+ \ifdim\listindentFB<\z@
+ \ifdim\parindent=\z@
+ \setlength{\listindentFB}{1.5em}%
+ \else
+ \setlength{\listindentFB}{\parindent}%
+ \fi
+ \fi
+ \ifdim\descindentFB<\z@
+ \ifFBListItemsAsPar
+ \setlength{\descindentFB}{\labelindentFB}%
+ \else
+ \setlength{\descindentFB}{\listindentFB}%
+ \fi
+ \fi
+}
+% \end{macrocode}
+%
+% \begin{macro}{\enumerateFB}
+% The definition of |\enumerateFB|, new to version~2.6a, follows
+% the one of |\enumerate| in standard LaTeX classes (see
+% \file{ltlists.dtx}), vertical spaces are customised (or not)
+% via |\list| (=|\listFB| or |\listORI|) and horizontal spaces
+% (leftmargins) are borrowed from |itemize| lists via
+% |\FB@listHsettings|.
+%
+% \begin{macrocode}
+\def\enumerateFB{%
+ \ifnum \@enumdepth >\thr@@\@toodeep\else
+ \advance\@enumdepth by \@ne
+ \edef\@enumctr{enum\romannumeral\the\@enumdepth}%
+ \expandafter
+ \list
+ \csname label\@enumctr\endcsname
+ {\FB@listHsettings
+ \usecounter\@enumctr\def\makelabel##1{\hss\llap{##1}}}%
+ \fi
+}
+\let\endenumerateFB\endlistORI
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\descriptionFB}
+% \changes{v2.6b}{2013/02/10}{Settings of \cs{FB@listHsettings} should
+% apply to description lists too.}
+%
+% \changes{v3.0a}{2014/02/28}{Added \cs{listindentFB} to
+% \cs{itemindent}. Suggested by Denis Bitouzé.}
+%
+% \changes{v3.2d}{2014/07/01}{Changed \cs{listindentFB} to
+% \cs{descindentFB} which defaults to \cs{listindentFB}.
+% \cs{leftmargini} reduced when \cs{descindentFB} is null.}
+%
+% \changes{v3.5a}{2018/07/04}{ListItemsAsPar option taken into account
+% for description lists.}
+%
+% Same tuning for the \env{description} environment (see
+% \file{classes.dtx} for the original definition).
+% Customisable dimen |\descindentFB|, which defaults to
+% |\listindentFB|, is added to |\itemindent| (first level only).
+% When |\descindentFB=0pt| (1rst level labels start at the left
+% margin), |\leftmargini| is reduced to |\listindentFB| instead
+% of |\listindentFB| + |\leftmarginFB|.
+%
+% When option \fbo{ListItemsAsPar} is turned to \fbo{true}, the
+% \env{description} items are also displayed as paragraphs;
+% |\descindentFB=0pt| can be used to push labels to the left margin.
+% \begin{macrocode}
+\def\descriptionFB{%
+ \list{}{\FB@listHsettings
+ \labelwidth=\z@
+ \ifFBListItemsAsPar
+ \itemindent=\descindentFB
+ \else
+ \itemindent=-\leftmargin
+ \ifnum\@listdepth=1
+ \ifdim\descindentFB=\z@
+ \ifdim\listindentFB>\z@
+ \leftmargini=\listindentFB
+ \leftmargin=\leftmargini
+ \itemindent=-\leftmargin
+ \fi
+ \else
+ \advance\itemindent by \descindentFB
+ \fi
+ \fi
+ \fi
+ \let\makelabel\descriptionlabel}%
+}
+\let\enddescriptionFB\endlistORI
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\update@frenchlists}
+% \begin{macro}{\bbl@frenchlistlayout}
+% |\update@frenchlists| will set up lists according to the final
+% options (default or part of \fbsetup{} eventually overruled in
+% |\FBprocess@options|).
+% \begin{macrocode}
+\def\update@frenchlists{%
+ \setlistindentFB
+ \ifFBStandardListSpacing
+ \else \let\list\listFB \fi
+ \ifFBStandardItemizeEnv
+ \else \let\itemize\itemizeFB \fi
+ \ifFBStandardItemLabels
+ \else \setlabelitemsFB \fi
+ \ifFBStandardEnumerateEnv
+ \else \let\enumerate\enumerateFB \let\description\descriptionFB \fi
+}
+% \end{macrocode}
+%
+% \changes{v3.2h}{2017/02/03}{Execute \cs{update@frenchlists} only
+% if GlobalLayoutFrench is false.
+% Delete stuff for lists in \cs{noextrasfrench}.}
+%
+% If \fbo{GlobalLayoutFrench=true}, nothing has to be done at
+% language’s switches regarding lists. Otherwise, |\extrasfrench|
+% saves the standard settings for lists and then executes
+% |\update@frenchlists|. In both cases, there is nothing to do for
+% lists in |\noextrasfrench|.
+%
+% In order to ensure compatibility with packages customising lists,
+% the command |\update@frenchlists| should not be included in the
+% first call to |\extrasfrench| which occurs \emph{before} the
+% relevant flags are finally set, so we define |\FB@ufl| as
+% |\relax|, it will be redefined later `AtBeginDocument’ by
+% |\FBprocess@options| as |\update@frenchlists|,
+% see p.~\pageref{FB@ufl}.
+% \begin{macrocode}
+\def\FB@ufl{\relax}
+\def\bbl@frenchlistlayout{%
+ \ifFBGlobalLayoutFrench
+ \else
+ \babel@save\list \babel@save\itemize
+ \babel@save\enumerate \babel@save\description
+ \babel@save\labelitemi \babel@save\labelitemii
+ \babel@save\labelitemiii \babel@save\labelitemiv
+ \FB@ufl
+ \fi
+}
+\addto\extrasfrench{\bbl@frenchlistlayout}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{French indentation of sections}
+% \label{ssec-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. This is controlled
+% by the flag |\if@afterindent|.
+%
+% \changes{v2.3d}{2009/03/16}{Bug correction: previous versions of
+% frenchb set the flag \cs{if@afterindent} to false outside
+% French which is correct for English but wrong for some languages
+% like Spanish. Pointed out by Juan José Torrens.}
+%
+% We will need to save the value of the flag |\if@afterindent|
+% `AtBeginDocument’ before eventually changing its value.
+%
+% \begin{macrocode}
+\def\bbl@frenchindent{%
+ \ifFBGlobalLayoutFrench
+ \else
+ \babel@save\@afterindentfalse
+ \fi
+ \ifFBIndentFirst
+ \let\@afterindentfalse\@afterindenttrue
+ \@afterindenttrue
+ \fi}
+\def\bbl@nonfrenchindent{%
+ \ifFBGlobalLayoutFrench
+ \ifFBIndentFirst
+ \@afterindenttrue
+ \fi
+ \fi}
+\addto\extrasfrench{\bbl@frenchindent}
+\addto\noextrasfrench{\bbl@nonfrenchindent}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Formatting footnotes}
+% \label{ssec-footnotes}
+%
+% \changes{v2.0}{2006/11/06}{Footnotes are now printed
+% by default `à la française’ for the whole document.}
+%
+% \changes{v2.0b}{2007/04/18}{Footnotes: Just do nothing
+% (except warning) when the bigfoot package is loaded.}
+%
+% The \pkg{bigfoot} package deeply changes the way footnotes are
+% handled. When \file{bigfoot} is loaded, we just warn the user
+% that \frenchb{} will drop the customisation of footnotes.
+%
+% The layout of footnotes is controlled by two flags
+% |\ifFBAutoSpaceFootnotes| and |\ifFBFrenchFootnotes| which are
+% set by options of \fbsetup{} (see section~\ref{ssec-keyval}).
+% The layout of footnotes \emph{does not depend} on the current
+% language (just think of two footnotes on the same page looking
+% different because one was called in a French part, the other one
+% in English!).
+%
+% We save the original definition of |\@footnotemark| at the
+% |\begin{document}| in order to include any customisation that
+% packages might have done; we define a variant |\@footnotemarkFB|
+% which just adds a thin space before the number or symbol calling
+% a footnote (any space typed in is removed first). The choice
+% between the two definitions (valid for the whole document) is
+% controlled by flag |\ifFBAutoSpaceFootnotes|.
+%
+% \changes{v2.4a}{2009/11/23}{\cs{PackageWarning} changed to
+% \cs{PackageInfo} (when bigfoot package in use).}
+%
+% \begin{macrocode}
+\AtBeginDocument{\@ifpackageloaded{bigfoot}%
+ {\PackageInfo{french.ldf}%
+ {bigfoot package in use.\MessageBreak
+ babel-french will NOT customise footnotes;%
+ \MessageBreak reported}}%
+ {\let\@footnotemarkORI\@footnotemark
+ \def\@footnotemarkFB{\leavevmode\unskip\unkern
+ \,\@footnotemarkORI}%
+ \ifFBAutoSpaceFootnotes
+ \let\@footnotemark\@footnotemarkFB
+ \fi}%
+ }
+% \end{macrocode}
+%
+% \begin{macro}{\@makefntextFB}
+% We then define |\@makefntextFB|, a variant of |\@makefntext|
+% which is responsible for the layout of footnotes, to match the
+% specifications of the French `Imprimerie Nationale’: footnotes
+% will be indented by |\parindentFFN|, numbers (if any) typeset on
+% the baseline (instead of superscripts), right aligned on
+% |\parindentFFN| and followed by a dot and an half quad kern.
+% Whenever symbols are used to number footnotes (as in |\thanks|
+% for instance), we switch back to the standard layout (the French
+% layout of footnotes is meant for footnotes numbered by arabic or
+% roman digits).
+%
+% \changes{v2.0}{2006/11/06}{\cs{parindentFFN} not changed if
+% already defined (required by JA for cah-gut.cls).}
+%
+% \changes{v2.3b}{2008/12/06}{New commands \cs{dotFFN} and
+% \cs{kernFFN} for more flexibility (suggested by JA).}
+%
+% \changes{v3.2a}{2016/03/14}{beamer.cls requires a specific
+% definition of \cs{@makefntextFB} (pointed out by DB).
+% The same is true for memoir and koma-script classes (done).}
+%
+% The value of |\parindentFFN| will be redefined at the
+% |\begin{document}|, as the maximum of |\parindent| and 1.5em
+% \emph{unless} it has been set in the preamble (the weird value
+% 10in is just for testing whether |\parindentFFN| has been set
+% or not).
+% \begin{macrocode}
+\newdimen\parindentFFN
+\parindentFFN=10in
+% \end{macrocode}
+% |\FBfnindent| will be set `AtBeginDocument’ to the width of
+% the box holding the footnote mark, |\dotFFN| and |\kernFFN|
+% (flushed right). It is used by \cls{memoir} and koma-script
+% classes.
+% \begin{macrocode}
+\newcommand*{\dotFFN}{.}
+\newcommand*{\kernFFN}{\kern .5em}
+\newdimen\FBfnindent
+% \end{macrocode}
+% |\@makefntextFB|’s definition is now tuned according to the
+% document’s class for better compatibility.
+%
+% Koma-script classes provide |\deffootnote|, a handy command
+% to customise the footnotes’ layout (see English manual
+% \file{scrguien.pdf}); it redefines |\@makefntext| and
+% |\@@makefnmark|. First, save the original definitions.
+% \begin{macrocode}
+\ifFB@koma
+ \let\@makefntextORI\@makefntext
+ \let\@@makefnmarkORI\@@makefnmark
+% \end{macrocode}
+% |\@makefntextFB| and |\@@makefnmarkFB| will be used when option
+% \fbo{FrenchFootnotes} is \fbo{true}.
+% \begin{macrocode}
+ \deffootnote[\FBfnindent]{0pt}{\parindentFFN}%
+ {\thefootnotemark\dotFFN\kernFFN}
+ \let\@makefntextFB\@makefntext
+ \let\@@makefnmarkFB\@@makefnmark
+% \end{macrocode}
+% |\@makefntextTH| and |\@@makefnmarkTH| are meant for the
+% |\thanks| command used by |\maketitle| when \fbo{FrenchFootnotes}
+% is \fbo{true}.
+% \begin{macrocode}
+ \deffootnote[\parindentFFN]{0pt}{\parindentFFN}%
+ {\textsuperscript{\thefootnotemark}}
+ \let\@makefntextTH\@makefntext
+ \let\@@makefnmarkTH\@@makefnmark
+% \end{macrocode}
+% Restore the original definitions.
+% \begin{macrocode}
+ \let\@makefntext\@makefntextORI
+ \let\@@makefnmark\@@makefnmarkORI
+\fi
+% \end{macrocode}
+% Definitions for the \cls{memoir} class:
+% \begin{macrocode}
+\@ifclassloaded{memoir}
+% \end{macrocode}
+% (see original definition in \file{memman.pdf})
+% \begin{macrocode}
+ {\newcommand{\@makefntextFB}[1]{%
+ \def\footscript##1{##1\dotFFN\kernFFN}%
+ \setlength{\footmarkwidth}{\FBfnindent}%
+ \setlength{\footmarksep}{-\footmarkwidth}%
+ \setlength{\footparindent}{\parindentFFN}%
+ \makefootmark #1}%
+ }{}
+% \end{macrocode}
+% Definitions for the \cls{beamer} class:
+% \begin{macrocode}
+\@ifclassloaded{beamer}
+% \end{macrocode}
+% (see original definition in \file{beamerbaseframecomponents.sty}),
+% note that for the \cls{beamer} class footnotes are LR-boxes, not
+% paragraphs, so |\parindentFFN| is irrelevant.
+% class.
+%
+% \changes{v3.2h}{2016/04/09}{With beamer.cls, add \cs{llap} to
+% \cs{@thefnmark} for notes numbered over 99.}
+%
+% \begin{macrocode}
+ {\def\@makefntextFB#1{%
+ \def\insertfootnotetext{#1}%
+ \def\insertfootnotemark{\insertfootnotemarkFB}%
+ \usebeamertemplate***{footnote}}%
+ \def\insertfootnotemarkFB{%
+ \usebeamercolor[fg]{footnote mark}%
+ \usebeamerfont*{footnote mark}%
+ \llap{\@thefnmark}\dotFFN\kernFFN}%
+ }{}
+% \end{macrocode}
+% Now the default definition of |\@makefntextFB| for standard LaTeX
+% and AMS classes.
+%
+% The next command prints the footnote mark according to the
+% specifications of the French `Imprimerie Nationale’.
+% Keep in mind that |\@thefnmark| might be empty (i.e.\ in
+% AMS classes’ titles)!
+% \begin{macrocode}
+\providecommand*{\insertfootnotemarkFB}{%
+ \parindent=\parindentFFN
+ \rule\z@\footnotesep
+ \setbox\@tempboxa\hbox{\@thefnmark}%
+ \ifdim\wd\@tempboxa>\z@
+ \llap{\@thefnmark}\dotFFN\kernFFN
+ \fi}
+\providecommand\@makefntextFB[1]{\insertfootnotemarkFB #1}
+% \end{macrocode}
+% \end{macro}
+%
+% The rest of |\@makefntext|’s customisation is done at the
+% |\begin{document}|. We save the original definition of
+% |\@makefntext|, and then redefine |\@makefntext| according
+% to the value of flag |\ifFBFrenchFootnotes| (true or false).
+% Koma-script classes require a special treatment.
+%
+% \changes{v3.3c}{2017/07/28}{Reset \cs{localleftbox} locally
+% inside \cs{@makefntext}. Needed by \cs{frquote} with LuaTeX.}
+%
+% \changes{v3.5b}{2018/07/17}{Reset \cs{FBeverypar@quote} locally
+% inside \cs{@makefntext}. Needed by \cs{frquote}.}
+%
+% \changes{v3.5c}{2018/09/13}{Remove grouping inside \cs{@makefntext},
+% \cs{localleftbox} and \cs{FBeverypar@quote} saved and restored
+% instead.}
+%
+% The LuaTeX command |\localleftbox| and |\FBeverypar@quote| used
+% by |\frquote{}| have to be reset inside footnotes; done for LaTeX
+% based formats only.
+% \begin{macrocode}
+\providecommand\localleftbox[1]{}
+\AtBeginDocument{%
+ \@ifpackageloaded{bigfoot}{}%
+ {\ifdim\parindentFFN<10in
+ \else
+ \parindentFFN=\parindent
+ \ifdim\parindentFFN<1.5em \parindentFFN=1.5em \fi
+ \fi
+ \settowidth{\FBfnindent}{\dotFFN\kernFFN}%
+ \addtolength{\FBfnindent}{\parindentFFN}%
+ \let\@makefntextORI\@makefntext
+ \ifFB@koma
+% \end{macrocode}
+% Definition of |\@makefntext| for koma-script classes: running
+% \@makefntextORI inside a group to reset |\localleftbox{}| and
+% |\FBeverypar@quote| would mess up the layout of footnotes whenever
+% the first manadatory argument of |\deffootnote{}| (used as
+% |\leftskip|) is non-nil (default is 1em, 0pt in French).
+% \begin{macrocode}
+ \let\@@makefnmarkORI\@@makefnmark
+ \long\def\@makefntext#1{%
+ \localleftbox{}%
+ \let\FBeverypar@save\FBeverypar@quote
+ \let\FBeverypar@quote\relax
+ \ifFBFrenchFootnotes
+ \ifx\footnote\thanks
+ \let\@@makefnmark\@@makefnmarkTH
+ \@makefntextTH{#1}
+ \else
+ \let\@@makefnmark\@@makefnmarkFB
+ \@makefntextFB{#1}
+ \fi
+ \else
+ \let\@@makefnmark\@@makefnmarkORI
+ \@makefntextORI{#1}%
+ \fi
+ \let\FBeverypar@quote\FBeverypar@save
+ \localleftbox{\FBeveryline@quote}}%
+ \else
+% \end{macrocode}
+% Special add-on for the \cls{memoir} class: |\maketitle| redefines
+% |\@makefntext| as |\makethanksmark| which is customised as follows
+% to match the other notes’ vertical alignment.
+% \begin{macrocode}
+ \@ifclassloaded{memoir}%
+ {\ifFBFrenchFootnotes
+ \setlength{\thanksmarkwidth}{\parindentFFN}%
+ \setlength{\thanksmarksep}{-\thanksmarkwidth}%
+ \fi
+ }{}%
+% \end{macrocode}
+% Special add-on for the \cls{beamer} class: issue a warning
+% in case |\parindentFFN| has been changed.
+% \begin{macrocode}
+ \@ifclassloaded{beamer}%
+ {\ifFBFrenchFootnotes
+ \ifdim\parindentFFN=1.5em\else
+ \FBWarning{%
+ \protect\parindentFFN\space is ineffective%
+ \MessageBreak within the beamer class.%
+ \MessageBreak Reported}%
+ \fi
+ \fi
+ }{}%
+% \end{macrocode}
+% Definition of |\@makefntext| for all other classes:
+% \begin{macrocode}
+ \long\def\@makefntext#1{%
+ \localleftbox{}%
+ \let\FBeverypar@save\FBeverypar@quote
+ \let\FBeverypar@quote\relax
+ \ifFBFrenchFootnotes
+ \@makefntextFB{#1}%
+ \else
+ \@makefntextORI{#1}%
+ \fi
+ \let\FBeverypar@quote\FBeverypar@save
+ \localleftbox{\FBeveryline@quote}}%
+ \fi
+ }%
+}
+% \end{macrocode}
+%
+% For compatibility reasons, we provide definitions for the commands
+% dealing with the layout of footnotes in \frenchb{} version~1.6.
+% \fbsetup{} (see in section \ref{ssec-keyval}) should be
+% preferred for setting these options. |\StandardFootnotes| may
+% still be used locally (in minipages for instance), that’s why the
+% test |\ifFBFrenchFootnotes| is done inside |\@makefntext|.
+% \begin{macrocode}
+\newcommand*{\AddThinSpaceBeforeFootnotes}{\FBAutoSpaceFootnotestrue}
+\newcommand*{\FrenchFootnotes}{\FBFrenchFootnotestrue}
+\newcommand*{\StandardFootnotes}{\FBFrenchFootnotesfalse}
+% \end{macrocode}
+%
+% \subsection{Clean up and exit}
+%
+% \changes{v3.0a}{2014/02/20}{french.cfg will be loaded (if found)
+% instead of frenchb.cfg. NO NEED for .cfg files in French anyway.}
+%
+% \changes{v3.1h}{2015/08/19}{french.cfg from e-french conflicts with
+% babel-french. Do NOT load it (no need for .cfg files with
+% babel-french anyway).}
+%
+% Final cleaning.
+% The macro |\ldf@finish| 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. |\loadlocalcfg|
+% is redefined locally in order not to load any \file{.cfg} file for
+% French.
+% \begin{macrocode}
+\FBclean@on@exit
+\ldf@finish\CurrentOption
+\let\loadlocalcfg\FB@llc
+%</french>
+% \end{macrocode}
+%
+% \subsection[Files \file{frenchb.ldf}, \file{francais.ldf},
+% \file{canadien.ldf} and \file{acadian.ldf}]%
+% {Files \file{frenchb.ldf}, \file{francais.ldf},
+% \file{canadien.ldf} and\\ \file{acadian.ldf}}
+%
+% \changes{v3.3b}{2017/06/28}{Generate portmanteau files
+% \file{acadian.ldf}, \file{canadien.ldf}, \file{frenchb.ldf},
+% and \file{francais.ldf} and warn about deprecated options.}
+%
+% Babel now expects a \file{\meta{lang}.ldf} file for each
+% \meta{lang}.
+% So we create portmanteau \file{.ldf} files for options
+% \texttt{canadien}, \texttt{francais}, \texttt{frenchb} and
+% \texttt{acadian}. These files themselves only load
+% \file{french.ldf} which does the real work.
+% Warn users about options \opt{canadien}, \opt{frenchb} and
+% \opt{francais} being deprecated and force recommended options
+% \opt{acadian} or \opt{french}.
+% \begin{macrocode}
+%<*acadian>
+\PackageInfo{acadian.ldf}%
+ {`acadian' dialect is currently\MessageBreak
+ *absolutely identical* to the\MessageBreak
+ `french' language; reported}
+%</acadian>
+%<*canadien>
+\PackageWarning{canadien.ldf}%
+ {Option `canadien' for Babel is *deprecated*,\MessageBreak
+ it might be removed sooner or later. Please\MessageBreak
+ use `acadian' instead; reported}%
+\let\l@canadien\l@acadian
+\def\CurrentOption{acadian}
+%</canadien>
+%<*francais>
+\PackageWarning{francais.ldf}%
+ {Option `francais' for Babel is *deprecated*,\MessageBreak
+ it might be removed sooner or later. Please\MessageBreak
+ use `french' instead; reported}%
+\let\l@francais\l@french
+\def\CurrentOption{french}
+%</francais>
+% \end{macrocode}
+% Compatibility code for \babel{} pre-3.13: \file{frenchb.ldf}
+% could be loaded with options \opt{acadian}, \opt{canadien},
+% \opt{frenchb} or \opt{francais}.
+% \begin{macrocode}
+%<*frenchb>
+\def\bbl@tempa{frenchb}
+\ifx\CurrentOption\bbl@tempa
+ \let\l@frenchb\l@french
+ \def\CurrentOption{french}
+ \PackageWarning{babel-french}%
+ {Option `frenchb' for Babel is *deprecated*,\MessageBreak
+ it might be removed sooner or later. Please\MessageBreak
+ use `french' instead; reported}
+\else
+ \def\bbl@tempa{francais}
+ \ifx\CurrentOption\bbl@tempa
+ \let\l@francais\l@french
+ \def\CurrentOption{french}
+% \end{macrocode}
+% Plain formats: no warning when \file{francais.sty} loads
+% \file{frenchb.ldf} (\babel{} pre-3.13).
+% \begin{macrocode}
+ \ifx\magnification\@undefined
+ \PackageWarning{babel-french}%
+ {Option `francais' for Babel is *deprecated*,\MessageBreak
+ it might be removed sooner or later. Please\MessageBreak
+ use `french' instead; reported}%
+ \fi
+ \else
+ \def\bbl@tempa{canadien}
+ \ifx\CurrentOption\bbl@tempa
+ \let\l@canadien\l@acadian
+ \def\CurrentOption{acadian}
+ \PackageWarning{babel-french}%
+ {Option `canadien' for Babel is *deprecated*,\MessageBreak
+ it might be removed sooner or later. Please\MessageBreak
+ use `acadian' instead; reported}
+ \fi
+ \fi
+\fi
+%</frenchb>
+%<acadian|canadien|frenchb|francais>\input french.ldf\relax
+%<acadian|canadien>\let\extrasacadian\extrasfrench
+%<acadian|canadien>\let\noextrasacadian\noextrasfrench
+% \end{macrocode}
+%
+% \Finale
+% \iffalse
+%<*!lua>
+% \fi
+%%
+%% \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 \~}
+%%
+% \iffalse
+%</!lua>
+% \fi
+\endinput
+
+%%% Local Variables:
+%%% fill-column: 72
+%%% coding: utf-8
+%%% End: