summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/fmtcount
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/fmtcount
Initial commit
Diffstat (limited to 'macros/latex/contrib/fmtcount')
-rw-r--r--macros/latex/contrib/fmtcount/CHANGES163
-rw-r--r--macros/latex/contrib/fmtcount/README53
-rw-r--r--macros/latex/contrib/fmtcount/fc-lang.tex356
-rw-r--r--macros/latex/contrib/fmtcount/fc-typeout-languages.tex20
-rw-r--r--macros/latex/contrib/fmtcount/fmtcount.dtx9516
-rw-r--r--macros/latex/contrib/fmtcount/fmtcount.ins69
-rw-r--r--macros/latex/contrib/fmtcount/fmtcount.pdfbin0 -> 553518 bytes
-rw-r--r--macros/latex/contrib/fmtcount/fmtcount.perl2672
8 files changed, 12849 insertions, 0 deletions
diff --git a/macros/latex/contrib/fmtcount/CHANGES b/macros/latex/contrib/fmtcount/CHANGES
new file mode 100644
index 0000000000..f49307cceb
--- /dev/null
+++ b/macros/latex/contrib/fmtcount/CHANGES
@@ -0,0 +1,163 @@
+fmtcount package versions:
+
+Version 3.05:
+
+* Fix issue #28 (works now with lualatex: actually from 3.05 fmtcount
+ does not test any longer for what compiler is used but only for what
+ multilingual package --- such as polyglossia or babel --- are used).
+
+* Fixe pull request #29 (Fix European Portuguese cardinal
+ numbers). Portuguese formatting prior to 3.05 is renamed brazilian,
+ and the portuguese is fixed to reflect European Portuguese
+ spelling.
+
+Version 3.04:
+
+* Fix issue #27 (New definition of `\Numberstring` is now causing
+ problems with glossaries.sty)
+
+* Code optimization with \octal, \hexdecimal, \aaalph, \abalph and
+ upercase counterparts when applicable.
+
+* Declare \ordinalnum with etoolbox \newrobustcmd*, rather than LaTeX
+ kernel \DeclareRobustCommand* --- this is preferable for compilation
+ with TeX4ht.
+
+* Test bench upgrade.
+
+Version 3.03:
+
+* Fix issue #25 (docstripable doc spilled into the portugese code)
+
+Version 3.02:
+
+* Fix issue #24 (Capitalization in French).
+
+* Fix issue #11 (Make lang definition .def files loadable from within
+ a group).
+
+* Fix issue #18 (no impact for end user, code optimization for
+ \storeordinal definition).
+
+* Make robust \FCordinal, \storeordinal, \ordinalnum, and
+ \storeordinalnum
+
+Version 3.01:
+
+ * Make fmtord option language dependant
+
+ * Support language as a documentclass option
+
+ * Some improvements in code documentation and testing
+
+ * Use xkeyval instead of keyval for option processing, so as to avoid
+ trouble with option de-bracketting
+
+ * Solve issue #15: protect \' for accent in French ordinal
+
+ * Make 1er/1re, 2e the default for French abbreviated ordinals, and
+ make abbreviated ordinals the default --- as opposed to
+ non-abbreviated like 2\`eme.
+
+ * Solve issue #16: (use of superscript font for ordinals when
+ available and xelatex is used)
+
+Version 3.00:
+
+Version 2.04:
+
+ * Renamed \@modulo to \@FCmodulo to avoid conflict with other
+ packages.
+
+ * Fixed "eins" bug in fc-german.def
+
+ * Fixed bug in \@@unitstringportuges
+
+ * Added fc-portuguese.def
+
+Version 2.03:
+
+ * Renamed \@fc@loadifbabelldf to \@fc@loadifbabelorpolyglossialdf
+ and added check for polyglossia language.
+
+ * Fixed multilingual issues where provided languages weren't
+ detected.
+
+ * Removed spurious spaces.
+
+Version 2.02:
+
+ * Improved check for multilingual options
+
+ * Fixed \FCloadlang so that catcode for @ set to `letter' before
+ reading .def file.
+
+ * Moved loading of fcprefix from fc-french.def to fmtcount.sty
+
+Version 2.01:
+
+ * Fixed copyright text in fmtcount.ins
+
+Version 2.0:
+
+ * fcprefix.sty, fcnumparser.sty added by Vincent Belaïche
+
+ * fmtcount.sty now loads etoolbox
+
+ * Minor corrections to fc-spanish.def (corrections provided by
+ Fernando Maldonado Millán)
+
+ * Minor corrections to fc-german.def (corrections provided by
+ Dominik Waßenhoven)
+
+ * Fixed bug in OrdinalstringMgerman etc
+
+Version 1.31:
+
+ * fixed unwanted space in \decimalnum
+
+ * fixed bug that ignores spaces after commands like
+ \ordinalnum.
+
+ * added Italian support (translations provided by Edoardo Pasca)
+
+Version 1.3:
+
+ * no longer loads xspace package (was causing extraneous
+ spaces when the optional argument to \ordinalstring etc
+ was omitted.)
+ * Made some long commands short.
+ * Changes licence text in fmtcount.ins to conform with LPPL.
+
+Version 1.2: fmtcount now loads xspace package, and uses \xspace
+after \numberstring etc.
+
+Version 1.1: Added German support. Added check for USenglish
+and UKenglish babel settings.
+
+Version 1.09: Added upper case variants \ORDINALstring etc
+(\MakeUppercase{\ordinalstring{<counter>}} doesn't work because
+of the way \MakeUppercase expands its argument).
+
+Added commands to store textual representations \storeordinalstring etc
+
+Version 1.08: fixed Portugues spelling mistakes (tr\`es -> tr\^es
+centa -> cento)
+
+Version 1.07: fixed bug that causes fc-english.def to be loaded twice
+
+Version 1.06: fixed language-related bug
+
+Version 1.05: fixed bug in \padzeroes
+
+Version 1.04: provided \FCordinal to avoid clashes with the memoir class.
+
+Version 1.03: Minor bug fixes (concerning fmtcount.cfg and the effect of \padzeroes).
+
+Version 1.02: Added multilingual support
+
+Version 1.01: Added support for LaTeX2HTML
+
+Version 1.0: separated counter related code from
+datetime.
+
diff --git a/macros/latex/contrib/fmtcount/README b/macros/latex/contrib/fmtcount/README
new file mode 100644
index 0000000000..c41070fe18
--- /dev/null
+++ b/macros/latex/contrib/fmtcount/README
@@ -0,0 +1,53 @@
+LaTeX Package : fmtcount v3.05
+
+Last Modified : 2017-12-26
+
+Author : Nicola Talbot and Vincent Belaïche
+
+Files : fmtcount.dtx - documented source file
+ fmtcount.ins - installation script
+ fmtcount.perl - latex2html style file
+ fc-samp.tex \
+ fc-lang.tex - sample files
+ fc-frlargenum.tex /
+
+The package fmtcount.sty provides commands
+that display the value of a LaTeX counter in a variety
+of formats (ordinal, text, hexadecimal, decimal,
+octal, binary etc). This package was originally provided
+with the datetime package, but is now distributed separately.
+
+See the documentation for more details.
+
+To extract the code from the documented source file do:
+
+latex fmtcount.ins
+
+This will create the files: fmtcount.sty (the LaTeX package),
+and fc-*.def (the language definition files used by
+fmtcount.sty).
+
+Move the .sty and .def files to somewhere LaTeX will find it
+(e.g. texmf/tex/latex/fmtcount/) and remember to update the TeX
+database.
+
+Copy the fmtcount.perl file to somewhere where LaTeX2HTML will
+find it (e.g. latex2html/styles/).
+
+To extract the documentation do:
+
+latex fmtcount.dtx
+makeindex -s gglo.ist -t fmtcount.glg -o fmtcount.gls fmtcount.glo
+latex fmtcount.dtx
+latex fmtcount.dtx
+
+Place the resulting file (fmtcount.dvi) into the documentation
+directory (e.g. texmf/doc/latex/fmtcount/).
+
+Read the file CHANGES for version changes.
+
+This material is subject to the LaTeX Project Public License.
+See http://mirror.ctan.org/help/Cataloague/licenses.lppl.html for
+the details of that license.
+
+http://www.dickimaw-books.com/
diff --git a/macros/latex/contrib/fmtcount/fc-lang.tex b/macros/latex/contrib/fmtcount/fc-lang.tex
new file mode 100644
index 0000000000..b2a8907ffb
--- /dev/null
+++ b/macros/latex/contrib/fmtcount/fc-lang.tex
@@ -0,0 +1,356 @@
+ % This file is public domain
+
+ % This is an interactive script. Run it through \LaTeX
+ % and enter appropriate responses. (This won't work with
+ % LaTeX2HTML)
+
+\documentclass[a4paper]{article}
+
+\usepackage[utf8]{inputenc}
+\usepackage[T1]{fontenc}
+
+\usepackage{etoolbox}
+
+\usepackage[french,english,spanish,portuges,ngerman,italian]{babel}
+\usepackage{fmtcount}
+
+\newcounter{startval}
+\newcounter{endval}
+\newcounter{stepsize}
+\newcounter{N}
+\newcount\myctr
+\newcount\langid
+
+\newcommand*{\deflangopt}[2][\relax]{%
+ \csdef{setlang#2}{\langid=#2#1}%
+}
+\newcommand*{\uselangopt}[1]{\csuse{setlang#1}}
+\deflangopt{1}
+\deflangopt{2}
+\deflangopt{3}
+\deflangopt[\fmtcountsetoptions{french}]{4}
+\deflangopt[\fmtcountsetoptions{french=swiss}]{5}
+\deflangopt[\fmtcountsetoptions{french=belgian}]{6}
+\deflangopt{7}
+\deflangopt{8}
+
+\newcommand*{\defformat}[1]{%
+ \csdef{setformat#1}{\numformat=#1\relax}%
+}
+\newcommand*{\useformat}[1]{\csuse{setformat#1}}
+
+\newcommand*{\setformat}{\numformat=1\relax}
+
+\defformat{1}
+\defformat{2}
+\defformat{3}
+\defformat{4}
+\defformat{5}
+\defformat{6}
+
+\newcommand*{\defgender}[2]{%
+ \csdef{setgender#1}{\myctr=#2\relax}%
+}
+\newcommand*{\usegender}[1]{\csuse{setgender#1}}
+
+\defgender{}{1}
+\defgender{m}{1}
+\defgender{f}{2}
+\defgender{n}{3}
+
+\begin{document}
+
+\section{Displaying the value of a counter}
+
+\typeout{This is an interactive script, testing the fmtcount package.}
+
+\langid=-1
+
+\loop
+ \typeout{Which language?^^J}
+ \typeout{[1] English}
+ \typeout{[2] Portuguese}
+ \typeout{[3] Spanish}
+ \typeout{[4] French}
+ \typeout{[5] French (Swiss)}
+ \typeout{[6] French (Belgium)}
+ \typeout{[7] German}
+ \typeout{[8] Italian}
+
+ \typein[\response]{}
+
+ \ifcsundef{setlang\response}%
+ {%
+ \typeout{Invalid response '\response', please select a number from 1 to 8}%
+ \langid=-1\relax
+ }%
+ {\uselangopt{\response}}
+
+\ifnum\langid=-1
+\repeat
+
+\ifcase\langid
+\or \selectlanguage{english}
+Current language: English.
+\or \selectlanguage{portuges}
+Current language: Portuguese.
+\or \selectlanguage{spanish}
+Current language: Spanish.
+\or \selectlanguage{french}
+Current language: French.
+\or \selectlanguage{french}
+Current language: French (Swiss).
+\or \selectlanguage{french}
+Current language: French (Belgium).
+\or \selectlanguage{ngerman}
+Current language: German.
+\or \selectlanguage{italian}
+Current language: Italian.
+\fi
+
+\def\startval{-1}
+
+\loop
+ \typein[\startval]{Start value? (Integer from 0 to 99999) [Default 1]}
+ \ifdefempty{\startval}{\def\startval{1}}{}
+ \ifnum\startval<0\def\startval{-1}\fi
+ \ifnum\startval>99999\def\startval{-1}\fi
+
+\ifnum\startval=-1
+\repeat
+
+\def\endval{-1}
+
+\loop
+ \typein[\endval]{End value? (Integer from 0 to 99999) [Default 1000]}
+ \ifdefempty{\endval}{\def\endval{1000}}{}
+ \ifnum\endval<0\def\endval{-1}\fi
+ \ifnum\endval>99999\def\endval{-1}\fi
+\ifnum\endval=-1
+\repeat
+
+\def\stepsize{0}
+
+\loop
+ \typein[\stepsize]{Step size? (Non zero integer) [Default 1]}
+ \ifdefempty{\stepsize}{\def\stepsize{1}}{}
+\ifnum\stepsize=0
+\repeat
+
+\typeout{From {\startval} to {\endval} step {\stepsize}}
+
+\ifnum\startval<\endval\relax
+ \ifnum\stepsize<0\relax
+ \PackageError{fc-lang}{Infinite loop not permitted!}{}
+ \def\endval{\startval}
+ \fi
+\fi
+
+\ifnum\startval>\endval\relax
+ \ifnum\stepsize>0\relax
+ \PackageError{fc-lang}{Infinite loop not permitted!}{}
+ \def\endval{\startval}
+ \fi
+\fi
+
+\newcount\numformat
+
+\numformat=-1
+\loop
+ \typeout{Which format?^^J}
+ \typeout{[1] ordinalstring}
+ \typeout{[2] Ordinalstring}
+ \typeout{[3] ORDINALstring}
+ \typeout{[4] numberstring}
+ \typeout{[5] Numberstring}
+ \typeout{[6] NUMBERstring}
+
+ \typein[\response]{Default: 1}
+
+ \ifcsundef{setformat\response}%
+ {%
+ \numformat=-1\relax
+ \typeout{Invalid response '\response', please select a number from 1 to 6}%
+ }%
+ {%
+ \useformat\response
+ }
+
+\ifnum\numformat=-1
+\repeat
+
+\ifcase\numformat
+\or\def\stringtype{ordinalstring}
+\or\def\stringtype{Ordinalstring}
+\or\def\stringtype{ORDINALstring}
+\or\def\stringtype{numberstring}
+\or\def\stringtype{Numberstring}
+\or\def\stringtype{NUMBERstring}
+\fi
+
+\ifnum\langid>3\relax
+ \ifnum\langid<7\relax
+ \myctr=-1\relax
+ \loop
+ \typeout{Ordinal type?^^J}
+ \typeout{[1] eme}
+ \typeout{[2] e}
+ \typein[\response]{Default: 1}
+ \ifdefempty{\response}%
+ {%
+ \def\response{1}% default
+ \myctr=1\relax
+ }%
+ {%
+ \ifdefstring{\response}{1}%
+ {%
+ \fmtcountsetoptions{abbrv=false}\myctr=1\relax
+ }%
+ {%
+ \ifdefstring{\response}{2}%
+ {%
+ \fmtcountsetoptions{abbrv}\myctr=2\relax
+ }%
+ {%
+ \myctr=-1\relax
+ \typeout{Invalid response '\response', please select a
+number from 1 to 2}%
+ }%
+ }%
+ }%
+ \ifnum\myctr=-1
+ \repeat
+ \fi
+\fi
+
+\myctr=-1
+\loop
+ \typeout{Ordinal format?^^J}
+ \typeout{[1] raised}
+ \typeout{[2] level}
+ \typein[\response]{Default: 1}
+ \ifdefempty{\response}{\def\response{1}}{}%
+
+ \ifdefstring{\response}{1}
+ {%
+ \fmtcountsetoptions{fmtord=raise}\myctr=1\relax
+ }%
+ {%
+ \ifdefstring{\response}{2}
+ {%
+ \fmtcountsetoptions{fmtord=level}\myctr=2\relax
+ }%
+ {%
+ \myctr=-1\relax
+ \typeout{Invalid response '\response', please select a
+ number from 1 to 2}%
+ }%
+ }
+
+\ifnum\myctr=-1
+\repeat
+
+\ifnum\langid=1\relax
+ \myctr=1\relax
+\else
+
+ \ifboolexpr
+ {
+ test {\ifnumequal{\langid}{7}}
+ and
+ test {\ifnumgreater{\numformat}{3}}
+ }%
+ {%
+ \loop
+ \ifnum\langid=7\relax
+ \typein[\response]{Gender? (m, f or n) [Default: m]}
+ \ifcsundef{setgender\response}%
+ {%
+ \typeout{Invalid response '\response', please select a
+ number from 1 to 3}%
+ \myctr=-1\relax
+ }%
+ {\usegender\response}
+ \else
+ \typein[\response]{Gender? (m or f) [Default: m]}
+ \ifcsundef{setgender\response}%
+ {%
+ \typeout{Invalid response '\response', please select a
+ number from 1 to 2}%
+ \myctr=-1\relax
+ }%
+ {%
+ \ifdefstring{\response}{3}
+ {%
+ \typeout{Invalid response '\response', please select a
+ number from 1 to 2}%
+ \myctr=-1\relax
+ }
+ {%
+ \usegender\response
+ }
+ }
+ \fi
+ \ifnum\myctr=-1
+ \repeat
+ }%
+ {%
+ }
+
+\fi
+
+\ifcase\myctr
+\or \def\gender{m}
+\or \def\gender{f}
+\or \def\gender{n}
+\fi
+
+\ifnum\langid=7
+\ifnum\startval>99
+\myctr=-1
+\loop
+\typeout{einhundert/eintausend or hundert/tausend?^^J}
+\typeout{[1] einhundert/eintausend}
+\typeout{[2] hundert/tausend}
+\typein[\response]{Default: 1}
+\ifthenelse{\equal{\response}{}}{\def\response{1}}{}%default
+\ifthenelse{\equal{\response}{1}}{%
+\renewcommand{\einhundert}{einhundert}
+\renewcommand{\eintausend}{eintausend}
+\myctr=1}{%
+\ifthenelse{\equal{\response}{2}}{%
+\renewcommand{\einhundert}{hundert}
+\renewcommand{\eintausend}{tausend}
+\myctr=2}{%
+\myctr=-1}}
+\ifnum\myctr=-1
+\repeat
+\fi
+\fi
+
+\setcounter{startval}{\startval}
+\setcounter{endval}{\endval}
+\setcounter{stepsize}{\stepsize}
+
+\stepcounter{endval}
+\begin{ttfamily}
+\noindent
+\makebox[0.25in][c]{N}
+\makebox[0.5in][c]{ordinal}\quad
+\stringtype
+\par
+\myctr=\value{startval}
+\loop
+\noindent
+\setcounter{N}{\myctr}
+\makebox[0.25in][r]{\arabic{N}}
+\makebox[0.5in][r]{\ordinal{N}[\gender]}\quad
+\csname\stringtype\endcsname{N}[\gender].
+\par
+\advance\myctr by \value{stepsize}\relax
+\ifnum\myctr<\value{endval}
+\repeat
+
+\end{ttfamily}
+
+\end{document}
diff --git a/macros/latex/contrib/fmtcount/fc-typeout-languages.tex b/macros/latex/contrib/fmtcount/fc-typeout-languages.tex
new file mode 100644
index 0000000000..1759593d13
--- /dev/null
+++ b/macros/latex/contrib/fmtcount/fc-typeout-languages.tex
@@ -0,0 +1,20 @@
+\documentclass{article}
+\usepackage{fmtcount}
+\usepackage{lipsum}
+\newwrite\styfiles
+\openout\styfiles=fc-styfiles.txt
+\begin{document}
+\immediate\write\styfiles{STYFILES=\string\^^J}
+\makeatletter
+{%
+ \def\@tempb#1{%
+ \immediate\write\styfiles{fc-#1.def\string\^^J}%
+ }%
+ \fc@iterate@on@languages\@tempb
+}
+\makeatother
+\immediate\write\styfiles{fmtcount.sty fcnumparser.sty fcprefix.sty}
+\closeout\styfiles
+\lipsum
+\clearpage
+\end{document}
diff --git a/macros/latex/contrib/fmtcount/fmtcount.dtx b/macros/latex/contrib/fmtcount/fmtcount.dtx
new file mode 100644
index 0000000000..20d2f75195
--- /dev/null
+++ b/macros/latex/contrib/fmtcount/fmtcount.dtx
@@ -0,0 +1,9516 @@
+%\iffalse
+% fmtcount.dtx generated using makedtx version 1.2 (c) Nicola Talbot
+% Command line args:
+% -author "Nicola Talbot and Vincent Belaïche"
+% -doc "fmtcount-manual.tex"
+% -src "(.+)\.(sty|def)$=>\1.\2"
+% fmtcount
+% Created on 2017/12/26 22:09
+%\fi
+%\iffalse
+%<*package>
+%% \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 \~}
+%</package>
+%\fi
+% \iffalse
+% Doc-Source file to use with LaTeX2e
+% Copyright (C) 2017 Nicola Talbot and Vincent Belaïche, all rights reserved.
+% \fi
+% \iffalse
+%<*driver>
+\documentclass{nlctdoc}
+
+\usepackage{color}
+\usepackage[utf8]{inputenc}
+\usepackage[french,english]{babel}
+\usepackage{amsmath,amssymb}
+\usepackage{tabularx,supertabular,multirow}
+\usepackage[T1]{fontenc}
+\usepackage{cmap}
+\usepackage{fmtcount}% needed for \fc@iterate@on@languages
+\newcommand*\uref[1]{\href{#1}{#1}}
+\DeclareMathOperator{\intv}{..}
+\newcommand*\interface{}
+\makeatletter
+\newcommand*{\LanguagePackageOptionList}{{%
+ \def\@tempf##1{\texttt{##1}}% how to format each option
+ % we don't use \cs{newtoks} because anyway this is within a group
+ \toks0{}% token in which we accumulate result
+ % \toks1 token in which we place next dialect
+ \count0 0 % to distinguish first and second iteration, we need to do tricks because we want to insert `and'
+ % before the last item in the list.
+ \def\@tempb##1{%
+ \ifnum\count0=0 %
+ \else\ifnum\count0=1 %
+ \toks0\toks1 %
+ \else
+ \edef\@tempa{\the\toks0, \the\toks1}%
+ \toks0\expandafter{\@tempa}%
+ \fi\fi
+ \toks1\expandafter{\@tempf{##1}}%
+ \advance\count0 by 1 %
+ }%
+ \fc@iterate@on@languages\@tempb
+ \edef\@tempa{\the\toks0, and \the\toks1}%
+ \expandafter
+}\@tempa}
+\makeatother
+
+\usepackage[colorlinks,
+ bookmarks,
+ bookmarksopen,
+ pdfauthor={Nicola L.C. Talbot},
+ pdftitle={fmtcount.sty: Displaying the Values of LaTeX Counters},
+ pdfkeywords={LaTeX,counter}]{hyperref}
+
+\CheckSum{10334}
+
+\doxitem{Option}{option}{options}
+
+\newlength{\tabcolwidth}
+\newlength{\coliwidth}
+\newcommand*\cnab{\centering\arraybackslash}
+\newcommand*\ColIRI[1]{}
+\csname @ifpackageloaded\endcsname{tex4ht}{%
+\newcommand*\ColIRII[1]{\parbox{\coliwidth}{\cnab #1}}
+}{%
+\newcommand*\ColIRII[1]{\multirow{-2}{\coliwidth}{\cnab #1}}
+}
+
+\begin{document}
+\DocInput{fmtcount.dtx}
+\end{document}
+%</driver>
+%\fi
+%\RecordChanges
+%
+% \title{fmtcount.sty: Displaying the Values of
+%\LaTeX\ Counters}
+% \author{Nicola L.C. Talbot\\
+% \url{www.dickimaw-books.com}
+% \and
+% Vincent Bela\"iche}
+% \date{2017-12-26 (version 3.05)\relax
+%}
+% \maketitle
+% \tableofcontents
+% \section{Introduction}
+%
+%The \styfmt{fmtcount} package provides commands to display
+%the values of \LaTeX\ counters in a variety of formats. It also
+%provides equivalent commands for actual numbers rather than
+%counter names. Limited multilingual support is available.
+%Currently, there is only support for English, French (including
+%Belgian and Swiss variations), Spanish, Portuguese, German and
+%Italian.
+%
+%\section{Available Commands}
+%
+%The commands can be divided into two categories: those that
+%take the name of a counter as the argument, and those
+%that take a number as the argument.
+%
+%\begin{definition}[\DescribeMacro{\ordinal}]
+%\cs{ordinal}\marg{counter}\oarg{gender}
+%\end{definition}
+%This will print the value of a \LaTeX\ counter \meta{counter} as an
+%ordinal, where the macro
+%\begin{definition}[\DescribeMacro{\fmtord}]
+%\cs{fmtord}\marg{text}
+%\end{definition}
+%is used to format the st, nd, rd, th bit. By default the ordinal is
+%formatted as a superscript, if the package option \pkgopt{level} is
+%used, it is level with the text. For example, if the current section
+%is 3, then \verb"\ordinal{section}" will produce the output:
+%3\textsuperscript{rd}. Note that the optional argument \meta{gender}
+%occurs \emph{at the end}. This argument may only take one of
+%the following values: \texttt{m} (masculine), \texttt{f}
+%(feminine) or \texttt{n} (neuter.) If \meta{gender} is omitted,
+%or if the given gender has no meaning in the current language,
+%\texttt{m} is assumed.
+%
+%\textbf{Notes:}
+%\begin{enumerate}
+%\item the \cls{memoir} class also defines a command called
+%\cs{ordinal} which takes a number as an argument instead of a
+%counter. In order to overcome this incompatiblity, if you want
+%to use the \styfmt{fmtcount} package with the \cls{memoir} class
+%you should use
+%\begin{definition}[\DescribeMacro{\FCordinal}]
+%\cs{FCordinal}
+%\end{definition}
+%to access \styfmt{fmtcount}'s version of \cs{ordinal}, and use
+%\cs{ordinal} to use \cls{memoir}'s version of that command.
+%
+%\item As with all commands which have an optional argument as the
+%last argument, if the optional argument is omitted, any spaces
+%following the final argument will be ignored. Whereas, if the
+%optional argument is present, any spaces following the optional
+%argument won't be ignored. so \verb"\ordinal{section} !"
+%will produce: 3\textsuperscript{rd}! whereas
+% \verb"\ordinal{section}[m] !" will produce:
+%3\textsuperscript{rd} !
+%\end{enumerate}
+%
+%The commands below only work for numbers in the range 0~to~99999.
+%\begin{definition}[\DescribeMacro{\ordinalnum}]
+%\cs{ordinalnum}\marg{n}\oarg{gender}
+%\end{definition}
+%This is like \cs{ordinal} but takes an actual number rather than a
+%counter as the argument. For example: \verb"\ordinalnum{3}" will
+%produce: 3\textsuperscript{rd}.
+%
+%\begin{definition}[\DescribeMacro{\numberstring}]
+%\cs{numberstring}\marg{counter}\oarg{gender}
+%\end{definition}
+%This will print the value of \meta{counter} as text. E.g.\
+%\verb"\numberstring{section}" will produce: three. The optional
+%argument is the same as that for \cs{ordinal}.
+%
+%\begin{definition}[\DescribeMacro{\Numberstring}]
+%\cs{Numberstring}\marg{counter}\oarg{gender}
+%\end{definition}
+%This does the same as \cs{numberstring}, but with initial letters in
+%uppercase. For example, \verb"\Numberstring{section}" will produce:
+%Three.
+%
+%\begin{definition}[\DescribeMacro{\NUMBERstring}]
+%\cs{NUMBERstring}\marg{counter}\oarg{gender}
+%\end{definition}
+%This does the same as \cs{numberstring}, but converts the string to
+%upper case. Note that
+%\verb"\MakeUppercase{\NUMBERstring{"\meta{counter}\verb'}}' doesn't
+%work, due to the way that \cs{MakeUppercase} expands its
+%argument\footnote{See all the various postings to
+%\texttt{comp.text.tex} about \cs{MakeUppercase}}.
+%
+%\begin{definition}[\DescribeMacro{\numberstringnum}]
+%\cs{numberstringnum}\marg{n}\oarg{gender}
+%\end{definition}
+%\begin{definition}[\DescribeMacro{\Numberstringnum}]
+%\cs{Numberstringnum}\marg{n}\oarg{gender}
+%\end{definition}
+%\begin{definition}[\DescribeMacro{\NUMBERstringnum}]
+%\cs{NUMBERstringnum}\marg{n}\oarg{gender}
+%\end{definition}
+%Theses macros work like
+%\cs{numberstring}, \cs{Numberstring} and \cs{NUMBERstring},
+%respectively, but take an actual number
+%rather than a counter as the argument. For example:
+%\verb'\Numberstringnum{105}' will produce: One Hundred and Five.
+%
+%\begin{definition}[\DescribeMacro{\ordinalstring}]
+%\cs{ordinalstring}\marg{counter}\oarg{gender}
+%\end{definition}
+%This will print the value of \meta{counter} as a textual ordinal.
+%E.g.\ \verb"\ordinalstring{section}" will produce: third. The
+%optional argument is the same as that for \cs{ordinal}.
+%
+%\begin{definition}[\DescribeMacro{\Ordinalstring}]
+%\cs{Ordinalstring}\marg{counter}\oarg{gender}
+%\end{definition}
+%This does the same as \cs{ordinalstring}, but with initial letters in
+%uppercase. For example, \verb"\Ordinalstring{section}" will produce:
+%Third.
+%
+%\begin{definition}[\DescribeMacro{\ORDINALstring}]
+%\cs{ORDINALstring}\marg{counter}\oarg{gender}
+%\end{definition}
+%This does the same as \cs{ordinalstring}, but with all words in upper
+%case (see previous note about \cs{MakeUppercase}).
+%
+%\begin{definition}[\DescribeMacro{\ordinalstringnum}]
+%\cs{ordinalstringnum}\marg{n}\oarg{gender}
+%\end{definition}
+%\begin{definition}[\DescribeMacro{\Ordinalstringnum}]
+%\cs{Ordinalstringnum}\marg{n}\oarg{gender}
+%\end{definition}
+%\begin{definition}[\DescribeMacro{\ORDINALstringnum}]
+%\cs{ORDINALstringnum}\marg{n}\oarg{gender}
+%\end{definition}
+%These macros work like \cs{ordinalstring}, \cs{Ordinalstring} and
+%\cs{ORDINALstring}, respectively, but take an actual number rather
+%than a counter as the argument. For example,
+%\verb"\ordinalstringnum{3}" will produce: third.
+%
+%\changes{v.1.09}{21 Apr 2007}{store facility added}
+%As from version 1.09, textual representations can be stored for
+%later use. This overcomes the problems encountered when you
+%attempt to use one of the above commands in \cs{edef}.
+%
+%Each of the following commands takes a label as the first argument,
+%the other arguments are as the analogous commands above. These
+%commands do not display anything, but store the textual
+%representation. This can later be retrieved using
+%
+%\begin{definition}[\DescribeMacro{\FMCuse}]
+%\cs{FMCuse}\marg{label}
+%\end{definition}
+%
+%\begin{important}
+%Note: with \cs{storeordinal} and \cs{storeordinalnum}, the
+%only bit that doesn't get expanded is \cs{fmtord}. So, for
+%example, \verb"\storeordinalnum{mylabel}{3}" will be stored as
+%\verb"3\relax \fmtord{rd}".
+%\end{important}
+%
+%\begin{definition}[\DescribeMacro{\storeordinal}]
+%\cs{storeordinal}\marg{label}\marg{counter}\oarg{gender}
+%\end{definition}
+%
+%\begin{definition}[\DescribeMacro{\storeordinalstring}]
+%\cs{storeordinalstring}\marg{label}\marg{counter}\oarg{gender}
+%\end{definition}
+%
+%\begin{definition}[\DescribeMacro{\storeOrdinalstring}]
+%\cs{storeOrdinalstring}\marg{label}\marg{counter}\oarg{gender}
+%\end{definition}
+%
+%
+%\begin{definition}[\DescribeMacro{\storeORDINALstring}]
+%\cs{storeORDINALstring}\marg{label}\marg{counter}\oarg{gender}
+%\end{definition}
+%
+%\begin{definition}[\DescribeMacro{\storenumberstring}]
+%\cs{storenumberstring}\marg{label}\marg{counter}\oarg{gender}
+%\end{definition}
+%
+%\begin{definition}[\DescribeMacro{\storeNumberstring}]
+%\cs{storeNumberstring}\marg{label}\marg{counter}\oarg{gender}
+%\end{definition}
+%
+%\begin{definition}[\DescribeMacro{\storeNUMBERstring}]
+%\cs{storeNUMBERstring}\marg{label}\marg{counter}\oarg{gender}
+%\end{definition}
+%
+%\begin{definition}[\DescribeMacro{\storeordinalnum}]
+%\cs{storeordinalnum}\marg{label}\marg{number}\oarg{gender}
+%\end{definition}
+%
+%\begin{definition}[\DescribeMacro{\storeordinalstringnum}]
+%\cs{storeordinalstring}\marg{label}\marg{number}\oarg{gender}
+%\end{definition}
+%
+%\begin{definition}[\DescribeMacro{\storeOrdinalstringnum}]
+%\cs{storeOrdinalstringnum}\marg{label}\marg{number}\oarg{gender}
+%\end{definition}
+%
+%\begin{definition}[\DescribeMacro{\storeORDINALstringnum}]
+%\cs{storeORDINALstringnum}\marg{label}\marg{number}\oarg{gender}
+%\end{definition}
+%
+%\begin{definition}[\DescribeMacro{\storenumberstringnum}]
+%\cs{storenumberstring}\marg{label}\marg{number}\oarg{gender}
+%\end{definition}
+%
+%\begin{definition}[\DescribeMacro{\storeNumberstringnum}]
+%\cs{storeNumberstring}\marg{label}\marg{number}\oarg{gender}
+%\end{definition}
+%
+%\begin{definition}[\DescribeMacro{\storeNUMBERstringnum}]
+%\cs{storeNUMBERstring}\marg{label}\marg{number}\oarg{gender}
+%\end{definition}
+%
+%\begin{definition}[\DescribeMacro{\binary}]
+%\cs{binary}\marg{counter}
+%\end{definition}
+%This will print the value of \meta{counter} as a binary number.
+%E.g.\ \verb"\binary{section}" will produce: 11. The declaration
+%\begin{definition}[\DescribeMacro{\padzeroes}]
+%\cs{padzeroes}\oarg{n}
+%\end{definition}
+%will ensure numbers are written to \meta{n} digits, padding with
+%zeroes if necessary. E.g.\ \verb"\padzeroes[8]\binary{section}" will
+%produce: 00000011. The default value for \meta{n} is 17.
+%
+%\begin{definition}[\DescribeMacro{\binarynum}]
+%\cs{binary}\marg{n}
+%\end{definition}
+%This is like \cs{binary} but takes an actual number rather than a
+%counter as the argument. For example: \verb"\binarynum{5}" will
+%produce: 101.
+%
+%The octal commands only work for values in the range 0~to~32768.
+%\begin{definition}[\DescribeMacro{\octal}]
+%\cs{octal}\marg{counter}
+%\end{definition}
+%This will print the value of \meta{counter} as an octal number. For
+%example, if you have a counter called, say \texttt{mycounter}, and
+%you set the value to 125, then \verb"\octal{mycounter}" will produce:
+%177. Again, the number will be padded with zeroes if necessary,
+%depending on whether \cs{padzeroes} has been used.
+%
+%\begin{definition}[\DescribeMacro{\octalnum}]
+%\cs{octalnum}\marg{n}
+%\end{definition}
+%This is like \cs{octal} but takes an actual number rather than a
+%counter as the argument. For example: \verb"\octalnum{125}" will
+%produce: 177.
+%
+%\begin{definition}[\DescribeMacro{\hexadecimal}]
+%\cs{hexadecimal}\marg{counter}
+%\end{definition}
+%This will print the value of \meta{counter} as a hexadecimal number.
+%Going back to the counter used in the previous example,
+%\verb"\hexadecimal{mycounter}" will produce: 7d. Again, the number
+%will be padded with zeroes if necessary, depending on whether
+%\cs{padzeroes} has been used.
+%
+%\begin{definition}[\DescribeMacro{\Hexadecimal}]
+%\cs{Hexadecimal}\marg{counter}
+%\end{definition}
+%This does the same thing, but uses uppercase characters, e.g.\
+%\verb"\Hexadecimal{mycounter}" will produce: 7D.
+%
+%\begin{definition}[\DescribeMacro{\hexadecimalnum}]
+%\cs{hexadecimalnum}\marg{n}
+%\end{definition}
+%
+%\begin{definition}[\DescribeMacro{\Hexadecimalnum}]
+%\cs{Hexadecimalnum}\marg{n}
+%\end{definition}
+%These are like \cs{hexadecimal} and \cs{Hexadecimal}
+%but take an actual number rather than a counter as the
+%argument. For example: \verb"\hexadecimalnum{125}" will
+%produce: 7d, and \verb"\Hexadecimalnum{125}" will
+%produce: 7D.
+%
+%\begin{definition}[\DescribeMacro{\decimal}]
+%\cs{decimal}\marg{counter}
+%\end{definition}
+%This is similar to \cs{arabic} but the number can be padded with
+%zeroes depending on whether \cs{padzeroes} has been used. For
+%example: \verb"\padzeroes[8]\decimal{section}" will produce:
+%00000005.
+%
+%\begin{definition}[\DescribeMacro{\decimalnum}]
+%\cs{decimalnum}\marg{n}
+%\end{definition}
+%This is like \cs{decimal} but takes an actual number rather than a
+%counter as the argument. For example:
+%\verb"\padzeroes[8]\decimalnum{5}" will produce: 00000005.
+%
+%\begin{definition}[\DescribeMacro{\aaalph}]
+%\cs{aaalph}\marg{counter}
+%\end{definition}
+%This will print the value of \meta{counter} as: a b \ldots\ z aa bb
+%\ldots\ zz etc. For example, \verb"\aaalpha{mycounter}" will
+%produce: uuuuu if \texttt{mycounter} is set to 125.
+%
+%\begin{definition}[\DescribeMacro{\AAAlph}]
+%\cs{AAAlph}\marg{counter}
+%\end{definition}
+%This does the same thing, but uses uppercase characters, e.g.\
+%\verb"\AAAlph{mycounter}" will produce: UUUUU.
+%
+%\begin{definition}[\DescribeMacro{\aaalphnum}]
+%\cs{aaalphnum}\marg{n}
+%\end{definition}
+%
+%\begin{definition}[\DescribeMacro{\AAAlphnum}]
+%\cs{AAAlphnum}\marg{n}
+%\end{definition}
+%These macros are like \cs{aaalph} and \cs{AAAlph}
+%but take an actual number rather than a counter as the
+%argument. For example: \verb"\aaalphnum{125}" will
+%produce: uuuuu, and \verb"\AAAlphnum{125}" will
+%produce: UUUUU.
+%
+%The abalph commands described below only work for values in the
+%range 0~to~17576.
+%\begin{definition}[\DescribeMacro{\abalph}]
+%\cs{abalph}\marg{counter}
+%\end{definition}
+%This will print the value of \meta{counter} as: a b \ldots\ z aa ab
+%\ldots\ az etc. For example, \verb"\abalpha{mycounter}" will
+%produce: du if \texttt{mycounter} is set to 125.
+%
+%\begin{definition}[\DescribeMacro{\ABAlph}]
+%\cs{ABAlph}\marg{counter}
+%\end{definition}
+%This does the same thing, but uses uppercase characters, e.g.\
+%\verb"\ABAlph{mycounter}" will produce: DU.
+%
+%\begin{definition}[\DescribeMacro{\abalphnum}]
+%\cs{abalphnum}\marg{n}
+%\end{definition}
+%
+%\begin{definition}[\DescribeMacro{\ABAlphnum}]
+%\cs{ABAlphnum}\marg{n}
+%\end{definition}
+%These macros are like \cs{abalph} and \cs{ABAlph}
+%but take an actual number rather than a counter as the
+%argument. For example: \verb"\abalphnum{125}" will
+%produce: du, and \verb"\ABAlphnum{125}" will
+%produce: DU.
+%
+%\section{Package Options}
+%\label{sec:package-options}
+%
+%The following options can be passed to this package:
+%
+%\begin{description}
+%\item[\meta{dialect}] load language \meta{dialect}, supported \meta{dialect} are the same as passed to
+% \cs{FCloadlang}, see~\ref{sec:multilingual-support}
+%\item[\pkgopt{raise}] make ordinal st,nd,rd,th appear as superscript
+%\item[\pkgopt{level}] make ordinal st,nd,rd,th appear level with rest of text
+%\end{description}
+%
+%
+%\noindent Options \pkgopt{raise} and \pkgopt{level} can also be set using the command:
+%
+%\begin{definition}[\DescribeMacro{\fmtcountsetoptions}]
+%\cs{fmtcountsetoptions}\verb"{fmtord="\meta{type}\verb'}'
+%\end{definition}
+%where \meta{type} is either \texttt{level} or \texttt{raise}. Since version~3.01 of \sty{fmtcount}, it is also
+%possible to set \meta{type} on a language by language basis, see~\S~\ref{sec:multilingual-support}.
+%
+%\section{Multilingual Support}
+%\label{sec:multilingual-support}
+%
+%Version 1.02 of the \sty{fmtcount} package now has
+%limited multilingual support. The following languages are
+%implemented: English, Spanish, Portuguese, French, French (Swiss)
+%and French (Belgian). German support was added in version
+%1.1.\footnote{Thanks to K. H. Fricke for supplying the information.}
+%Italian support was added in version 1.31.\footnote{Thanks to
+%Edoardo Pasca for supplying the information.}
+%
+%Actually, \sty{fmtcount} has two modes:
+%\begin{itemize}
+%\item a multilingual mode, in which the commands \cs{numberstring}, \cs{ordinalstring}, \cs{ordinal}, and
+% their variants will be formatted in the currently selected language, as per the \cs{languagename} macro set
+% by \sty{babel}, \sty{polyglossia} or suchlikes, and
+%\item a default mode for backward compatibility in which these commands are formatted in English irrespective
+% of \cs{languagename}, and to which \sty{fmtcount} falls back when it cannot detects packages such as
+% \sty{babel} or \sty{polyglossia} are loaded.
+%\end{itemize}
+%
+%For multilingual mode, \sty{fmtcount} needs to load correctly the language definition for document dialects. To
+%do this use
+%\begin{definition}[\DescribeMacro{\FCloadlang}]
+%\cs{FCloadlang}\marg{dialect}
+%\end{definition}
+%in the preamble --- this will both switch on multilingual mode, and load the \meta{dialect} definition. The
+%\meta{dialect} should match the options passed to \sty{babel} or \sty{polyglossia}. \sty{fmtcount} currently
+%supports the following \meta{dialect}'s: \LanguagePackageOptionList.
+%
+%If you don't use \cs{FCloadlang}, \sty{fmtcount} will attempt to detect the required dialects and call
+%\cs{FCloadlang} for you, but this isn't guaranteed to work. Notably, when \cs{FCloadlang} is not used and
+%\sty{fmtcount} has switched on multilingual mode, but without detecting the needed dialects in the preamble,
+%and \sty{fmtcount} has to format a number for a dialect for which definition has not been loaded (via
+%\cs{FCloadlang} above), then if \sty{fmtcount} detects a definition file for this dialect it will attempt to
+%load it, and cause an error otherwise. This loading in body has not been tested extensively, and may may cause
+%problems such as spurious spaces insertion before the first formatted number, so it's best to use
+%\cs{FCloadlang} explicitely in the preamble.
+%
+%If the French language is selected, the \texttt{french} option let you
+%configure the dialect and other aspects. The \texttt{abbr} also has
+%some influence with French. Please refer to \S~\ref
+%{sec:options-french}.
+%
+%
+%The male gender for all languages is used by default, however the
+%feminine or neuter forms can be obtained by passing \texttt{f} or
+%\texttt{n} as an optional argument to \cs{ordinal},
+%\cs{ordinalnum} etc. For example:
+%\verb"\numberstring{section}[f]". Note that the optional argument
+%comes \emph{after} the compulsory argument. If a gender is
+%not defined in a given language, the masculine version will
+%be used instead.
+%
+%Let me know if you find any spelling mistakes (has been known
+%to happen in English, let alone other languages with which I'm not so
+%familiar.) If you want to add support for another language,
+%you will need to let me know how to form the numbers and ordinals
+%from~0 to~99999 in that language for each gender.
+%
+%\subsection{Options for setting ordinal ending position raise/level}
+%\label{sec:options-fmtord}
+%
+%\begin{definition}[\DescribeMacro{\fmtcountsetoptions}]
+%\cs{fmtcountsetoptions}\verb"{"\meta{language}\verb"={fmtord="\meta{type}\verb'}}'
+%\end{definition}
+%where \meta{language} is one of the supported language \meta{type} is either \texttt{level} or \texttt{raise}
+%or \texttt{undefine}. If the value is \texttt{level} or \texttt{raise}, then that will set the \texttt{fmtord}
+%option accordingly\footnote{see~\S~\ref{sec:package-options}} only for that language \meta{language}. If the
+%value is \texttt{undefine}, then the non-language specific behaviour is followed.
+%
+%Some \meta{language} are synonyms, here is a table:
+%
+%\begin{center}
+% \begin{tabular}{|l|l|}\hline
+% \textbf{language}& \textbf{alias(es)}\\\hline
+% english& british\\\hline
+% french&frenchb\\\hline
+% &germanb\\
+% german&ngerman\\
+% &ngermanb\\\hline
+% USenglish&american\\\hline
+% \end{tabular}
+%\end{center}
+%
+%\subsection{Options for French}
+%\label{sec:options-french}
+%
+%This section is in French, as it is most useful to French speaking people.
+%
+%\selectlanguage{french} Il est possible de configurer plusieurs
+%aspects de la numérotation en français avec les options
+%\texttt{french} et \texttt{abbr}. Ces options n'ont d'effet que si le
+%langage \texttt{french} est chargé.
+%
+%\begin{definition}[\DescribeMacro{\fmtcountsetoptions}]
+%\cs{fmtcountsetoptions}\verb"{french="\marg{french options}\verb'}'
+%\end{definition}
+%L'argument \meta{french options} est une liste entre accolades et
+%séparée par des virgules de réglages de la forme
+%``\meta{clef}\texttt{=}\meta{valeur}'', chacun de ces réglages est
+%ci-après désigné par ``option française'' pour le distinguer des
+%``options générales'' telles que \texttt{french}.
+%
+%Le dialecte peut être sélectionné avec l'option française
+%\texttt{dialect} dont la valeur \meta{dialect} peut être
+%\texttt{france}, \texttt{belgian} ou \texttt{swiss}.
+%\begin{definition}[\DescribeOption{dialect}]
+%\cs{fmtcountsetoptions}\verb"{french={dialect="\marg{dialect}\verb'}}'
+%\end{definition}
+%\begin{definition}[\DescribeOption{french}]
+%\cs{fmtcountsetoptions}\verb"{french="\meta{dialect}\verb'}'
+%\end{definition}
+%
+%Pour alléger la notation et par souci de rétro-compatibilité
+%\texttt{france}, \texttt{belgian} ou \texttt{swiss} sont également des
+%\meta{clef}s pour \meta{french options} à utiliser sans \meta{valeur}.
+%
+%L'effet de l'option \texttt{dialect} est illustré ainsi:\newline
+%\begin{tabularx}{\linewidth}{@{}lX@{}}
+% \pkgopt{france}& soixante-dix pour 70, quatre-vingts pour 80, et
+% quatre-vingts-dix pour 90,\\
+% \pkgopt{belgian} & septante pour 70, quatre-vingts pour 80, et
+% nonante pour 90, \\
+% \pkgopt{swiss} &septante pour 70, huitante\footnote{voir
+% \href{http://www.alain.be/Boece/huitante_octante.html}{Octante et
+% huitante} sur le site d'Alain Lassine} pour 80, et
+% nonante pour 90
+%\end{tabularx}
+%Il est à noter que la variante \texttt{belgian} est parfaitement
+%correcte pour les francophones français\footnote{je précise que
+% l'auteur de ces lignes est français}, et qu'elle est également
+%utilisée en Suisse Romande hormis dans les cantons de Vaud, du Valais
+%et de Fribourg. En ce qui concerne le mot ``octante'', il n'est
+%actuellement pas pris en charge et n'est guère plus utilisé, ce qui
+%est sans doute dommage car il est sans doute plus acceptable que le
+%``huitante'' de certains de nos amis suisses.
+%
+%\begin{definition}[\DescribeOption{abbr}]
+%\cs{fmtcountsetoptions}\verb"{abbr="\meta{boolean}\verb'}'
+%\end{definition}
+%L'option générale \texttt{abbr} permet de changer l'effet de
+%\cs{ordinal}. Selon \meta{boolean} on a:\newline
+%\begin{tabularx}{\linewidth}{@{}lX@{}}
+% \pkgopt{true}& pour produire des ordinaux de la forme
+% {\def\languagename{french}\csname fmtord@abbrvtrue\endcsname\ordinalnum{2}} (par défaut), ou\\
+% \pkgopt{false}& pour produire des ordinaux de la forme
+% {\def\languagename{french}\csname fmtord@abbrvfalse\endcsname\ordinalnum{2}} \\
+%\end{tabularx}
+%
+%\begin{definition}[\DescribeOption{vingt plural}]
+%\cs{fmtcountsetoptions}\verb"{french={vingt plural="\meta{french plural control}\verb'}}'
+%\end{definition}
+%\begin{definition}[\DescribeOption{cent plural}]
+%\cs{fmtcountsetoptions}\verb"{french={cent plural="\meta{french plural control}\verb'}}'
+%\end{definition}
+%\begin{definition}[\DescribeOption{mil plural}]
+%\cs{fmtcountsetoptions}\verb"{french={mil plural="\meta{french plural control}\verb'}}'
+%\end{definition}
+%\begin{definition}[\DescribeOption{n-illion plural}]
+%\cs{fmtcountsetoptions}\verb"{french={n-illion plural="\meta{french plural control}\verb'}}'
+%\end{definition}
+%\begin{definition}[\DescribeOption{n-illiard plural}]
+%\cs{fmtcountsetoptions}\verb"{french={n-illiard plural="\meta{french plural control}\verb'}}'
+%\end{definition}
+%\begin{definition}[\DescribeOption{all plural}]
+%\cs{fmtcountsetoptions}\verb"{french={all plural="\meta{french plural control}\verb'}}'
+%\end{definition}
+%Les options \texttt{vingt plural}, \texttt{cent plural}, \texttt{mil plural}, \texttt{n-illion plural}, et
+%\texttt{n-illiard plural}, permettent de contrôler très finement l'accord en nombre des mots respectivement
+%vingt, cent, mil, et des mots de la forme \meta{\(n\)}illion et \meta{\(n\)}illiard, où \meta{\(n\)} désigne
+%`m' pour 1, `b' pour 2, 'tr' pour 3, etc. L'option \texttt{all plural} est un raccourci permettant de
+%contrôler de concert l'accord en nombre de tous ces mots. Tous ces paramètres valent \texttt{reformed} par
+%défaut.
+%
+%Attention, comme on va l'expliquer, seules quelques combinaisons de configurations de ces options donnent un
+%orthographe correcte vis à vis des règles en vigueur. La raison d'être de ces options est la suivante~:
+%\begin{itemize}
+%\item la règle de l'accord en nombre des noms de nombre dans un numéral cardinal dépend de savoir s'il a
+% vraiment une valeur cardinale ou bien une valeur ordinale, ainsi on écrit \og aller à la page deux-cent
+% (sans s) d'un livre de deux-cents (avec s) pages\fg, il faut donc pouvoir changer la configuration pour
+% sélectionner le cas considéré,
+%\item un autre cas demandant quelque configurabilité est celui de \og mil\fg\ et \og mille\fg. Pour rappel \og
+% mille\fg\ est le pluriel irrégulier de \og mil\fg, mais l'alternance mil/mille est rare, voire pédante, car
+% aujourd'hui \og mille\fg\ n'est utilisé que comme un mot invariable, en effet le sort des pluriels étrangers
+% est systématiquement de finir par disparaître comme par exemple \og scénarii\fg\ aujourd'hui supplanté par
+% \og scénarios\fg. Pour continuer à pouvoir écrire \og mil\fg, il aurait fallu former le pluriel comme \og
+% mils\fg, ce qui n'est pas l'usage. Certaines personnes utilisent toutefois encore \og mil\fg\ dans les
+% dates, par exemple \og mil neuf cent quatre-vingt quatre\fg\ au lieu de \og mille neuf cent quatre-vingt
+% quatre\fg,
+%\item finalement les règles du français quoique bien définies ne sont pas très cohérentes et il est donc
+% inévitable qu'un jour ou l'autre on on les simplifie. Le paquetage \styfmt{fmtcount} est déjà prêt à cette
+% éventualité.
+%\end{itemize}
+%
+%Le paramètre \meta{french plural control} peut prendre les valeurs suivantes:\newline
+%\settowidth{\tabcolwidth}{\pkgopt{multiple lng-width}}
+%\begin{supertabular}{@{}p{\tabcolwidth}p{\dimexpr\linewidth-\tabcolwidth-2\tabcolsep}@{}}
+% \pkgopt{traditional}& pour sélectionner la règle en usage chez les adultes à la date de parution de ce
+% document, et dans le cas des numéraux cardinaux, lorsqu'ils ont une valeur cardinale,\\
+% \pkgopt{reformed}& pour suivre toute nouvelle recommandation à la date de parution de ce document, , et
+% dans le cas des numéraux cardinaux, lorsqu'ils ont une valeur cardinale, l'idée des options
+% \texttt{traditional} et \texttt{reformed} est donc de pouvoir contenter à la fois les anciens et les
+% modernes, mais à dire vrai à la date où ce document est écrit elles ont exactement
+% le même effet,\\
+% \pkgopt{traditional o}& pareil que \texttt{traditional} mais dans le cas des numéraux cardinaux,
+% lorsqu'ils
+% ont une valeur ordinale,\\
+% \pkgopt{reformed o}& pareil que \texttt{reformed} mais dans le cas des numéraux cardinaux, lorsqu'ils ont
+% une valeur ordinale, de même que précédemment \texttt{reformed o} et \texttt{traditional o} ont
+% exactement le même effet,\\
+% \pkgopt{always}& pour marquer toujours le pluriel, ceci n'est correct que pour \og mil\fg\ vis à vis des
+% règles en vigueur,\\
+% \pkgopt{never}& pour ne jamais marquer le pluriel, ceci est incorrect vis à vis des règles d'orthographe
+% en vigueur,\\
+% \pkgopt{multiple}& pour marquer le pluriel lorsque le nombre considéré est multiplié par au moins 2, ceci
+% est la règle en vigueur pour les nombres de la forme \meta{\(n\)}illion et \meta{\(n\)}illiard lorsque le
+% nombre a une valeur cardinale,\\
+% \pkgopt{multiple g-last}& pour marquer le pluriel lorsque le nombre considéré est multiplié par au moins 2
+% est est \emph{\textbf{g}lobalement} en dernière position, où ``globalement'' signifie qu'on considère le
+% nombre formaté en entier, ceci est incorrect vis à vis des règles d'orthographe
+% en vigueur,\\
+% \pkgopt{multiple l-last}& pour marquer le pluriel lorsque le nombre considéré est multiplié par au moins 2
+% et est \emph{\textbf{l}ocalement} en dernière position, où ``localement'' siginifie qu'on considère
+% seulement la portion du nombre qui multiplie soit l'unité, soit un \meta{\(n\)}illion ou un
+% \meta{\(n\)}illiard~; ceci est la convention en vigueur pour le pluriel de ``vingt'' et de ``cent''
+% lorsque le nombre formaté a une valeur cardinale,\\
+% \pkgopt{multiple lng-last}& pour marquer le pluriel lorsque le nombre considéré est multiplié par au moins
+% 2 et est \emph{\textbf{l}ocalement} mais \emph{\textbf{n}on \textbf{g}lobablement} en dernière position,
+% où ``localement'' et \emph{globablement} on la même siginification que pour les options \texttt{multiple
+% g-last} et \texttt{multiple l-last}~; ceci est la convention en vigueur pour le pluriel de ``vingt'' et
+% de ``cent'' lorsque le nombre formaté a une valeur ordinale,\\
+% \pkgopt{multiple ng-last}& pour marquer le pluriel lorsque le nombre considéré est multiplié par au moins
+% 2, et \emph{\textbf{n}}'est pas \emph{\textbf{g}lobalement} en dernière position, où ``globalement'' a la
+% même signification que pour l'option \texttt{multiple g-last}~; ceci est la règle que j'infère être en
+% vigueur pour les nombres de la forme \meta{\(n\)}illion et \meta{\(n\)}illiard lorsque le nombre a une
+% valeur ordinale, mais à dire vrai pour des nombres aussi grands, par exemple \og deux millions\fg, je
+% pense qu'il n'est tout simplement pas d'usage de dire \og l'exemplaire deux million(s?)\fg\ pour \og le
+% deux millionième
+% exemplaire\fg.\\
+%\end{supertabular}
+%
+%L'effet des paramètres \texttt{traditional}, \texttt{traditional o}, \texttt{reformed}, et \texttt{reformed
+% o}, est le suivant~:
+%
+%\setlength{\tabcolwidth}{\linewidth}
+%\addtolength{\tabcolwidth}{-10\tabcolsep}
+%\addtolength{\tabcolwidth}{-6\arrayrulewidth}
+%\setlength{\coliwidth}{0.398\tabcolwidth}
+%\addtolength{\coliwidth}{\arrayrulewidth}
+%\addtolength{\coliwidth}{2\tabcolsep}
+%\noindent\begin{tabular*}{\linewidth}{|%
+% >{\centering\arraybackslash\ttfamily}p{\dimexpr0.204\tabcolwidth-\arrayrulewidth-\doublerulesep}||%
+% *{4}{>{\centering\arraybackslash\ttfamily}p{0.199\tabcolwidth}|}}\hline
+% \textrm{\meta{x} dans ``\meta{x} }plural\textrm{''}&traditional&reformed&traditional o&reformed o\\\hline
+% \hline
+% vingt&\multicolumn{2}{c|}{\ColIRI{multiple l-last}}&\multicolumn{2}{c|}{\ColIRI{multiple lng-last}}\\\cline{1-1}
+% cent&%
+% \multicolumn{2}{c|}{\ColIRII{multiple l-last}}&%
+% \multicolumn{2}{c|}{\ColIRII{multiple lng-last}}\\\hline
+% mil&\multicolumn{4}{c|}{always}\\\hline
+% n-illion&\multicolumn{2}{c|}{\ColIRI{multiple}}&%
+% \multicolumn{2}{c|}{\ColIRI{multiple ng-last}}\\\cline{1-1}
+% n-illiard&%
+% \multicolumn{2}{c|}{\ColIRII{multiple}}&%
+% \multicolumn{2}{c|}{\ColIRII{multiple ng-last}}\\\hline
+%\end{tabular*}
+%
+%Les configurations qui respectent les règles d'orthographe sont les suivantes~:
+%\begin{itemize}
+%\item \verb"\fmtcountsetoptions{french={all plural=reformed o}}" pour formater les numéraux cardinaux à
+% valeur ordinale,
+%\item \verb"\fmtcountsetoptions{french={mil plural=multiple}}" pour activer l'alternance mil/mille.
+%\item \verb"\fmtcountsetoptions{french={all plural=reformed}}" pour revenir dans la configuration par
+% défaut.
+%\end{itemize}
+%
+%\begin{definition}[\DescribeOption{dash or space}]
+%\cs{fmtcountsetoptions}\verb"{french={dash or space="\meta{dash or space}\verb'}}'
+%\end{definition}
+%Avant la réforme de l'orthographe de 1990, on ne met des traits d'union qu'entre les dizaines et les unités,
+%et encore sauf quand le nombre \(n\) considéré est tel que \(n\mod10=1\), dans ce cas on écrit ``et un''
+%sans trait d'union. Après la réforme de 1990, on recommande de mettre des traits d'union de partout sauf
+%autour de ``mille'', ``million'' et ``milliard'', et les mots analogues comme ``billion'',
+%``billiard''. Cette exception a toutefois été contestée par de nombreux auteurs, et on peut aussi mettre des
+%traits d'union de partout. Mettre l'option \meta{dash or space} à:\newline
+%\begin{tabularx}{\linewidth}{lX}
+% \pkgopt{traditional}& pour sélectionner la règle d'avant la réforme de 1990,\\
+% \pkgopt{1990}& pour suivre la recommandation de la réforme de 1990, \\
+% \pkgopt{reformed}& pour suivre la recommandation de la dernière
+% réforme pise en charge, actuellement l'effet est le même que \textrm{1990}, ou à\\
+% \pkgopt{always}& pour mettre systématiquement des traits d'union de partout.\\
+%\end{tabularx}
+%Par défaut, l'option vaut \texttt{reformed}.
+%
+%
+%\begin{definition}[\DescribeOption{scale}]
+%\cs{fmtcountsetoptions}\verb"{french={scale="\meta{scale}\verb'}}'
+%\end{definition}
+%L'option \texttt{scale} permet de configurer l'écriture des grands
+%nombres. Mettre \meta{scale} à:\newline
+%\begin{tabularx}{\linewidth}{lX}
+% \pkgopt{recursive}& dans ce cas \(10^{30}\) donne mille milliards de
+% milliards de milliards, pour \(10^n\), on écrit \(10^{n-9\times
+% \max\{(n\div 9)-1,0\}}\) suivi de la répétition \(\max\{(n\div
+% 9)-1,0\}\) fois de ``de milliards''\\
+% \pkgopt{long}& \(10^{6\times n}\) donne un \meta{\(n\)}illion où
+% \meta{\(n\)} est remplacé par ``bi'' pour 2, ``tri'' pour 3, etc. et
+% \(10^{6\times n+3}\) donne un \meta{\(n\)}illiard avec la même
+% convention pour \meta{\(n\)}. L'option \texttt{long} est correcte en
+% Europe, par contre j'ignore l'usage au
+% Québec.\\
+% \pkgopt{short}& \(10^{6\times n}\) donne un \meta{\(n\)}illion où
+% \meta{\(n\)} est remplacé par ``bi'' pour 2, ``tri'' pour 3,
+% etc. L'option \texttt{short} est incorrecte en Europe.
+%\end{tabularx}
+%Par défaut, l'option vaut \texttt{recursive}.
+%
+%\begin{definition}[\DescribeOption{n-illiard upto}]
+%\cs{fmtcountsetoptions}\verb"{french={n-illiard upto="\meta{n-illiard upto}\verb'}}'
+%\end{definition}
+%Cette option n'a de sens que si \texttt{scale} vaut
+%\texttt{long}. Certaines personnes préfèrent dire ``mille
+%\meta{$n$}illions'' qu'un ``\meta{$n$}illiard''. Mettre l'option
+%\texttt{n-illiard upto} à:\newline
+%\begin{tabularx}{\linewidth}{lX}
+% \pkgopt{infinity}& pour que \(10^{6\times n +3}\) donne
+% \meta{$n$}illiards pour tout \(n>0\),\\
+% \pkgopt{infty}& même effet que \texttt{infinity}, \\
+% \(k\)& où \(k\) est un entier quelconque strictement positif, dans
+% ce cas \(10^{6\times n +3}\) donne ``mille \meta{\(n\)}illions''
+% lorsque \(n>k\), et donne ``\meta{\(n\)}illiard'' sinon\\
+%\end{tabularx}
+%
+%\begin{definition}[\DescribeOption{mil plural mark}]
+%\cs{fmtcountsetoptions}\verb"{french={mil plural mark="\meta{any text}\verb'}}'
+%\end{definition}
+%La valeur par défaut de cette option est \og\texttt{le}\fg. Il s'agit de la terminaison ajoutée à \og
+%mil\fg\ pour former le pluriel, c'est à dire \og mille\fg, cette option ne sert pas à grand chose sauf dans
+%l'éventualité où ce pluriel serait francisé un jour --- à dire vrai si cela se produisait une alternance
+%mille/milles est plus vraisemblable, car \og mille\fg\ est plus fréquent que \og mille\fg\ et que les
+%pluriels francisés sont formés en ajoutant \og s\fg\ à la forme la plus fréquente, par exemple \og
+%blini/blinis\fg, alors que \og blini\fg\ veut dire \og crêpes\fg\ (au pluriel).
+%
+%
+%\selectlanguage{english}
+%
+%%\subsection{Prefixes}
+%%\label{sec:latin-prefixes}
+%%
+%%\begin{definition}[\DescribeMacro{\latinnumeralstring}]
+%%\cs{latinnumeralstring}\marg{counter}\oarg{prefix options}
+%%\end{definition}
+%%
+%%\begin{definition}[\DescribeMacro{\latinnumeralstringnum}]
+%%\cs{latinnumeralstringnum}\marg{number}\oarg{prefix options}
+%%\end{definition}
+%
+%
+%\section{Configuration File \texttt{fmtcount.cfg}}
+%
+%You can save your preferred default settings to a file called
+%\texttt{fmtcount.cfg}, and place it on the \TeX\ path. These
+%settings will then be loaded by the \sty{fmtcount}
+%package.
+%
+%Note that if you are using the \sty{datetime} package,
+%the \texttt{datetime.cfg} configuration file will override
+%the \texttt{fmtcount.cfg} configuration file.
+%For example, if \texttt{datetime.cfg} has the line:
+%\begin{verbatim}
+%\renewcommand{\fmtord}[1]{\textsuperscript{\underline{#1}}}
+%\end{verbatim}
+%and if \texttt{fmtcount.cfg} has the line:
+%\begin{verbatim}
+%\fmtcountsetoptions{fmtord=level}
+%\end{verbatim}
+%then the former definition of \cs{fmtord} will take
+%precedence.
+%
+%\section{LaTeX2HTML style}
+%
+%The \LaTeX2HTML\ style file \texttt{fmtcount.perl} is provided.
+%The following limitations apply:
+%
+%\begin{itemize}
+%\item \cs{padzeroes} only has an effect in the preamble.
+%
+%\item The configuration file
+%\texttt{fmtcount.cfg} is currently ignored. (This is because
+%I can't work out the correct code to do this. If you
+%know how to do this, please let me know.) You can however
+%do:
+%\begin{verbatim}
+%\usepackage{fmtcount}
+%\html{\input{fmtcount.cfg}}
+%\end{verbatim}
+%This, I agree, is an unpleasant cludge.
+%
+%\end{itemize}
+%
+%\section{Acknowledgements}
+%
+%I would like to thank all the people who have provided translations.
+%
+%\section{Troubleshooting}
+%
+%There is a FAQ available at:
+%\url{http://theoval.cmp.uea.ac.uk/~nlct/latex/packages/faq/}.
+%
+%Bug reporting should be done via the Github issue manager at:
+%\url{https://github.com/nlct/fmtcount/issues/}.
+%
+%
+%% Local Variables:
+%% coding: utf-8
+%% End:
+%
+%\StopEventually{}
+%\section{The Code}
+%\iffalse
+% \begin{macrocode}
+%<*fc-american.def>
+% \end{macrocode}
+%\fi
+% \subsection{Language definition files}
+% \subsubsection{fc-american.def}
+% American English definitions
+% \begin{macrocode}
+\ProvidesFCLanguage{american}[2016/01/12]%
+% \end{macrocode}
+% Loaded fc-USenglish.def if not already loaded
+% \begin{macrocode}
+\FCloadlang{USenglish}%
+% \end{macrocode}
+% These are all just synonyms for the commands provided by
+% \styfmt{fc-USenglish.def}.
+% \begin{macrocode}
+\global\let\@ordinalMamerican\@ordinalMUSenglish
+\global\let\@ordinalFamerican\@ordinalMUSenglish
+\global\let\@ordinalNamerican\@ordinalMUSenglish
+\global\let\@numberstringMamerican\@numberstringMUSenglish
+\global\let\@numberstringFamerican\@numberstringMUSenglish
+\global\let\@numberstringNamerican\@numberstringMUSenglish
+\global\let\@NumberstringMamerican\@NumberstringMUSenglish
+\global\let\@NumberstringFamerican\@NumberstringMUSenglish
+\global\let\@NumberstringNamerican\@NumberstringMUSenglish
+\global\let\@ordinalstringMamerican\@ordinalstringMUSenglish
+\global\let\@ordinalstringFamerican\@ordinalstringMUSenglish
+\global\let\@ordinalstringNamerican\@ordinalstringMUSenglish
+\global\let\@OrdinalstringMamerican\@OrdinalstringMUSenglish
+\global\let\@OrdinalstringFamerican\@OrdinalstringMUSenglish
+\global\let\@OrdinalstringNamerican\@OrdinalstringMUSenglish
+% \end{macrocode}
+\iffalse Local variables: \fi
+\iffalse mode: docTeX \fi
+\iffalse End: \fi
+%\iffalse
+% \begin{macrocode}
+%</fc-american.def>
+% \end{macrocode}
+%\fi
+%\iffalse
+% \begin{macrocode}
+%<*fc-brazilian.def>
+% \end{macrocode}
+%\fi
+% \subsubsection{fc-brazilian.def}
+% Brazilian definitions.
+% \begin{macrocode}
+\ProvidesFCLanguage{brazilian}[2017/12/26]%
+% \end{macrocode}
+% Load \sty{fc-portuges.def} if not already loaded.
+% \begin{macrocode}
+\FCloadlang{portuges}%
+% \end{macrocode}
+% Set |brazilian| to be equivalent to |portuges| for all the numeral ordinals, and string ordinals.
+% \begin{macrocode}
+\global\let\@ordinalMbrazilian=\@ordinalMportuges
+\global\let\@ordinalFbrazilian=\@ordinalFportuges
+\global\let\@ordinalNbrazilian=\@ordinalNportuges
+\global\let\@ordinalstringFbrazilian\@ordinalstringFportuges
+\global\let\@ordinalstringMbrazilian\@ordinalstringMportuges
+\global\let\@ordinalstringNbrazilian\@ordinalstringMportuges
+\global\let\@OrdinalstringMbrazilian\@OrdinalstringMportuges
+\global\let\@OrdinalstringFbrazilian\@OrdinalstringFportuges
+\global\let\@OrdinalstringNbrazilian\@OrdinalstringMportuges
+% \end{macrocode}
+% Convert a number to a textual representation. To make it easier, split it up into units, tens, teens and
+% hundreds. Units, tens, and hundreds are the same as for |portuges| and are not redefined, only the teens are
+% Brazilian specific.\\
+% Teens (argument must be a number from 0 to 9):
+% \begin{macrocode}
+\newcommand*\@@teenstringbrazilian[1]{%
+ \ifcase#1\relax
+ dez%
+ \or onze%
+ \or doze%
+ \or treze%
+ \or quatorze%
+ \or quinze%
+ \or dezesseis%
+ \or dezessete%
+ \or dezoito%
+ \or dezenove%
+ \fi
+}%
+\global\let\@@teenstringbrazilian\@@teenstringbrazilian
+% \end{macrocode}
+% Teens (with initial letter in upper case):
+% \begin{macrocode}
+\newcommand*\@@Teenstringbrazilian[1]{%
+ \ifcase#1\relax
+ Dez%
+ \or Onze%
+ \or Doze%
+ \or Treze%
+ \or Quatorze%
+ \or Quinze%
+ \or Dezesseis%
+ \or Dezessete%
+ \or Dezoito%
+ \or Dezenove%
+ \fi
+}%
+\global\let\@@Teenstringbrazilian\@@Teenstringbrazilian
+% \end{macrocode}
+% This has changed in version 1.08, so that it now stores
+% the result in the second argument, but doesn't display
+% anything. Since it only affects internal macros, it shouldn't
+% affect documents created with older versions. (These internal
+% macros are not meant for use in documents.)
+% \changes{3.02}{2016/01/12}{Replace \cs{DeclareRobustCommand} by
+% \cs{newcommand*} as robustness is handled now at top level in
+% \texttt{fmtcount.sty}, and we don't need \cs{long} macros. Concerned macros
+% are \cs{@numberstringMbrazilian}, \cs{@numberstringFbrazilian},
+% \cs{@NumberstringMbrazilian}, \cs{@NumberstringFbrazilian},
+% \cs{@ordinalstringMbrazilian}, \cs{@ordinalstringFbrazilian},
+% \cs{@OrdinalstringMbrazilian}, and \cs{@OrdinalstringFbrazilian}.}
+% \changes{3.03}{2017/07/21}{Fix bug
+% \#\href{https://github.com/nlct/fmtcount/issues/25}{25}.}
+% \begin{macrocode}
+\newcommand*{\@numberstringMbrazilian}[2]{%
+ \let\@unitstring=\@@unitstringportuges
+ \let\@teenstring=\@@teenstringbrazilian
+ \let\@tenstring=\@@tenstringportuges
+ \let\@hundredstring=\@@hundredstringportuges
+ \def\@hundred{cem}\def\@thousand{mil}%
+ \def\@andname{e}%
+ \@@numberstringportuges{#1}{#2}%
+}%
+\global\let\@numberstringMbrazilian\@numberstringMbrazilian
+% \end{macrocode}
+% As above, but feminine form:
+% \begin{macrocode}
+\newcommand*{\@numberstringFbrazilian}[2]{%
+ \let\@unitstring=\@@unitstringFportuges
+ \let\@teenstring=\@@teenstringbrazilian
+ \let\@tenstring=\@@tenstringportuges
+ \let\@hundredstring=\@@hundredstringFportuges
+ \def\@hundred{cem}\def\@thousand{mil}%
+ \def\@andname{e}%
+ \@@numberstringportuges{#1}{#2}%
+}%
+\global\let\@numberstringFbrazilian\@numberstringFbrazilian
+% \end{macrocode}
+% Make neuter same as masculine:
+% \begin{macrocode}
+\global\let\@numberstringNbrazilian\@numberstringMbrazilian
+% \end{macrocode}
+% As above, but initial letters in upper case:
+% \begin{macrocode}
+\newcommand*{\@NumberstringMbrazilian}[2]{%
+ \let\@unitstring=\@@unitstringportuges
+ \let\@teenstring=\@@Teenstringbrazilian
+ \let\@tenstring=\@@Tenstringportuges
+ \let\@hundredstring=\@@hundredstringportuges
+ \def\@hundred{Cem}\def\@thousand{Mil}%
+ \def\@andname{e}%
+ \@@numberstringportuges{#1}{#2}%
+}%
+\global\let\@NumberstringMbrazilian\@NumberstringMbrazilian
+% \end{macrocode}
+% As above, but feminine form:
+% \begin{macrocode}
+\newcommand*{\@NumberstringFbrazilian}[2]{%
+ \let\@unitstring=\@@UnitstringFportuges
+ \let\@teenstring=\@@Teenstringbrazilian
+ \let\@tenstring=\@@Tenstringportuges
+ \let\@hundredstring=\@@HundredstringFportuges
+ \def\@hundred{Cem}\def\@thousand{Mil}%
+ \def\@andname{e}%
+ \@@numberstringportuges{#1}{#2}%
+}%
+\global\let\@NumberstringFbrazilian\@NumberstringFbrazilian
+% \end{macrocode}
+% Make neuter same as masculine:
+% \begin{macrocode}
+\global\let\@NumberstringNbrazilian\@NumberstringMbrazilian
+% \end{macrocode}
+\iffalse Local variables: \fi
+\iffalse mode: docTeX \fi
+\iffalse End: \fi
+%\iffalse
+% \begin{macrocode}
+%</fc-brazilian.def>
+% \end{macrocode}
+%\fi
+%\iffalse
+% \begin{macrocode}
+%<*fc-british.def>
+% \end{macrocode}
+%\fi
+% \subsubsection{fc-british.def}
+% British definitions
+% \begin{macrocode}
+\ProvidesFCLanguage{british}[2013/08/17]%
+% \end{macrocode}
+% Load fc-english.def, if not already loaded
+% \begin{macrocode}
+\FCloadlang{english}%
+% \end{macrocode}
+% These are all just synonyms for the commands provided by
+% fc-english.def.
+% \begin{macrocode}
+\global\let\@ordinalMbritish\@ordinalMenglish
+\global\let\@ordinalFbritish\@ordinalMenglish
+\global\let\@ordinalNbritish\@ordinalMenglish
+\global\let\@numberstringMbritish\@numberstringMenglish
+\global\let\@numberstringFbritish\@numberstringMenglish
+\global\let\@numberstringNbritish\@numberstringMenglish
+\global\let\@NumberstringMbritish\@NumberstringMenglish
+\global\let\@NumberstringFbritish\@NumberstringMenglish
+\global\let\@NumberstringNbritish\@NumberstringMenglish
+\global\let\@ordinalstringMbritish\@ordinalstringMenglish
+\global\let\@ordinalstringFbritish\@ordinalstringMenglish
+\global\let\@ordinalstringNbritish\@ordinalstringMenglish
+\global\let\@OrdinalstringMbritish\@OrdinalstringMenglish
+\global\let\@OrdinalstringFbritish\@OrdinalstringMenglish
+\global\let\@OrdinalstringNbritish\@OrdinalstringMenglish
+% \end{macrocode}
+%\iffalse
+% \begin{macrocode}
+%</fc-british.def>
+% \end{macrocode}
+%\fi
+%\iffalse
+% \begin{macrocode}
+%<*fc-english.def>
+% \end{macrocode}
+%\fi
+% \subsubsection{fc-english.def}
+% English definitions
+% \begin{macrocode}
+\ProvidesFCLanguage{english}[2016/01/12]%
+% \end{macrocode}
+% Define macro that converts a number or count register (first
+% argument) to an ordinal, and stores the result in the
+% second argument, which should be a control sequence.
+% \begin{macrocode}
+\newcommand*\@ordinalMenglish[2]{%
+\def\@fc@ord{}%
+\@orgargctr=#1\relax
+\@ordinalctr=#1%
+\@FCmodulo{\@ordinalctr}{100}%
+\ifnum\@ordinalctr=11\relax
+ \def\@fc@ord{th}%
+\else
+ \ifnum\@ordinalctr=12\relax
+ \def\@fc@ord{th}%
+ \else
+ \ifnum\@ordinalctr=13\relax
+ \def\@fc@ord{th}%
+ \else
+ \@FCmodulo{\@ordinalctr}{10}%
+ \ifcase\@ordinalctr
+ \def\@fc@ord{th}% case 0
+ \or \def\@fc@ord{st}% case 1
+ \or \def\@fc@ord{nd}% case 2
+ \or \def\@fc@ord{rd}% case 3
+ \else
+ \def\@fc@ord{th}% default case
+ \fi
+ \fi
+ \fi
+\fi
+\edef#2{\number#1\relax\noexpand\fmtord{\@fc@ord}}%
+}%
+\global\let\@ordinalMenglish\@ordinalMenglish
+% \end{macrocode}
+% There is no gender difference in English, so make feminine and
+% neuter the same as the masculine.
+% \begin{macrocode}
+\global\let\@ordinalFenglish=\@ordinalMenglish
+\global\let\@ordinalNenglish=\@ordinalMenglish
+% \end{macrocode}
+% Define the macro that prints the value of a \TeX\ count register
+% as text. To make it easier, break it up into units, teens and
+% tens. First, the units: the argument should be between 0 and 9
+% inclusive.
+% \begin{macrocode}
+\newcommand*\@@unitstringenglish[1]{%
+ \ifcase#1\relax
+ zero%
+ \or one%
+ \or two%
+ \or three%
+ \or four%
+ \or five%
+ \or six%
+ \or seven%
+ \or eight%
+ \or nine%
+\fi
+}%
+\global\let\@@unitstringenglish\@@unitstringenglish
+% \end{macrocode}
+% Next the tens, again the argument should be between 0 and 9
+% inclusive.
+% \begin{macrocode}
+\newcommand*\@@tenstringenglish[1]{%
+ \ifcase#1\relax
+ \or ten%
+ \or twenty%
+ \or thirty%
+ \or forty%
+ \or fifty%
+ \or sixty%
+ \or seventy%
+ \or eighty%
+ \or ninety%
+ \fi
+}%
+\global\let\@@tenstringenglish\@@tenstringenglish
+% \end{macrocode}
+% Finally the teens, again the argument should be between 0 and 9
+% inclusive.
+% \begin{macrocode}
+\newcommand*\@@teenstringenglish[1]{%
+ \ifcase#1\relax
+ ten%
+ \or eleven%
+ \or twelve%
+ \or thirteen%
+ \or fourteen%
+ \or fifteen%
+ \or sixteen%
+ \or seventeen%
+ \or eighteen%
+ \or nineteen%
+ \fi
+}%
+\global\let\@@teenstringenglish\@@teenstringenglish
+% \end{macrocode}
+% As above, but with the initial letter in uppercase. The units:
+% \begin{macrocode}
+\newcommand*\@@Unitstringenglish[1]{%
+ \ifcase#1\relax
+ Zero%
+ \or One%
+ \or Two%
+ \or Three%
+ \or Four%
+ \or Five%
+ \or Six%
+ \or Seven%
+ \or Eight%
+ \or Nine%
+ \fi
+}%
+\global\let\@@Unitstringenglish\@@Unitstringenglish
+% \end{macrocode}
+% The tens:
+% \begin{macrocode}
+\newcommand*\@@Tenstringenglish[1]{%
+ \ifcase#1\relax
+ \or Ten%
+ \or Twenty%
+ \or Thirty%
+ \or Forty%
+ \or Fifty%
+ \or Sixty%
+ \or Seventy%
+ \or Eighty%
+ \or Ninety%
+ \fi
+}%
+\global\let\@@Tenstringenglish\@@Tenstringenglish
+% \end{macrocode}
+% The teens:
+% \begin{macrocode}
+\newcommand*\@@Teenstringenglish[1]{%
+ \ifcase#1\relax
+ Ten%
+ \or Eleven%
+ \or Twelve%
+ \or Thirteen%
+ \or Fourteen%
+ \or Fifteen%
+ \or Sixteen%
+ \or Seventeen%
+ \or Eighteen%
+ \or Nineteen%
+ \fi
+}%
+\global\let\@@Teenstringenglish\@@Teenstringenglish
+% \end{macrocode}
+% This has changed in version 1.09, so that it now stores
+% the result in the second argument, but doesn't display anything.
+% Since it only affects internal macros, it shouldn't affect
+% documents created with older versions. (These internal macros are
+% not meant for use in documents.)
+% \begin{macrocode}
+\newcommand*\@@numberstringenglish[2]{%
+\ifnum#1>99999
+\PackageError{fmtcount}{Out of range}%
+{This macro only works for values less than 100000}%
+\else
+\ifnum#1<0
+\PackageError{fmtcount}{Negative numbers not permitted}%
+{This macro does not work for negative numbers, however
+you can try typing "minus" first, and then pass the modulus of
+this number}%
+\fi
+\fi
+\def#2{}%
+\@strctr=#1\relax \divide\@strctr by 1000\relax
+\ifnum\@strctr>9
+ \divide\@strctr by 10
+ \ifnum\@strctr>1\relax
+ \let\@@fc@numstr#2\relax
+ \edef#2{\@@fc@numstr\@tenstring{\@strctr}}%
+ \@strctr=#1 \divide\@strctr by 1000\relax
+ \@FCmodulo{\@strctr}{10}%
+ \ifnum\@strctr>0\relax
+ \let\@@fc@numstr#2\relax
+ \edef#2{\@@fc@numstr-\@unitstring{\@strctr}}%
+ \fi
+ \else
+ \@strctr=#1\relax
+ \divide\@strctr by 1000\relax
+ \@FCmodulo{\@strctr}{10}%
+ \let\@@fc@numstr#2\relax
+ \edef#2{\@@fc@numstr\@teenstring{\@strctr}}%
+ \fi
+ \let\@@fc@numstr#2\relax
+ \edef#2{\@@fc@numstr\ \@thousand}%
+\else
+ \ifnum\@strctr>0\relax
+ \let\@@fc@numstr#2\relax
+ \edef#2{\@@fc@numstr\@unitstring{\@strctr}\ \@thousand}%
+ \fi
+\fi
+\@strctr=#1\relax \@FCmodulo{\@strctr}{1000}%
+\divide\@strctr by 100
+\ifnum\@strctr>0\relax
+ \ifnum#1>1000\relax
+ \let\@@fc@numstr#2\relax
+ \edef#2{\@@fc@numstr\ }%
+ \fi
+ \let\@@fc@numstr#2\relax
+ \edef#2{\@@fc@numstr\@unitstring{\@strctr}\ \@hundred}%
+\fi
+\@strctr=#1\relax \@FCmodulo{\@strctr}{100}%
+\ifnum#1>100\relax
+ \ifnum\@strctr>0\relax
+ \let\@@fc@numstr#2\relax
+ \edef#2{\@@fc@numstr\ \@andname\ }%
+ \fi
+\fi
+\ifnum\@strctr>19\relax
+ \divide\@strctr by 10\relax
+ \let\@@fc@numstr#2\relax
+ \edef#2{\@@fc@numstr\@tenstring{\@strctr}}%
+ \@strctr=#1\relax \@FCmodulo{\@strctr}{10}%
+ \ifnum\@strctr>0\relax
+ \let\@@fc@numstr#2\relax
+ \edef#2{\@@fc@numstr-\@unitstring{\@strctr}}%
+ \fi
+\else
+ \ifnum\@strctr<10\relax
+ \ifnum\@strctr=0\relax
+ \ifnum#1<100\relax
+ \let\@@fc@numstr#2\relax
+ \edef#2{\@@fc@numstr\@unitstring{\@strctr}}%
+ \fi
+ \else
+ \let\@@fc@numstr#2\relax
+ \edef#2{\@@fc@numstr\@unitstring{\@strctr}}%
+ \fi
+ \else
+ \@FCmodulo{\@strctr}{10}%
+ \let\@@fc@numstr#2\relax
+ \edef#2{\@@fc@numstr\@teenstring{\@strctr}}%
+ \fi
+\fi
+}%
+\global\let\@@numberstringenglish\@@numberstringenglish
+% \end{macrocode}
+% All lower case version, the second argument must be a control
+% sequence.%
+% \changes{3.02}{2016/01/12}{Replace \cs{DeclareRobustCommand} by
+% \cs{newcommand*} as robustness is handled now at top level in
+% \texttt{fmtcount.sty}, and we don't need \cs{long} macros. Concerned
+% macros are \cs{@numberstringMenglish}, \cs{@ordinalstringMenglish},
+% and \cs{@OrdinalstringMenglish}}
+% \begin{macrocode}
+\newcommand*{\@numberstringMenglish}[2]{%
+ \let\@unitstring=\@@unitstringenglish
+ \let\@teenstring=\@@teenstringenglish
+ \let\@tenstring=\@@tenstringenglish
+ \def\@hundred{hundred}\def\@thousand{thousand}%
+ \def\@andname{and}%
+ \@@numberstringenglish{#1}{#2}%
+}%
+\global\let\@numberstringMenglish\@numberstringMenglish
+% \end{macrocode}
+% There is no gender in English, so make feminine and neuter the
+% same
+% as the masculine.
+% \begin{macrocode}
+\global\let\@numberstringFenglish=\@numberstringMenglish
+\global\let\@numberstringNenglish=\@numberstringMenglish
+% \end{macrocode}
+% This version makes the first letter of each word an uppercase
+% character (except ``and''). The second argument must be a control
+% sequence.
+% \begin{macrocode}
+\newcommand*\@NumberstringMenglish[2]{%
+ \let\@unitstring=\@@Unitstringenglish
+ \let\@teenstring=\@@Teenstringenglish
+ \let\@tenstring=\@@Tenstringenglish
+ \def\@hundred{Hundred}\def\@thousand{Thousand}%
+ \def\@andname{and}%
+ \@@numberstringenglish{#1}{#2}%
+}%
+\global\let\@NumberstringMenglish\@NumberstringMenglish
+% \end{macrocode}
+% There is no gender in English, so make feminine and neuter the
+% same
+% as the masculine.
+% \begin{macrocode}
+\global\let\@NumberstringFenglish=\@NumberstringMenglish
+\global\let\@NumberstringNenglish=\@NumberstringMenglish
+% \end{macrocode}
+% Define a macro that produces an ordinal as a string. Again, break
+% it up into units, teens and tens. First the units:
+% \begin{macrocode}
+\newcommand*\@@unitthstringenglish[1]{%
+ \ifcase#1\relax
+ zeroth%
+ \or first%
+ \or second%
+ \or third%
+ \or fourth%
+ \or fifth%
+ \or sixth%
+ \or seventh%
+ \or eighth%
+ \or ninth%
+ \fi
+}%
+\global\let\@@unitthstringenglish\@@unitthstringenglish
+% \end{macrocode}
+% Next the tens:
+% \begin{macrocode}
+\newcommand*\@@tenthstringenglish[1]{%
+ \ifcase#1\relax
+ \or tenth%
+ \or twentieth%
+ \or thirtieth%
+ \or fortieth%
+ \or fiftieth%
+ \or sixtieth%
+ \or seventieth%
+ \or eightieth%
+ \or ninetieth%
+ \fi
+}%
+\global\let\@@tenthstringenglish\@@tenthstringenglish
+% \end{macrocode}
+% The teens:
+% \begin{macrocode}
+\newcommand*\@@teenthstringenglish[1]{%
+ \ifcase#1\relax
+ tenth%
+ \or eleventh%
+ \or twelfth%
+ \or thirteenth%
+ \or fourteenth%
+ \or fifteenth%
+ \or sixteenth%
+ \or seventeenth%
+ \or eighteenth%
+ \or nineteenth%
+ \fi
+}%
+\global\let\@@teenthstringenglish\@@teenthstringenglish
+% \end{macrocode}
+% As before, but with the first letter in upper case. The units:
+% \begin{macrocode}
+\newcommand*\@@Unitthstringenglish[1]{%
+ \ifcase#1\relax
+ Zeroth%
+ \or First%
+ \or Second%
+ \or Third%
+ \or Fourth%
+ \or Fifth%
+ \or Sixth%
+ \or Seventh%
+ \or Eighth%
+ \or Ninth%
+ \fi
+}%
+\global\let\@@Unitthstringenglish\@@Unitthstringenglish
+% \end{macrocode}
+% The tens:
+% \begin{macrocode}
+\newcommand*\@@Tenthstringenglish[1]{%
+ \ifcase#1\relax
+ \or Tenth%
+ \or Twentieth%
+ \or Thirtieth%
+ \or Fortieth%
+ \or Fiftieth%
+ \or Sixtieth%
+ \or Seventieth%
+ \or Eightieth%
+ \or Ninetieth%
+ \fi
+}%
+\global\let\@@Tenthstringenglish\@@Tenthstringenglish
+% \end{macrocode}
+% The teens:
+% \begin{macrocode}
+\newcommand*\@@Teenthstringenglish[1]{%
+ \ifcase#1\relax
+ Tenth%
+ \or Eleventh%
+ \or Twelfth%
+ \or Thirteenth%
+ \or Fourteenth%
+ \or Fifteenth%
+ \or Sixteenth%
+ \or Seventeenth%
+ \or Eighteenth%
+ \or Nineteenth%
+ \fi
+}%
+\global\let\@@Teenthstringenglish\@@Teenthstringenglish
+% \end{macrocode}
+% Again, as from version 1.09, this has been changed to take two
+% arguments, where the second argument is a control sequence.
+% The resulting text is stored in the control sequence, and nothing
+% is displayed.
+% \begin{macrocode}
+\newcommand*\@@ordinalstringenglish[2]{%
+\@strctr=#1\relax
+\ifnum#1>99999
+\PackageError{fmtcount}{Out of range}%
+{This macro only works for values less than 100000 (value given: \number\@strctr)}%
+\else
+\ifnum#1<0
+\PackageError{fmtcount}{Negative numbers not permitted}%
+{This macro does not work for negative numbers, however
+you can try typing "minus" first, and then pass the modulus of
+this number}%
+\fi
+\def#2{}%
+\fi
+\@strctr=#1\relax \divide\@strctr by 1000\relax
+\ifnum\@strctr>9\relax
+% \end{macrocode}
+% \#1 is greater or equal to 10000
+% \begin{macrocode}
+ \divide\@strctr by 10
+ \ifnum\@strctr>1\relax
+ \let\@@fc@ordstr#2\relax
+ \edef#2{\@@fc@ordstr\@tenstring{\@strctr}}%
+ \@strctr=#1\relax
+ \divide\@strctr by 1000\relax
+ \@FCmodulo{\@strctr}{10}%
+ \ifnum\@strctr>0\relax
+ \let\@@fc@ordstr#2\relax
+ \edef#2{\@@fc@ordstr-\@unitstring{\@strctr}}%
+ \fi
+ \else
+ \@strctr=#1\relax \divide\@strctr by 1000\relax
+ \@FCmodulo{\@strctr}{10}%
+ \let\@@fc@ordstr#2\relax
+ \edef#2{\@@fc@ordstr\@teenstring{\@strctr}}%
+ \fi
+ \@strctr=#1\relax \@FCmodulo{\@strctr}{1000}%
+ \ifnum\@strctr=0\relax
+ \let\@@fc@ordstr#2\relax
+ \edef#2{\@@fc@ordstr\ \@thousandth}%
+ \else
+ \let\@@fc@ordstr#2\relax
+ \edef#2{\@@fc@ordstr\ \@thousand}%
+ \fi
+\else
+ \ifnum\@strctr>0\relax
+ \let\@@fc@ordstr#2\relax
+ \edef#2{\@@fc@ordstr\@unitstring{\@strctr}}%
+ \@strctr=#1\relax \@FCmodulo{\@strctr}{1000}%
+ \let\@@fc@ordstr#2\relax
+ \ifnum\@strctr=0\relax
+ \edef#2{\@@fc@ordstr\ \@thousandth}%
+ \else
+ \edef#2{\@@fc@ordstr\ \@thousand}%
+ \fi
+ \fi
+\fi
+\@strctr=#1\relax \@FCmodulo{\@strctr}{1000}%
+\divide\@strctr by 100
+\ifnum\@strctr>0\relax
+ \ifnum#1>1000\relax
+ \let\@@fc@ordstr#2\relax
+ \edef#2{\@@fc@ordstr\ }%
+ \fi
+ \let\@@fc@ordstr#2\relax
+ \edef#2{\@@fc@ordstr\@unitstring{\@strctr}}%
+ \@strctr=#1\relax \@FCmodulo{\@strctr}{100}%
+ \let\@@fc@ordstr#2\relax
+ \ifnum\@strctr=0\relax
+ \edef#2{\@@fc@ordstr\ \@hundredth}%
+ \else
+ \edef#2{\@@fc@ordstr\ \@hundred}%
+ \fi
+\fi
+\@strctr=#1\relax \@FCmodulo{\@strctr}{100}%
+\ifnum#1>100\relax
+ \ifnum\@strctr>0\relax
+ \let\@@fc@ordstr#2\relax
+ \edef#2{\@@fc@ordstr\ \@andname\ }%
+ \fi
+\fi
+\ifnum\@strctr>19\relax
+ \@tmpstrctr=\@strctr
+ \divide\@strctr by 10\relax
+ \@FCmodulo{\@tmpstrctr}{10}%
+ \let\@@fc@ordstr#2\relax
+ \ifnum\@tmpstrctr=0\relax
+ \edef#2{\@@fc@ordstr\@tenthstring{\@strctr}}%
+ \else
+ \edef#2{\@@fc@ordstr\@tenstring{\@strctr}}%
+ \fi
+ \@strctr=#1\relax \@FCmodulo{\@strctr}{10}%
+ \ifnum\@strctr>0\relax
+ \let\@@fc@ordstr#2\relax
+ \edef#2{\@@fc@ordstr-\@unitthstring{\@strctr}}%
+ \fi
+\else
+ \ifnum\@strctr<10\relax
+ \ifnum\@strctr=0\relax
+ \ifnum#1<100\relax
+ \let\@@fc@ordstr#2\relax
+ \edef#2{\@@fc@ordstr\@unitthstring{\@strctr}}%
+ \fi
+ \else
+ \let\@@fc@ordstr#2\relax
+ \edef#2{\@@fc@ordstr\@unitthstring{\@strctr}}%
+ \fi
+ \else
+ \@FCmodulo{\@strctr}{10}%
+ \let\@@fc@ordstr#2\relax
+ \edef#2{\@@fc@ordstr\@teenthstring{\@strctr}}%
+ \fi
+\fi
+}%
+\global\let\@@ordinalstringenglish\@@ordinalstringenglish
+% \end{macrocode}
+% All lower case version. Again, the second argument must be a
+% control sequence in which the resulting text is stored.
+% \begin{macrocode}
+\newcommand*{\@ordinalstringMenglish}[2]{%
+ \let\@unitthstring=\@@unitthstringenglish
+ \let\@teenthstring=\@@teenthstringenglish
+ \let\@tenthstring=\@@tenthstringenglish
+ \let\@unitstring=\@@unitstringenglish
+ \let\@teenstring=\@@teenstringenglish
+ \let\@tenstring=\@@tenstringenglish
+ \def\@andname{and}%
+ \def\@hundred{hundred}\def\@thousand{thousand}%
+ \def\@hundredth{hundredth}\def\@thousandth{thousandth}%
+ \@@ordinalstringenglish{#1}{#2}%
+}%
+\global\let\@ordinalstringMenglish\@ordinalstringMenglish
+% \end{macrocode}
+% No gender in English, so make feminine and neuter same as
+% masculine:
+% \begin{macrocode}
+\global\let\@ordinalstringFenglish=\@ordinalstringMenglish
+\global\let\@ordinalstringNenglish=\@ordinalstringMenglish
+% \end{macrocode}
+% First letter of each word in upper case:
+% \begin{macrocode}
+\newcommand*{\@OrdinalstringMenglish}[2]{%
+ \let\@unitthstring=\@@Unitthstringenglish
+ \let\@teenthstring=\@@Teenthstringenglish
+ \let\@tenthstring=\@@Tenthstringenglish
+ \let\@unitstring=\@@Unitstringenglish
+ \let\@teenstring=\@@Teenstringenglish
+ \let\@tenstring=\@@Tenstringenglish
+ \def\@andname{and}%
+ \def\@hundred{Hundred}\def\@thousand{Thousand}%
+ \def\@hundredth{Hundredth}\def\@thousandth{Thousandth}%
+ \@@ordinalstringenglish{#1}{#2}%
+}%
+\global\let\@OrdinalstringMenglish\@OrdinalstringMenglish
+% \end{macrocode}
+% No gender in English, so make feminine and neuter same as
+% masculine:
+% \begin{macrocode}
+\global\let\@OrdinalstringFenglish=\@OrdinalstringMenglish
+\global\let\@OrdinalstringNenglish=\@OrdinalstringMenglish
+% \end{macrocode}
+\iffalse Local variables: \fi
+\iffalse mode: docTeX \fi
+\iffalse End: \fi
+%\iffalse
+% \begin{macrocode}
+%</fc-english.def>
+% \end{macrocode}
+%\fi
+%\iffalse
+% \begin{macrocode}
+%<*fc-francais.def>
+% \end{macrocode}
+%\fi
+% \subsubsection{fc-francais.def}
+% \begin{macrocode}
+\ProvidesFCLanguage{francais}[2013/08/17]%
+\FCloadlang{french}%
+% \end{macrocode}
+% Set |francais| to be equivalent to |french|.
+% \begin{macrocode}
+\global\let\@ordinalMfrancais=\@ordinalMfrench
+\global\let\@ordinalFfrancais=\@ordinalFfrench
+\global\let\@ordinalNfrancais=\@ordinalNfrench
+\global\let\@numberstringMfrancais=\@numberstringMfrench
+\global\let\@numberstringFfrancais=\@numberstringFfrench
+\global\let\@numberstringNfrancais=\@numberstringNfrench
+\global\let\@NumberstringMfrancais=\@NumberstringMfrench
+\global\let\@NumberstringFfrancais=\@NumberstringFfrench
+\global\let\@NumberstringNfrancais=\@NumberstringNfrench
+\global\let\@ordinalstringMfrancais=\@ordinalstringMfrench
+\global\let\@ordinalstringFfrancais=\@ordinalstringFfrench
+\global\let\@ordinalstringNfrancais=\@ordinalstringNfrench
+\global\let\@OrdinalstringMfrancais=\@OrdinalstringMfrench
+\global\let\@OrdinalstringFfrancais=\@OrdinalstringFfrench
+\global\let\@OrdinalstringNfrancais=\@OrdinalstringNfrench
+% \end{macrocode}
+
+%\iffalse
+% \begin{macrocode}
+%</fc-francais.def>
+% \end{macrocode}
+%\fi
+%\iffalse
+% \begin{macrocode}
+%<*fc-french.def>
+% \end{macrocode}
+%\fi
+% \subsubsection{fc-french.def}
+% Definitions for French.
+% \begin{macrocode}
+\ProvidesFCLanguage{french}[2017/06/15]%
+% \end{macrocode}
+% Package \styfmt{fcprefix} is needed to format the prefix \meta{$n$}
+% in \meta{$n$}illion or \meta{$n$}illiard. Big numbers were
+% developped based on reference: \uref
+% {http://www.alain.be/boece/noms\_de\_nombre.html}. Package \styfmt
+% {fcprefix} is now loaded by \styfmt{fmtcount}.
+%
+% First of all we define two macros \cs{fc@gl@let} and \cs{fc@gl@def}
+% used in place of \cs{let} and \cs{def} within options setting
+% macros. This way we can control from outside these macros whether
+% the respective \cs{let} or \cs{def} is group-local or global. By
+% default they are defined to be group-local.
+% \changes{3.02}{2016/01/12}{First of all, make command definitions, as well as
+% options initial setting global. That is mainly a matter of:
+% \protect\begin{itemize}
+% \protect\item using \cs{gdef} instead of \cs{def},
+% \protect\item using \cs{global}\cs{let} instead of \cs{let}, and
+% \protect\item following \cs{newcommand*}\cs{\meta{foo}} by \cs{global}\cs{let}\cs{\meta{foo}}\cs{\meta{foo}}.
+% \protect\item using \cs{fc@gl@let} and \cs{fc@gl@def} in place of \cs{let}
+% \protect\item and \cs{def} within options setting macros in order to make intial
+% \protect\item setting global.
+% \protect\end{itemize}
+% Second, replace any \cs{DeclareRobustCommand} by \cs{newcommand*}
+% }
+% \begin{macrocode}
+\ifcsundef{fc@gl@let}{\global\let\fc@gl@let\let}{\PackageError{fmtcount}{Command already defined}{Command
+\protect\fc@gl@let\space already defined.}}
+\ifcsundef{fc@gl@def}{\global\let\fc@gl@def\def}{\PackageError{fmtcount}{Command already defined}{Command
+\protect\fc@gl@def\space already defined.}}
+% \end{macrocode}
+%
+% Options for controlling plural mark. First of all we define some temporary macro \cs{fc@french@set@plural}
+% in order to factorize code that defines an plural mark option:\newline\noindent
+% \begin{tabularx}{\linewidth}{@{}>{\raggedleft\arraybackslash\ttfamily}rX@{}}
+% \#1&key name,\\
+% \#2&key value,\\
+% \#3&configuration index for `\texttt{reformed}', \\
+% \#4&configuration index for `\texttt{traditional}',\\
+% \#5&configuration index for `\texttt{reformed o}', and\\
+% \#6&configuration index for `\texttt{traditional o}'.
+% \end{tabularx}
+% \begin{macrocode}
+\gdef\fc@french@set@plural#1#2#3#4#5#6{%
+ \ifthenelse{\equal{#2}{reformed}}{%
+ \expandafter\fc@gl@def\csname fc@frenchoptions@#1@plural\endcsname{#3}%
+ }{%
+ \ifthenelse{\equal{#2}{traditional}}{%
+ \expandafter\fc@gl@def\csname fc@frenchoptions@#1@plural\endcsname{#4}%
+ }{%
+ \ifthenelse{\equal{#2}{reformed o}}{%
+ \expandafter\fc@gl@def\csname fc@frenchoptions@#1@plural\endcsname{#5}%
+ }{%
+ \ifthenelse{\equal{#2}{traditional o}}{%
+ \expandafter\fc@gl@def\csname fc@frenchoptions@#1@plural\endcsname{#6}%
+ }{%
+ \ifthenelse{\equal{#2}{always}}{%
+ \expandafter\fc@gl@def\csname fc@frenchoptions@#1@plural\endcsname{0}%
+ }{%
+ \ifthenelse{\equal{#2}{never}}{%
+ \expandafter\fc@gl@def\csname fc@frenchoptions@#1@plural\endcsname{1}%
+ }{%
+ \ifthenelse{\equal{#2}{multiple}}{%
+ \expandafter\fc@gl@def\csname fc@frenchoptions@#1@plural\endcsname{2}%
+ }{%
+ \ifthenelse{\equal{#2}{multiple g-last}}{%
+ \expandafter\fc@gl@def\csname fc@frenchoptions@#1@plural\endcsname{3}%
+ }{%
+ \ifthenelse{\equal{#2}{multiple l-last}}{%
+ \expandafter\fc@gl@def\csname fc@frenchoptions@#1@plural\endcsname{4}%
+ }{%
+ \ifthenelse{\equal{#2}{multiple lng-last}}{%
+ \expandafter\fc@gl@def\csname fc@frenchoptions@#1@plural\endcsname{5}%
+ }{%
+ \ifthenelse{\equal{#2}{multiple ng-last}}{%
+ \expandafter\fc@gl@def\csname fc@frenchoptions@#1@plural\endcsname{6}%
+ }{%
+ \PackageError{fmtcount}{Unexpected argument}{%
+ `#2' was unexpected: french option `#1 plural' expects `reformed', `traditional',
+ `reformed o', `traditional o', `always', `never', `multiple', `multiple g-last',
+ `multiple l-last', `multiple lng-last', or `multiple ng-last'.%
+ }}}}}}}}}}}}}%
+% \end{macrocode}
+% Now a shorthand \cs{@tempa} is defined just to define all the options controlling plural mark. This
+% shorthand takes into account that `\texttt{reformed}' and `\texttt{traditional}' have the same effect, and
+% so do `\texttt{reformed o}' and `\texttt{traditional o}'.
+% \begin{macrocode}
+\def\@tempa#1#2#3{%
+ \define@key{fcfrench}{#1 plural}[reformed]{%
+ \fc@french@set@plural{#1}{##1}{#2}{#2}{#3}{#3}%
+ }%
+% \end{macrocode}
+% Macro \cs{@tempb} takes a macro as argument, and makes its current
+% definition global. Like here it is useful when the macro name
+% contains non-letters, and we have to resort to the
+% \cs{csname}\ldots\cs{endcsname} construct.
+% \begin{macrocode}
+ \expandafter\@tempb\csname KV@fcfrench@#1 plural\endcsname
+}%
+\def\@tempb#1{%
+ \global\let#1#1
+}%
+\@tempa{vingt}{4}{5}
+\@tempa{cent}{4}{5}
+\@tempa{mil}{0}{0}
+\@tempa{n-illion}{2}{6}
+\@tempa{n-illiard}{2}{6}
+% \end{macrocode}
+% For option `\texttt{all plural}' we cannot use the \cs{@tempa} shorthand, because `\texttt{all plural}'
+% is just a multiplexer.
+% \begin{macrocode}
+\define@key{fcfrench}{all plural}[reformed]{%
+ \csname KV@fcfrench@vingt plural\endcsname{#1}%
+ \csname KV@fcfrench@cent plural\endcsname{#1}%
+ \csname KV@fcfrench@mil plural\endcsname{#1}%
+ \csname KV@fcfrench@n-illion plural\endcsname{#1}%
+ \csname KV@fcfrench@n-illiard plural\endcsname{#1}%
+}%
+\expandafter\@tempb\csname KV@fcfrench@all plural\endcsname
+% \end{macrocode}
+% Now options `\texttt{dash or space}', we have three possible key values:\newline\noindent
+% \begin{tabularx}{\linewidth}{@{}>{\raggedleft\arraybackslash\ttfamily}rX@{}}
+% traditional& use dash for numbers below 100, except when `et' is used, and space otherwise\\
+% reformed& reform of 1990, use dash except with million \& milliard, and suchlikes,
+% i.e. \meta{$n$}illion and \meta{$n$}illiard,\\
+% always& always use dashes to separate all words
+% \end{tabularx}
+% \begin{macrocode}
+\define@key{fcfrench}{dash or space}[reformed]{%
+ \ifthenelse{\equal{#1}{traditional}}{%
+ \let\fc@frenchoptions@supermillion@dos\space%
+ \let\fc@frenchoptions@submillion@dos\space
+ }{%
+ \ifthenelse{\equal{#1}{reformed}\or\equal{#1}{1990}}{%
+ \let\fc@frenchoptions@supermillion@dos\space
+ \def\fc@frenchoptions@submillion@dos{-}%
+ }{%
+ \ifthenelse{\equal{#1}{always}}{%
+ \def\fc@frenchoptions@supermillion@dos{-}%
+ \def\fc@frenchoptions@submillion@dos{-}%
+ }{%
+ \PackageError{fmtcount}{Unexpected argument}{%
+ French option `dash or space' expects `always', `reformed' or `traditional'
+ }
+ }%
+ }%
+ }%
+}%
+% \end{macrocode}
+% Option `\texttt{scale}', can take 3 possible values:\newline\noindent
+% \begin{tabularx}{\linewidth}{@{}>{\raggedleft\arraybackslash\ttfamily}rX@{}}
+% long& for which \meta{\(n\)}illions \& \meta{\(n\)}illiards are used with \(10^{6\times n} = 1
+% \textrm{\meta{$n$}}illion\), and \(10^{6\times n+3} = 1 \textrm{\meta{$n$}}illiard\)\\
+% short& for which \meta{$n$}illions only are used with \(10^{3\times n+3} = 1
+% \textrm{\meta{$n$}illion}\)\\
+% recursive& for which \(10^{18} = \textrm{un milliard de milliards}\)
+% \end{tabularx}
+% \begin{macrocode}
+\define@key{fcfrench}{scale}[recursive]{%
+ \ifthenelse{\equal{#1}{long}}{%
+ \let\fc@poweroften\fc@@pot@longscalefrench
+ }{%
+ \ifthenelse{\equal{#1}{recursive}}{%
+ \let\fc@poweroften\fc@@pot@recursivefrench
+ }{%
+ \ifthenelse{\equal{#1}{short}}{%
+ \let\fc@poweroften\fc@@pot@shortscalefrench
+ }{%
+ \PackageError{fmtcount}{Unexpected argument}{%
+ French option `scale' expects `long', `recursive' or `short'
+ }
+ }%
+ }%
+ }%
+}%
+% \end{macrocode}
+% Option `\texttt{n-illiard upto}' is ignored if `\texttt{scale}' is different from `\texttt{long}'. It can
+% take the following values:\newline\noindent
+% \begin{tabularx}{\linewidth}{@{}>{\raggedleft\arraybackslash\ttfamily}rX@{}}
+% infinity&in that case \meta{$n$}illard are never disabled,\\
+% infty&this is just a shorthand for `\texttt{infinity}', and\\
+% \textrm{\(n\)}& any integer that is such that \(n>0\), and that \(\forall k\in\mathbb{N}, k\geq n\),
+% number \(10^{6\times k+3}\) will be formatted as ``mille \meta{$n$}illions''
+% \end{tabularx}
+% \begin{macrocode}
+\define@key{fcfrench}{n-illiard upto}[infinity]{%
+ \ifthenelse{\equal{#1}{infinity}}{%
+ \def\fc@longscale@nilliard@upto{0}%
+ }{%
+ \ifthenelse{\equal{#1}{infty}}{%
+ \def\fc@longscale@nilliard@upto{0}%
+ }{%
+ \if Q\ifnum9<1#1Q\fi\else
+ \PackageError{fmtcount}{Unexpected argument}{%
+ French option `milliard threshold' expects `infinity', or equivalently `infty', or a non negative
+ integer.}%
+ \fi
+ \def\fc@longscale@nilliard@upto{#1}%
+ }}%
+}%
+% \end{macrocode}
+% Now, the options `\texttt{france}', `\texttt{swiss}' and `\texttt{belgian}' are defined to select the
+% dialect to use. Macro \cs{@tempa} is just a local shorthand to define each one of this option.
+% \begin{macrocode}
+\def\@tempa#1{%
+ \define@key{fcfrench}{#1}[]{%
+ \PackageError{fmtcount}{Unexpected argument}{French option with key `#1' does not take
+ any value}}%
+ \csgdef{KV@fcfrench@#1@default}{%
+ \fc@gl@def\fmtcount@french{#1}}%
+}%
+\@tempa{france}\@tempa{swiss}\@tempa{belgian}%
+% \end{macrocode}
+% Make `\texttt{france}' the default dialect for `\texttt{french}' language
+% \changes{3.01}{2014-12-18}{Move French specific stuff from \styfmt{fmtcount.sty} to \styfmt{fc-french.def}.}
+% \begin{macrocode}
+\gdef\fmtcount@french{france}%
+% \end{macrocode}
+% Now, option `\texttt{dialect}' is now defined so that `\texttt{france}', `\texttt{swiss}' and
+% `\texttt{belgian}' can also be used as key values, which is more conventional although less concise.
+% \begin{macrocode}
+\define@key{fcfrench}{dialect}[france]{%
+ \ifthenelse{\equal{#1}{france}
+ \or\equal{#1}{swiss}
+ \or\equal{#1}{belgian}}{%
+ \def\fmtcount@french{#1}}{%
+ \PackageError{fmtcount}{Invalid value `#1' to french option dialect key}
+ {Option `french' can only take the values `france',
+ `belgian' or `swiss'}}}%
+\expandafter\@tempb\csname KV@fcfrench@dialect\endcsname
+% \end{macrocode}
+% The option \texttt{mil plural mark} allows to make the plural of \texttt{mil} to be regular,
+% i.e. \texttt{mils}, instead of \texttt{mille}. By default it is `\texttt{le}'.
+% \begin{macrocode}
+\define@key{fcfrench}{mil plural mark}[le]{%
+ \def\fc@frenchoptions@mil@plural@mark{#1}}
+\expandafter\@tempb\csname KV@fcfrench@mil plural mark\endcsname
+% \end{macrocode}
+% Definition of case handling macros. This should be moved somewhere else to be commonalized between all
+% languages.\newline
+% \DescribeMacro{\fc@UpperCaseFirstLetter}The macro \cs{fc@UpperCaseFirstLetter} is such that
+% \cs{fc@UpperCaseFirstLetter}\meta{word}\cs{@nil} expands to \cs{word} with first letter capitalized and
+% remainder unchanged.
+% \begin{macrocode}
+\gdef\fc@UpperCaseFirstLetter#1#2\@nil{%
+ \uppercase{#1}#2}
+% \end{macrocode}
+% \DescribeMacro{\fc@CaseIden}The macro \cs{fc@CaseIden} is such that \cs{fc@CaseIden}\meta{word}\cs{@nil}
+% expands to \cs{word} unchanged.
+% \begin{macrocode}
+\gdef\fc@CaseIden#1\@nil{%
+ #1%
+}%
+% \end{macrocode}
+% \DescribeMacro{\fc@UpperCaseAll}The macro \cs{fc@UpperCaseAll} is such that \cs{fc@UpperCaseAll}\meta{word}\cs{@nil}
+% expands to \cs{word} all capitalized.
+% \begin{macrocode}
+\gdef\fc@UpperCaseAll#1\@nil{%
+ \uppercase{#1}%
+}%
+% \end{macrocode}
+% \DescribeMacro{\fc@wcase}The macro \cs{fc@wcase} is the capitalizing macro for word-by-word
+% capitalization. By default we set it to identity, ie.\ no capitalization.
+% \begin{macrocode}
+\global\let\fc@wcase\fc@CaseIden
+% \end{macrocode}
+% \DescribeMacro{\fc@gcase}The macro \cs{fc@gcase} is the capitalizing macro for global (the completed number)
+% capitalization. By default we set it to identity, ie.\ no capitalization.
+% \changes{3.02}{2017/06/15}{Create new macro \cs{fc@gcase} for solving
+% \uref{http://github.com/nlct/fmtcount/issues/24}{Issue \#24} about capitalization in French.}
+% \begin{macrocode}
+\global\let\fc@gcase\fc@CaseIden
+% \end{macrocode}
+% \DescribeMacro{\fc@apply@gcase}The macro \cs{fc@apply@gcase} simply applies \cs{fc@gcase} to \cs{@tempa},
+% knowing that \cs{@tempa} is the macro containing the result of formatting.
+% \begin{macrocode}
+\gdef\fc@apply@gcase{%
+% \end{macrocode}
+% First of all we expand whatever \cs{fc@wcase}\ldots\cs{@nil} found within \cs{@tempa}.
+% \begin{macrocode}
+ \protected@edef\@tempa{\@tempa}%
+ \protected@edef\@tempa{\expandafter\fc@gcase\@tempa\@nil}%
+}
+% \end{macrocode}
+% \DescribeMacro{\@ordinalMfrench}
+% \changes{3.01}{2014-11-12}{Protect \cs{`}, for solving
+% \uref{http://github.com/nlct/fmtcount/issues/15}{Issue \#15}, and
+% correct non abbreviated ordinal finals}
+% \changes{3.01}{2014-11-20}{Add a package warning about non
+% abbreviated ordinals in French being incorrect. Change ``i\`eme''
+% to ``\`eme'' which is the most frequent non abbreviated form.}
+% \begin{macrocode}
+\newcommand*{\@ordinalMfrench}[2]{%
+\iffmtord@abbrv
+ \ifnum#1=1 %
+ \edef#2{\number#1\relax\noexpand\fmtord{er}}%
+ \else
+ \edef#2{\number#1\relax\noexpand\fmtord{e}}%
+ \fi
+\else
+ \PackageWarning{fmtcount}{Non abbreviated ordinal finals (`eme) are
+ considered incorrect in French.}%
+ \ifnum#1=1 %
+ \edef#2{\number#1\relax\noexpand\fmtord{er}}%
+ \else
+ \protected@edef#2{\number#1\relax\noexpand\fmtord{\protect\`eme}}%
+ \fi
+\fi}
+\global\let\@ordinalMfrench\@ordinalMfrench
+% \end{macrocode}
+% \DescribeMacro{\@ordinalFfrench}
+% \changes{3.01}{2014-11-10}{Protect \cs{`}, for solving
+% \uref{http://github.com/nlct/fmtcount/issues/15}{Issue \#15}}
+% \changes{3.01}{2014-11-20}{Add a package warning about non
+% abbreviated ordinals in French being incorrect. Change ``i\`eme''
+% to ``\`eme'' which is the most frequent non abbreviated form.}
+% \begin{macrocode}
+\newcommand*{\@ordinalFfrench}[2]{%
+\iffmtord@abbrv
+ \ifnum#1=1 %
+ \edef#2{\number#1\relax\noexpand\fmtord{re}}%
+ \else
+ \edef#2{\number#1\relax\noexpand\fmtord{e}}%
+ \fi
+\else
+ \PackageWarning{fmtcount}{Non abbreviated ordinal finals (`eme) are
+ considered incorrect in French.}%
+ \ifnum#1=1 %
+ \protected@edef#2{\number#1\relax\noexpand\fmtord{\protect\`ere}}%
+ \else
+ \protected@edef#2{\number#1\relax\noexpand\fmtord{\protect\`eme}}%
+ \fi
+\fi}
+\global\let\@ordinalFfrench\@ordinalFfrench
+% \end{macrocode}
+% In French neutral gender and masculine gender are formally identical.
+% \begin{macrocode}
+\global\let\@ordinalNfrench\@ordinalMfrench
+% \end{macrocode}
+% \DescribeMacro{\@@unitstringfrench}
+% \begin{macrocode}
+\newcommand*{\@@unitstringfrench}[1]{%
+\noexpand\fc@wcase
+\ifcase#1 %
+z\'ero%
+\or un%
+\or deux%
+\or trois%
+\or quatre%
+\or cinq%
+\or six%
+\or sept%
+\or huit%
+\or neuf%
+\fi
+\noexpand\@nil
+}%
+\global\let\@@unitstringfrench\@@unitstringfrench
+% \end{macrocode}
+% \DescribeMacro{\@@tenstringfrench}
+% \begin{macrocode}
+\newcommand*{\@@tenstringfrench}[1]{%
+\noexpand\fc@wcase
+\ifcase#1 %
+\or dix%
+\or vingt%
+\or trente%
+\or quarante%
+\or cinquante%
+\or soixante%
+\or septante%
+\or huitante%
+\or nonante%
+\or cent%
+\fi
+\noexpand\@nil
+}%
+\global\let\@@tenstringfrench\@@tenstringfrench
+% \end{macrocode}
+% \DescribeMacro{\@@teenstringfrench}
+% \begin{macrocode}
+\newcommand*{\@@teenstringfrench}[1]{%
+\noexpand\fc@wcase
+\ifcase#1 %
+ dix%
+\or onze%
+\or douze%
+\or treize%
+\or quatorze%
+\or quinze%
+\or seize%
+\or dix\noexpand\@nil-\noexpand\fc@wcase sept%
+\or dix\noexpand\@nil-\noexpand\fc@wcase huit%
+\or dix\noexpand\@nil-\noexpand\fc@wcase neuf%
+\fi
+\noexpand\@nil
+}%
+\global\let\@@teenstringfrench\@@teenstringfrench
+% \end{macrocode}
+% \DescribeMacro{\@@seventiesfrench}
+% \begin{macrocode}
+\newcommand*{\@@seventiesfrench}[1]{%
+\@tenstring{6}%
+\ifnum#1=1 %
+\fc@frenchoptions@submillion@dos\@andname\fc@frenchoptions@submillion@dos
+\else
+-%
+\fi
+\@teenstring{#1}%
+}%
+\global\let\@@seventiesfrench\@@seventiesfrench
+% \end{macrocode}
+% \DescribeMacro{\@@eightiesfrench}Macro \cs{@@eightiesfrench} is used to format numbers in the interval
+% \([80\intv 89]\). Argument as follows:\newline
+% \begin{tabularx}{\linewidth}{@{}>{\raggedleft\arraybackslash\ttfamily}rX@{}}
+% \#1&digit \(d_{w}\) such that the number to be formatted is \(80 + d_{w}\)\\
+% \end{tabularx}
+% Implicit arguments as:\newline
+% \begin{tabularx}{\linewidth}{@{}>{\raggedleft\arraybackslash\ttfamily}rX@{}}
+% \cs{count0}&weight \(w\) of the number \(d_{w+1}d_{w}\) to be formatted\\
+% \cs{count1}&same as \cs{\#1}\\
+% \cs{count6}&input, counter giving the least weight of non zero digits in top level formatted number
+% integral part, with rounding down to a multiple of 3,\\
+% \cs{count9}&input, counter giving the power type of the power of ten following the eighties to be
+% formatted; that is `1' for ``mil'' and `2' for ``\meta{$n$}illion\textbar \meta{$n$}illiard''.
+% \end{tabularx}
+% \begin{macrocode}
+\newcommand*\@@eightiesfrench[1]{%
+\fc@wcase quatre\@nil-\noexpand\fc@wcase vingt%
+\ifnum#1>0 %
+ \ifnum\fc@frenchoptions@vingt@plural=0 % vingt plural=always
+ s%
+ \fi
+ \noexpand\@nil
+ -\@unitstring{#1}%
+\else
+ \ifcase\fc@frenchoptions@vingt@plural\space
+ s% 0: always
+ \or
+ % 1: never
+ \or
+ s% 2: multiple
+ \or
+ % 3: multiple g-last
+ \ifnum\count0=\count6\ifnum\count9=0 s\fi\fi
+ \or
+ % 4: multiple l-last
+ \ifnum\count9=1 %
+ \else
+ s%
+ \fi
+ \or
+ % 5: multiple lng-last
+ \ifnum\count9=1 %
+ \else
+ \ifnum\count0>0 %
+ s%
+ \fi
+ \fi
+ \or
+ % or 6: multiple ng-last
+ \ifnum\count0>0 %
+ s%
+ \fi
+ \fi
+ \noexpand\@nil
+\fi
+}%
+\global\let\@@eightiesfrench\@@eightiesfrench
+\newcommand*{\@@ninetiesfrench}[1]{%
+\fc@wcase quatre\@nil-\noexpand\fc@wcase vingt%
+\ifnum\fc@frenchoptions@vingt@plural=0 % vingt plural=always
+ s%
+\fi
+\noexpand\@nil
+-\@teenstring{#1}%
+}%
+\global\let\@@ninetiesfrench\@@ninetiesfrench
+\newcommand*{\@@seventiesfrenchswiss}[1]{%
+\@tenstring{7}%
+\ifnum#1=1\ \@andname\ \fi
+\ifnum#1>1-\fi
+\ifnum#1>0 \@unitstring{#1}\fi
+}%
+\global\let\@@seventiesfrenchswiss\@@seventiesfrenchswiss
+\newcommand*{\@@eightiesfrenchswiss}[1]{%
+\@tenstring{8}%
+\ifnum#1=1\ \@andname\ \fi
+\ifnum#1>1-\fi
+\ifnum#1>0 \@unitstring{#1}\fi
+}%
+\global\let\@@eightiesfrenchswiss\@@eightiesfrenchswiss
+\newcommand*{\@@ninetiesfrenchswiss}[1]{%
+\@tenstring{9}%
+\ifnum#1=1\ \@andname\ \fi
+\ifnum#1>1-\fi
+\ifnum#1>0 \@unitstring{#1}\fi
+}%
+\global\let\@@ninetiesfrenchswiss\@@ninetiesfrenchswiss
+% \end{macrocode}
+% \DescribeMacro{\fc@french@common}Macro \cs{fc@french@common} does all the preliminary settings common to all
+% French dialects \& formatting options.
+% \begin{macrocode}
+\newcommand*\fc@french@common{%
+ \let\fc@wcase\fc@CaseIden
+ \let\@unitstring=\@@unitstringfrench
+ \let\@teenstring=\@@teenstringfrench
+ \let\@tenstring=\@@tenstringfrench
+ \def\@hundred{cent}%
+ \def\@andname{et}%
+}%
+\global\let\fc@french@common\fc@french@common
+% \end{macrocode}
+% \begin{macrocode}
+\newcommand*{\@numberstringMfrenchswiss}[2]{%
+\fc@french@common
+\let\fc@gcase\fc@CaseIden
+\let\@seventies=\@@seventiesfrenchswiss
+\let\@eighties=\@@eightiesfrenchswiss
+\let\@nineties=\@@ninetiesfrenchswiss
+\let\fc@nbrstr@preamble\@empty
+\let\fc@nbrstr@postamble\@empty
+\@@numberstringfrench{#1}{#2}}
+\global\let\@numberstringMfrenchswiss\@numberstringMfrenchswiss
+\newcommand*{\@numberstringMfrenchfrance}[2]{%
+\fc@french@common
+\let\fc@gcase\fc@CaseIden
+\let\@seventies=\@@seventiesfrench
+\let\@eighties=\@@eightiesfrench
+\let\@nineties=\@@ninetiesfrench
+\let\fc@nbrstr@preamble\@empty
+\let\fc@nbrstr@postamble\@empty
+\@@numberstringfrench{#1}{#2}}
+\global\let\@numberstringMfrenchfrance\@numberstringMfrenchfrance
+\newcommand*{\@numberstringMfrenchbelgian}[2]{%
+\fc@french@common
+\let\fc@gcase\fc@CaseIden
+\let\@seventies=\@@seventiesfrenchswiss
+\let\@eighties=\@@eightiesfrench
+\let\@nineties=\@@ninetiesfrench
+\let\fc@nbrstr@preamble\@empty
+\let\fc@nbrstr@postamble\@empty
+\@@numberstringfrench{#1}{#2}}
+\global\let\@numberstringMfrenchbelgian\@numberstringMfrenchbelgian
+\let\@numberstringMfrench=\@numberstringMfrenchfrance
+\newcommand*{\@numberstringFfrenchswiss}[2]{%
+\fc@french@common
+\let\fc@gcase\fc@CaseIden
+\let\@seventies=\@@seventiesfrenchswiss
+\let\@eighties=\@@eightiesfrenchswiss
+\let\@nineties=\@@ninetiesfrenchswiss
+\let\fc@nbrstr@preamble\fc@@nbrstr@Fpreamble
+\let\fc@nbrstr@postamble\@empty
+\@@numberstringfrench{#1}{#2}}
+\global\let\@numberstringFfrenchswiss\@numberstringFfrenchswiss
+\newcommand*{\@numberstringFfrenchfrance}[2]{%
+\fc@french@common
+\let\fc@gcase\fc@CaseIden
+\let\@seventies=\@@seventiesfrench
+\let\@eighties=\@@eightiesfrench
+\let\@nineties=\@@ninetiesfrench
+\let\fc@nbrstr@preamble\fc@@nbrstr@Fpreamble
+\let\fc@nbrstr@postamble\@empty
+\@@numberstringfrench{#1}{#2}}
+\global\let\@numberstringFfrenchfrance\@numberstringFfrenchfrance
+\newcommand*{\@numberstringFfrenchbelgian}[2]{%
+\fc@french@common
+\let\fc@gcase\fc@CaseIden
+\let\@seventies=\@@seventiesfrenchswiss
+\let\@eighties=\@@eightiesfrench
+\let\@nineties=\@@ninetiesfrench
+\let\fc@nbrstr@preamble\fc@@nbrstr@Fpreamble
+\let\fc@nbrstr@postamble\@empty
+\@@numberstringfrench{#1}{#2}}
+\global\let\@numberstringFfrenchbelgian\@numberstringFfrenchbelgian
+\global\let\@numberstringFfrench=\@numberstringFfrenchfrance
+\global\let\@ordinalstringNfrench\@ordinalstringMfrench
+\newcommand*{\@NumberstringMfrenchswiss}[2]{%
+\fc@french@common
+\let\fc@gcase\fc@UpperCaseFirstLetter
+\let\@seventies=\@@seventiesfrenchswiss
+\let\@eighties=\@@eightiesfrenchswiss
+\let\@nineties=\@@ninetiesfrenchswiss
+\let\fc@nbrstr@preamble\@empty
+\let\fc@nbrstr@postamble\fc@apply@gcase
+\@@numberstringfrench{#1}{#2}}
+\global\let\@NumberstringMfrenchswiss\@NumberstringMfrenchswiss
+\newcommand*{\@NumberstringMfrenchfrance}[2]{%
+\fc@french@common
+\let\fc@gcase\fc@UpperCaseFirstLetter
+\let\@seventies=\@@seventiesfrench
+\let\@eighties=\@@eightiesfrench
+\let\@nineties=\@@ninetiesfrench
+\let\fc@nbrstr@preamble\@empty
+\let\fc@nbrstr@postamble\fc@apply@gcase
+\@@numberstringfrench{#1}{#2}}
+\global\let\@NumberstringMfrenchfrance\@NumberstringMfrenchfrance
+\newcommand*{\@NumberstringMfrenchbelgian}[2]{%
+\fc@french@common
+\let\fc@gcase\fc@UpperCaseFirstLetter
+\let\@seventies=\@@seventiesfrenchswiss
+\let\@eighties=\@@eightiesfrench
+\let\@nineties=\@@ninetiesfrench
+\let\fc@nbrstr@preamble\@empty
+\let\fc@nbrstr@postamble\fc@apply@gcase
+\@@numberstringfrench{#1}{#2}}
+\global\let\@NumberstringMfrenchbelgian\@NumberstringMfrenchbelgian
+\global\let\@NumberstringMfrench=\@NumberstringMfrenchfrance
+\newcommand*{\@NumberstringFfrenchswiss}[2]{%
+\fc@french@common
+\let\fc@gcase\fc@UpperCaseFirstLetter
+\let\@seventies=\@@seventiesfrenchswiss
+\let\@eighties=\@@eightiesfrenchswiss
+\let\@nineties=\@@ninetiesfrenchswiss
+\let\fc@nbrstr@preamble\fc@@nbrstr@Fpreamble
+\let\fc@nbrstr@postamble\fc@apply@gcase
+\@@numberstringfrench{#1}{#2}}
+\global\let\@NumberstringFfrenchswiss\@NumberstringFfrenchswiss
+\newcommand*{\@NumberstringFfrenchfrance}[2]{%
+\fc@french@common
+\let\fc@gcase\fc@UpperCaseFirstLetter
+\let\@seventies=\@@seventiesfrench
+\let\@eighties=\@@eightiesfrench
+\let\@nineties=\@@ninetiesfrench
+\let\fc@nbrstr@preamble\fc@@nbrstr@Fpreamble
+\let\fc@nbrstr@postamble\fc@apply@gcase
+\@@numberstringfrench{#1}{#2}}
+\global\let\@NumberstringFfrenchfrance\@NumberstringFfrenchfrance
+\newcommand*{\@NumberstringFfrenchbelgian}[2]{%
+\fc@french@common
+\let\fc@gcase\fc@UpperCaseFirstLetter
+\let\@seventies=\@@seventiesfrenchswiss
+\let\@eighties=\@@eightiesfrench
+\let\@nineties=\@@ninetiesfrench
+\let\fc@nbrstr@preamble\fc@@nbrstr@Fpreamble
+\let\fc@nbrstr@postamble\fc@apply@gcase
+\@@numberstringfrench{#1}{#2}}
+\global\let\@NumberstringFfrenchbelgian\@NumberstringFfrenchbelgian
+\global\let\@NumberstringFfrench=\@NumberstringFfrenchfrance
+\global\let\@NumberstringNfrench\@NumberstringMfrench
+\newcommand*{\@ordinalstringMfrenchswiss}[2]{%
+\fc@french@common
+\let\fc@gcase\fc@CaseIden
+\let\fc@first\fc@@firstfrench
+\let\@seventies=\@@seventiesfrenchswiss
+\let\@eighties=\@@eightiesfrenchswiss
+\let\@nineties=\@@ninetiesfrenchswiss
+\@@ordinalstringfrench{#1}{#2}%
+}%
+\global\let\@ordinalstringMfrenchswiss\@ordinalstringMfrenchswiss
+\newcommand*\fc@@firstfrench{premier}
+\global\let\fc@@firstfrench\fc@@firstfrench
+% \end{macrocode}
+% \changes{3.01}{2014-11-10}{Protect \cs{`}, for solving
+% \uref{http://github.com/nlct/fmtcount/issues/15}{Issue \#15}}
+% \begin{macrocode}
+\newcommand*\fc@@firstFfrench{premi\protect\`ere}
+\global\let\fc@@firstFfrench\fc@@firstFfrench
+\newcommand*{\@ordinalstringMfrenchfrance}[2]{%
+\fc@french@common
+\let\fc@gcase\fc@CaseIden
+\let\fc@first=\fc@@firstfrench
+\let\@seventies=\@@seventiesfrench
+\let\@eighties=\@@eightiesfrench
+\let\@nineties=\@@ninetiesfrench
+\@@ordinalstringfrench{#1}{#2}}
+\global\let\@ordinalstringMfrenchfrance\@ordinalstringMfrenchfrance
+\newcommand*{\@ordinalstringMfrenchbelgian}[2]{%
+\fc@french@common
+\let\fc@gcase\fc@CaseIden
+\let\fc@first=\fc@@firstfrench
+\let\@seventies=\@@seventiesfrench
+\let\@eighties=\@@eightiesfrench
+\let\@nineties=\@@ninetiesfrench
+\@@ordinalstringfrench{#1}{#2}%
+}%
+\global\let\@ordinalstringMfrenchbelgian\@ordinalstringMfrenchbelgian
+\global\let\@ordinalstringMfrench=\@ordinalstringMfrenchfrance
+\newcommand*{\@ordinalstringFfrenchswiss}[2]{%
+\fc@french@common
+\let\fc@gcase\fc@CaseIden
+\let\fc@first\fc@@firstFfrench
+\let\@seventies=\@@seventiesfrenchswiss
+\let\@eighties=\@@eightiesfrenchswiss
+\let\@nineties=\@@ninetiesfrenchswiss
+\@@ordinalstringfrench{#1}{#2}%
+}%
+\global\let\@ordinalstringFfrenchswiss\@ordinalstringFfrenchswiss
+\newcommand*{\@ordinalstringFfrenchfrance}[2]{%
+\fc@french@common
+\let\fc@gcase\fc@CaseIden
+\let\fc@first=\fc@@firstFfrench
+\let\@seventies=\@@seventiesfrench
+\let\@eighties=\@@eightiesfrench
+\let\@nineties=\@@ninetiesfrench
+\@@ordinalstringfrench{#1}{#2}%
+}%
+\global\let\@ordinalstringFfrenchfrance\@ordinalstringFfrenchfrance
+\newcommand*{\@ordinalstringFfrenchbelgian}[2]{%
+\fc@french@common
+\let\fc@gcase\fc@CaseIden
+\let\fc@first=\fc@@firstFfrench
+\let\@seventies=\@@seventiesfrench
+\let\@eighties=\@@eightiesfrench
+\let\@nineties=\@@ninetiesfrench
+\@@ordinalstringfrench{#1}{#2}%
+}%
+\global\let\@ordinalstringFfrenchbelgian\@ordinalstringFfrenchbelgian
+\global\let\@ordinalstringFfrench=\@ordinalstringFfrenchfrance
+\global\let\@ordinalstringNfrench\@ordinalstringMfrench
+\newcommand*{\@OrdinalstringMfrenchswiss}[2]{%
+\fc@french@common
+\let\fc@gcase\fc@UpperCaseFirstLetter
+\let\fc@first=\fc@@firstfrench
+\let\@seventies=\@@seventiesfrenchswiss
+\let\@eighties=\@@eightiesfrenchswiss
+\let\@nineties=\@@ninetiesfrenchswiss
+\@@ordinalstringfrench{#1}{#2}%
+}%
+\global\let\@OrdinalstringMfrenchswiss\@OrdinalstringMfrenchswiss
+\newcommand*{\@OrdinalstringMfrenchfrance}[2]{%
+\fc@french@common
+\let\fc@gcase\fc@UpperCaseFirstLetter
+\let\fc@first\fc@@firstfrench
+\let\@seventies=\@@seventiesfrench
+\let\@eighties=\@@eightiesfrench
+\let\@nineties=\@@ninetiesfrench
+\@@ordinalstringfrench{#1}{#2}%
+}%
+\global\let\@OrdinalstringMfrenchfrance\@OrdinalstringMfrenchfrance
+\newcommand*{\@OrdinalstringMfrenchbelgian}[2]{%
+\fc@french@common
+\let\fc@gcase\fc@UpperCaseFirstLetter
+\let\fc@first\fc@@firstfrench
+\let\@seventies=\@@seventiesfrench
+\let\@eighties=\@@eightiesfrench
+\let\@nineties=\@@ninetiesfrench
+\@@ordinalstringfrench{#1}{#2}%
+}%
+\global\let\@OrdinalstringMfrenchbelgian\@OrdinalstringMfrenchbelgian
+\global\let\@OrdinalstringMfrench=\@OrdinalstringMfrenchfrance
+\newcommand*{\@OrdinalstringFfrenchswiss}[2]{%
+\fc@french@common
+\let\fc@gcase\fc@UpperCaseFirstLetter
+\let\fc@first\fc@@firstfrench
+\let\@seventies=\@@seventiesfrenchswiss
+\let\@eighties=\@@eightiesfrenchswiss
+\let\@nineties=\@@ninetiesfrenchswiss
+\@@ordinalstringfrench{#1}{#2}%
+}%
+\global\let\@OrdinalstringFfrenchswiss\@OrdinalstringFfrenchswiss
+\newcommand*{\@OrdinalstringFfrenchfrance}[2]{%
+\fc@french@common
+\let\fc@gcase\fc@UpperCaseFirstLetter
+\let\fc@first\fc@@firstFfrench
+\let\@seventies=\@@seventiesfrench
+\let\@eighties=\@@eightiesfrench
+\let\@nineties=\@@ninetiesfrench
+\@@ordinalstringfrench{#1}{#2}%
+}%
+\global\let\@OrdinalstringFfrenchfrance\@OrdinalstringFfrenchfrance
+\newcommand*{\@OrdinalstringFfrenchbelgian}[2]{%
+\fc@french@common
+\let\fc@gcase\fc@UpperCaseFirstLetter
+\let\fc@first\fc@@firstFfrench
+\let\@seventies=\@@seventiesfrench
+\let\@eighties=\@@eightiesfrench
+\let\@nineties=\@@ninetiesfrench
+\@@ordinalstringfrench{#1}{#2}%
+}%
+\global\let\@OrdinalstringFfrenchbelgian\@OrdinalstringFfrenchbelgian
+\global\let\@OrdinalstringFfrench=\@OrdinalstringFfrenchfrance
+\global\let\@OrdinalstringNfrench\@OrdinalstringMfrench
+% \end{macrocode}
+% \DescribeMacro{\fc@@do@plural@mark}Macro \cs{fc@@do@plural@mark} will expand to the plural mark of
+% \meta{$n$}illiard, \meta{$n$}illion, mil, cent or vingt, whichever is applicable. First check that the macro
+% is not yet defined.
+% \begin{macrocode}
+\ifcsundef{fc@@do@plural@mark}{}%
+{\PackageError{fmtcount}{Duplicate definition}{Redefinition of macro
+ `fc@@do@plural@mark'}}
+% \end{macrocode}
+% Arguments as follows:\newline
+% \begin{tabularx}{\linewidth}{@{}>{\raggedleft\arraybackslash\ttfamily}rX@{}}
+% \#1&plural mark, `s' in general, but for mil it is \cs{fc@frenchoptions@mil@plural@mark}\\
+% \end{tabularx}
+% Implicit arguments as follows:\newline
+% \begin{tabularx}{\linewidth}{@{}>{\raggedleft\arraybackslash\ttfamily}rX@{}}
+% \cs{count0}&input, counter giving the weight \(w\), this is expected to be multiple of 3,\\
+% \cs{count1}&input, counter giving the plural value of multiplied object \meta{$n$}illiard,
+% \meta{$n$}illion, mil, cent or vingt, whichever is applicable, that is to say it is 1 when the considered
+% objet is not multiplied, and 2 or more when it is multiplied,\\
+% \cs{count6}&input, counter giving the least weight of non zero digits in top level formatted number
+% integral part, with rounding down to a multiple of 3,\\
+% \cs{count10}&input, counter giving the plural mark control option.\\
+% \end{tabularx}
+% \begin{macrocode}
+\def\fc@@do@plural@mark#1{%
+ \ifcase\count10 %
+ #1% 0=always
+ \or% 1=never
+ \or% 2=multiple
+ \ifnum\count1>1 %
+ #1%
+ \fi
+ \or% 3= multiple g-last
+ \ifnum\count1>1 %
+ \ifnum\count0=\count6 %
+ #1%
+ \fi
+ \fi
+ \or% 4= multiple l-last
+ \ifnum\count1>1 %
+ \ifnum\count9=1 %
+ \else
+ #1%
+ \fi
+ \fi
+ \or% 5= multiple lng-last
+ \ifnum\count1>1 %
+ \ifnum\count9=1 %
+ \else
+ \if\count0>\count6 %
+ #1%
+ \fi
+ \fi
+ \fi
+ \or% 6= multiple ng-last
+ \ifnum\count1>1 %
+ \ifnum\count0>\count6 %
+ #1%
+ \fi
+ \fi
+ \fi
+}%
+\global\let\fc@@do@plural@mark\fc@@do@plural@mark
+% \end{macrocode}
+% \DescribeMacro{\fc@@nbrstr@Fpreamble}Macro \cs{fc@@nbrstr@Fpreamble} do the necessary preliminaries before
+% formatting a cardinal with feminine gender.
+% \begin{macrocode}
+\ifcsundef{fc@@nbrstr@Fpreamble}{}{%
+ \PackageError{fmtcount}{Duplicate definition}{Redefinition of macro
+ `fc@@nbrstr@Fpreamble'}}
+% \end{macrocode}
+% \DescribeMacro{\fc@@nbrstr@Fpreamble}
+% \begin{macrocode}
+\def\fc@@nbrstr@Fpreamble{%
+ \fc@read@unit{\count1}{0}%
+ \ifnum\count1=1 %
+ \let\fc@wcase@save\fc@wcase
+ \def\fc@wcase{\noexpand\fc@wcase}%
+ \def\@nil{\noexpand\@nil}%
+ \let\fc@nbrstr@postamble\fc@@nbrstr@Fpostamble
+ \fi
+}%
+\global\let\fc@@nbrstr@Fpreamble\fc@@nbrstr@Fpreamble
+% \end{macrocode}
+% \DescribeMacro{\fc@@nbrstr@Fpostamble}
+% \begin{macrocode}
+\def\fc@@nbrstr@Fpostamble{%
+ \let\fc@wcase\fc@wcase@save
+ \expandafter\fc@get@last@word\expandafter{\@tempa}\@tempb\@tempc
+ \def\@tempd{un}%
+ \ifx\@tempc\@tempd
+ \let\@tempc\@tempa
+ \edef\@tempa{\@tempb\fc@wcase une\@nil}%
+ \fi
+}%
+\global\let\fc@@nbrstr@Fpostamble\fc@@nbrstr@Fpostamble
+% \end{macrocode}
+% \DescribeMacro{\fc@@pot@longscalefrench}Macro \cs{fc@@pot@longscalefrench} is used to produce
+% powers of ten with long scale convention. The long scale convention is correct for French and elsewhere in
+% Europe. First we check that the macro is not yet defined.
+% \begin{macrocode}
+\ifcsundef{fc@@pot@longscalefrench}{}{%
+ \PackageError{fmtcount}{Duplicate definition}{Redefinition of macro
+ `fc@@pot@longscalefrench'}}
+% \end{macrocode}
+% Argument are as follows:\def\interface{\newline\noindent
+% \begin{tabularx}{\linewidth}{@{}>{\raggedleft\arraybackslash\ttfamily}rX@{}}
+% \#1&input, plural value of \(d\), that is to say: let \(d\) be the number multiplying the considered power
+% of ten, then the plural value \texttt{\#2} is expected to be \(0\) if \(d=0\), \(1\) if \(d=1\), or \(>1\)
+% if \(d>1\)\\
+% \#2&output, counter, maybe \(0\) when power of ten is \(1\), \(1\) when power of ten starts with
+% ``mil(le)'', or \(2\) when power of ten is a ``\meta{$n$}illion(s)\textbar\meta{$n$}illiard(s)''\\
+% \#3&output, macro into which to place the formatted power of ten
+% \end{tabularx}
+% Implicit arguments as follows:\newline
+% \begin{tabularx}{\linewidth}{@{}>{\raggedleft\arraybackslash\ttfamily}rX@{}}
+% \cs{count0}&input, counter giving the weight \(w\), this is expected to be multiple of 3\\
+% \end{tabularx}
+% }\interface
+% \begin{macrocode}
+\def\fc@@pot@longscalefrench#1#2#3{%
+ {%
+% \end{macrocode}
+% First the input arguments are saved into local objects: \texttt{\#1} and \texttt{\#1} are respectively saved
+% into \cs{@tempa} and \cs{@tempb}.
+% \begin{macrocode}
+ \edef\@tempb{\number#1}%
+% \end{macrocode}
+% Let \cs{count1} be the plural value.
+% \begin{macrocode}
+ \count1=\@tempb
+% \end{macrocode}
+% Let \(n\) and \(r\) the the quotient and remainder of division of weight \(w\) by \(6\), that is to say \(w
+% = n\times 6 + r\) and \(0\leq r < 6\), then \cs{count2} is set to \(n\) and \cs{count3} is set to \(r\).
+% \begin{macrocode}
+ \count2\count0 %
+ \divide\count2 by 6 %
+ \count3\count2 %
+ \multiply\count3 by 6 %
+ \count3-\count3 %
+ \advance\count3 by \count0 %
+ \ifnum\count0>0 %
+% \end{macrocode}
+% If weight \(w\) (a.k.a. \cs{count0}) is such that \(w>0\), then \(w\geq 3\) because \(w\) is a multiple of
+% \(3\). So we \emph{may} have to append ``mil(le)'' or ``\meta{$n$}illion(s)'' or ``\meta{$n$}illiard(s)''.
+% \begin{macrocode}
+ \ifnum\count1>0 %
+% \end{macrocode}
+% Plural value is \(>0\) so have at least one ``mil(le)'' or ``\meta{$n$}illion(s)'' or
+% ``\meta{$n$}illiard(s)''. We need to distinguish between the case of ``mil(le)'' and that of
+% ``\meta{$n$}illion(s)'' or ``\meta{$n$}illiard(s)'', so we \cs{def}ine \cs{@temph} to `\texttt{1}' for
+% ``mil(le)'', and to `\texttt{2}' otherwise.
+% \begin{macrocode}
+ \edef\@temph{%
+ \ifnum\count2=0 % weight=3
+% \end{macrocode}
+% Here \(n=0\), with \(n=w\div 6\),but we also know that \(w\geq 3\), so we have \(w=3\) which means we are in
+% the ``mil(le)'' case.
+% \begin{macrocode}
+ 1%
+ \else
+ \ifnum\count3>2 %
+% \end{macrocode}
+% Here we are in the case of \(3\leq r < 6\), with \(r\) the remainder of division of weight \(w\) by \(6\),
+% we should have ``\meta{$n$}illiard(s)'', but that may also be ``mil(le)'' instead depending on
+% option `\texttt{n-illiard upto}', known as \cs{fc@longscale@nilliard@upto}.
+% \begin{macrocode}
+ \ifnum\fc@longscale@nilliard@upto=0 %
+% \end{macrocode}
+% Here option `\texttt{n-illiard upto}' is `\texttt{infinity}', so we always use ``\meta{$n$}illiard(s)''.
+% \begin{macrocode}
+ 2%
+ \else
+% \end{macrocode}
+% Here option `\texttt{n-illiard upto}' indicate some threshold to which to compare \(n\)
+% (a.k.a. \cs{count2}).
+% \begin{macrocode}
+ \ifnum\count2>\fc@longscale@nilliard@upto
+ 1%
+ \else
+ 2%
+ \fi
+ \fi
+ \else
+ 2%
+ \fi
+ \fi
+ }%
+ \ifnum\@temph=1 %
+% \end{macrocode}
+% Here \(10^w\) is formatted as ``mil(le)''.
+% \begin{macrocode}
+ \count10=\fc@frenchoptions@mil@plural\space
+ \edef\@tempe{%
+ \noexpand\fc@wcase
+ mil%
+ \fc@@do@plural@mark\fc@frenchoptions@mil@plural@mark
+ \noexpand\@nil
+ }%
+ \else
+ % weight >= 6
+ \expandafter\fc@@latin@cardinal@pefix\expandafter{\the\count2}\@tempg
+ % now form the xxx-illion(s) or xxx-illiard(s) word
+ \ifnum\count3>2 %
+ \toks10{illiard}%
+ \count10=\csname fc@frenchoptions@n-illiard@plural\endcsname\space
+ \else
+ \toks10{illion}%
+ \count10=\csname fc@frenchoptions@n-illion@plural\endcsname\space
+ \fi
+ \edef\@tempe{%
+ \noexpand\fc@wcase
+ \@tempg
+ \the\toks10 %
+ \fc@@do@plural@mark s%
+ \noexpand\@nil
+ }%
+ \fi
+ \else
+% \end{macrocode}
+% Here plural indicator of \(d\) indicates that \(d = 0\), so we have \(0\times10^{w}\), and it is not worth
+% to format \(10^{w}\), because there are none of them.
+% \begin{macrocode}
+ \let\@tempe\@empty
+ \def\@temph{0}%
+ \fi
+ \else
+% \end{macrocode}
+% Case of \(w=0\).
+% \begin{macrocode}
+ \let\@tempe\@empty
+ \def\@temph{0}%
+ \fi
+% \end{macrocode}
+% Now place into \@cs{@tempa} the assignment of results \cs{@temph} and \cs{@tempe} to \texttt{\#2} and
+% \texttt{\#3} for further propagation after closing brace.
+% \begin{macrocode}
+ \expandafter\toks\expandafter1\expandafter{\@tempe}%
+ \toks0{#2}%
+ \edef\@tempa{\the\toks0 \@temph \def\noexpand#3{\the\toks1}}%
+ \expandafter
+ }\@tempa
+}%
+\global\let\fc@@pot@longscalefrench\fc@@pot@longscalefrench
+% \end{macrocode}
+% \DescribeMacro{\fc@@pot@shortscalefrench}Macro \cs{fc@@pot@shortscalefrench} is used to produce
+% powers of ten with short scale convention. This convention is the US convention and is not correct for
+% French and elsewhere in Europe. First we check that the macro is not yet defined.
+% \begin{macrocode}
+\ifcsundef{fc@@pot@shortscalefrench}{}{%
+ \PackageError{fmtcount}{Duplicate definition}{Redefinition of macro
+ `fc@@pot@shortscalefrench'}}
+% \end{macrocode}
+% Arguments as follows --- same interface as for \cs{fc@@pot@longscalefrench}:\interface
+% \begin{macrocode}
+\def\fc@@pot@shortscalefrench#1#2#3{%
+ {%
+% \end{macrocode}
+% First save input arguments \texttt{\#1}, \texttt{\#2}, and \texttt{\#3} into local macros
+% respectively \cs{@tempa}, \cs{@tempb}, \cs{@tempc} and \cs{@tempd}.
+% \begin{macrocode}
+ \edef\@tempb{\number#1}%
+% \end{macrocode}
+% And let \cs{count1} be the plural value.
+% \begin{macrocode}
+ \count1=\@tempb
+% \end{macrocode}
+% Now, let \cs{count2} be the integer \(n\) generating the pseudo latin prefix, i.e. \(n\) is such that \(w =
+% 3\times n + 3\).
+% \begin{macrocode}
+ \count2\count0 %
+ \divide\count2 by 3 %
+ \advance\count2 by -1 %
+% \end{macrocode}
+% Here is the real job, the formatted power of ten will go to \cs{@tempe}, and its power type will go to
+% \cs{@temph}. Please remember that the power type is an index in \([0\intv 2]\) indicating whether \(10^w\)
+% is formatted as \meta{nothing}, ``mil(le)'' or ``\meta{$n$}illion(s)\textbar\meta{$n$}illiard(s)''.
+% \begin{macrocode}
+ \ifnum\count0>0 % If weight>=3, i.e we do have to append thousand or n-illion(s)/n-illiard(s)
+ \ifnum\count1>0 % we have at least one thousand/n-illion/n-illiard
+ \ifnum\count2=0 %
+ \def\@temph{1}%
+ \count1=\fc@frenchoptions@mil@plural\space
+ \edef\@tempe{%
+ mil%
+ \fc@@do@plural@mark\fc@frenchoptions@mil@plural@mark
+ }%
+ \else
+ \def\@temph{2}%
+ % weight >= 6
+ \expandafter\fc@@latin@cardinal@pefix\expandafter{\the\count2}\@tempg
+ \count10=\csname fc@frenchoptions@n-illion@plural\endcsname\space
+ \edef\@tempe{%
+ \noexpand\fc@wcase
+ \@tempg
+ illion%
+ \fc@@do@plural@mark s%
+ \noexpand\@nil
+ }%
+ \fi
+ \else
+% \end{macrocode}
+% Here we have \(d=0\), so nothing is to be formatted for \(d\times 10^w\).
+% \begin{macrocode}
+ \def\@temph{0}%
+ \let\@tempe\@empty
+ \fi
+ \else
+% \end{macrocode}
+% Here \(w=0\).
+% \begin{macrocode}
+ \def\@temph{0}%
+ \let\@tempe\@empty
+ \fi
+% now place into \@cs{@tempa} the assignment of results \cs{@temph} and \cs{@tempe} to to \texttt{\#2} and
+% \texttt{\#3} for further propagation after closing brace.
+% \begin{macrocode}
+ \expandafter\toks\expandafter1\expandafter{\@tempe}%
+ \toks0{#2}%
+ \edef\@tempa{\the\toks0 \@temph \def\noexpand#3{\the\toks1}}%
+ \expandafter
+ }\@tempa
+}%
+\global\let\fc@@pot@shortscalefrench\fc@@pot@shortscalefrench
+% \end{macrocode}
+% \DescribeMacro{\fc@@pot@recursivefrench}Macro \cs{fc@@pot@recursivefrench} is used to produce
+% power of tens that are of the form ``million de milliards de milliards'' for \(10^{24}\). First we check
+% that the macro is not yet defined.
+% \begin{macrocode}
+\ifcsundef{fc@@pot@recursivefrench}{}{%
+ \PackageError{fmtcount}{Duplicate definition}{Redefinition of macro
+ `fc@@pot@recursivefrench'}}
+% \end{macrocode}
+% The arguments are as follows --- same interface as for \cs{fc@@pot@longscalefrench}:\interface
+% \begin{macrocode}
+\def\fc@@pot@recursivefrench#1#2#3{%
+ {%
+% \end{macrocode}
+% First the input arguments are saved into local objects: \texttt{\#1} and \texttt{\#1} are respectively saved
+% into \cs{@tempa} and \cs{@tempb}.
+% \begin{macrocode}
+ \edef\@tempb{\number#1}%
+ \let\@tempa\@@tempa
+% \end{macrocode}
+% New get the inputs \texttt{\#1} and \texttt{\#1} into counters \cs{count0} and \cs{count1} as this is more
+% practical.
+% \begin{macrocode}
+ \count1=\@tempb\space
+% \end{macrocode}
+% Now compute into \cs{count2} how many times ``de milliards'' has to be repeated.
+% \begin{macrocode}
+ \ifnum\count1>0 %
+ \count2\count0 %
+ \divide\count2 by 9 %
+ \advance\count2 by -1 %
+ \let\@tempe\@empty
+ \edef\@tempf{\fc@frenchoptions@supermillion@dos
+ de\fc@frenchoptions@supermillion@dos\fc@wcase milliards\@nil}%
+ \count11\count0 %
+ \ifnum\count2>0 %
+ \count3\count2 %
+ \count3-\count3 %
+ \multiply\count3 by 9 %
+ \advance\count11 by \count3 %
+ \loop
+ % (\count2, \count3) <- (\count2 div 2, \count2 mod 2)
+ \count3\count2 %
+ \divide\count3 by 2 %
+ \multiply\count3 by 2 %
+ \count3-\count3 %
+ \advance\count3 by \count2 %
+ \divide\count2 by 2 %
+ \ifnum\count3=1 %
+ \let\@tempg\@tempe
+ \edef\@tempe{\@tempg\@tempf}%
+ \fi
+ \let\@tempg\@tempf
+ \edef\@tempf{\@tempg\@tempg}%
+ \ifnum\count2>0 %
+ \repeat
+ \fi
+ \divide\count11 by 3 %
+ \ifcase\count11 % 0 .. 5
+ % 0 => d milliard(s) (de milliards)*
+ \def\@temph{2}%
+ \count10=\csname fc@frenchoptions@n-illiard@plural\endcsname\space
+ \or % 1 => d mille milliard(s) (de milliards)*
+ \def\@temph{1}%
+ \count10=\fc@frenchoptions@mil@plural\space
+ \or % 2 => d million(s) (de milliards)*
+ \def\@temph{2}%
+ \count10=\csname fc@frenchoptions@n-illion@plural\endcsname\space
+ \or % 3 => d milliard(s) (de milliards)*
+ \def\@temph{2}%
+ \count10=\csname fc@frenchoptions@n-illiard@plural\endcsname\space
+ \or % 4 => d mille milliards (de milliards)*
+ \def\@temph{1}%
+ \count10=\fc@frenchoptions@mil@plural\space
+ \else % 5 => d million(s) (de milliards)*
+ \def\@temph{2}%
+ \count10=\csname fc@frenchoptions@n-illion@plural\endcsname\space
+ \fi
+ \let\@tempg\@tempe
+ \edef\@tempf{%
+ \ifcase\count11 % 0 .. 5
+ \or
+ mil\fc@@do@plural@mark \fc@frenchoptions@mil@plural@mark
+ \or
+ million\fc@@do@plural@mark s%
+ \or
+ milliard\fc@@do@plural@mark s%
+ \or
+ mil\fc@@do@plural@mark\fc@frenchoptions@mil@plural@mark
+ \noexpand\@nil\fc@frenchoptions@supermillion@dos
+ \noexpand\fc@wcase milliards% 4
+ \or
+ million\fc@@do@plural@mark s%
+ \noexpand\@nil\fc@frenchoptions@supermillion@dos
+ de\fc@frenchoptions@supermillion@dos\noexpand\fc@wcase milliards% 5
+ \fi
+ }%
+ \edef\@tempe{%
+ \ifx\@tempf\@empty\else
+ \expandafter\fc@wcase\@tempf\@nil
+ \fi
+ \@tempg
+ }%
+ \else
+ \def\@temph{0}%
+ \let\@tempe\@empty
+ \fi
+% \end{macrocode}
+% Now place into \@cs{@tempa} the assignment of results \cs{@temph} and \cs{@tempe} to \texttt{\#2} and
+% \texttt{\#3} for further propagation after closing brace.
+% \begin{macrocode}
+ \expandafter\toks\expandafter1\expandafter{\@tempe}%
+ \toks0{#2}%
+ \edef\@tempa{\the\toks0 \@temph \def\noexpand#3{\the\toks1}}%
+ \expandafter
+ }\@tempa
+}%
+\global\let\fc@@pot@recursivefrench\fc@@pot@recursivefrench
+% \end{macrocode}
+% \DescribeMacro{\fc@muladdfrench}Macro \cs{fc@muladdfrench} is used to format the sum of a number \(a\) and
+% the product of a number \(d\) by a power of ten \(10^w\). Number \(d\) is made of three consecutive digits
+% \(d_{w+2}d_{w+1}d_w\) of respective weights \(w+2\), \(w+1\), and \(w\), while number \(a\) is made of all
+% digits with weight \(w' > w+2\) that have already been formatted. First check that the macro is not yet
+% defined.
+% \begin{macrocode}
+\ifcsundef{fc@muladdfrench}{}{%
+ \PackageError{fmtcount}{Duplicate definition}{Redefinition of macro
+ `fc@muladdfrench'}}
+% \end{macrocode}
+% Arguments as follows:\newline\noindent
+% \begin{tabularx}{\linewidth}{@{}>{\raggedleft\arraybackslash\ttfamily}rX@{}}
+% \#2&input, plural indicator for number \(d\)\\
+% \#3&input, formatted number \(d\)\\
+% \#5&input, formatted number \(10^w\), i.e. power of ten which is multiplied by \(d\)\\
+% \end{tabularx}
+% Implicit arguments from context:\newline\noindent
+% \begin{tabularx}{\linewidth}{@{}>{\raggedleft\arraybackslash\ttfamily}rX@{}}
+% \cs{@tempa}&input, formatted number \(a\)\\
+% &output, macro to which place the mul-add result\\
+% \cs{count8}&input, power type indicator for \(10^{w'}\), where \(w'\) is a weight of \(a\), this is an
+% index in \([0\intv 2]\) that reflects whether \(10^{w'}\) is formatted by ``mil(le)'' --- for index \(=1\)
+% --- or by ``\meta{$n$}illion(s)\textbar\meta{$n$}illiard(s)'' --- for index \(=2\)\\
+% \cs{count9}&input, power type indicator for \(10^w\), this is an index in \([0\intv 2]\) that reflect
+% whether the weight \(w\) of \(d\) is formatted by ``meta{nothing}'' --- for index \(=0\), ``mil(le)'' ---
+% for index
+% \(=1\) --- or by ``\meta{$n$}illion(s)\textbar \meta{$n$}illiard(s)'' --- for index \(=2\)\\
+% \end{tabularx}
+% \begin{macrocode}
+\def\fc@muladdfrench#1#2#3{%
+ {%
+% \end{macrocode}
+% First we save input arguments \texttt{\#1} -- \texttt{\#3} to local macros \cs{@tempc}, \cs{@tempd} and
+% \cs{@tempf}.
+% \begin{macrocode}
+ \edef\@@tempc{#1}%
+ \edef\@@tempd{#2}%
+ \edef\@tempf{#3}%
+ \let\@tempc\@@tempc
+ \let\@tempd\@@tempd
+% \end{macrocode}
+% First we want to do the ``multiplication'' of \(d \Rightarrow \cs{@tempd}\) and of \(10^w \Rightarrow
+% \cs{@tempf}\). So, prior to this we do some preprocessing of \(d \Rightarrow \cs{@tempd}\): we force
+% \cs{@tempd} to \meta{empty} if both \(d=1\) and \(10^w\Rightarrow\) ``mil(le)'', this is because we,
+% French, we do not say ``un mil'', but just ``mil''.
+% \begin{macrocode}
+ \ifnum\@tempc=1 %
+ \ifnum\count9=1 %
+ \let\@tempd\@empty
+ \fi
+ \fi
+% \end{macrocode}
+% Now we do the ``multiplication'' of \(d = \cs{@tempd}\) and of \(10^w = \cs{@tempf}\), and place the result
+% into \cs{@tempg}.
+% \begin{macrocode}
+ \edef\@tempg{%
+ \@tempd
+ \ifx\@tempd\@empty\else
+ \ifx\@tempf\@empty\else
+ \ifcase\count9 %
+ \or
+ \fc@frenchoptions@submillion@dos
+ \or
+ \fc@frenchoptions@supermillion@dos
+ \fi
+ \fi
+ \fi
+ \@tempf
+ }%
+% \end{macrocode}
+% Now to the ``addition'' of \(a\Rightarrow \cs{@tempa}\) and \(d\times 10^w\Rightarrow \cs{@tempg}\), and
+% place the results into \cs{@temph}.
+% \begin{macrocode}
+ \edef\@temph{%
+ \@tempa
+ \ifx\@tempa\@empty\else
+ \ifx\@tempg\@empty\else
+ \ifcase\count8 %
+ \or
+ \fc@frenchoptions@submillion@dos
+ \or
+ \fc@frenchoptions@supermillion@dos
+ \fi
+ \fi
+ \fi
+ \@tempg
+ }%
+% \end{macrocode}
+% Now propagate the result --- i.e. the expansion of \cs{@temph} --- into macro \cs{@tempa} after closing
+% brace.
+% \begin{macrocode}
+ \def\@tempb##1{\def\@tempa{\def\@tempa{##1}}}%
+ \expandafter\@tempb\expandafter{\@temph}%
+ \expandafter
+ }\@tempa
+}%
+\global\let\fc@muladdfrench\fc@muladdfrench
+% \end{macrocode}
+% \DescribeMacro{\fc@lthundredstringfrench}Macro \cs{fc@lthundredstringfrench} is used to format a number in
+% interval \([0 \intv 99]\). First we check that it is not already defined.
+% \begin{macrocode}
+\ifcsundef{fc@lthundredstringfrench}{}{%
+ \PackageError{fmtcount}{Duplicate definition}{Redefinition of macro
+ `fc@lthundredstringfrench'}}
+% \end{macrocode}
+% The number to format is not passed as an argument to this macro, instead each digits of it is in a
+% \cs{fc@digit@\meta{w}} macro after this number has been parsed. So the only thing that
+% \cs{fc@lthundredstringfrench} needs is to know \meta{w} which is passed as \cs{count0} for the less
+% significant digit.\newline
+% \begin{tabularx}{\linewidth}{@{}>{\raggedleft\arraybackslash\ttfamily}rX@{}}
+% \#1&intput/output macro to which append the result
+% \end{tabularx}
+% Implicit input arguments as follows:\newline
+% \begin{tabularx}{\linewidth}{@{}>{\raggedleft\arraybackslash\ttfamily}rX@{}}
+% \cs{count0}&weight \(w\) of least significant digit \(d_{w}\).
+% \end{tabularx}
+% The formatted number is appended to the content of \#1, and the result is placed into \#1.
+% \begin{macrocode}
+\def\fc@lthundredstringfrench#1{%
+ {%
+% \end{macrocode}
+% First save arguments into local temporary macro.
+% \begin{macrocode}
+ \let\@tempc#1%
+% \end{macrocode}
+% Read units \(d_w\) to \cs{count1}.
+% \begin{macrocode}
+ \fc@read@unit{\count1}{\count0}%
+% \end{macrocode}
+% Read tens \(d_{w+1}\) to \cs{count2}.
+% \begin{macrocode}
+ \count3\count0 %
+ \advance\count3 1 %
+ \fc@read@unit{\count2}{\count3}%
+% \end{macrocode}
+% Now do the real job, set macro \cs{@tempa} to \texttt{\#1} followed by \(d_{w+1}d_w\) formatted.
+% \begin{macrocode}
+ \edef\@tempa{%
+ \@tempc
+ \ifnum\count2>1 %
+ % 20 .. 99
+ \ifnum\count2>6 %
+ % 70 .. 99
+ \ifnum\count2<8 %
+ % 70 .. 79
+ \@seventies{\count1}%
+ \else
+ % 80..99
+ \ifnum\count2<9 %
+ % 80 .. 89
+ \@eighties{\count1}%
+ \else
+ % 90 .. 99
+ \@nineties{\count1}%
+ \fi
+ \fi
+ \else
+ % 20..69
+ \@tenstring{\count2}%
+ \ifnum\count1>0 %
+ % x1 .. x0
+ \ifnum\count1=1 %
+ % x1
+ \fc@frenchoptions@submillion@dos\@andname\fc@frenchoptions@submillion@dos
+ \else
+ % x2 .. x9
+ -%
+ \fi
+ \@unitstring{\count1}%
+ \fi
+ \fi
+ \else
+ % 0 .. 19
+ \ifnum\count2=0 % when tens = 0
+ % 0 .. 9
+ \ifnum\count1=0 % when units = 0
+ % \count3=1 when #1 = 0, i.e. only for the unit of the top level number
+ \ifnum\count3=1 %
+ \ifnum\fc@max@weight=0 %
+ \@unitstring{0}%
+ \fi
+ \fi
+ \else
+ % 1 .. 9
+ \@unitstring{\count1}%
+ \fi
+ \else
+ % 10 .. 19
+ \@teenstring{\count1}%
+ \fi
+ \fi
+ }%
+% \end{macrocode}
+% Now propagate the expansion of \cs{@tempa} into \texttt{\#1} after closing brace.
+% \begin{macrocode}
+ \def\@tempb##1{\def\@tempa{\def#1{##1}}}%
+ \expandafter\@tempb\expandafter{\@tempa}%
+ \expandafter
+ }\@tempa
+}%
+\global\let\fc@lthundredstringfrench\fc@lthundredstringfrench
+% \end{macrocode}
+% \DescribeMacro{\fc@ltthousandstringfrench}Macro \cs{fc@ltthousandstringfrench} is used to format a number in
+% interval \([0 \intv 999]\). First we check that it is not already defined.
+% \begin{macrocode}
+\ifcsundef{fc@ltthousandstringfrench}{}{%
+ \PackageError{fmtcount}{Duplicate definition}{Redefinition of macro
+ `fc@ltthousandstringfrench'}}
+% \end{macrocode}
+% Output is empty for 0. Arguments as follows:\newline\noindent
+% \begin{tabularx}{\linewidth}{@{}>{\raggedleft\arraybackslash\ttfamily}rX@{}}
+% \#2&output, macro, formatted number \(d = d_{w+2}d_{w+1}d_w\)
+% \end{tabularx}
+% Implicit input arguments as follows:\newline\noindent
+% \begin{tabularx}{\linewidth}{@{}>{\raggedleft\arraybackslash\ttfamily}rX@{}}
+% \cs{count0}&input weight \(10^{w}\) of number \(d_{w+2}d_{w+1}d_w\) to be formatted.\\
+% \cs{count5}&least weight of formatted number with a non null digit.\\
+% \cs{count9}&input, power type indicator of \(10^{w}\) \(0\Rightarrow\varnothing\), \(1\Rightarrow\textrm {
+% ``mil(le)''}\), \(2\Rightarrow\textrm {\meta{$n$}illion(s)\textbar\meta{$n$}illiard(s)}\)\\
+% \end{tabularx}
+% \begin{macrocode}
+\def\fc@ltthousandstringfrench#1{%
+ {%
+% \end{macrocode}
+% Set counter \cs{count2} to digit \(d_{w+2}\), i.e. hundreds.
+% \begin{macrocode}
+ \count4\count0 %
+ \advance\count4 by 2 %
+ \fc@read@unit{\count2 }{\count4 }%
+% \end{macrocode}
+% Check that the two subsequent digits \(d_{w+1}d_w\) are non zero, place check-result into \cs{@tempa}.
+% \begin{macrocode}
+ \advance\count4 by -1 %
+ \count3\count4 %
+ \advance\count3 by -1 %
+ \fc@check@nonzeros{\count3 }{\count4 }\@tempa
+% \end{macrocode}
+% Compute plural mark of `cent' into \cs{@temps}.
+% \begin{macrocode}
+ \edef\@temps{%
+ \ifcase\fc@frenchoptions@cent@plural\space
+ % 0 => always
+ s%
+ \or
+ % 1 => never
+ \or
+ % 2 => multiple
+ \ifnum\count2>1s\fi
+ \or
+ % 3 => multiple g-last
+ \ifnum\count2>1 \ifnum\@tempa=0 \ifnum\count0=\count6s\fi\fi\fi
+ \or
+ % 4 => multiple l-last
+ \ifnum\count2>1 \ifnum\@tempa=0 \ifnum\count9=0s\else\ifnum\count9=2s\fi\fi\fi\fi
+ \fi
+ }%
+ % compute spacing after cent(s?) into \@tempb
+ \expandafter\let\expandafter\@tempb
+ \ifnum\@tempa>0 \fc@frenchoptions@submillion@dos\else\@empty\fi
+ % now place into \@tempa the hundreds
+ \edef\@tempa{%
+ \ifnum\count2=0 %
+ \else
+ \ifnum\count2=1 %
+ \expandafter\fc@wcase\@hundred\@nil
+ \else
+ \@unitstring{\count2}\fc@frenchoptions@submillion@dos
+ \noexpand\fc@wcase\@hundred\@temps\noexpand\@nil
+ \fi
+ \@tempb
+ \fi
+ }%
+ % now append to \@tempa the ten and unit
+ \fc@lthundredstringfrench\@tempa
+% \end{macrocode}
+% Propagate expansion of \cs{@tempa} into macro \texttt{\#1} after closing brace.
+% \begin{macrocode}
+ \def\@tempb##1{\def\@tempa{\def#1{##1}}}%
+ \expandafter\@tempb\expandafter{\@tempa}%
+ \expandafter
+ }\@tempa
+}%
+\global\let\fc@ltthousandstringfrench\fc@ltthousandstringfrench
+% \end{macrocode}
+% \DescribeMacro{\@@numberstringfrench}Macro \cs{@@numberstringfrench} is the main engine for formatting
+% cadinal numbers in French. First we check that the control sequence is not yet defined.
+% \begin{macrocode}
+\ifcsundef{@@numberstringfrench}{}{%
+ \PackageError{fmtcount}{Duplicate definition}{Redefinition of macro `@@numberstringfrench'}}
+% \end{macrocode}
+% Arguments are as follows:\newline\noindent
+% \begin{tabularx}{\linewidth}{@{}>{\raggedleft\arraybackslash\ttfamily}rX@{}}
+% \#1&number to convert to string\\
+% \#2&macro into which to place the result
+% \end{tabularx}
+% \begin{macrocode}
+\def\@@numberstringfrench#1#2{%
+ {%
+% \end{macrocode}
+% First parse input number to be formatted and do some error handling.
+% \begin{macrocode}
+ \edef\@tempa{#1}%
+ \expandafter\fc@number@parser\expandafter{\@tempa}%
+ \ifnum\fc@min@weight<0 %
+ \PackageError{fmtcount}{Out of range}%
+ {This macro does not work with fractional numbers}%
+ \fi
+% \end{macrocode}
+% In the sequel, \cs{@tempa} is used to accumulate the formatted number. Please note that \cs{space} after
+% \cs{fc@sign@case} is eaten by preceding number collection. This \cs{space} is needed so that when
+% \cs{fc@sign@case} expands to `\texttt{0}', then \cs{@tempa} is defined to `' (i.e. empty) rather than to
+% `\cs{relax}'.
+% \begin{macrocode}
+ \edef\@tempa{\ifcase\fc@sign@case\space\or\fc@wcase plus\@nil\or\fc@wcase moins\@nil\fi}%
+ \fc@nbrstr@preamble
+ \fc@@nbrstrfrench@inner
+ \fc@nbrstr@postamble
+% \end{macrocode}
+% Propagate the result --- i.e. expansion of \cs{@tempa} --- into macro \texttt{\#2} after closing brace.
+% \begin{macrocode}
+ \def\@tempb##1{\def\@tempa{\def#2{##1}}}%
+ \expandafter\@tempb\expandafter{\@tempa}%
+ \expandafter
+ }\@tempa
+}%
+\global\let\@@numberstringfrench\@@numberstringfrench
+% \end{macrocode}
+% \DescribeMacro{\fc@@nbrstrfrench@inner}Common part of \cs{@@numberstringfrench} and \cs
+% {@@ordinalstringfrench}. Arguments are as follows:\newline\noindent
+% \begin{tabularx}{\linewidth}{@{}>{\raggedleft\arraybackslash\ttfamily}rX@{}}
+% \cs{@tempa}&input/output, macro to which the result is to be aggregated, initially empty or contains the
+% sign indication.\\
+% \end{tabularx}
+% \begin{macrocode}
+\def\fc@@nbrstrfrench@inner{%
+% \end{macrocode}
+% Now loop, first we compute starting weight as
+% \(3\times\left\lfloor\frac{\cs{fc@max@weight}}{3}\right\rfloor\) into \cs{count0}.
+% \begin{macrocode}
+ \count0=\fc@max@weight
+ \divide\count0 by 3 %
+ \multiply\count0 by 3 %
+% \end{macrocode}
+% Now we compute final weight into \cs{count5}, and round down to multiple of \(3\) into
+% \cs{count6}. Warning: \cs{count6} is an implicit input argument to macro \cs{fc@ltthousandstringfrench}.
+% \begin{macrocode}
+ \fc@intpart@find@last{\count5 }%
+ \count6\count5 %
+ \divide\count6 3 %
+ \multiply\count6 3 %
+ \count8=0 %
+ \loop
+% \end{macrocode}
+% First we check whether digits in weight interval \([w \intv (w+2)]\) are all zero and place check result
+% into macro \cs{@tempt}.
+% \begin{macrocode}
+ \count1\count0 %
+ \advance\count1 by 2 %
+ \fc@check@nonzeros{\count0 }{\count1 }\@tempt
+% \end{macrocode}
+% Now we generate the power of ten \(10^w\), formatted power of ten goes to \cs{@tempb}, while power type
+% indicator goes to \cs{count9}.
+% \begin{macrocode}
+ \fc@poweroften\@tempt{\count9 }\@tempb
+% \end{macrocode}
+% Now we generate the formatted number \(d\) into macro \cs{@tempd} by which we need to multiply
+% \(10^w\). Implicit input argument is \cs{count9} for power type of \(10^9\), and \cs{count6}
+% \begin{macrocode}
+ \fc@ltthousandstringfrench\@tempd
+% \end{macrocode}
+% Finally do the multiplication-addition. Implicit arguments are \cs{@tempa} for input/output growing
+% formatted number, \cs{count8} for input previous power type, i.e. power type of \(10^{w+3}\), \cs{count9}
+% for input current power type, i.e. power type of \(10^w\).
+% \begin{macrocode}
+ \fc@muladdfrench\@tempt\@tempd\@tempb
+% \end{macrocode}
+% Then iterate.
+% \begin{macrocode}
+ \count8\count9 %
+ \advance\count0 by -3 %
+ \ifnum\count6>\count0 \else
+ \repeat
+}%
+\global\let\fc@@nbrstrfrench@inner\fc@@nbrstrfrench@inner
+% \end{macrocode}
+% \DescribeMacro{\@@ordinalstringfrench}Macro \cs{@@ordinalstringfrench} is the main engine for formatting
+% ordinal numbers in French. First check it is not yet defined.
+% \begin{macrocode}
+\ifcsundef{@@ordinalstringfrench}{}{%
+ \PackageError{fmtcount}{Duplicate definition}{Redefinition of macro
+ `@@ordinalstringfrench'}}
+% \end{macrocode}
+% Arguments are as follows:\newline\noindent
+% \begin{tabularx}{\linewidth}{@{}>{\raggedleft\arraybackslash\ttfamily}rX@{}}
+% \#1&number to convert to string\\
+% \#2&macro into which to place the result
+% \end{tabularx}
+% \begin{macrocode}
+\def\@@ordinalstringfrench#1#2{%
+ {%
+% \end{macrocode}
+% First parse input number to be formatted and do some error handling.
+% \begin{macrocode}
+ \edef\@tempa{#1}%
+ \expandafter\fc@number@parser\expandafter{\@tempa}%
+ \ifnum\fc@min@weight<0 %
+ \PackageError{fmtcount}{Out of range}%
+ {This macro does not work with fractional numbers}%
+ \fi
+ \ifnum\fc@sign@case>0 %
+ \PackageError{fmtcount}{Out of range}%
+ {This macro does with negative or explicitly marked as positive numbers}%
+ \fi
+% \end{macrocode}
+% Now handle the special case of first. We set \cs{count0} to \texttt{1} if we are in this case, and to
+% \texttt{0} otherwise
+% \begin{macrocode}
+ \ifnum\fc@max@weight=0 %
+ \ifnum\csname fc@digit@0\endcsname=1 %
+ \count0=1 %
+ \else
+ \count0=0 %
+ \fi
+ \else
+ \count0=0 %
+ \fi
+ \ifnum\count0=1 %
+% \end{macrocode}
+% \changes{3.01}{2014-11-10}{Protect \cs{`}, for solving
+% \uref{http://github.com/nlct/fmtcount/issues/15}{Issue \#15}}
+% \begin{macrocode}
+ \protected@edef\@tempa{\expandafter\fc@wcase\fc@first\@nil}%
+ \else
+% \end{macrocode}
+% Now we tamper a little bit with the plural handling options to ensure that there is no final plural mark.
+% \begin{macrocode}
+ \def\@tempa##1{%
+ \expandafter\edef\csname fc@frenchoptions@##1@plural\endcsname{%
+ \ifcase\csname fc@frenchoptions@##1@plural\endcsname\space
+ 0% 0: always => always
+ \or
+ 1% 1: never => never
+ \or
+ 6% 2: multiple => multiple ng-last
+ \or
+ 1% 3: multiple g-last => never
+ \or
+ 5% 4: multiple l-last => multiple lng-last
+ \or
+ 5% 5: multiple lng-last => multiple lng-last
+ \or
+ 6% 6: multiple ng-last => multiple ng-last
+ \fi
+ }%
+ }%
+ \@tempa{vingt}%
+ \@tempa{cent}%
+ \@tempa{mil}%
+ \@tempa{n-illion}%
+ \@tempa{n-illiard}%
+% \end{macrocode}
+% Now make \cs{fc@wcase} and \cs{@nil} non expandable
+% \begin{macrocode}
+ \let\fc@wcase@save\fc@wcase
+ \def\fc@wcase{\noexpand\fc@wcase}%
+ \def\@nil{\noexpand\@nil}%
+% \end{macrocode}
+% In the sequel, \cs{@tempa} is used to accumulate the formatted number.
+% \begin{macrocode}
+ \let\@tempa\@empty
+ \fc@@nbrstrfrench@inner
+% \end{macrocode}
+% Now restore \cs{fc@wcase}
+% \begin{macrocode}
+ \let\fc@wcase\fc@wcase@save
+% \end{macrocode}
+% Now we add the ``i\`eme'' ending
+% \changes{3.01}{2014-11-10}{Protect \cs{`}, for solving
+% \uref{http://github.com/nlct/fmtcount/issues/15}{Issue \#15}}
+% \begin{macrocode}
+ \expandafter\fc@get@last@word\expandafter{\@tempa}\@tempb\@tempc
+ \expandafter\fc@get@last@letter\expandafter{\@tempc}\@tempd\@tempe
+ \def\@tempf{e}%
+ \ifx\@tempe\@tempf
+ \protected@edef\@tempa{\@tempb\expandafter\fc@wcase\@tempd i\protect\`eme\@nil}%
+ \else
+ \def\@tempf{q}%
+ \ifx\@tempe\@tempf
+ \protected@edef\@tempa{\@tempb\expandafter\fc@wcase\@tempd qui\protect\`eme\@nil}%
+ \else
+ \def\@tempf{f}%
+ \ifx\@tempe\@tempf
+ \protected@edef\@tempa{\@tempb\expandafter\fc@wcase\@tempd vi\protect\`eme\@nil}%
+ \else
+ \protected@edef\@tempa{\@tempb\expandafter\fc@wcase\@tempc i\protect\`eme\@nil}%
+ \fi
+ \fi
+ \fi
+ \fi
+% \end{macrocode}
+% Apply \cs{fc@gcase} to the result.
+% \begin{macrocode}
+ \fc@apply@gcase
+% \end{macrocode}
+% Propagate the result --- i.e. expansion of \cs{@tempa} --- into macro \texttt{\#2} after closing brace.
+% \begin{macrocode}
+ \def\@tempb##1{\def\@tempa{\def#2{##1}}}%
+ \expandafter\@tempb\expandafter{\@tempa}%
+ \expandafter
+ }\@tempa
+}%
+\global\let\@@ordinalstringfrench\@@ordinalstringfrench
+% \end{macrocode}
+% Macro \cs{fc@frenchoptions@setdefaults} allows to set all options to default for the French.
+% \begin{macrocode}
+\newcommand*\fc@frenchoptions@setdefaults{%
+ \csname KV@fcfrench@all plural\endcsname{reformed}%
+ \fc@gl@def\fc@frenchoptions@submillion@dos{-}%
+ \fc@gl@let\fc@frenchoptions@supermillion@dos\space
+ \fc@gl@let\fc@u@in@duo\@empty% Could be `u'
+ % \fc@gl@let\fc@poweroften\fc@@pot@longscalefrench
+ \fc@gl@let\fc@poweroften\fc@@pot@recursivefrench
+ \fc@gl@def\fc@longscale@nilliard@upto{0}% infinity
+ \fc@gl@def\fc@frenchoptions@mil@plural@mark{le}%
+}%
+\global\let\fc@frenchoptions@setdefaults\fc@frenchoptions@setdefaults
+{%
+ \let\fc@gl@def\gdef
+ \def\fc@gl@let{\global\let}%
+ \fc@frenchoptions@setdefaults
+}%
+% \end{macrocode}
+% Make some indirection to call the current French dialect corresponding macro.
+% \changes{3.01}{2014-12-18}{Move French specific stuff from \styfmt{fmtcount.sty} to \styfmt{fc-french.def}.}
+% \begin{macrocode}
+\gdef\@ordinalstringMfrench{\csuse{@ordinalstringMfrench\fmtcount@french}}%
+\gdef\@ordinalstringFfrench{\csuse{@ordinalstringFfrench\fmtcount@french}}%
+\gdef\@OrdinalstringMfrench{\csuse{@OrdinalstringMfrench\fmtcount@french}}%
+\gdef\@OrdinalstringFfrench{\csuse{@OrdinalstringFfrench\fmtcount@french}}%
+\gdef\@numberstringMfrench{\csuse{@numberstringMfrench\fmtcount@french}}%
+\gdef\@numberstringFfrench{\csuse{@numberstringFfrench\fmtcount@french}}%
+\gdef\@NumberstringMfrench{\csuse{@NumberstringMfrench\fmtcount@french}}%
+\gdef\@NumberstringFfrench{\csuse{@NumberstringFfrench\fmtcount@french}}%
+% \end{macrocode}
+\iffalse Local variables: \fi
+\iffalse mode: docTeX \fi
+\iffalse End: \fi
+%\iffalse
+% \begin{macrocode}
+%</fc-french.def>
+% \end{macrocode}
+%\fi
+%\iffalse
+% \begin{macrocode}
+%<*fc-frenchb.def>
+% \end{macrocode}
+%\fi
+% \subsubsection{fc-frenchb.def}
+% \begin{macrocode}
+\ProvidesFCLanguage{frenchb}[2013/08/17]%
+\FCloadlang{french}%
+% \end{macrocode}
+% Set |frenchb| to be equivalent to |french|.
+% \begin{macrocode}
+\global\let\@ordinalMfrenchb=\@ordinalMfrench
+\global\let\@ordinalFfrenchb=\@ordinalFfrench
+\global\let\@ordinalNfrenchb=\@ordinalNfrench
+\global\let\@numberstringMfrenchb=\@numberstringMfrench
+\global\let\@numberstringFfrenchb=\@numberstringFfrench
+\global\let\@numberstringNfrenchb=\@numberstringNfrench
+\global\let\@NumberstringMfrenchb=\@NumberstringMfrench
+\global\let\@NumberstringFfrenchb=\@NumberstringFfrench
+\global\let\@NumberstringNfrenchb=\@NumberstringNfrench
+\global\let\@ordinalstringMfrenchb=\@ordinalstringMfrench
+\global\let\@ordinalstringFfrenchb=\@ordinalstringFfrench
+\global\let\@ordinalstringNfrenchb=\@ordinalstringNfrench
+\global\let\@OrdinalstringMfrenchb=\@OrdinalstringMfrench
+\global\let\@OrdinalstringFfrenchb=\@OrdinalstringFfrench
+\global\let\@OrdinalstringNfrenchb=\@OrdinalstringNfrench
+% \end{macrocode}
+
+%\iffalse
+% \begin{macrocode}
+%</fc-frenchb.def>
+% \end{macrocode}
+%\fi
+%\iffalse
+% \begin{macrocode}
+%<*fc-german.def>
+% \end{macrocode}
+%\fi
+% \subsubsection{fc-german.def}
+% German definitions (thank you to K. H. Fricke for supplying
+% this information)
+% \begin{macrocode}
+\ProvidesFCLanguage{german}[2016/01/12]%
+% \end{macrocode}
+% Define macro that converts a number or count register (first
+% argument) to an ordinal, and stores the result in the
+% second argument, which must be a control sequence.
+% Masculine:
+% \begin{macrocode}
+\newcommand{\@ordinalMgerman}[2]{%
+ \edef#2{\number#1\relax.}%
+}%
+\global\let\@ordinalMgerman\@ordinalMgerman
+% \end{macrocode}
+% Feminine:
+% \begin{macrocode}
+\newcommand{\@ordinalFgerman}[2]{%
+ \edef#2{\number#1\relax.}%
+}%
+\global\let\@ordinalFgerman\@ordinalFgerman
+% \end{macrocode}
+% Neuter:
+% \begin{macrocode}
+\newcommand{\@ordinalNgerman}[2]{%
+ \edef#2{\number#1\relax.}%
+}%
+\global\let\@ordinalNgerman\@ordinalNgerman
+% \end{macrocode}
+% Convert a number to text. The easiest way to do this is to
+% break it up into units, tens and teens.
+% Units (argument must be a number from 0 to 9, 1 on its own (eins)
+% is dealt with separately):
+% \begin{macrocode}
+\newcommand*\@@unitstringgerman[1]{%
+ \ifcase#1%
+ null%
+ \or ein%
+ \or zwei%
+ \or drei%
+ \or vier%
+ \or f\"unf%
+ \or sechs%
+ \or sieben%
+ \or acht%
+ \or neun%
+ \fi
+}%
+\global\let\@@unitstringgerman\@@unitstringgerman
+% \end{macrocode}
+% Tens (argument must go from 1 to 10):
+% \begin{macrocode}
+\newcommand*\@@tenstringgerman[1]{%
+ \ifcase#1%
+ \or zehn%
+ \or zwanzig%
+ \or drei{\ss}ig%
+ \or vierzig%
+ \or f\"unfzig%
+ \or sechzig%
+ \or siebzig%
+ \or achtzig%
+ \or neunzig%
+ \or einhundert%
+ \fi
+}%
+\global\let\@@tenstringgerman\@@tenstringgerman
+% \end{macrocode}
+% |\einhundert| is set to |einhundert| by default, user can
+% redefine this command to just |hundert| if required, similarly
+% for |\eintausend|.
+% \begin{macrocode}
+\providecommand*{\einhundert}{einhundert}%
+\providecommand*{\eintausend}{eintausend}%
+\global\let\einhundert\einhundert
+\global\let\eintausend\eintausend
+% \end{macrocode}
+% Teens:
+% \begin{macrocode}
+\newcommand*\@@teenstringgerman[1]{%
+ \ifcase#1%
+ zehn%
+ \or elf%
+ \or zw\"olf%
+ \or dreizehn%
+ \or vierzehn%
+ \or f\"unfzehn%
+ \or sechzehn%
+ \or siebzehn%
+ \or achtzehn%
+ \or neunzehn%
+ \fi
+}%
+\global\let\@@teenstringgerman\@@teenstringgerman
+% \end{macrocode}
+% The results are stored in the second argument, but doesn't display
+% anything.%
+% \changes{3.02}{2016/01/12}{Replace \cs{DeclareRobustCommand} by
+% \cs{newcommand*} as robustness is handled now at top level in
+% \texttt{fmtcount.sty}, and we don't need \cs{long} macros. Concerned
+% macros are \cs{@numberstringMgerman}, \cs{@NumberstringMgerman},
+% \cs{@ordinalstringMgerman}, \cs{@ordinalstringFgerman},
+% \cs{@ordinalstringNgerman}, \cs{@OrdinalstringMgerman},
+% \cs{@OrdinalstringFgerman}, and \cs{@OrdinalstringNgerman}.}
+% \begin{macrocode}
+\newcommand*{\@numberstringMgerman}[2]{%
+ \let\@unitstring=\@@unitstringgerman
+ \let\@teenstring=\@@teenstringgerman
+ \let\@tenstring=\@@tenstringgerman
+ \@@numberstringgerman{#1}{#2}%
+}%
+\global\let\@numberstringMgerman\@numberstringMgerman
+% \end{macrocode}
+% Feminine and neuter forms:
+% \begin{macrocode}
+\global\let\@numberstringFgerman=\@numberstringMgerman
+\global\let\@numberstringNgerman=\@numberstringMgerman
+% \end{macrocode}
+% As above, but initial letters in upper case:
+% \begin{macrocode}
+\newcommand*{\@NumberstringMgerman}[2]{%
+ \@numberstringMgerman{#1}{\@@num@str}%
+ \edef#2{\noexpand\MakeUppercase\expandonce\@@num@str}%
+}%
+\global\let\@NumberstringMgerman\@NumberstringMgerman
+% \end{macrocode}
+% Feminine and neuter form:
+% \begin{macrocode}
+\global\let\@NumberstringFgerman=\@NumberstringMgerman
+\global\let\@NumberstringNgerman=\@NumberstringMgerman
+% \end{macrocode}
+% As above, but for ordinals.
+% \begin{macrocode}
+\newcommand*{\@ordinalstringMgerman}[2]{%
+ \let\@unitthstring=\@@unitthstringMgerman
+ \let\@teenthstring=\@@teenthstringMgerman
+ \let\@tenthstring=\@@tenthstringMgerman
+ \let\@unitstring=\@@unitstringgerman
+ \let\@teenstring=\@@teenstringgerman
+ \let\@tenstring=\@@tenstringgerman
+ \def\@thousandth{tausendster}%
+ \def\@hundredth{hundertster}%
+ \@@ordinalstringgerman{#1}{#2}%
+}%
+\global\let\@ordinalstringMgerman\@ordinalstringMgerman
+% \end{macrocode}
+% Feminine form:
+% \begin{macrocode}
+\newcommand*{\@ordinalstringFgerman}[2]{%
+ \let\@unitthstring=\@@unitthstringFgerman
+ \let\@teenthstring=\@@teenthstringFgerman
+ \let\@tenthstring=\@@tenthstringFgerman
+ \let\@unitstring=\@@unitstringgerman
+ \let\@teenstring=\@@teenstringgerman
+ \let\@tenstring=\@@tenstringgerman
+ \def\@thousandth{tausendste}%
+ \def\@hundredth{hundertste}%
+ \@@ordinalstringgerman{#1}{#2}%
+}%
+\global\let\@ordinalstringFgerman\@ordinalstringFgerman
+% \end{macrocode}
+% Neuter form:
+% \begin{macrocode}
+\newcommand*{\@ordinalstringNgerman}[2]{%
+ \let\@unitthstring=\@@unitthstringNgerman
+ \let\@teenthstring=\@@teenthstringNgerman
+ \let\@tenthstring=\@@tenthstringNgerman
+ \let\@unitstring=\@@unitstringgerman
+ \let\@teenstring=\@@teenstringgerman
+ \let\@tenstring=\@@tenstringgerman
+ \def\@thousandth{tausendstes}%
+ \def\@hundredth{hunderstes}%
+ \@@ordinalstringgerman{#1}{#2}%
+}%
+\global\let\@ordinalstringNgerman\@ordinalstringNgerman
+% \end{macrocode}
+% As above, but with initial letters in upper case.
+% \begin{macrocode}
+\newcommand*{\@OrdinalstringMgerman}[2]{%
+ \@ordinalstringMgerman{#1}{\@@num@str}%
+ \edef#2{\noexpand\MakeUppercase\expandonce\@@num@str}%
+}%
+\global\let\@OrdinalstringMgerman\@OrdinalstringMgerman
+% \end{macrocode}
+% Feminine form:
+% \begin{macrocode}
+\newcommand*{\@OrdinalstringFgerman}[2]{%
+ \@ordinalstringFgerman{#1}{\@@num@str}%
+ \edef#2{\noexpand\MakeUppercase\expandonce\@@num@str}%
+}%
+\global\let\@OrdinalstringFgerman\@OrdinalstringFgerman
+% \end{macrocode}
+% Neuter form:
+% \begin{macrocode}
+\newcommand*{\@OrdinalstringNgerman}[2]{%
+ \@ordinalstringNgerman{#1}{\@@num@str}%
+ \edef#2{\noexpand\MakeUppercase\expandonce\@@num@str}%
+}%
+\global\let\@OrdinalstringNgerman\@OrdinalstringNgerman
+% \end{macrocode}
+% Code for converting numbers into textual ordinals. As before,
+% it is easier to split it into units, tens and teens.
+% Units:
+%\changes{2.0}{2012-09-25}{fixed spelling mistake (correction
+%provided by Dominik Wa\ss enhoven)}
+% \begin{macrocode}
+\newcommand*\@@unitthstringMgerman[1]{%
+ \ifcase#1%
+ nullter%
+ \or erster%
+ \or zweiter%
+ \or dritter%
+ \or vierter%
+ \or f\"unfter%
+ \or sechster%
+ \or siebter%
+ \or achter%
+ \or neunter%
+ \fi
+}%
+\global\let\@@unitthstringMgerman\@@unitthstringMgerman
+% \end{macrocode}
+% Tens:
+% \begin{macrocode}
+\newcommand*\@@tenthstringMgerman[1]{%
+ \ifcase#1%
+ \or zehnter%
+ \or zwanzigster%
+ \or drei{\ss}igster%
+ \or vierzigster%
+ \or f\"unfzigster%
+ \or sechzigster%
+ \or siebzigster%
+ \or achtzigster%
+ \or neunzigster%
+ \fi
+}%
+\global\let\@@tenthstringMgerman\@@tenthstringMgerman
+% \end{macrocode}
+% Teens:
+% \begin{macrocode}
+\newcommand*\@@teenthstringMgerman[1]{%
+ \ifcase#1%
+ zehnter%
+ \or elfter%
+ \or zw\"olfter%
+ \or dreizehnter%
+ \or vierzehnter%
+ \or f\"unfzehnter%
+ \or sechzehnter%
+ \or siebzehnter%
+ \or achtzehnter%
+ \or neunzehnter%
+ \fi
+}%
+\global\let\@@teenthstringMgerman\@@teenthstringMgerman
+% \end{macrocode}
+% Units (feminine):
+% \begin{macrocode}
+\newcommand*\@@unitthstringFgerman[1]{%
+ \ifcase#1%
+ nullte%
+ \or erste%
+ \or zweite%
+ \or dritte%
+ \or vierte%
+ \or f\"unfte%
+ \or sechste%
+ \or siebte%
+ \or achte%
+ \or neunte%
+ \fi
+}%
+\global\let\@@unitthstringFgerman\@@unitthstringFgerman
+% \end{macrocode}
+% Tens (feminine):
+% \begin{macrocode}
+\newcommand*\@@tenthstringFgerman[1]{%
+ \ifcase#1%
+ \or zehnte%
+ \or zwanzigste%
+ \or drei{\ss}igste%
+ \or vierzigste%
+ \or f\"unfzigste%
+ \or sechzigste%
+ \or siebzigste%
+ \or achtzigste%
+ \or neunzigste%
+ \fi
+}%
+\global\let\@@tenthstringFgerman\@@tenthstringFgerman
+% \end{macrocode}
+% Teens (feminine)
+% \begin{macrocode}
+\newcommand*\@@teenthstringFgerman[1]{%
+ \ifcase#1%
+ zehnte%
+ \or elfte%
+ \or zw\"olfte%
+ \or dreizehnte%
+ \or vierzehnte%
+ \or f\"unfzehnte%
+ \or sechzehnte%
+ \or siebzehnte%
+ \or achtzehnte%
+ \or neunzehnte%
+ \fi
+}%
+\global\let\@@teenthstringFgerman\@@teenthstringFgerman
+% \end{macrocode}
+% Units (neuter):
+%\changes{2.0}{2012-09-25}{fixed spelling mistake (correction
+%provided by Dominik Wa\ss enhoven)}
+% \begin{macrocode}
+\newcommand*\@@unitthstringNgerman[1]{%
+ \ifcase#1%
+ nulltes%
+ \or erstes%
+ \or zweites%
+ \or drittes%
+ \or viertes%
+ \or f\"unftes%
+ \or sechstes%
+ \or siebtes%
+ \or achtes%
+ \or neuntes%
+ \fi
+}%
+\global\let\@@unitthstringNgerman\@@unitthstringNgerman
+% \end{macrocode}
+% Tens (neuter):
+% \begin{macrocode}
+\newcommand*\@@tenthstringNgerman[1]{%
+ \ifcase#1%
+ \or zehntes%
+ \or zwanzigstes%
+ \or drei{\ss}igstes%
+ \or vierzigstes%
+ \or f\"unfzigstes%
+ \or sechzigstes%
+ \or siebzigstes%
+ \or achtzigstes%
+ \or neunzigstes%
+ \fi
+}%
+\global\let\@@tenthstringNgerman\@@tenthstringNgerman
+% \end{macrocode}
+% Teens (neuter)
+% \begin{macrocode}
+\newcommand*\@@teenthstringNgerman[1]{%
+ \ifcase#1%
+ zehntes%
+ \or elftes%
+ \or zw\"olftes%
+ \or dreizehntes%
+ \or vierzehntes%
+ \or f\"unfzehntes%
+ \or sechzehntes%
+ \or siebzehntes%
+ \or achtzehntes%
+ \or neunzehntes%
+ \fi
+}%
+\global\let\@@teenthstringNgerman\@@teenthstringNgerman
+% \end{macrocode}
+% This appends the results to |\#2| for number |\#2| (in range 0 to
+% 100.)
+% null and eins are dealt with separately in
+% |\@@numberstringgerman|.
+% \begin{macrocode}
+\newcommand*\@@numberunderhundredgerman[2]{%
+\ifnum#1<10\relax
+ \ifnum#1>0\relax
+ \eappto#2{\@unitstring{#1}}%
+ \fi
+\else
+ \@tmpstrctr=#1\relax
+ \@FCmodulo{\@tmpstrctr}{10}%
+ \ifnum#1<20\relax
+ \eappto#2{\@teenstring{\@tmpstrctr}}%
+ \else
+ \ifnum\@tmpstrctr=0\relax
+ \else
+ \eappto#2{\@unitstring{\@tmpstrctr}und}%
+ \fi
+ \@tmpstrctr=#1\relax
+ \divide\@tmpstrctr by 10\relax
+ \eappto#2{\@tenstring{\@tmpstrctr}}%
+ \fi
+\fi
+}%
+\global\let\@@numberunderhundredgerman\@@numberunderhundredgerman
+% \end{macrocode}
+% This stores the results in the second argument
+% (which must be a control
+% sequence), but it doesn't display anything.
+% \begin{macrocode}
+\newcommand*\@@numberstringgerman[2]{%
+\ifnum#1>99999\relax
+ \PackageError{fmtcount}{Out of range}%
+ {This macro only works for values less than 100000}%
+\else
+ \ifnum#1<0\relax
+ \PackageError{fmtcount}{Negative numbers not permitted}%
+ {This macro does not work for negative numbers, however
+ you can try typing "minus" first, and then pass the modulus of
+ this number}%
+ \fi
+\fi
+\def#2{}%
+\@strctr=#1\relax \divide\@strctr by 1000\relax
+\ifnum\@strctr>1\relax
+% \end{macrocode}
+% \#1 is $\geq 2000$, \cs{@strctr} now contains the number of thousands
+% \begin{macrocode}
+ \@@numberunderhundredgerman{\@strctr}{#2}%
+ \appto#2{tausend}%
+\else
+% \end{macrocode}
+% \#1 lies in range [1000,1999]
+% \begin{macrocode}
+ \ifnum\@strctr=1\relax
+ \eappto#2{\eintausend}%
+ \fi
+\fi
+\@strctr=#1\relax
+\@FCmodulo{\@strctr}{1000}%
+\divide\@strctr by 100\relax
+\ifnum\@strctr>1\relax
+% \end{macrocode}
+% now dealing with number in range [200,999]
+% \begin{macrocode}
+ \eappto#2{\@unitstring{\@strctr}hundert}%
+\else
+ \ifnum\@strctr=1\relax
+% \end{macrocode}
+% dealing with number in range [100,199]
+% \begin{macrocode}
+ \ifnum#1>1000\relax
+% \end{macrocode}
+% if original number $> 1000$, use einhundert
+% \begin{macrocode}
+ \appto#2{einhundert}%
+ \else
+% \end{macrocode}
+% otherwise use \cs{einhundert}
+% \begin{macrocode}
+ \eappto#2{\einhundert}%
+ \fi
+ \fi
+\fi
+\@strctr=#1\relax
+\@FCmodulo{\@strctr}{100}%
+\ifnum#1=0\relax
+ \def#2{null}%
+\else
+ \ifnum\@strctr=1\relax
+ \appto#2{eins}%
+ \else
+ \@@numberunderhundredgerman{\@strctr}{#2}%
+ \fi
+\fi
+}%
+\global\let\@@numberstringgerman\@@numberstringgerman
+% \end{macrocode}
+% As above, but for ordinals
+% \begin{macrocode}
+\newcommand*\@@numberunderhundredthgerman[2]{%
+\ifnum#1<10\relax
+ \eappto#2{\@unitthstring{#1}}%
+\else
+ \@tmpstrctr=#1\relax
+ \@FCmodulo{\@tmpstrctr}{10}%
+ \ifnum#1<20\relax
+ \eappto#2{\@teenthstring{\@tmpstrctr}}%
+ \else
+ \ifnum\@tmpstrctr=0\relax
+ \else
+ \eappto#2{\@unitstring{\@tmpstrctr}und}%
+ \fi
+ \@tmpstrctr=#1\relax
+ \divide\@tmpstrctr by 10\relax
+ \eappto#2{\@tenthstring{\@tmpstrctr}}%
+ \fi
+\fi
+}%
+\global\let\@@numberunderhundredthgerman\@@numberunderhundredthgerman
+% \end{macrocode}
+% \begin{macrocode}
+\newcommand*\@@ordinalstringgerman[2]{%
+\ifnum#1>99999\relax
+ \PackageError{fmtcount}{Out of range}%
+ {This macro only works for values less than 100000}%
+\else
+ \ifnum#1<0\relax
+ \PackageError{fmtcount}{Negative numbers not permitted}%
+ {This macro does not work for negative numbers, however
+ you can try typing "minus" first, and then pass the modulus of
+ this number}%
+ \fi
+\fi
+\def#2{}%
+\@strctr=#1\relax \divide\@strctr by 1000\relax
+\ifnum\@strctr>1\relax
+% \end{macrocode}
+% \#1 is $\geq 2000$, \cs{@strctr} now contains the number of thousands
+% \begin{macrocode}
+\@@numberunderhundredgerman{\@strctr}{#2}%
+% \end{macrocode}
+% is that it, or is there more?
+% \begin{macrocode}
+ \@tmpstrctr=#1\relax \@FCmodulo{\@tmpstrctr}{1000}%
+ \ifnum\@tmpstrctr=0\relax
+ \eappto#2{\@thousandth}%
+ \else
+ \appto#2{tausend}%
+ \fi
+\else
+% \end{macrocode}
+% \#1 lies in range [1000,1999]
+% \begin{macrocode}
+ \ifnum\@strctr=1\relax
+ \ifnum#1=1000\relax
+ \eappto#2{\@thousandth}%
+ \else
+ \eappto#2{\eintausend}%
+ \fi
+ \fi
+\fi
+\@strctr=#1\relax
+\@FCmodulo{\@strctr}{1000}%
+\divide\@strctr by 100\relax
+\ifnum\@strctr>1\relax
+% \end{macrocode}
+% now dealing with number in range [200,999]
+% is that it, or is there more?
+% \begin{macrocode}
+ \@tmpstrctr=#1\relax \@FCmodulo{\@tmpstrctr}{100}%
+ \ifnum\@tmpstrctr=0\relax
+ \ifnum\@strctr=1\relax
+ \eappto#2{\@hundredth}%
+ \else
+ \eappto#2{\@unitstring{\@strctr}\@hundredth}%
+ \fi
+ \else
+ \eappto#2{\@unitstring{\@strctr}hundert}%
+ \fi
+\else
+ \ifnum\@strctr=1\relax
+% \end{macrocode}
+% dealing with number in range [100,199]
+% is that it, or is there more?
+% \begin{macrocode}
+ \@tmpstrctr=#1\relax \@FCmodulo{\@tmpstrctr}{100}%
+ \ifnum\@tmpstrctr=0\relax
+ \eappto#2{\@hundredth}%
+ \else
+ \ifnum#1>1000\relax
+ \appto#2{einhundert}%
+ \else
+ \eappto#2{\einhundert}%
+ \fi
+ \fi
+ \fi
+\fi
+\@strctr=#1\relax
+\@FCmodulo{\@strctr}{100}%
+\ifthenelse{\@strctr=0 \and #1>0}{}{%
+\@@numberunderhundredthgerman{\@strctr}{#2}%
+}%
+}%
+\global\let\@@ordinalstringgerman\@@ordinalstringgerman
+% \end{macrocode}
+% Load fc-germanb.def if not already loaded
+% \begin{macrocode}
+\FCloadlang{germanb}%
+% \end{macrocode}
+\iffalse Local variables: \fi
+\iffalse mode: docTeX \fi
+\iffalse End: \fi
+%\iffalse
+% \begin{macrocode}
+%</fc-german.def>
+% \end{macrocode}
+%\fi
+%\iffalse
+% \begin{macrocode}
+%<*fc-germanb.def>
+% \end{macrocode}
+%\fi
+% \subsubsection{fc-germanb.def}
+% \begin{macrocode}
+\ProvidesFCLanguage{germanb}[2013/08/17]%
+% \end{macrocode}
+% Load fc-german.def if not already loaded
+% \begin{macrocode}
+\FCloadlang{german}%
+% \end{macrocode}
+% Set |germanb| to be equivalent to |german|.
+% \begin{macrocode}
+\global\let\@ordinalMgermanb=\@ordinalMgerman
+\global\let\@ordinalFgermanb=\@ordinalFgerman
+\global\let\@ordinalNgermanb=\@ordinalNgerman
+\global\let\@numberstringMgermanb=\@numberstringMgerman
+\global\let\@numberstringFgermanb=\@numberstringFgerman
+\global\let\@numberstringNgermanb=\@numberstringNgerman
+\global\let\@NumberstringMgermanb=\@NumberstringMgerman
+\global\let\@NumberstringFgermanb=\@NumberstringFgerman
+\global\let\@NumberstringNgermanb=\@NumberstringNgerman
+\global\let\@ordinalstringMgermanb=\@ordinalstringMgerman
+\global\let\@ordinalstringFgermanb=\@ordinalstringFgerman
+\global\let\@ordinalstringNgermanb=\@ordinalstringNgerman
+\global\let\@OrdinalstringMgermanb=\@OrdinalstringMgerman
+\global\let\@OrdinalstringFgermanb=\@OrdinalstringFgerman
+\global\let\@OrdinalstringNgermanb=\@OrdinalstringNgerman
+% \end{macrocode}
+
+%\iffalse
+% \begin{macrocode}
+%</fc-germanb.def>
+% \end{macrocode}
+%\fi
+%\iffalse
+% \begin{macrocode}
+%<*fc-italian.def>
+% \end{macrocode}
+%\fi
+% \subsubsection{fc-italian}
+% Italian support is now handled by interfacing to Enrico Gregorio's
+% itnumpar package.
+% \begin{macrocode}
+\ProvidesFCLanguage{italian}[2013/08/17]
+
+\RequirePackage{itnumpar}
+
+\newcommand{\@numberstringMitalian}[2]{%
+ \edef#2{\noexpand\printnumeroinparole{#1}}%
+}
+\global\let\@numberstringMitalian\@numberstringMitalian
+
+\newcommand{\@numberstringFitalian}[2]{%
+ \edef#2{\noexpand\printnumeroinparole{#1}}}
+
+\global\let\@numberstringFitalian\@numberstringFitalian
+
+\newcommand{\@NumberstringMitalian}[2]{%
+ \edef#2{\noexpand\printNumeroinparole{#1}}%
+}
+\global\let\@NumberstringMitalian\@NumberstringMitalian
+
+\newcommand{\@NumberstringFitalian}[2]{%
+ \edef#2{\noexpand\printNumeroinparole{#1}}%
+}
+\global\let\@NumberstringFitalian\@NumberstringFitalian
+
+\newcommand{\@ordinalstringMitalian}[2]{%
+ \edef#2{\noexpand\printordinalem{#1}}%
+}
+\global\let\@ordinalstringMitalian\@ordinalstringMitalian
+
+\newcommand{\@ordinalstringFitalian}[2]{%
+ \edef#2{\noexpand\printordinalef{#1}}%
+}
+\global\let\@ordinalstringFitalian\@ordinalstringFitalian
+
+\newcommand{\@OrdinalstringMitalian}[2]{%
+ \edef#2{\noexpand\printOrdinalem{#1}}%
+}
+\global\let\@OrdinalstringMitalian\@OrdinalstringMitalian
+
+\newcommand{\@OrdinalstringFitalian}[2]{%
+ \edef#2{\noexpand\printOrdinalef{#1}}%
+}
+\global\let\@OrdinalstringFitalian\@OrdinalstringFitalian
+
+\newcommand{\@ordinalMitalian}[2]{%
+ \edef#2{#1\relax\noexpand\fmtord{o}}}
+
+\global\let\@ordinalMitalian\@ordinalMitalian
+
+\newcommand{\@ordinalFitalian}[2]{%
+ \edef#2{#1\relax\noexpand\fmtord{a}}}
+\global\let\@ordinalFitalian\@ordinalFitalian
+% \end{macrocode}
+
+%\iffalse
+% \begin{macrocode}
+%</fc-italian.def>
+% \end{macrocode}
+%\fi
+%\iffalse
+% \begin{macrocode}
+%<*fc-ngerman.def>
+% \end{macrocode}
+%\fi
+% \subsubsection{fc-ngerman.def}
+% \begin{macrocode}
+\ProvidesFCLanguage{ngerman}[2012/06/18]%
+\FCloadlang{german}%
+\FCloadlang{ngermanb}%
+% \end{macrocode}
+% Set |ngerman| to be equivalent to |german|. Is it okay to do
+% this? (I don't know the difference between the two.)
+% \begin{macrocode}
+\global\let\@ordinalMngerman=\@ordinalMgerman
+\global\let\@ordinalFngerman=\@ordinalFgerman
+\global\let\@ordinalNngerman=\@ordinalNgerman
+\global\let\@numberstringMngerman=\@numberstringMgerman
+\global\let\@numberstringFngerman=\@numberstringFgerman
+\global\let\@numberstringNngerman=\@numberstringNgerman
+\global\let\@NumberstringMngerman=\@NumberstringMgerman
+\global\let\@NumberstringFngerman=\@NumberstringFgerman
+\global\let\@NumberstringNngerman=\@NumberstringNgerman
+\global\let\@ordinalstringMngerman=\@ordinalstringMgerman
+\global\let\@ordinalstringFngerman=\@ordinalstringFgerman
+\global\let\@ordinalstringNngerman=\@ordinalstringNgerman
+\global\let\@OrdinalstringMngerman=\@OrdinalstringMgerman
+\global\let\@OrdinalstringFngerman=\@OrdinalstringFgerman
+\global\let\@OrdinalstringNngerman=\@OrdinalstringNgerman
+% \end{macrocode}
+
+%\iffalse
+% \begin{macrocode}
+%</fc-ngerman.def>
+% \end{macrocode}
+%\fi
+%\iffalse
+% \begin{macrocode}
+%<*fc-ngermanb.def>
+% \end{macrocode}
+%\fi
+% \subsubsection{fc-ngermanb.def}
+% \begin{macrocode}
+\ProvidesFCLanguage{ngermanb}[2013/08/17]%
+\FCloadlang{german}%
+% \end{macrocode}
+% Set |ngermanb| to be equivalent to |german|. Is it okay to do
+% this? (I don't know the difference between the two.)
+% \begin{macrocode}
+\global\let\@ordinalMngermanb=\@ordinalMgerman
+\global\let\@ordinalFngermanb=\@ordinalFgerman
+\global\let\@ordinalNngermanb=\@ordinalNgerman
+\global\let\@numberstringMngermanb=\@numberstringMgerman
+\global\let\@numberstringFngermanb=\@numberstringFgerman
+\global\let\@numberstringNngermanb=\@numberstringNgerman
+\global\let\@NumberstringMngermanb=\@NumberstringMgerman
+\global\let\@NumberstringFngermanb=\@NumberstringFgerman
+\global\let\@NumberstringNngermanb=\@NumberstringNgerman
+\global\let\@ordinalstringMngermanb=\@ordinalstringMgerman
+\global\let\@ordinalstringFngermanb=\@ordinalstringFgerman
+\global\let\@ordinalstringNngermanb=\@ordinalstringNgerman
+\global\let\@OrdinalstringMngermanb=\@OrdinalstringMgerman
+\global\let\@OrdinalstringFngermanb=\@OrdinalstringFgerman
+\global\let\@OrdinalstringNngermanb=\@OrdinalstringNgerman
+% \end{macrocode}
+% Load fc-ngerman.def if not already loaded
+% \begin{macrocode}
+\FCloadlang{ngerman}%
+% \end{macrocode}
+
+%\iffalse
+% \begin{macrocode}
+%</fc-ngermanb.def>
+% \end{macrocode}
+%\fi
+%\iffalse
+% \begin{macrocode}
+%<*fc-portuges.def>
+% \end{macrocode}
+%\fi
+% \subsubsection{fc-portuges.def}
+% Portuguese definitions
+% \begin{macrocode}
+\ProvidesFCLanguage{portuges}[2017/12/26]%
+% \end{macrocode}
+% Define macro that converts a number or count register (first
+% argument) to an ordinal, and stores the result in the second
+% argument, which should be a control sequence. Masculine:
+% \begin{macrocode}
+\newcommand*\@ordinalMportuges[2]{%
+ \ifnum#1=0\relax
+ \edef#2{\number#1}%
+ \else
+ \edef#2{\number#1\relax\noexpand\fmtord{o}}%
+ \fi
+}%
+\global\let\@ordinalMportuges\@ordinalMportuges
+% \end{macrocode}
+% Feminine:
+% \begin{macrocode}
+\newcommand*\@ordinalFportuges[2]{%
+ \ifnum#1=0\relax
+ \edef#2{\number#1}%
+ \else
+ \edef#2{\number#1\relax\noexpand\fmtord{a}}%
+ \fi
+}%
+\global\let\@ordinalFportuges\@ordinalFportuges
+% \end{macrocode}
+% Make neuter same as masculine:
+% \begin{macrocode}
+\global\let\@ordinalNportuges\@ordinalMportuges
+% \end{macrocode}
+% Convert a number to a textual representation. To make it easier,
+% split it up into units, tens, teens and hundreds. Units (argument
+% must
+% be a number from 0 to 9):
+%\changes{2.04}{2014-06-09}{Fixed bug that had incorrect number of
+%parameters specified}
+% \begin{macrocode}
+\newcommand*\@@unitstringportuges[1]{%
+ \ifcase#1\relax
+ zero%
+ \or um%
+ \or dois%
+ \or tr\^es%
+ \or quatro%
+ \or cinco%
+ \or seis%
+ \or sete%
+ \or oito%
+ \or nove%
+ \fi
+}%
+\global\let\@@unitstringportuges\@@unitstringportuges
+% \end{macrocode}
+% As above, but for feminine:
+% \begin{macrocode}
+\newcommand*\@@unitstringFportuges[1]{%
+ \ifcase#1\relax
+ zero%
+ \or uma%
+ \or duas%
+ \or tr\^es%
+ \or quatro%
+ \or cinco%
+ \or seis%
+ \or sete%
+ \or oito%
+ \or nove%
+ \fi
+}%
+\global\let\@@unitstringFportuges\@@unitstringFportuges
+% \end{macrocode}
+% Tens (argument must be a number from 0 to 10):
+% \begin{macrocode}
+\newcommand*\@@tenstringportuges[1]{%
+ \ifcase#1\relax
+ \or dez%
+ \or vinte%
+ \or trinta%
+ \or quarenta%
+ \or cinq\"uenta%
+ \or sessenta%
+ \or setenta%
+ \or oitenta%
+ \or noventa%
+ \or cem%
+ \fi
+}%
+\global\let\@@tenstringportuges\@@tenstringportuges
+% \end{macrocode}
+% Teens (argument must be a number from 0 to 9):
+% \changes{3.05}{2017/12/26}{Take fix of teen contributed by \href{https://github.com/sant0s}{sant0s}, prior
+% definitions pushed to \sty{fc-brazilian.def}.}
+% \begin{macrocode}
+\newcommand*\@@teenstringportuges[1]{%
+ \ifcase#1\relax
+ dez%
+ \or onze%
+ \or doze%
+ \or treze%
+ \or catorze%
+ \or quinze%
+ \or dezasseis%
+ \or dezassete%
+ \or dezoito%
+ \or dezanove%
+ \fi
+}%
+\global\let\@@teenstringportuges\@@teenstringportuges
+% \end{macrocode}
+% Hundreds:
+% \begin{macrocode}
+\newcommand*\@@hundredstringportuges[1]{%
+ \ifcase#1\relax
+ \or cento%
+ \or duzentos%
+ \or trezentos%
+ \or quatrocentos%
+ \or quinhentos%
+ \or seiscentos%
+ \or setecentos%
+ \or oitocentos%
+ \or novecentos%
+ \fi
+}%
+\global\let\@@hundredstringportuges\@@hundredstringportuges
+% \end{macrocode}
+% Hundreds (feminine):
+% \begin{macrocode}
+\newcommand*\@@hundredstringFportuges[1]{%
+ \ifcase#1\relax
+ \or cento%
+ \or duzentas%
+ \or trezentas%
+ \or quatrocentas%
+ \or quinhentas%
+ \or seiscentas%
+ \or setecentas%
+ \or oitocentas%
+ \or novecentas%
+ \fi
+}%
+\global\let\@@hundredstringFportuges\@@hundredstringFportuges
+% \end{macrocode}
+% Units (initial letter in upper case):
+% \begin{macrocode}
+\newcommand*\@@Unitstringportuges[1]{%
+ \ifcase#1\relax
+ Zero%
+ \or Um%
+ \or Dois%
+ \or Tr\^es%
+ \or Quatro%
+ \or Cinco%
+ \or Seis%
+ \or Sete%
+ \or Oito%
+ \or Nove%
+ \fi
+}%
+\global\let\@@Unitstringportuges\@@Unitstringportuges
+% \end{macrocode}
+% As above, but feminine:
+% \begin{macrocode}
+\newcommand*\@@UnitstringFportuges[1]{%
+ \ifcase#1\relax
+ Zera%
+ \or Uma%
+ \or Duas%
+ \or Tr\^es%
+ \or Quatro%
+ \or Cinco%
+ \or Seis%
+ \or Sete%
+ \or Oito%
+ \or Nove%
+ \fi
+}%
+\global\let\@@UnitstringFportuges\@@UnitstringFportuges
+% \end{macrocode}
+% Tens (with initial letter in upper case):
+% \begin{macrocode}
+\newcommand*\@@Tenstringportuges[1]{%
+ \ifcase#1\relax
+ \or Dez%
+ \or Vinte%
+ \or Trinta%
+ \or Quarenta%
+ \or Cinq\"uenta%
+ \or Sessenta%
+ \or Setenta%
+ \or Oitenta%
+ \or Noventa%
+ \or Cem%
+ \fi
+}%
+\global\let\@@Tenstringportuges\@@Tenstringportuges
+% \end{macrocode}
+% Teens (with initial letter in upper case):
+% \changes{3.05}{2017/12/26}{Take fix of teen contributed by \href{https://github.com/sant0s}{sant0s}, prior
+% definitions pushed to \sty{fc-brazilian.def}.}
+% \begin{macrocode}
+\newcommand*\@@Teenstringportuges[1]{%
+ \ifcase#1\relax
+ Dez%
+ \or Onze%
+ \or Doze%
+ \or Treze%
+ \or Catorze%
+ \or Quinze%
+ \or Dezasseis%
+ \or Dezassete%
+ \or Dezoito%
+ \or Dezanove%
+ \fi
+}%
+\global\let\@@Teenstringportuges\@@Teenstringportuges
+% \end{macrocode}
+% Hundreds (with initial letter in upper case):
+% \begin{macrocode}
+\newcommand*\@@Hundredstringportuges[1]{%
+ \ifcase#1\relax
+ \or Cento%
+ \or Duzentos%
+ \or Trezentos%
+ \or Quatrocentos%
+ \or Quinhentos%
+ \or Seiscentos%
+ \or Setecentos%
+ \or Oitocentos%
+ \or Novecentos%
+ \fi
+}%
+\global\let\@@Hundredstringportuges\@@Hundredstringportuges
+% \end{macrocode}
+% As above, but feminine:
+% \begin{macrocode}
+\newcommand*\@@HundredstringFportuges[1]{%
+ \ifcase#1\relax
+ \or Cento%
+ \or Duzentas%
+ \or Trezentas%
+ \or Quatrocentas%
+ \or Quinhentas%
+ \or Seiscentas%
+ \or Setecentas%
+ \or Oitocentas%
+ \or Novecentas%
+ \fi
+}%
+\global\let\@@HundredstringFportuges\@@HundredstringFportuges
+% \end{macrocode}
+% This has changed in version 1.08, so that it now stores
+% the result in the second argument, but doesn't display
+% anything. Since it only affects internal macros, it shouldn't
+% affect documents created with older versions. (These internal
+% macros are not meant for use in documents.)
+% \changes{3.02}{2016/01/12}{Replace \cs{DeclareRobustCommand} by
+% \cs{newcommand*} as robustness is handled now at top level in
+% \texttt{fmtcount.sty}, and we don't need \cs{long} macros. Concerned macros
+% are \cs{@numberstringMportuges}, \cs{@numberstringFportuges},
+% \cs{@NumberstringMportuges}, \cs{@NumberstringFportuges},
+% \cs{@ordinalstringMportuges}, \cs{@ordinalstringFportuges},
+% \cs{@OrdinalstringMportuges}, and \cs{@OrdinalstringFportuges}.}
+% \changes{3.03}{2017/07/21}{Fix bug
+% \#\href{https://github.com/nlct/fmtcount/issues/25}{25}.}
+% \begin{macrocode}
+\newcommand*{\@numberstringMportuges}[2]{%
+ \let\@unitstring=\@@unitstringportuges
+ \let\@teenstring=\@@teenstringportuges
+ \let\@tenstring=\@@tenstringportuges
+ \let\@hundredstring=\@@hundredstringportuges
+ \def\@hundred{cem}\def\@thousand{mil}%
+ \def\@andname{e}%
+ \@@numberstringportuges{#1}{#2}%
+}%
+\global\let\@numberstringMportuges\@numberstringMportuges
+% \end{macrocode}
+% As above, but feminine form:
+% \begin{macrocode}
+\newcommand*{\@numberstringFportuges}[2]{%
+ \let\@unitstring=\@@unitstringFportuges
+ \let\@teenstring=\@@teenstringportuges
+ \let\@tenstring=\@@tenstringportuges
+ \let\@hundredstring=\@@hundredstringFportuges
+ \def\@hundred{cem}\def\@thousand{mil}%
+ \def\@andname{e}%
+ \@@numberstringportuges{#1}{#2}%
+}%
+\global\let\@numberstringFportuges\@numberstringFportuges
+% \end{macrocode}
+% Make neuter same as masculine:
+% \begin{macrocode}
+\global\let\@numberstringNportuges\@numberstringMportuges
+% \end{macrocode}
+% As above, but initial letters in upper case:
+% \begin{macrocode}
+\newcommand*{\@NumberstringMportuges}[2]{%
+ \let\@unitstring=\@@Unitstringportuges
+ \let\@teenstring=\@@Teenstringportuges
+ \let\@tenstring=\@@Tenstringportuges
+ \let\@hundredstring=\@@Hundredstringportuges
+ \def\@hundred{Cem}\def\@thousand{Mil}%
+ \def\@andname{e}%
+ \@@numberstringportuges{#1}{#2}%
+}%
+\global\let\@NumberstringMportuges\@NumberstringMportuges
+% \end{macrocode}
+% As above, but feminine form:
+% \begin{macrocode}
+\newcommand*{\@NumberstringFportuges}[2]{%
+ \let\@unitstring=\@@UnitstringFportuges
+ \let\@teenstring=\@@Teenstringportuges
+ \let\@tenstring=\@@Tenstringportuges
+ \let\@hundredstring=\@@HundredstringFportuges
+ \def\@hundred{Cem}\def\@thousand{Mil}%
+ \def\@andname{e}%
+ \@@numberstringportuges{#1}{#2}%
+}%
+\global\let\@NumberstringFportuges\@NumberstringFportuges
+% \end{macrocode}
+% Make neuter same as masculine:
+% \begin{macrocode}
+\global\let\@NumberstringNportuges\@NumberstringMportuges
+% \end{macrocode}
+% As above, but for ordinals.
+% \begin{macrocode}
+\newcommand*{\@ordinalstringMportuges}[2]{%
+ \let\@unitthstring=\@@unitthstringportuges
+ \let\@unitstring=\@@unitstringportuges
+ \let\@teenthstring=\@@teenthstringportuges
+ \let\@tenthstring=\@@tenthstringportuges
+ \let\@hundredthstring=\@@hundredthstringportuges
+ \def\@thousandth{mil\'esimo}%
+ \@@ordinalstringportuges{#1}{#2}%
+}%
+\global\let\@ordinalstringMportuges\@ordinalstringMportuges
+% \end{macrocode}
+% Feminine form:
+% \begin{macrocode}
+\newcommand*{\@ordinalstringFportuges}[2]{%
+ \let\@unitthstring=\@@unitthstringFportuges
+ \let\@unitstring=\@@unitstringFportuges
+ \let\@teenthstring=\@@teenthstringportuges
+ \let\@tenthstring=\@@tenthstringFportuges
+ \let\@hundredthstring=\@@hundredthstringFportuges
+ \def\@thousandth{mil\'esima}%
+ \@@ordinalstringportuges{#1}{#2}%
+}%
+\global\let\@ordinalstringFportuges\@ordinalstringFportuges
+% \end{macrocode}
+% Make neuter same as masculine:
+% \begin{macrocode}
+\global\let\@ordinalstringNportuges\@ordinalstringMportuges
+% \end{macrocode}
+% As above, but initial letters in upper case (masculine):
+% \begin{macrocode}
+\newcommand*{\@OrdinalstringMportuges}[2]{%
+ \let\@unitthstring=\@@Unitthstringportuges
+ \let\@unitstring=\@@Unitstringportuges
+ \let\@teenthstring=\@@teenthstringportuges
+ \let\@tenthstring=\@@Tenthstringportuges
+ \let\@hundredthstring=\@@Hundredthstringportuges
+ \def\@thousandth{Mil\'esimo}%
+ \@@ordinalstringportuges{#1}{#2}%
+}%
+\global\let\@OrdinalstringMportuges\@OrdinalstringMportuges
+% \end{macrocode}
+% Feminine form:
+% \begin{macrocode}
+\newcommand*{\@OrdinalstringFportuges}[2]{%
+ \let\@unitthstring=\@@UnitthstringFportuges
+ \let\@unitstring=\@@UnitstringFportuges
+ \let\@teenthstring=\@@teenthstringportuges
+ \let\@tenthstring=\@@TenthstringFportuges
+ \let\@hundredthstring=\@@HundredthstringFportuges
+ \def\@thousandth{Mil\'esima}%
+ \@@ordinalstringportuges{#1}{#2}%
+}%
+\global\let\@OrdinalstringFportuges\@OrdinalstringFportuges
+% \end{macrocode}
+% Make neuter same as masculine:
+% \begin{macrocode}
+\global\let\@OrdinalstringNportuges\@OrdinalstringMportuges
+% \end{macrocode}
+% In order to do the ordinals, split into units, teens, tens
+% and hundreds. Units:
+% \begin{macrocode}
+\newcommand*\@@unitthstringportuges[1]{%
+ \ifcase#1\relax
+ zero%
+ \or primeiro%
+ \or segundo%
+ \or terceiro%
+ \or quarto%
+ \or quinto%
+ \or sexto%
+ \or s\'etimo%
+ \or oitavo%
+ \or nono%
+ \fi
+}%
+\global\let\@@unitthstringportuges\@@unitthstringportuges
+% \end{macrocode}
+% Tens:
+% \begin{macrocode}
+\newcommand*\@@tenthstringportuges[1]{%
+ \ifcase#1\relax
+ \or d\'ecimo%
+ \or vig\'esimo%
+ \or trig\'esimo%
+ \or quadrag\'esimo%
+ \or q\"uinquag\'esimo%
+ \or sexag\'esimo%
+ \or setuag\'esimo%
+ \or octog\'esimo%
+ \or nonag\'esimo%
+ \fi
+}%
+\global\let\@@tenthstringportuges\@@tenthstringportuges
+% \end{macrocode}
+% Teens:
+% \begin{macrocode}
+\newcommand*\@@teenthstringportuges[1]{%
+ \@tenthstring{1}%
+ \ifnum#1>0\relax
+ -\@unitthstring{#1}%
+ \fi
+}%
+\global\let\@@teenthstringportuges\@@teenthstringportuges
+% \end{macrocode}
+% Hundreds:
+% \begin{macrocode}
+\newcommand*\@@hundredthstringportuges[1]{%
+ \ifcase#1\relax
+ \or cent\'esimo%
+ \or ducent\'esimo%
+ \or trecent\'esimo%
+ \or quadringent\'esimo%
+ \or q\"uingent\'esimo%
+ \or seiscent\'esimo%
+ \or setingent\'esimo%
+ \or octingent\'esimo%
+ \or nongent\'esimo%
+ \fi
+}%
+\global\let\@@hundredthstringportuges\@@hundredthstringportuges
+% \end{macrocode}
+% Units (feminine):
+% \begin{macrocode}
+\newcommand*\@@unitthstringFportuges[1]{%
+ \ifcase#1\relax
+ zero%
+ \or primeira%
+ \or segunda%
+ \or terceira%
+ \or quarta%
+ \or quinta%
+ \or sexta%
+ \or s\'etima%
+ \or oitava%
+ \or nona%
+ \fi
+}%
+\global\let\@@unitthstringFportuges\@@unitthstringFportuges
+% \end{macrocode}
+% Tens (feminine):
+% \begin{macrocode}
+\newcommand*\@@tenthstringFportuges[1]{%
+ \ifcase#1\relax
+ \or d\'ecima%
+ \or vig\'esima%
+ \or trig\'esima%
+ \or quadrag\'esima%
+ \or q\"uinquag\'esima%
+ \or sexag\'esima%
+ \or setuag\'esima%
+ \or octog\'esima%
+ \or nonag\'esima%
+ \fi
+}%
+\global\let\@@tenthstringFportuges\@@tenthstringFportuges
+% \end{macrocode}
+% Hundreds (feminine):
+% \begin{macrocode}
+\newcommand*\@@hundredthstringFportuges[1]{%
+ \ifcase#1\relax
+ \or cent\'esima%
+ \or ducent\'esima%
+ \or trecent\'esima%
+ \or quadringent\'esima%
+ \or q\"uingent\'esima%
+ \or seiscent\'esima%
+ \or setingent\'esima%
+ \or octingent\'esima%
+ \or nongent\'esima%
+ \fi
+}%
+\global\let\@@hundredthstringFportuges\@@hundredthstringFportuges
+% \end{macrocode}
+% As above, but with initial letter in upper case. Units:
+% \begin{macrocode}
+\newcommand*\@@Unitthstringportuges[1]{%
+ \ifcase#1\relax
+ Zero%
+ \or Primeiro%
+ \or Segundo%
+ \or Terceiro%
+ \or Quarto%
+ \or Quinto%
+ \or Sexto%
+ \or S\'etimo%
+ \or Oitavo%
+ \or Nono%
+ \fi
+}%
+\global\let\@@Unitthstringportuges\@@Unitthstringportuges
+% \end{macrocode}
+% Tens:
+% \begin{macrocode}
+\newcommand*\@@Tenthstringportuges[1]{%
+ \ifcase#1\relax
+ \or D\'ecimo%
+ \or Vig\'esimo%
+ \or Trig\'esimo%
+ \or Quadrag\'esimo%
+ \or Q\"uinquag\'esimo%
+ \or Sexag\'esimo%
+ \or Setuag\'esimo%
+ \or Octog\'esimo%
+ \or Nonag\'esimo%
+ \fi
+}%
+\global\let\@@Tenthstringportuges\@@Tenthstringportuges
+% \end{macrocode}
+% Hundreds:
+% \begin{macrocode}
+\newcommand*\@@Hundredthstringportuges[1]{%
+ \ifcase#1\relax
+ \or Cent\'esimo%
+ \or Ducent\'esimo%
+ \or Trecent\'esimo%
+ \or Quadringent\'esimo%
+ \or Q\"uingent\'esimo%
+ \or Seiscent\'esimo%
+ \or Setingent\'esimo%
+ \or Octingent\'esimo%
+ \or Nongent\'esimo%
+ \fi
+}%
+\global\let\@@Hundredthstringportuges\@@Hundredthstringportuges
+% \end{macrocode}
+% As above, but feminine. Units:
+% \begin{macrocode}
+\newcommand*\@@UnitthstringFportuges[1]{%
+ \ifcase#1\relax
+ Zera%
+ \or Primeira%
+ \or Segunda%
+ \or Terceira%
+ \or Quarta%
+ \or Quinta%
+ \or Sexta%
+ \or S\'etima%
+ \or Oitava%
+ \or Nona%
+ \fi
+}%
+\global\let\@@UnitthstringFportuges\@@UnitthstringFportuges
+% \end{macrocode}
+% Tens (feminine);
+% \begin{macrocode}
+\newcommand*\@@TenthstringFportuges[1]{%
+ \ifcase#1\relax
+ \or D\'ecima%
+ \or Vig\'esima%
+ \or Trig\'esima%
+ \or Quadrag\'esima%
+ \or Q\"uinquag\'esima%
+ \or Sexag\'esima%
+ \or Setuag\'esima%
+ \or Octog\'esima%
+ \or Nonag\'esima%
+ \fi
+}%
+\global\let\@@TenthstringFportuges\@@TenthstringFportuges
+% \end{macrocode}
+% Hundreds (feminine):
+% \begin{macrocode}
+\newcommand*\@@HundredthstringFportuges[1]{%
+ \ifcase#1\relax
+ \or Cent\'esima%
+ \or Ducent\'esima%
+ \or Trecent\'esima%
+ \or Quadringent\'esima%
+ \or Q\"uingent\'esima%
+ \or Seiscent\'esima%
+ \or Setingent\'esima%
+ \or Octingent\'esima%
+ \or Nongent\'esima%
+ \fi
+}%
+\global\let\@@HundredthstringFportuges\@@HundredthstringFportuges
+% \end{macrocode}
+% This has changed in version 1.09, so that it now stores
+% the result in the second argument (a control sequence), but it
+% doesn't display anything. Since it only affects internal macros,
+% it shouldn't affect documents created with older versions.
+% (These internal macros are not meant for use in documents.)
+% \begin{macrocode}
+\newcommand*\@@numberstringportuges[2]{%
+\ifnum#1>99999\relax
+ \PackageError{fmtcount}{Out of range}%
+ {This macro only works for values less than 100000}%
+\else
+ \ifnum#1<0\relax
+ \PackageError{fmtcount}{Negative numbers not permitted}%
+ {This macro does not work for negative numbers, however
+ you can try typing "minus" first, and then pass the modulus of
+ this number}%
+ \fi
+\fi
+\def#2{}%
+\@strctr=#1\relax \divide\@strctr by 1000\relax
+\ifnum\@strctr>9\relax
+% \end{macrocode}
+% \#1 is greater or equal to 10000
+% \begin{macrocode}
+ \divide\@strctr by 10\relax
+ \ifnum\@strctr>1\relax
+ \let\@@fc@numstr#2\relax
+ \protected@edef#2{\@@fc@numstr\@tenstring{\@strctr}}%
+ \@strctr=#1 \divide\@strctr by 1000\relax
+ \@FCmodulo{\@strctr}{10}%
+ \ifnum\@strctr>0
+ \ifnum\@strctr=1\relax
+ \let\@@fc@numstr#2\relax
+ \protected@edef#2{\@@fc@numstr\ \@andname}%
+ \fi
+ \let\@@fc@numstr#2\relax
+ \protected@edef#2{\@@fc@numstr\ \@unitstring{\@strctr}}%
+ \fi
+ \else
+ \@strctr=#1\relax
+ \divide\@strctr by 1000\relax
+ \@FCmodulo{\@strctr}{10}%
+ \let\@@fc@numstr#2\relax
+ \protected@edef#2{\@@fc@numstr\@teenstring{\@strctr}}%
+ \fi
+ \let\@@fc@numstr#2\relax
+ \protected@edef#2{\@@fc@numstr\ \@thousand}%
+\else
+ \ifnum\@strctr>0\relax
+ \ifnum\@strctr>1\relax
+ \let\@@fc@numstr#2\relax
+ \protected@edef#2{\@@fc@numstr\@unitstring{\@strctr}\ }%
+ \fi
+ \let\@@fc@numstr#2\relax
+ \protected@edef#2{\@@fc@numstr\@thousand}%
+ \fi
+\fi
+\@strctr=#1\relax \@FCmodulo{\@strctr}{1000}%
+\divide\@strctr by 100\relax
+\ifnum\@strctr>0\relax
+ \ifnum#1>1000 \relax
+ \let\@@fc@numstr#2\relax
+ \protected@edef#2{\@@fc@numstr\ }%
+ \fi
+ \@tmpstrctr=#1\relax
+ \@FCmodulo{\@tmpstrctr}{1000}%
+ \let\@@fc@numstr#2\relax
+ \ifnum\@tmpstrctr=100\relax
+ \protected@edef#2{\@@fc@numstr\@tenstring{10}}%
+ \else
+ \protected@edef#2{\@@fc@numstr\@hundredstring{\@strctr}}%
+ \fi%
+\fi
+\@strctr=#1\relax \@FCmodulo{\@strctr}{100}%
+\ifnum#1>100\relax
+ \ifnum\@strctr>0\relax
+ \let\@@fc@numstr#2\relax
+ \protected@edef#2{\@@fc@numstr\ \@andname\ }%
+ \fi
+\fi
+\ifnum\@strctr>19\relax
+ \divide\@strctr by 10\relax
+ \let\@@fc@numstr#2\relax
+ \protected@edef#2{\@@fc@numstr\@tenstring{\@strctr}}%
+ \@strctr=#1\relax \@FCmodulo{\@strctr}{10}%
+ \ifnum\@strctr>0
+ \ifnum\@strctr=1\relax
+ \let\@@fc@numstr#2\relax
+ \protected@edef#2{\@@fc@numstr\ \@andname}%
+ \else
+ \ifnum#1>100\relax
+ \let\@@fc@numstr#2\relax
+ \protected@edef#2{\@@fc@numstr\ \@andname}%
+ \fi
+ \fi
+ \let\@@fc@numstr#2\relax
+ \protected@edef#2{\@@fc@numstr\ \@unitstring{\@strctr}}%
+ \fi
+\else
+ \ifnum\@strctr<10\relax
+ \ifnum\@strctr=0\relax
+ \ifnum#1<100\relax
+ \let\@@fc@numstr#2\relax
+ \protected@edef#2{\@@fc@numstr\@unitstring{\@strctr}}%
+ \fi
+ \else %(>0,<10)
+ \let\@@fc@numstr#2\relax
+ \protected@edef#2{\@@fc@numstr\@unitstring{\@strctr}}%
+ \fi
+ \else%>10
+ \@FCmodulo{\@strctr}{10}%
+ \let\@@fc@numstr#2\relax
+ \protected@edef#2{\@@fc@numstr\@teenstring{\@strctr}}%
+ \fi
+\fi
+}%
+\global\let\@@numberstringportuges\@@numberstringportuges
+% \end{macrocode}
+% As above, but for ordinals.
+% \begin{macrocode}
+\newcommand*\@@ordinalstringportuges[2]{%
+\@strctr=#1\relax
+\ifnum#1>99999
+\PackageError{fmtcount}{Out of range}%
+{This macro only works for values less than 100000}%
+\else
+\ifnum#1<0
+\PackageError{fmtcount}{Negative numbers not permitted}%
+{This macro does not work for negative numbers, however
+you can try typing "minus" first, and then pass the modulus of
+this number}%
+\else
+\def#2{}%
+\ifnum\@strctr>999\relax
+ \divide\@strctr by 1000\relax
+ \ifnum\@strctr>1\relax
+ \ifnum\@strctr>9\relax
+ \@tmpstrctr=\@strctr
+ \ifnum\@strctr<20
+ \@FCmodulo{\@tmpstrctr}{10}%
+ \let\@@fc@ordstr#2\relax
+ \protected@edef#2{\@@fc@ordstr\@teenthstring{\@tmpstrctr}}%
+ \else
+ \divide\@tmpstrctr by 10\relax
+ \let\@@fc@ordstr#2\relax
+ \protected@edef#2{\@@fc@ordstr\@tenthstring{\@tmpstrctr}}%
+ \@tmpstrctr=\@strctr
+ \@FCmodulo{\@tmpstrctr}{10}%
+ \ifnum\@tmpstrctr>0\relax
+ \let\@@fc@ordstr#2\relax
+ \protected@edef#2{\@@fc@ordstr\@unitthstring{\@tmpstrctr}}%
+ \fi
+ \fi
+ \else
+ \let\@@fc@ordstr#2\relax
+ \protected@edef#2{\@@fc@ordstr\@unitstring{\@strctr}}%
+ \fi
+ \fi
+ \let\@@fc@ordstr#2\relax
+ \protected@edef#2{\@@fc@ordstr\@thousandth}%
+\fi
+\@strctr=#1\relax
+\@FCmodulo{\@strctr}{1000}%
+\ifnum\@strctr>99\relax
+ \@tmpstrctr=\@strctr
+ \divide\@tmpstrctr by 100\relax
+ \ifnum#1>1000\relax
+ \let\@@fc@ordstr#2\relax
+ \protected@edef#2{\@@fc@ordstr-}%
+ \fi
+ \let\@@fc@ordstr#2\relax
+ \protected@edef#2{\@@fc@ordstr\@hundredthstring{\@tmpstrctr}}%
+\fi
+\@FCmodulo{\@strctr}{100}%
+\ifnum#1>99\relax
+ \ifnum\@strctr>0\relax
+ \let\@@fc@ordstr#2\relax
+ \protected@edef#2{\@@fc@ordstr-}%
+ \fi
+\fi
+\ifnum\@strctr>9\relax
+ \@tmpstrctr=\@strctr
+ \divide\@tmpstrctr by 10\relax
+ \let\@@fc@ordstr#2\relax
+ \protected@edef#2{\@@fc@ordstr\@tenthstring{\@tmpstrctr}}%
+ \@tmpstrctr=\@strctr
+ \@FCmodulo{\@tmpstrctr}{10}%
+ \ifnum\@tmpstrctr>0\relax
+ \let\@@fc@ordstr#2\relax
+ \protected@edef#2{\@@fc@ordstr-\@unitthstring{\@tmpstrctr}}%
+ \fi
+\else
+ \ifnum\@strctr=0\relax
+ \ifnum#1=0\relax
+ \let\@@fc@ordstr#2\relax
+ \protected@edef#2{\@@fc@ordstr\@unitstring{0}}%
+ \fi
+ \else
+ \let\@@fc@ordstr#2\relax
+ \protected@edef#2{\@@fc@ordstr\@unitthstring{\@strctr}}%
+ \fi
+\fi
+\fi
+\fi
+}%
+\global\let\@@ordinalstringportuges\@@ordinalstringportuges
+% \end{macrocode}
+\iffalse Local variables: \fi
+\iffalse mode: docTeX \fi
+\iffalse End: \fi
+%\iffalse
+% \begin{macrocode}
+%</fc-portuges.def>
+% \end{macrocode}
+%\fi
+%\iffalse
+% \begin{macrocode}
+%<*fc-portuguese.def>
+% \end{macrocode}
+%\fi
+% \subsubsection{fc-portuguese.def}
+% \begin{macrocode}
+\ProvidesFCLanguage{portuguese}[2014/06/09]%
+% \end{macrocode}
+% Load \sty{fc-portuges.def} if not already loaded.
+% \begin{macrocode}
+\FCloadlang{portuges}%
+% \end{macrocode}
+% Set |portuguese| to be equivalent to |portuges|.
+% \begin{macrocode}
+\global\let\@ordinalMportuguese=\@ordinalMportuges
+\global\let\@ordinalFportuguese=\@ordinalFportuges
+\global\let\@ordinalNportuguese=\@ordinalNportuges
+\global\let\@numberstringMportuguese=\@numberstringMportuges
+\global\let\@numberstringFportuguese=\@numberstringFportuges
+\global\let\@numberstringNportuguese=\@numberstringNportuges
+\global\let\@NumberstringMportuguese=\@NumberstringMportuges
+\global\let\@NumberstringFportuguese=\@NumberstringFportuges
+\global\let\@NumberstringNportuguese=\@NumberstringNportuges
+\global\let\@ordinalstringMportuguese=\@ordinalstringMportuges
+\global\let\@ordinalstringFportuguese=\@ordinalstringFportuges
+\global\let\@ordinalstringNportuguese=\@ordinalstringNportuges
+\global\let\@OrdinalstringMportuguese=\@OrdinalstringMportuges
+\global\let\@OrdinalstringFportuguese=\@OrdinalstringFportuges
+\global\let\@OrdinalstringNportuguese=\@OrdinalstringNportuges
+% \end{macrocode}
+
+%\iffalse
+% \begin{macrocode}
+%</fc-portuguese.def>
+% \end{macrocode}
+%\fi
+%\iffalse
+% \begin{macrocode}
+%<*fc-spanish.def>
+% \end{macrocode}
+%\fi
+% \subsubsection{fc-spanish.def}
+% Spanish definitions
+% \begin{macrocode}
+\ProvidesFCLanguage{spanish}[2016/01/12]%
+% \end{macrocode}
+% Define macro that converts a number or count register (first
+% argument) to an ordinal, and stores the result in the
+% second argument, which must be a control sequence.
+% Masculine:
+% \begin{macrocode}
+\newcommand*\@ordinalMspanish[2]{%
+ \edef#2{\number#1\relax\noexpand\fmtord{o}}%
+}%
+\global\let\@ordinalMspanish\@ordinalMspanish
+% \end{macrocode}
+% Feminine:
+% \begin{macrocode}
+\newcommand{\@ordinalFspanish}[2]{%
+ \edef#2{\number#1\relax\noexpand\fmtord{a}}%
+}%
+\global\let\@ordinalFspanish\@ordinalFspanish
+% \end{macrocode}
+% Make neuter same as masculine:
+% \begin{macrocode}
+\global\let\@ordinalNspanish\@ordinalMspanish
+% \end{macrocode}
+% Convert a number to text. The easiest way to do this is to
+% break it up into units, tens, teens, twenties and hundreds.
+% Units (argument must be a number from 0 to 9):
+% \begin{macrocode}
+\newcommand*\@@unitstringspanish[1]{%
+ \ifcase#1\relax
+ cero%
+ \or uno%
+ \or dos%
+ \or tres%
+ \or cuatro%
+ \or cinco%
+ \or seis%
+ \or siete%
+ \or ocho%
+ \or nueve%
+ \fi
+}%
+\global\let\@@unitstringspanish\@@unitstringspanish
+% \end{macrocode}
+% Feminine:
+% \begin{macrocode}
+\newcommand*\@@unitstringFspanish[1]{%
+ \ifcase#1\relax
+ cera%
+ \or una%
+ \or dos%
+ \or tres%
+ \or cuatro%
+ \or cinco%
+ \or seis%
+ \or siete%
+ \or ocho%
+ \or nueve%
+ \fi
+}%
+\global\let\@@unitstringFspanish\@@unitstringFspanish
+% \end{macrocode}
+% Tens (argument must go from 1 to 10):
+%\changes{2.0}{2012-06-18}{fixed spelling mistake (correction
+%provided by Fernando Maldonado)}
+% \begin{macrocode}
+\newcommand*\@@tenstringspanish[1]{%
+ \ifcase#1\relax
+ \or diez%
+ \or veinte%
+ \or treinta%
+ \or cuarenta%
+ \or cincuenta%
+ \or sesenta%
+ \or setenta%
+ \or ochenta%
+ \or noventa%
+ \or cien%
+ \fi
+}%
+\global\let\@@tenstringspanish\@@tenstringspanish
+% \end{macrocode}
+% Teens:
+% \begin{macrocode}
+\newcommand*\@@teenstringspanish[1]{%
+ \ifcase#1\relax
+ diez%
+ \or once%
+ \or doce%
+ \or trece%
+ \or catorce%
+ \or quince%
+ \or diecis\'eis%
+ \or diecisiete%
+ \or dieciocho%
+ \or diecinueve%
+ \fi
+}%
+\global\let\@@teenstringspanish\@@teenstringspanish
+% \end{macrocode}
+% Twenties:
+% \begin{macrocode}
+\newcommand*\@@twentystringspanish[1]{%
+ \ifcase#1\relax
+ veinte%
+ \or veintiuno%
+ \or veintid\'os%
+ \or veintitr\'es%
+ \or veinticuatro%
+ \or veinticinco%
+ \or veintis\'eis%
+ \or veintisiete%
+ \or veintiocho%
+ \or veintinueve%
+ \fi
+}%
+\global\let\@@twentystringspanish\@@twentystringspanish
+% \end{macrocode}
+% Feminine form:
+% \begin{macrocode}
+\newcommand*\@@twentystringFspanish[1]{%
+ \ifcase#1\relax
+ veinte%
+ \or veintiuna%
+ \or veintid\'os%
+ \or veintitr\'es%
+ \or veinticuatro%
+ \or veinticinco%
+ \or veintis\'eis%
+ \or veintisiete%
+ \or veintiocho%
+ \or veintinueve%
+ \fi
+}%
+\global\let\@@twentystringFspanish\@@twentystringFspanish
+% \end{macrocode}
+% Hundreds:
+% \begin{macrocode}
+\newcommand*\@@hundredstringspanish[1]{%
+ \ifcase#1\relax
+ \or ciento%
+ \or doscientos%
+ \or trescientos%
+ \or cuatrocientos%
+ \or quinientos%
+ \or seiscientos%
+ \or setecientos%
+ \or ochocientos%
+ \or novecientos%
+ \fi
+}%
+\global\let\@@hundredstringspanish\@@hundredstringspanish
+% \end{macrocode}
+% Feminine form:
+% \begin{macrocode}
+\newcommand*\@@hundredstringFspanish[1]{%
+ \ifcase#1\relax
+ \or cienta%
+ \or doscientas%
+ \or trescientas%
+ \or cuatrocientas%
+ \or quinientas%
+ \or seiscientas%
+ \or setecientas%
+ \or ochocientas%
+ \or novecientas%
+ \fi
+}%
+\global\let\@@hundredstringFspanish\@@hundredstringFspanish
+% \end{macrocode}
+% As above, but with initial letter uppercase:
+% \begin{macrocode}
+\newcommand*\@@Unitstringspanish[1]{%
+ \ifcase#1\relax
+ Cero%
+ \or Uno%
+ \or Dos%
+ \or Tres%
+ \or Cuatro%
+ \or Cinco%
+ \or Seis%
+ \or Siete%
+ \or Ocho%
+ \or Nueve%
+ \fi
+}%
+\global\let\@@Unitstringspanish\@@Unitstringspanish
+% \end{macrocode}
+% Feminine form:
+% \begin{macrocode}
+\newcommand*\@@UnitstringFspanish[1]{%
+ \ifcase#1\relax
+ Cera%
+ \or Una%
+ \or Dos%
+ \or Tres%
+ \or Cuatro%
+ \or Cinco%
+ \or Seis%
+ \or Siete%
+ \or Ocho%
+ \or Nueve%
+ \fi
+}%
+\global\let\@@UnitstringFspanish\@@UnitstringFspanish
+% \end{macrocode}
+% Tens:
+% \begin{macrocode}
+%\changes{2.0}{2012-06-18}{fixed spelling mistake (correction
+%provided by Fernando Maldonado)}
+\newcommand*\@@Tenstringspanish[1]{%
+ \ifcase#1\relax
+ \or Diez%
+ \or Veinte%
+ \or Treinta%
+ \or Cuarenta%
+ \or Cincuenta%
+ \or Sesenta%
+ \or Setenta%
+ \or Ochenta%
+ \or Noventa%
+ \or Cien%
+ \fi
+}%
+\global\let\@@Tenstringspanish\@@Tenstringspanish
+% \end{macrocode}
+% Teens:
+% \begin{macrocode}
+\newcommand*\@@Teenstringspanish[1]{%
+ \ifcase#1\relax
+ Diez%
+ \or Once%
+ \or Doce%
+ \or Trece%
+ \or Catorce%
+ \or Quince%
+ \or Diecis\'eis%
+ \or Diecisiete%
+ \or Dieciocho%
+ \or Diecinueve%
+ \fi
+}%
+\global\let\@@Teenstringspanish\@@Teenstringspanish
+% \end{macrocode}
+% Twenties:
+% \begin{macrocode}
+\newcommand*\@@Twentystringspanish[1]{%
+ \ifcase#1\relax
+ Veinte%
+ \or Veintiuno%
+ \or Veintid\'os%
+ \or Veintitr\'es%
+ \or Veinticuatro%
+ \or Veinticinco%
+ \or Veintis\'eis%
+ \or Veintisiete%
+ \or Veintiocho%
+ \or Veintinueve%
+ \fi
+}%
+\global\let\@@Twentystringspanish\@@Twentystringspanish
+% \end{macrocode}
+% Feminine form:
+% \begin{macrocode}
+\newcommand*\@@TwentystringFspanish[1]{%
+ \ifcase#1\relax
+ Veinte%
+ \or Veintiuna%
+ \or Veintid\'os%
+ \or Veintitr\'es%
+ \or Veinticuatro%
+ \or Veinticinco%
+ \or Veintis\'eis%
+ \or Veintisiete%
+ \or Veintiocho%
+ \or Veintinueve%
+ \fi
+}%
+\global\let\@@TwentystringFspanish\@@TwentystringFspanish
+% \end{macrocode}
+% Hundreds:
+% \begin{macrocode}
+\newcommand*\@@Hundredstringspanish[1]{%
+ \ifcase#1\relax
+ \or Ciento%
+ \or Doscientos%
+ \or Trescientos%
+ \or Cuatrocientos%
+ \or Quinientos%
+ \or Seiscientos%
+ \or Setecientos%
+ \or Ochocientos%
+ \or Novecientos%
+ \fi
+}%
+\global\let\@@Hundredstringspanish\@@Hundredstringspanish
+% \end{macrocode}
+% Feminine form:
+% \begin{macrocode}
+\newcommand*\@@HundredstringFspanish[1]{%
+ \ifcase#1\relax
+ \or Cienta%
+ \or Doscientas%
+ \or Trescientas%
+ \or Cuatrocientas%
+ \or Quinientas%
+ \or Seiscientas%
+ \or Setecientas%
+ \or Ochocientas%
+ \or Novecientas%
+ \fi
+}%
+\global\let\@@HundredstringFspanish\@@HundredstringFspanish
+% \end{macrocode}
+% This has changed in version 1.09, so that it now stores the
+% result in the second argument, but doesn't display anything.
+% Since it only affects internal macros, it shouldn't affect
+% documents created with older versions. (These internal macros
+% are not meant for use in documents.)
+% \changes{3.02}{2016/01/12}{Replace \cs{DeclareRobustCommand} by
+% \cs{newcommand*} as robustness is handled now at top level in
+% \texttt{fmtcount.sty}, and we don't need \cs{long} macros. Concerned
+% macros as \cs{@numberstringMspanish}, \cs{@numberstringFspanish},
+% \cs{@NumberstringFspanish}, \cs{@ordinalstringMspanish},
+% \cs{@ordinalstringFspanish}, \cs{@OrdinalstringMspanish}, and
+% \cs{@OrdinalstringFspanish}.}
+% \begin{macrocode}
+\newcommand*{\@numberstringMspanish}[2]{%
+ \let\@unitstring=\@@unitstringspanish
+ \let\@teenstring=\@@teenstringspanish
+ \let\@tenstring=\@@tenstringspanish
+ \let\@twentystring=\@@twentystringspanish
+ \let\@hundredstring=\@@hundredstringspanish
+ \def\@hundred{cien}\def\@thousand{mil}%
+ \def\@andname{y}%
+ \@@numberstringspanish{#1}{#2}%
+}%
+\global\let\@numberstringMspanish\@numberstringMspanish
+% \end{macrocode}
+% Feminine form:
+%\changes{2.0}{2012-06-18}{changed andname to `b' (correction
+%provided by Fernando Maldonado)}
+% \begin{macrocode}
+\newcommand*{\@numberstringFspanish}[2]{%
+ \let\@unitstring=\@@unitstringFspanish
+ \let\@teenstring=\@@teenstringspanish
+ \let\@tenstring=\@@tenstringspanish
+ \let\@twentystring=\@@twentystringFspanish
+ \let\@hundredstring=\@@hundredstringFspanish
+ \def\@hundred{cien}\def\@thousand{mil}%
+ \def\@andname{b}%
+ \@@numberstringspanish{#1}{#2}%
+}%
+\global\let\@numberstringFspanish\@numberstringFspanish
+% \end{macrocode}
+% Make neuter same as masculine:
+% \begin{macrocode}
+\global\let\@numberstringNspanish\@numberstringMspanish
+% \end{macrocode}
+% As above, but initial letters in upper case:
+% \begin{macrocode}
+\newcommand*{\@NumberstringMspanish}[2]{%
+ \let\@unitstring=\@@Unitstringspanish
+ \let\@teenstring=\@@Teenstringspanish
+ \let\@tenstring=\@@Tenstringspanish
+ \let\@twentystring=\@@Twentystringspanish
+ \let\@hundredstring=\@@Hundredstringspanish
+ \def\@andname{y}%
+ \def\@hundred{Cien}\def\@thousand{Mil}%
+ \@@numberstringspanish{#1}{#2}%
+}%
+\global\let\@NumberstringMspanish\@NumberstringMspanish
+% \end{macrocode}
+% Feminine form:
+%\changes{2.0}{2012-06-18}{changed andname to `b' (correction
+%provided by Fernando Maldonado)}
+% \begin{macrocode}
+\newcommand*{\@NumberstringFspanish}[2]{%
+ \let\@unitstring=\@@UnitstringFspanish
+ \let\@teenstring=\@@Teenstringspanish
+ \let\@tenstring=\@@Tenstringspanish
+ \let\@twentystring=\@@TwentystringFspanish
+ \let\@hundredstring=\@@HundredstringFspanish
+ \def\@andname{b}%
+ \def\@hundred{Cien}\def\@thousand{Mil}%
+ \@@numberstringspanish{#1}{#2}%
+}%
+\global\let\@NumberstringFspanish\@NumberstringFspanish
+% \end{macrocode}
+% Make neuter same as masculine:
+% \begin{macrocode}
+\global\let\@NumberstringNspanish\@NumberstringMspanish
+% \end{macrocode}
+% As above, but for ordinals.
+% \begin{macrocode}
+\newcommand*{\@ordinalstringMspanish}[2]{%
+ \let\@unitthstring=\@@unitthstringspanish
+ \let\@unitstring=\@@unitstringspanish
+ \let\@teenthstring=\@@teenthstringspanish
+ \let\@tenthstring=\@@tenthstringspanish
+ \let\@hundredthstring=\@@hundredthstringspanish
+ \def\@thousandth{mil\'esimo}%
+ \@@ordinalstringspanish{#1}{#2}%
+}%
+\global\let\@ordinalstringMspanish\@ordinalstringMspanish
+% \end{macrocode}
+% Feminine form:
+% \begin{macrocode}
+\newcommand*{\@ordinalstringFspanish}[2]{%
+ \let\@unitthstring=\@@unitthstringFspanish
+ \let\@unitstring=\@@unitstringFspanish
+ \let\@teenthstring=\@@teenthstringFspanish
+ \let\@tenthstring=\@@tenthstringFspanish
+ \let\@hundredthstring=\@@hundredthstringFspanish
+ \def\@thousandth{mil\'esima}%
+ \@@ordinalstringspanish{#1}{#2}%
+}%
+\global\let\@ordinalstringFspanish\@ordinalstringFspanish
+% \end{macrocode}
+% Make neuter same as masculine:
+% \begin{macrocode}
+\global\let\@ordinalstringNspanish\@ordinalstringMspanish
+% \end{macrocode}
+% As above, but with initial letters in upper case.
+% \begin{macrocode}
+\newcommand*{\@OrdinalstringMspanish}[2]{%
+ \let\@unitthstring=\@@Unitthstringspanish
+ \let\@unitstring=\@@Unitstringspanish
+ \let\@teenthstring=\@@Teenthstringspanish
+ \let\@tenthstring=\@@Tenthstringspanish
+ \let\@hundredthstring=\@@Hundredthstringspanish
+ \def\@thousandth{Mil\'esimo}%
+ \@@ordinalstringspanish{#1}{#2}%
+}
+\global\let\@OrdinalstringMspanish\@OrdinalstringMspanish
+% \end{macrocode}
+% Feminine form:
+% \begin{macrocode}
+\newcommand*{\@OrdinalstringFspanish}[2]{%
+ \let\@unitthstring=\@@UnitthstringFspanish
+ \let\@unitstring=\@@UnitstringFspanish
+ \let\@teenthstring=\@@TeenthstringFspanish
+ \let\@tenthstring=\@@TenthstringFspanish
+ \let\@hundredthstring=\@@HundredthstringFspanish
+ \def\@thousandth{Mil\'esima}%
+ \@@ordinalstringspanish{#1}{#2}%
+}%
+\global\let\@OrdinalstringFspanish\@OrdinalstringFspanish
+% \end{macrocode}
+% Make neuter same as masculine:
+% \begin{macrocode}
+\global\let\@OrdinalstringNspanish\@OrdinalstringMspanish
+% \end{macrocode}
+% Code for convert numbers into textual ordinals. As before,
+% it is easier to split it into units, tens, teens and hundreds.
+% Units:
+% \begin{macrocode}
+\newcommand*\@@unitthstringspanish[1]{%
+ \ifcase#1\relax
+ cero%
+ \or primero%
+ \or segundo%
+ \or tercero%
+ \or cuarto%
+ \or quinto%
+ \or sexto%
+ \or s\'eptimo%
+ \or octavo%
+ \or noveno%
+ \fi
+}%
+\global\let\@@unitthstringspanish\@@unitthstringspanish
+% \end{macrocode}
+% Tens:
+% \begin{macrocode}
+\newcommand*\@@tenthstringspanish[1]{%
+ \ifcase#1\relax
+ \or d\'ecimo%
+ \or vig\'esimo%
+ \or trig\'esimo%
+ \or cuadrag\'esimo%
+ \or quincuag\'esimo%
+ \or sexag\'esimo%
+ \or septuag\'esimo%
+ \or octog\'esimo%
+ \or nonag\'esimo%
+ \fi
+}%
+\global\let\@@tenthstringspanish\@@tenthstringspanish
+% \end{macrocode}
+% Teens:
+% \begin{macrocode}
+\newcommand*\@@teenthstringspanish[1]{%
+ \ifcase#1\relax
+ d\'ecimo%
+ \or und\'ecimo%
+ \or duod\'ecimo%
+ \or decimotercero%
+ \or decimocuarto%
+ \or decimoquinto%
+ \or decimosexto%
+ \or decimos\'eptimo%
+ \or decimoctavo%
+ \or decimonoveno%
+ \fi
+}%
+\global\let\@@teenthstringspanish\@@teenthstringspanish
+% \end{macrocode}
+% Hundreds:
+% \begin{macrocode}
+\newcommand*\@@hundredthstringspanish[1]{%
+ \ifcase#1\relax
+ \or cent\'esimo%
+ \or ducent\'esimo%
+ \or tricent\'esimo%
+ \or cuadringent\'esimo%
+ \or quingent\'esimo%
+ \or sexcent\'esimo%
+ \or septing\'esimo%
+ \or octingent\'esimo%
+ \or noningent\'esimo%
+ \fi
+}%
+\global\let\@@hundredthstringspanish\@@hundredthstringspanish
+% \end{macrocode}
+% Units (feminine):
+% \begin{macrocode}
+\newcommand*\@@unitthstringFspanish[1]{%
+ \ifcase#1\relax
+ cera%
+ \or primera%
+ \or segunda%
+ \or tercera%
+ \or cuarta%
+ \or quinta%
+ \or sexta%
+ \or s\'eptima%
+ \or octava%
+ \or novena%
+ \fi
+}%
+\global\let\@@unitthstringFspanish\@@unitthstringFspanish
+% \end{macrocode}
+% Tens (feminine):
+% \begin{macrocode}
+\newcommand*\@@tenthstringFspanish[1]{%
+ \ifcase#1\relax
+ \or d\'ecima%
+ \or vig\'esima%
+ \or trig\'esima%
+ \or cuadrag\'esima%
+ \or quincuag\'esima%
+ \or sexag\'esima%
+ \or septuag\'esima%
+ \or octog\'esima%
+ \or nonag\'esima%
+ \fi
+}%
+\global\let\@@tenthstringFspanish\@@tenthstringFspanish
+% \end{macrocode}
+% Teens (feminine)
+% \begin{macrocode}
+\newcommand*\@@teenthstringFspanish[1]{%
+ \ifcase#1\relax
+ d\'ecima%
+ \or und\'ecima%
+ \or duod\'ecima%
+ \or decimotercera%
+ \or decimocuarta%
+ \or decimoquinta%
+ \or decimosexta%
+ \or decimos\'eptima%
+ \or decimoctava%
+ \or decimonovena%
+ \fi
+}%
+\global\let\@@teenthstringFspanish\@@teenthstringFspanish
+% \end{macrocode}
+% Hundreds (feminine)
+% \begin{macrocode}
+\newcommand*\@@hundredthstringFspanish[1]{%
+ \ifcase#1\relax
+ \or cent\'esima%
+ \or ducent\'esima%
+ \or tricent\'esima%
+ \or cuadringent\'esima%
+ \or quingent\'esima%
+ \or sexcent\'esima%
+ \or septing\'esima%
+ \or octingent\'esima%
+ \or noningent\'esima%
+ \fi
+}%
+\global\let\@@hundredthstringFspanish\@@hundredthstringFspanish
+% \end{macrocode}
+% As above, but with initial letters in upper case
+% \begin{macrocode}
+\newcommand*\@@Unitthstringspanish[1]{%
+ \ifcase#1\relax
+ Cero%
+ \or Primero%
+ \or Segundo%
+ \or Tercero%
+ \or Cuarto%
+ \or Quinto%
+ \or Sexto%
+ \or S\'eptimo%
+ \or Octavo%
+ \or Noveno%
+ \fi
+}%
+\global\let\@@Unitthstringspanish\@@Unitthstringspanish
+% \end{macrocode}
+% Tens:
+% \begin{macrocode}
+\newcommand*\@@Tenthstringspanish[1]{%
+ \ifcase#1\relax
+ \or D\'ecimo%
+ \or Vig\'esimo%
+ \or Trig\'esimo%
+ \or Cuadrag\'esimo%
+ \or Quincuag\'esimo%
+ \or Sexag\'esimo%
+ \or Septuag\'esimo%
+ \or Octog\'esimo%
+ \or Nonag\'esimo%
+ \fi
+}%
+\global\let\@@Tenthstringspanish\@@Tenthstringspanish
+% \end{macrocode}
+% Teens:
+% \begin{macrocode}
+\newcommand*\@@Teenthstringspanish[1]{%
+ \ifcase#1\relax
+ D\'ecimo%
+ \or Und\'ecimo%
+ \or Duod\'ecimo%
+ \or Decimotercero%
+ \or Decimocuarto%
+ \or Decimoquinto%
+ \or Decimosexto%
+ \or Decimos\'eptimo%
+ \or Decimoctavo%
+ \or Decimonoveno%
+ \fi
+}%
+\global\let\@@Teenthstringspanish\@@Teenthstringspanish
+% \end{macrocode}
+% Hundreds
+% \begin{macrocode}
+\newcommand*\@@Hundredthstringspanish[1]{%
+ \ifcase#1\relax
+ \or Cent\'esimo%
+ \or Ducent\'esimo%
+ \or Tricent\'esimo%
+ \or Cuadringent\'esimo%
+ \or Quingent\'esimo%
+ \or Sexcent\'esimo%
+ \or Septing\'esimo%
+ \or Octingent\'esimo%
+ \or Noningent\'esimo%
+ \fi
+}%
+\global\let\@@Hundredthstringspanish\@@Hundredthstringspanish
+% \end{macrocode}
+% As above, but feminine.
+% \begin{macrocode}
+\newcommand*\@@UnitthstringFspanish[1]{%
+ \ifcase#1\relax
+ Cera%
+ \or Primera%
+ \or Segunda%
+ \or Tercera%
+ \or Cuarta%
+ \or Quinta%
+ \or Sexta%
+ \or S\'eptima%
+ \or Octava%
+ \or Novena%
+ \fi
+}%
+\global\let\@@UnitthstringFspanish\@@UnitthstringFspanish
+% \end{macrocode}
+% Tens (feminine)
+% \begin{macrocode}
+\newcommand*\@@TenthstringFspanish[1]{%
+ \ifcase#1\relax
+ \or D\'ecima%
+ \or Vig\'esima%
+ \or Trig\'esima%
+ \or Cuadrag\'esima%
+ \or Quincuag\'esima%
+ \or Sexag\'esima%
+ \or Septuag\'esima%
+ \or Octog\'esima%
+ \or Nonag\'esima%
+ \fi
+}%
+\global\let\@@TenthstringFspanish\@@TenthstringFspanish
+% \end{macrocode}
+% Teens (feminine):
+% \begin{macrocode}
+\newcommand*\@@TeenthstringFspanish[1]{%
+ \ifcase#1\relax
+ D\'ecima%
+ \or Und\'ecima%
+ \or Duod\'ecima%
+ \or Decimotercera%
+ \or Decimocuarta%
+ \or Decimoquinta%
+ \or Decimosexta%
+ \or Decimos\'eptima%
+ \or Decimoctava%
+ \or Decimonovena%
+ \fi
+}%
+\global\let\@@TeenthstringFspanish\@@TeenthstringFspanish
+% \end{macrocode}
+% Hundreds (feminine):
+% \begin{macrocode}
+\newcommand*\@@HundredthstringFspanish[1]{%
+ \ifcase#1\relax
+ \or Cent\'esima%
+ \or Ducent\'esima%
+ \or Tricent\'esima%
+ \or Cuadringent\'esima%
+ \or Quingent\'esima%
+ \or Sexcent\'esima%
+ \or Septing\'esima%
+ \or Octingent\'esima%
+ \or Noningent\'esima%
+ \fi
+}%
+\global\let\@@HundredthstringFspanish\@@HundredthstringFspanish
+% \end{macrocode}
+% This has changed in version 1.09, so that it now stores the
+% results in the second argument (which must be a control
+% sequence), but it doesn't display anything. Since it only
+% affects internal macros, it shouldn't affect documnets created
+% with older versions. (These internal macros are not meant for
+% use in documents.)
+% \begin{macrocode}
+\newcommand*\@@numberstringspanish[2]{%
+\ifnum#1>99999
+\PackageError{fmtcount}{Out of range}%
+{This macro only works for values less than 100000}%
+\else
+\ifnum#1<0
+\PackageError{fmtcount}{Negative numbers not permitted}%
+{This macro does not work for negative numbers, however
+you can try typing "minus" first, and then pass the modulus of
+this number}%
+\fi
+\fi
+\def#2{}%
+\@strctr=#1\relax \divide\@strctr by 1000\relax
+\ifnum\@strctr>9
+% \end{macrocode}
+% \#1 is greater or equal to 10000
+% \begin{macrocode}
+ \divide\@strctr by 10
+ \ifnum\@strctr>1
+ \let\@@fc@numstr#2\relax
+ \edef#2{\@@fc@numstr\@tenstring{\@strctr}}%
+ \@strctr=#1 \divide\@strctr by 1000\relax
+ \@FCmodulo{\@strctr}{10}%
+ \ifnum\@strctr>0\relax
+ \let\@@fc@numstr#2\relax
+ \edef#2{\@@fc@numstr\ \@andname\ \@unitstring{\@strctr}}%
+ \fi
+ \else
+ \@strctr=#1\relax
+ \divide\@strctr by 1000\relax
+ \@FCmodulo{\@strctr}{10}%
+ \let\@@fc@numstr#2\relax
+ \edef#2{\@@fc@numstr\@teenstring{\@strctr}}%
+ \fi
+ \let\@@fc@numstr#2\relax
+ \edef#2{\@@fc@numstr\ \@thousand}%
+\else
+ \ifnum\@strctr>0\relax
+ \ifnum\@strctr>1\relax
+ \let\@@fc@numstr#2\relax
+ \edef#2{\@@fc@numstr\@unitstring{\@strctr}\ }%
+ \fi
+ \let\@@fc@numstr#2\relax
+ \edef#2{\@@fc@numstr\@thousand}%
+ \fi
+\fi
+\@strctr=#1\relax \@FCmodulo{\@strctr}{1000}%
+\divide\@strctr by 100\relax
+\ifnum\@strctr>0\relax
+ \ifnum#1>1000\relax
+ \let\@@fc@numstr#2\relax
+ \edef#2{\@@fc@numstr\ }%
+ \fi
+ \@tmpstrctr=#1\relax
+ \@FCmodulo{\@tmpstrctr}{1000}%
+ \ifnum\@tmpstrctr=100\relax
+ \let\@@fc@numstr#2\relax
+ \edef#2{\@@fc@numstr\@tenstring{10}}%
+ \else
+ \let\@@fc@numstr#2\relax
+ \edef#2{\@@fc@numstr\@hundredstring{\@strctr}}%
+ \fi
+\fi
+\@strctr=#1\relax \@FCmodulo{\@strctr}{100}%
+\ifnum#1>100\relax
+ \ifnum\@strctr>0\relax
+ \let\@@fc@numstr#2\relax
+% \end{macrocode}
+%\changes{2.0}{2012-06-18}{removed andname (correction
+%provided by Fernando Maldonado)}
+% \begin{macrocode}
+ \edef#2{\@@fc@numstr\ }%
+ \fi
+\fi
+\ifnum\@strctr>29\relax
+ \divide\@strctr by 10\relax
+ \let\@@fc@numstr#2\relax
+ \edef#2{\@@fc@numstr\@tenstring{\@strctr}}%
+ \@strctr=#1\relax \@FCmodulo{\@strctr}{10}%
+ \ifnum\@strctr>0\relax
+ \let\@@fc@numstr#2\relax
+ \edef#2{\@@fc@numstr\ \@andname\ \@unitstring{\@strctr}}%
+ \fi
+\else
+ \ifnum\@strctr<10\relax
+ \ifnum\@strctr=0\relax
+ \ifnum#1<100\relax
+ \let\@@fc@numstr#2\relax
+ \edef#2{\@@fc@numstr\@unitstring{\@strctr}}%
+ \fi
+ \else
+ \let\@@fc@numstr#2\relax
+ \edef#2{\@@fc@numstr\@unitstring{\@strctr}}%
+ \fi
+ \else
+ \ifnum\@strctr>19\relax
+ \@FCmodulo{\@strctr}{10}%
+ \let\@@fc@numstr#2\relax
+ \edef#2{\@@fc@numstr\@twentystring{\@strctr}}%
+ \else
+ \@FCmodulo{\@strctr}{10}%
+ \let\@@fc@numstr#2\relax
+ \edef#2{\@@fc@numstr\@teenstring{\@strctr}}%
+ \fi
+ \fi
+\fi
+}%
+\global\let\@@numberstringspanish\@@numberstringspanish
+% \end{macrocode}
+% As above, but for ordinals
+% \begin{macrocode}
+\newcommand*\@@ordinalstringspanish[2]{%
+\@strctr=#1\relax
+\ifnum#1>99999
+\PackageError{fmtcount}{Out of range}%
+{This macro only works for values less than 100000}%
+\else
+\ifnum#1<0
+\PackageError{fmtcount}{Negative numbers not permitted}%
+{This macro does not work for negative numbers, however
+you can try typing "minus" first, and then pass the modulus of
+this number}%
+\else
+\def#2{}%
+\ifnum\@strctr>999\relax
+ \divide\@strctr by 1000\relax
+ \ifnum\@strctr>1\relax
+ \ifnum\@strctr>9\relax
+ \@tmpstrctr=\@strctr
+ \ifnum\@strctr<20
+ \@FCmodulo{\@tmpstrctr}{10}%
+ \let\@@fc@ordstr#2\relax
+ \edef#2{\@@fc@ordstr\@teenthstring{\@tmpstrctr}}%
+ \else
+ \divide\@tmpstrctr by 10\relax
+ \let\@@fc@ordstr#2\relax
+ \edef#2{\@@fc@ordstr\@tenthstring{\@tmpstrctr}}%
+ \@tmpstrctr=\@strctr
+ \@FCmodulo{\@tmpstrctr}{10}%
+ \ifnum\@tmpstrctr>0\relax
+ \let\@@fc@ordstr#2\relax
+ \edef#2{\@@fc@ordstr\@unitthstring{\@tmpstrctr}}%
+ \fi
+ \fi
+ \else
+ \let\@@fc@ordstr#2\relax
+ \edef#2{\@@fc@ordstr\@unitstring{\@strctr}}%
+ \fi
+ \fi
+ \let\@@fc@ordstr#2\relax
+ \edef#2{\@@fc@ordstr\@thousandth}%
+\fi
+\@strctr=#1\relax
+\@FCmodulo{\@strctr}{1000}%
+\ifnum\@strctr>99\relax
+ \@tmpstrctr=\@strctr
+ \divide\@tmpstrctr by 100\relax
+ \ifnum#1>1000\relax
+ \let\@@fc@ordstr#2\relax
+ \edef#2{\@@fc@ordstr\ }%
+ \fi
+ \let\@@fc@ordstr#2\relax
+ \edef#2{\@@fc@ordstr\@hundredthstring{\@tmpstrctr}}%
+\fi
+\@FCmodulo{\@strctr}{100}%
+\ifnum#1>99\relax
+ \ifnum\@strctr>0\relax
+ \let\@@fc@ordstr#2\relax
+ \edef#2{\@@fc@ordstr\ }%
+ \fi
+\fi
+\ifnum\@strctr>19\relax
+ \@tmpstrctr=\@strctr
+ \divide\@tmpstrctr by 10\relax
+ \let\@@fc@ordstr#2\relax
+ \edef#2{\@@fc@ordstr\@tenthstring{\@tmpstrctr}}%
+ \@tmpstrctr=\@strctr
+ \@FCmodulo{\@tmpstrctr}{10}%
+ \ifnum\@tmpstrctr>0\relax
+ \let\@@fc@ordstr#2\relax
+ \edef#2{\@@fc@ordstr\ \@unitthstring{\@tmpstrctr}}%
+ \fi
+\else
+ \ifnum\@strctr>9\relax
+ \@FCmodulo{\@strctr}{10}%
+ \let\@@fc@ordstr#2\relax
+ \edef#2{\@@fc@ordstr\@teenthstring{\@strctr}}%
+ \else
+ \ifnum\@strctr=0\relax
+ \ifnum#1=0\relax
+ \let\@@fc@ordstr#2\relax
+ \edef#2{\@@fc@ordstr\@unitstring{0}}%
+ \fi
+ \else
+ \let\@@fc@ordstr#2\relax
+ \edef#2{\@@fc@ordstr\@unitthstring{\@strctr}}%
+ \fi
+ \fi
+\fi
+\fi
+\fi
+}%
+\global\let\@@ordinalstringspanish\@@ordinalstringspanish
+% \end{macrocode}
+\iffalse Local variables: \fi
+\iffalse mode: docTeX \fi
+\iffalse End: \fi%\iffalse
+% \begin{macrocode}
+%</fc-spanish.def>
+% \end{macrocode}
+%\fi
+%\iffalse
+% \begin{macrocode}
+%<*fc-UKenglish.def>
+% \end{macrocode}
+%\fi
+% \subsubsection{fc-UKenglish.def}
+% English definitions
+% \begin{macrocode}
+\ProvidesFCLanguage{UKenglish}[2013/08/17]%
+% \end{macrocode}
+% Loaded fc-english.def if not already loaded
+% \begin{macrocode}
+\FCloadlang{english}%
+% \end{macrocode}
+% These are all just synonyms for the commands provided by
+% fc-english.def.
+% \begin{macrocode}
+\global\let\@ordinalMUKenglish\@ordinalMenglish
+\global\let\@ordinalFUKenglish\@ordinalMenglish
+\global\let\@ordinalNUKenglish\@ordinalMenglish
+\global\let\@numberstringMUKenglish\@numberstringMenglish
+\global\let\@numberstringFUKenglish\@numberstringMenglish
+\global\let\@numberstringNUKenglish\@numberstringMenglish
+\global\let\@NumberstringMUKenglish\@NumberstringMenglish
+\global\let\@NumberstringFUKenglish\@NumberstringMenglish
+\global\let\@NumberstringNUKenglish\@NumberstringMenglish
+\global\let\@ordinalstringMUKenglish\@ordinalstringMenglish
+\global\let\@ordinalstringFUKenglish\@ordinalstringMenglish
+\global\let\@ordinalstringNUKenglish\@ordinalstringMenglish
+\global\let\@OrdinalstringMUKenglish\@OrdinalstringMenglish
+\global\let\@OrdinalstringFUKenglish\@OrdinalstringMenglish
+\global\let\@OrdinalstringNUKenglish\@OrdinalstringMenglish
+% \end{macrocode}
+%\iffalse
+% \begin{macrocode}
+%</fc-UKenglish.def>
+% \end{macrocode}
+%\fi
+%\iffalse
+% \begin{macrocode}
+%<*fc-USenglish.def>
+% \end{macrocode}
+%\fi
+% \subsubsection{fc-USenglish.def}
+% US English definitions
+% \begin{macrocode}
+\ProvidesFCLanguage{USenglish}[2013/08/17]%
+% \end{macrocode}
+% Loaded fc-english.def if not already loaded
+% \begin{macrocode}
+\FCloadlang{english}%
+% \end{macrocode}
+% These are all just synonyms for the commands provided by
+% fc-english.def. (This needs fixing as there are some differences
+% between UK and US number strings.)
+% \begin{macrocode}
+\global\let\@ordinalMUSenglish\@ordinalMenglish
+\global\let\@ordinalFUSenglish\@ordinalMenglish
+\global\let\@ordinalNUSenglish\@ordinalMenglish
+\global\let\@numberstringMUSenglish\@numberstringMenglish
+\global\let\@numberstringFUSenglish\@numberstringMenglish
+\global\let\@numberstringNUSenglish\@numberstringMenglish
+\global\let\@NumberstringMUSenglish\@NumberstringMenglish
+\global\let\@NumberstringFUSenglish\@NumberstringMenglish
+\global\let\@NumberstringNUSenglish\@NumberstringMenglish
+\global\let\@ordinalstringMUSenglish\@ordinalstringMenglish
+\global\let\@ordinalstringFUSenglish\@ordinalstringMenglish
+\global\let\@ordinalstringNUSenglish\@ordinalstringMenglish
+\global\let\@OrdinalstringMUSenglish\@OrdinalstringMenglish
+\global\let\@OrdinalstringFUSenglish\@OrdinalstringMenglish
+\global\let\@OrdinalstringNUSenglish\@OrdinalstringMenglish
+% \end{macrocode}
+%\iffalse
+% \begin{macrocode}
+%</fc-USenglish.def>
+% \end{macrocode}
+%\fi
+%\iffalse
+% \begin{macrocode}
+%<*fcnumparser.sty>
+% \end{macrocode}
+%\fi
+%\subsection{fcnumparser.sty}
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{fcnumparser}[2017/06/15]
+% \end{macrocode}
+% \cs{fc@counter@parser} is just a shorthand to parse a number held in a counter.
+% \begin{macrocode}
+\def\fc@counter@parser#1{%
+ \expandafter\fc@number@parser\expandafter{\the#1.}%
+}
+% \end{macrocode}
+% \begin{macrocode}
+\newcount\fc@digit@counter
+
+\def\fc@end@{\fc@end}
+% \end{macrocode}
+% \DescribeMacro{\fc@number@analysis} First of all we need to separate the number between integer and fractional
+% part. Number to be analysed is in `\texttt{\#1}'. Decimal separator may be . or , whichever first. At end of
+% this macro, integer part goes to \cs{fc@integer@part} and fractional part goes to \cs{fc@fractional@part}.
+% \begin{macrocode}
+\def\fc@number@analysis#1\fc@nil{%
+% \end{macrocode}
+% First check for the presence of a decimal point in the number.
+% \begin{macrocode}
+ \def\@tempb##1.##2\fc@nil{\def\fc@integer@part{##1}\def\@tempa{##2}}%
+ \@tempb#1.\fc@end\fc@nil
+ \ifx\@tempa\fc@end@
+% \end{macrocode}
+% Here \cs{@tempa} is \cs{ifx}-equal to \cs{fc@end}, which means that the number does not contain any decimal
+% point. So we do the same trick to search for a comma.
+% \begin{macrocode}
+ \def\@tempb##1,##2\fc@nil{\def\fc@integer@part{##1}\def\@tempa{##2}}%
+ \@tempb#1,\fc@end\fc@nil
+ \ifx\@tempa\fc@end@
+% \end{macrocode}
+% No comma either, so fractional part is set empty.
+% \begin{macrocode}
+ \def\fc@fractional@part{}%
+ \else
+% \end{macrocode}
+% Comma has been found, so we just need to drop `\texttt{,}\cs{fc@end}' from the end of \cs{@tempa} to get the
+% fractional part.
+% \begin{macrocode}
+ \def\@tempb##1,\fc@end{\def\fc@fractional@part{##1}}%
+ \expandafter\@tempb\@tempa
+ \fi
+ \else
+% \end{macrocode}
+% Decimal point has been found, so we just need to drop `\texttt{.}\cs{fc@end}' from the end \cs{@tempa} to
+% get the fractional part.
+% \begin{macrocode}
+ \def\@tempb##1.\fc@end{\def\fc@fractional@part{##1}}%
+ \expandafter\@tempb\@tempa
+ \fi
+}
+% \end{macrocode}
+% \DescribeMacro{\fc@number@parser} Macro \cs{fc@number@parser} is the main engine to parse a number. Argument
+% `\#1' is input and contains the number to be parsed. At end of this macro, each digit is stored separately
+% in a \cs{fc@digit@}\meta{$n$}, and macros \cs{fc@min@weight} and \cs{fc@max@weight} are set to the bounds
+% for \meta{$n$}.
+% \begin{macrocode}
+\def\fc@number@parser#1{%
+% \end{macrocode}
+% First remove all the spaces in \texttt{\#1}, and place the result into \cs{@tempa}.
+% \begin{macrocode}
+ \let\@tempa\@empty
+ \def\@tempb##1##2\fc@nil{%
+ \def\@tempc{##1}%
+ \ifx\@tempc\space
+ \else
+ \expandafter\def\expandafter\@tempa\expandafter{\@tempa ##1}%
+ \fi
+ \def\@tempc{##2}%
+ \ifx\@tempc\@empty
+ \expandafter\@gobble
+ \else
+ \expandafter\@tempb
+ \fi
+ ##2\fc@nil
+ }%
+ \@tempb#1\fc@nil
+% \end{macrocode}
+% Get the sign into \cs{fc@sign} and the unsigned number part into \cs{fc@number}.
+% \begin{macrocode}
+ \def\@tempb##1##2\fc@nil{\def\fc@sign{##1}\def\fc@number{##2}}%
+ \expandafter\@tempb\@tempa\fc@nil
+ \expandafter\if\fc@sign+%
+ \def\fc@sign@case{1}%
+ \else
+ \expandafter\if\fc@sign-%
+ \def\fc@sign@case{2}%
+ \else
+ \def\fc@sign{}%
+ \def\fc@sign@case{0}%
+ \let\fc@number\@tempa
+ \fi
+ \fi
+ \ifx\fc@number\@empty
+ \PackageError{fcnumparser}{Invalid number}{Number must contain at least one non blank
+ character after sign}%
+ \fi
+% \end{macrocode}
+% Now, split \cs{fc@number} into \cs{fc@integer@part} and \cs{fc@fractional@part}.
+% \begin{macrocode}
+ \expandafter\fc@number@analysis\fc@number\fc@nil
+% \end{macrocode}
+% Now, split \cs{fc@integer@part} into a sequence of \cs{fc@digit@}\meta{$n$} with \meta{$n$} ranging from
+% \cs{fc@unit@weight} to \cs{fc@max@weight}. We will use macro \cs{fc@parse@integer@digits} for that, but that
+% will place the digits into \cs{fc@digit@}\meta{$n$} with \meta{$n$} ranging from
+% \(2\times\cs{fc@unit@weight}-\cs{fc@max@weight}\) upto \(\cs{fc@unit@weight}-1\).
+% \begin{macrocode}
+ \expandafter\fc@digit@counter\fc@unit@weight
+ \expandafter\fc@parse@integer@digits\fc@integer@part\fc@end\fc@nil
+% \end{macrocode}
+% First we compute the weight of the most significant digit: after \cs{fc@parse@integer@digits},
+% \cs{fc@digit@counter} is equal to \(\cs{fc@unit@weight} -\mathrm{mw} -1\) and we want to set
+% \cs{fc@max@weight} to \(\cs{fc@unit@weight} +\mathrm{mw}\) so we do:
+% \begin{equation*}
+% \cs{fc@max@weight}\leftarrow (-\cs{fc@digit@counter}) + 2\times\cs{fc@unit@weight} -1
+% \end{equation*}
+% \begin{macrocode}
+ \fc@digit@counter -\fc@digit@counter
+ \advance\fc@digit@counter by \fc@unit@weight
+ \advance\fc@digit@counter by \fc@unit@weight
+ \advance\fc@digit@counter by -1 %
+ \edef\fc@max@weight{\the\fc@digit@counter}%
+% \end{macrocode}
+% Now we loop for \(i = \cs{fc@unit@weight}\) to \cs{fc@max@weight} in order to copy all the digits from
+% \cs{fc@digit@}\meta{\(i + \mathrm{offset}\)} to \cs{fc@digit@}\meta{\(i\)}. First we compute
+% \(\mathrm{offset}\) into \cs{@tempi}.
+% \begin{macrocode}
+ {%
+ \count0 \fc@unit@weight\relax
+ \count1 \fc@max@weight\relax
+ \advance\count0 by -\count1 %
+ \advance\count0 by -1 %
+ \def\@tempa##1{\def\@tempb{\def\@tempi{##1}}}%
+ \expandafter\@tempa\expandafter{\the\count0}%
+ \expandafter
+ }\@tempb
+% \end{macrocode}
+% Now we loop to copy the digits. To do that we define a macro \cs{@templ} for terminal recursion.
+% \begin{macrocode}
+ \expandafter\fc@digit@counter\fc@unit@weight
+ \def\@templ{%
+ \ifnum\fc@digit@counter>\fc@max@weight
+ \let\next\relax
+ \else
+% \end{macrocode}
+% Here is the loop body:
+% \begin{macrocode}
+ {%
+ \count0 \@tempi
+ \advance\count0 by \fc@digit@counter
+ \expandafter\def\expandafter\@tempd\expandafter{\csname fc@digit@\the\count0\endcsname}%
+ \expandafter\def\expandafter\@tempe\expandafter{\csname fc@digit@\the\fc@digit@counter\endcsname}%
+ \def\@tempa####1####2{\def\@tempb{\let####1####2}}%
+ \expandafter\expandafter\expandafter\@tempa\expandafter\@tempe\@tempd
+ \expandafter
+ }\@tempb
+ \advance\fc@digit@counter by 1 %
+ \fi
+ \next
+ }%
+ \let\next\@templ
+ \@templ
+% \end{macrocode}
+% Split \cs{fc@fractional@part} into a sequence of \cs{fc@digit@}\meta{$n$} with \meta{$n$} ranging from
+% \(\cs{fc@unit@weight}-1\) to \cs{fc@min@weight} by step of \(-1\). This is much more simpler because we get
+% the digits with the final range of index, so no post-processing loop is needed.
+% \begin{macrocode}
+ \expandafter\fc@digit@counter\fc@unit@weight
+ \expandafter\fc@parse@integer@digits\fc@fractional@part\fc@end\fc@nil
+ \edef\fc@min@weight{\the\fc@digit@counter}%
+}
+% \end{macrocode}
+% \DescribeMacro{\fc@parse@integer@digits} Macro \cs{fc@parse@integer@digits} is used to
+% \begin{macrocode}
+\ifcsundef{fc@parse@integer@digits}{}{%
+ \PackageError{fcnumparser}{Duplicate definition}{Redefinition of
+ macro `fc@parse@integer@digits'}}
+\def\fc@parse@integer@digits#1#2\fc@nil{%
+ \def\@tempa{#1}%
+ \ifx\@tempa\fc@end@
+ \def\next##1\fc@nil{}%
+ \else
+ \let\next\fc@parse@integer@digits
+ \advance\fc@digit@counter by -1
+ \expandafter\def\csname fc@digit@\the\fc@digit@counter\endcsname{#1}%
+ \fi
+ \next#2\fc@nil
+}
+
+
+\newcommand*{\fc@unit@weight}{0}
+
+% \end{macrocode}
+% Now we have macros to read a few digits from the \cs{fc@digit@}\meta{$n$} array and form a correspoding
+% number.\newline \DescribeMacro{\fc@read@unit} \cs{fc@read@unit} just reads one digit and form an integer in
+% the range \([0 \intv 9]\). First we check that the macro is not yet defined.
+% \begin{macrocode}
+\ifcsundef{fc@read@unit}{}{%
+ \PackageError{fcnumparser}{Duplicate definition}{Redefinition of macro `fc@read@unit'}}
+% \end{macrocode}
+% Arguments as follows:\def\interface{\newline\noindent
+% \begin{tabularx}{\linewidth}{@{}>{\raggedleft\arraybackslash\ttfamily}rX@{}}
+% \#1&output counter: into which the read value is placed\\
+% \#2&input number: unit weight at which reach the value is to be read
+% \end{tabularx}}\interface
+% \#2 does not need to be comprised between \cs{fc@min@weight} and {fc@min@weight}, if outside this interval,
+% then a zero is read.
+% \begin{macrocode}
+\def\fc@read@unit#1#2{%
+ \ifnum#2>\fc@max@weight
+ #1=0\relax
+ \else
+ \ifnum#2<\fc@min@weight
+ #1=0\relax
+ \else
+ {%
+ \edef\@tempa{\number#2}%
+ \count0=\@tempa
+ \edef\@tempa{\csname fc@digit@\the\count0\endcsname}%
+ \def\@tempb##1{\def\@tempa{#1=##1\relax}}%
+ \expandafter\@tempb\expandafter{\@tempa}%
+ \expandafter
+ }\@tempa
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \DescribeMacro{\fc@read@hundred} Macro \cs{fc@read@hundred} is used to read a pair of digits and form an
+% integer in the range \([0 \intv 99]\). First we check that the macro is not yet defined.
+% \begin{macrocode}
+\ifcsundef{fc@read@hundred}{}{%
+ \PackageError{fcnumparser}{Duplicate definition}{Redefinition of macro `fc@read@hundred'}}
+% \end{macrocode}
+% Arguments as follows --- same interface as \cs{fc@read@unit}:\interface
+% \begin{macrocode}
+\def\fc@read@hundred#1#2{%
+ {%
+ \fc@read@unit{\count0}{#2}%
+ \def\@tempa##1{\fc@read@unit{\count1}{##1}}%
+ \count2=#2%
+ \advance\count2 by 1 %
+ \expandafter\@tempa{\the\count2}%
+ \multiply\count1 by 10 %
+ \advance\count1 by \count0 %
+ \def\@tempa##1{\def\@tempb{#1=##1\relax}}
+ \expandafter\@tempa\expandafter{\the\count1}%
+ \expandafter
+ }\@tempb
+}
+% \end{macrocode}
+% \DescribeMacro{\fc@read@thousand} Macro \cs{fc@read@thousand} is used to read a trio of digits and form an
+% integer in the range \([0 \intv 999]\). First we check that the macro is not yet defined.
+% \begin{macrocode}
+\ifcsundef{fc@read@thousand}{}{%
+ \PackageError{fcnumparser}{Duplicate definition}{Redefinition of macro
+ `fc@read@thousand'}}
+% \end{macrocode}
+% Arguments as follows --- same interface as \cs{fc@read@unit}:\interface
+% \begin{macrocode}
+\def\fc@read@thousand#1#2{%
+ {%
+ \fc@read@unit{\count0}{#2}%
+ \def\@tempa##1{\fc@read@hundred{\count1}{##1}}%
+ \count2=#2%
+ \advance\count2 by 1 %
+ \expandafter\@tempa{\the\count2}%
+ \multiply\count1 by 10 %
+ \advance\count1 by \count0 %
+ \def\@tempa##1{\def\@tempb{#1=##1\relax}}
+ \expandafter\@tempa\expandafter{\the\count1}%
+ \expandafter
+ }\@tempb
+}
+% \end{macrocode}
+% Note: one myriad is ten thousand.
+% \DescribeMacro{\fc@read@thousand} Macro \cs{fc@read@myriad} is used to read a quatuor of digits and form an
+% integer in the range \([0 \intv 9999]\). First we check that the macro is not yet defined.
+% \begin{macrocode}
+\ifcsundef{fc@read@myriad}{}{%
+ \PackageError{fcnumparser}{Duplicate definition}{Redefinition of macro
+ `fc@read@myriad'}}
+% \end{macrocode}
+% Arguments as follows --- same interface as \cs{fc@read@unit}:\interface
+% \begin{macrocode}
+\def\fc@read@myriad#1#2{%
+ {%
+ \fc@read@hundred{\count0}{#2}%
+ \def\@tempa##1{\fc@read@hundred{\count1}{##1}}%
+ \count2=#2
+ \advance\count2 by 2
+ \expandafter\@tempa{\the\count2}%
+ \multiply\count1 by 100 %
+ \advance\count1 by \count0 %
+ \def\@tempa##1{\def\@tempb{#1=##1\relax}}%
+ \expandafter\@tempa\expandafter{\the\count1}%
+ \expandafter
+ }\@tempb
+}
+% \end{macrocode}
+% \DescribeMacro{\fc@check@nonzeros} Macro \cs{fc@check@nonzeros} is used to check whether the number
+% represented by digits \cs{fc@digit@}\meta{$n$}, with \(n\) in some interval, is zero, one, or more than one.
+% First we check that the macro is not yet defined.
+% \begin{macrocode}
+\ifcsundef{fc@check@nonzeros}{}{%
+ \PackageError{fcnumparser}{Duplicate definition}{Redefinition of macro
+ `fc@check@nonzeros'}}
+% \end{macrocode}
+% Arguments as follows:\newline\noindent
+% \begin{tabularx}{\linewidth}{@{}>{\raggedleft\arraybackslash\ttfamily}rX@{}}
+% \#1&input number: minimum unit unit weight at which start to search the non-zeros\\
+% \#2&input number: maximum unit weight at which end to seach the non-zeros\\
+% \#3&output macro: let \(n\) be the number represented by digits the weight of which span from \texttt{\#1}
+% to \texttt{\#2}, then \texttt{\#3} is set to the number min(n,9).\\
+% \end{tabularx}
+% Actually \cs{fc@check@nonzeros} is just a wrapper to collect arguments, and the real job is delegated to
+% \cs{fc@@check@nonzeros@inner} which is called inside a group.
+% \begin{macrocode}
+\def\fc@check@nonzeros#1#2#3{%
+ {%
+% \end{macrocode}
+% So first we save inputs into local macros used by \cs{fc@@check@nonzeros@inner} as input arguments
+% \begin{macrocode}
+ \edef\@@tempa{\number#1}%
+ \edef\@tempb{\number#2}%
+ \count0=\@@tempa
+ \count1=\@tempb\relax
+% \end{macrocode}
+% Then we do the real job
+% \begin{macrocode}
+ \fc@@check@nonzeros@inner
+% \end{macrocode}
+% And finally, we propagate the output after end of group --- i.e. closing brace.
+% \begin{macrocode}
+ \def\@tempd##1{\def\@tempa{\def#3{##1}}}%
+ \expandafter\@tempd\expandafter{\@tempc}%
+ \expandafter
+ }\@tempa
+}
+% \end{macrocode}
+% \DescribeMacro{\fc@@check@nonzeros@inner} Macro \cs{fc@@check@nonzeros@inner} Check wehther some part of the
+% parsed value contains some non-zero digit At the call of this macro we expect that:\newline\noindent
+% \begin{tabularx}{\linewidth}{@{}>{\raggedleft\arraybackslash}rX@{}}
+% \cs{@tempa}&input/output macro:\newline\noindent
+% \settowidth{\tabcolwidth}{output}%
+% \begin{tabular*}{\hsize}{@{}>{\raggedleft\arraybackslash\itshape}r%
+% p{\dimexpr\hsize-2\tabcolsep-\tabcolwidth}@{}}
+% input&minimum unit unit weight at which start to search the non-zeros\\
+% output&macro may have been redefined
+% \end{tabular*}\\
+% \cs{@tempb}&input/output macro:\newline\noindent
+% \settowidth{\tabcolwidth}{output}%
+% \begin{tabular*}{\hsize}{@{}>{\raggedleft\arraybackslash\itshape}r%
+% p{\dimexpr\hsize-2\tabcolsep-\tabcolwidth}@{}}
+% input&maximum unit weight at which end to seach the non-zeros\\
+% output&macro may have been redefined
+% \end{tabular*}\\
+% \cs{@tempc}&ouput macro: 0 if all-zeros, 1 if at least one zero is found\\
+% \cs{count0}&output counter: \(\mathrm{weight}+1\) of the first found non zero starting from minimum
+% \(\mathrm{weight}\).
+% \end{tabularx}
+% \begin{macrocode}
+\def\fc@@check@nonzeros@inner{%
+ \ifnum\count0<\fc@min@weight
+ \count0=\fc@min@weight\relax
+ \fi
+ \ifnum\count1>\fc@max@weight\relax
+ \count1=\fc@max@weight
+ \fi
+ \count2\count0 %
+ \advance\count2 by 1 %
+ \ifnum\count0>\count1 %
+ \PackageError{fcnumparser}{Unexpected arguments}{Number in argument 2 of macro
+ `fc@check@nonzeros' must be at least equal to number in argument 1}%
+ \else
+ \fc@@check@nonzeros@inner@loopbody
+ \ifnum\@tempc>0 %
+ \ifnum\@tempc<9 %
+ \ifnum\count0>\count1 %
+ \else
+ \let\@tempd\@tempc
+ \fc@@check@nonzeros@inner@loopbody
+ \ifnum\@tempc=0 %
+ \let\@tempc\@tempd
+ \else
+ \def\@tempc{9}%
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \begin{macrocode}
+\def\fc@@check@nonzeros@inner@loopbody{%
+ % \@tempc <- digit of weight \count0
+ \expandafter\let\expandafter\@tempc\csname fc@digit@\the\count0\endcsname
+ \advance\count0 by 1 %
+ \ifnum\@tempc=0 %
+ \ifnum\count0>\count1 %
+ \let\next\relax
+ \else
+ \let\next\fc@@check@nonzeros@inner@loopbody
+ \fi
+ \else
+ \ifnum\count0>\count2 %
+ \def\@tempc{9}%
+ \fi
+ \let\next\relax
+ \fi
+ \next
+}
+% \end{macrocode}
+% \DescribeMacro{\fc@intpart@find@last} Macro \cs{fc@intpart@find@last} find the rightmost non zero digit in the
+% integer part. First check that the macro is not yet defined.
+% \begin{macrocode}
+\ifcsundef{fc@intpart@find@last}{}{%
+ \PackageError{fcnumparser}{Duplicate definition}{Redefinition of macro
+ `fc@intpart@find@last'}}
+% \end{macrocode}
+% When macro is called, the number of interest is already parsed, that is to say each digit of weight \(w\) is
+% stored in macro \cs{fc@digit@}\meta{$w$}. Macro \cs{fc@intpart@find@last} takes one single argument which
+% is a counter to set to the result.
+% \begin{macrocode}
+\def\fc@intpart@find@last#1{%
+ {%
+% \end{macrocode}
+% Counter \cs{count0} will hold the result. So we will loop on \cs{count0}, starting from
+% \(\min\{u,w_{\mathrm{min}}\}\), where \(u\triangleq\cs{fc@unit@weight}\), and
+% \(w_{\mathrm{min}}\triangleq\cs{fc@min@weight}\). So first set \cs{count0} to
+% \(\min\{u,w_{\mathrm{min}}\}\):
+% \begin{macrocode}
+ \count0=\fc@unit@weight\space
+ \ifnum\count0<\fc@min@weight\space
+ \count0=\fc@min@weight\space
+ \fi
+% \end{macrocode}
+% Now the loop. This is done by defining macro \cs{@templ} for final recursion.
+% \begin{macrocode}
+ \def\@templ{%
+ \ifnum\csname fc@digit@\the\count0\endcsname=0 %
+ \advance\count0 by 1 %
+ \ifnum\count0>\fc@max@weight\space
+ \let\next\relax
+ \fi
+ \else
+ \let\next\relax
+ \fi
+ \next
+ }%
+ \let\next\@templ
+ \@templ
+% \end{macrocode}
+% Now propagate result after closing bracket into counter \texttt{\#1}.
+% \begin{macrocode}
+ \toks0{#1}%
+ \edef\@tempa{\the\toks0=\the\count0}%
+ \expandafter
+ }\@tempa\space
+}
+% \end{macrocode}
+% \DescribeMacro{\fc@get@last@word} Getting last word. Arguments as follows:\newline\noindent
+% \begin{tabularx}{\linewidth}{@{}>{\raggedleft\arraybackslash\ttfamily}rX@{}}
+% \#1&input: full sequence\\
+% \#2&output macro 1: all sequence without last word\\
+% \#3&output macro 2: last word\\
+% \end{tabularx}
+% \begin{macrocode}
+\ifcsundef{fc@get@last@word}{}{\PackageError{fcnumparser}{Duplicate definition}{Redefinition
+ of macro `fc@get@last@word'}}%
+\def\fc@get@last@word#1#2#3{%
+ {%
+% \end{macrocode}
+% First we split \texttt{\#1} into two parts: everything that is upto \cs{fc@wcase} exclusive goes to
+% \cs{toks0}, and evrything from \cs{fc@wcase} exclusive upto the final \cs{@nil} exclusive goes to \cs{toks1}.
+% \begin{macrocode}
+ \def\@tempa##1\fc@wcase##2\@nil\fc@end{%
+ \toks0{##1}%
+% \end{macrocode}
+% Actually a dummy \cs{fc@wcase} is appended to \cs{toks1}, because that makes easier further checking that it
+% does not contains any other \cs{fc@wcase}.
+% \begin{macrocode}
+ \toks1{##2\fc@wcase}%
+ }%
+ \@tempa#1\fc@end
+% \end{macrocode}
+% Now leading part upto last word should be in \cs{toks0}, and last word should be in \cs{toks1}. However we
+% need to check that this is really the last word, i.e. we need to check that there is no \cs{fc@wcase} inside
+% \cs{toks1} other than the tailing dummy one. To that purpose we will loop while we find that \cs{toks1}
+% contains some \cs{fc@wcase}. First we define \cs{@tempa} to split \cs{the}\cs{toks1} between parts before and
+% after some potential \cs{fc@wcase}.
+% \begin{macrocode}
+ \def\@tempa##1\fc@wcase##2\fc@end{%
+ \toks2{##1}%
+ \def\@tempb{##2}%
+ \toks3{##2}%
+ }%
+% \end{macrocode}
+% \cs{@tempt} is just an aliases of \cs{toks0} to make its handling easier later on.
+% \begin{macrocode}
+ \toksdef\@tempt0 %
+% \end{macrocode}
+% Now the loop itself, this is done by terminal recursion with macro \cs{@templ}.
+% \begin{macrocode}
+ \def\@templ{%
+ \expandafter\@tempa\the\toks1 \fc@end
+ \ifx\@tempb\@empty
+% \end{macrocode}
+% \cs{@tempb} empty means that the only \cs{fc@wcase} found in \cs{the}\cs{toks1} is the dummy one. So we end
+% the loop here, \cs{toks2} contains the last word.
+% \begin{macrocode}
+ \let\next\relax
+ \else
+% \end{macrocode}
+% \cs{@tempb} is not empty, first we use
+% \begin{macrocode}
+ \expandafter\expandafter\expandafter\@tempt
+ \expandafter\expandafter\expandafter{%
+ \expandafter\the\expandafter\@tempt
+ \expandafter\fc@wcase\the\toks2}%
+ \toks1\toks3 %
+ \fi
+ \next
+ }%
+ \let\next\@templ
+ \@templ
+ \edef\@tempa{\def\noexpand#2{\the\toks0}\def\noexpand#3{\the\toks2}}%
+ \expandafter
+ }\@tempa
+}
+% \end{macrocode}
+% \DescribeMacro{\fc@get@last@word} Getting last letter. Arguments as follows:\newline\noindent
+% \begin{tabularx}{\linewidth}{@{}>{\raggedleft\arraybackslash\ttfamily}rX@{}}
+% \#1&input: full word\\
+% \#2&output macro 1: all word without last letter\\
+% \#3&output macro 2: last letter\\
+% \end{tabularx}
+% \begin{macrocode}
+\ifcsundef{fc@get@last@letter}{}{\PackageError{fcnumparser}{Duplicate definition}{Redefinition
+ of macro `fc@get@last@letter'}}%
+\def\fc@get@last@letter#1#2#3{%
+ {%
+% \end{macrocode}
+% First copy input to local \cs{toks1}. What we are going to to is to bubble one by one letters from
+% \cs{toks1} which initial contains the whole word, into \cs{toks0}. At the end of the macro \cs{toks0} will
+% therefore contain the whole work but the last letter, and the last letter will be in \cs{toks1}.
+% \begin{macrocode}
+ \toks1{#1}%
+ \toks0{}%
+ \toksdef\@tempt0 %
+% \end{macrocode}
+% We define \cs{@tempa} in order to pop the first letter from the remaining of word.
+% \begin{macrocode}
+ \def\@tempa##1##2\fc@nil{%
+ \toks2{##1}%
+ \toks3{##2}%
+ \def\@tempb{##2}%
+ }%
+% \end{macrocode}
+% Now we define \cs{@templ} to do the loop by terminal recursion.
+% \begin{macrocode}
+ \def\@templ{%
+ \expandafter\@tempa\the\toks1 \fc@nil
+ \ifx\@tempb\@empty
+% \end{macrocode}
+% Stop loop, as \cs{toks1} has been detected to be one single letter.
+% \begin{macrocode}
+ \let\next\relax
+ \else
+% \end{macrocode}
+% Here we append to \cs{toks0} the content of \cs{toks2}, i.e. the next letter.
+% \begin{macrocode}
+ \expandafter\expandafter\expandafter\@tempt
+ \expandafter\expandafter\expandafter{%
+ \expandafter\the\expandafter\@tempt
+ \the\toks2}%
+% \end{macrocode}
+% And the remaining letters go to \cs{toks1} for the next iteration.
+% \begin{macrocode}
+ \toks1\toks3 %
+ \fi
+ \next
+ }%
+% \end{macrocode}
+% Here run the loop.
+% \begin{macrocode}
+ \let\next\@templ
+ \next
+% \end{macrocode}
+% Now propagate the results into macros \texttt{\#2} and \texttt{\#3} after closing brace.
+% \begin{macrocode}
+ \edef\@tempa{\def\noexpand#2{\the\toks0}\def\noexpand#3{\the\toks1}}%
+ \expandafter
+ }\@tempa
+}%
+% \end{macrocode}
+\iffalse Local variables: \fi
+\iffalse mode: docTeX \fi
+\iffalse End: \fi
+%\iffalse
+% \begin{macrocode}
+%</fcnumparser.sty>
+% \end{macrocode}
+%\fi
+%\iffalse
+% \begin{macrocode}
+%<*fcprefix.sty>
+% \end{macrocode}
+%\fi
+%\subsection{fcprefix.sty}
+% Pseudo-latin prefixes.
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{fcprefix}[2012/09/28]
+\RequirePackage{ifthen}
+\RequirePackage{keyval}
+\RequirePackage{fcnumparser}
+% \end{macrocode}
+% Option `\texttt{use duode and unde}' is to select whether \(18\) and suchlikes (\(\meta{x}8\),
+% \(\meta{x}9\)) writes like duodevicies, or like octodecies. For French it should be `\texttt{below
+% 20}'. Possible values are `\texttt{below 20}' and `\texttt{never}'.
+% \begin{macrocode}
+\define@key{fcprefix}{use duode and unde}[below20]{%
+ \ifthenelse{\equal{#1}{below20}}{%
+ \def\fc@duodeandunde{2}%
+ }{%
+ \ifthenelse{\equal{#1}{never}}{%
+ \def\fc@duodeandunde{0}%
+ }{%
+ \PackageError{fcprefix}{Unexpected option}{%
+ Option `use duode and unde' expects `below 20' or `never' }%
+ }%
+ }%
+}
+% \end{macrocode}
+% Default is `\texttt{below 20}' like in French.
+% \begin{macrocode}
+\def\fc@duodeandunde{2}
+% \end{macrocode}
+% Option `\texttt{numeral u in duo}', this can be `\texttt{true}' or `\texttt{false}' and is used to select
+% whether 12 and suchlikes write like dodec\meta{xxx} or duodec\meta{xxx} for numerals.
+% \begin{macrocode}
+\define@key{fcprefix}{numeral u in duo}[false]{%
+ \ifthenelse{\equal{#1}{false}}{%
+ \let\fc@u@in@duo\@empty
+ }{%
+ \ifthenelse{\equal{#1}{true}}{%
+ \def\fc@u@in@duo{u}%
+ }{%
+ \PackageError{fcprefix}{Unexpected option}{%
+ Option `numeral u in duo' expects `true' or `false' }%
+ }%
+ }%
+}
+% \end{macrocode}
+% Option `\texttt{e accute}', this can be `\texttt{true}' or `\texttt{false}' and is used to select whether
+% letter `\texttt{e}' has an accute accent when it pronounce [e] in French.
+% \begin{macrocode}
+\define@key{fcprefix}{e accute}[false]{%
+ \ifthenelse{\equal{#1}{false}}{%
+ \let\fc@prefix@eaccute\@firstofone
+ }{%
+ \ifthenelse{\equal{#1}{true}}{%
+ \let\fc@prefix@eaccute\'%
+ }{%
+ \PackageError{fcprefix}{Unexpected option}{%
+ Option `e accute' expects `true' or `false' }%
+ }%
+ }%
+}
+% \end{macrocode}
+% Default is to set accute accent like in French.
+% \begin{macrocode}
+\let\fc@prefix@eaccute\'%
+% \end{macrocode}
+% Option `\texttt{power of millia}' tells how millia is raise to power n. It expects value:\newline\noindent
+% \begin{tabularx}{\linewidth}{@{}>{\raggedleft\arraybackslash\ttfamily}rX@{}}
+% recursive&for which millia squared is noted as `milliamillia'\\
+% arabic&for which millia squared is noted as `millia\^{}2'\\
+% prefix&for which millia squared is noted as `bismillia'
+% \end{tabularx}
+% \begin{macrocode}
+\define@key{fcprefix}{power of millia}[prefix]{%
+ \ifthenelse{\equal{#1}{prefix}}{%
+ \let\fc@power@of@millia@init\@gobbletwo
+ \let\fc@power@of@millia\fc@@prefix@millia
+ }{%
+ \ifthenelse{\equal{#1}{arabic}}{%
+ \let\fc@power@of@millia@init\@gobbletwo
+ \let\fc@power@of@millia\fc@@arabic@millia
+ }{%
+ \ifthenelse{\equal{#1}{recursive}}{%
+ \let\fc@power@of@millia@init\fc@@recurse@millia@init
+ \let\fc@power@of@millia\fc@@recurse@millia
+ }{%
+ \PackageError{fcprefix}{Unexpected option}{%
+ Option `power of millia' expects `recursive', `arabic', or `prefix' }%
+ }%
+ }%
+ }%
+}
+% \end{macrocode}
+% Arguments as follows:\def\interface{\newline\noindent
+% \begin{tabularx}{\linewidth}{@{}>{\raggedleft\arraybackslash\ttfamily}rX@{}}
+% \#1& output macro\\
+% \#2& number with current weight \(w\)
+% \end{tabularx}}\interface
+% \begin{macrocode}
+\def\fc@@recurse@millia#1#2{%
+ \let\@tempp#1%
+ \edef#1{millia\@tempp}%
+}
+% \end{macrocode}
+% Arguments as follows --- same interface as \cs{fc@@recurse@millia}: \interface
+% \begin{macrocode}
+\def\fc@@recurse@millia@init#1#2{%
+ {%
+% \end{macrocode}
+% Save input argument current weight \(w\) into local macro \cs{@tempb}.
+% \begin{macrocode}
+ \edef\@tempb{\number#2}%
+% \end{macrocode}
+% Now main loop from 0 to \(w\). Final value of \cs{@tempa} will be the result.
+% \begin{macrocode}
+ \count0=0 %
+ \let\@tempa\@empty
+ \loop
+ \ifnum\count0<\@tempb
+ \advance\count0 by 1 %
+ \expandafter\def
+ \expandafter\@tempa\expandafter{\@tempa millia}%
+ \repeat
+% \end{macrocode}
+% Now propagate the expansion of \cs{@tempa} into \texttt{\#1} after closing bace.
+% \begin{macrocode}
+ \edef\@tempb{\def\noexpand#1{\@tempa}}%
+ \expandafter
+ }\@tempb
+}
+% \end{macrocode}
+% Arguments as follows --- same interface as \cs{fc@@recurse@millia}: \interface
+% \begin{macrocode}
+\def\fc@@arabic@millia#1#2{%
+ \ifnnum#2=0 %
+ \let#1\@empty
+ \else
+ \edef#1{millia\^{}\the#2}%
+ \fi
+}
+% \end{macrocode}
+% Arguments as follows --- same interface as \cs{fc@@recurse@millia}: \interface
+% \begin{macrocode}
+\def\fc@@prefix@millia#1#2{%
+ \fc@@latin@numeral@pefix{#2}{#1}%
+}
+% \end{macrocode}
+% Default value of option `\texttt{power of millia}' is `\texttt{prefix}':
+% \begin{macrocode}
+\let\fc@power@of@millia@init\@gobbletwo
+\let\fc@power@of@millia\fc@@prefix@millia
+% \end{macrocode}
+% \DescribeMacro{\fc@@latin@cardinal@pefix} Compute a cardinal prefix for n-illion, like \(1 \Rightarrow
+% \textrm{`m'}\), \(2 \Rightarrow \textrm{`bi'}\), \(3 \Rightarrow \textrm{`tri'}\). The algorithm to derive
+% this prefix is that of Russ Rowlett I founds its documentation on Alain Lassine's site:
+% \url{http://www.alain.be/Boece/grands\_nombres.html}. First check that macro is not yet defined.
+% \begin{macrocode}
+\ifcsundef{fc@@latin@cardinal@pefix}{}{%
+ \PackageError{fmtcount}{Duplicate definition}{Redefinition of macro `fc@@latin@cardinal@pefix'}}
+% \end{macrocode}
+% Arguments as follows:\newline\noindent
+% \begin{tabularx}{\linewidth}{@{}>{\raggedleft\arraybackslash\ttfamily}rX@{}}
+% \#1&input number to be formated\\
+% \#2&outut macro name into which to place the formatted result
+% \end{tabularx}
+% \begin{macrocode}
+\def\fc@@latin@cardinal@pefix#1#2{%
+ {%
+% \end{macrocode}
+% First we put input argument into local macro @cs{@tempa} with full expansion.
+% \begin{macrocode}
+ \edef\@tempa{\number#1}%
+% \end{macrocode}
+% Now parse number from expanded input.
+% \begin{macrocode}
+ \expandafter\fc@number@parser\expandafter{\@tempa}%
+ \count2=0 %
+% \end{macrocode}
+% \cs{@tempt} will hold the optional final \texttt{t}, \cs{@tempu} is used to initialize \cs{@tempt} to `t'
+% when the firt non-zero 3digit group is met, which is the job made by \cs{@tempi}.
+% \begin{macrocode}
+ \let\@tempt\@empty
+ \def\@tempu{t}%
+% \end{macrocode}
+% \cs{@tempm} will hold the \texttt{millia\^}\(^{n\div 3}\)
+% \begin{macrocode}
+ \let\@tempm\@empty
+% \end{macrocode}
+% Loop by means of terminal recursion of herinafter defined macro \cs{@templ}. We loop by group of 3 digits.
+% \begin{macrocode}
+ \def\@templ{%
+ \ifnum\count2>\fc@max@weight
+ \let\next\relax
+ \else
+% \end{macrocode}
+% Loop body. Here we read a group of 3 consecutive digits \(d_2d_1d_0\) and place them respectively into
+% \cs{count3}, \cs{count4}, and \cs{count5}.
+% \begin{macrocode}
+ \fc@read@unit{\count3}{\count2}%
+ \advance\count2 by 1 %
+ \fc@read@unit{\count4}{\count2}%
+ \advance\count2 by 1 %
+ \fc@read@unit{\count5}{\count2}%
+ \advance\count2 by 1 %
+% \end{macrocode}
+% If the 3 considered digits \(d_2d_1d_0\) are not all zero, then set \cs{@tempt} to `\texttt{t}' for the
+% first time this event is met.
+% \begin{macrocode}
+ \edef\@tempn{%
+ \ifnum\count3=0\else 1\fi
+ \ifnum\count4=0\else 1\fi
+ \ifnum\count5=0\else 1\fi
+ }%
+ \ifx\@tempn\@empty\else
+ \let\@tempt\@tempu
+ \let\@tempu\@empty
+ \fi
+% \end{macrocode}
+% Now process the current group \(d_2d_1d_0\) of 3 digits.
+% \begin{macrocode}
+ \let\@tempp\@tempa
+ \edef\@tempa{%
+% \end{macrocode}
+% Here we process \(d_{2}\) held by \cs{count5}, that is to say hundreds.
+% \begin{macrocode}
+ \ifcase\count5 %
+ \or cen%
+ \or ducen%
+ \or trecen%
+ \or quadringen%
+ \or quingen%
+ \or sescen%
+ \or septigen%
+ \or octingen%
+ \or nongen%
+ \fi
+% \end{macrocode}
+% Here we process \(d_1d_0\) held by \cs{count4} \& \cs{count3}, that is to say tens and units.
+% \begin{macrocode}
+ \ifnum\count4=0 %
+ % x0(0..9)
+ \ifnum\count2=3 %
+ % Absolute weight zero
+ \ifcase\count3 \@tempt
+ \or m%
+ \or b%
+ \or tr%
+ \or quadr%
+ \or quin\@tempt
+ \or sex\@tempt
+ \or sep\@tempt
+ \or oc\@tempt
+ \or non%
+ \fi
+ \else
+% \end{macrocode}
+% Here the weight of \cs{count3} is \(3\times n\), with \(n>0\), i.e. this is followed by a
+% \texttt{millia\^}\(n\).
+% \begin{macrocode}
+ \ifcase\count3 %
+ \or \ifnum\count2>\fc@max@weight\else un\fi
+ \or d\fc@u@in@duo o%
+ \or tre%
+ \or quattuor%
+ \or quin%
+ \or sex%
+ \or septen%
+ \or octo%
+ \or novem%
+ \fi
+ \fi
+ \else
+ % x(10..99)
+ \ifcase\count3 %
+ \or un%
+ \or d\fc@u@in@duo o%
+ \or tre%
+ \or quattuor%
+ \or quin%
+ \or sex%
+ \or septen%
+ \or octo%
+ \or novem%
+ \fi
+ \ifcase\count4 %
+ \or dec%
+ \or vigin\@tempt
+ \or trigin\@tempt
+ \or quadragin\@tempt
+ \or quinquagin\@tempt
+ \or sexagin\@tempt
+ \or septuagin\@tempt
+ \or octogin\@tempt
+ \or nonagin\@tempt
+ \fi
+ \fi
+% \end{macrocode}
+% Insert the \texttt{millia\^}\(^{(n\div 3)}\) only if \(d_2d_1d_0\not=0\), i.e. if one of \cs{count3}
+% \cs{count4} or \cs{count5} is non zero.
+% \begin{macrocode}
+ \@tempm
+% \end{macrocode}
+% And append previous version of \cs{@tempa}.
+% \begin{macrocode}
+ \@tempp
+ }%
+% \end{macrocode}
+% ``Concatenate'' \texttt{millia} to \cs{@tempm}, so that \cs{@tempm} will expand to
+% \texttt{millia\^}\(^{(n\div 3)+1}\) at the next iteration. Actually whether this is a concatenation or some
+% \texttt{millia} prefixing depends of option `\texttt{power of millia}'.
+% \begin{macrocode}
+ \fc@power@of@millia\@tempm{\count2}%
+ \fi
+ \next
+ }%
+ \let\@tempa\@empty
+ \let\next\@templ
+ \@templ
+% \end{macrocode}
+% Propagate expansion of \cs{@tempa} into \texttt{\#2} after closing bracket.
+% \begin{macrocode}
+ \def\@tempb##1{\def\@tempa{\def#2{##1}}}%
+ \expandafter\@tempb\expandafter{\@tempa}%
+ \expandafter
+ }\@tempa
+}
+% \end{macrocode}
+% \DescribeMacro{\fc@@latin@numeral@pefix} Compute a numeral prefix
+% like `s\'emel', `bis', `ter', `quater',
+% etc\ldots I found the algorithm to derive this prefix on Alain Lassine's site:
+% \url{http://www.alain.be/Boece/nombres\_gargantuesques.html}. First check that the macro is not yet defined.
+% \begin{macrocode}
+\ifcsundef{fc@@latin@numeral@pefix}{}{%
+ \PackageError{fmtcount}{Duplicate definition}{Redefinition of macro
+ `fc@@latin@numeral@pefix'}}
+% \end{macrocode}
+% Arguments as follows:\newline\noindent
+% \begin{tabularx}{\linewidth}{@{}>{\raggedleft\arraybackslash\ttfamily}rX@{}}
+% \#1& input number to be formatted,\\
+% \#2& outut macro name into which to place the result
+% \end{tabularx}
+% \begin{macrocode}
+\def\fc@@latin@numeral@pefix#1#2{%
+ {%
+ \edef\@tempa{\number#1}%
+ \def\fc@unit@weight{0}%
+ \expandafter\fc@number@parser\expandafter{\@tempa}%
+ \count2=0 %
+% \end{macrocode}
+% Macro \cs{@tempm} will hold the \texttt{millies\^}\(^{n\div 3}\).
+% \begin{macrocode}
+ \let\@tempm\@empty
+% \end{macrocode}
+% Loop over digits. This is done by defining macro \cs{@templ} for terminal recursion.
+% \begin{macrocode}
+ \def\@templ{%
+ \ifnum\count2>\fc@max@weight
+ \let\next\relax
+ \else
+% \end{macrocode}
+% Loop body. Three consecutive digits \(d_{2}d_{1}d_{0}\) are read into counters \cs{count3}, \cs{count4}, and
+% \cs{count5}.
+% \begin{macrocode}
+ \fc@read@unit{\count3}{\count2}%
+ \advance\count2 by 1 %
+ \fc@read@unit{\count4}{\count2}%
+ \advance\count2 by 1 %
+ \fc@read@unit{\count5}{\count2}%
+ \advance\count2 by 1 %
+% \end{macrocode}
+% Check the use of \texttt{duodevicies} instead of \texttt{octodecies}.
+% \begin{macrocode}
+ \let\@tempn\@secondoftwo
+ \ifnum\count3>7 %
+ \ifnum\count4<\fc@duodeandunde
+ \ifnum\count4>0 %
+ \let\@tempn\@firstoftwo
+ \fi
+ \fi
+ \fi
+ \@tempn
+ {% use duodevicies for eighteen
+ \advance\count4 by 1 %
+ \let\@temps\@secondoftwo
+ }{% do not use duodevicies for eighteen
+ \let\@temps\@firstoftwo
+ }%
+ \let\@tempp\@tempa
+ \edef\@tempa{%
+ % hundreds
+ \ifcase\count5 %
+ \expandafter\@gobble
+ \or c%
+ \or duc%
+ \or trec%
+ \or quadring%
+ \or quing%
+ \or sesc%
+ \or septing%
+ \or octing%
+ \or nong%
+ \fi
+ {enties}%
+ \ifnum\count4=0 %
+% \end{macrocode}
+% Here \(d_{2}d_{1}d_{0}\) is such that \(d_{1} = 0\).
+% \begin{macrocode}
+ \ifcase\count3 %
+ \or
+ \ifnum\count2=3 %
+ s\fc@prefix@eaccute emel%
+ \else
+ \ifnum\count2>\fc@max@weight\else un\fi
+ \fi
+ \or bis%
+ \or ter%
+ \or quater%
+ \or quinquies%
+ \or sexies%
+ \or septies%
+ \or octies%
+ \or novies%
+ \fi
+ \else
+% \end{macrocode}
+% Here \(d_{2}d_{1}d_{0}\) is such that \(d_{1} \geq 1\).
+% \begin{macrocode}
+ \ifcase\count3 %
+ \or un%
+ \or d\fc@u@in@duo o%
+ \or ter%
+ \or quater%
+ \or quin%
+ \or sex%
+ \or septen%
+ \or \@temps{octo}{duod\fc@prefix@eaccute e}% x8 = two before next (x+1)0
+ \or \@temps{novem}{und\fc@prefix@eaccute e}% x9 = one before next (x+1)0
+ \fi
+ \ifcase\count4 %
+ % can't get here
+ \or d\fc@prefix@eaccute ec%
+ \or vic%
+ \or tric%
+ \or quadrag%
+ \or quinquag%
+ \or sexag%
+ \or septuag%
+ \or octog%
+ \or nonag%
+ \fi
+ ies%
+ \fi
+ % Insert the millies^(n/3) only if one of \count3 \count4 \count5 is non zero
+ \@tempm
+ % add up previous version of \@tempa
+ \@tempp
+ }%
+% \end{macrocode}
+% Concatenate \texttt{millies} to \cs{@tempm} so that it is equal to \texttt{millies\^}\(^{n\div 3}\) at the
+% next iteration. Here we just have plain concatenation, contrary to cardinal for which a prefix can be used
+% instead.
+% \begin{macrocode}
+ \let\@tempp\@tempp
+ \edef\@tempm{millies\@tempp}%
+ \fi
+ \next
+ }%
+ \let\@tempa\@empty
+ \let\next\@templ
+ \@templ
+% \end{macrocode}
+% Now propagate expansion of \@tempa into \texttt{\#2} after closing bracket.
+% \begin{macrocode}
+ \def\@tempb##1{\def\@tempa{\def#2{##1}}}%
+ \expandafter\@tempb\expandafter{\@tempa}%
+ \expandafter
+ }\@tempa
+}
+% \end{macrocode}
+% Stuff for calling macros. Construct \cs{fc@call}\meta{some macro} can be used to pass two arguments to
+% \meta{some macro} with a configurable calling convention:
+% \begin{itemize}
+% \item the calling convention is such that there is one mandatory argument \meta{marg} and an optional
+% argument \meta{oarg}
+% \item either \cs{fc@call} is \cs{let} to be equal to \cs{fc@call@opt@arg@second}, and then calling
+% convention is that the \meta{marg} is first and \meta{oarg} is second,
+% \item or \cs{fc@call} is \cs{let} to be equal to \cs{fc@call@opt@arg@first}, and then calling convention is
+% that the \meta{oarg} is first and \meta{aarg} is second,
+% \item if \meta{oarg} is absent, then it is by convention set empty,
+% \item \meta{some macro} is supposed to have two mandatory arguments of which \meta{oarg} is passed to the
+% first, and \meta{marg} is passed to the second, and
+% \item \meta{some macro} is called within a group.
+% \end{itemize}
+% \begin{macrocode}
+\def\fc@call@opt@arg@second#1#2{%
+ \def\@tempb{%
+ \ifx[\@tempa
+ \def\@tempc[####1]{%
+ {#1{####1}{#2}}%
+ }%
+ \else
+ \def\@tempc{{#1{}{#2}}}%
+ \fi
+ \@tempc
+ }%
+ \futurelet\@tempa
+ \@tempb
+}
+% \end{macrocode}
+% \begin{macrocode}
+\def\fc@call@opt@arg@first#1{%
+ \def\@tempb{%
+ \ifx[\@tempa
+ \def\@tempc[####1]####2{{#1{####1}{####2}}}%
+ \else
+ \def\@tempc####1{{#1{}{####1}}}%
+ \fi
+ \@tempc
+ }%
+ \futurelet\@tempa
+ \@tempb
+}
+
+\let\fc@call\fc@call@opt@arg@first
+% \end{macrocode}
+% User API.
+%
+% \DescribeMacro{\@latinnumeralstringnum} Macro \cs{@latinnumeralstringnum}. Arguments as
+% follows:\newline\noindent
+% \begin{tabularx}{\linewidth}{@{}>{\raggedleft\arraybackslash\ttfamily}rX@{}}
+% \#1&local options\\
+% \#2& input number
+% \end{tabularx}
+% \begin{macrocode}
+\newcommand*{\@latinnumeralstringnum}[2]{%
+ \setkeys{fcprefix}{#1}%
+ \fc@@latin@numeral@pefix{#2}\@tempa
+ \@tempa
+}
+% \end{macrocode}
+% Arguments as follows:\newline\noindent
+% \begin{tabularx}{\linewidth}{@{}>{\raggedleft\arraybackslash\ttfamily}rX@{}}
+% \#1&local options\\
+% \#2&input counter
+% \end{tabularx}
+% \begin{macrocode}
+\newcommand*{\@latinnumeralstring}[2]{%
+ \setkeys{fcprefix}{#1}%
+ \expandafter\let\expandafter
+ \@tempa\expandafter\csname c@#2\endcsname
+ \expandafter\fc@@latin@numeral@pefix\expandafter{\the\@tempa}\@tempa
+ \@tempa
+}
+% \end{macrocode}
+% \begin{macrocode}
+\newcommand*{\latinnumeralstring}{%
+ \fc@call\@latinnumeralstring
+}
+% \end{macrocode}
+% \begin{macrocode}
+\newcommand*{\latinnumeralstringnum}{%
+ \fc@call\@latinnumeralstringnum
+}
+% \end{macrocode}
+\iffalse Local variables: \fi
+\iffalse mode: docTeX \fi
+\iffalse End: \fi
+%\iffalse
+% \begin{macrocode}
+%</fcprefix.sty>
+% \end{macrocode}
+%\fi
+%\iffalse
+% \begin{macrocode}
+%<*fmtcount.sty>
+% \end{macrocode}
+%\fi
+
+%\subsection{fmtcount.sty}
+% This section deals with the code for |fmtcount.sty|
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{fmtcount}[2017/12/24 v3.05]
+\RequirePackage{ifthen}
+% \end{macrocode}
+% \changes{3.01}{2014/12/03}{Use \styfmt{xkeyval} instead of \styfmt{keyval}, so that we do not get in trouble
+% with bracket spurious removals}
+% \begin{macrocode}
+\RequirePackage{xkeyval}
+\RequirePackage{etoolbox}
+\RequirePackage{fcprefix}
+% \end{macrocode}
+% \changes{3.00}{2014/07/3}{Add \cs{RequirePackage} for \texttt{ifxetex}}
+% \changes{3.05}{2017/12/24}{Stop using \cs{ifxetex} to trigger multilingual mode. Instead only packages are
+% tested for being loaded.}
+% \changes{1.3}{2007/7/19}{no longer using xspace package}
+%\changes{1.31}{2009/10/02}{amsgen now loaded (\cs{new@ifnextchar}
+% needed)}
+% Need to use \cs{new@ifnextchar} instead of \cs{@ifnextchar} in
+% commands that have a final optional argument (such as \cs{gls})
+% so require \sty{amsgen}.
+% \begin{macrocode}
+\RequirePackage{amsgen}
+% \end{macrocode}
+% These commands need to be defined before the
+% configuration file is loaded.
+%
+% Define the macro to format the |st|, |nd|, |rd| or |th| of an
+% ordinal.
+% \changes{3.01}{2014/12/3}{Make \cs{fmtord} language dependent.}
+% \changes{3.01}{2014/12/3}{Substitute \cs{textsuperscript} for \cs{fc@textsuperscript}, and define
+% \cs{fc@textsuperscript} as \cs{fup} when defined at beginning of document, or as \cs{textsuperscript}
+% otherwise}
+%\begin{macro}{\fc@orddef@ult}
+% \begin{macrocode}
+\providecommand*{\fc@orddef@ult}[1]{\fc@textsuperscript{#1}}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\fc@ord@multiling}
+% \begin{macrocode}
+\providecommand*{\fc@ord@multiling}[1]{%
+ \ifcsundef{fc@\languagename @alias@of}{%
+% \end{macrocode}
+% Not a supported language, just use the default setting:
+% \begin{macrocode}
+ \fc@orddef@ult{#1}}{%
+ \expandafter\let\expandafter\@tempa\csname fc@\languagename @alias@of\endcsname
+ \ifcsundef{fc@ord@\@tempa}{%
+% \end{macrocode}
+% Not language specfic setting, just use the default setting:
+% \begin{macrocode}
+ \fc@orddef@ult{#1}}{%
+% \end{macrocode}
+% Language with specific setting, use that setting:
+% \begin{macrocode}
+\csname fc@ord@\@tempa\endcsname{#1}}}}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\padzeroes}
+%\begin{definition}
+%\cs{padzeroes}\oarg{n}
+%\end{definition}
+% Specifies how many digits should be displayed for commands such as
+% \cs{decimal} and \cs{binary}.
+% \begin{macrocode}
+\newcount\c@padzeroesN
+\c@padzeroesN=1\relax
+\providecommand*{\padzeroes}[1][17]{\c@padzeroesN=#1}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\FCloadlang}
+%\changes{2.0}{2012/06/3}{new}
+%\changes{2.02}{2012/10/3}{ensured catcode for @ set to `letter'
+%before loading file}
+%\begin{definition}
+%\cs{FCloadlang}\marg{language}
+%\end{definition}
+% Load \styfmt{fmtcount} language file,
+% \texttt{fc-}\meta{language}\texttt{.def}, unless already loaded.
+% Unfortunately neither \styfmt{babel} nor \styfmt{polyglossia} keep a list of loaded
+% dialects, so we can't load all the necessary def files in the
+% preamble as we don't know which dialects the user requires.
+% Therefore the dialect definitions get loaded when a command such
+% as \cs{ordinalnum} is used, if they
+% haven't already been loaded.
+% \begin{macrocode}
+\newcount\fc@tmpcatcode
+\def\fc@languages{}%
+\def\fc@mainlang{}%
+\newcommand*{\FCloadlang}[1]{%
+ \@FC@iflangloaded{#1}{}%
+ {%
+ \fc@tmpcatcode=\catcode`\@\relax
+ \catcode `\@ 11\relax
+ \InputIfFileExists{fc-#1.def}%
+ {%
+ \ifdefempty{\fc@languages}%
+ {%
+ \gdef\fc@languages{#1}%
+ }%
+ {%
+ \gappto\fc@languages{,#1}%
+ }%
+ \gdef\fc@mainlang{#1}%
+ }%
+ {}%
+ \catcode `\@ \fc@tmpcatcode\relax
+ }%
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\@FC@iflangloaded}
+%\changes{2.0}{2012/06/3}{new}
+%\begin{definition}
+%\cs{@FC@iflangloaded}\marg{language}\marg{true}\marg{false}
+%\end{definition}
+%If fmtcount language definition file \texttt{fc-}\meta{language}\texttt{.def} has
+%been loaded, do \meta{true} otherwise do \meta{false}
+% \begin{macrocode}
+\newcommand{\@FC@iflangloaded}[3]{%
+ \ifcsundef{ver@fc-#1.def}{#3}{#2}%
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\ProvidesFCLanguage}
+%\changes{2.0}{2012/06/3}{new}
+% Declare fmtcount language definition file. Adapted from
+% \ics{ProvidesFile}.
+% \begin{macrocode}
+\newcommand*{\ProvidesFCLanguage}[1]{%
+ \ProvidesFile{fc-#1.def}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+% We need that flag to remember that a language has been loaded via package option, so that in the end we can
+% set \styfmt{fmtcount} in multiling
+% \begin{macrocode}
+\newif\iffmtcount@language@option
+\fmtcount@language@optionfalse
+% \end{macrocode}
+%\begin{macro}{\fc@supported@language@list}
+% Declare list of supported languages, as a comma separated list. No space, no empty items. Each item is a
+% language for which fmtcount is able to load language specific definitions. \texttt{Aliases but be
+% \textit{after} their meaning, for instance `american' being an alias of `USenglish', it has to appear
+% after it in the list}. The raison d'\^etre of this list is to commonalize iteration on languages for the
+% two following purposes:
+% \begin{itemize}
+% \item loading language definition as a result of the language being used by
+% \styfmt{babel}/\styfmt{polyglossia}
+% \item loading language definition as a result of package option
+% \end{itemize}
+% These two purposes cannot be handled in the same pass, we need two different passes otherwise there would
+% be some corner cases when a package would be required --- as a result of loading language definition for
+% one language --- between a \cs{DeclareOption} and a \cs{ProcessOption} which is forbidden by \LaTeXe.
+%\changes{3.00}{2014/07/3}{new}
+%\changes{3.05}{2017/12/26}{Add brazilian and portuguese.}
+% \begin{macrocode}
+\newcommand*\fc@supported@language@list{%
+english,%
+UKenglish,%
+brazilian,%
+british,%
+USenglish,%
+american,%
+spanish,%
+portuges,%
+portuguese,%
+french,%
+frenchb,%
+francais,%
+german,%
+germanb,%
+ngerman,%
+ngermanb,%
+italian}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\fc@iterate@on@languages}
+%\begin{definition}
+%\cs{fc@iterate@on@languages}\marg{body}
+%\end{definition}
+% Now make some language iterator, note that for the following to work properly
+% \cs{fc@supported@language@list} must not be empty. \meta{body} is a macro that takes one argument, and
+% \cs{fc@iterate@on@languages} applies it iteratively :
+%\changes{3.00}{2014/07/03}{new}
+% \begin{macrocode}
+\newcommand*\fc@iterate@on@languages[1]{%
+ \ifx\fc@supported@language@list\@empty
+% \end{macrocode}
+% That case should never happen !
+% \begin{macrocode}
+ \PackageError{fmtcount}{Macro `\protect\@fc@iterate@on@languages' is empty}{You should never get here:
+ Something is broken within \texttt{fmtcount}, please report the issue on
+ \texttt{https://github.com/search?q=fmtcount\&ref=cmdform\&type=Issues}}%
+ \else
+ \let\fc@iterate@on@languages@body#1
+ \expandafter\@fc@iterate@on@languages\fc@supported@language@list,\@nil,%
+ \fi
+}
+\def\@fc@iterate@on@languages#1,{%
+ {%
+ \def\@tempa{#1}%
+ \ifx\@tempa\@nnil
+ \let\@tempa\@empty
+ \else
+ \def\@tempa{%
+ \fc@iterate@on@languages@body{#1}%
+ \@fc@iterate@on@languages
+ }%
+ \fi
+ \expandafter
+ }\@tempa
+}%
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\@fc@loadifbabelorpolyglossialdf}
+%\begin{definition}
+%\cs{@fc@loadifbabelorpolyglossialdf}\marg{language}
+%\end{definition}
+%Loads fmtcount language file,
+%\texttt{fc-}\meta{language}\texttt{.def},
+% if one of the following condition is met:
+% \begin{itemize}
+% \item \styfmt{babel} language definition file \meta{language}\texttt{.ldf} has been loaded --- conditionally
+% to compilation with \texttt{latex}, not \texttt{xelatex}.
+% \item \styfmt{polyglossia} language definition file \texttt{gloss-}\meta{language}\texttt{.ldf} has been
+% loaded --- conditionally to compilation with \texttt{xelatex}, not \texttt{latex}.
+% \item \meta{language} option has been passed to package \styfmt{fmtcount}.
+% \end{itemize}
+%
+%\changes{2.03}{2012/11/03}{renamed \cs{@fc@loadifbabelldf} to
+% \cs{@fc@loadifbabelorpolyglossialdf}}
+%\changes{2.03}{2012/11/03}{added check for polyglossia language.}
+%\changes{3.00}{2014/07/03}{use \cs{ifxetex} to discriminate between \styfmt{babel} and \styfmt{polyglossia}.}
+%\changes{3.05}{2017/12/24}{Stop using \cs{ifxetex} to discriminate between \styfmt{babel} and
+% \styfmt{polyglossia}, instead just test which package is loaded.}
+% \begin{macrocode}
+\newcommand*\@fc@loadifbabelldf[1]{\ifcsundef{ver@#1.ldf}{}{\FCloadlang{#1}}}
+\newcommand*{\@fc@loadifbabelorpolyglossialdf}[1]{}
+\@ifpackageloaded{polyglossia}{%
+ \def\@fc@loadifbabelorpolyglossialdf#1{\IfFileExists{gloss-#1.ldf}{\ifcsundef{#1@loaded}{}{\FCloadlang{#1}}}{}%
+ \@fc@loadifbabelldf{#1}%
+ }%
+}{\@ifpackageloaded{babel}{%
+ \let\@fc@loadifbabelorpolyglossialdf\@fc@loadifbabelldf
+}{}}
+% \end{macrocode}
+%\end{macro}
+%
+% Load appropriate language definition files:
+%\changes{1.1}{2007/06/14}{added check for UKenglish,
+% british and USenglish babel settings}
+%\changes{2.0}{2012/06/03}{changed check for \cs{l@}\meta{language}
+% to check for \cs{date}\meta{language}}
+%\changes{3.00}{2014/07/03}{use iterator rather than doing it flat on each language}
+%\changes{3.01}{2014/12/03}{Define language aliases to \cs{fmtord}
+% option dependent on ``true'' language .}
+% \begin{macrocode}
+\fc@iterate@on@languages\@fc@loadifbabelorpolyglossialdf
+% \end{macrocode}
+% By default all languages are unique --- i.e. aliases not yet defined.
+% \begin{macrocode}
+\def\fc@iterate@on@languages@body#1{%
+ \expandafter\def\csname fc@#1@alias@of\endcsname{#1}}
+\expandafter\@fc@iterate@on@languages\fc@supported@language@list,\@nil,%
+% \end{macrocode}
+% Now define those languages that are aliases of another
+% language. This is done with: \cs{@tempa}\marg{alias}\marg{language}
+% \begin{macrocode}
+\def\@tempa#1#2{%
+ \expandafter\def\csname fc@#1@alias@of\endcsname{#2}%
+}%
+\@tempa{frenchb}{french}
+\@tempa{francais}{french}
+\@tempa{germanb}{german}
+\@tempa{ngermanb}{german}
+\@tempa{ngerman}{german}
+\@tempa{british}{english}
+\@tempa{american}{USenglish}
+% \end{macrocode}
+% Now, thanks to the aliases, we are going to define one option for each language, so that each language can
+% have its own settings.
+% \begin{macrocode}
+\def\fc@iterate@on@languages@body#1{%
+ \define@key{fmtcount}{#1}[]{%
+ \@FC@iflangloaded{#1}%
+ {%
+ \setkeys{fc\csname fc@#1@alias@of\endcsname}{##1}%
+ }{%
+ \PackageError{fmtcount}%
+ {Language `#1' not defined}%
+ {You need to load \ifxetex polyglossia\else babel\fi\space before loading fmtcount}%
+ }%
+ }%
+ \ifthenelse{\equal{\csname fc@#1@alias@of\endcsname}{#1}}{%
+ \define@key{fc\csname fc@#1@alias@of\endcsname}{fmtord}{%
+ \ifthenelse{\equal{##1}{raise}\or\equal{##1}{level}}{%
+ \expandafter\let\expandafter\@tempa\csname fc@set@ord@as@##1\endcsname
+ \expandafter\@tempa\csname fc@ord@#1\endcsname
+ }{%
+ \ifthenelse{\equal{##1}{undefine}}{%
+ \expandafter\let\csname fc@ord@#1\endcsname\undefined
+ }{%
+ \PackageError{fmtcount}%
+ {Invalid value `##1' to fmtord key}%
+ {Option `fmtord' can only take the values `level', `raise'
+ or `undefine'}%
+ }}
+ }%
+ }{%
+% \end{macrocode}
+% When the language \texttt{\#1} is an alias, do the same as the language of which it is an alias:
+% \begin{macrocode}
+ \expandafter\let\expandafter\@tempa\csname KV@\csname fc@#1@alias@of\endcsname @fmtord\endcsname
+ \expandafter\let\csname KV@#1@fmtord\endcsname\@tempa
+ }%
+}
+\expandafter\@fc@iterate@on@languages\fc@supported@language@list,\@nil,%
+% \end{macrocode}
+%\begin{option}{fmtord}
+% Key to determine how to display the ordinal
+% \changes{3.01}{2014/12/03}{Apply option directly, rather than doing a border effect on \cs{fmtcount@fmtord},
+% and then postprocessing depending on \cs{fmtcount@fmtord} at the end of \cs{fmtcountsetoptions}}
+% \begin{macrocode}
+\def\fc@set@ord@as@level#1{%
+ \def#1##1{##1}%
+}
+\def\fc@set@ord@as@raise#1{%
+ \let#1\fc@textsuperscript
+}
+\define@key{fmtcount}{fmtord}{%
+ \ifthenelse{\equal{#1}{level}
+ \or\equal{#1}{raise}}%
+ {%
+ \csname fc@set@ord@as@#1\endcsname\fc@orddef@ult
+ \def\fmtcount@fmtord{#1}%
+ }%
+ {%
+ \PackageError{fmtcount}%
+ {Invalid value `#1' to fmtord key}%
+ {Option `fmtord' can only take the values `level' or `raise'}%
+ }%
+}
+% \end{macrocode}
+%\end{option}
+%\begin{macro}{\iffmtord@abbrv}
+% Key to determine whether the ordinal superscript should be
+% abbreviated (language dependent, currently only affects French
+% ordinals, non-abbreviated French ordinals ending --- i.e. `ier' and
+% `i\`eme' --- are considered faulty.)
+% \begin{macrocode}
+\newif\iffmtord@abbrv
+% \end{macrocode}
+% \changes{3.01}{2014/11/03}{Make `true' the default for option
+% `abbr', as in French this is the correct behaviour, and currently
+% only French uses that}
+% \begin{macrocode}
+\fmtord@abbrvtrue
+\define@key{fmtcount}{abbrv}[true]{%
+ \ifthenelse{\equal{#1}{true}\or\equal{#1}{false}}%
+ {%
+ \csname fmtord@abbrv#1\endcsname
+ }%
+ {%
+ \PackageError{fmtcount}%
+ {Invalid value `#1' to fmtord key}%
+ {Option `abbrv' can only take the values `true' or
+ `false'}%
+ }%
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{option}{prefix}
+%\changes{2.0}{2012/06/03}{new}
+% \begin{macrocode}
+\define@key{fmtcount}{prefix}[scale=long]{%
+ \RequirePackage{fmtprefix}%
+ \fmtprefixsetoption{#1}%
+}
+% \end{macrocode}
+%\end{option}
+%\begin{macro}{\fmtcountsetoptions}
+% Define command to set options.
+% \changes{3.01}{2014/12/03}{Move French specific stuff to \styfmt{french.def}.}
+% \begin{macrocode}
+\def\fmtcountsetoptions{%
+ \def\fmtcount@fmtord{}%
+ \setkeys{fmtcount}}%
+% \end{macrocode}
+%\end{macro}
+% Load configuration file if it exists. This needs to be done
+% before the package options, to allow the user to override
+% the settings in the configuration file.
+%\changes{2.0}{2012/06/03}{Now no message if fmtcount.cfg not found}
+% \begin{macrocode}
+\InputIfFileExists{fmtcount.cfg}%
+{%
+ \PackageInfo{fmtcount}{Using configuration file fmtcount.cfg}%
+}%
+{%
+}
+% \end{macrocode}
+%\begin{macro}{\fmtcount@loaded@by@option@lang@list}
+% \changes{3.01}{2014/10/03}{Declare language option so that actual loading happens after \cs{ProcessOptions},
+% and the \cs{ProcessOption} only registers the language for loading.}
+% \begin{macrocode}
+\newcommand*{\fmtcount@loaded@by@option@lang@list}{}
+% \end{macrocode}
+%\end{macro}
+%\begin{option}{\meta{language}}
+%Option \meta{language} causes language \meta{language} to be registered for loading.
+% \begin{macrocode}
+\newcommand*\@fc@declare@language@option[1]{%
+ \DeclareOption{#1}{%
+ \ifx\fmtcount@loaded@by@option@lang@list\@empty
+ \def\fmtcount@loaded@by@option@lang@list{#1}%
+ \else
+ \edef\fmtcount@loaded@by@option@lang@list{\fmtcount@loaded@by@option@lang@list,#1}%
+ \fi
+ }}%
+\fc@iterate@on@languages\@fc@declare@language@option
+% \end{macrocode}
+%\end{option}
+%
+%\begin{option}{level}
+% \begin{macrocode}
+\DeclareOption{level}{\def\fmtcount@fmtord{level}%
+ \def\fc@orddef@ult#1{#1}}
+% \end{macrocode}
+%\end{option}
+%\begin{option}{raise}
+% \begin{macrocode}
+\DeclareOption{raise}{\def\fmtcount@fmtord{raise}%
+ \def\fc@orddef@ult#1{\fc@textsuperscript{#1}}}
+% \end{macrocode}
+%\end{option}
+% Process package options
+% \changes{3.00}{2014/07/03}{Add \cs{relax} after \cs{ProcessOptions} like shown in \texttt{clsguide.pdf}}
+% \begin{macrocode}
+\ProcessOptions\relax
+% \end{macrocode}
+% \changes{3.01}{2014/10/03}{Load languages that have been registered for loading by package option.}
+% Now we do the loading of all languages that have been set by option to be loaded.
+% \begin{macrocode}
+\ifx\fmtcount@loaded@by@option@lang@list\@empty\else
+\def\fc@iterate@on@languages@body#1{%
+ \@FC@iflangloaded{#1}{}{%
+ \fmtcount@language@optiontrue
+ \FCloadlang{#1}%
+ }}
+\expandafter\@fc@iterate@on@languages\fmtcount@loaded@by@option@lang@list,\@nil,%
+\fi
+% \end{macrocode}
+%\begin{macro}{\@FCmodulo}
+%\begin{definition}
+%\cs{@FCmodulo}\marg{count reg}\marg{n}
+%\end{definition}
+%\changes{2.04}{2014/06/03}{renamed \cs{@modulo} to \cs{@FCmodulo}}
+% Sets the count register to be its value modulo \meta{n}.
+% This is used for the
+% date, time, ordinal and numberstring commands. (The
+% \styfmt{fmtcount} package was originally part of the
+% \sty{datetime} package.)
+% \begin{macrocode}
+\newcount\@DT@modctr
+\newcommand*{\@FCmodulo}[2]{%
+ \@DT@modctr=#1\relax
+ \divide \@DT@modctr by #2\relax
+ \multiply \@DT@modctr by #2\relax
+ \advance #1 by -\@DT@modctr
+}
+% \end{macrocode}
+%\end{macro}
+% The following registers are needed by |\@ordinal| etc
+% \begin{macrocode}
+\newcount\@ordinalctr
+\newcount\@orgargctr
+\newcount\@strctr
+\newcount\@tmpstrctr
+% \end{macrocode}
+%Define commands that display numbers in different bases.
+% Define counters and conditionals needed.
+% \begin{macrocode}
+\newif\if@DT@padzeroes
+\newcount\@DT@loopN
+\newcount\@DT@X
+% \end{macrocode}
+%\begin{macro}{\binarynum}
+% Converts a decimal number to binary, and display.
+%\changes{3.02}{2016/01/08}{Made robust using \texttt{etoolbox} \cs{newrobustcmd}}
+% \begin{macrocode}
+\newrobustcmd*{\@binary}[1]{%
+ \@DT@padzeroestrue
+ \@DT@loopN=17\relax
+ \@strctr=\@DT@loopN
+ \whiledo{\@strctr<\c@padzeroesN}{0\advance\@strctr by \@ne}%
+ \@strctr=65536\relax
+ \@DT@X=#1\relax
+ \loop
+ \@DT@modctr=\@DT@X
+ \divide\@DT@modctr by \@strctr
+ \ifthenelse{\boolean{@DT@padzeroes}
+ \and \(\@DT@modctr=0\)
+ \and \(\@DT@loopN>\c@padzeroesN\)}%
+ {}%
+ {\the\@DT@modctr}%
+ \ifnum\@DT@modctr=0\else\@DT@padzeroesfalse\fi
+ \multiply\@DT@modctr by \@strctr
+ \advance\@DT@X by -\@DT@modctr
+ \divide\@strctr by \tw@
+ \advance\@DT@loopN by \m@ne
+ \ifnum\@strctr>\@ne
+ \repeat
+ \the\@DT@X
+}
+
+\let\binarynum=\@binary
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\octalnum}
+% Converts a decimal number to octal, and displays.
+%\changes{3.02}{2016/01/08}{Made robust using \texttt{etoolbox} \cs{newrobustcmd}}
+% \begin{macrocode}
+\newrobustcmd*{\@octal}[1]{%
+ \@DT@X=#1\relax
+ \ifnum\@DT@X>32768
+ \PackageError{fmtcount}%
+ {Value of counter too large for \protect\@octal}
+ {Maximum value 32768}
+ \else
+ \@DT@padzeroestrue
+ \@DT@loopN=6\relax
+ \@strctr=\@DT@loopN
+ \whiledo{\@strctr<\c@padzeroesN}{0\advance\@strctr by \@ne}%
+ \@strctr=32768\relax
+ \loop
+ \@DT@modctr=\@DT@X
+ \divide\@DT@modctr by \@strctr
+ \ifthenelse{\boolean{@DT@padzeroes}
+ \and \(\@DT@modctr=0\)
+ \and \(\@DT@loopN>\c@padzeroesN\)}%
+ {}{\the\@DT@modctr}%
+ \ifnum\@DT@modctr=0\else\@DT@padzeroesfalse\fi
+ \multiply\@DT@modctr by \@strctr
+ \advance\@DT@X by -\@DT@modctr
+ \divide\@strctr by \@viiipt
+ \advance\@DT@loopN by \m@ne
+ \ifnum\@strctr>\@ne
+ \repeat
+ \the\@DT@X
+ \fi
+}
+\let\octalnum=\@octal
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\@@hexadecimalnum}
+% Converts number from 0 to 15 into lowercase hexadecimal notation.
+% \begin{macrocode}
+\newcommand*{\@@hexadecimal}[1]{%
+ \ifcase#10\or1\or2\or3\or4\or5\or
+ 6\or7\or8\or9\or a\or b\or c\or d\or e\or f\fi
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\hexadecimalnum}
+% Converts a decimal number to a lowercase hexadecimal number,
+% and displays it.
+%\changes{3.02}{2016/01/08}{Made robust using \texttt{etoolbox} \cs{newrobustcmd}}
+% \begin{macrocode}
+\newrobustcmd*{\@hexadecimal}[1]{%
+ \@DT@padzeroestrue
+ \@DT@loopN=\@vpt
+ \@strctr=\@DT@loopN
+ \whiledo{\@strctr<\c@padzeroesN}{0\advance\@strctr by \@ne}%
+ \@strctr=65536\relax
+ \@DT@X=#1\relax
+ \loop
+ \@DT@modctr=\@DT@X
+ \divide\@DT@modctr by \@strctr
+ \ifthenelse{\boolean{@DT@padzeroes}
+ \and \(\@DT@modctr=0\)
+ \and \(\@DT@loopN>\c@padzeroesN\)}
+ {}{\@@hexadecimal\@DT@modctr}%
+ \ifnum\@DT@modctr=0\else\@DT@padzeroesfalse\fi
+ \multiply\@DT@modctr by \@strctr
+ \advance\@DT@X by -\@DT@modctr
+ \divide\@strctr by 16\relax
+ \advance\@DT@loopN by \m@ne
+ \ifnum\@strctr>\@ne
+ \repeat
+ \@@hexadecimal\@DT@X
+}
+\let\hexadecimalnum=\@hexadecimal
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\@@Hexadecimalnum}
+% Converts number from 0 to 15 into uppercase hexadecimal notation.
+% \begin{macrocode}
+\newcommand*{\@@Hexadecimal}[1]{%
+ \ifcase#10\or1\or2\or3\or4\or5\or6\or
+ 7\or8\or9\or A\or B\or C\or D\or E\or F\fi
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\Hexadecimalnum}
+% Uppercase hexadecimal
+%\changes{3.02}{2016/01/08}{Made robust using \texttt{etoolbox} \cs{newrobustcmd}}
+% \begin{macrocode}
+\newrobustcmd*{\@Hexadecimal}[1]{%
+ \@DT@padzeroestrue
+ \@DT@loopN=5\relax
+ \@strctr=\@DT@loopN
+ \whiledo{\@strctr<\c@padzeroesN}{0\advance\@strctr by \@ne}%
+ \@strctr=65536\relax
+ \@DT@X=#1\relax
+ \loop
+ \@DT@modctr=\@DT@X
+ \divide\@DT@modctr by \@strctr
+ \ifthenelse{\boolean{@DT@padzeroes}
+ \and \(\@DT@modctr=0\)
+ \and \(\@DT@loopN>\c@padzeroesN\)}%
+ {}{\@@Hexadecimal\@DT@modctr}%
+ \ifnum\@DT@modctr=0\else\@DT@padzeroesfalse\fi
+ \multiply\@DT@modctr by \@strctr
+ \advance\@DT@X by -\@DT@modctr
+ \divide\@strctr by 16\relax
+ \advance\@DT@loopN by \m@ne
+ \ifnum\@strctr>\@ne
+ \repeat
+ \@@Hexadecimal\@DT@X
+}
+
+\let\Hexadecimalnum=\@Hexadecimal
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\aaalphnum}
+% Lowercase alphabetical representation (a \ldots\ z aa \ldots\ zz)
+% \changes{3.02}{2016/01/08}{Made robust using \texttt{etoolbox} \cs{newrobustcmd}}
+% \changes{3.04}{2017/09/16}{Code optimization, use of \cs{@ne} and \cs{m@ne}, and assign \texttt{\#1} only
+% once. Factorize code with \cs{@AAAlph}.}
+% \begin{macrocode}
+\newrobustcmd*{\@aaalph}{\fc@aaalph\@alph}
+\newcommand*\fc@aaalph[2]{%
+ \@DT@loopN=#2\relax
+ \@DT@X\@DT@loopN
+ \advance\@DT@loopN by \m@ne
+ \divide\@DT@loopN by 26\relax
+ \@DT@modctr=\@DT@loopN
+ \multiply\@DT@modctr by 26\relax
+ \advance\@DT@X by \m@ne
+ \advance\@DT@X by -\@DT@modctr
+ \advance\@DT@loopN by \@ne
+ \advance\@DT@X by \@ne
+ \edef\@tempa{#1\@DT@X}%
+ \loop
+ \@tempa
+ \advance\@DT@loopN by \m@ne
+ \ifnum\@DT@loopN>0
+ \repeat
+}
+
+\let\aaalphnum=\@aaalph
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\AAAlphnum}
+% Uppercase alphabetical representation (a \ldots\ z aa \ldots\ zz)
+% \changes{3.02}{2016/01/08}{Made robust using \texttt{etoolbox} \cs{newrobustcmd}}
+% \changes{3.04}{2017/09/16}{Code optimization, factorize code with \@aaalph.}
+% \begin{macrocode}
+\newrobustcmd*{\@AAAlph}{\fc@aaalph\@Alph}%
+
+\let\AAAlphnum=\@AAAlph
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\abalphnum}
+% Lowercase alphabetical representation
+%\changes{3.02}{2016/01/08}{Made robust using \texttt{etoolbox} \cs{newrobustcmd}}
+% \changes{3.04}{2017/09/16}{Code factorization with \cs{@ABAlph}. Code optimization, assign \texttt{\#1} only
+% once. Use \cs{@ne} and \cs{m@ne}.}
+% \begin{macrocode}
+\newrobustcmd*{\@abalph}{\fc@abalph\@alph}%
+\newcommand*\fc@abalph[2]{%
+ \@DT@X=#2\relax
+ \ifnum\@DT@X>17576\relax
+ \ifx#1\@alph\def\@tempa{\@abalph}%
+ \else\def\@tempa{\@ABAlph}\fi
+ \PackageError{fmtcount}%
+ {Value of counter too large for \expandafter\protect\@tempa}%
+ {Maximum value 17576}%
+ \else
+ \@DT@padzeroestrue
+ \@strctr=17576\relax
+ \advance\@DT@X by \m@ne
+ \loop
+ \@DT@modctr=\@DT@X
+ \divide\@DT@modctr by \@strctr
+ \ifthenelse{\boolean{@DT@padzeroes}
+ \and \(\@DT@modctr=1\)}%
+ {}{#1\@DT@modctr}%
+ \ifnum\@DT@modctr=\@ne\else\@DT@padzeroesfalse\fi
+ \multiply\@DT@modctr by \@strctr
+ \advance\@DT@X by -\@DT@modctr
+ \divide\@strctr by 26\relax
+ \ifnum\@strctr>\@ne
+ \repeat
+ \advance\@DT@X by \@ne
+ #1\@DT@X
+ \fi
+}
+
+\let\abalphnum=\@abalph
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\ABAlphnum}
+% Uppercase alphabetical representation
+%\changes{3.02}{2016/01/08}{Made robust using \texttt{etoolbox} \cs{newrobustcmd}}
+%\changes{3.04}{2017/09/16}{Code optimization, factorize code with \cs{@abalph}.}
+% \begin{macrocode}
+\newrobustcmd*{\@ABAlph}{\fc@abalph\@Alph}%
+\let\ABAlphnum=\@ABAlph
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\@fmtc@count}
+% Recursive command to count number of characters in argument.
+% \cs{@strctr} should be set to zero before calling it.
+% \begin{macrocode}
+\def\@fmtc@count#1#2\relax{%
+ \if\relax#1%
+ \else
+ \advance\@strctr by 1\relax
+ \@fmtc@count#2\relax
+ \fi
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\@decimal}
+%\changes{1.31}{2009/10/02}{fixed unwanted space.}
+% Format number as a decimal, possibly padded with zeroes in front.
+%\changes{3.02}{2016/01/08}{Made robust using \texttt{etoolbox} \cs{newrobustcmd}}
+% \begin{macrocode}
+\newrobustcmd*{\@decimal}[1]{%
+ \@strctr=0\relax
+ \expandafter\@fmtc@count\number#1\relax
+ \@DT@loopN=\c@padzeroesN
+ \advance\@DT@loopN by -\@strctr
+ \ifnum\@DT@loopN>0\relax
+ \@strctr=0\relax
+ \whiledo{\@strctr < \@DT@loopN}{0\advance\@strctr by 1\relax}%
+ \fi
+ \number#1\relax
+}
+
+\let\decimalnum=\@decimal
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\FCordinal}
+%\begin{definition}
+%\cs{FCordinal}\marg{number}
+%\end{definition}
+% This is a bit cumbersome. Previously \cs{@ordinal}
+% was defined in a similar way to \cs{abalph} etc.
+% This ensured that the actual value of the counter was
+% written in the new label stuff in the .aux file. However
+% adding in an optional argument to determine the gender
+% for multilingual compatibility messed things up somewhat.
+% This was the only work around I could get to keep the
+% the cross-referencing stuff working, which is why
+% the optional argument comes \emph{after} the compulsory
+% argument, instead of the usual manner of placing it before.
+% Note however, that putting the optional argument means that
+% any spaces will be ignored after the command if the optional
+% argument is omitted.
+% Version 1.04 changed \cs{ordinal} to \cs{FCordinal}
+% to prevent it clashing with the memoir class.
+% \changes{3.02}{2015/08/01}{Suppress useless \cs{expandafter}'s and and use \cs{value} instead tweaking with
+% \cs{csname}. Do not use any longer \cs{protect} as \cs{ordinalnum} is made robust.}
+% \begin{macrocode}
+\newcommand{\FCordinal}[1]{%
+ \ordinalnum{%
+ \the\value{#1}}%
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\ordinal}
+% If \cs{ordinal} isn't defined make \cs{ordinal} a synonym
+% for \cs{FCordinal} to maintain compatibility with previous
+% versions.
+% \changes{3.00}{2014/07/03}{Use \cs{protect}, not \cs{string} in \cs{PackageWarning} to quote macros like
+% shown in \texttt{clsguide.pdf}}
+% \begin{macrocode}
+\ifcsundef{ordinal}
+ {\let\ordinal\FCordinal}%
+ {%
+ \PackageWarning{fmtcount}%
+ {\protect\ordinal \space already defined use
+ \protect\FCordinal \space instead.}
+ }
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\ordinalnum}
+% Display ordinal where value is given as a number or
+% count register instead of a counter:
+%\changes{1.31}{2009/10/02}{replaced \cs{@ifnextchar} with
+%\cs{new@ifnextchar}}
+% \changes{3.02}{2015/08/03}{Make \cs{ordinalnum} robust.}
+% \changes{3.04}{2017/09/03}{Use \texttt{etoobox}'s \cs{newrobustcmd*} instead of \LaTeX\ kernel
+% \cs{DeclareRobustcommand*} in order to make \cs{ordinalnum} robust. This is preferable, e.g. w.r.t. \TeX 4ht
+% compilation.}
+% \begin{macrocode}
+\newrobustcmd*{\ordinalnum}[1]{%
+ \new@ifnextchar[%
+ {\@ordinalnum{#1}}%
+ {\@ordinalnum{#1}[m]}%
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\@ordinalnum}
+% Display ordinal according to gender (neuter added in v1.1,
+% \cs{xspace} added in v1.2, and removed in v1.3\footnote{I
+%couldn't get it to work consistently both with and without the
+%optional argument}):
+% \begin{macrocode}
+\def\@ordinalnum#1[#2]{%
+ {%
+ \ifthenelse{\equal{#2}{f}}%
+ {%
+ \protect\@ordinalF{#1}{\@fc@ordstr}%
+ }%
+ {%
+ \ifthenelse{\equal{#2}{n}}%
+ {%
+ \protect\@ordinalN{#1}{\@fc@ordstr}%
+ }%
+ {%
+ \ifthenelse{\equal{#2}{m}}%
+ {}%
+ {%
+ \PackageError{fmtcount}%
+ {Invalid gender option `#2'}%
+ {Available options are m, f or n}%
+ }%
+ \protect\@ordinalM{#1}{\@fc@ordstr}%
+ }%
+ }%
+ \@fc@ordstr
+ }%
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\storeordinal}
+% Store the ordinal (first argument
+% is identifying name, second argument is a counter.)
+% \changes{3.02}{2015/08/03}{Suppress useless \cs{expandafter}'s and and use \cs{value} instead tweaking with
+% \cs{csname}. Do not use any longer \cs{protect} as \cs{storeordinalnum} is made robust.}
+% \changes{3.02}{2016/01/08}{Expand \cs{the}\cs{value}\texttt{\{\#2\}} once before passing to \cs{storeordinalnum}}
+% \begin{macrocode}
+\newcommand*{\storeordinal}[2]{%
+ {%
+ \toks0{\storeordinalnum{#1}}%
+ \expandafter
+ }\the\toks0\expandafter{%
+ \the\value{#2}}%
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\storeordinalnum}
+% Store ordinal (first argument
+% is identifying name, second argument is a number or
+% count register.)
+% \changes{3.02}{2016/01/08}{Make \cs{storeordinalnum} robust with etoolbox \cs{newrobustcmd}.}
+% \begin{macrocode}
+\newrobustcmd*{\storeordinalnum}[2]{%
+ \@ifnextchar[%
+ {\@storeordinalnum{#1}{#2}}%
+ {\@storeordinalnum{#1}{#2}[m]}%
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\@storeordinalnum}
+% Store ordinal according to gender:
+% \begin{macrocode}
+\def\@storeordinalnum#1#2[#3]{%
+ \ifthenelse{\equal{#3}{f}}%
+ {%
+ \protect\@ordinalF{#2}{\@fc@ord}
+ }%
+ {%
+ \ifthenelse{\equal{#3}{n}}%
+ {%
+ \protect\@ordinalN{#2}{\@fc@ord}%
+ }%
+ {%
+ \ifthenelse{\equal{#3}{m}}%
+ {}%
+ {%
+ \PackageError{fmtcount}%
+ {Invalid gender option `#3'}%
+ {Available options are m or f}%
+ }%
+ \protect\@ordinalM{#2}{\@fc@ord}%
+ }%
+ }%
+ \expandafter\let\csname @fcs@#1\endcsname\@fc@ord
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\FMCuse}
+% Get stored information:
+% \begin{macrocode}
+\newcommand*{\FMCuse}[1]{\csname @fcs@#1\endcsname}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\ordinalstring}
+% Display ordinal as a string (argument is a counter)
+% \changes{3.02}{2016/01/08}{Suppress useless \cs{expandafter}'s and
+% and use \cs{value} instead tweaking with \cs{csname}. Do not use
+% any longer \cs{protect} as \cs{ordinalstringnum} is made
+% robust. Expand \cs{the}\cs{value}\texttt{\{\#1\}} once before
+% passing to \cs{ordinalstringnum}}%
+% \changes{3.03}{2017/09/14}{Suppress leading \cs{expandafter}'s, they are useless as \cs{ordinalstringnum} is
+% supposed to fully expand its argument, and place 3 \cs{expandafter}'s before \cs{the}\cs{value} for
+% compatibily with \texttt{glossaries}.}
+% \begin{macrocode}
+\newcommand*{\ordinalstring}[1]{%
+ \ordinalstringnum{\expandafter\expandafter\expandafter
+ \the\value{#1}}%
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\ordinalstringnum}
+% Display ordinal as a string (argument is a count register or
+% number.)
+%\changes{1.31}{2009/10/02}{replaced \cs{@ifnextchar} with
+%\cs{new@ifnextchar}}
+%\changes{1.33}{2009/10/15}{Made robust}
+%\changes{3.02}{2016/01/08}{Made robust using \texttt{etoolbox} \cs{newrobustcmd}}
+% \begin{macrocode}
+\newrobustcmd*{\ordinalstringnum}[1]{%
+ \new@ifnextchar[%
+ {\@ordinal@string{#1}}%
+ {\@ordinal@string{#1}[m]}%
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\@ordinal@string}
+% Display ordinal as a string according to gender.
+% \changes{3.00}{2014/07/03}{Use \cs{protect}, not \cs{string} in \cs{PackageError} to quote macros like
+% shown in \texttt{clsguide.pdf}}
+% \changes{3.00}{2014/07/03}{Correct detailed error message, so `n' is one of available gender options}
+% \begin{macrocode}
+\def\@ordinal@string#1[#2]{%
+ {%
+ \ifthenelse{\equal{#2}{f}}%
+ {%
+ \protect\@ordinalstringF{#1}{\@fc@ordstr}%
+ }%
+ {%
+ \ifthenelse{\equal{#2}{n}}%
+ {%
+ \protect\@ordinalstringN{#1}{\@fc@ordstr}%
+ }%
+ {%
+ \ifthenelse{\equal{#2}{m}}%
+ {}%
+ {%
+ \PackageError{fmtcount}%
+ {Invalid gender option `#2' to \protect\ordinalstring}%
+ {Available options are m, f or n}%
+ }%
+ \protect\@ordinalstringM{#1}{\@fc@ordstr}%
+ }%
+ }%
+ \@fc@ordstr
+ }%
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\storeordinalstring}
+% Store textual representation of number. First argument is
+% identifying name, second argument is the counter set to the
+% required number.
+% \changes{3.02}{2016/01/08}{Suppress useless \cs{expandafter}'s and
+% and use \cs{value} instead tweaking with \cs{csname}. Do not use any
+% longer \cs{protect} as \cs{storeordinalstringnum} is made
+% robust. Expand \cs{the}\cs{value}\texttt{\{\#2\}} once before
+% passing to \cs{storeordinalstringnum}}
+% \begin{macrocode}
+\newcommand*{\storeordinalstring}[2]{%
+ {%
+ \toks0{\storeordinalstringnum{#1}}%
+ \expandafter
+ }\the\toks0\expandafter{\the\value{#2}}%
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\storeordinalstringnum}
+% Store textual representation of number. First argument is
+% identifying name, second argument is a count register or number.
+%\changes{3.02}{2016/01/08}{Made robust using \texttt{etoolbox} \cs{newrobustcmd}}
+% \begin{macrocode}
+\newrobustcmd*{\storeordinalstringnum}[2]{%
+ \@ifnextchar[%
+ {\@store@ordinal@string{#1}{#2}}%
+ {\@store@ordinal@string{#1}{#2}[m]}%
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\@store@ordinal@string}
+% Store textual representation of number according to gender.
+% \changes{3.00}{2014/07/03}{Use \cs{protect}, not \cs{string} in \cs{PackageWarning} to quote macros like
+% shown in \texttt{clsguide.pdf}}
+% \begin{macrocode}
+\def\@store@ordinal@string#1#2[#3]{%
+ \ifthenelse{\equal{#3}{f}}%
+ {%
+ \protect\@ordinalstringF{#2}{\@fc@ordstr}%
+ }%
+ {%
+ \ifthenelse{\equal{#3}{n}}%
+ {%
+ \protect\@ordinalstringN{#2}{\@fc@ordstr}%
+ }%
+ {%
+ \ifthenelse{\equal{#3}{m}}%
+ {}%
+ {%
+ \PackageError{fmtcount}%
+ {Invalid gender option `#3' to \protect\ordinalstring}%
+ {Available options are m, f or n}%
+ }%
+ \protect\@ordinalstringM{#2}{\@fc@ordstr}%
+ }%
+ }%
+ \expandafter\let\csname @fcs@#1\endcsname\@fc@ordstr
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\Ordinalstring}
+% Display ordinal as a string with initial letters in upper case
+% (argument is a counter)
+% \changes{3.02}{2016/01/08}{Suppress useless \cs{expandafter}'s and
+% and use \cs{value} instead tweaking with \cs{csname}. Do not use any
+% longer \cs{protect} as \cs{Ordinalstringnum} is made
+% robust. Expand \cs{the}\cs{value}\texttt{\{\#1\}} once before
+% passing to \cs{Ordinalstringnum}}
+% \changes{3.03}{2017/09/14}{Suppress leading \cs{expandafter}'s, they are useless as \cs{Ordinalstringnum} is
+% supposed to fully expand its argument, and place 3 \cs{expandafter}'s before \cs{the}\cs{value} for
+% compatibily with \texttt{glossaries}.}
+% \begin{macrocode}
+\newcommand*{\Ordinalstring}[1]{%
+ \Ordinalstringnum{\expandafter\expandafter\expandafter\the\value{#1}}%
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\Ordinalstringnum}
+% Display ordinal as a string with initial letters in upper case
+% (argument is a number or count register)
+%\changes{1.31}{2009/10/02}{replaced \cs{@ifnextchar} with
+%\cs{new@ifnextchar}}
+%\changes{3.02}{2016/01/08}{Made robust using \texttt{etoolbox} \cs{newrobustcmd}}
+% \begin{macrocode}
+\newrobustcmd*{\Ordinalstringnum}[1]{%
+ \new@ifnextchar[%
+ {\@Ordinal@string{#1}}%
+ {\@Ordinal@string{#1}[m]}%
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\@Ordinal@string}
+% Display ordinal as a string with initial letters in upper case
+% according to gender
+% \begin{macrocode}
+\def\@Ordinal@string#1[#2]{%
+ {%
+ \ifthenelse{\equal{#2}{f}}%
+ {%
+ \protect\@OrdinalstringF{#1}{\@fc@ordstr}%
+ }%
+ {%
+ \ifthenelse{\equal{#2}{n}}%
+ {%
+ \protect\@OrdinalstringN{#1}{\@fc@ordstr}%
+ }%
+ {%
+ \ifthenelse{\equal{#2}{m}}%
+ {}%
+ {%
+ \PackageError{fmtcount}%
+ {Invalid gender option `#2'}%
+ {Available options are m, f or n}%
+ }%
+ \protect\@OrdinalstringM{#1}{\@fc@ordstr}%
+ }%
+ }%
+ \@fc@ordstr
+ }%
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\storeOrdinalstring}
+% Store textual representation of number, with initial letters in
+% upper case. First argument is identifying name, second argument
+% is the counter set to the
+% required number.
+% \changes{3.02}{2016/01/08}{Suppress useless \cs{expandafter}'s and
+% and use \cs{value} instead tweaking with \cs{csname}. Do not use any
+% longer \cs{protect} as \cs{storeOrdinalstringnum} is made
+% robust. Expand \cs{the}\cs{value}\texttt{\{\#1\}} once before
+% passing to \cs{storeOrdinalstringnum}}
+% \begin{macrocode}
+\newcommand*{\storeOrdinalstring}[2]{%
+ {%
+ \toks0{\storeOrdinalstringnum{#1}}%
+ \expandafter
+ }\the\toks0\expandafter{\the\value{#2}}%
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\storeOrdinalstringnum}
+% Store textual representation of number, with initial letters in
+% upper case. First argument is identifying name, second argument
+% is a count register or number.
+%\changes{3.02}{2016/01/08}{Made robust using \texttt{etoolbox} \cs{newrobustcmd}}
+% \begin{macrocode}
+\newrobustcmd*{\storeOrdinalstringnum}[2]{%
+ \@ifnextchar[%
+ {\@store@Ordinal@string{#1}{#2}}%
+ {\@store@Ordinal@string{#1}{#2}[m]}%
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\@store@Ordinal@string}
+% Store textual representation of number according to gender,
+% with initial letters in upper case.
+% \begin{macrocode}
+\def\@store@Ordinal@string#1#2[#3]{%
+ \ifthenelse{\equal{#3}{f}}%
+ {%
+ \protect\@OrdinalstringF{#2}{\@fc@ordstr}%
+ }%
+ {%
+ \ifthenelse{\equal{#3}{n}}%
+ {%
+ \protect\@OrdinalstringN{#2}{\@fc@ordstr}%
+ }%
+ {%
+ \ifthenelse{\equal{#3}{m}}%
+ {}%
+ {%
+ \PackageError{fmtcount}%
+ {Invalid gender option `#3'}%
+ {Available options are m or f}%
+ }%
+ \protect\@OrdinalstringM{#2}{\@fc@ordstr}%
+ }%
+ }%
+ \expandafter\let\csname @fcs@#1\endcsname\@fc@ordstr
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\storeORDINALstring}
+% Store upper case textual representation of ordinal. The first
+% argument is identifying name, the second argument is a counter.
+% \changes{3.02}{2016/01/08}{Suppress useless \cs{expandafter}'s and
+% and use \cs{value} instead tweaking with \cs{csname}. Do not use any
+% longer \cs{protect} as \cs{storeORDINALstringnum} is made
+% robust. Expand \cs{the}\cs{value}\texttt{\{\#2\}} once before
+% passing to \cs{storeORDINALstringnum}.}
+% \begin{macrocode}
+\newcommand*{\storeORDINALstring}[2]{%
+ {%
+ \toks0{\storeORDINALstringnum{#1}}%
+ \expandafter
+ }\the\toks0\expandafter{\the\value{#2}}%
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\storeORDINALstringnum}
+% As above, but the second argument is a count register or a
+% number.
+%\changes{3.02}{2016/01/08}{Made robust using \texttt{etoolbox} \cs{newrobustcmd}}
+% \begin{macrocode}
+\newrobustcmd*{\storeORDINALstringnum}[2]{%
+ \@ifnextchar[%
+ {\@store@ORDINAL@string{#1}{#2}}%
+ {\@store@ORDINAL@string{#1}{#2}[m]}%
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\@store@ORDINAL@string}
+% Gender is specified as an optional argument at the end.
+% \begin{macrocode}
+\def\@store@ORDINAL@string#1#2[#3]{%
+ \ifthenelse{\equal{#3}{f}}%
+ {%
+ \protect\@ordinalstringF{#2}{\@fc@ordstr}%
+ }%
+ {%
+ \ifthenelse{\equal{#3}{n}}%
+ {%
+ \protect\@ordinalstringN{#2}{\@fc@ordstr}%
+ }%
+ {%
+ \ifthenelse{\equal{#3}{m}}%
+ {}%
+ {%
+ \PackageError{fmtcount}%
+ {Invalid gender option `#3'}%
+ {Available options are m or f}%
+ }%
+ \protect\@ordinalstringM{#2}{\@fc@ordstr}%
+ }%
+ }%
+% \end{macrocode}
+% \changes{3.01}{2014/11/03}{Protect \cs{`}.}
+% \begin{macrocode}
+ \expandafter\protected@edef\csname @fcs@#1\endcsname{%
+ \noexpand\MakeUppercase{\@fc@ordstr}%
+ }%
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\ORDINALstring}
+% Display upper case textual representation of an ordinal. The
+% argument must be a counter.
+% \changes{3.02}{2016/01/08}{Suppress useless \cs{expandafter}'s and
+% and use \cs{value} instead tweaking with \cs{csname}. Do not use any
+% longer \cs{protect} as \cs{ORDINALstringnum} is made
+% robust. Expand \cs{the}\cs{value}\texttt{\{\#1\}} once before
+% passing to \cs{ORDINALstringnum}}
+% \changes{3.03}{2017/09/14}{Suppress leading \cs{expandafter}'s, they are useless as \cs{ORDINALstringnum} is
+% supposed to fully expand its argument, and place 3 \cs{expandafter}'s before \cs{the}\cs{value} for
+% compatibily with \texttt{glossaries}.}
+% \begin{macrocode}
+\newcommand*{\ORDINALstring}[1]{%
+ \ORDINALstringnum{\expandafter\expandafter\expandafter
+ \the\value{#1}%
+ }%
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\ORDINALstringnum}
+% As above, but the argument is a count register or a number.
+%\changes{1.31}{2009/10/02}{replaced \cs{@ifnextchar} with
+%\cs{new@ifnextchar}}
+%\changes{3.02}{2016/01/08}{Made robust using \texttt{etoolbox} \cs{newrobustcmd}}
+% \begin{macrocode}
+\newrobustcmd*{\ORDINALstringnum}[1]{%
+ \new@ifnextchar[%
+ {\@ORDINAL@string{#1}}%
+ {\@ORDINAL@string{#1}[m]}%
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\@ORDINAL@string}
+% Gender is specified as an optional argument at the end.
+% \begin{macrocode}
+\def\@ORDINAL@string#1[#2]{%
+ {%
+ \ifthenelse{\equal{#2}{f}}%
+ {%
+ \protect\@ordinalstringF{#1}{\@fc@ordstr}%
+ }%
+ {%
+ \ifthenelse{\equal{#2}{n}}%
+ {%
+ \protect\@ordinalstringN{#1}{\@fc@ordstr}%
+ }%
+ {%
+ \ifthenelse{\equal{#2}{m}}%
+ {}%
+ {%
+ \PackageError{fmtcount}%
+ {Invalid gender option `#2'}%
+ {Available options are m, f or n}%
+ }%
+ \protect\@ordinalstringM{#1}{\@fc@ordstr}%
+ }%
+ }%
+ \MakeUppercase{\@fc@ordstr}%
+ }%
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\storenumberstring}
+% Convert number to textual respresentation, and store. First
+% argument is the identifying name, second argument is a counter
+% containing the number.
+% \changes{3.02}{2016/01/08}{Suppress useless \cs{expandafter}'s and
+% and use \cs{value} instead tweaking with \cs{csname}. Do not use any
+% longer \cs{protect} as \cs{storenumberstringnum} is made
+% robust. Expand \cs{the}\cs{value}\texttt{\{\#2\}} once before
+% passing to \cs{storenumberstringnum}}
+% \begin{macrocode}
+\newcommand*{\storenumberstring}[2]{%
+ \expandafter\protect\expandafter\storenumberstringnum{#1}{%
+ \expandafter\the\value{#2}}%
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\storenumberstringnum}
+% As above, but second argument is a number or count register.
+% \begin{macrocode}
+\newcommand{\storenumberstringnum}[2]{%
+ \@ifnextchar[%
+ {\@store@number@string{#1}{#2}}%
+ {\@store@number@string{#1}{#2}[m]}%
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\@store@number@string}
+% Gender is given as optional argument, \emph{at the end}.
+% \begin{macrocode}
+\def\@store@number@string#1#2[#3]{%
+ \ifthenelse{\equal{#3}{f}}%
+ {%
+ \protect\@numberstringF{#2}{\@fc@numstr}%
+ }%
+ {%
+ \ifthenelse{\equal{#3}{n}}%
+ {%
+ \protect\@numberstringN{#2}{\@fc@numstr}%
+ }%
+ {%
+ \ifthenelse{\equal{#3}{m}}%
+ {}%
+ {%
+ \PackageError{fmtcount}
+ {Invalid gender option `#3'}%
+ {Available options are m, f or n}%
+ }%
+ \protect\@numberstringM{#2}{\@fc@numstr}%
+ }%
+ }%
+ \expandafter\let\csname @fcs@#1\endcsname\@fc@numstr
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\numberstring}
+% Display textual representation of a number. The argument
+% must be a counter.
+% \changes{3.02}{2016/01/08}{Suppress useless \cs{expandafter}'s and
+% and use \cs{value} instead tweaking with \cs{csname}. Do not use any
+% longer \cs{protect} as \cs{numberstringnum} is made
+% robust. Expand \cs{the}\cs{value}\texttt{\{\#1\}} once before
+% passing to \cs{numberstringnum}}
+% \changes{3.03}{2017/09/14}{Suppress leading \cs{expandafter}'s, they are useless as \cs{numberstringnum} is
+% supposed to fully expand its argument, and place 3 \cs{expandafter}'s before \cs{the}\cs{value} for
+% compatibily with \texttt{glossaries}.}
+% \begin{macrocode}
+\newcommand*{\numberstring}[1]{%
+ \numberstringnum{\expandafter\expandafter\expandafter
+ \the\value{#1}}%
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\numberstringnum}
+% As above, but the argument is a count register or a number.
+%\changes{1.31}{2009/10/02}{replaced \cs{@ifnextchar} with
+%\cs{new@ifnextchar}}
+%\changes{3.02}{2016/01/08}{Made robust using \texttt{etoolbox} \cs{newrobustcmd}}
+% \begin{macrocode}
+\newrobustcmd*{\numberstringnum}[1]{%
+ \new@ifnextchar[%
+ {\@number@string{#1}}%
+ {\@number@string{#1}[m]}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@number@string}
+% Gender is specified as an optional argument \emph{at the end}.
+% \begin{macrocode}
+\def\@number@string#1[#2]{%
+ {%
+ \ifthenelse{\equal{#2}{f}}%
+ {%
+ \protect\@numberstringF{#1}{\@fc@numstr}%
+ }%
+ {%
+ \ifthenelse{\equal{#2}{n}}%
+ {%
+ \protect\@numberstringN{#1}{\@fc@numstr}%
+ }%
+ {%
+ \ifthenelse{\equal{#2}{m}}%
+ {}%
+ {%
+ \PackageError{fmtcount}%
+ {Invalid gender option `#2'}%
+ {Available options are m, f or n}%
+ }%
+ \protect\@numberstringM{#1}{\@fc@numstr}%
+ }%
+ }%
+ \@fc@numstr
+ }%
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\storeNumberstring}
+% Store textual representation of number. First argument is
+% identifying name, second argument is a counter.
+% \changes{3.02}{2016/01/08}{Suppress useless \cs{expandafter}'s and
+% and use \cs{value} instead tweaking with \cs{csname}. Do not use any
+% longer \cs{protect} as \cs{storeNumberstringnum} is made
+% robust. Expand \cs{the}\cs{value}\texttt{\{\#2\}} once before
+% passing to \cs{storeNumberstringnum}}
+% \begin{macrocode}
+\newcommand*{\storeNumberstring}[2]{%
+ {%
+ \toks0{\storeNumberstringnum{#1}}%
+ \expandafter
+ }\the\toks0\expandafter{\the\value{#2}}%
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\storeNumberstringnum}
+% As above, but second argument is a count register or number.
+% \begin{macrocode}
+\newcommand{\storeNumberstringnum}[2]{%
+ \@ifnextchar[%
+ {\@store@Number@string{#1}{#2}}%
+ {\@store@Number@string{#1}{#2}[m]}%
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\@store@Number@string}
+% Gender is specified as an optional argument \emph{at the end}:
+% \begin{macrocode}
+\def\@store@Number@string#1#2[#3]{%
+ \ifthenelse{\equal{#3}{f}}%
+ {%
+ \protect\@NumberstringF{#2}{\@fc@numstr}%
+ }%
+ {%
+ \ifthenelse{\equal{#3}{n}}%
+ {%
+ \protect\@NumberstringN{#2}{\@fc@numstr}%
+ }%
+ {%
+ \ifthenelse{\equal{#3}{m}}%
+ {}%
+ {%
+ \PackageError{fmtcount}%
+ {Invalid gender option `#3'}%
+ {Available options are m, f or n}%
+ }%
+ \protect\@NumberstringM{#2}{\@fc@numstr}%
+ }%
+ }%
+ \expandafter\let\csname @fcs@#1\endcsname\@fc@numstr
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\Numberstring}
+% Display textual representation of number. The argument must be
+% a counter.
+% \changes{3.02}{2016/01/08}{Suppress useless \cs{expandafter}'s and
+% and use \cs{value} instead tweaking with \cs{csname}. Do not use any
+% longer \cs{protect} as \cs{Numberstringnum} is made
+% robust. Expand \cs{the}\cs{value}\texttt{\{\#1\}} once before
+% passing to \cs{Numberstringnum}}
+% \changes{3.03}{2017/09/14}{Suppress leading \cs{expandafter}'s, they are useless as \cs{Numberstringnum} is
+% supposed to fully expand its argument, and place 3 \cs{expandafter}'s before \cs{the}\cs{value} for
+% compatibily with \texttt{glossaries}.}
+% \begin{macrocode}
+\newcommand*{\Numberstring}[1]{%
+ \Numberstringnum{\expandafter\expandafter\expandafter
+ \the\value{#1}}%
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\Numberstringnum}
+% As above, but the argument is a count register or number.
+%\changes{1.31}{2009/10/02}{replaced \cs{@ifnextchar} with
+%\cs{new@ifnextchar}}
+%\changes{3.02}{2016/01/08}{Made robust using \texttt{etoolbox} \cs{newrobustcmd}}
+% \begin{macrocode}
+\newrobustcmd*{\Numberstringnum}[1]{%
+ \new@ifnextchar[%
+ {\@Number@string{#1}}%
+ {\@Number@string{#1}[m]}%
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\@Number@string}
+% Gender is specified as an optional argument at the end.
+% \begin{macrocode}
+\def\@Number@string#1[#2]{%
+ {%
+ \ifthenelse{\equal{#2}{f}}%
+ {%
+ \protect\@NumberstringF{#1}{\@fc@numstr}%
+ }%
+ {%
+ \ifthenelse{\equal{#2}{n}}%
+ {%
+ \protect\@NumberstringN{#1}{\@fc@numstr}%
+ }%
+ {%
+ \ifthenelse{\equal{#2}{m}}%
+ {}%
+ {%
+ \PackageError{fmtcount}%
+ {Invalid gender option `#2'}%
+ {Available options are m, f or n}%
+ }%
+ \protect\@NumberstringM{#1}{\@fc@numstr}%
+ }%
+ }%
+ \@fc@numstr
+ }%
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\storeNUMBERstring}
+% Store upper case textual representation of number. The first
+% argument is identifying name, the second argument is a counter.
+% \changes{3.02}{2016/01/08}{Suppress useless \cs{expandafter}'s and
+% and use \cs{value} instead tweaking with \cs{csname}. Do not use any
+% longer \cs{protect} as \cs{storeNUMBERstringnum} is made
+% robust. Expand \cs{the}\cs{value}\texttt{\{\#2\}} once before
+% passing to \cs{storeNUMBERstringnum}.}
+% \begin{macrocode}
+\newcommand{\storeNUMBERstring}[2]{%
+ {%
+ \toks0{\storeNUMBERstringnum{#1}}%
+ \expandafter
+ }\the\toks0\expandafter{\the\value{#2}}%
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\storeNUMBERstringnum}
+% As above, but the second argument is a count register or a
+% number.
+% \begin{macrocode}
+\newcommand{\storeNUMBERstringnum}[2]{%
+ \@ifnextchar[%
+ {\@store@NUMBER@string{#1}{#2}}%
+ {\@store@NUMBER@string{#1}{#2}[m]}%
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\@store@NUMBER@string}
+% Gender is specified as an optional argument at the end.
+% \begin{macrocode}
+\def\@store@NUMBER@string#1#2[#3]{%
+ \ifthenelse{\equal{#3}{f}}%
+ {%
+ \protect\@numberstringF{#2}{\@fc@numstr}%
+ }%
+ {%
+ \ifthenelse{\equal{#3}{n}}%
+ {%
+ \protect\@numberstringN{#2}{\@fc@numstr}%
+ }%
+ {%
+ \ifthenelse{\equal{#3}{m}}%
+ {}%
+ {%
+ \PackageError{fmtcount}%
+ {Invalid gender option `#3'}%
+ {Available options are m or f}%
+ }%
+ \protect\@numberstringM{#2}{\@fc@numstr}%
+ }%
+ }%
+ \expandafter\edef\csname @fcs@#1\endcsname{%
+ \noexpand\MakeUppercase{\@fc@numstr}%
+ }%
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\NUMBERstring}
+% Display upper case textual representation of a number. The
+% argument must be a counter.
+% \changes{3.02}{2016/01/08}{Suppress useless \cs{expandafter}'s and
+% and use \cs{value} instead tweaking with \cs{csname}. Do not use any
+% longer \cs{protect} as \cs{NUMBERstringnum} is made
+% robust. Expand \cs{the}\cs{value}\texttt{\{\#1\}} once before
+% passing to \cs{NUMBERstringnum}.}
+% \changes{3.03}{2017/09/14}{Suppress leading \cs{expandafter}'s, they are useless as \cs{NUMBERstringnum} is
+% supposed to fully expand its argument, and place 3 \cs{expandafter}'s before \cs{the}\cs{value} for
+% compatibily with \texttt{glossaries}.}
+% \begin{macrocode}
+\newcommand*{\NUMBERstring}[1]{%
+ \NUMBERstringnum{\expandafter\expandafter\expandafter
+ \the\value{#1}}%
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\NUMBERstringnum}
+% As above, but the argument is a count register or a number.
+%\changes{1.31}{2009/10/02}{replaced \cs{@ifnextchar} with
+%\cs{new@ifnextchar}}
+%\changes{3.02}{2016/01/08}{Made robust using \texttt{etoolbox} \cs{newrobustcmd}}
+% \begin{macrocode}
+\newrobustcmd*{\NUMBERstringnum}[1]{%
+ \new@ifnextchar[%
+ {\@NUMBER@string{#1}}%
+ {\@NUMBER@string{#1}[m]}%
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\@NUMBER@string}
+% Gender is specified as an optional argument at the end.
+% \begin{macrocode}
+\def\@NUMBER@string#1[#2]{%
+ {%
+ \ifthenelse{\equal{#2}{f}}%
+ {%
+ \protect\@numberstringF{#1}{\@fc@numstr}%
+ }%
+ {%
+ \ifthenelse{\equal{#2}{n}}%
+ {%
+ \protect\@numberstringN{#1}{\@fc@numstr}%
+ }%
+ {%
+ \ifthenelse{\equal{#2}{m}}%
+ {}%
+ {%
+ \PackageError{fmtcount}%
+ {Invalid gender option `#2'}%
+ {Available options are m, f or n}%
+ }%
+ \protect\@numberstringM{#1}{\@fc@numstr}%
+ }%
+ }%
+ \MakeUppercase{\@fc@numstr}%
+ }%
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\binary}
+% Number representations in other bases. Binary:
+% \changes{3.02}{2016/01/08}{Suppress useless \cs{expandafter}'s and
+% and use \cs{value} instead tweaking with \cs{csname}. Do not use any
+% longer \cs{protect} as \cs{@binary} is made
+% robust. Expand \cs{the}\cs{value}\texttt{\{\#1\}} once before
+% passing to \cs{@binary}}
+% \changes{3.03}{2017/09/14}{Suppress leading \cs{expandafter}'s, they are useless as \cs{@binary} is supposed
+% to fully expand its argument, and place 3 \cs{expandafter}'s before \cs{the}\cs{value} for compatibily with
+% \texttt{glossaries}.}
+% \begin{macrocode}
+\providecommand*{\binary}[1]{%
+ \@binary{\expandafter\expandafter\expandafter
+ \the\value{#1}}%
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\aaalph}
+% Like \ics{alph}, but goes beyond 26.
+% (a \ldots\ z aa \ldots zz \ldots)
+% \changes{3.02}{2016/01/08}{Suppress useless \cs{expandafter}'s and
+% and use \cs{value} instead tweaking with \cs{csname}. Do not use any
+% longer \cs{protect} as \cs{@aaalph} is made
+% robust. Expand \cs{the}\cs{value}\texttt{\{\#1\}} once before
+% passing to \cs{@aaalph}.}
+% \changes{3.03}{2017/09/14}{Suppress leading \cs{expandafter}'s, they are useless as \cs{@aaalph} is supposed
+% to fully expand its argument, and place 3 \cs{expandafter}'s before \cs{the}\cs{value} for compatibily with
+% \texttt{glossaries}.}
+% \begin{macrocode}
+\providecommand*{\aaalph}[1]{%
+ \@aaalph{\expandafter\expandafter\expandafter
+ \the\value{#1}}%
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\AAAlph}
+% As before, but upper case.
+% \changes{3.02}{2016/01/08}{Suppress useless \cs{expandafter}'s and
+% and use \cs{value} instead tweaking with \cs{csname}. Do not use any
+% longer \cs{protect} as \cs{@AAAlph} is made
+% robust. Expand \cs{the}\cs{value}\texttt{\{\#1\}} once before
+% passing to \cs{@AAAlph}.}
+% \changes{3.03}{2017/09/14}{Suppress leading \cs{expandafter}'s, they are useless as \cs{@AAAlph} is supposed
+% to fully expand its argument, and place 3 \cs{expandafter}'s before \cs{the}\cs{value} for compatibily with
+% \texttt{glossaries}.}
+% \begin{macrocode}
+\providecommand*{\AAAlph}[1]{%
+ \@AAAlph{\expandafter\expandafter\expandafter
+ \the\value{#1}}%
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\abalph}
+% Like \ics{alph}, but goes beyond 26.
+% (a \ldots\ z ab \ldots az \ldots)
+% \changes{3.02}{2016/01/08}{Suppress useless \cs{expandafter}'s and
+% and use \cs{value} instead tweaking with \cs{csname}. Do not use any
+% longer \cs{protect} as \cs{@abalph} is made
+% robust. Expand \cs{the}\cs{value}\texttt{\{\#1\}} once before
+% passing to \cs{@abalph}.}
+% \changes{3.03}{2017/09/14}{Suppress leading \cs{expandafter}'s, they are useless as \cs{@abalph} is supposed
+% to fully expand its argument, and place 3 \cs{expandafter}'s before \cs{the}\cs{value} for compatibily with
+% \texttt{glossaries}.}
+% \begin{macrocode}
+\providecommand*{\abalph}[1]{%
+ \@abalph{\expandafter\expandafter\expandafter
+ \the\value{#1}}%
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\ABAlph}
+% As above, but upper case.
+% \changes{3.02}{2016/01/08}{Suppress useless \cs{expandafter}'s and
+% and use \cs{value} instead tweaking with \cs{csname}. Do not use any
+% longer \cs{protect} as \cs{@ABAlph} is made
+% robust. Expand \cs{the}\cs{value}\texttt{\{\#1\}} once before
+% passing to \cs{@ABAlph}.}
+% \changes{3.03}{2017/09/14}{Suppress leading \cs{expandafter}'s, they are useless as \cs{@ABAlph} is supposed
+% to fully expand its argument, and place 3 \cs{expandafter}'s before \cs{the}\cs{value} for compatibily with
+% \texttt{glossaries}.}
+% \begin{macrocode}
+\providecommand*{\ABAlph}[1]{%
+ \@ABAlph{\expandafter\expandafter\expandafter
+ \the\value{#1}}%
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\hexadecimal}
+% Hexadecimal:
+% \changes{3.02}{2016/01/08}{Suppress useless \cs{expandafter}'s and
+% and use \cs{value} instead tweaking with \cs{csname}. Do not use any
+% longer \cs{protect} as \cs{@hexadecimal} is made
+% robust. Expand \cs{the}\cs{value}\texttt{\{\#1\}} once before
+% passing to \cs{@hexadecimal}.}
+% \changes{3.03}{2017/09/14}{Suppress leading \cs{expandafter}'s, they are useless as \cs{@hexadecimal} is
+% supposed to fully expand its argument, and place 3 \cs{expandafter}'s before \cs{the}\cs{value} for
+% compatibily with \texttt{glossaries}.}
+% \begin{macrocode}
+\providecommand*{\hexadecimal}[1]{%
+ \@hexadecimal{\expandafter\expandafter\expandafter
+ \the\value{#1}}%
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\Hexadecimal}
+% As above, but in upper case.
+% \changes{3.02}{2016/01/08}{Suppress useless \cs{expandafter}'s and
+% and use \cs{value} instead tweaking with \cs{csname}. Do not use any
+% longer \cs{protect} as \cs{@Hexadecimal} is made
+% robust. Expand \cs{the}\cs{value}\texttt{\{\#1\}} once before
+% passing to \cs{@Hexadecimal}.}
+% \changes{3.03}{2017/09/14}{Suppress leading \cs{expandafter}'s, they are useless as \cs{@Hexadecimal} is
+% supposed to fully expand its argument, and place 3 \cs{expandafter}'s before \cs{the}\cs{value} for
+% compatibily with \texttt{glossaries}.}
+% \begin{macrocode}
+\providecommand*{\Hexadecimal}[1]{%
+ \@Hexadecimal{\expandafter\expandafter\expandafter
+ \the\value{#1}}%
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\octal}
+% Octal:
+% \changes{3.02}{2016/01/08}{Suppress useless \cs{expandafter}'s and
+% and use \cs{value} instead tweaking with \cs{csname}. Do not use any
+% longer \cs{protect} as \cs{@octal} is made
+% robust. Expand \cs{the}\cs{value}\texttt{\{\#1\}} once before
+% passing to \cs{@octal}}
+% \changes{3.03}{2017/09/14}{Suppress leading \cs{expandafter}'s, they are useless as \cs{@octal} is supposed
+% to fully expand its argument, and place 3 \cs{expandafter}'s before \cs{the}\cs{value} for compatibily with
+% \texttt{glossaries}.}
+% \begin{macrocode}
+\providecommand*{\octal}[1]{%
+ \@octal{\expandafter\expandafter\expandafter
+ \the\value{#1}}%
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\decimal}
+% Decimal:
+% \changes{3.02}{2016/01/08}{Suppress useless \cs{expandafter}'s and
+% and use \cs{value} instead tweaking with \cs{csname}. Do not use any
+% longer \cs{protect} as \cs{@decimal} is made
+% robust. Expand \cs{the}\cs{value}\texttt{\{\#1\}} once before
+% passing to \cs{@decimal}}
+% \changes{3.03}{2017/09/14}{Suppress leading \cs{expandafter}'s, they are useless as \cs{@decimal} is supposed
+% to fully expand its argument, and place 3 \cs{expandafter}'s before \cs{the}\cs{value} for compatibily with
+% \texttt{glossaries}.}
+% \begin{macrocode}
+\providecommand*{\decimal}[1]{%
+ \@decimal{\expandafter\expandafter\expandafter
+ \the\value{#1}}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\subsubsection{Multilinguage Definitions}
+% Flag \cs{fc@languagemode@detected} allows to stop scanning for multilingual mode trigger conditions. It is
+% initialized to \texttt{false} as no such scanning as taken place yet.
+%\changes{3.05}{2017/12/22}{New flag \cs{iffc@languagemode@detected}.}
+% \begin{macrocode}
+\newif\iffc@languagemode@detected
+\fc@languagemode@detectedfalse
+% \end{macrocode}
+%\begin{macro}{\@setdef@ultfmtcount}
+% If multilingual support is provided, make \cs{@numberstring}
+% etc use the correct language (if defined).
+% Otherwise use English definitions. \cs{@setdef@ultfmtcount}
+% sets the macros to use English.
+%\changes{3.05}{2017/12/22}{Set flag \cs{iffc@languagemode@detected}.}
+% \begin{macrocode}
+\def\@setdef@ultfmtcount{%
+ \fc@languagemode@detectedtrue
+ \ifcsundef{@ordinalMenglish}{\FCloadlang{english}}{}%
+ \def\@ordinalstringM{\@ordinalstringMenglish}%
+ \let\@ordinalstringF=\@ordinalstringMenglish
+ \let\@ordinalstringN=\@ordinalstringMenglish
+ \def\@OrdinalstringM{\@OrdinalstringMenglish}%
+ \let\@OrdinalstringF=\@OrdinalstringMenglish
+ \let\@OrdinalstringN=\@OrdinalstringMenglish
+ \def\@numberstringM{\@numberstringMenglish}%
+ \let\@numberstringF=\@numberstringMenglish
+ \let\@numberstringN=\@numberstringMenglish
+ \def\@NumberstringM{\@NumberstringMenglish}%
+ \let\@NumberstringF=\@NumberstringMenglish
+ \let\@NumberstringN=\@NumberstringMenglish
+ \def\@ordinalM{\@ordinalMenglish}%
+ \let\@ordinalF=\@ordinalM
+ \let\@ordinalN=\@ordinalM
+ \let\fmtord\fc@orddef@ult
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\fc@multiling}
+%\changes{2.02}{2012/10/03}{new}
+%\cs{fc@multiling}\marg{name}\marg{gender}
+%\changes{3.00}{2014/07/03}{Use \cs{protect}, not \cs{string} in \cs{PackageWarning} to quote macros like
+% shown in \texttt{clsguide.pdf}}
+% \begin{macrocode}
+\newcommand*{\fc@multiling}[2]{%
+ \ifcsundef{@#1#2\languagename}%
+ {% try loading it
+ \FCloadlang{\languagename}%
+ }%
+ {%
+ }%
+ \ifcsundef{@#1#2\languagename}%
+ {%
+ \PackageWarning{fmtcount}%
+ {No support for \expandafter\protect\csname #1\endcsname\space for
+ language '\languagename'}%
+ \ifthenelse{\equal{\languagename}{\fc@mainlang}}%
+ {%
+ \FCloadlang{english}%
+ }%
+ {%
+ }%
+ \ifcsdef{@#1#2\fc@mainlang}%
+ {%
+ \csuse{@#1#2\fc@mainlang}%
+ }%
+ {%
+ \PackageWarningNoLine{fmtcount}%
+ {No languages loaded at all! Loading english definitions}%
+ \FCloadlang{english}%
+ \def\fc@mainlang{english}%
+ \csuse{@#1#2english}%
+ }%
+ }%
+ {%
+ \csuse{@#1#2\languagename}%
+ }%
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\@set@mulitling@fmtcount}
+% This defines the number and ordinal string macros to use
+% \cs{languagename}:
+%\changes{2.0}{2012/06/03}{changed errors to warnings for
+%unsupported languages}
+%\changes{3.05}{2017/12/22}{Set flag \cs{iffc@languagemode@detected}.}
+% \begin{macrocode}
+\def\@set@mulitling@fmtcount{%
+ \fc@languagemode@detectedtrue
+% \end{macrocode}
+% The masculine version of \cs{numberstring}:
+% \begin{macrocode}
+ \def\@numberstringM{%
+ \fc@multiling{numberstring}{M}%
+ }%
+% \end{macrocode}
+% The feminine version of \cs{numberstring}:
+% \begin{macrocode}
+ \def\@numberstringF{%
+ \fc@multiling{numberstring}{F}%
+ }%
+% \end{macrocode}
+% The neuter version of \cs{numberstring}:
+% \begin{macrocode}
+ \def\@numberstringN{%
+ \fc@multiling{numberstring}{N}%
+ }%
+% \end{macrocode}
+% The masculine version of \cs{Numberstring}:
+% \begin{macrocode}
+ \def\@NumberstringM{%
+ \fc@multiling{Numberstring}{M}%
+ }%
+% \end{macrocode}
+% The feminine version of \cs{Numberstring}:
+% \begin{macrocode}
+ \def\@NumberstringF{%
+ \fc@multiling{Numberstring}{F}%
+ }%
+% \end{macrocode}
+% The neuter version of \cs{Numberstring}:
+% \begin{macrocode}
+ \def\@NumberstringN{%
+ \fc@multiling{Numberstring}{N}%
+ }%
+% \end{macrocode}
+% The masculine version of \cs{ordinal}:
+% \begin{macrocode}
+ \def\@ordinalM{%
+ \fc@multiling{ordinal}{M}%
+ }%
+% \end{macrocode}
+% The feminine version of \cs{ordinal}:
+% \begin{macrocode}
+ \def\@ordinalF{%
+ \fc@multiling{ordinal}{F}%
+ }%
+% \end{macrocode}
+% The neuter version of \cs{ordinal}:
+% \begin{macrocode}
+ \def\@ordinalN{%
+ \fc@multiling{ordinal}{N}%
+ }%
+% \end{macrocode}
+% The masculine version of \cs{ordinalstring}:
+% \begin{macrocode}
+ \def\@ordinalstringM{%
+ \fc@multiling{ordinalstring}{M}%
+ }%
+% \end{macrocode}
+% The feminine version of \cs{ordinalstring}:
+% \begin{macrocode}
+ \def\@ordinalstringF{%
+ \fc@multiling{ordinalstring}{F}%
+ }%
+% \end{macrocode}
+% The neuter version of \cs{ordinalstring}:
+% \begin{macrocode}
+ \def\@ordinalstringN{%
+ \fc@multiling{ordinalstring}{N}%
+ }%
+% \end{macrocode}
+% The masculine version of \cs{Ordinalstring}:
+% \begin{macrocode}
+ \def\@OrdinalstringM{%
+ \fc@multiling{Ordinalstring}{M}%
+ }%
+% \end{macrocode}
+% The feminine version of \cs{Ordinalstring}:
+% \begin{macrocode}
+ \def\@OrdinalstringF{%
+ \fc@multiling{Ordinalstring}{F}%
+ }%
+% \end{macrocode}
+% The neuter version of \cs{Ordinalstring}:
+% \begin{macrocode}
+ \def\@OrdinalstringN{%
+ \fc@multiling{Ordinalstring}{N}%
+ }%
+% \end{macrocode}
+% Make \cs{fmtord} language dependent:
+% \changes{3.01}{2014/12/03}{Make \cs{fmtord} language dependent.}
+% \begin{macrocode}
+ \let\fmtord\fc@ord@multiling
+}
+% \end{macrocode}
+%\end{macro}
+%\changes{3.05}{2017/12/22}{Change all the code about detecting multiling. \cs{ifxetex} is no longer used,
+% instead we loop on the list of packages of interest \styfmt{babel}, \styfmt{polyglossia}, \styfmt{mlp}, or
+% \styfmt{ngerman}, and set or not \cs{iffc@languagemode@detected} flag as a result.}
+% Check to see if \styfmt{babel}, \styfmt{polyglossia}, \styfmt{mlp}, or \styfmt{ngerman} packages have been
+% loaded, and if yes set \styfmt{fmtcount} in multiling. First we define some \cs{fc@check@for@multiling}
+% macro to do such action where \texttt{\#1} is the package name, and \texttt{\#2} is a callback.
+% \begin{macrocode}
+\def\fc@check@for@multiling#1:#2\@nil{%
+ \@ifpackageloaded{#1}{%
+ #2\@set@mulitling@fmtcount
+ }{}%
+}
+% \end{macrocode}
+% Now we define \cs{fc@loop@on@multiling@pkg} as an iterator to scan whether any of \styfmt{babel},
+% \styfmt{polyglossia}, \styfmt{mlp}, or \styfmt{ngerman} packages has been loaded, and if so set multilingual
+% mode.
+% \begin{macrocode}
+\def\fc@loop@on@multiling@pkg#1,{%
+ \def\@tempb{#1}%
+ \ifx\@tempb\@nnil
+% \end{macrocode}
+% We have reached the end of the loop, so stop here.
+% \begin{macrocode}
+ \let\fc@loop@on@multiling@pkg\@empty
+ \else
+% \end{macrocode}
+% Make the \cs{@ifpackageloaded} test and break the loop if it was positive.
+% \begin{macrocode}
+ \fc@check@for@multiling#1\@nil
+ \iffc@languagemode@detected
+ \def\fc@loop@on@multiling@pkg##1\@nil,{}%
+ \fi
+ \fi
+ \fc@loop@on@multiling@pkg
+}
+% \end{macrocode}
+% Now, do the loop itself, we do this at beginning of document not to constrain the order of loading
+% \styfmt{fmtcount} and the multilingual package \styfmt{babel}, \styfmt{polyglossia}, etc.:
+% \begin{macrocode}
+\AtBeginDocument{%
+ \fc@loop@on@multiling@pkg babel:,polyglossia:,ngerman:\FCloadlang{ngerman},\@nil,
+% \end{macrocode}
+% In the case that no multilingual package (such as
+% \styfmt{babel}/\styfmt{polyglossia}/\styfmt{ngerman}) has been loaded, then we go to multiling
+% if a language has been loaded by package option.
+% \begin{macrocode}
+ \unless\iffc@languagemode@detected\iffmtcount@language@option
+% \end{macrocode}
+% If the multilingual mode has not been yet activated, but a language option has been passed to
+% \styfmt{fmtcount}, we should go to multilingual mode. However, first of, we do some sanity check, as this
+% may help the end user understand what is wrong: we check that macro \cs{languagename} is defined, and
+% activate the multilingual mode only then, and otherwise fall back to default legacy mode.
+% \begin{macrocode}
+ \ifcsundef{languagename}%
+ {%
+ \PackageWarning{fmtcount}{%
+ `\protect\languagename' is undefined, you should use a language package such as babel/polyglossia
+ when loading a language via package option. Reverting to default language.
+ }%
+ \@setdef@ultfmtcount
+ }{%
+ \@set@mulitling@fmtcount
+
+% \end{macrocode}
+% Now, some more checking, having activated multilingual mode after a language option has been passed to
+% \styfmt{fmtcount}, we check that the \styfmt{fmtcount} language definitions corresponding to
+% \cs{languagename} have been loaded, and otherwise fall \cs{languagename} back to the latest
+% \styfmt{fmtcount} language definition loaded.
+% \begin{macrocode}
+ \@FC@iflangloaded{\languagename}{}{%
+% \end{macrocode}
+% The current \cs{languagename} is not a \styfmt{fmtcount} language that has been previously loaded. The
+% correction is to have \cs{languagename} let to \cs{fc@mainlang}. Please note that, as
+% \cs{iffmtcount@language@option} is true, we know that \texttt{fmtcount} has loaded some language.
+% \begin{macrocode}
+ \PackageWarning{fmtcount}{%
+ Setting `\protect\languagename' to `\fc@mainlang'.\MessageBreak
+ Reason is that `\protect\languagename' was `\languagename',\MessageBreak
+ but `\languagename' was not loaded by fmtcount,\MessageBreak
+ whereas `\fc@mainlang' was the last language loaded by fmtcount ;
+ }%
+ \let\languagename\fc@mainlang
+ }%
+ }%
+ \else
+ \@setdef@ultfmtcount
+ \fi\fi
+}
+% \end{macrocode}
+% \changes{3.01}{2014/12/03}{Substitute \cs{textsuperscript} for \cs{fc@textsuperscript}, and define
+% \cs{fc@textsuperscript} as \cs{fup} when defined at beginning of document, or as \cs{textsuperscript}
+% otherwise}
+% \begin{macrocode}
+\AtBeginDocument{%
+ \ifcsundef{FBsupR}{\let\fc@textsuperscript\textsuperscript}{\let\fc@textsuperscript\fup}%
+}
+% \end{macrocode}
+% Backwards compatibility:
+% \begin{macrocode}
+\let\@ordinal=\@ordinalM
+\let\@ordinalstring=\@ordinalstringM
+\let\@Ordinalstring=\@OrdinalstringM
+\let\@numberstring=\@numberstringM
+\let\@Numberstring=\@NumberstringM
+% \end{macrocode}
+\iffalse Local variables: \fi
+\iffalse mode: docTeX \fi
+\iffalse End: \fi
+%\iffalse
+% \begin{macrocode}
+%</fmtcount.sty>
+% \end{macrocode}
+%\fi
+%\Finale
+\endinput
diff --git a/macros/latex/contrib/fmtcount/fmtcount.ins b/macros/latex/contrib/fmtcount/fmtcount.ins
new file mode 100644
index 0000000000..0c6535c3e7
--- /dev/null
+++ b/macros/latex/contrib/fmtcount/fmtcount.ins
@@ -0,0 +1,69 @@
+% fmtcount.ins generated using makedtx version 1.2 2017/12/26 22:09
+\input docstrip
+
+\preamble
+
+ fmtcount.dtx
+ Copyright 2017 Nicola Talbot and Vincent Belaïche
+
+ This work may be distributed and/or modified under the
+ conditions of the LaTeX Project Public License, either version 1.3
+ of this license or (at your option) any later version.
+ The latest version of this license is in
+ http://www.latex-project.org/lppl.txt
+ and version 1.3 or later is part of all distributions of LaTeX
+ version 2005/12/01 or later.
+
+ This work has the LPPL maintenance status `maintained'.
+
+ The Current Maintainer of this work is Nicola Talbot and Vincent Belaïche.
+
+ This work consists of the files fmtcount.dtx and fmtcount.ins and the derived files fc-american.def, fc-brazilian.def, fc-british.def, fc-english.def, fc-francais.def, fc-french.def, fc-frenchb.def, fc-german.def, fc-germanb.def, fc-italian.def, fc-ngerman.def, fc-ngermanb.def, fc-portuges.def, fc-portuguese.def, fc-spanish.def, fc-UKenglish.def, fc-USenglish.def, fcnumparser.sty, fcprefix.sty, fmtcount.sty.
+
+\endpreamble
+
+\askforoverwritefalse
+
+\generate{\file{fc-american.def}{\usepreamble\defaultpreamble
+\usepostamble\defaultpostamble\from{fmtcount.dtx}{fc-american.def,package}}
+\file{fc-brazilian.def}{\usepreamble\defaultpreamble
+\usepostamble\defaultpostamble\from{fmtcount.dtx}{fc-brazilian.def,package}}
+\file{fc-british.def}{\usepreamble\defaultpreamble
+\usepostamble\defaultpostamble\from{fmtcount.dtx}{fc-british.def,package}}
+\file{fc-english.def}{\usepreamble\defaultpreamble
+\usepostamble\defaultpostamble\from{fmtcount.dtx}{fc-english.def,package}}
+\file{fc-francais.def}{\usepreamble\defaultpreamble
+\usepostamble\defaultpostamble\from{fmtcount.dtx}{fc-francais.def,package}}
+\file{fc-french.def}{\usepreamble\defaultpreamble
+\usepostamble\defaultpostamble\from{fmtcount.dtx}{fc-french.def,package}}
+\file{fc-frenchb.def}{\usepreamble\defaultpreamble
+\usepostamble\defaultpostamble\from{fmtcount.dtx}{fc-frenchb.def,package}}
+\file{fc-german.def}{\usepreamble\defaultpreamble
+\usepostamble\defaultpostamble\from{fmtcount.dtx}{fc-german.def,package}}
+\file{fc-germanb.def}{\usepreamble\defaultpreamble
+\usepostamble\defaultpostamble\from{fmtcount.dtx}{fc-germanb.def,package}}
+\file{fc-italian.def}{\usepreamble\defaultpreamble
+\usepostamble\defaultpostamble\from{fmtcount.dtx}{fc-italian.def,package}}
+\file{fc-ngerman.def}{\usepreamble\defaultpreamble
+\usepostamble\defaultpostamble\from{fmtcount.dtx}{fc-ngerman.def,package}}
+\file{fc-ngermanb.def}{\usepreamble\defaultpreamble
+\usepostamble\defaultpostamble\from{fmtcount.dtx}{fc-ngermanb.def,package}}
+\file{fc-portuges.def}{\usepreamble\defaultpreamble
+\usepostamble\defaultpostamble\from{fmtcount.dtx}{fc-portuges.def,package}}
+\file{fc-portuguese.def}{\usepreamble\defaultpreamble
+\usepostamble\defaultpostamble\from{fmtcount.dtx}{fc-portuguese.def,package}}
+\file{fc-spanish.def}{\usepreamble\defaultpreamble
+\usepostamble\defaultpostamble\from{fmtcount.dtx}{fc-spanish.def,package}}
+\file{fc-UKenglish.def}{\usepreamble\defaultpreamble
+\usepostamble\defaultpostamble\from{fmtcount.dtx}{fc-UKenglish.def,package}}
+\file{fc-USenglish.def}{\usepreamble\defaultpreamble
+\usepostamble\defaultpostamble\from{fmtcount.dtx}{fc-USenglish.def,package}}
+\file{fcnumparser.sty}{\usepreamble\defaultpreamble
+\usepostamble\defaultpostamble\from{fmtcount.dtx}{fcnumparser.sty,package}}
+\file{fcprefix.sty}{\usepreamble\defaultpreamble
+\usepostamble\defaultpostamble\from{fmtcount.dtx}{fcprefix.sty,package}}
+\file{fmtcount.sty}{\usepreamble\defaultpreamble
+\usepostamble\defaultpostamble\from{fmtcount.dtx}{fmtcount.sty,package}}
+}
+
+\endbatchfile
diff --git a/macros/latex/contrib/fmtcount/fmtcount.pdf b/macros/latex/contrib/fmtcount/fmtcount.pdf
new file mode 100644
index 0000000000..e5e1950401
--- /dev/null
+++ b/macros/latex/contrib/fmtcount/fmtcount.pdf
Binary files differ
diff --git a/macros/latex/contrib/fmtcount/fmtcount.perl b/macros/latex/contrib/fmtcount/fmtcount.perl
new file mode 100644
index 0000000000..b8a1fde0df
--- /dev/null
+++ b/macros/latex/contrib/fmtcount/fmtcount.perl
@@ -0,0 +1,2672 @@
+# File : fmtcount.perl
+# Author : Nicola Talbot
+# Date : 2012-09-25
+# Version : 1.06
+# Description : LaTeX2HTML implementation of fmtcount package
+# This file should be place in LaTeX2HTML's styles directory
+# in order for LaTeX2HTML to find it.
+
+package main;
+
+sub do_fmtcount_raise{
+ local($tmp)="";
+
+ $tmp .= 'sub do_cmd_fmtord{';
+ $tmp .= 'local($_) = @_;';
+ $tmp .= 'local($suffix) = &missing_braces unless (s/$next_pair_pr_rx/$suffix=$2;\'\'/eo);';
+ $tmp .= 'join("", "<SUP>",$suffix,"</SUP>",$_);';
+ $tmp .='}';
+
+ eval($tmp);
+}
+
+sub do_fmtcount_level{
+ local($tmp)="";
+
+ $tmp .= 'sub do_cmd_fmtord{';
+ $tmp .= 'local($_) = @_;';
+ $tmp .= 'local($suffix) = &missing_braces unless (s/$next_pair_pr_rx/$suffix=$2;\'\'/eo);';
+ $tmp .= 'join("", $suffix,$_);';
+ $tmp .='}';
+
+ eval($tmp);
+}
+
+if (not defined &do_cmd_fmtord)
+{
+ &do_fmtcount_raise(@_);
+}
+
+$frenchdialect = 'france';
+$ordinalabbrv = 0;
+
+sub get_ordinal_suffix_english{
+ local($num,$gender) = @_;
+ local($suffix);
+
+ if ((($num % 10) == 1) && ($num%100 != 11))
+ {
+ $suffix = 'st';
+ }
+ elsif ((($num % 10) == 2) && ($num%100 != 12))
+ {
+ $suffix = 'nd';
+ }
+ elsif ((($num % 10) == 3) && ($num%100 != 13))
+ {
+ $suffix = 'rd';
+ }
+ else
+ {
+ $suffix = 'th';
+ }
+
+ $suffix;
+}
+
+sub get_ordinal_suffix_french{
+ local($num,$gender) = @_;
+ local($_);
+
+ if ($ordinalabbrv > 0)
+ {
+ $_ = 'e';
+ }
+ else
+ {
+ if ($num == 1)
+ {
+ $_ = ($gender eq 'f' ? 'ere' : 'er');
+ }
+ else
+ {
+ $_ = 'eme';
+ }
+ }
+}
+
+sub get_ordinal_suffix_spanish{
+ local($num,$gender) = @_;
+
+ ($gender eq 'f' ? 'a' : 'o');
+}
+
+sub get_ordinal_suffix_portuges{
+ local($num,$gender) = @_;
+
+ ($gender eq 'f' ? 'a' : 'o');
+}
+
+sub get_ordinal_suffix_german{
+ local($num,$gender) = @_;
+
+ '';
+}
+
+sub get_ordinal_suffix_ngerman{
+ local($num,$gender) = @_;
+
+ '';
+}
+
+sub get_ordinal_suffix{
+ local($num,$gender) = @_;
+ local($suffix,$suffixsub);
+
+ $suffixsub = "get_ordinal_suffix_$default_language";
+
+ if (defined ($suffixsub))
+ {
+ $suffix = &$suffixsub($num,$gender);
+ }
+ else
+ {
+ $suffix = &get_ordinal_suffix_english($num,$gender);
+ }
+
+ $suffix;
+}
+
+sub getordinal{
+ local($num,$gender) = @_;
+ local($suffix) = &get_ordinal_suffix($num,$gender);
+ local($text)='';
+
+ if ($suffix eq '')
+ {
+ $text = $num;
+ }
+ else
+ {
+ local($br_id) = ++$global{'max_id'};
+ $text = $num . "\\fmtord${OP}$br_id${CP}$suffix${OP}$br_id${CP}";
+ }
+
+ $text;
+}
+
+sub do_cmd_ordinalnum{
+ local($_) = @_;
+ local($num) = &missing_braces
+ unless (s/$next_pair_pr_rx/$num=$2;''/eo);
+ my($gender)='m';
+ local($suffix)='';
+
+ if (s/\[([mfn])\]//)
+ {
+ $gender = $1;
+ }
+
+ $suffix = &get_ordinal_suffix($num,$gender);
+
+ local($br_id) = ++$global{'max_id'};
+ join('', $num, "\\fmtord${OP}$br_id${CP}$suffix${OP}$br_id${CP}", $_);
+}
+
+sub do_cmd_FCordinal{
+ &do_cmd_ordinal;
+}
+
+sub do_cmd_ordinal{
+ local($ctr, $val, $id, $_) = &read_counter_value($_[0]);
+ my($gender)='m';
+
+ $_[0] =~ s/${OP}$id${CP}$ctr${OP}$id${CP}//;
+
+ if ($_[0]=~s/\[(.)\]//)
+ {
+ $gender = $1;
+ }
+
+ if ($ctr eq 'DAY' or $ctr eq 'MONTH' or $str eq 'YEAR')
+ {
+ # this is a cludge to make it work with newdateformat
+ join('', '{ORDINAL{', $ctr, '}}', $_[0]);
+ }
+ else
+ {
+ join('', &getordinal($val, $gender), $_[0]);
+ }
+}
+
+sub do_cmd_storeordinal{
+ local($_) = @_;
+ local($key);
+
+ $key = &missing_braces
+ unless ((s/$next_pair_pr_rx//o)&&($key=$2));
+
+ local($ctr, $val, $id, $_) = &read_counter_value($_);
+ my($gender)='m';
+
+ $_ =~ s/${OP}$id${CP}$ctr${OP}$id${CP}//;
+
+ if ($_ =~s/\s*\[(.)\]//)
+ {
+ $gender = $1;
+ }
+
+ if ($ctr eq 'DAY' or $ctr eq 'MONTH' or $ctr eq 'YEAR')
+ {
+ # this is a cludge to make it work with newdateformat
+ $fmtcntvar{$key} = join('', '{ORDINAL{', $ctr, '}}');
+ }
+ else
+ {
+ $fmtcntvar{$key} = &getordinal($val, $gender);
+ }
+
+ $_;
+}
+
+sub do_cmd_storeordinalnum{
+ local($_) = @_;
+ local($key, $val);
+
+ $key = &missing_braces
+ unless ((s/$next_pair_pr_rx//o)&&($key=$2));
+
+ $val = &missing_braces
+ unless (s/$next_pair_pr_rx/$val=$2;''/eo);
+
+ my($gender)='m';
+
+ if ($_ =~s/\s*\[([mfn])\]//)
+ {
+ $gender = $1;
+ }
+
+ $fmtcntvar{$key} = &getordinal($val, $gender);
+
+ $_;
+}
+
+@unitthstring = ('zeroth',
+ 'first',
+ 'second',
+ 'third',
+ 'fourth',
+ 'fifth',
+ 'sixth',
+ 'seventh',
+ 'eighth',
+ 'ninth');
+
+@tenthstring = ('',
+ 'tenth',
+ 'twentieth',
+ 'thirtieth',
+ 'fortieth',
+ 'fiftieth',
+ 'sixtieth',
+ 'seventieth',
+ 'eightieth',
+ 'ninetieth');
+
+@teenthstring = ('tenth',
+ 'eleventh',
+ 'twelfth',
+ 'thirteenth',
+ 'fourteenth',
+ 'fifteenth',
+ 'sixteenth',
+ 'seventeenth',
+ 'eighteenth',
+ 'nineteenth');
+
+@unitstring = ('zero',
+ 'one',
+ 'two',
+ 'three',
+ 'four',
+ 'five',
+ 'six',
+ 'seven',
+ 'eight',
+ 'nine');
+
+@teenstring = ('ten',
+ 'eleven',
+ 'twelve',
+ 'thirteen',
+ 'fourteen',
+ 'fifteen',
+ 'sixteen',
+ 'seventeen',
+ 'eighteen',
+ 'nineteen');
+@tenstring = ('',
+ 'ten',
+ 'twenty',
+ 'thirty',
+ 'forty',
+ 'fifty',
+ 'sixty',
+ 'seventy',
+ 'eighty',
+ 'ninety');
+
+$hundredname = "hundred";
+$hundredthname = "hundredth";
+$thousandname = "thousand";
+$thousandthname = "thousandth";
+
+sub get_numberstringenglish{
+ local($num) = @_;
+ local($name)="";
+
+ unless (($num >= 1000000) || ($num < 0))
+ {
+ if ($num >= 1000)
+ {
+ local($thousands) = &get_numberstringenglish($num/1000);
+ $name .= $thousands . " $thousandname";
+ $num = $num%1000;
+ }
+
+ if ($num >= 100)
+ {
+ if ($_[0] >= 1000) { $name .= " "; }
+
+ local($hundreds) = &get_numberstringenglish($num/100);
+ $name .= $hundreds . " $hundredname";
+ $num = $num%100;
+ }
+
+ if (($_[0] > 100) && ($_[0]%100 > 0)) { $name .= " and "; }
+
+ if ($num >= 20)
+ {
+ $name .= $tenstring[$num/10];
+
+ if ($num%10 > 0) { $name .= '-'; }
+ }
+
+ if (($num >= 10) && ($num < 20))
+ {
+ $name .= $teenstring[$num%10];
+ }
+ elsif (($num%10 > 0) || ($_[0] == 0))
+ {
+ $name .= $unitstring[$num%10];
+ }
+ }
+
+ $name;
+}
+
+@unitthstringfrench = ('zeroi\`eme',
+ 'uni\`eme',
+ 'deuxi\`eme',
+ 'troisi\`eme',
+ 'quatri\`eme',
+ 'cinqui\`eme',
+ 'sixi\`eme',
+ 'septi\`eme',
+ 'huiti\`eme',
+ 'neuvi\`eme');
+
+@tenthstringfrench = ('',
+ 'dixi\`eme',
+ 'vingti\`eme',
+ 'trentri\`eme',
+ 'quaranti\`eme',
+ 'cinquanti\`eme',
+ 'soixanti\`eme',
+ 'septenti\`eme',
+ 'huitanti\`eme',
+ 'nonenti\`eme');
+
+@teenthstringfrench = ('dixi\`eme',
+ 'onzi\`eme',
+ 'douzi\`eme',
+ 'treizi\`eme',
+ 'quatorzi\`eme',
+ 'quinzi\`eme',
+ 'seizi\`eme',
+ 'dix-septi\`eme',
+ 'dix-huiti\`eme',
+ 'dix-neuvi\`eme');
+
+@unitstringfrench = ('zero',
+ 'un',
+ 'deux',
+ 'trois',
+ 'quatre',
+ 'cinq',
+ 'six',
+ 'sept',
+ 'huit',
+ 'neuf');
+
+@teenstringfrench = ('dix',
+ 'onze',
+ 'douze',
+ 'treize',
+ 'quatorze',
+ 'quinze',
+ 'seize',
+ 'dix-sept',
+ 'dix-huit',
+ 'dix-neuf');
+
+@tenstringfrench = ('',
+ 'dix',
+ 'vingt',
+ 'trente',
+ 'quarante',
+ 'cinquante',
+ 'soixante',
+ 'septante',
+ 'octante',
+ 'nonante');
+
+$hundrednamefrench = "cent";
+$hundredthnamefrench = "centi\\`eme";
+$thousandnamefrench = "mille";
+$thousandthnamefrench = "mili\\`eme";
+
+@unitthstringspanish = ('cero',
+ 'primero',
+ 'segundo',
+ 'tercero',
+ 'cuarto',
+ 'quinto',
+ 'sexto',
+ 's\\\'eptimo',
+ 'octavo',
+ 'noveno');
+
+@tenthstringspanish = ('',
+ 'd\\\'ecimo',
+ 'vig\\\'esimo',
+ 'trig\\\'esimo',
+ 'cuadrag\\\'esimo',
+ 'quincuag\\\'esimo',
+ 'sexag\\\'esimo',
+ 'septuag\\\'esimo',
+ 'octog\\\'esimo',
+ 'nonag\\\'esimo');
+
+@teenthstringspanish = ('d\\\'ecimo',
+ 'und\\\'ecimo',
+ 'duod\\\'ecimo',
+ 'decimotercero',
+ 'decimocuarto',
+ 'decimoquinto',
+ 'decimosexto',
+ 'decimos\\\'eptimo',
+ 'decimoctavo',
+ 'decimonoveno');
+
+@hundredthstringspanish = ('',
+ 'cent\\\'esimo',
+ 'ducent\\\'esimo',
+ 'tricent\\\'esimo',
+ 'cuadringent\\\'esimo',
+ 'quingent\\\'esimo',
+ 'sexcent\\\'esimo',
+ 'septing\\\'esimo',
+ 'octingent\\\'esimo',
+ 'noningent\\\'esimo');
+
+@unitstringspanish = ('cero',
+ 'uno',
+ 'dos',
+ 'tres',
+ 'cuatro',
+ 'cinco',
+ 'seis',
+ 'siete',
+ 'ocho',
+ 'nueve');
+
+@teenstringspanish = ('diez',
+ 'once',
+ 'doce',
+ 'trece',
+ 'catorce',
+ 'quince',
+ 'diecis\\\'eis',
+ 'diecisiete',
+ 'dieciocho',
+ 'diecinueve');
+
+@twentystringspanish = ('viente',
+ 'vientiuno',
+ 'vientid\\\'os',
+ 'vientitr\\\'es',
+ 'vienticuatro',
+ 'vienticinco',
+ 'vientis\\\'eis',
+ 'vientisiete',
+ 'vientiocho',
+ 'vientinueve');
+
+@tenstringspanish = ('',
+ 'diez',
+ 'viente',
+ 'treinta',
+ 'cuarenta',
+ 'cincuenta',
+ 'sesenta',
+ 'setenta',
+ 'ochenta',
+ 'noventa');
+
+@hundredstringspanish = ('',
+ 'ciento',
+ 'doscientos',
+ 'trescientos',
+ 'cuatrocientos',
+ 'quinientos',
+ 'seiscientos',
+ 'setecientos',
+ 'ochocientos',
+ 'novecientos');
+
+$hundrednamespanish = "cien";
+$hundredthnamespanish = "centi\\`eme";
+$thousandnamespanish = "mil";
+$thousandthnamespanish = "mil\\'esimo";
+
+@unitthstringportuges = ('zero',
+ 'primeiro',
+ 'segundo',
+ 'terceiro',
+ 'quatro',
+ 'quinto',
+ 'sexto',
+ 's\\\'etimo',
+ 'oitavo',
+ 'nono');
+
+@tenthstringportuges = ('',
+ 'd\\\'ecimo',
+ 'vig\\\'esimo',
+ 'trig\\\'esimo',
+ 'quadrag\\\'esimo',
+ 'q\"uinquag\\\'esimo',
+ 'sexag\\\'esimo',
+ 'setuag\\\'esimo',
+ 'octog\\\'esimo',
+ 'nonag\\\'esimo');
+
+@hundredthstringportuges = ('',
+ 'cent\\\'esimo',
+ 'ducent\\\'esimo',
+ 'trecent\\\'esimo',
+ 'quadringent\\\'esimo',
+ 'q\"uingent\\\'esimo',
+ 'seiscent\\\'esimo',
+ 'setingent\\\'esimo',
+ 'octingent\\\'esimo',
+ 'nongent\\\'esimo');
+
+@unitstringportuges = ('zero',
+ 'um',
+ 'dois',
+ 'tr\^es',
+ 'quatro',
+ 'cinco',
+ 'seis',
+ 'sete',
+ 'oito',
+ 'nove');
+
+@teenstringportuges = ('dez',
+ 'onze',
+ 'doze',
+ 'treze',
+ 'quatorze',
+ 'quinze',
+ 'dezesseis',
+ 'dezessete',
+ 'dezoito',
+ 'dezenove');
+
+@tenstringportuges = ('',
+ 'dez',
+ 'vinte',
+ 'trinta',
+ 'quaranta',
+ 'cinq\"uenta',
+ 'sessenta',
+ 'setenta',
+ 'oitenta',
+ 'noventa');
+
+@hundredstringportuges = ('',
+ 'cento',
+ 'duzentos',
+ 'trezentos',
+ 'quatrocentos',
+ 'quinhentos',
+ 'seiscentos',
+ 'setecentos',
+ 'oitocentos',
+ 'novecentos');
+
+$hundrednameportuges = "cem";
+$thousandnameportuges = "mil";
+$thousandthnameportuges = "mil\\'esimo";
+
+sub get_numberstringfrench{
+ local($num,$gender) = @_;
+ local($name)="";
+
+ if ($gender eq 'f')
+ {
+ $unitstringfrench[1] = 'une';
+ }
+ else
+ {
+ $unitstringfrench[1] = 'un';
+ }
+
+ unless (($num >= 1000000) || ($num < 0))
+ {
+ if ($num >= 1000)
+ {
+ local($thousands) = '';
+
+ if ($num >= 2000)
+ {
+ $thousands = &get_numberstringfrench($num/1000,$gender).' ';
+ }
+
+ $name .= $thousands . $thousandnamefrench;
+ $num = $num%1000;
+ }
+
+ if ($num >= 100)
+ {
+ if ($_[0] >= 1000) { $name .= " "; }
+
+ local($hundreds) = '';
+
+ if ($num >= 200)
+ {
+ $hundreds = &get_numberstringfrench($num/100,$gender).' ';
+ }
+
+ $name .= $hundreds . $hundrednamefrench;
+ $num = $num%100;
+
+ if (($_[0]%100 == 0) && ($_[0]/100 > 1))
+ {
+ $name .= 's';
+ }
+ }
+
+ if (($_[0] > 100) && ($_[0]%100 > 0)) { $name .= " "; }
+
+ if ($num >= 20)
+ {
+ if ($frenchdialect eq 'france' and $num >= 70)
+ {
+ if ($num < 80)
+ {
+ $name .= $tenstringfrench[6];
+
+ if ($num%10 == 1)
+ {
+ $name .= ' et ';
+ }
+ else
+ {
+ $name .= '-';
+ }
+
+ $num = 10+($num%10);
+ }
+ else
+ {
+ $name .= 'quatre-vingt' . ($num==80?'s':'-');
+
+ if ($num >= 90)
+ {
+ $num = 10+($num%10);
+ }
+ }
+ }
+ elsif ($frenchdialect eq 'belgian'
+ && ($num >= 80) && ($num < 90))
+ {
+ $name .= 'quatre-vingt' . ($num==80?'s':'-');
+ }
+ else
+ {
+ $name .= $tenstringfrench[$num/10];
+
+ if ($num%10 == 1) { $name .= ' et ';}
+ elsif ($num%10 > 0) { $name .= '-'; }
+ }
+ }
+
+ if (($num >= 10) && ($num < 20))
+ {
+ $name .= $teenstringfrench[$num%10];
+ }
+ elsif (($num%10 > 0) || ($_[0] == 0))
+ {
+ $name .= $unitstringfrench[$num%10];
+ }
+ }
+
+ $name;
+}
+
+sub get_numberstringspanish{
+ local($num,$gender) = @_;
+ local($name)="";
+
+ if ($gender eq 'f')
+ {
+ $unitstringspanish[1] = 'una';
+ }
+ else
+ {
+ $unitstringspanish[1] = 'uno';
+ }
+
+ unless (($num >= 1000000) || ($num < 0))
+ {
+ if ($num >= 1000)
+ {
+ local($thousands) = '';
+
+ if ($num >= 2000)
+ {
+ $thousands = &get_numberstringspanish($num/1000,$gender).' ';
+ }
+
+ $name .= $thousands . $thousandnamespanish;
+ $num = $num%1000;
+ }
+
+ if ($num >= 100)
+ {
+ if ($_[0] >= 1000) { $name .= " "; }
+
+ local($hundreds) = '';
+
+ if ($num > 100)
+ {
+ $hundreds = $hundredstringspanish[$num/100];
+ }
+ else
+ {
+ $hundreds = 'cien';
+ }
+
+ $name .= $hundreds;
+ $num = $num%100;
+ }
+
+ if (($_[0] > 100) && ($_[0]%100 > 0)) { $name .= " y "; }
+
+ if ($num >= 30)
+ {
+ $name .= $tenstringspanish[$num/10];
+
+ if ($num%10 > 0) { $name .= ' y '; }
+ }
+
+ if (($num >=20) && ($num < 30))
+ {
+ $name .= $twentystringspanish[$num%10];
+ }
+ elsif (($num >= 10) && ($num < 20))
+ {
+ $name .= $teenstringspanish[$num%10];
+ }
+ elsif (($num%10 > 0) || ($_[0] == 0))
+ {
+ $name .= $unitstringspanish[$num%10];
+ }
+ }
+
+ $name;
+}
+
+sub get_numberstringportuges{
+ local($num,$gender) = @_;
+ local($name)="";
+
+ if ($gender eq 'f')
+ {
+ $unitstringportuges[0] = 'zera';
+ $unitstringportuges[1] = 'uma';
+ $unitstringportuges[2] = 'duas';
+ }
+ else
+ {
+ $unitstringportuges[0] = 'zero';
+ $unitstringportuges[1] = 'um';
+ $unitstringportuges[2] = 'dois';
+ }
+
+ unless (($num >= 1000000) || ($num < 0))
+ {
+ if ($num >= 1000)
+ {
+ local($thousands) = '';
+
+ if ($num >= 2000)
+ {
+ $thousands = &get_numberstringportuges($num/1000,$gender).' ';
+ }
+
+ $name .= $thousands . $thousandnameportuges;
+ $num = $num%1000;
+ }
+
+ if ($num >= 100)
+ {
+ if ($_[0] >= 1000) { $name .= " "; }
+
+ local($hundreds) = '';
+
+ if ($num > 100)
+ {
+ $hundreds = $hundredstringportuges[$num/100];
+
+ if ($gender eq 'f' and $num >= 200)
+ {
+ $hundreds =~s/o(s?)$/a\1/;
+ }
+ }
+ else
+ {
+ $hundreds = $hundrednameportuges;
+ }
+
+ $name .= $hundreds;
+ $num = $num%100;
+ }
+
+ if (($_[0] > 100) && ($_[0]%100 > 0)) { $name .= " e "; }
+
+ if ($num >= 20)
+ {
+ $name .= $tenstringportuges[$num/10];
+
+ if ($num%10 == 1) { $name .= ' e ';}
+ elsif ($num%10 > 0) { $name .= ' '; }
+ }
+
+ if (($num >= 10) && ($num < 20))
+ {
+ $name .= $teenstringportuges[$num%10];
+ }
+ elsif (($num%10 > 0) || ($_[0] == 0))
+ {
+ $name .= $unitstringportuges[$num%10];
+ }
+ }
+
+ $name;
+}
+
+@unitthstringMgerman = ('nullter',
+ 'erster',
+ 'zweiter',
+ 'dritter',
+ 'vierter',
+ 'f\\"unter',
+ 'sechster',
+ 'siebter',
+ 'achter',
+ 'neunter');
+
+@tenthstringMgerman = ('',
+ 'zehnter',
+ 'zwanzigster',
+ 'drei\\ss igster',
+ 'vierzigster',
+ 'f\\"unfzigster',
+ 'sechzigster',
+ 'siebzigster',
+ 'achtzigster',
+ 'neunzigster');
+
+@teenthstringMgerman = ('zehnter',
+ 'elfter',
+ 'zw\\"olfter',
+ 'dreizehnter',
+ 'vierzehnter',
+ 'f\\"unfzehnter',
+ 'sechzehnter',
+ 'siebzehnter',
+ 'achtzehnter',
+ 'neunzehnter');
+
+@unitthstringFgerman = ('nullte',
+ 'erste',
+ 'zweite',
+ 'dritte',
+ 'vierte',
+ 'f\\"unfte',
+ 'sechste',
+ 'siebte',
+ 'achte',
+ 'neunte');
+
+@tenthstringFgerman = ('',
+ 'zehnte',
+ 'zwanzigste',
+ 'drei\\ss igste',
+ 'vierzigste',
+ 'f\\"unfzigste',
+ 'sechzigste',
+ 'siebzigste',
+ 'achtzigste',
+ 'neunzigste');
+
+@teenthstringFgerman = ('zehnte',
+ 'elfte',
+ 'zw\\"olfte',
+ 'dreizehnte',
+ 'vierzehnte',
+ 'f\\"unfzehnte',
+ 'sechzehnte',
+ 'siebzehnte',
+ 'achtzehnte',
+ 'neunzehnte');
+
+@unitthstringNgerman = ('nulltes',
+ 'erstes',
+ 'zweites',
+ 'drittes',
+ 'viertes',
+ 'f\\"unte',
+ 'sechstes',
+ 'siebtes',
+ 'achtes',
+ 'neuntes');
+
+@tenthstringNgerman = ('',
+ 'zehntes',
+ 'zwanzigstes',
+ 'drei\\ss igstes',
+ 'vierzigstes',
+ 'f\\"unfzigstes',
+ 'sechzigstes',
+ 'siebzigstes',
+ 'achtzigstes',
+ 'neunzigstes');
+
+@teenthstringNgerman = ('zehntes',
+ 'elftes',
+ 'zw\\"olftes',
+ 'dreizehntes',
+ 'vierzehntes',
+ 'f\\"unfzehntes',
+ 'sechzehntes',
+ 'siebzehntes',
+ 'achtzehntes',
+ 'neunzehntes');
+
+@unitstringgerman = ('null',
+ 'ein', # eins dealt with separately (this is for prefixes)
+ 'zwei',
+ 'drei',
+ 'vier',
+ 'f\\"unf',
+ 'sechs',
+ 'sieben',
+ 'acht',
+ 'neun');
+
+@teenstringgerman = ('zehn',
+ 'elf',
+ 'zw\\"olf',
+ 'dreizehn',
+ 'vierzehn',
+ 'f\\"unfzehn',
+ 'sechzehn',
+ 'siebzehn',
+ 'achtzehn',
+ 'neunzehn');
+
+@tenstringgerman = ('',
+ 'zehn',
+ 'zwanzig',
+ 'drei\\ss ig',
+ 'vierzig',
+ 'f\\"unfzig',
+ 'sechzig',
+ 'siebzig',
+ 'achtzig',
+ 'neunzig');
+
+sub do_cmd_einhundert{
+ local($_) = @_;
+
+ "einhundert$_";
+}
+
+sub do_cmd_eintausend{
+ local($_) = @_;
+
+ "eintausend$_";
+}
+
+sub get_numberunderhundredgerman{
+ local($num)=@_;
+ local($name)='';
+
+ if ($num == 1)
+ {
+ $name = 'eins';
+ }
+ elsif ($num < 10)
+ {
+ $name = $unitstringgerman[$num];
+ }
+ elsif ($num%10 == 0)
+ {
+ $name = $tenstringgerman[$num/10];
+ }
+ else
+ {
+ $name = join('und', $unitstringgerman[$num%10],
+ $tenstringgerman[$num/10]);
+ }
+
+ $name;
+}
+
+sub get_numberstringgerman{
+ local($orgnum,$gender) = @_;
+ local($name)="";
+
+ local($num) = $orgnum;
+
+ unless (($num >= 1000000) || ($num < 0))
+ {
+ if ($num >= 1000 and $num < 2000)
+ {
+ $name = &translate_commands("\\eintausend ");
+ }
+ elsif ($num >= 2000)
+ {
+ $name = &get_numberunderhundredgerman($num/1000)
+ . "tausend";
+ }
+
+ $num = $orgnum%1000;
+
+ if ($num >= 100 and $num < 200)
+ {
+ if ($orgnum > 1000)
+ {
+ $name .= "einhundert";
+ }
+ else
+ {
+ $name = &translate_commands("\\einhundert ");
+ }
+ }
+ elsif ($num >= 200)
+ {
+ $name .= $unitstringgerman[$num/100]."hundert";
+ }
+
+ $num = $num%100;
+
+ if ($orgnum == 0)
+ {
+ $name = 'null';
+ }
+ elsif ($num > 0)
+ {
+ $name .= &get_numberunderhundredgerman($num);
+ }
+ }
+
+ $name;
+}
+
+sub get_numberstring{
+ local($val,$gender) = @_;
+
+ if ($default_language eq 'french')
+ {
+ &get_numberstringfrench($val,$gender);
+ }
+ elsif ($default_language eq 'spanish')
+ {
+ &get_numberstringspanish($val,$gender);
+ }
+ elsif ($default_language eq 'portuges')
+ {
+ &get_numberstringportuges($val,$gender);
+ }
+ elsif ($default_language eq 'german'
+ or $default_language eq 'ngerman')
+ {
+ &get_numberstringgerman($val,$gender);
+ }
+ else
+ {
+ &get_numberstringenglish($val);
+ }
+}
+
+sub do_cmd_numberstringnum{
+ local($_) = @_;
+ local($num,$gender);
+ $num = &missing_braces unless
+ s/$next_pair_pr_rx/$num=$2;''/eo;
+
+ if (s/\[(m|f|n)\]//)
+ {
+ $gender = $1;
+ }
+ else
+ {
+ $gender = 'm';
+ }
+
+ join('', &get_numberstring($num,$gender), $_);
+}
+
+sub do_cmd_numberstring{
+ local($ctr, $val, $id, $_) = &read_counter_value($_[0]);
+ my($gender)='m';
+
+ $_[0] =~ s/${OP}$id${CP}$ctr${OP}$id${CP}//;
+
+ if ($_[0]=~s/\[(.)\]//)
+ {
+ $gender = $1;
+ }
+
+ if ($ctr eq 'DAY' or $ctr eq 'MONTH' or $ctr eq 'YEAR')
+ {
+ # this is a cludge to make it work with newdateformat
+ join('', '{NUMBERSTRING{', $ctr, '}}', $_[0]);
+ }
+ else
+ {
+ join('', &get_numberstring($val, $gender), $_[0]);
+ }
+}
+
+sub do_cmd_storenumberstring{
+ local($_) = @_;
+ local($key);
+
+ $key = &missing_braces
+ unless ((s/$next_pair_pr_rx//o)&&($key=$2));
+
+ local($ctr, $val, $id, $_) = &read_counter_value($_);
+ my($gender)='m';
+
+ $_ =~ s/${OP}$id${CP}$ctr${OP}$id${CP}//;
+
+ if ($_ =~s/\s*\[(.)\]//)
+ {
+ $gender = $1;
+ }
+
+ if ($ctr eq 'DAY' or $ctr eq 'MONTH' or $ctr eq 'YEAR')
+ {
+ # this is a cludge to make it work with newdateformat
+ $fmtcntvar{$key} = join('', '{NUMBERSTRING{', $ctr, '}}');
+ }
+ else
+ {
+ $fmtcntvar{$key} = join('', &get_numberstring($val, $gender));
+ }
+
+ $_;
+}
+
+sub do_cmd_storenumberstringnum{
+ local($_) = @_;
+ local($key, $val);
+
+ $key = &missing_braces
+ unless ((s/$next_pair_pr_rx//o)&&($key=$2));
+
+ $val = &missing_braces
+ unless (s/$next_pair_pr_rx/$val=$2;''/eo);
+
+ my($gender)='m';
+
+ if ($_ =~s/\s*\[([mfn])\]//)
+ {
+ $gender = $1;
+ }
+
+ $fmtcntvar{$key} = join('', &get_numberstring($val, $gender));
+
+ $_;
+}
+
+sub get_Numberstring{
+ local($val,$gender) = @_;
+ local($string) = &get_numberstring($val,$gender);
+
+ if ($default_language=~m/german/)
+ {
+ $string =~ s/([a-z])([^\s\-]+)/\u\1\2/;
+ }
+ else
+ {
+ $string =~ s/([a-z])([^\s\-]+)/\u\1\2/g;
+
+ if ($default_language eq 'french')
+ {
+ $string =~ s/ Et / et /g;
+ }
+ elsif ($default_language eq 'spanish')
+ {
+ $string =~ s/ Y / y /g;
+ }
+ elsif ($default_language eq 'portuges')
+ {
+ $string =~ s/ E / e /g;
+ }
+ else
+ {
+ $string =~ s/ And / and /g;
+ }
+ }
+
+ $string;
+}
+
+sub do_cmd_Numberstringnum{
+ local($_) = @_;
+ local($num,$gender);
+ $num = &missing_braces
+ unless (s/$next_pair_pr_rx/$num=$2;''/eo);
+
+ if (s/\[(m|f|n)\]//)
+ {
+ $gender = $1;
+ }
+ else
+ {
+ $gender = 'm';
+ }
+
+ join('', &get_Numberstring($num,$gender), $_);
+}
+
+sub do_cmd_Numberstring{
+ local($ctr, $val, $id, $_) = &read_counter_value($_[0]);
+ my($gender)='m';
+
+ $_[0] =~ s/${OP}$id${CP}$ctr${OP}$id${CP}//;
+
+ if ($_[0]=~s/\[(.)\]//)
+ {
+ $gender = $1;
+ }
+
+ if ($ctr eq 'DAY' or $ctr eq 'MONTH' or $ctr eq 'YEAR')
+ {
+ # this is a cludge to make it work with newdateformat
+ join('', '{NNUMBERSTRING{', $ctr, '}}', $_[0]);
+ }
+ else
+ {
+ join('', &get_Numberstring($val, $gender), $_[0]);
+ }
+}
+
+sub do_cmd_storeNumberstring{
+ local($_) = @_;
+ local($key);
+
+ $key = &missing_braces
+ unless ((s/$next_pair_pr_rx//o)&&($key=$2));
+
+ local($ctr, $val, $id, $_) = &read_counter_value($_);
+ my($gender)='m';
+
+ $_ =~ s/${OP}$id${CP}$ctr${OP}$id${CP}//;
+
+ if ($_ =~s/\s*\[([mfn])\]//)
+ {
+ $gender = $1;
+ }
+
+ if ($ctr eq 'DAY' or $ctr eq 'MONTH' or $ctr eq 'YEAR')
+ {
+ # this is a cludge to make it work with newdateformat
+ $fmtcntvar{$key} = join('', '{NNUMBERSTRING{', $ctr, '}}');
+ }
+ else
+ {
+ $fmtcntvar{$key} = join('', &get_Numberstring($val, $gender));
+ }
+
+ $_;
+}
+
+sub do_cmd_storeNumberstringnum{
+ local($_) = @_;
+ local($key, $val);
+
+ $key = &missing_braces
+ unless ((s/$next_pair_pr_rx//o)&&($key=$2));
+
+ $val = &missing_braces
+ unless (s/$next_pair_pr_rx/$val=$2;''/eo);
+
+ my($gender)='m';
+
+ if ($_ =~s/\s*\[([mfn])\]//)
+ {
+ $gender = $1;
+ }
+
+ $fmtcntvar{$key} = join('', &get_Numberstring($val, $gender));
+
+ $_;
+}
+
+sub do_cmd_NUMBERstringnum{
+ local($_) = @_;
+ local($num,$gender);
+ $num = &missing_braces
+ unless (s/$next_pair_pr_rx/$num=$2;''/eo);
+
+ if (s/\[(m|f|n)\]//)
+ {
+ $gender = $1;
+ }
+ else
+ {
+ $gender = 'm';
+ }
+
+ join('', uc(&get_numberstring($num,$gender)), $_);
+}
+
+sub do_cmd_NUMBERstring{
+ local($ctr, $val, $id, $_) = &read_counter_value($_[0]);
+ my($gender)='m';
+
+ $_[0] =~ s/${OP}$id${CP}$ctr${OP}$id${CP}//;
+
+ if ($_[0]=~s/\[(.)\]//)
+ {
+ $gender = $1;
+ }
+
+ if ($ctr eq 'DAY' or $ctr eq 'MONTH' or $ctr eq 'YEAR')
+ {
+ # this is a cludge to make it work with newdateformat
+ join('', '{CAPNUMBERSTRING{', $ctr, '}}', $_);
+ }
+ else
+ {
+ join('', uc(&get_numberstring($val, $gender)), $_);
+ }
+}
+
+sub do_cmd_storeNUMBERstring{
+ local($_) = @_;
+ local($key);
+
+ $key = &missing_braces
+ unless ((s/$next_pair_pr_rx//o)&&($key=$2));
+
+ local($ctr, $val, $id, $_) = &read_counter_value($_);
+ my($gender)='m';
+
+ $_ =~ s/${OP}$id${CP}$ctr${OP}$id${CP}//;
+
+ if ($_ =~s/\s*\[(.)\]//)
+ {
+ $gender = $1;
+ }
+
+ if ($ctr eq 'DAY' or $ctr eq 'MONTH' or $ctr eq 'YEAR')
+ {
+ # this is a cludge to make it work with newdateformat
+ $fmtcntvar{$key} = join('', '{CAPNUMBERSTRING{', $ctr, '}}');
+ }
+ else
+ {
+ $fmtcntvar{$key} = uc(&get_numberstring($val, $gender));
+ }
+
+ $_;
+}
+
+sub do_cmd_storeNUMBERstringnum{
+ local($_) = @_;
+ local($key, $val);
+
+ $key = &missing_braces
+ unless ((s/$next_pair_pr_rx//o)&&($key=$2));
+
+ $val = &missing_braces
+ unless (s/$next_pair_pr_rx/$val=$2;''/eo);
+
+ my($gender)='m';
+
+ if ($_ =~s/\s*\[([mfn])\]//)
+ {
+ $gender = $1;
+ }
+
+ $fmtcntvar{$key} = uc(&get_numberstring($val, $gender));
+
+ $_;
+}
+
+sub get_ordinalstringenglish{
+ local($num) = @_;
+ local($name)="";
+
+ unless (($num >= 1000000) || ($num < 0))
+ {
+ if ($num >= 1000)
+ {
+ local($thousands) = &get_numberstring($num/1000);
+ $name .= $thousands;
+
+ if ($num%1000 > 0)
+ {
+ $name .= " $thousandname";
+ }
+ else
+ {
+ $name .= " $thousandthname";
+ }
+
+ $num = $num%1000;
+ }
+
+ if ($num >= 100)
+ {
+ if ($_[0] >= 1000) { $name .= " "; }
+
+ local($hundreds) = &get_numberstring($num/100);
+ $name .= $hundreds;
+
+ if ($num%100 > 0)
+ {
+ $name .= " $hundredname";
+ }
+ else
+ {
+ $name .= " $hundredthname";
+ }
+
+ $num = $num%100;
+ }
+
+ if (($_[0] > 100) && ($_[0]%100 > 0)) { $name .= " and "; }
+
+ if ($num >= 20)
+ {
+ if ($num%10 > 0)
+ {
+ $name .= $tenstring[$num/10] . '-';
+ }
+ else
+ {
+ $name .= $tenthstring[$num/10];
+ }
+ }
+
+ if (($num >= 10) && ($num < 20))
+ {
+ $name .= $teenthstring[$num%10];
+ }
+ elsif (($num%10 > 0) || ($_[0] == 0))
+ {
+ $name .= $unitthstring[$num%10];
+ }
+ }
+
+ $name;
+}
+
+sub get_ordinalstringfrench{
+ local($num,$gender) = @_;
+ local($name)="";
+
+ unless (($num >= 1000000) || ($num < 0))
+ {
+ if ($num >= 1000)
+ {
+ local($thousands) = '';
+
+ if ($num >= 2000)
+ {
+ $thousands = &get_numberstringfrench($num/1000,$gender).' ';
+ }
+
+ $num = $num%1000;
+
+ if ($num > 0)
+ {
+ $name .= $thousands . $thousandnamefrench;
+ }
+ else
+ {
+ $name .= $thousands . $thousandthnamefrench;
+ }
+ }
+
+ if ($num >= 100)
+ {
+ if ($_[0] >= 1000) { $name .= " "; }
+
+ local($hundreds) = '';
+
+ if ($num >= 200)
+ {
+ $hundreds = &get_numberstringfrench($num/100,$gender).' ';
+ }
+
+ $num = $num%100;
+
+ if ($num > 0)
+ {
+ $name .= $hundreds . $hundrednamefrench;
+ }
+ else
+ {
+ $name .= $hundreds . $hundredthnamefrench;
+ }
+ }
+
+ if (($_[0] > 100) && ($_[0]%100 > 0)) { $name .= " "; }
+
+ if ($num >= 20)
+ {
+ if ($frenchdialect eq 'france' and $num >= 70)
+ {
+ if ($num < 80)
+ {
+ if ($num%10 > 0)
+ {
+ $name .= $tenstringfrench[6];
+ }
+ else
+ {
+ $name .= $tenthstringfrench[6];
+ }
+
+ if ($num%10 == 1)
+ {
+ $name .= ' et ';
+ }
+ else
+ {
+ $name .= '-';
+ }
+
+ $num = 10+($num%10);
+ }
+ else
+ {
+ $name .= 'quatre-vingt' . ($num==80?'i\`eme':'-');
+
+ if ($num >= 90)
+ {
+ $num = 10+($num%10);
+ }
+ }
+ }
+ elsif ($frenchdialect eq 'belgian' and $num >= 80)
+ {
+ $name .= 'quatre-vingt' . ($num==80?'i\`eme':'-');
+
+ if ($num >= 90)
+ {
+ $num = 10+($num%10);
+ }
+ }
+ else
+ {
+ if ($num%10 > 0)
+ {
+ $name .= $tenstringfrench[$num/10];
+ }
+ else
+ {
+ $name .= $tenthstringfrench[$num/10];
+ }
+
+ if ($num%10 == 1) { $name .= ' et ';}
+ elsif ($num%10 > 0) { $name .= '-'; }
+ }
+ }
+
+ if (($num >= 10) && ($num < 20))
+ {
+ $name .= $teenthstringfrench[$num%10];
+ }
+ elsif ($_[0] == 1)
+ {
+ $name = 'premi\`ere';
+ }
+ elsif (($num%10 > 0) || ($_[0] == 0))
+ {
+ $name .= $unitthstringfrench[$num%10];
+ }
+ }
+
+ $name;
+}
+
+sub get_ordinalstringspanish{
+ local($num,$gender) = @_;
+ local($name)="";
+ local($str);
+
+ unless (($num >= 1000000) || ($num < 0))
+ {
+ if ($num >= 1000)
+ {
+ if ($num >= 2000)
+ {
+ local($thousands) = &get_ordinalstringspanish($num/1000);
+
+ if ($gender eq 'f')
+ {
+ $thousands =~s/o(s?)$/a\1/;
+ }
+
+ $name .= $thousands. " ";
+ }
+ else
+ {
+ $name = "";
+ }
+
+ $name .= "$thousandthnamespanish";
+
+ if ($gender eq 'f')
+ {
+ $name =~s/o$/a/;
+ }
+
+ $num = $num%1000;
+ }
+
+ if ($num >= 100)
+ {
+ if ($_[0] >= 1000) { $name .= " "; }
+
+ local($hundreds) = $hundredthstringspanish[$num/100];
+
+ if ($gender eq 'f')
+ {
+ $hundreds =~s/o$/a/;
+ }
+
+ $name .= $hundreds;
+
+ $num = $num%100;
+ }
+
+ if (($_[0] > 100) && ($_[0]%100 > 0)) { $name .= " "; }
+
+ local($lastbit)="";
+
+ if ($num >= 20)
+ {
+ $lastbit = $tenthstringspanish[$num/10];
+
+ if ($num%10 > 0)
+ {
+ $lastbit .= ' ';
+ }
+
+ if ($gender eq 'f')
+ {
+ $lastbit =~s/o([ s]*)$/a\1/;
+ }
+
+ $name .= $lastbit;
+
+ $lastbit = "";
+ }
+
+ if (($num >= 10) && ($num < 20))
+ {
+ $lastbit = $teenthstringspanish[$num%10];
+ }
+ elsif (($num%10 > 0) || ($_[0] == 0))
+ {
+ $lastbit = $unitthstringspanish[$num%10];
+ }
+
+ if ($gender eq 'f')
+ {
+ $lastbit =~s/o([ s]*)$/a\1/;
+ }
+
+ $name .= $lastbit;
+ }
+
+ $name;
+}
+
+sub get_ordinalstringportuges{
+ local($num,$gender) = @_;
+ local($name)="";
+ local($str);
+
+ unless (($num >= 1000000) || ($num < 0))
+ {
+ if ($num >= 1000)
+ {
+ if ($num >= 2000)
+ {
+ local($thousands) = &get_ordinalstringportuges($num/1000);
+
+ if ($gender eq 'f')
+ {
+ $thousands =~s/o(s?)$/a\1/;
+ }
+
+ $name .= $thousands. " ";
+ }
+ else
+ {
+ $name = "";
+ }
+
+ $name .= "$thousandthnameportuges";
+
+ if ($gender eq 'f')
+ {
+ $name =~s/o$/a/;
+ }
+
+ $num = $num%1000;
+ }
+
+ if ($num >= 100)
+ {
+ if ($_[0] >= 1000) { $name .= " "; }
+
+ local($hundreds) = $hundredthstringportuges[$num/100];
+
+ if ($gender eq 'f')
+ {
+ $hundreds =~s/o$/a/;
+ }
+
+ $name .= $hundreds;
+
+ $num = $num%100;
+ }
+
+ if (($_[0] > 100) && ($_[0]%100 > 0)) { $name .= "-"; }
+
+ local($lastbit)="";
+
+ if ($num >= 10)
+ {
+ $lastbit = $tenthstringportuges[$num/10];
+
+ if ($num%10 > 0)
+ {
+ $lastbit .= '-';
+ }
+
+ if ($gender eq 'f')
+ {
+ $lastbit =~s/o([ s]*)$/a\1/;
+ }
+
+ $name .= $lastbit;
+
+ $lastbit = "";
+ }
+
+ if (($num%10 > 0) || ($_[0] == 0))
+ {
+ $lastbit = $unitthstringportuges[$num%10];
+ }
+
+ if ($gender eq 'f')
+ {
+ $lastbit =~s/o([ s]*)$/a\1/;
+ }
+
+ $name .= $lastbit;
+ }
+
+ $name;
+}
+
+sub get_numberunderhundredthgerman{
+ local($num,$gender)=@_;
+ local($name)='';
+
+ if ($num < 10)
+ {
+ if ($gender eq 'F')
+ {
+ $name = $unitthstringFgerman[$num];
+ }
+ elsif ($gender eq 'N')
+ {
+ $name = $unitthstringNgerman[$num];
+ }
+ else
+ {
+ $name = $unitthstringMgerman[$num];
+ }
+ }
+ elsif ($num%10 == 0)
+ {
+ if ($gender eq 'F')
+ {
+ $name = $tenthstringFgerman[$num/10];
+ }
+ elsif ($gender eq 'N')
+ {
+ $name = $tenthstringNgerman[$num/10];
+ }
+ else
+ {
+ $name = $tenthstringMgerman[$num/10];
+ }
+ }
+ else
+ {
+ local($tenth);
+ if ($gender eq 'F')
+ {
+ $tenth = $tenthstringFgerman[$num/10];
+ }
+ elsif ($gender eq 'N')
+ {
+ $tenth = $tenthstringNgerman[$num/10];
+ }
+ else
+ {
+ $tenth = $tenthstringMgerman[$num/10];
+ }
+
+ $name = join('und', $unitstringgerman[$num%10], $tenth);
+ }
+
+ $name;
+}
+
+sub get_ordinalstringgerman{
+ local($orgnum,$gender) = @_;
+ local($name)="";
+ local($suffix)='';
+
+ $gender = uc($gender);
+
+ if ($gender eq 'F')
+ {
+ $suffix = 'ste';
+ }
+ elsif ($gender eq 'N')
+ {
+ $suffix = 'stes';
+ }
+ else
+ {
+ $suffix = 'ster';
+ $gender = 'M';
+ }
+
+ local($num) = $orgnum;
+
+ unless (($num >= 1000000) || ($num < 0))
+ {
+ if ($num >= 1000 and $num < 2000)
+ {
+ $name = &translate_commands("\\eintausend ");
+ }
+ elsif ($num >= 2000)
+ {
+ $name = &get_numberunderhundredgerman($num/1000)
+ . "tausend";
+ }
+
+ $num = $orgnum%1000;
+
+ # is that it or is there more?
+ if ($orgnum >= 1000 and $num == 0)
+ {
+ $name .= $suffix;
+ return $name;
+ }
+
+ if ($num >= 100 and $num < 200)
+ {
+ if ($orgnum > 1000)
+ {
+ $name .= "einhundert";
+ }
+ else
+ {
+ $name = &translate_commands("\\einhundert ");
+ }
+ }
+ elsif ($num >= 200)
+ {
+ $name .= $unitstringgerman[$num/100]."hundert";
+ }
+
+ $num = $num%100;
+
+ # is that it or is there more?
+ if ($orgnum >= 100 and $num == 0)
+ {
+ $name .= $suffix;
+ return $name;
+ }
+
+ if ($orgnum == 0)
+ {
+ if ($gender eq 'F')
+ {
+ $name = $unitthstringFgerman[0];
+ }
+ elsif ($gender eq 'N')
+ {
+ $name = $unitthstringNgerman[0];
+ }
+ else
+ {
+ $name = $unitthstringMgerman[0];
+ }
+ }
+ elsif ($num > 0)
+ {
+ $name .= &get_numberunderhundredthgerman($num,$gender);
+ }
+ }
+
+ $name;
+}
+
+sub get_ordinalstring{
+ local($val,$gender) = @_;
+
+ if ($default_language eq 'french')
+ {
+ &get_ordinalstringfrench($val,$gender);
+ }
+ elsif ($default_language eq 'spanish')
+ {
+ &get_ordinalstringspanish($val,$gender);
+ }
+ elsif ($default_language eq 'portuges')
+ {
+ &get_ordinalstringportuges($val,$gender);
+ }
+ elsif ($default_language eq 'german'
+ or $default_language eq 'ngerman')
+ {
+ &get_ordinalstringgerman($val,$gender);
+ }
+ else
+ {
+ &get_ordinalstringenglish($val);
+ }
+}
+
+sub do_cmd_ordinalstringnum{
+ local($_) = @_;
+ local($num,$gender);
+ $num = &missing_braces
+ unless (s/$next_pair_pr_rx/$num=$2;''/eo);
+
+ if (s/\[(m|f|n)\]//)
+ {
+ $gender = $1;
+ }
+ else
+ {
+ $gender = 'm';
+ }
+
+ join('', &get_ordinalstring($num,$gender), $_);
+}
+
+sub do_cmd_ordinalstring{
+ local($ctr, $val, $id, $_) = &read_counter_value($_[0]);
+ my($gender)='m';
+
+ $_[0] =~ s/${OP}$id${CP}$ctr${OP}$id${CP}//;
+
+ if ($_[0]=~s/\[(.)\]//)
+ {
+ $gender = $1;
+ }
+
+ if ($ctr eq 'DAY' or $ctr eq 'MONTH' or $ctr eq 'YEAR')
+ {
+ # this is a cludge to make it work with newdateformat
+ join('', '{ORDINALSTRING{', $ctr, '}}', $_);
+ }
+ else
+ {
+ join('', &get_ordinalstring($val, $gender), $_);
+ }
+}
+
+ %fmtcntvar = ();
+
+sub do_cmd_FMCuse{
+ local($_) = @_;
+ local($key);
+
+ $key = &missing_braces
+ unless ((s/$next_pair_pr_rx//o)&&($key=$2));
+
+ $fmtcntvar{$key}.$_;
+}
+
+sub do_cmd_storeordinalstring{
+ local($_) = @_;
+ local($key);
+
+ $key = &missing_braces
+ unless ((s/$next_pair_pr_rx//o)&&($key=$2));
+
+ local($ctr, $val, $id, $_) = &read_counter_value($_);
+ my($gender)='m';
+
+ $_ =~ s/${OP}$id${CP}$ctr${OP}$id${CP}//;
+
+ if ($_ =~s/\s*\[(.)\]//)
+ {
+ $gender = $1;
+ }
+
+ if ($ctr eq 'DAY' or $ctr eq 'MONTH' or $ctr eq 'YEAR')
+ {
+ # this is a cludge to make it work with newdateformat
+ $fmtcntvar{$key} = join('', '{ORDINALSTRING{', $ctr, '}}');
+ }
+ else
+ {
+ $fmtcntvar{$key} = join('', &get_ordinalstring($val, $gender));
+ }
+
+ $_;
+}
+
+sub do_cmd_storeordinalstringnum{
+ local($_) = @_;
+ local($key, $val);
+
+ $key = &missing_braces
+ unless ((s/$next_pair_pr_rx//o)&&($key=$2));
+
+ $val = &missing_braces
+ unless (s/$next_pair_pr_rx/$val=$2;''/eo);
+
+ my($gender)='m';
+
+ if ($_ =~s/\s*\[(.)\]//)
+ {
+ $gender = $1;
+ }
+
+ $fmtcntvar{$key} = join('', &get_ordinalstring($val, $gender));
+
+ $_;
+}
+
+sub get_Ordinalstring{
+ local($val,$gender) = @_;
+ local($string) = &get_ordinalstring($val,$gender);
+
+ if ($default_language=~m/german/)
+ {
+ $string =~ s/\b([a-z])([^\s\-]+)/\u\1\2/;
+ }
+ else
+ {
+ $string =~ s/\b([a-z])([^\s\-]+)/\u\1\2/g;
+
+ if ($default_language eq 'french')
+ {
+ $string =~ s/ Et / et /g;
+ }
+ else
+ {
+ $string =~ s/ And / and /g;
+ }
+ }
+
+ $string;
+}
+
+sub do_cmd_Ordinalstringnum{
+ local($_) = @_;
+ local($num,$gender);
+ $num = &missing_braces
+ unless (s/$next_pair_pr_rx/$num=$2;''/eo);
+
+ if (s/\[(m|f|n)\]//)
+ {
+ $gender = $1;
+ }
+ else
+ {
+ $gender = 'm';
+ }
+
+ join('', &get_Ordinalstring($num,$gender), $_);
+}
+
+sub do_cmd_Ordinalstring{
+ local($ctr, $val, $id, $_) = &read_counter_value($_[0]);
+ my($gender)='m';
+
+ $_[0] =~ s/${OP}$id${CP}$ctr${OP}$id${CP}//;
+
+ if ($_[0]=~s/\[(.)\]//)
+ {
+ $gender = $1;
+ }
+
+ if ($ctr eq 'DAY' or $ctr eq 'MONTH' or $ctr eq 'YEAR')
+ {
+ # this is a cludge to make it work with newdateformat
+ join('', '{OORDINALSTRING{', $ctr, '}}', $_[0]);
+ }
+ else
+ {
+ join('', &get_Ordinalstring($val, $gender), $_[0]);
+ }
+}
+
+sub do_cmd_storeOrdinalstring{
+ local($_) = @_;
+ local($key);
+
+ $key = &missing_braces
+ unless ((s/$next_pair_pr_rx//o)&&($key=$2));
+
+ local($ctr, $val, $id, $_) = &read_counter_value($_);
+ my($gender)='m';
+
+ $_ =~ s/${OP}$id${CP}$ctr${OP}$id${CP}//;
+
+ if ($_ =~s/\s*\[(.)\]//)
+ {
+ $gender = $1;
+ }
+
+ if ($ctr eq 'DAY' or $ctr eq 'MONTH' or $ctr eq 'YEAR')
+ {
+ # this is a cludge to make it work with newdateformat
+ $fmtcntvar{$key} = join('', '{OORDINALSTRING{', $ctr, '}}');
+ }
+ else
+ {
+ $fmtcntvar{$key} = join('', &get_Ordinalstring($val, $gender));
+ }
+
+ $_;
+}
+
+sub do_cmd_storeOrdinalstringnum{
+ local($_) = @_;
+ local($key, $val);
+
+ $key = &missing_braces
+ unless ((s/$next_pair_pr_rx//o)&&($key=$2));
+
+ $val = &missing_braces
+ unless (s/$next_pair_pr_rx/$val=$2;''/eo);
+
+ my($gender)='m';
+
+ if ($_ =~s/\s*\[(.)\]//)
+ {
+ $gender = $1;
+ }
+
+ $fmtcntvar{$key} = join('', &get_Ordinalstring($val, $gender));
+
+ $_;
+}
+
+sub do_cmd_ORDINALstringnum{
+ local($_) = @_;
+ local($num,$gender);
+ $num = &missing_braces
+ unless (s/$next_pair_pr_rx/$num=$2;''/eo);
+
+ if (s/\[(m|f|n)\]//)
+ {
+ $gender = $1;
+ }
+ else
+ {
+ $gender = 'm';
+ }
+
+ join('', uc(&get_ordinalstring($num,$gender)), $_);
+}
+
+sub do_cmd_ORDINALstring{
+ local($ctr, $val, $id, $_) = &read_counter_value($_[0]);
+ my($gender)='m';
+
+ $_[0] =~ s/${OP}$id${CP}$ctr${OP}$id${CP}//;
+
+ if ($_[0]=~s/\[(.)\]//)
+ {
+ $gender = $1;
+ }
+
+ if ($ctr eq 'DAY' or $ctr eq 'MONTH' or $ctr eq 'YEAR')
+ {
+ # this is a cludge to make it work with newdateformat
+ join('', '{CAPORDINALSTRING{', $ctr, '}}', $_);
+ }
+ else
+ {
+ join('', uc(&get_ordinalstring($val, $gender)), $_);
+ }
+}
+
+sub do_cmd_storeORDINALstring{
+ local($_) = @_;
+ local($key);
+
+ $key = &missing_braces
+ unless ((s/$next_pair_pr_rx//o)&&($key=$2));
+
+ local($ctr, $val, $id, $_) = &read_counter_value($_);
+ my($gender)='m';
+
+ $_ =~ s/${OP}$id${CP}$ctr${OP}$id${CP}//;
+
+ if ($_ =~s/\s*\[(.)\]//)
+ {
+ $gender = $1;
+ }
+
+ if ($ctr eq 'DAY' or $ctr eq 'MONTH' or $ctr eq 'YEAR')
+ {
+ # this is a cludge to make it work with newdateformat
+ $fmtcntvar{$key} = join('', '{CAPORDINALSTRING{', $ctr, '}}');
+ }
+ else
+ {
+ $fmtcntvar{$key} = uc(&get_ordinalstring($val, $gender));
+ }
+
+ $_;
+}
+
+sub do_cmd_storeORDINALstringnum{
+ local($_) = @_;
+ local($key, $val);
+
+ $key = &missing_braces
+ unless ((s/$next_pair_pr_rx//o)&&($key=$2));
+
+ $val = &missing_braces
+ unless (s/$next_pair_pr_rx/$val=$2;''/eo);
+
+ my($gender)='m';
+
+ if ($_ =~s/\s*\[(.)\]//)
+ {
+ $gender = $1;
+ }
+
+ $fmtcntvar{$key} = uc(&get_ordinalstring($val, $gender));
+
+ $_;
+}
+
+sub do_cmd_fmtcountsetoptions{
+ local($_) = @_;
+ local($options) = &missing_braces unless ($_[0]=~(s/$next_pair_pr_rx//o)&&($options=$2));
+
+ if ($options =~ m/french=?(\w*)(,|$)/)
+ {
+ if ($1 eq 'france' or $1 eq 'swiss' or $1 eq 'belgian')
+ {
+ $frenchdialect = $1;
+
+ print "Using French dialect: $1" if ($VERBOSITY > 0) ;
+ }
+ elsif ($1 eq '')
+ {
+ $frenchdialect = 'france';
+
+ print "Using French dialect: france" if ($VERBOSITY > 0);
+ }
+ else
+ {
+ &write_warnings("unknown french dialect '$1'");
+ }
+ }
+
+ if ($options =~ m/abbrv=?(\w*)(,|$)/)
+ {
+ if ($1 eq 'true' or $1 eq '')
+ {
+ $ordinalabbrv = 1;
+
+ print "Setting abbrv=true" if ($VERBOSITY > 0);
+ }
+ elsif ($1 eq 'false')
+ {
+ $ordinalabbrv = 0;
+
+ print "Setting abbrv=false" if ($VERBOSITY > 0);
+ }
+ else
+ {
+ &write_warnings("fmtcountsetoptions key abbrv: unknown value '$1'.");
+ }
+ }
+
+ if ($options =~ m/fmtord=(\w*)(,|$)/)
+ {
+ if ($1 eq 'raise')
+ {
+ &do_fmtcount_raise();
+
+ print "Using raised ordinals" if ($VERBOSITY > 0);
+ }
+ elsif ($1 eq 'level')
+ {
+ &do_fmtcount_level();
+
+ print "Using level ordinals" if ($VERBOSITY > 0);
+ }
+ elsif ($1 eq 'user')
+ {
+ # do nothing
+
+ print "Using user defined fmtord" if ($VERBOSITY > 0);
+ }
+ else
+ {
+ &write_warnings("unknown fmtcount option fmtord=$1");
+ }
+ }
+
+ $_[0];
+}
+
+$padzeroes = 0;
+
+sub do_cmd_padzeroes{
+ local($_) = @_;
+ local($val,$pat) = &get_next_optional_argument;
+
+ if ($val eq '')
+ {
+ $padzeroes = 17;
+ }
+ else
+ {
+ $padzeroes = $val;
+ }
+
+ $_;
+}
+
+sub get_binary{
+ local($num) = @_;
+ local($val) = "";
+
+ for (my $i=17; $i>=0; $i--)
+ {
+ if (($i < $padzeroes) || ($num & (1 << $i)) || !($val eq ""))
+ {
+ $val .= ($num & (1 << $i) ? 1 : 0);
+ }
+ }
+
+ $val;
+}
+
+sub do_cmd_binary{
+ local($ctr, $val, $id, $_) = &read_counter_value($_[0]);
+
+ join('', &get_binary($val), $_);
+}
+
+sub do_cmd_binarynum{
+ local($_) = @_;
+ local($num) = &missing_braces
+ unless (s/$next_pair_pr_rx/$num=$2;''/eo);
+
+ join('', &get_binary($num), $_);
+}
+
+sub get_decimal{
+ local($num) = @_;
+
+ sprintf "%0${padzeroes}d", $num;
+}
+
+sub do_cmd_decimal{
+ local($ctr, $val, $id, $_) = &read_counter_value($_[0]);
+
+ join('', &get_decimal($val), $_);
+}
+
+sub do_cmd_decimalnum{
+ local($_) = @_;
+ local($num) = &missing_braces
+ unless (s/$next_pair_pr_rx/$num=$2;''/eo);
+
+ join('', &get_decimal($num), $_);
+}
+
+sub get_hexadecimal{
+ local($num) = @_;
+
+ sprintf "%0${padzeroes}lx", $num;
+}
+
+sub do_cmd_hexadecimal{
+ local($ctr, $val, $id, $_) = &read_counter_value($_[0]);
+
+ join('', &get_hexadecimal($val), $_);
+}
+
+sub do_cmd_hexadecimalnum{
+ local($_) = @_;
+ local($num) = &missing_braces
+ unless (s/$next_pair_pr_rx/$num=$2;''/eo);
+
+ join('', &get_hexadecimal($num), $_);
+}
+
+sub get_Hexadecimal{
+ local($num) = @_;
+
+ sprintf "%0${padzeroes}lX", $num;
+}
+
+sub do_cmd_Hexadecimal{
+ local($ctr, $val, $id, $_) = &read_counter_value($_[0]);
+
+ join('', &get_Hexadecimal($val), $_);
+}
+
+sub do_cmd_Hexadecimalnum{
+ local($_) = @_;
+ local($num) = &missing_braces
+ unless (s/$next_pair_pr_rx/$num=$2;''/eo);
+
+ join('', &get_Hexadecimal($num), $_);
+}
+
+sub get_octal{
+ local($num) = @_;
+
+ sprintf "%0${padzeroes}lo", $num;
+}
+
+sub do_cmd_octal{
+ local($ctr, $val, $id, $_) = &read_counter_value($_[0]);
+
+ join('', &get_octal($val), $_);
+}
+
+sub do_cmd_octalnum{
+ local($_) = @_;
+ local($num) = &missing_braces
+ unless (s/$next_pair_pr_rx/$num=$2;''/eo);
+
+ join('', &get_octal($num), $_);
+}
+
+sub get_aaalph{
+ local($num) = @_;
+ local($rep) = int($num/26) + 1;
+ local($c) = chr(ord('a')-1+$num%26);
+
+ local($_) = $c x $rep;
+}
+
+sub do_cmd_aaalph{
+ local($ctr, $val, $id, $_) = &read_counter_value($_[0]);
+
+ join('', &get_aaalph($val), $_);
+}
+
+sub get_AAAlph{
+ local($num) = @_;
+ local($rep) = int($num/26) + 1;
+ local($c) = chr(ord('A')-1+$num%26);
+
+ local($_) = $c x $rep;
+}
+
+sub do_cmd_AAAlph{
+ local($ctr, $val, $id, $_) = &read_counter_value($_[0]);
+
+ join('', &get_AAAlph($val), $_);
+}
+
+sub do_cmd_aaalphnum{
+ local($_) = @_;
+ local($num) = &missing_braces
+ unless (s/$next_pair_pr_rx/$num=$2;''/eo);
+
+ join('', (sprintf "%${padzeroes}s", &get_aaalph($num)), $_);
+}
+
+sub do_cmd_AAAlphnum{
+ local($_) = @_;
+ local($num) = &missing_braces
+ unless (s/$next_pair_pr_rx/$num=$2;''/eo);
+
+ join('', uc(sprintf "%${padzeroes}s", &get_aaalph($num)), $_);
+}
+
+sub get_abalph{
+ local($num) = @_;
+ local($str);
+
+ if ($num == 0)
+ {
+ $str = '';
+ }
+ elsif ($num > 0 && $num <= 26)
+ {
+ $str = chr(ord('a')-1+$num);
+ }
+ else
+ {
+ $str = &get_abalph(int($num/26)) . chr(ord('a')-1+($num%26));
+ }
+
+ $str;
+}
+
+sub do_cmd_abalph{
+ local($ctr, $val, $id, $_) = &read_counter_value($_[0]);
+
+ join('', (sprintf "%${padzeroes}s", &get_abalph($val)), $_);
+}
+
+sub do_cmd_abalphnum{
+ local($_) = @_;
+ local($num) = &missing_braces
+ unless (s/$next_pair_pr_rx/$num=$2;''/eo);
+
+ join('', (sprintf "%${padzeroes}s", &get_abalph($num)), $_);
+}
+
+sub do_cmd_ABAlph{
+ local($ctr, $val, $id, $_) = &read_counter_value($_[0]);
+
+ join('', uc(sprintf "%${padzeroes}s", &get_abalph($val)), $_);
+}
+
+sub do_cmd_ABAlphnum{
+ local($_) = @_;
+ local($num) = &missing_braces
+ unless (s/$next_pair_pr_rx/$num=$2;''/eo);
+
+ join('', uc(sprintf "%${padzeroes}s", &get_abalph($num)), $_);
+}
+
+sub get_twodigit{
+ local($num) = @_;
+
+ sprintf "%02d", $num;
+}
+
+sub do_cmd_twodigit{
+ local($_) = @_;
+ local($num) = &missing_braces
+ unless (s/$next_pair_pr_rx/$num=$2;''/eo);
+
+ # this is a cludge
+ if ($num eq "THEDAY" or $num eq "THEYEAR" or $num eq "THEMONTH")
+ {
+ join('', 'TWODIGIT{', $num, '}', $_);
+ }
+ else
+ {
+ join('', &get_twodigit($num), $_);
+ }
+}
+
+# this was put here to help with the definition of \datelatin
+
+sub do_cmd_romannumeral{
+ local($_) = @_;
+ local($num) = &missing_braces
+ unless (s/$next_pair_pr_rx/$num=$2;''/eo);
+
+ # this is a cludge
+ if ($num eq "THEDAY" or $num eq "THEYEAR" or $num eq "THEMONTH")
+ {
+ join('', 'ROMANNUMERAL{', $num, '}', $_);
+ }
+ else
+ {
+ join('', &froman($num), $_);
+ }
+}
+
+# load configuration file if it exists
+# Note: The configuration file should be loaded before
+# the package options are executed.
+
+# why doesn't this work? If I call this subroutine it
+# causes an infinite loop.
+
+sub load_fmtcount_cfg{
+ local($file,$found);
+
+ $file = &fulltexpath('fmtcount.cfg');
+
+ $found = (-f $file);
+
+ if (!$found)
+ {
+ foreach $texpath (split /$envkey/, $TEXINPUTS)
+ {
+ $file = "$texpath${dd}fmtcount.cfg";
+
+ last if ($found = (-f $file));
+ }
+ }
+
+ if ($found)
+ {
+ print "\nusing configuration file $file\n";
+
+ &slurp_input($file);
+ &pre_process;
+ &substitute_meta_cmds if (%new_command || %new_environment);
+ &wrap_shorthand_environments;
+ $_ = &translate_commands(&translate_environments($_));
+
+ print "\n processed size: ".length($_)."\n" if ($VERBOSITY>1)
+ }
+ else
+ {
+ print "\nNo configuation file fmtcount.cfg found\n" if ($VERBOSITY>1)
+ }
+}
+
+1;