% \CheckSum{2958} % %\iffalse % Tell the \LaTeX\ system who we are and write an entry on the % transcript. %<*dtx> \ProvidesFile{frenchb.dtx} % % \changes{v2.1d}{2008/05/04}{Argument of \cs{ProvidesLanguage} changed % from `french' to `frenchb', otherwise \cs{listfiles} prints % no date/version information. The bug with \cs{listfiles} % (introduced in v.~1.5!), was pointed out by Ulrike Fischer.} %\ProvidesLanguage{frenchb} %\fi %\ProvidesFile{frenchb.dtx} [2013/06/19 v2.6d French support from the babel system] %\iffalse %<*dtx> %% %% File `frenchb.dtx' % %<*code> %% %% File `frenchb.ldf' % %<*dtx|code> %% Babel package for LaTeX version 2e %% Copyright (C) 1989 - 2013 %% by Daniel Flipo %% % %<*dtx> %% This file is part of the babel system, it provides the source %% code for the French language definition file. %% % %<*filedriver> \documentclass[a4paper]{ltxdoc} \usepackage{url} \usepackage[colorlinks,urlcolor=blue]{hyperref} \DeclareFontEncoding{T1}{}{} \DeclareFontSubstitution{T1}{lmr}{m}{n} \DeclareTextCommand{\guillemotleft}{OT1}{% {\fontencoding{T1}\fontfamily{lmr}\selectfont\char19}} \DeclareTextCommand{\guillemotright}{OT1}{% {\fontencoding{T1}\fontfamily{lmr}\selectfont\char20}} \newcommand*\TeXhax{\TeX hax} \newcommand*\babel{\textsf{babel}} \newcommand*\langvar{$\langle \mathit lang \rangle$} \newcommand*\note[1]{} \newcommand*\Lopt[1]{\textsf{#1}} \newcommand*\file[1]{\texttt{#1}} \lefthyphenmin=2 \righthyphenmin=3 \begin{document} \setlength{\parindent}{0pt} \begin{center} \textbf{\Large A Babel language definition file for French}\\[3mm]^^A\] Daniel \textsc{Flipo}\\ \texttt{daniel.flipo@free.fr} \end{center} \GetFileInfo{frenchb.dtx} \RecordChanges \DocInput{frenchb.dtx} \end{document} % %\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\`egles typographiques en usage \`a % l'Imprimerie nationale'' troisi\`eme \'edition (1994), % ISBN-2-11-081075-0. % % First version released: 1.1 (1996/05/31) as part of % \babel-3.6beta. % % |frenchb| has been improved using helpful suggestions from many % people, mainly from Jacques Andr\'e, Michel Bovani, Thierry Bouche, % and Vincent Jalby. Thanks to all of them! % % This new version (2.x) has been designed to be used with \LaTeXe{} % and Plain\TeX{} formats only. \LaTeX-2.09 is no longer supported. % Changes between version 1.6 and \fileversion{} are listed in % subsection~\ref{ssec-changes} p.~\pageref{ssec-changes}. % % An extensive documentation is available in French here:\\ % \url{http://daniel.flipo.free.fr/frenchb} % % \subsection{Basic interface} % % In a multilingual document, some typographic rules are language % dependent, i.e.\ spaces before `double punctuation' (|:| |;| |!| % |?|) in French, others concern the general layout (i.e.\ layout of % lists, footnotes, indentation of first paragraphs of sections) and % should apply to the whole document. % % Starting with version~2.2, |frenchb| behaves differently according % to \babel's \emph{main language} defined as the \emph{last} % option\footnote{Its name is kept in \texttt{\textbackslash % bbl@main@language}.} at \babel's loading. When French is % not \babel's main language, |frenchb| no longer alters the global % 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 \texttt{frenchb} (see command % \texttt{\textbackslash frenchbsetup\{\}}, % section~\ref{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 |\frenchbsetup{}|; % \item vertical spacing in general \LaTeX{} lists is % shortened; % \item footnotes are displayed ``\`a la fran\c{c}aise''. % \end{enumerate} % % Regarding local typography, the command |\selectlanguage{french}| % switches to the French language\footnote{% % \texttt{\textbackslash selectlanguage\{francais\}} % and \texttt{\textbackslash selectlanguage\{frenchb\}} are kept % for backward compatibility but should no longer be used.}, % with the following effects: % \begin{enumerate} % \item French hyphenation patterns are made active; % \item `double punctuation' (|:| |;| |!| |?|) is made % active%\footnote{Actually, they are active in the whole % document, only their expansions differ in French and % outside French.} for correct spacing in French; % \item |\today| prints the date in French; % \item the caption names are translated into French % (\LaTeX{} only). The separator following the table or % figure number in captions is printed as ` -- ' in French % instead of `: ', this setting can be changed by redefining % |\CaptionSeparator| for French and |\CaptionSeparatorORI| % for other languages. % \item the space after |\dots| is removed in French. % \end{enumerate} % % Some commands are provided in |frenchb| to make typesetting % easier: % \begin{enumerate} % \item French quotation marks can be entered using the commands % |\og| and |\fg| which work in \LaTeXe and Plain\TeX, % their appearance depending on what is available to draw % them; even if you use \LaTeXe{} \emph{and} |T1|-encoding, % you should refrain from entering them as % |<<~French quotation marks~>>|: |\og| and |\fg| provide % better horizontal spacing. % |\og| and |\fg| can be used outside French, they typeset % then English quotes `` and ''. % \item A command |\up| is provided to typeset superscripts like % |M\up{me}| (abbreviation for ``Madame''), |1\up{er}| (for % ``premier''). Other commands are also provided for % ordinals: |\ier|, |\iere|, |\iers|, |\ieres|, |\ieme|, % |\iemes| (|3\iemes| prints 3\textsuperscript{es}). % \item Family names should be typeset in small capitals and never % be hyphenated, the macro |\bsc| (boxed small caps) does % this, e.g., |Leslie~\bsc{Lamport}| will produce % Leslie~\mbox{\textsc{Lamport}}. 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\textsuperscript{o}, 2\textsuperscript{o}, % 3\textsuperscript{o}, 4\textsuperscript{o}. % |\FrenchEnumerate{6}| prints 6\textsuperscript{o}. % \item Abbreviations for ``Num\'ero(s)'' and ``num\'ero(s)'' % (N\textsuperscript{o} N\textsuperscript{os} % n\textsuperscript{o} and n\textsuperscript{os}~) % are obtained via the commands |\No|, |\Nos|, |\no|, |\nos|. % \item Two commands are provided to typeset the symbol for % ``degr\'e'': |\degre| prints the raw character and % |\degres| should be used to typeset temperatures (e.g., % ``|20~\degres C|'' with an unbreakable space), or for % alcohols'' strengths (e.g., ``|45\degres|'' with \emph{no} % space in French). % \item In math mode the comma has to be surrounded with % braces to avoid a spurious space being inserted after it, % in decimal numbers for instance (see the \TeX{}book p.~134). % The command |\DecimalMathComma| makes the comma be an % ordinary character \emph{in French only} (no space added); % as a counterpart, if |\DecimalMathComma| is active, an % explicit space has to be added in lists and intervals: % |$[0,\ 1]$|, |$(x,\ y)$|. |\StandardMathComma| switches % back to the standard behaviour of the comma. % \item A command |\nombre| 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 % \file{xspace} package if present: adding % |\usepackage{xspace}| in the preamble will force macros like % |\fg|, |\ier|, |\ieme|, |\dots|, \dots, to respect the % spaces you type after them, for instance typing % `|1\ier juin|' will print `1\textsuperscript{er} juin' % (no need for a forced space after |1\ier|). % \end{enumerate} % % \subsection{Customisation} % \label{ssec-custom} % % Up to version 1.6, customisation of |frenchb| was achieved % by entering commands in \file{frenchb.cfg}. % Version 2.0 introduced a new command |\frenchbsetup{}| using % the \file{keyval} syntax which should make it easier to choose % among the many options available. The command |\frenchbsetup{}| % is to appear in the preamble only (after loading \babel). % Usage of a \file{frenchb.cfg} file for customisation \emph{should % definitely be avoided}. % % \vspace{.5\baselineskip} % |\frenchbsetup{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 |ShowOptions|) can be entered as % |ShowOptions=true| or just |ShowOptions|, the `|=true|' part % can be omitted. % % \vspace{.5\baselineskip} % The other options are listed below. Their default value is % shown between brackets, 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{itemize} % \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. This option replaces the former % command |\StandardLayout|. It might be used to avoid conflicts % with classes or packages which customise lists or footnotes. % \item |GlobalLayoutFrench=false [true*]| can be used, when French % is the main language, to 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 ``\`a la fran\c{c}aise'' in French. % Note that the layout of footnotes is language independent % anyway (see below |FrenchFootnotes| and |AutoSpaceFootnotes|). % This option replaces the former command |\FrenchLayout|. % \item |ReduceListSpacing=false [true*]|; |frenchb| reduces the % values of the vertical spaces used in the \emph{all} list % environments in French (this includes itemize, enumerate, % description, but also abstract, quote, quotation and verse and % possibly others). Setting this option to |false| % reverts to the standard settings of |list|. This option % replaces the former command |\FrenchListSpacingfalse|. % \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 |CompactItemize=false [true*]|; should no longer be used % (kept only for backward compatibility). % \item |StandardItemizeEnv=true [false*]|; |frenchb| redefines % the |itemize| environment to suppress any vertical space % between items of |itemize| lists in French and customise % leftmargins. Setting this option to |false| reverts to the % standard definition of |itemize|. % \item |StandardEnumerateEnv=true [false*]|; starting with % version~2.6 |frenchb| redefines the |enumerate| and % |description| environments to make leftmargins match those of % the French version of |itemize| lists. Setting this option to % |false| reverts to the standard definition of |enumerate| and % |description|. % \item |StandardItemLabels=true [false*]| when set to |true| this % option stops |frenchb| from changing the labels in |itemize| % lists in French. % \item |ItemLabels=\textendash|, |\textbullet|, |\ding{43}|, % \dots, |[\textemdash*]|; when |StandardItemLabels=false| (the % default), this option enables to choose the label used in % |itemize| lists for all levels. The next three options do % the same but each one for one level only. Note that the % example |\ding{43}| requires |\usepackage{pifont}|. % \item |ItemLabeli=\textendash|, |\textbullet|, |\ding{43}|, % \dots,|[\textemdash*]| % \item |ItemLabelii=\textendash|, |\textbullet|, |\ding{43}|, % \dots, |[\textemdash*]| % \item |ItemLabeliii=\textendash|, |\textbullet|, |\ding{43}|, % \dots, |[\textemdash*]| % \item |ItemLabeliv=\textendash|, |\textbullet|, |\ding{43}|, % \dots, |[\textemdash*]| % \item |StandardLists=true [false*]| forbids |frenchb| to % customise any kind of list. Try the option |StandardLists| % in case of conflicts with classes or packages that customise % lists too. This option is just a shorthand for all four options % |ReduceListSpacing=false|, |StandardItemizeEnv=true|, % |StandardEnumerateEnv=true| and |StandardItemLabels=true|. % \item |IndentFirst=false [true*]|; |frenchb| normally forces % indentation of the first paragraph of sections. % When this option is set to |false|, the first paragraph of % will look the same in French and in English (not indented). % \item |FrenchFootnotes=false [true*]| reverts to the standard % layout of footnotes. By default |frenchb| typesets leading % numbers as `1.\hspace{.5em}' instead of `$\hbox{}^1$', but % has no effect on footnotes numbered with symbols (as in the % |\thanks| command). The former commands |\StandardFootnotes| % and |\FrenchFootnotes| are still there, |\StandardFootnotes| % can be useful 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 |false| % reverts to the standard setting (no space added). % \item |FrenchSuperscripts=false [true]| ; then % |\up=\textsuperscript| (option added in version 2.1). % Should only be made |false| to recompile older documents. % By default |\up| now relies on |\fup| designed to produce % better looking superscripts. % \item |AutoSpacePunctuation=false [true]|; in French, the user % \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 add a |\thinspace| before `|;|' `|!|' `|?|' and a % normal (unbreakable) space before~`|:|' (this is recommended by % the French Imprimerie nationale). This is convenient in most % cases but can lead to addition of spurious spaces in URLs or in % MS-DOS paths but only if they are no typed using |\texttt| or % verbatim mode. When the current font is a monospaced % (typewriter) font, |AutoSpacePunctuation| is locally switched % to |false|, no spurious space is added in that case, so the % default behaviour of of |frenchb| in that area should be fine % in most circumstances. % % Choosing |AutoSpacePunctuation=false| will ensure that % a proper space will be added before `|:;!?|' \emph{if and only % if} a (normal) space has been typed in. Those who are unsure % about their typing in this area should stick to the default % option and type |\string;| |\string:| |\string!| |\string?| % instead of |;| |:| |!| |?| in case an unwanted space is % added by |frenchb|. % \item |ThinColonSpace=true [false]| changes the normal % (unbreakable) space added before the colon `:' to a thin space, % so that the same amount of space is added before any of the % four double punctuation characters. The default setting is % supported by the French Imprimerie nationale. % \item |LowercaseSuperscripts=false [true]| ; by default |frenchb| % inhibits the uppercasing of superscripts (for instance when they % are moved to page headers). Making this option |false| % will disable this behaviour (not recommended). % \item |PartNameFull=false [true]|; when true, |frenchb| numbers % the title of |\part{}| commands as ``Premi\`ere partie'', % ``Deuxi\`eme partie'' and so on. With some classes which change % the|\part{}| command (AMS and SMF classes do so), you will get % ``Premi\`ere partie~I'', ``Deuxi\`eme partie~II'' instead; % when this occurs, this option should be set to |false|, % part titles will then be printed as ``Partie I'', ``Partie II''. % \item |SuppressWarning=true [false]|; when true |frenchb| issues % no warnings if |\@makecaption| has been redefined or if the % \file{bigfoot} package is in use. % \item |og=|\texttt{\guillemotleft}, |fg=|\texttt{\guillemotright}; % 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 % \texttt{\guillemotleft{} guillemets \guillemotright}, or % \texttt{\guillemotleft{}guillemets\guillemotright} (with or % without spaces), to get properly typeset French quotes. % This option requires \file{inputenc} to be loaded with the % proper encoding, it works with 8-bits encodings (latin1, % latin9, ansinew, applemac,\dots) and multi-byte encodings % (utf8 and utf8x). % \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 \LaTeXe{} I suggest this: % \begin{itemize} % \item run the following file, with the encoding suitable for % your machine (\textit{my-encoding} will be |latin1| for % \textsc{unix} machines, |ansinew| for PCs running~Windows, % |applemac| or |latin1| for Macintoshs, or |utf8|\dots\\[3mm]^^A\] % |%%% Test file for French hyphenation.|\\ % |\documentclass{article}|\\ % |\usepackage[|\textit{my-encoding}|]{inputenc}|\\ % |\usepackage[T1]{fontenc} % Use LM fonts|\\ % |\usepackage{lmodern} % for French|\\ % |\usepackage[frenchb]{babel}|\\ % |\begin{document}|\\ % |\showhyphens{signal container \'ev\'enement alg\`ebre}|\\ % |\showhyphens{|\texttt{signal container \'ev\'enement % alg\`ebre}|}|\\ % |\end{document}| % \item check the hyphenations proposed by \TeX{} in your log-file; % in French you should get with both 7-bit and 8-bit encodings\\ % \texttt{si-gnal contai-ner \'ev\'e-ne-ment al-g\`ebre}.\\ % Do not care about how accented characters are displayed in the % log-file, what matters is the position of the `|-|' hyphen % signs \emph{only}. % \end{itemize} % If they are all correct, your installation (probably) works fine, % if one (or more) is (are) wrong, ask a local wizard to see what's % going wrong and perform the test again (or e-mail me about what % happens).\\ % Frequent mismatches: % \begin{itemize} % \item you get |sig-nal con-tainer|, this probably means that the % hyphenation patterns you are using are for US-English, not for % French; % \item you get no hyphen at all in \texttt{\'ev\'e-ne-ment}, this % probably means that you are using CM fonts and the macro % |\accent| to produce accented characters. % Using 8-bits fonts with built-in accented characters avoids % this kind of mismatch. % \end{itemize} % % \textbf{Options' order} -- Please remember that options are read % in the order they appear inside the |\frenchbsetup| command. % Someone wishing that |frenchb| leaves the layout of lists % and footnotes untouched but caring for indentation of first % paragraph of sections could choose % |\frenchbsetup{StandardLayout,IndentFirst}| and get the expected % layout. Choosing |\frenchbsetup{IndentFirst,StandardLayout}| % would not lead to the expected result: option |IndentFirst| would % be overwritten by |StandardLayout|. % % \subsection{Changes} % \label{ssec-changes} % % \subsubsection*{What's new in version 2.0?} % % Here is the list of all changes: % \begin{itemize} % \item Support for \LaTeX-2.09 and for \LaTeXe{} in compatibility % mode has been dropped. This version is meant for \LaTeXe{} and % Plain based formats (like \file{bplain}). \LaTeXe{} formats % based on ml\TeX{} are no longer supported either (plenty of % good 8-bits fonts are available now, so T1 encoding should % be preferred for typesetting in French). A warning is issued % when OT1 encoding is in use at the |\begin{document}|. % \item Customisation should now be handled only by command % |\frenchbsetup{}|, \file{frenchb.cfg} (kept for compatibility) % should no longer be used. See section~\ref{ssec-custom} for % the list of available options. % \item Captions in figures and table have changed in French: former % abbreviations ``Fig.'' and ``Tab.'' have been replaced by full % names ``Figure'' and ``Table''. If this leads to formatting % problems in captions, you can add the following two commands to % your preamble (after loading \babel) to get the former captions\\ % |\addto\captionsfrench{\def\figurename{{\scshape Fig.}}}|\\ % |\addto\captionsfrench{\def\tablename{{\scshape Tab.}}}|. % \item The |\nombre| command is now provided by the \file{numprint} % package which has to be loaded \emph{after} \babel{} with the % option |autolanguage| if number formatting should depend on the % current language. % \item The |\bsc| command no longer uses an |\hbox| to stop % hyphenation of names but a |\kern0pt| instead. This change % enables \file{microtype} to fine tune the length of the % argument of |\bsc|; as a side-effect, compound names like % Dupont-Durand can now be hyphenated on explicit hyphens. % You can get back to the former behaviour of |\bsc| by adding\\ % |\renewcommand*{\bsc}[1]{\leavevmode\hbox{\scshape #1}}|\\ % to the preamble of your document. % \item Footnotes are now displayed ``\`a la fran\c caise'' for the % whole document, except with an explicit\\ % |\frenchbsetup{AutoSpaceFootnotes=false,FrenchFootnotes=false}|.\\ % Add this command if you want standard footnotes. It is still % possible to revert locally to the standard layout of footnotes % by adding |\StandardFootnotes| (inside a |minipage| environment % for instance). % \end{itemize} % % \subsubsection*{What's new in version 2.1?} % % New command |\fup| to typeset better looking superscripts. % Former command |\up| is now defined as |\fup|, an option % |\frenchbsetup{FrenchSuperscripts=false}| is provided for % backward compatibility. |\fup| was designed using ideas from % Jacques Andr\'e, Thierry Bouche and Ren\'e Fritz, thanks to them! % % \subsubsection*{What's new in version 2.2?} % % Starting with version~2.2a, |frenchb| alters the layout of % lists, footnotes, and the indentation of first paragraphs of % sections) \emph{only if} French is the ``main language'' % (i.e. babel's last language option). The layout is global for % the whole document: lists, etc.\ look the same in French and in % other languages, everything is typeset ``\`a la fran\c caise'' % if French is the ``main language'', otherwise |frenchb| doesn't % change anything regarding lists, footnotes, and indentation of % paragraphs. % % \subsubsection*{What's new in version 2.3?} % % Starting with version~2.3a, |frenchb| no longer inserts spaces % automatically before `|:;!?|' when a typewriter font is in use; % this was suggested by Yannis Haralambous to prevent % spurious spaces in computer source code or expressions like % \texttt{C\string:/foo}, \texttt{http\string://foo.bar}, % etc. An option (|OriginalTypewriter|) is provided to get back % to the former behaviour of |frenchb|. % % Another probably invisible change: lowercase conversion in % |\up{}| is now achieved by the \LaTeX{} command |\MakeLowercase| % instead of \TeX's |\lowercase| command. This prevents error % messages when diacritics are used inside |\up{}| (diacritics % should \emph{never} be used in superscripts though!). % % \subsubsection*{What's new in version 2.4?} % % A new option |SuppressWarning| has been added (desactivated by % default) to suppress warnings if |\@makecaption| has been % redefined or if the \file{bigfoot} package is in use. % % French hyphenation patterns are now coded in Unicode, see file % \file{hyph-fr.tex}. Extra code has been added to deal with % hyphenation of the French ``apostrophe'' with XeTeX and LuaTeX % engines. % % Better compatibility with the \file{enumitem} package. % % When typewriter fonts are in use (hence in verbatim mode) no % space is added after `\guillemotleft' and before % `\guillemotright' when they are entered as characters % (see |\frenchbsetup|). % % \subsubsection*{What's new in version 2.5?} % % The main change is that active characters are no longer used % in French with (recent) Xe\TeX-based engines (they still are % with \TeX-based engines). All the functionalities (automatic % insertion of missing spaces before |:;!?| or bare replacement % of typed spaces with suitable unbreabable ones, tuning of the % spaces width) remain available and the user interface is % unchanged. The use of active characters is replaced by the % |\XeTeXinterchartoks| mechanism (as in package % \file{polyglossia}). % % A new command |\NoAutoSpacing| has been added. It should be used % \emph{inside a group} instead of |\shorthandoff{;:!?}| whenever % active characters or automatic spacing of French punctuation or % quote characters conflict with other packages; it is designed to % work with \TeX- and Xe\TeX-based engines. % % Bug corrections: |\frenchspacing| and |\nonfrenchspacing| are no % longer messed up by \file{frenchb.ldf}. % % \subsubsection*{What's new in version 2.6?} % % The way |frenchb| handles list environments has been completely % redesigned in version~2.6 due to a long standing bug affecting % enumerate lists inside itemize lists. Horizontal indentation of % itemize, enumerate and description lists differs now from % previous versions, an option for backward compatibility is % provided: |\frenchbsetup{ListOldLayout}|. % % |frenchb| is now compatible with the \file{paralist} package. % % Regarding the layout of figures' and tables' captions, version % 2.6c is now fully compatible with AMS and koma-script classes % and with \file{caption} and \file{floatrow} packages. % Starting with version 2.6c, the \file{frenchb.cfg} file is no % longer generated from \file{frenchb.dtx}, but it is still loaded % (if found) for backward compatibility. % % \StopEventually{} % % \changes{v2.6c}{2013/05/20}{Dummy file frenchb.cfg is no longer % generated from frenchb.dtx.} % % \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}.} % % \iffalse %<*code> % \fi % % While this file was read through the option \Lopt{frenchb} we make % it behave as if \Lopt{french} was specified. % \begin{macrocode} \def\CurrentOption{french} % \end{macrocode} % % The macro |\LdfInit| takes care of preventing that this file is % loaded more than once, checking the category code of the % \texttt{@} sign, etc. % % \begin{macrocode} \LdfInit\CurrentOption\datefrench % \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 \ifx\magnification\@undefined \ifx\@compatibilitytrue\@undefined \PackageError{frenchb.ldf} {LaTeX-2.09 format is no longer supported.\MessageBreak Aborting here} {Please upgrade to LaTeX2e!} \let\bbl@tempa\endinput \else \LaTeXetrue \fi \fi \bbl@tempa % \end{macrocode} % \end{macro} % % Check if hyphenation patterns for the French language have been % loaded in language.dat; we allow for the names `french', % `francais', `canadien' or `acadian'. The latter two are both % names used in Canada for variants of French that are in use in % that country. % % \begin{macrocode} \ifx\l@french\@undefined \ifx\l@francais\@undefined \ifx\l@canadien\@undefined \ifx\l@acadian\@undefined \@nopatterns{French} \adddialect\l@french0 \else \let\l@french\l@acadian \fi \else \let\l@french\l@canadien \fi \else \let\l@french\l@francais \fi \fi % \end{macrocode} % Now |\l@french| is always defined. % % The internal name for the French language is |french|; % |francais| and |frenchb| are synonymous for |french|: % first let both names use the same hyphenation patterns. % Later we will have to set aliases for |\captionsfrench|, % |\datefrench|, |\extrasfrench| and |\noextrasfrench|. % As French uses the standard values of |\lefthyphenmin| (2) % and |\righthyphenmin| (3), no special setting is required here. % % \begin{macrocode} \ifx\l@francais\@undefined \let\l@francais\l@french \fi \ifx\l@frenchb\@undefined \let\l@frenchb\l@french \fi % \end{macrocode} % When this language definition file was loaded for one of the % Canadian versions of French we need to make sure that a suitable % hyphenation pattern register will be found by \TeX. % \begin{macrocode} \ifx\l@canadien\@undefined \let\l@canadien\l@french \fi \ifx\l@acadian\@undefined \let\l@acadian\l@french \fi % \end{macrocode} % % This language definition can be loaded for different variants of % the French language. The `key' \babel\ macros are only defined % once, using `french' as the language name, but |frenchb| and % |francais| are synonymous. % \begin{macrocode} \def\datefrancais{\datefrench} \def\datefrenchb{\datefrench} \def\extrasfrancais{\extrasfrench} \def\extrasfrenchb{\extrasfrench} \def\noextrasfrancais{\noextrasfrench} \def\noextrasfrenchb{\noextrasfrench} % \end{macrocode} % % \begin{macro}{\extrasfrench} % \begin{macro}{\noextrasfrench} % The macro |\extrasfrench| will perform all the extra % definitions needed for the French language. % The macro |\noextrasfrench| is used to cancel the actions of % |\extrasfrench|.\\ % In French, character ``apostrophe'' 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. % % \begin{macro}{\ifFBunicode} % \begin{macro}{\ifFLuaTeX} % \begin{macro}{\ifFXeTeX} % 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''.} % % \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} % These |\lccode| changes will ensure correct hyphenation of % words like |d'aventure|, |l'utopie|, with all TeX engines % (XeTeX, LuaTeX, pdfTeX) using \file{hyph-fr.tex} patterns. % \begin{macrocode} \@namedef{extras\CurrentOption}{\lccode`\'=`\' \ifFBLuaTeX \lccode`\'="2019 \fi \ifFBXeTeX \lccode"2019=`\' \fi} \@namedef{noextras\CurrentOption}{\lccode`\'=0 \ifFBXeTeX \lccode"2019=0 \fi} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % 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} % % \subsection{Punctuation} % \label{sec-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 `double % punctuation' characters (|;| |!| |?| and |:|) have to be made % |\active| for an automatic control of the amount of space to % insert before them. Xe\TeX{} provides an alternative to active % characters and Lua\TeX{} will hopefully do so as well in the % (near?) future. % % Before doing so, we have to save the standard definition of % |\@makecaption| (which includes two ':') to compare it later to % its definition at the |\begin{document}|. % \begin{macrocode} \long\def\STD@makecaption#1#2{% \vskip\abovecaptionskip \sbox\@tempboxa{#1: #2}% \ifdim \wd\@tempboxa >\hsize #1: #2\par \else \global \@minipagefalse \hb@xt@\hsize{\hfil\box\@tempboxa\hfil}% \fi \vskip\belowcaptionskip} % \end{macrocode} % % \changes{v2.5a}{2010/08/10}{Define \cs{Fthinspace} for those who want % to customise the width of the space before ; ! and ?.} % % \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.} % % According to the I.N.\ specifications, the `:' requires a normal % space before it, but some people prefer a |\thinspace| (just % like the other three). We define |\FBcolonspace| to hold the % required amount of space (user customisable). In case some users % are not satisfied with |\thinspace|'s width, it is also % customisable. % \begin{macrocode} \newcommand*{\FBcolonspace}{\space} \newcommand*{\FBthinspace}{\thinspace} % \end{macrocode} % % \begin{macro}{\ifF@active@punct} % \begin{macro}{\ifF@xetex@punct} % Check the availability of |\XeTeXinterchartokenstate| and decide % whether the `double punctuation' characters (|;| |!| |?| and |:|) % have to be made |\active| or not. % \begin{macrocode} \newif\ifFB@active@punct \FB@active@puncttrue \newif\ifFB@xetex@punct \begingroup\expandafter\expandafter\expandafter\endgroup \expandafter\ifx\csname XeTeXinterchartokenstate\endcsname\relax \else \FB@xetex@puncttrue\FB@active@punctfalse \fi % \end{macrocode} % \end{macro} % \end{macro} % % If |\XeTeXinterchartokenstate| is available, we use the % ``inter char'' mechanism (as in polyglossia, see % \file{gloss-french.ldf}) to provide correct spacing in French % before the four characters |;| |!| |?| and |:|. We use the same % mechanism for French quotes (\texttt{\guillemotleft} and % \texttt{\guillemotright}), when automatic spacing for quotes is % required by options \texttt{og=} and \texttt{fg=} in % |\frenchbsetup{}| (see section~\ref{sec-keyval}). % % For every character used in French text-mode (except spaces), % |\XeTeXcharclass| value must be 0. % |\XeTeXcharclass| value for spaces is assumed to be 255. % Otherwise, the spacing before the `double punctuation' characters % and inside quotes might not be correct. % % We switch |\XeTeXinterchartokenstate| to 1 and change the % |\XeTeXcharclass| values of |;| |!| |?| |:| |(| |]| % \texttt{\guillemotleft} and \texttt{\guillemotright} 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{v2.5g}{2012/01/02}{Add four \cs{newif} to control % spacing of quotes (characters and control sequences).} % % \changes{v2.5g}{2012/01/01}{Skip the message in Plain, % \cs{PackageInfo} undefined for Plain formats.} % % \begin{macrocode} \newif\ifFBAutoSpaceGuill \FBAutoSpaceGuilltrue \newif\ifFBguillo@addspace \newif\ifFBguillf@addspace \newif\ifFBog@addspace \FBog@addspacetrue \newif\ifFBfg@addspace \FBfg@addspacetrue \newcount\FB@interchartokenstateORI \ifFB@xetex@punct \ifLaTeXe \PackageInfo{frenchb.ldf}{No need for active punctuation characters \MessageBreak with this version of XeTeX! reported} \fi % \end{macrocode} % We will need the following code (borrowed from % \file{zhsusefulmacros.sty}) for loops: % \begin{macrocode} \@ifundefined{@for}{% \def\@nnil{\@nil}% \def\@empty{}% \def\@fornoop#1\@@#2#3{}% \long\def\@for#1:=#2\do#3{% \expandafter\def\expandafter\@fortmp\expandafter{#2}% \ifx\@fortmp\@empty \else \expandafter\@forloop#2,\@nil,\@nil\@@#1{#3}\fi}% \long\def\@forloop#1,#2,#3\@@#4#5{\def#4{#1}\ifx #4\@nnil \else #5\def#4{#2}\ifx #4\@nnil \else#5\@iforloop #3\@@#4{#5}\fi\fi}% \long\def\@iforloop#1,#2\@@#3#4{\def#3{#1}\ifx #3\@nnil \expandafter\@fornoop \else #4\relax\expandafter\@iforloop\fi#2\@@#3{#4}}% \def\@tfor#1:={\@tf@r#1 }% \long\def\@tf@r#1#2\do#3{\def\@fortmp{#2}\ifx\@fortmp\space\else \@tforloop#2\@nil\@nil\@@#1{#3}\fi}% \long\def\@tforloop#1#2\@@#3#4{\def#3{#1}\ifx #3\@nnil \expandafter\@fornoop \else #4\relax\expandafter\@tforloop\fi#2\@@#3{#4}}% }{}% % \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).} % % Five new character classes are defined for |frenchb|. % \begin{macrocode} \newXeTeXintercharclass\FB@punctthick \newXeTeXintercharclass\FB@punctthin \newXeTeXintercharclass\FB@punctnul \newXeTeXintercharclass\FB@punctguilo \newXeTeXintercharclass\FB@punctguilf % \end{macrocode} % We define a command to store the |\XeTeXcharclass| values which % will be modified for French (as a comma separated list) and a % command to retrieve them. % \begin{macrocode} \def\FB@charclassesORI{} \def\empty{} \def\FB@parse#1,#2\endparse{\def\FB@class{#1}% \def\FB@charclassesORI{#2}}% % \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@punctguilo} and \cs{FB@punctguilf} 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.} % % \begin{macrocode} \newcommand*{\FB@xetex@punct@french}{% % \end{macrocode} % Saving must not be repeated if saved values are already in. % \begin{macrocode} \ifx\FB@charclassesORI\empty \FB@interchartokenstateORI=\XeTeXinterchartokenstate \@for\FB@char:={`\:,`\;,`\!,`\?,"AB,"BB,`\(,`\[,`\{,`\,,`\.,% `\-,`\),`\],`\},`\%,"22,"27,"60,"2019}\do {\edef\FB@charclassesORI{\FB@charclassesORI% \the\XeTeXcharclass\FB@char,}}% \let\shorthandonORI\shorthandon \let\shorthandoffORI\shorthandoff \fi % \end{macrocode} % Set the classes and interactions between classes. % \begin{macrocode} \XeTeXinterchartokenstate=1 \XeTeXcharclass `\: = \FB@punctthick \XeTeXinterchartoks \z@ \FB@punctthick = {% \ifhmode\FDP@colonspace\fi}% \XeTeXinterchartoks \FB@punctguilf \FB@punctthick = {% \FDP@colonspace}% \XeTeXinterchartoks 255 \FB@punctthick = {% \ifhmode\unskip\penalty\@M\FBcolonspace\fi}% \@for\FB@char:={`\;,`\!,`\?}\do {\XeTeXcharclass\FB@char=\FB@punctthin}% \XeTeXinterchartoks \z@ \FB@punctthin = {% \ifhmode\FDP@thinspace\fi}% \XeTeXinterchartoks \FB@punctguilf \FB@punctthin = {% \FDP@thinspace}% \XeTeXinterchartoks 255 \FB@punctthin = {% \ifhmode\unskip\penalty\@M\FBthinspace\fi}% \XeTeXinterchartoks \FB@punctguilo \z@ = {% \ifFBAutoSpaceGuill\FBguill@spacing\fi}% \XeTeXinterchartoks \FB@punctguilo 255 = {% \ifFBAutoSpaceGuill\FBguill@spacing\ignorespaces\fi}% \XeTeXinterchartoks \z@ \FB@punctguilf = {% \ifFBAutoSpaceGuill\FBguill@spacing\fi}% \XeTeXinterchartoks \FB@punctthin \FB@punctguilf = {% \ifFBAutoSpaceGuill\FBguill@spacing\fi}% \XeTeXinterchartoks 255 \FB@punctguilf = {% \ifFBAutoSpaceGuill\unskip\FBguill@spacing\fi}% % \end{macrocode} % This avoids spurious spaces in (!), [?], etc. % \begin{macrocode} \@for\FB@char:={`\[,`\(}\do {\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} \@for\FB@char:={`\{,`\,,`\.,`\-,`\),`\],`\},`\%,% "22,"27,"60,"2019}\do {\XeTeXcharclass\FB@char=\z@}% % \end{macrocode} % With Xe(La)TeX, French defines no active shorthands. % \begin{macrocode} \def\shorthandoff##1{% \@ifundefined{PackageWarning}% {\let\PackageWarning\undefined}% {\PackageWarning{frenchb.ldf}{\protect\shorthandoff{;:!?} is helpless with XeTeX,\MessageBreak use \protect\NoAutoSpacing \space *inside a group* instead;\MessageBreak reported}% }% }% \def\shorthandon##1{}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\FB@xetex@punct@nonfrench} % The following command will be executed when leaving French for % restoring classes and commands modified in French. % When French is not the main language, |\noextrasfrench| is % executed `AtBeginDocument', so the test on % |\FB@charclassesORI| is mandatory. % \begin{macrocode} \newcommand*{\FB@xetex@punct@nonfrench}{% \ifx\FB@charclassesORI\empty \else \@for\FB@char:={`\:,`\;,`\!,`\?,"AB,"BB,`\(,`\[,`\{,`\,,`\.,% `\-,`\),`\],`\},"22,"25,"27,"60,"2019}\do {\expandafter\FB@parse\FB@charclassesORI\endparse \XeTeXcharclass\FB@char=\FB@class}% \def\FB@charclassesORI{}% \XeTeXinterchartokenstate=\FB@interchartokenstateORI \let\shorthandon\shorthandonORI \let\shorthandoff\shorthandoffORI \fi } \addto\extrasfrench{\FB@xetex@punct@french} \addto\noextrasfrench{\FB@xetex@punct@nonfrench} \fi % \end{macrocode} % \end{macro} % % Otherwise 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 an unbreakable |\thinspace| instead. If no % space has been typed, we add |\FDP@thinspace| which will be % defined, up to the user's wishes, as an automatic added % thin space, or as |\@empty|. % \begin{macrocode} \declare@shorthand{french}{;}{% \ifhmode \ifdim\lastskip>\z@ \unskip\penalty\@M\FBthinspace \else \FDP@thinspace \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}{!}{% \ifhmode \ifdim\lastskip>\z@ \unskip\penalty\@M\FBthinspace \else \FDP@thinspace \fi \fi \string!} \declare@shorthand{french}{?}{% \ifhmode \ifdim\lastskip>\z@ \unskip\penalty\@M\FBthinspace \else \FDP@thinspace \fi \fi \string?} \declare@shorthand{french}{:}{% \ifhmode \ifdim\lastskip>\z@ \unskip\penalty\@M\FBcolonspace \else \FDP@colonspace \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} % % A new `if' |\FBAutoSpacePunctuation| needs to be defined now. % \begin{macrocode} \newif\ifFBAutoSpacePunctuation \FBAutoSpacePunctuationtrue % \end{macrocode} % % \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.} % % \begin{macro}{\AutoSpaceBeforeFDP} % \begin{macro}{\NoAutoSpaceBeforeFDP} % |\FDP@thinspace| and |\FDP@colonspace| are defined as unbreakable % spaces by |\autospace@beforeFDP| or as |\@empty| by % |\noautospace@beforeFDP| (internal commands), 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{% \def\FDP@thinspace{\penalty\@M\FBthinspace}% \def\FDP@colonspace{\penalty\@M\FBcolonspace}} \def\noautospace@beforeFDP{\let\FDP@thinspace\@empty \let\FDP@colonspace\@empty} \ifLaTeXe \def\AutoSpaceBeforeFDP{\autospace@beforeFDP \FBAutoSpacePunctuationtrue} \def\NoAutoSpaceBeforeFDP{\noautospace@beforeFDP \FBAutoSpacePunctuationfalse} \else \let\AutoSpaceBeforeFDP\autospace@beforeFDP \let\NoAutoSpaceBeforeFDP\noautospace@beforeFDP \fi \AutoSpaceBeforeFDP % \end{macrocode} % \end{macro} % \end{macro} % % \changes{v2.3a}{2008/10/10}{In LaTeX, frenchb no longer adds spaces % before `double punctuation' characters in computer code. % Suggested by Yannis Haralambous.} % % \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\'egouri\'e-Gonnard.} % % In \LaTeXe{} |\ttfamily| (and hence |\texttt|) will be redefined % `AtBeginDocument' as |\ttfamilyFB| so that no space % is added before the four |; : ! ?| characters, even if % |AutoSpacePunctuation| is true. |\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 |OriginalTypewriter| below. % % \changes{v2.4c}{2010/05/23}{In \cs{ttfamilyFB}, also cancel % automatic spaces inside French guillemets entered as characters % (see \cs{frenchbsetup}).} % % 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 |\frenchbsetup{}|. % This is also a workaround for the weird behaviour of these % characters in verbatim mode. % % \changes{v2.5g}{2012/01/02}{Switch flags \cs{ifFBog@addspace} and % \cs{ifFBfg@addspace} to true, otherwise \cs{og} and \cs{fg} % provide no spacing in XeLaTeX with options `og' and `fg' % activated in \cs{frenchbsetup} (bug v.~2.5a-f).} % % \begin{macrocode} \ifLaTeXe \let\ttfamilyORI\ttfamily \let\rmfamilyORI\rmfamily \let\sffamilyORI\sffamily \DeclareRobustCommand\ttfamilyFB{% \FBAutoSpaceGuillfalse \FBog@addspacetrue \FBfg@addspacetrue \noautospace@beforeFDP\ttfamilyORI}% \DeclareRobustCommand\rmfamilyFB{% \FBAutoSpaceGuilltrue \ifFBguillo@addspace\FBog@addspacefalse\fi \ifFBguillf@addspace\FBfg@addspacefalse\fi \ifFBAutoSpacePunctuation \autospace@beforeFDP \else \noautospace@beforeFDP \fi \rmfamilyORI}% \DeclareRobustCommand\sffamilyFB{% \FBAutoSpaceGuilltrue \ifFBguillo@addspace\FBog@addspacefalse\fi \ifFBguillf@addspace\FBfg@addspacefalse\fi \ifFBAutoSpacePunctuation \autospace@beforeFDP \else \noautospace@beforeFDP \fi \sffamilyORI}% \fi % \end{macrocode} % % \changes{v2.5a}{2010/08/14}{New command \cs{NoAutoSpacing}, % suggested by MPG.} % % \begin{macro}{\NoAutoSpacing} % The following command will switch off active punctuation % characters (if any) and disable automatic spacing for French quote % characters. It is engine independent (works for \TeX{} and % Xe\TeX{} based engines) and is meant to be used inside a group. % % \changes{v2.5g}{2012/01/02}{Switch flags \cs{ifFBog@addspace} and % \cs{ifFBfg@addspace} to true, otherwise \cs{og} and \cs{fg} % provide no spacing in XeLaTeX with options `og' and `fg' % activated in \cs{frenchbsetup} (bug v.~2.5a-f).} % % \begin{macrocode} \newcommand*{\NoAutoSpacing}{\FBAutoSpaceGuillfalse \FBog@addspacetrue \FBfg@addspacetrue \ifFB@active@punct\shorthandoff{;:!?}\fi \ifFB@xetex@punct\XeTeXinterchartokenstate=0\fi } % \end{macrocode} % \end{macro} % % \subsection{Commands for French quotation marks} % \label{sec-quotes} % % \begin{macro}{\og} % \begin{macro}{\fg} % The top macros for quotation marks will be called |\og| % (``\underline{o}uvrez \underline{g}uillemets'') and |\fg| % (``\underline{f}ermez \underline{g}uillemets''). % Another option for typesetting quotes in multilingual texts % is to use the package \file{csquotes.sty} and its command % |\enquote|. % % \begin{macrocode} \newcommand*{\og}{\@empty} \newcommand*{\fg}{\@empty} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\guillemotleft} % \begin{macro}{\guillemotright} % \begin{macro}{\textquoteddblleft} % \begin{macro}{\textquoteddblright} % \LaTeX{} users are supposed to use 8-bit output encodings (T1, % LY1,\dots) to typeset French, those who still stick to OT1 should % call \file{aeguill.sty} 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, |\guillemotleft| and |\guillemotright| are defined % by package \file{xunicode.sty}. % We will check `AtBeginDocument' that the proper output encodings % are in use (see end of section~\ref{sec-keyval}). % % \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 give the following definitions for non-LaTeX users only as a % 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} % % The next step is to provide correct spacing after |\guillemotleft| % and before |\guillemotright|: a space precedes and follows % quotation marks but no line break is allowed neither \emph{after} % the opening one, nor \emph{before} the closing one. % |\FBguill@spacing| which does the spacing, has been fine tuned by % Thierry Bouche. 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. % We'll try to be smart to users of David~Carlisle's \file{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.5g}{2012/01/01}{\cs{FBguill@spacing} needs to be skipped % in commands \cs{FB@og} and \cs{FB@fg} only when XeTeX's ``inter % char'' mechanism is triggered for quotes, see \cs{frenchbsetup}.} % % \begin{macrocode} \newcommand*{\FBguill@spacing}{\penalty\@M\hskip.8\fontdimen2\font plus.3\fontdimen3\font minus.8\fontdimen4\font} \DeclareRobustCommand*{\FB@og}{\leavevmode\guillemotleft \ifFBog@addspace\FBguill@spacing\fi} \DeclareRobustCommand*{\FB@fg}{\ifdim\lastskip>\z@\unskip\fi \ifFBfg@addspace\FBguill@spacing\fi \guillemotright\xspace} % \end{macrocode} % % The top level definitions for French quotation marks are switched % on and off through the |\extrasfrench| |\noextrasfrench| % mechanism. Outside French, |\og| and |\fg| will typeset standard % English opening and closing double quotes. % % \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.} % % \begin{macrocode} \ifLaTeXe \def\bbl@frenchguillemets{\renewcommand*{\og}{\FB@og}% \renewcommand*{\fg}{\FB@fg}} \def\bbl@nonfrenchguillemets{\renewcommand*{\og}{\textquotedblleft}% \renewcommand*{\fg}{\ifdim\lastskip>\z@\unskip\fi \textquotedblright}} \else \def\bbl@frenchguillemets{\let\og\FB@og \let\fg\FB@fg} \def\bbl@nonfrenchguillemets{\def\og{\textquotedblleft}% \def\fg{\ifdim\lastskip>\z@\unskip\fi\textquotedblright}} \fi \addto\extrasfrench{\bbl@frenchguillemets} \addto\noextrasfrench{\bbl@nonfrenchguillemets} % \end{macrocode} % % \subsection{Date in French} % % \begin{macro}{\datefrench} % The macro |\datefrench| redefines the command |\today| to % produce French dates. % % \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{v2.5a}{2010/08/20}{Replaced \cs{'}e and \cs{\char94}u % by c.s. to work with XeTeX and LuaTeX.} % % \begin{macrocode} \@namedef{date\CurrentOption}{% \def\today{{\number\day}\ifnum1=\day {\ier}\fi \space \ifcase\month \or janvier\or f{\FBeacute}vrier\or mars\or avril\or mai\or juin\or juillet\or ao{\FBucirconflexe}t\or septembre\or octobre\or novembre\or d{\FBeacute}cembre\fi \space \number\year}} % \end{macrocode} % \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\'e i Ballester.} % % \changes{v2.5a}{2010/08/21}{Test \cs{@ifundefined} leaves the % tested control sequence defined as \cs{relax} when TRUE. % Changed \cs{relax} to \cs{undefined} when testing % \cs{realsuperscript}.} % % \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\textsuperscript{er}'. Up to version 2.0 of |frenchb| |\up| was % just a shortcut for |\textsuperscript| in \LaTeXe, 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 |\frenchbsetup{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 \file{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 |LowercaseSuperscripts=false| of |\frenchbsetup{}|. % \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) \file{xltxtra} used in conjunction with % XeLaTeX and OpenType fonts having the font feature % 'VerticalPosition=Superior' (\file{xltxtra} defines % |\realsuperscript| and |\fakesuperscript|) and b) \file{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 now defined as |\FB@up| unless |\realsuperscript| is % defined (occurs with XeLaTeX calling \file{xltxtra.sty}). % \begin{macrocode} \DeclareRobustCommand*{\fup}[1]{% \@ifundefined{realsuperscript}% {\FB@up{#1}\let\realsuperscript\undefined}% {\bgroup\let\fakesuperscript\FB@up@fake \realsuperscript{\FB@lc{#1}}\egroup}} % \end{macrocode} % Let's provide a temporary definition for |\up| (redefined % `AtBeginDocument' as |\fup| or |\textsuperscript| according to % |\frenchbsetup{}| 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} % Some handy macros for those who don't know how to abbreviate ordinals: % \begin{macrocode} \def\ieme{\up{\lowercase{e}}\xspace} \def\iemes{\up{\lowercase{es}}\xspace} \def\ier{\up{\lowercase{er}}\xspace} \def\iers{\up{\lowercase{ers}}\xspace} \def\iere{\up{\lowercase{re}}\xspace} \def\ieres{\up{\lowercase{res}}\xspace} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \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)} % And some more macros relying on |\up| for numbering, % first two support macros. % \begin{macrocode} \newcommand*{\FrenchEnumerate}[1]{% #1\up{\lowercase{o}}\kern+.3em} \newcommand*{\FrenchPopularEnumerate}[1]{% #1\up{\lowercase{o}})\kern+.3em} % \end{macrocode} % % Typing |\primo| should result in `$1^{\rm o}$\kern+.3em', % \begin{macrocode} \def\primo{\FrenchEnumerate1} \def\secundo{\FrenchEnumerate2} \def\tertio{\FrenchEnumerate3} \def\quarto{\FrenchEnumerate4} % \end{macrocode} % while typing |\fprimo)| gives `1$^{\rm o}$)\kern+.3em. % \begin{macrocode} \def\fprimo){\FrenchPopularEnumerate1} \def\fsecundo){\FrenchPopularEnumerate2} \def\ftertio){\FrenchPopularEnumerate3} \def\fquarto){\FrenchPopularEnumerate4} % \end{macrocode} % % Let's provide four macros for the common abbreviations % of ``Num\'ero''. % \begin{macrocode} \DeclareRobustCommand*{\No}{N\up{\lowercase{o}}\kern+.2em} \DeclareRobustCommand*{\no}{n\up{\lowercase{o}}\kern+.2em} \DeclareRobustCommand*{\Nos}{N\up{\lowercase{os}}\kern+.2em} \DeclareRobustCommand*{\nos}{n\up{\lowercase{os}}\kern+.2em} % \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.} % % \begin{macrocode} \ifFBunicode \newcommand*{\at}{{\char"0040}} \newcommand*{\circonflexe}{{\char"005E}} \newcommand*{\tild}{{\char"007E}} \newcommand*{\boi}{\textbackslash} \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} % % \changes{v2.5a}{2010/08/20}{New definitions needed for XeTeX/LuaTeX % to properly print some dates and captions: using c.s. like \cs{'e} % do not work with XeTeX (OK with XeLaTeX).} % % French dates and captions make use of four non-ascii characters % (\texttt{\`a}, \texttt{\`e}, \texttt{\'e} and \texttt{\^u}). % This is fine except for (plain) XeTeX (|\accent| commands are not % implemented), so we define four new commands to deal with this % issue. % \begin{macrocode} \newcommand*{\FBagrave}{\`a} \newcommand*{\FBegrave}{\`e} \newcommand*{\FBeacute}{\'e} \newcommand*{\FBucirconflexe}{\^u} \ifFBunicode \ifLaTeXe \else \def\FBagrave{{\char"00E0}} \def\FBegrave{{\char"00E8}} \def\FBeacute{{\char"00E9}} \def\FBucirconflexe{{\char"00FB}} \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|). % % If \TeX{} Companion fonts are available (\file{textcomp.sty}), % we pick up |\textdegree| from them instead of using emulating % `degrees' from the |\r{}| accent. Otherwise we overwrite the % (poor) definition of |\textdegree| given in \file{latin1.def}, % \file{applemac.def} etc.\ (called by \file{inputenc.sty}) by % our definition of |\degres|. We also advice 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{% \PackageWarning{frenchb.ldf}{% Degrees would look better in TS1-encoding: \MessageBreak add \protect \usepackage{textcomp} to the preamble. \MessageBreak Degrees used}} \AtBeginDocument{\@ifundefined{DeclareEncodingSubset}% {\DeclareRobustCommand*{\degres}{% \leavevmode\hbox to 0.3em{\hss\degre\hss}% \Warning@degree@TSone \global\let\Warning@degree@TSone\relax}% \let\textdegree\degres}% {\DeclareRobustCommand*{\degres}{% \hbox{\UseTextSymbol{TS1}{\textdegree}}}}% } \fi \else \newcommand*{\degres}{% \leavevmode\hbox to 0.3em{\hss\degre\hss}} \fi % \end{macrocode} % \end{macro} % % \subsection{Formatting numbers} % \label{sec-numbers} % % \begin{macro}{\DecimalMathComma} % \begin{macro}{\StandardMathComma} % As mentioned in the \TeX{}book p.~134, the comma is of type % |\mathpunct| in math mode: it is automatically followed by a % space. This is convenient in lists and intervals but % unpleasant when the comma is used as a decimal separator % in French: it has to be entered as |{,}|. % |\DecimalMathComma| makes the comma be an ordinary character % (of type |\mathord|) in French \emph{only} (no space added); % |\StandardMathComma| switches back to the standard behaviour % of the comma. % \begin{macrocode} \newcount\std@mcc \newcount\dec@mcc \std@mcc=\mathcode`\, \dec@mcc=\std@mcc \@tempcnta=\std@mcc \divide\@tempcnta by "1000 \multiply\@tempcnta by "1000 \advance\dec@mcc by -\@tempcnta \newcommand*{\DecimalMathComma}{\iflanguage{french}% {\mathcode`\,=\dec@mcc}{}% \addto\extrasfrench{\mathcode`\,=\dec@mcc}} \newcommand*{\StandardMathComma}{\mathcode`\,=\std@mcc \addto\extrasfrench{\mathcode`\,=\std@mcc}} \addto\noextrasfrench{\mathcode`\,=\std@mcc} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\nombre} % % \changes{v2.0}{2006/11/06}{\cs{nombre} requires now numprint.sty.} % % The command |\nombre| is now borrowed from \file{numprint.sty} for % \LaTeXe. 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.\ of the change. % \begin{macrocode} \newcommand*{\nombre}[1]{{#1}\message{% *** \noexpand\nombre no longer formats numbers\string! ***}}% % \end{macrocode} % \end{macro} % % The next definitions only make sense for \LaTeXe. Let's cleanup % and exit if the format in Plain based. % % \begin{macrocode} \let\FBstop@here\relax \def\FBclean@on@exit{\let\ifLaTeXe\undefined \let\LaTeXetrue\undefined \let\LaTeXefalse\undefined} \ifx\magnification\@undefined \else \def\FBstop@here{\let\STD@makecaption\relax \FBclean@on@exit \ldf@quit\CurrentOption\endinput} \fi \FBstop@here % \end{macrocode} % % What follows now is for \LaTeXe{} \emph{only}. % We redefine |\nombre| for \LaTeXe. A warning is issued % at the first call of |\nombre| if |\numprint| is not % defined, suggesting what to do. The package \file{numprint} % is \emph{not} loaded automatically by |frenchb| because of % possible options conflict. % % \changes{v2.5a}{2010/08/21}{Test \cs{@ifundefined} leaves the % tested control sequence defined as \cs{relax} when TRUE. % Changed \cs{relax} to \cs{undefined} when testing % \cs{numprint}.} % % \begin{macrocode} \renewcommand*{\nombre}[1]{\Warning@nombre\numprint{#1}} \newcommand*{\Warning@nombre}{% \@ifundefined{numprint}% {\PackageWarning{frenchb.ldf}{% \protect\nombre\space now relies on package numprint.sty, \MessageBreak add \protect \usepackage[autolanguage]{numprint}\MessageBreak to your preamble *after* loading babel, \MessageBreak see file numprint.pdf for more options.\MessageBreak \protect\nombre\space called}% \global\let\Warning@nombre\relax \global\let\numprint\undefined }{}% } % \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}.} % % \changes{v2.0c}{2007/06/25}{\cs{ThinSpaceInFrenchNumbers} added % for compatibility with frenchb-1.x.} % % \begin{macrocode} \newcommand*{\ThinSpaceInFrenchNumbers}{% \PackageWarning{frenchb.ldf}{% Type \protect\frenchbsetup{ThinSpaceInFrenchNumbers} \MessageBreak Command \protect\ThinSpaceInFrenchNumbers\space is no longer\MessageBreak defined in frenchb v.~2,}} % \end{macrocode} % % \subsection{Caption names} % % The next step consists of 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.0}{2006/12/15}{Set \cs{CaptionSeparator} in % \cs{extrasfrench} now instead of \cs{captionsfrench} % because it has to be reset when leaving French.} % % \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{v2.5a}{2010/08/20}{Replaced \cs{'e}, \cs{`e} and \cs{`a} % by c.s. to work with XeTeX.} % % \begin{macrocode} \@namedef{captions\CurrentOption}{% \def\refname{R{\FBeacute}f{\FBeacute}rences}% \def\abstractname{R{\FBeacute}sum{\FBeacute}}% \def\bibname{Bibliographie}% \def\prefacename{Pr{\FBeacute}face}% \def\chaptername{Chapitre}% \def\appendixname{Annexe}% \def\contentsname{Table des mati{\FBegrave}res}% \def\listfigurename{Table des figures}% \def\listtablename{Liste des tableaux}% \def\indexname{Index}% \def\figurename{{\scshape Figure}}% \def\tablename{{\scshape Table}}% % \end{macrocode} % ``Premi\`ere partie'' instead of ``Part I''. % \begin{macrocode} \def\partname{\protect\@Fpt partie}% \def\@Fpt{{\ifcase\value{part}\or Premi{\FBegrave}re\or Deuxi{\FBegrave}me\or Troisi{\FBegrave}me\or Quatri{\FBegrave}me\or Cinqui{\FBegrave}me\or Sixi{\FBegrave}me\or Septi{\FBegrave}me\or Huiti{\FBegrave}me\or Neuvi{\FBegrave}me\or Dixi{\FBegrave}me\or Onzi{\FBegrave}me\or Douzi{\FBegrave}me\or Treizi{\FBegrave}me\or Quatorzi{\FBegrave}me\or Quinzi{\FBegrave}me\or Seizi{\FBegrave}me\or Dix-septi{\FBegrave}me\or Dix-huiti{\FBegrave}me\or Dix-neuvi{\FBegrave}me\or Vingti{\FBegrave}me\fi}\space\def\thepart{}}% \def\pagename{page}% \def\seename{voir}% \def\alsoname{voir aussi}% \def\enclname{P.~J. }% \def\ccname{Copie {\FBagrave} }% \def\headtoname{}% \def\proofname{D{\FBeacute}monstration}% \def\glossaryname{Glossaire}% } % \end{macrocode} % \end{macro} % % As some users who choose |frenchb| or |francais| as option of % \babel, might customise |\captionsfrenchb| or |\captionsfrancais| % in the preamble, we merge their changes at the |\begin{document}| % when they do so. % The other variants of French (canadien, acadian) are defined by % checking if the relevant option was used and then adding one extra % level of expansion. % % \changes{v2.5b}{2010/10/30}{\cs{captionsfrench} will be executed % `AtBeginDocument' after \cs{FBprocess@options}, no need to % add it here.} % % \begin{macrocode} \AtBeginDocument{\let\captions@French\captionsfrench \@ifundefined{captionsfrenchb}% {\let\captions@Frenchb\relax}% {\let\captions@Frenchb\captionsfrenchb}% \@ifundefined{captionsfrancais}% {\let\captions@Francais\relax}% {\let\captions@Francais\captionsfrancais}% \def\captionsfrench{\captions@French \captions@Francais\captions@Frenchb}% \def\captionsfrancais{\captionsfrench}% \def\captionsfrenchb{\captionsfrench}% } \@ifpackagewith{babel}{canadien}{% \def\captionscanadien{\captionsfrench}% \def\datecanadien{\datefrench}% \def\extrascanadien{\extrasfrench}% \def\noextrascanadien{\noextrasfrench}% }{} \@ifpackagewith{babel}{acadian}{% \def\captionsacadian{\captionsfrench}% \def\dateacadian{\datefrench}% \def\extrasacadian{\extrasfrench}% \def\noextrasacadian{\noextrasfrench}% }{} % \end{macrocode} % % \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).} % % \changes{v2.6c}{2013/05/18}{Former \cs{CaptionSeparator} % has been renamed as \cs{FBCaption@Separator}; % \cs{CaptionSeparator} and \cs{CaptionSeparatorORI} are available % for customisation. Newif \cs{if@FBwarning@capsep} added.} % % \begin{macro}{\CaptionSeparator} % \begin{macro}{\CaptionSeparatorORI} % Let's consider now captions in figures and tables. % In French, captions in figures and tables should be printed with % the number followed by endash (` -- '), never as `Figure 1:' which % is the default in standard \LaTeXe{} classes. % % The standard definition of |\@makecaption| (e.g., the one provided % in article.cls, report.cls, book.cls which is frozen for \LaTeXe{} % according to Frank Mittelbach), has been saved in % |\STD@makecaption| before making `:' active % (see section~\ref{sec-punct}). `AtBeginDocument' we compare it to % its current definition (some classes like koma-script classes, % AMS classes, ua-thesis.cls\dots change it). % If they are identical, |frenchb| just adds a hook called % |\FBCaption@Separator| to |\@makecaption|; |\FBCaption@Separator| % defaults to |\CaptionSeparatorORI| (`: ') as in the standard % |\@makecaption|, and will be changed to |\CaptionSeparator| % (` -- ') in French. % % The \file{caption} and \file{floatrow} packages are compatible % with |frenchb| if they are loaded after babel (a warning is % printed in the .log file when they are loaded too early). % % No warning is issued for AMS classes as their layout of captions % is compatible with French typographic standards. % % With koma-script classes, frenchb customises |\captionformat| in % French and issues no warning. % % When |\@makecaption| has been changed by another class % or package, a warning is printed in the .log file. % % \begin{macrocode} \newif\if@FBwarning@capsep \@FBwarning@capseptrue \newcommand{\FBWarning}[2]{\PackageWarning{#1}{#2}} \newcommand*{\CaptionSeparatorORI}{\string:\space} \newcommand*{\CaptionSeparator}{\space\textendash\space} \def\FBCaption@Separator{\CaptionSeparatorORI} \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} % \end{macro} % % \changes{v2.6c}{2013/05/18}{No warning about \cs{@makecaption} for % AMS classes.} % % Disable the standard warning with AMS classes. % \begin{macrocode} \@ifclassloaded{amsart}{\@FBwarning@capsepfalse}{} \@ifclassloaded{amsbook}{\@FBwarning@capsepfalse}{} \@ifclassloaded{amsdtx}{\@FBwarning@capsepfalse}{} \@ifclassloaded{amsldoc}{\@FBwarning@capsepfalse}{} \@ifclassloaded{amproc}{\@FBwarning@capsepfalse}{} % \end{macrocode} % % \changes{v2.6c}{2013/05/18}{No warning about \cs{@makecaption} for % koma-script classes. \cs{captionformat} customised in French.} % % No warning with koma-script classes: they change |\makecaption| % but we will manage to customise |\captionformat| in French later % on (see below after executing |\FBprocess@options|). % \begin{macrocode} \AtBeginDocument{% \@ifundefined{captionformat}% {\let\captionformat\undefined}% {\@FBwarning@capsepfalse}% } % \end{macrocode} % % \changes{v2.6c}{2013/05/18}{Warning added when the caption % or floatrow package is loaded before babel/frenchb.} % % Check if package \file{caption} is loaded now (before % babel/frenchb), then issue a warning advising to load it % after babel/frenchb and disable the standard warning. % \begin{macrocode} \@ifpackageloaded{caption} {\FBWarning{frenchb.ldf}% {Please load the "caption" package\MessageBreak AFTER babel/frenchb; reported}% \@FBwarning@capsepfalse}% {} % \end{macrocode} % % Same for package \file{floatrow}. % \begin{macrocode} \@ifpackageloaded{floatrow} {\FBWarning{frenchb.ldf}% {Please load the "floatrow" package\MessageBreak AFTER babel/frenchb; reported}% \@FBwarning@capsepfalse}% {} % \end{macrocode} % % 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|. % \begin{macrocode} \AtBeginDocument{% \ifx\@makecaption\STD@makecaption \global\let\@makecaption\FB@makecaption \@FBwarning@capsepfalse \fi \if@FBwarning@capsep \FBWarning{frenchb.ldf}% {The definition of \protect\@makecaption\space has been changed,\MessageBreak frenchb will NOT customise it;\MessageBreak reported}% \fi \let\FB@makecaption\relax \let\STD@makecaption\relax } % \end{macrocode} % |\FB@makecaption| uses |\CaptionSeparator| (default ` -- ') in % French, |\CaptionSeparatorORI| (default `: ') for other % languages. % \begin{macrocode} \addto\extrasfrench{% \def\FBCaption@Separator{\CaptionSeparator}} \addto\noextrasfrench{% \def\FBCaption@Separator{\CaptionSeparatorORI}} % \end{macrocode} % % \subsection{French lists} % \label{sec-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\'e. % 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. % % |\endlist| is not redefined, but |\endlistORI| and |\endlistFB| % will be defined as |\endlist| `AtBeginDocument' for users % who define their own lists using |\listORI| or |\listFB|. % \begin{macrocode} \let\listORI\list \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}} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % % Let's now consider French itemize-lists. They differ from those % provided by the standard \LaTeXe{} 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 |\frenchbsetup{}| (see section~\ref{sec-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 follows:\\ % \fbox{\parbox[t]{.5\textwidth}{% % \parindent=1.5em % Text starting at `parindent' \\ % \noindent$\Leftarrow$ Leftmargin\\ % \hspace*{\parindent}\textendash{} first item\dots{}\\ % \hspace*{\parindent}\hspace*{\labelsep}% % \textendash{} first second level item\\ % \hspace*{\parindent}\hspace*{\labelsep}% % \textendash{} next one\dots{}\\ % \hspace*{\parindent}\textendash{} second item\dots{} % }}\\ % \end{itemize} % % \begin{macro}{\FrenchLabelItem} % \changes{v2.6a}{2013/01/30}{defaults to \cs{textemdash} instead of % \cs{textendash} up to v.~2.5k.} % \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}{\bbl@frenchlabelitems} % \changes{v2.6a}{2013/01/30}{It now sets default values for % \cs{labelwidthFB} and \cs{listindentFB} and resets % \cs{FrenchLabelItem} to \cs{textendash} when compatibility % with former versions is requested.} % \begin{macro}{\bbl@nonfrenchlabelitems} % |\bbl@frenchlabelitems| saves current itemize labels and changes % them to their value in French. This code should never be executed % twice in a row, so we need a new flag that will be set and reset % by |\bbl@nonfrenchlabelitems| and |\bbl@frenchlabelitems|. % |\bbl@frenchlabelitems| also sets reasonable default values for % lengths |\labelwidthFB| and |\listindentFB| to be defined below, % but these lengths can still be customised in the preamble. % \begin{macrocode} \newif\ifFB@enterFrench \FB@enterFrenchtrue \def\bbl@frenchlabelitems{% \ifFB@enterFrench \let\@ltiORI\labelitemi \let\@ltiiORI\labelitemii \let\@ltiiiORI\labelitemiii \let\@ltivORI\labelitemiv \let\labelitemi\Frlabelitemi \let\labelitemii\Frlabelitemii \let\labelitemiii\Frlabelitemiii \let\labelitemiv\Frlabelitemiv \ifdim\labelwidthFB<\z@ \settowidth{\labelwidthFB}{\FrenchLabelItem}% \fi \ifdim\listindentFB<\z@ \ifdim\parindent=\z@ \setlength{\listindentFB}{1.5em}% \else \setlength{\listindentFB}{\parindent}% \fi \fi \FB@enterFrenchfalse \fi } \def\bbl@nonfrenchlabelitems{% \ifFB@enterFrench \else \let\Frlabelitemi\labelitemi \let\Frlabelitemii\labelitemii \let\Frlabelitemiii\labelitemiii \let\Frlabelitemiv\labelitemiv \let\labelitemi\@ltiORI \let\labelitemii\@ltiiORI \let\labelitemiii\@ltiiiORI \let\labelitemiv\@ltivORI \FB@enterFrenchtrue \fi } % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\listindentFB} % \begin{macro}{\labelwidthFB} % Let's define two lengths |\listindentFB| and |\labelwidthFB| to % customise lists' horizontal indentations. They are given % silly values here ($-1$\,pt) in order to eventually % enable their customisation in the preamble. They will get % reasonnable defaults later when entering French (see % |\bbl@frenchlabelitems|) unless they have been customised. % \begin{macrocode} \newlength\listindentFB \setlength{\listindentFB}{-1pt} \newlength\labelwidthFB \setlength{\labelwidthFB}{-1pt} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\FB@listHsettings} % \begin{macro}{\leftmarginFB} % |\FB@listHsettings| holds the new horizontal settings chosen for % French lists itemize and enumerate starting with version~2.6a. % They are based on the look resquested in French for % itemize-lists. % \begin{macrocode} \newlength\leftmarginFB \def\FB@listHsettings{% \leftmarginFB\labelwidthFB \advance\leftmarginFB \labelsep \leftmargini\leftmarginFB \advance\leftmargini \listindentFB \leftmarginii\leftmarginFB \leftmarginiii\leftmarginFB \leftmarginiv\leftmarginFB \leftmargin\csname leftmargin\romannumeral\the\@listdepth\endcsname } % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\itemizeFB} % \begin{macro}{\FB@itemizesettings} % New environment for French itemize-lists.\\ |\FB@itemizesettings| % does two things: first suppress all vertical spaces including % glue, then set horizontal indentations according to % |\FB@listHsettings| unless option |ListOldLayout| is true % (compatibility with lists up to v.~2.5k). % \begin{macrocode} \def\FB@itemizesettings{% \setlength{\itemsep}{\z@}% \setlength{\parsep}{\z@}% \setlength{\topsep}{\z@}% \setlength{\partopsep}{\z@}% \@tempdima=\parskip \addtolength{\topsep}{-\@tempdima}% \addtolength{\partopsep}{\@tempdima}% \ifFBListOldLayout \settowidth{\labelwidth}{\csname\@itemitem\endcsname}% \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 \LaTeXe{} classes (see \file{ltlists.dtx}), % spaces are customised by |\FB@itemizesettings|. % % |\enditemizeFB| will be defined as |\endlist|=|\endlistORI| % `AtBeginDocument'. % \begin{macrocode} \def\itemizeFB{% \ifnum \@itemdepth >\thr@@\@toodeep\else \advance\@itemdepth\@ne \edef\@itemitem{labelitem\romannumeral\the\@itemdepth}% \expandafter \listORI \csname\@itemitem\endcsname \FB@itemizesettings \fi} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\enumerateFB} % The definition of |\enumerateFB|, new to version~2.6a, follows % the one of |\enumerate| in standard \LaTeXe{} 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|. % % |\endenumerateFB| will be defined as |\endlist|=|\endlistORI| % `AtBeginDocument'. % \begin{macrocode} \def\enumerateFB{% \ifnum \@enumdepth >\thr@@\@toodeep\else \advance\@enumdepth\@ne \edef\@enumctr{enum\romannumeral\the\@enumdepth}% \expandafter \list \csname label\@enumctr\endcsname {\FB@listHsettings \usecounter\@enumctr\def\makelabel##1{\hss\llap{##1}}}% \fi} % \end{macrocode} % \end{macro} % % \begin{macro}{\descriptionFB} % \changes{v2.6b}{2013/02/10}{Settings of \cs{FB@listHsettings} should % apply to description lists too.} % % Same tuning for the |description| environment (see the original % definition in \file{classes.dtx}). % % \begin{macrocode} \def\descriptionFB{% \list{}{\FB@listHsettings \labelwidth\z@ \itemindent-\leftmargin \let\makelabel\descriptionlabel}} % \end{macrocode} % \end{macro} % % \subsection{French indentation of sections} % \label{sec-indent} % % \begin{macro}{\bbl@frenchindent} % \begin{macro}{\bbl@nonfrenchindent} % In French the first paragraph of each section should be indented, % this is another difference with US-English. 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\'e Torrens.} % % We will need to save the value of the flag |\if@afterindent| % `AtBeginDocument' before eventually changing its value. % % \begin{macrocode} \def\bbl@frenchindent{\let\@afterindentfalse\@afterindenttrue \@afterindenttrue} \def\bbl@nonfrenchindent{\let\@afterindentfalse\@aifORI \@afterindentfalse} % \end{macrocode} % \end{macro} % \end{macro} % % \subsection{Formatting footnotes} % \label{sec-footnotes} % % \changes{v2.0}{2006/11/06}{Footnotes are now printed % by default `\`a la fran\c caise' for the whole document.} % % \changes{v2.0b}{2007/04/18}{Footnotes: Just do nothing % (except warning) when the bigfoot package is loaded.} % % The \file{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 |\frenchbsetup{}| (see section~\ref{sec-keyval}). % Notice that 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!). % % When |\ifFBAutoSpaceFootnotes| is true, |\@footnotemark| (whose % definition is saved at the |\begin{document}| in order to include % any customisation that packages might have done) is redefined to % add a thin space before the number or symbol calling a footnote % (any space typed in is removed first). This has no effect on % the layout of the footnote itself. % % \changes{v2.4a}{2009/11/23}{\cs{PackageWarning} changed to % \cs{FBWarning} (when bigfoot package in use).} % % \begin{macrocode} \AtBeginDocument{\@ifpackageloaded{bigfoot}% {\FBWarning{frenchb.ldf}% {bigfoot package in use.\MessageBreak frenchb will NOT customise footnotes;\MessageBreak reported}}% {\let\@footnotemarkORI\@footnotemark \def\@footnotemarkFB{\leavevmode\unskip\unkern \,\@footnotemarkORI}% \ifFBAutoSpaceFootnotes \let\@footnotemark\@footnotemarkFB \fi}% } % \end{macrocode} % % 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) and followed by a dot % and an half quad space. 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).} % % 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} \newcommand*{\dotFFN}{.} \newcommand*{\kernFFN}{\kern .5em} \newdimen\parindentFFN \parindentFFN=10in \def\ftnISsymbol{\@fnsymbol\c@footnote} \long\def\@makefntextFB#1{\ifx\thefootnote\ftnISsymbol \@makefntextORI{#1}% \else \parindent=\parindentFFN \rule\z@\footnotesep \setbox\@tempboxa\hbox{\@thefnmark}% \ifdim\wd\@tempboxa>\z@ \llap{\@thefnmark}\dotFFN\kernFFN \fi #1 \fi}% % \end{macrocode} % % We save the standard definition of |\@makefntext| at the % |\begin{document}|, and then redefine |\@makefntext| according to % the value of flag |\ifFBFrenchFootnotes| (true or false). % % \begin{macrocode} \AtBeginDocument{\@ifpackageloaded{bigfoot}{}% {\ifdim\parindentFFN<10in \else \parindentFFN=\parindent \ifdim\parindentFFN<1.5em\parindentFFN=1.5em\fi \fi \let\@makefntextORI\@makefntext \long\def\@makefntext#1{% \ifFBFrenchFootnotes \@makefntextFB{#1}% \else \@makefntextORI{#1}% \fi}% }% } % \end{macrocode} % % For compatibility reasons, we provide definitions for the commands % dealing with the layout of footnotes in |frenchb| version~1.6. % |\frenchbsetup{}| (see in section \ref{sec-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{Global layout} % \label{sec-global} % % In multilingual documents, some typographic rules must depend % on the current language (e.g., hyphenation, typesetting of % numbers, spacing before double punctuation\dots), others should, % IMHO, be kept global to the document: especially the layout of % lists (see~\ref{sec-lists}) and footnotes % (see~\ref{sec-footnotes}), and the indentation of the first % paragraph of sections (see~\ref{sec-indent}). % % From version 2.2 on, if |frenchb| is \babel's ``main language'' % (i.e.\ last language option at \babel's loading), |frenchb| % customises the layout (i.e.\ lists, indentation of the first % paragraphs of sections and footnotes) in the whole document % regardless the current language. On the other hand, if |frenchb| % is \emph{not} \babel's ``main language'', it leaves the layout % unchanged both in French and in other languages. % % \begin{macro}{\FrenchLayout} % \begin{macro}{\StandardLayout} % The former commands |\FrenchLayout| and |\StandardLayout| are kept % for compatibility reasons but should no longer be used. % % \changes{v2.0g}{2008/03/23}{Flag \cs{ifFBStandardLayout} not checked % by \cs{FBprocess@options}, low-level flags have to be set % one by one.} % % \begin{macrocode} \newcommand*{\FrenchLayout}{% \FBGlobalLayoutFrenchtrue \PackageWarning{frenchb.ldf}% {\protect\FrenchLayout\space is obsolete. Please use\MessageBreak \protect\frenchbsetup{GlobalLayoutFrench} instead.}% } \newcommand*{\StandardLayout}{% \FBReduceListSpacingfalse \FBCompactItemizefalse \FBStandardItemLabelstrue \FBIndentFirstfalse \FBFrenchFootnotesfalse \FBAutoSpaceFootnotesfalse \PackageWarning{frenchb.ldf}% {\protect\StandardLayout\space is obsolete. Please use\MessageBreak \protect\frenchbsetup{StandardLayout} instead.}% } \@onlypreamble\FrenchLayout \@onlypreamble\StandardLayout % \end{macrocode} % \end{macro} % \end{macro} % % \subsection{Dots\dots} % \label{sec-dots} % % \begin{macro}{\FBtextellipsis} % \LaTeXe's standard definition of |\dots| in text-mode is % |\textellipsis| which includes a |\kern| at the end; % this space is not wanted in some cases (before a closing brace % for instance) and |\kern| breaks hyphenation of the next word. % We define |\FBtextellipsis| for French (in \LaTeXe{} only). % % The |\if| construction in the \LaTeXe{} definition of |\dots| % doesn't allow the use of |xspace| (|xspace| is always followed % by a |\fi|), so we use the AMS-\LaTeX{} construction of |\dots|; % this has to be done `AtBeginDocument' not to be overwritten % when \file{amsmath.sty} is loaded after \babel. % % \changes{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@ORI| hold the definitions of |\dots| in % Math and Text mode. They default to those of amsmath-2.0, and % will revert to standard \LaTeX{} definitions `AtBeginDocument', % if amsmath has not been loaded. |\Mdots@| doesn't change when % switching from/to French, while |\Tdots@| is |\FBtextellipsis| % in French and |\Tdots@ORI| otherwise. % \begin{macrocode} \newcommand*{\Tdots@ORI}{\@xp\textellipsis} \newcommand*{\Tdots@}{\Tdots@ORI} \newcommand*{\Mdots@}{\@xp\mdots@} \AtBeginDocument{\DeclareRobustCommand*{\dots}{\relax \csname\ifmmode M\else T\fi dots@\endcsname}% \@ifundefined{@xp}{\let\@xp\relax}{}% \@ifundefined{mdots@}{\let\Tdots@ORI\textellipsis \let\Mdots@\mathellipsis \let\mdots@\undefined}{}} \def\bbl@frenchdots{\let\Tdots@\FBtextellipsis} \def\bbl@nonfrenchdots{\let\Tdots@\Tdots@ORI} \addto\extrasfrench{\bbl@frenchdots} \addto\noextrasfrench{\bbl@nonfrenchdots} % \end{macrocode} % \end{macro} % % \subsection{Setup options: keyval stuff} % \label{sec-keyval} % % \changes{v2.0}{2006/11/06}{New command \cs{frenchbsetup} added % for global customisation.} % % \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: [false] $\to$ [true] and % StandardLayout $\to$ 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}{Values of flags % \cs{ifFBReduceListSpacing}, \cs{ifFBCompactItemize}, % \cs{ifFBStandardItemLabels}, \cs{ifFBIndentFirst}, % \cs{ifFBFrenchFootnotes}, \cs{ifFBAutoSpaceFootnotes} changed: % default now means `StandardLayout', it 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.3a}{2008/10/10}{New option: OriginalTypewriter. Now % frenchb switches to \cs{noautospace@beforeFDP} when a tt-font is % in use. When OriginalTypewriter is set to true, frenchb behaves % as in pre-2.3 versions.} % % \changes{v2.4a}{2009/11/23}{New option SuppressWarning.} % % \changes{v2.6a}{2013/01/30}{New options ListOldLayout, % StandardItemizeEnv and StandardEnumerateEnv (CompactItemize is % deprecated).} % % We first define a collection of conditionals with their defaults % (true or false). % % \begin{macrocode} \newif\ifFBStandardLayout \FBStandardLayouttrue \newif\ifFBGlobalLayoutFrench \FBGlobalLayoutFrenchfalse \newif\ifFBReduceListSpacing \FBReduceListSpacingfalse \newif\ifFBListOldLayout \FBListOldLayouttrue \newif\ifFBCompactItemize \FBCompactItemizefalse \newif\ifFBStandardItemizeEnv \FBStandardItemizeEnvtrue \newif\ifFBStandardEnumerateEnv \FBStandardEnumerateEnvtrue \newif\ifFBStandardItemLabels \FBStandardItemLabelstrue \newif\ifFBStandardLists \FBStandardListstrue \newif\ifFBIndentFirst \FBIndentFirstfalse \newif\ifFBFrenchFootnotes \FBFrenchFootnotesfalse \newif\ifFBAutoSpaceFootnotes \FBAutoSpaceFootnotesfalse \newif\ifFBOriginalTypewriter \FBOriginalTypewriterfalse \newif\ifFBThinColonSpace \FBThinColonSpacefalse \newif\ifFBThinSpaceInFrenchNumbers \FBThinSpaceInFrenchNumbersfalse \newif\ifFBFrenchSuperscripts \FBFrenchSuperscriptstrue \newif\ifFBLowercaseSuperscripts \FBLowercaseSuperscriptstrue \newif\ifFBPartNameFull \FBPartNameFulltrue \newif\ifFBSuppressWarning \FBSuppressWarningfalse \newif\ifFBShowOptions \FBShowOptionsfalse % \end{macrocode} % % The defaults values of these flags have been set 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, % 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 |\frenchbsetup{}|. % % \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\"unter Milde.} % % \begin{macrocode} \def\FB@french{french} \AtEndOfPackage{% \ifx\bbl@main@language\FB@french \FBReduceListSpacingtrue \FBListOldLayoutfalse \FBCompactItemizetrue \FBStandardItemizeEnvfalse \FBStandardEnumerateEnvfalse \FBStandardItemLabelsfalse \FBIndentFirsttrue \FBFrenchFootnotestrue \FBAutoSpaceFootnotestrue \FBGlobalLayoutFrenchtrue \fi } % \end{macrocode} % % \begin{macro}{\frenchbsetup} % From version 2.0 on, all setup options are handled by \emph{one} % command |\frenchbsetup| using the keyval syntax. % Let's now define this command which reads and sets the options % to be processed later (at |\begin{document}|) by % |\FBprocess@options|. It can only be called in the preamble. % \begin{macrocode} \newcommand*{\frenchbsetup}[1]{% \setkeys{FB}{#1}% }% \@onlypreamble\frenchbsetup % \end{macrocode} % |frenchb| being an option of babel, it cannot load a package % (\file{keyval}) while \file{frenchb.ldf} is read, so we defer the % loading of \file{keyval} and the options setup at the end of % \babel's loading. % % |StandardLayout| resets the layout in French to the standard layout % defined par the \LaTeX{} class and packages loaded. It deals with % lists, indentation of first paragraphs of sections and footnotes. % Other keys, entered \emph{after} |StandardLayout| in % |\frenchbsetup|, can overrule some of the |StandardLayout| % settings. % % When French is the main language, |GlobalLayoutFrench| forces the % layout in French and (as far as possible) outside French to meet % the French typographic standards. % % \changes{v2.3d}{2009/03/16}{Warning added to \cs{GlobalLayoutFrench} % when French is not the main language.} % % \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\"unter Milde.} % % \begin{macrocode} \AtEndOfPackage{% \RequirePackage{keyval}% \define@key{FB}{StandardLayout}[true]% {\csname FBStandardLayout#1\endcsname \ifFBStandardLayout \FBReduceListSpacingfalse \FBStandardItemizeEnvtrue \FBStandardEnumerateEnvtrue \FBStandardItemLabelstrue \FBIndentFirstfalse \FBFrenchFootnotesfalse \FBAutoSpaceFootnotesfalse \FBGlobalLayoutFrenchfalse \else \FBReduceListSpacingtrue \FBStandardItemizeEnvfalse \FBStandardEnumerateEnvfalse \FBStandardItemLabelsfalse \FBIndentFirsttrue \FBFrenchFootnotestrue \FBAutoSpaceFootnotestrue \fi}% \define@key{FB}{GlobalLayoutFrench}[true]% {\csname FBGlobalLayoutFrench#1\endcsname \ifFBGlobalLayoutFrench \ifx\bbl@main@language\FB@french \FBReduceListSpacingtrue \FBStandardItemizeEnvfalse \FBStandardEnumerateEnvfalse \FBStandardItemLabelsfalse \FBIndentFirsttrue \FBFrenchFootnotestrue \FBAutoSpaceFootnotestrue \else \PackageWarning{frenchb.ldf}% {Option `GlobalLayoutFrench' skipped: \MessageBreak French is *not* babel's last option.\MessageBreak}% \fi \fi}% \define@key{FB}{ReduceListSpacing}[true]% {\csname FBReduceListSpacing#1\endcsname}% \define@key{FB}{ListOldLayout}[true]% {\csname FBListOldLayout#1\endcsname \ifFBListOldLayout \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 \FBReduceListSpacingfalse \FBCompactItemizefalse \FBStandardItemizeEnvtrue \FBStandardEnumerateEnvtrue \FBStandardItemLabelstrue \else \FBReduceListSpacingtrue \FBCompactItemizetrue \FBStandardItemizeEnvfalse \FBStandardEnumerateEnvfalse \FBStandardItemLabelsfalse \fi}% \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}% \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}{SuppressWarning}[true]% {\csname FBSuppressWarning#1\endcsname \ifFBSuppressWarning \renewcommand{\FBWarning}[2]{\relax}% \else \renewcommand{\FBWarning}[2]{% \PackageWarning{##1}{##2}}% \fi} \define@key{FB}{ShowOptions}[true]% {\csname FBShowOptions#1\endcsname}% % \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|. % The purpose of the following code is to map the French quote % characters to |\og\ignorespaces| and |{\fg}| respectively when % the current language is French, and to |\guillemotleft| and % |\guillemotright| otherwise (think of German quotes); thus correct % unbreakable 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). We first check whether XeTeX or % LuaTeX engines are used, if not the \file{inputenc} package has to % be loaded before the |\begin{document}| with the proper coding % option, so we check if |\DeclareInputText| is defined. % % \changes{v2.4c}{2010/05/23}{In \cs{ttfamilyFB}, also cancel % automatic spaces inside French guillemets coded as characters % (see \cs{frenchbsetup}).} % % \changes{v2.5a}{2010/08/21}{Test \cs{@ifundefined} leaves the % tested control sequence defined as \cs{relax} when TRUE. % Changed \cs{relax} to \cs{undefined} when testing % \cs{XeTeXrevision}, \cs{DeclareInputText}, \cs{uc@dclc}, % \cs{DeclareUnicodeCharacter}, \cs{mule@def} in \cs{og} and % \cs{fg}.} % % \changes{v2.5c}{2011/01/16}{The code meant for XeTeX also works for % LuaTeX, we just need to change the test.} % % \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@punctguilo} and \cs{FB@punctguilf}. Otherwise French % quotes behave as normal characters (their XeTeXcharclass is 0).} % % \begin{macrocode} \define@key{FB}{og}{% \newcommand*{\FB@@og}{% \iflanguage{french}% {\ifFBAutoSpaceGuill\FB@og\ignorespaces \else\guillemotleft \fi}% {\guillemotleft}}% \ifFBunicode % \end{macrocode} % LuaTeX or XeTeX in use, % \begin{macrocode} \ifFB@xetex@punct % \end{macrocode} % |\XeTeXinterchartokenstate| is defined, we just need to set % |\XeTeXcharclass| to |\FB@punctguilo| for the French opening % quote (see subsection~\ref{sec-punct}) and to switch % |\ifFBog@addspace| to false, otherwise commands |\og| and % |\fg| would produce a double space; the |\ifFBguillo@addspace| % flag is needed when switching from |\ttfamily| back to |\sf| or % |\rm|. % \begin{macrocode} \XeTeXcharclass"00AB = \FB@punctguilo \FBguillo@addspacetrue \FBog@addspacefalse \else % \end{macrocode} % then LuaTeX or an old XeTeX in use, the following trick % for defining the active quote character is borrowed from % \file{inputenc.dtx}. % \begin{macrocode} \catcode`#1=\active \bgroup \uccode`\~`#1% \uppercase{% \egroup \def~% }{\FB@@og}% \fi \else % \end{macrocode} % This is for conventional TeX engines: % \begin{macrocode} \AtBeginDocument {\@ifundefined{DeclareInputText}% {\PackageWarning{frenchb.ldf}% {Option `og' requires package inputenc.\MessageBreak}% \let\DeclareInputText\undefined }% {\@ifundefined{uc@dclc}% % \end{macrocode} % if |\uc@dclc| is undefined, utf8x is not loaded\dots % \begin{macrocode} {\@ifundefined{DeclareUnicodeCharacter}% % \end{macrocode} % if |\DeclareUnicodeCharacter| is undefined, utf8 is not loaded % either, we assume 8-bit character input encoding. % Package \file{MULEenc.sty} (from CJK) defines |\mule@def| to map % characters to control sequences. % \begin{macrocode} {\@tempcnta`#1\relax \@ifundefined{mule@def}% {\DeclareInputText{\the\@tempcnta}{\FB@@og}% \let\mule@def\undefined}% {\mule@def{11}{{\FB@@og}}}% \let\DeclareUnicodeCharacter\undefined }% % \end{macrocode} % utf8 loaded, use |\DeclareUnicodeCharacter|, % \begin{macrocode} {\DeclareUnicodeCharacter{00AB}{\FB@@og}}% \let\uc@dclc\undefined }% % \end{macrocode} % utf8x loaded, use |\uc@dclc|, % \begin{macrocode} {\uc@dclc{171}{default}{\FB@@og}}% }% }% \fi }% % \end{macrocode} % Same code for the closing quote. % \begin{macrocode} \define@key{FB}{fg}{% \newcommand*{\FB@@fg}{% \iflanguage{french}% {\ifFBAutoSpaceGuill\FB@fg \else\guillemotright \fi}% {\guillemotright}}% \ifFBunicode \ifFB@xetex@punct \XeTeXcharclass"00BB = \FB@punctguilf \FBguillf@addspacetrue \FBfg@addspacefalse \else \catcode`#1=\active \bgroup \uccode`\~`#1% \uppercase{% \egroup \def~% }{{\FB@@fg}}% \fi \else \AtBeginDocument {\@ifundefined{DeclareInputText}% {\PackageWarning{frenchb.ldf}% {Option `fg' requires package inputenc.\MessageBreak}% \let\DeclareInputText\undefined }% {\@ifundefined{uc@dclc}% {\@ifundefined{DeclareUnicodeCharacter}% {\@tempcnta`#1\relax \@ifundefined{mule@def}% {\DeclareInputText{\the\@tempcnta}{{\FB@@fg}}% \let\mule@def\undefined }% {\mule@def{27}{{\FB@@fg}}}% \let\DeclareUnicodeCharacter\undefined }% {\DeclareUnicodeCharacter{00BB}{{\FB@@fg}}% }% \let\uc@dclc\undefined }% {\uc@dclc{187}{default}{{\FB@@fg}}}% }% }% \fi }% } % \end{macrocode} % \end{macro} % % \begin{macro}{\FBprocess@options} % |\FBprocess@options| processes the options, it is called \emph{once} % at |\begin{document}|. % \begin{macrocode} \newcommand*{\FBprocess@options}{% % \end{macrocode} % Nothing has to be done here for |StandardLayout| and % |StandardLists| (the involved flags have already been set in % |\frenchbsetup{}| or before (at babel's EndOfPackage). % % The next three options deal with the layout of lists in French. % % |ReduceListSpacing| reduces the vertical spaces in lists % in French (done by changing |\list| to |\listFB|). % When |GlobalLayoutFrench| is true (the default), the same is % done outside French except for languages that force a different % setting. % \begin{macrocode} \ifFBReduceListSpacing \addto\extrasfrench{\let\list\listFB \let\endlist\endlistFB}% \addto\noextrasfrench{\ifFBGlobalLayoutFrench \let\list\listFB \let\endlist\endlistFB \else \let\list\listORI \let\endlist\endlistORI \fi}% \else \addto\extrasfrench{\let\list\listORI \let\endlist\endlistORI }% \addto\noextrasfrench{\let\list\listORI \let\endlist\endlistORI }% \fi % \end{macrocode} % % When |ListOldLayout=true|, set |StandardEnumerateEnv=true| % (before v.~2.6a |enumerate| was not redefined). % \begin{macrocode} \ifFBListOldLayout \FBStandardEnumerateEnvtrue \fi % \end{macrocode} % % \changes{v2.4b}{2010/04/30}{Warning and set flag CompactItemize=false % when the enumitem package is loaded (ensures compatibility).} % % \changes{v2.5k}{2012/12/27}{No warning if flag CompactItemize already % set to false by user.} % % \changes{v2.6a}{2013/01/30}{Flag CompactItemize deprecated. % Set flags StandardItemizeEnv and StandardEnumerateEnv to true % when the enumitem package is loaded.} % % \changes{v2.6a}{2013/01/30}{Ensure compatibility with paralist and % enumerate packages.} % % To ensure compatibility with the \file{enumitem} package, when % |enumitem| is loaded, force flags |StandardItemizeEnv| and % |StandardEnumerateEnv| to true. % \begin{macrocode} \@ifpackageloaded{enumitem}{% \ifFBStandardItemizeEnv \else \FBWarning{frenchb.ldf}% {Setting StandardItemizeEnv=true for\MessageBreak compatibility with enumitem package,\MessageBreak}% \FBStandardItemizeEnvtrue \fi \ifFBStandardEnumerateEnv \else \FBWarning{frenchb.ldf}% {Setting StandardEnumerateEnv=true for\MessageBreak compatibility with enumitem package,\MessageBreak}% \FBStandardEnumerateEnvtrue \fi}% {}% % \end{macrocode} % % To ensure compatibility with the \file{paralist} package, when % \file{paralist} is loaded; force flags |StandardItemizeEnv| and % |StandardEnumerateEnv| to true. % \begin{macrocode} \@ifpackageloaded{paralist}{% \ifFBStandardItemizeEnv \else \FBWarning{frenchb.ldf}% {Setting StandardItemizeEnv=true for\MessageBreak compatibility with paralist package,\MessageBreak}% \FBStandardItemizeEnvtrue \fi \ifFBStandardEnumerateEnv \else \FBWarning{frenchb.ldf}% {Setting StandardEnumerateEnv=true for\MessageBreak compatibility with paralist package,\MessageBreak}% \FBStandardEnumerateEnvtrue \fi}% {}% % \end{macrocode} % % To ensure compatibility with the \file{enumerate} package, when % |enumerate| is loaded, force flag |StandardEnumerateEnv| to true. % \begin{macrocode} \@ifpackageloaded{enumerate}{% \ifFBStandardEnumerateEnv \else \FBWarning{frenchb.ldf}% {Setting StandardEnumerateEnv=true for\MessageBreak compatibility with enumerate package,\MessageBreak}% \FBStandardEnumerateEnvtrue \fi}% {}% % \end{macrocode} % % Let's now process flags |StandardItemizeEnv| and % |StandardEnumerateEnv|. Mind that % |StandardEnumerateEnv|'s value decides for both environments % |enumerate| and |description|). % \begin{macrocode} \ifFBStandardItemizeEnv \addto\extrasfrench{\let\itemize\itemizeORI}% \addto\noextrasfrench{\let\itemize\itemizeORI}% \else \addto\extrasfrench{\let\itemize\itemizeFB}% \addto\noextrasfrench{\ifFBGlobalLayoutFrench \let\itemize\itemizeFB \else \let\itemize\itemizeORI \fi}% \fi \ifFBStandardEnumerateEnv \addto\extrasfrench{\let\enumerate\enumerateORI \let\description\descriptionORI}% \addto\noextrasfrench{\let\enumerate\enumerateORI \let\description\descriptionORI}% \else \addto\extrasfrench{\let\enumerate\enumerateFB \let\description\descriptionFB}% \addto\noextrasfrench{\ifFBGlobalLayoutFrench \let\enumerate\enumerateFB \let\description\descriptionFB \else \let\enumerate\enumerateORI \let\description\descriptionORI \fi}% \fi % \end{macrocode} % % |StandardItemLabels| resets labelitems in French to their % standard values set by the \LaTeX{} class and packages loaded. % When |GlobalLayoutFrench| is true, labelitems are identical % whether the current language is French or not. % \begin{macrocode} \ifFBStandardItemLabels \addto\extrasfrench{\bbl@nonfrenchlabelitems}% \addto\noextrasfrench{\bbl@nonfrenchlabelitems}% \else \addto\extrasfrench{\bbl@frenchlabelitems}% \addto\noextrasfrench{\ifFBGlobalLayoutFrench \bbl@frenchlabelitems \else \bbl@nonfrenchlabelitems \fi}% \fi % \end{macrocode} % % |IndentFirst| forces the first paragraphs of sections to be % indented just like the other ones in French. % When |GlobalLayoutFrench| is true, the same is done outside French % except for languages that force a different setting. % |\bbl@nonfrenchindent| has been designed to be smart with other % languages (like Spanish) who also indent every first paragraphs of % sections (see section~\ref{sec-indent}). % \begin{macrocode} \ifFBIndentFirst \addto\extrasfrench{\bbl@frenchindent}% \addto\noextrasfrench{\ifFBGlobalLayoutFrench \bbl@frenchindent \else \bbl@nonfrenchindent \fi}% \else \addto\extrasfrench{\bbl@nonfrenchindent}% \addto\noextrasfrench{\bbl@nonfrenchindent}% \fi % \end{macrocode} % % The layout of footnotes is handled at the |\begin{document}| % depending on the values of flags |FrenchFootnotes| % and |AutoSpaceFootnotes| (see section~\ref{sec-footnotes}), % nothing has to be done here for footnotes. % % |AutoSpacePunctuation| adds an unbreakable 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 |OriginalTypewriter| is set to |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\ttfamily\ttfamilyFB \let\rmfamily\rmfamilyFB \let\sffamily\sffamilyFB \fi % \end{macrocode} % % |ThinColonSpace| changes the normal unbreakable space typeset in % French before `:' to a thin space. % \begin{macrocode} \ifFBThinColonSpace\renewcommand*{\FBcolonspace}{\FBthinspace}\fi % \end{macrocode} % % When |true|, |ThinSpaceInFrenchNumbers| redefines |numprint.sty|'s % command |\npstylefrench| to set |\npthousandsep| to |\,| % (thinspace) instead of |~| (default) . This option has no effect % if package \file{numprint.sty} is not loaded with `|autolanguage|'. % As old versions of \file{numprint.sty} did not define % |\npstylefrench|, we have to provide this command. % \begin{macrocode} \@ifpackageloaded{numprint}% {\ifnprt@autolanguage \providecommand*{\npstylefrench}{}% \ifFBThinSpaceInFrenchNumbers \renewcommand*\npstylefrench{% \npthousandsep{\,}% \npdecimalsign{,}% \npproductsign{\cdot}% \npunitseparator{\,}% \npdegreeseparator{}% \nppercentseparator{\nprt@unitsep}% }% \else \renewcommand*\npstylefrench{% \npthousandsep{~}% \npdecimalsign{,}% \npproductsign{\cdot}% \npunitseparator{\,}% \npdegreeseparator{}% \nppercentseparator{\nprt@unitsep}% }% \fi \npaddtolanguage{french}{french}% \fi}{}% % \end{macrocode} % % |FrenchSuperscripts|: if |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} % % |LowercaseSuperscripts|: if |true| let |\FB@lc| be |\lowercase|, % else |\FB@lc| is redefined to do nothing. % \begin{macrocode} \ifFBLowercaseSuperscripts \else \renewcommand*{\FB@lc}[1]{##1}% \fi % \end{macrocode} % % |PartNameFull|: if |false|, redefine |\partname|. % \begin{macrocode} \ifFBPartNameFull \else\addto\captionsfrench{\def\partname{Partie}}\fi % \end{macrocode} % % |ShowOptions|: if |true|, print the list of all options to the % \file{.log} file. % \begin{macrocode} \ifFBShowOptions \GenericWarning{* }{% * **** List of possible options for frenchb ****\MessageBreak [Default values between brackets when frenchb is loaded *LAST*]% \MessageBreak ShowOptions=true [false]\MessageBreak StandardLayout=true [false]\MessageBreak GlobalLayoutFrench=false [true]\MessageBreak StandardLists=true [false]\MessageBreak IndentFirst=false [true]\MessageBreak ReduceListSpacing=false [true]\MessageBreak ListOldLayout=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 FrenchFootnotes=false [true]\MessageBreak AutoSpaceFootnotes=false [true]\MessageBreak AutoSpacePunctuation=false [true]\MessageBreak OriginalTypewriter=true [false]\MessageBreak ThinColonSpace=true [false]\MessageBreak ThinSpaceInFrenchNumbers=true [false]\MessageBreak FrenchSuperscripts=false [true]\MessageBreak LowercaseSuperscripts=false [true]\MessageBreak PartNameFull=false [true]\MessageBreak SuppressWarning=true [false]\MessageBreak og= , fg= \MessageBreak ********************************************* \MessageBreak\protect\frenchbsetup{ShowOptions}} \fi } % \end{macrocode} % \end{macro} % % \changes{v2.0}{2006/12/15}{AtBeginDocument, save again the % definitions of the `list' and `itemize' environments and the % values of labelitems. As of frenchb v.~1.6, `ORI' values were % set when reading frenchb.ldf, later changes were ignored.} % % \changes{v2.0}{2006/12/06}{Added warning for OT1 encoding.} % % \changes{v2.1b}{2008/04/07}{Disable some commands in bookmarks.} % % \changes{v2.5a}{2010/08/21}{Test \cs{@ifundefined} leaves the % tested control sequence defined as \cs{relax} when TRUE. % Changed \cs{relax} to \cs{undefined} when testing % \cs{pdfstringdefDisableCommands} AtBeginDocument.} % % \changes{v2.5e}{2011/04/03}{The redefinition of % \cs{pdfstringdefDisableCommands} from \cs{relax} to \cs{undefined} % was misplaced. Reported by S\'ebastien Gouezel.} % % \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\'ebastien Gouezel.} % % At |\begin{document}| we save again the value of % |\if@afterindent|, definitions of the list environments and the % values of labelitems so that all changes made in the preamble are % taken into account in languages other than French and in French % with the StandardLayout option. % We also have to provide an |\xspace| command in case the % \file{xspace.sty} package is not loaded. % % \begin{macrocode} \AtBeginDocument{% \ifx\@afterindentfalse\@afterindenttrue \let\@aifORI\@afterindenttrue \else \let\@aifORI\@afterindentfalse \fi \let\listORI\list \let\endlistORI\endlist \let\endlistFB\endlist \let\itemizeORI\itemize \let\enditemizeORI\endlist \let\enditemizeFB\endlist \let\enumerateORI\enumerate \let\endenumerateORI\endlist \let\endenumerateFB\endlist \let\descriptionORI\description \let\enddescriptionORI\endlist \let\enddescriptionFB\endlist \let\@ltiORI\labelitemi \let\@ltiiORI\labelitemii \let\@ltiiiORI\labelitemiii \let\@ltivORI\labelitemiv \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.} % % Let's redefine some commands in \file{hyperref}'s bookmarks. % \begin{macrocode} \@ifundefined{pdfstringdefDisableCommands}% {\let\pdfstringdefDisableCommands\undefined}% {\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\at{@}% \def\circonflexe{\string^}% \def\tild{\string~}% \let\bsc\textsc }% }% % \end{macrocode} % % It is time to process the options set with |\frenchboptions{}|. % Then we need to execute either |\extrasfrench| and % |\captionsfrench| or |\noextrasfrench| according to the current % language at the |\begin{document}| (these three commands have been % updated by |\FBprocess@options|). \emph{But}, when French is the % main language, |\extrasfrench| is executed \emph{again} now % (French has been switched on `AtBeginDocument' some time before). % This is harmless, except for |\bbl@frenchspacing| which will % redefine |\bbl@nonfrenchspacing| to |\relax|, this will be % wrong if the user switches to English. % When French is \emph{not} the main language, |\noextrasfrench| % executes |\bbl@nonfrenchspacing| (=|\nonfrenchspacing|), thus % eventually overwriting a |\frenchspacing| command issued by the % main language (German, Spanish, etc.). % So we have to define |\bbl@nonfrenchspacing| as |\relax| here % and restore it's meaning afterwards. % % It is also the right time, when a koma-script class is in use, to % save the value of |\captionformat| in |\CaptionSeparatorORI}| and % to add the redefinitions of |\captionformat| to % |\(no)extrasfrench|. % % \changes{v2.5a}{2010/08/15}{Define \cs{bbl@nonfrenchspacing} locally % as \cs{relax}, otherwise the \cs{bbl@frenchspacing} command % included in germanb.ldf is overwritten here by % \cs{noextrasfrench}. Bug pointed out by Ulrike Fischer.} % % \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\"unter Milde.} % % \changes{v2.6c}{2013/05/18}{With koma-script classes, save the value % of \cs{captionformat} in \cs{CaptionSeparatorORI} NOW, then add % the redefinitions of \cs{captionformat} to \cs{(no)extrasfrench}.} % % \begin{macrocode} \FBprocess@options \let\bbl@nonfrenchspacingORI\bbl@nonfrenchspacing \let\bbl@nonfrenchspacing\relax \@ifundefined{captionformat}% {\let\captionformat\undefined}% {\let\CaptionSeparatorORI\captionformat \addto\extrasfrench{% \renewcommand*{\captionformat}{\CaptionSeparator}}% \addto\noextrasfrench{% \renewcommand*{\captionformat}{\CaptionSeparatorORI}}% }% \ifx\bbl@main@language\FB@french \extrasfrench\captionsfrench \else \noextrasfrench \fi \let\bbl@nonfrenchspacing\bbl@nonfrenchspacingORI % \end{macrocode} % Some warnings are issued when output font encodings are not % properly set. With XeLaTeX, \file{fontspec.sty} and % \file{xunicode.sty} should be loaded; with (pdf)\LaTeX, a warning % is issued when OT1 encoding is in use at the |\begin{document}|. % Mind that |\encodingdefault| is defined as `long', defining % |\FBOTone| with |\newcommand*| would fail! % \begin{macrocode} \ifFBXeTeX \@ifundefined{DeclareUTFcharacter}% {\PackageWarning{frenchb.ldf}% {Add \protect\usepackage{xltxtra} to the\MessageBreak preamble of your document,}% \let\DeclareUTFcharacter\undefined}% {}% \else \begingroup \newcommand{\FBOTone}{OT1}% \ifx\encodingdefault\FBOTone \PackageWarning{frenchb.ldf}% {OT1 encoding should not be used for French. \MessageBreak Add \protect\usepackage[T1]{fontenc} to the preamble\MessageBreak of your document,}% \fi \endgroup \fi } % \end{macrocode} % % \subsection{Clean up and exit} % % Load |frenchb.cfg| (kept just for backward compatibility). % \begin{macrocode} \loadlocalcfg{frenchb} % \end{macrocode} % Final cleaning. % The macro |\ldf@quit| takes care for setting the main language % to be switched on at |\begin{document}| and resetting the % category code of \texttt{@} to its original value. % The config file searched for has to be |frenchb.cfg|, and % |\CurrentOption| has been set to `french', so % |\ldf@finish\CurrentOption| cannot be used: we first load % |frenchb.cfg|, then call |\ldf@quit\CurrentOption|. % \begin{macrocode} \FBclean@on@exit \ldf@quit\CurrentOption % \end{macrocode} % \iffalse % %<*dtx> % \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 % % \fi % % \Finale % \clearpage\PrintChanges \endinput