%\iffalse
% fmtcount.dtx generated using makedtx version 0.94b (c) Nicola Talbot
% Command line args:
%   -macrocode "fmtcount.perl"
%   -setambles "fmtcount.perl=>\nopreamble\nopostamble"
%   -comment "fmtcount.perl"
%   -src "(.+)\.(def)=>\1.\2"
%   -src "(.+)\.(sty)=>\1.\2"
%   -src "(fmtcount\.perl)=>\1"
%   -doc "manual.tex"
%   -author "Nicola Talbot"
%   -dir "source"
%   fmtcount
% Created on 2007/8/20 12:28
%\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) 2007 Nicola Talbot, all rights reserved.
% \fi
% \iffalse
%<*driver>
\documentclass{ltxdoc}

\usepackage{color}
\usepackage[colorlinks,
            bookmarks,
            bookmarksopen,
            pdfauthor={Nicola L.C. Talbot},
            pdftitle={fmtcount.sty: Displaying the Values of LaTeX Counters},
            pdfkeywords={LaTeX,counter}]{hyperref}

\definecolor{defbackground}{rgb}{1,1,0.75}
\newsavebox\defsbox
\newlength\defwidth
\newenvironment{definition}{%
\setlength{\fboxsep}{4pt}\setlength{\fboxrule}{1.25pt}%
\begin{lrbox}{\defsbox}%
\setlength\defwidth\linewidth
\addtolength\defwidth{-2\fboxrule}%
\addtolength\defwidth{-2\fboxsep}%
\begin{minipage}{\defwidth}\flushleft
}{%
\end{minipage}
\end{lrbox}%
\vskip10pt
\noindent
\fcolorbox{black}{defbackground}{\usebox\defsbox}%
\vskip10pt
}
\OnlyDescription


\newcommand{\sty}[1]{\textsf{#1}}\newcommand{\cls}[1]{\textsf{#1}}
\begin{document}
\DocInput{fmtcount.dtx}
\end{document}
%</driver>
%\fi
%\RecordChanges
%\CheckSum{7745}
%
% \title{fmtcount.sty v1.3: Displaying the Values of 
%\LaTeX\ Counters}
% \author{Nicola L.C. Talbot\\[10pt]
% School of Computing Sciences\\
% University of East Anglia\\
% Norwich.  NR4 7TJ.\\
% United Kingdom.\\
% \url{http://theoval.cmp.uea.ac.uk/~nlct/}}
% \date{20 Aug 2007}
% \maketitle
% \tableofcontents
% \section{Introduction}
%The \sty{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 and German.
%
%\section{Installation}
%
%This package is distributed with the files \texttt{fmtcount.dtx}
%and \texttt{fmtcount.ins}.  To extract the code do:
%\begin{verbatim}
%latex fmtcount.ins
%\end{verbatim}
%This will create the files \texttt{fmtcount.sty} and 
%\texttt{fmtcount.perl}, along with several \texttt{.def} files.
%Place \texttt{fmtcount.sty} and the \texttt{.def} files somewhere
%where \LaTeX\ will find them (e.g.\ 
%\texttt{texmf/tex/latex/fmtcount/}) and place \texttt{fmtcount.perl} 
%somewhere where \LaTeX2HTML
%will find it (e.g.\ \texttt{latex2html/styles}). Remember to refresh
%the \TeX\ database (using \texttt{texhash} or \texttt{mktexlsr} 
%under Linux, for
%other operating systems check the manual.)
%
%\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.
%
% \DescribeMacro{\ordinal}
%\begin{definition}
%\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
%\DescribeMacro{\fmtord}
%\begin{definition}
%\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 \texttt{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 \sty{fmtcount} package with the \cls{memoir} class 
%you should use \DescribeMacro{\FCordinal}\cs{FCordinal} to access 
%\sty{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}
%
%\DescribeMacro{\ordinalnum}
%\begin{definition}
%\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}.
%
% \DescribeMacro{\numberstring}
%\begin{definition}
%\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}.
%
% \DescribeMacro{\Numberstring}
%\begin{definition}
%\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.
%
%\DescribeMacro{\NUMBERstring}
%\begin{definition}
%\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}}.
%
%\DescribeMacro{\numberstringnum}
%\begin{definition}
%\cs{numberstringnum}\marg{n}\oarg{gender}
%\end{definition}
%\DescribeMacro{\Numberstringnum}
%\begin{definition}
%\cs{Numberstringnum}\marg{n}\oarg{gender}
%\end{definition}
%\DescribeMacro{\NUMBERstringnum}
%\begin{definition}
%\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.
%
% \DescribeMacro{\ordinalstring}
%\begin{definition}
%\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}.
%
% \DescribeMacro{\Ordinalstring}
%\begin{definition}
%\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.
%
%\DescribeMacro{\ORDINALstring}
%\begin{definition}
%\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}).
%
%\DescribeMacro{\ordinalstringnum}
%\begin{definition}
%\cs{ordinalstringnum}\marg{n}\oarg{gender}
%\end{definition}
%\DescribeMacro{\Ordinalstringnum}
%\begin{definition}
%\cs{Ordinalstringnum}\marg{n}\oarg{gender}
%\end{definition}
%\DescribeMacro{\ORDINALstringnum}
%\begin{definition}
%\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
%\DescribeMacro{\FMCuse}
%\begin{definition}
%\cs{FMCuse}\marg{label}
%\end{definition}
%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}".
%
%\DescribeMacro{\storeordinal}
%\begin{definition}
%\cs{storeordinal}\marg{label}\marg{counter}\oarg{gender}
%\end{definition}
%\DescribeMacro{\storeordinalstring}
%\begin{definition}
%\cs{storeordinalstring}\marg{label}\marg{counter}\oarg{gender}
%\end{definition}
%\DescribeMacro{\storeOrdinalstring}
%\begin{definition}
%\cs{storeOrdinalstring}\marg{label}\marg{counter}\oarg{gender}
%\end{definition}
%\par
%\DescribeMacro{\storeORDINALstring}
%\begin{definition}
%\cs{storeORDINALstring}\marg{label}\marg{counter}\oarg{gender}
%\end{definition}
%\DescribeMacro{\storenumberstring}
%\begin{definition}
%\cs{storenumberstring}\marg{label}\marg{counter}\oarg{gender}
%\end{definition}
%\DescribeMacro{\storeNumberstring}
%\begin{definition}
%\cs{storeNumberstring}\marg{label}\marg{counter}\oarg{gender}
%\end{definition}
%\DescribeMacro{\storeNUMBERstring}
%\begin{definition}
%\cs{storeNUMBERstring}\marg{label}\marg{counter}\oarg{gender}
%\end{definition}
%\DescribeMacro{\storeordinalnum}
%\begin{definition}
%\cs{storeordinalnum}\marg{label}\marg{number}\oarg{gender}
%\end{definition}
%\DescribeMacro{\storeordinalstringnum}
%\begin{definition}
%\cs{storeordinalstring}\marg{label}\marg{number}\oarg{gender}
%\end{definition}
%\DescribeMacro{\storeOrdinalstringnum}
%\begin{definition}
%\cs{storeOrdinalstringnum}\marg{label}\marg{number}\oarg{gender}
%\end{definition}
%\DescribeMacro{\storeORDINALstringnum}
%\begin{definition}
%\cs{storeORDINALstringnum}\marg{label}\marg{number}\oarg{gender}
%\end{definition}
%\DescribeMacro{\storenumberstringnum}
%\begin{definition}
%\cs{storenumberstring}\marg{label}\marg{number}\oarg{gender}
%\end{definition}
%\DescribeMacro{\storeNumberstringnum}
%\begin{definition}
%\cs{storeNumberstring}\marg{label}\marg{number}\oarg{gender}
%\end{definition}
%\DescribeMacro{\storeNUMBERstringnum}
%\begin{definition}
%\cs{storeNUMBERstring}\marg{label}\marg{number}\oarg{gender}
%\end{definition}
%
% \DescribeMacro{\binary}
%\changes{v2.4}{25 Sept 2004}{'binary added}
%\begin{definition}
%\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 
%\DescribeMacro{\padzeroes}
%\begin{definition}
%\cs{padzeroes}\oarg{n}
%\end{definition}\noindent
%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.
%
%\DescribeMacro{\binarynum}
%\begin{definition}
%\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.
%
%\DescribeMacro{\octal}
%\changes{v2.4}{25 Sept 2004}{'octal added}
%\begin{definition}
%\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.
%
%\DescribeMacro{\octalnum}
%\begin{definition}
%\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.
%
% \DescribeMacro{\hexadecimal}
%\changes{v2.4}{25 Sept 2004}{'hexadecimal added}
%\begin{definition}
%\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.
%
%\DescribeMacro{\Hexadecimal}
%\begin{definition}
%\cs{Hexadecimal}\marg{counter}
%\end{definition}
%This does the same thing, but uses uppercase characters, e.g.\
%\verb"\Hexadecimal{mycounter}" will produce: 7D.
%
%\DescribeMacro{\hexadecimalnum}
%\begin{definition}
%\cs{hexadecimalnum}\marg{n}
%\end{definition}
%\DescribeMacro{\Hexadecimalnum}
%\begin{definition}
%\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.
%
%\DescribeMacro{\decimal}
%\changes{v2.41}{22 Oct 2004}{'decimal added}
%\begin{definition}
%\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.
%
%\DescribeMacro{\decimalnum}
%\begin{definition}
%\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.
%
% \DescribeMacro{\aaalph}
%\changes{v2.4}{25 Sept 2004}{'aaalph added}
%\begin{definition}
%\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.
%
%\DescribeMacro{\AAAlph}
%\begin{definition}
%\cs{AAAlph}\marg{counter}
%\end{definition}
%This does the same thing, but uses uppercase characters, e.g.\
%\verb"\AAAlph{mycounter}" will produce: UUUUU.
%
%\DescribeMacro{\aaalphnum}
%\begin{definition}
%\cs{aaalphnum}\marg{n}
%\end{definition}
%\DescribeMacro{\AAAlphnum}
%\begin{definition}
%\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.
%
% \DescribeMacro{\abalph}
%\changes{v2.4}{25 Sept 2004}{'abalph added}
%\begin{definition}
%\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.
%
% \DescribeMacro{\ABAlph}
%\begin{definition}
%\cs{ABAlph}\marg{counter}
%\end{definition}
%This does the same thing, but uses uppercase characters, e.g.\
%\verb"\ABAlph{mycounter}" will produce: DU.
%
%\DescribeMacro{\abalphnum}
%\begin{definition}
%\cs{abalphnum}\marg{n}
%\end{definition}
%\DescribeMacro{\ABAlphnum}
%\begin{definition}
%\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}
%
%The following options can be passed to this package:
%
%\begin{tabular}{ll}
% raise    & make ordinal st,nd,rd,th appear as superscript\\
% level    & make ordinal st,nd,rd,th appear level with rest of 
%text
%\end{tabular}
%
%\noindent These can also be set using the command:
%
%\DescribeMacro{\fmtcountsetoptions}
%\begin{definition}
%\cs{fmtcountsetoptions}\verb"{fmtord="\meta{type}\verb'}'
%\end{definition}
%\noindent where \meta{type} is either \texttt{level} or 
%\texttt{raise}.
%
%\section{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}.
%
%The package checks to see if the command \cs{l@}\meta{language} is
%defined\footnote{this will be true if you have loaded \sty{babel}},
%and will load the code for those languages.  The commands
%\cs{ordinal}, \cs{ordinalstring} and \cs{numberstring} (and their
%variants) will then be formatted in the currently selected language.
%
%If the French language is selected, the French (France) version
%will be used by default (e.g.\ soxiante-dix for 70).  To
%select the Swiss or Belgian variants (e.g.\ septente for 70) use:
%\verb"\fmtcountsetoptions{french="\meta{dialect}\verb'}'
%where \meta{dialect} is either \texttt{swiss} or \texttt{belgian}.
%You can also use this command to change the action of 
%\cs{ordinal}.
%\verb"\fmtcountsetoptions{abbrv=true}" to produce ordinals
%of the form 2\textsuperscript{e} or
%\verb"\fmtcountsetoptions{abbrv=false}" to produce ordinals
%of the form 2\textsuperscript{eme} (default).
%
%The \texttt{french} and \texttt{abbrv} settings only have an
%effect if the French language has been defined.
%
%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.
%
%\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 my mother for the French and Portuguese
%support and my Spanish dictionary for the Spanish support.
%Thank you to K. H. Fricke for providing me with the German
%translations.
%
%\section{Troubleshooting}
%
%There is a FAQ available at: 
%\url{http://theoval.cmp.uea.ac.uk/~nlct/latex/packages/faq/}.
%
%
%
%\StopEventually{}
%\section{The Code}
%\iffalse
%    \begin{macrocode}
%<*fc-british.def>
%    \end{macrocode}
%\fi
% \subsection{fc-british.def}
% British definitions
%    \begin{macrocode}
\ProvidesFile{fc-british}[2007/06/14]
%    \end{macrocode}
% Check that fc-english.def has been loaded
%    \begin{macrocode}
\@ifundefined{@ordinalMenglish}{\input{fc-english.def}}{}
%    \end{macrocode}
% These are all just synonyms for the commands provided by
% fc-english.def.
%    \begin{macrocode}
\let\@ordinalMbritish\@ordinalMenglish
\let\@ordinalFbritish\@ordinalMenglish
\let\@ordinalNbritish\@ordinalMenglish
\let\@numberstringMbritish\@numberstringMenglish
\let\@numberstringFbritish\@numberstringMenglish
\let\@numberstringNbritish\@numberstringMenglish
\let\@NumberstringMbritish\@NumberstringMenglish
\let\@NumberstringFbritish\@NumberstringMenglish
\let\@NumberstringNbritish\@NumberstringMenglish
\let\@ordinalstringMbritish\@ordinalstringMenglish
\let\@ordinalstringFbritish\@ordinalstringMenglish
\let\@ordinalstringNbritish\@ordinalstringMenglish
\let\@OrdinalstringMbritish\@OrdinalstringMenglish
\let\@OrdinalstringFbritish\@OrdinalstringMenglish
\let\@OrdinalstringNbritish\@OrdinalstringMenglish
%    \end{macrocode}
%\iffalse
%    \begin{macrocode}
%</fc-british.def>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<*fc-english.def>
%    \end{macrocode}
%\fi
% \subsection{fc-english.def}
% English definitions
%    \begin{macrocode}
\ProvidesFile{fc-english}[2007/05/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.
%    \begin{macrocode}
\newcommand*{\@ordinalMenglish}[2]{%
\def\@fc@ord{}%
\@orgargctr=#1\relax
\@ordinalctr=#1%
\@modulo{\@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
      \@modulo{\@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}}%
}
%    \end{macrocode}
% There is no gender difference in English, so make feminine and
% neuter the same as the masculine.
%    \begin{macrocode}
\let\@ordinalFenglish=\@ordinalMenglish
\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
}
%    \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
}
%    \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
}
%    \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
}
%    \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
}
%    \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
}
%    \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
% #1 is greater or equal to 10000
  \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
    \@modulo{\@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
    \@modulo{\@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 \@modulo{\@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 \@modulo{\@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 \@modulo{\@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
    \@modulo{\@strctr}{10}%
    \let\@@fc@numstr#2\relax
    \edef#2{\@@fc@numstr\@teenstring{\@strctr}}%
  \fi
\fi
}
%    \end{macrocode}
% All lower case version, the second argument must be a 
% control sequence.
%    \begin{macrocode}
\DeclareRobustCommand{\@numberstringMenglish}[2]{%
\let\@unitstring=\@@unitstringenglish 
\let\@teenstring=\@@teenstringenglish 
\let\@tenstring=\@@tenstringenglish
\def\@hundred{hundred}\def\@thousand{thousand}%
\def\@andname{and}%
\@@numberstringenglish{#1}{#2}%
}
%    \end{macrocode}
% There is no gender in English, so make feminine and neuter the same
% as the masculine.
%    \begin{macrocode}
\let\@numberstringFenglish=\@numberstringMenglish
\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}}
%    \end{macrocode}
% There is no gender in English, so make feminine and neuter the same
% as the masculine.
%    \begin{macrocode}
\let\@NumberstringFenglish=\@NumberstringMenglish
\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
}
%    \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
}
%   \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
}
%   \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
}
%    \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
}
%    \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
}
%    \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
% #1 is greater or equal to 10000
  \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
    \@modulo{\@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
    \@modulo{\@strctr}{10}%
    \let\@@fc@ordstr#2\relax
    \edef#2{\@@fc@ordstr\@teenstring{\@strctr}}%
  \fi
  \@strctr=#1\relax \@modulo{\@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 \@modulo{\@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 \@modulo{\@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 \@modulo{\@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 \@modulo{\@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
  \@modulo{\@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 \@modulo{\@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
    \@modulo{\@strctr}{10}%
    \let\@@fc@ordstr#2\relax
    \edef#2{\@@fc@ordstr\@teenthstring{\@strctr}}%
  \fi
\fi
}
%    \end{macrocode}
% All lower case version. Again, the second argument must be a
% control sequence in which the resulting text is stored.
%    \begin{macrocode}
\DeclareRobustCommand{\@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}}
%    \end{macrocode}
% No gender in English, so make feminine and neuter same as masculine:
%    \begin{macrocode}
\let\@ordinalstringFenglish=\@ordinalstringMenglish
\let\@ordinalstringNenglish=\@ordinalstringMenglish
%    \end{macrocode}
% First letter of each word in upper case:
%    \begin{macrocode}
\DeclareRobustCommand{\@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}}
%    \end{macrocode}
% No gender in English, so make feminine and neuter same as masculine:
%    \begin{macrocode}
\let\@OrdinalstringFenglish=\@OrdinalstringMenglish
\let\@OrdinalstringNenglish=\@OrdinalstringMenglish
%    \end{macrocode}
%\iffalse
%    \begin{macrocode}
%</fc-english.def>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<*fc-french.def>
%    \end{macrocode}
%\fi
% \subsection{fc-french.def}
% French definitions
%    \begin{macrocode}
\ProvidesFile{fc-french.def}[2007/05/26]
%    \end{macrocode}
% Define macro that converts a number or count register (first
% argument) to an ordinal, and store the result in the second
% argument, which must be a control sequence. Masculine:
%    \begin{macrocode}
\newcommand*{\@ordinalMfrench}[2]{%
\iffmtord@abbrv
  \edef#2{\number#1\relax\noexpand\fmtord{e}}%
\else
  \ifnum#1=1\relax
    \edef#2{\number#1\relax\noexpand\fmtord{er}}%
  \else
    \edef#2{\number#1\relax\noexpand\fmtord{eme}}%
  \fi
\fi}
%    \end{macrocode}
% Feminine:
%    \begin{macrocode}
\newcommand*{\@ordinalFfrench}[2]{%
\iffmtord@abbrv
  \edef#2{\number#1\relax\noexpand\fmtord{e}}%
\else
  \ifnum#1=1\relax
     \edef#2{\number#1\relax\noexpand\fmtord{ere}}%
  \else
     \edef#2{\number#1\relax\noexpand\fmtord{eme}}%
  \fi
\fi}
%    \end{macrocode}
% Make neuter same as masculine:
%    \begin{macrocode}
\let\@ordinalNfrench\@ordinalMfrench
%    \end{macrocode}
% Textual representation of a number. To make it easier break it
% into units, tens and teens. First the units:
%   \begin{macrocode}
\newcommand*{\@@unitstringfrench}[1]{%
\ifcase#1\relax
zero%
\or un%
\or deux%
\or trois%
\or quatre%
\or cinq%
\or six%
\or sept%
\or huit%
\or neuf%
\fi
}
%    \end{macrocode}
% Feminine only changes for 1:
%    \begin{macrocode}
\newcommand*{\@@unitstringFfrench}[1]{%
\ifnum#1=1\relax
une%
\else\@@unitstringfrench{#1}%
\fi
}
%    \end{macrocode}
% Tens (this includes the Belgian and Swiss variants, special
% cases employed lower down.)
%    \begin{macrocode}
\newcommand*{\@@tenstringfrench}[1]{%
\ifcase#1\relax
\or dix%
\or vingt%
\or trente%
\or quarante%
\or cinquante%
\or soixante%
\or septente%
\or huitante%
\or nonente%
\or cent%
\fi
}
%    \end{macrocode}
% Teens:
%    \begin{macrocode}
\newcommand*{\@@teenstringfrench}[1]{%
\ifcase#1\relax
dix%
\or onze%
\or douze%
\or treize%
\or quatorze%
\or quinze%
\or seize%
\or dix-sept%
\or dix-huit%
\or dix-neuf%
\fi
}
%    \end{macrocode}
% Seventies are a special case, depending on dialect:
%    \begin{macrocode}
\newcommand*{\@@seventiesfrench}[1]{%
\@tenstring{6}%
\ifnum#1=1\relax
\ \@andname\ 
\else
-%
\fi
\@teenstring{#1}%
}
%    \end{macrocode}
% Eighties are a special case, depending on dialect:
%    \begin{macrocode}
\newcommand*{\@@eightiesfrench}[1]{%
\@unitstring{4}-\@tenstring{2}%
\ifnum#1>0
-\@unitstring{#1}%
\else
s%
\fi
}
%    \end{macrocode}
% Nineties are a special case, depending on dialect:
%    \begin{macrocode}
\newcommand*{\@@ninetiesfrench}[1]{%
\@unitstring{4}-\@tenstring{2}-\@teenstring{#1}%
}
%    \end{macrocode}
% Swiss seventies:
%    \begin{macrocode}
\newcommand*{\@@seventiesfrenchswiss}[1]{%
\@tenstring{7}%
\ifnum#1=1\ \@andname\ \fi
\ifnum#1>1-\fi
\ifnum#1>0\@unitstring{#1}\fi
}
%    \end{macrocode}
% Swiss eighties:
%    \begin{macrocode}
\newcommand*{\@@eightiesfrenchswiss}[1]{%
\@tenstring{8}%
\ifnum#1=1\ \@andname\ \fi
\ifnum#1>1-\fi
\ifnum#1>0\@unitstring{#1}\fi
}
%    \end{macrocode}
% Swiss nineties:
%    \begin{macrocode}
\newcommand*{\@@ninetiesfrenchswiss}[1]{%
\@tenstring{9}%
\ifnum#1=1\ \@andname\ \fi
\ifnum#1>1-\fi
\ifnum#1>0\@unitstring{#1}\fi
}
%    \end{macrocode}
% Units with initial letter in upper case:
%    \begin{macrocode}
\newcommand*{\@@Unitstringfrench}[1]{%
\ifcase#1\relax
Zero%
\or Un%
\or Deux%
\or Trois%
\or Quatre%
\or Cinq%
\or Six%
\or Sept%
\or Huit%
\or Neuf%
\fi
}
%    \end{macrocode}
% As above, but feminine:
%    \begin{macrocode}
\newcommand*{\@@UnitstringFfrench}[1]{%
\ifnum#1=1\relax
Une%
\else \@@Unitstringfrench{#1}%
\fi
}
%    \end{macrocode}
% Tens, with initial letter in upper case (includes Swiss and
% Belgian variants):
%    \begin{macrocode}
\newcommand*{\@@Tenstringfrench}[1]{%
\ifcase#1\relax
\or Dix%
\or Vingt%
\or Trente%
\or Quarante%
\or Cinquante%
\or Soixante%
\or Septente%
\or Huitante%
\or Nonente%
\or Cent%
\fi
}
%    \end{macrocode}
% Teens, with initial letter in upper case:
%    \begin{macrocode}
\newcommand*{\@@Teenstringfrench}[1]{%
\ifcase#1\relax
Dix%
\or Onze%
\or Douze%
\or Treize%
\or Quatorze%
\or Quinze%
\or Seize%
\or Dix-Sept%
\or Dix-Huit%
\or Dix-Neuf%
\fi
}
%    \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 defined for use in documents.) Firstly, the Swiss
% version:
%    \begin{macrocode}
\DeclareRobustCommand{\@numberstringMfrenchswiss}[2]{%
\let\@unitstring=\@@unitstringfrench
\let\@teenstring=\@@teenstringfrench
\let\@tenstring=\@@tenstringfrench
\let\@seventies=\@@seventiesfrenchswiss
\let\@eighties=\@@eightiesfrenchswiss
\let\@nineties=\@@ninetiesfrenchswiss
\def\@hundred{cent}\def\@thousand{mille}%
\def\@andname{et}%
\@@numberstringfrench{#1}{#2}}
%    \end{macrocode}
% Same as above, but for French as spoken in France:
%    \begin{macrocode}
\DeclareRobustCommand{\@numberstringMfrenchfrance}[2]{%
\let\@unitstring=\@@unitstringfrench
\let\@teenstring=\@@teenstringfrench
\let\@tenstring=\@@tenstringfrench
\let\@seventies=\@@seventiesfrench
\let\@eighties=\@@eightiesfrench
\let\@nineties=\@@ninetiesfrench
\def\@hundred{cent}\def\@thousand{mille}%
\def\@andname{et}%
\@@numberstringfrench{#1}{#2}}
%    \end{macrocode}
% Same as above, but for Belgian dialect:
%    \begin{macrocode}
\DeclareRobustCommand{\@numberstringMfrenchbelgian}[2]{%
\let\@unitstring=\@@unitstringfrench
\let\@teenstring=\@@teenstringfrench
\let\@tenstring=\@@tenstringfrench
\let\@seventies=\@@seventiesfrenchswiss
\let\@eighties=\@@eightiesfrench
\let\@nineties=\@@ninetiesfrench
\def\@hundred{cent}\def\@thousand{mille}%
\def\@andname{et}%
\@@numberstringfrench{#1}{#2}}
%    \end{macrocode}
% Set default dialect:
%    \begin{macrocode}
\let\@numberstringMfrench=\@numberstringMfrenchfrance
%    \end{macrocode}
% As above, but for feminine version. Swiss:
%    \begin{macrocode}
\DeclareRobustCommand{\@numberstringFfrenchswiss}[2]{%
\let\@unitstring=\@@unitstringFfrench
\let\@teenstring=\@@teenstringfrench
\let\@tenstring=\@@tenstringfrench
\let\@seventies=\@@seventiesfrenchswiss
\let\@eighties=\@@eightiesfrenchswiss
\let\@nineties=\@@ninetiesfrenchswiss
\def\@hundred{cent}\def\@thousand{mille}%
\def\@andname{et}%
\@@numberstringfrench{#1}{#2}}
%    \end{macrocode}
% French:
%    \begin{macrocode}
\DeclareRobustCommand{\@numberstringFfrenchfrance}[2]{%
\let\@unitstring=\@@unitstringFfrench
\let\@teenstring=\@@teenstringfrench
\let\@tenstring=\@@tenstringfrench
\let\@seventies=\@@seventiesfrench
\let\@eighties=\@@eightiesfrench
\let\@nineties=\@@ninetiesfrench
\def\@hundred{cent}\def\@thousand{mille}%
\def\@andname{et}%
\@@numberstringfrench{#1}{#2}}
%    \end{macrocode}
% Belgian:
%    \begin{macrocode}
\DeclareRobustCommand{\@numberstringFfrenchbelgian}[2]{%
\let\@unitstring=\@@unitstringFfrench
\let\@teenstring=\@@teenstringfrench
\let\@tenstring=\@@tenstringfrench
\let\@seventies=\@@seventiesfrenchswiss
\let\@eighties=\@@eightiesfrench
\let\@nineties=\@@ninetiesfrench
\def\@hundred{cent}\def\@thousand{mille}%
\def\@andname{et}%
\@@numberstringfrench{#1}{#2}}
%    \end{macrocode}
% Set default dialect:
%    \begin{macrocode}
\let\@numberstringFfrench=\@numberstringFfrenchfrance
%    \end{macrocode}
% Make neuter same as masculine:
%    \begin{macrocode}
\let\@ordinalstringNfrench\@ordinalstringMfrench
%    \end{macrocode}
% As above, but with initial letter in upper case. Swiss (masculine):
%    \begin{macrocode}
\DeclareRobustCommand{\@NumberstringMfrenchswiss}[2]{%
\let\@unitstring=\@@Unitstringfrench
\let\@teenstring=\@@Teenstringfrench
\let\@tenstring=\@@Tenstringfrench
\let\@seventies=\@@seventiesfrenchswiss
\let\@eighties=\@@eightiesfrenchswiss
\let\@nineties=\@@ninetiesfrenchswiss
\def\@hundred{Cent}\def\@thousand{Mille}%
\def\@andname{et}%
\@@numberstringfrench{#1}{#2}}
%    \end{macrocode}
% French:
%    \begin{macrocode}
\DeclareRobustCommand{\@NumberstringMfrenchfrance}[2]{%
\let\@unitstring=\@@Unitstringfrench
\let\@teenstring=\@@Teenstringfrench
\let\@tenstring=\@@Tenstringfrench
\let\@seventies=\@@seventiesfrench
\let\@eighties=\@@eightiesfrench
\let\@nineties=\@@ninetiesfrench
\def\@hundred{Cent}\def\@thousand{Mille}%
\def\@andname{et}%
\@@numberstringfrench{#1}{#2}}
%    \end{macrocode}
% Belgian:
%    \begin{macrocode}
\DeclareRobustCommand{\@NumberstringMfrenchbelgian}[2]{%
\let\@unitstring=\@@Unitstringfrench
\let\@teenstring=\@@Teenstringfrench
\let\@tenstring=\@@Tenstringfrench
\let\@seventies=\@@seventiesfrenchswiss
\let\@eighties=\@@eightiesfrench
\let\@nineties=\@@ninetiesfrench
\def\@hundred{Cent}\def\@thousand{Mille}%
\def\@andname{et}%
\@@numberstringfrench{#1}{#2}}
%    \end{macrocode}
% Set default dialect:
%    \begin{macrocode}
\let\@NumberstringMfrench=\@NumberstringMfrenchfrance
%    \end{macrocode}
% As above, but feminine. Swiss:
%    \begin{macrocode}
\DeclareRobustCommand{\@NumberstringFfrenchswiss}[2]{%
\let\@unitstring=\@@UnitstringFfrench
\let\@teenstring=\@@Teenstringfrench
\let\@tenstring=\@@Tenstringfrench
\let\@seventies=\@@seventiesfrenchswiss
\let\@eighties=\@@eightiesfrenchswiss
\let\@nineties=\@@ninetiesfrenchswiss
\def\@hundred{Cent}\def\@thousand{Mille}%
\def\@andname{et}%
\@@numberstringfrench{#1}{#2}}
%    \end{macrocode}
% French (feminine):
%    \begin{macrocode}
\DeclareRobustCommand{\@NumberstringFfrenchfrance}[2]{%
\let\@unitstring=\@@UnitstringFfrench
\let\@teenstring=\@@Teenstringfrench
\let\@tenstring=\@@Tenstringfrench
\let\@seventies=\@@seventiesfrench
\let\@eighties=\@@eightiesfrench
\let\@nineties=\@@ninetiesfrench
\def\@hundred{Cent}\def\@thousand{Mille}%
\def\@andname{et}%
\@@numberstringfrench{#1}{#2}}
%    \end{macrocode}
% Belgian (feminine):
%    \begin{macrocode}
\DeclareRobustCommand{\@NumberstringFfrenchbelgian}[2]{%
\let\@unitstring=\@@UnitstringFfrench
\let\@teenstring=\@@Teenstringfrench
\let\@tenstring=\@@Tenstringfrench
\let\@seventies=\@@seventiesfrenchswiss
\let\@eighties=\@@eightiesfrench
\let\@nineties=\@@ninetiesfrench
\def\@hundred{Cent}\def\@thousand{Mille}%
\def\@andname{et}%
\@@numberstringfrench{#1}{#2}}
%    \end{macrocode}
% Set default dialect:
%    \begin{macrocode}
\let\@NumberstringFfrench=\@NumberstringFfrenchfrance
%    \end{macrocode}
% Make neuter same as masculine:
%    \begin{macrocode}
\let\@NumberstringNfrench\@NumberstringMfrench
%    \end{macrocode}
% Again, as from version 1.09, this has been changed to take
% two arguments, where the second argument is a control
% sequence, and nothing is displayed. Store textual representation
% of an ordinal in the given control sequence. Swiss dialect (masculine):
%    \begin{macrocode}
\DeclareRobustCommand{\@ordinalstringMfrenchswiss}[2]{%
\ifnum#1=1\relax
\def#2{premier}%
\else
\let\@unitthstring=\@@unitthstringfrench
\let\@unitstring=\@@unitstringfrench
\let\@teenthstring=\@@teenthstringfrench
\let\@teenstring=\@@teenstringfrench
\let\@tenthstring=\@@tenthstringfrench
\let\@tenstring=\@@tenstringfrench
\let\@seventieths=\@@seventiethsfrenchswiss
\let\@eightieths=\@@eightiethsfrenchswiss
\let\@ninetieths=\@@ninetiethsfrenchswiss
\let\@seventies=\@@seventiesfrenchswiss
\let\@eighties=\@@eightiesfrenchswiss
\let\@nineties=\@@ninetiesfrenchswiss
\def\@hundredth{centi\`eme}\def\@hundred{cent}%
\def\@thousandth{mili\`eme}\def\@thousand{mille}%
\def\@andname{et}%
\@@ordinalstringfrench{#1}{#2}%
\fi}
%    \end{macrocode}
% French (masculine):
%    \begin{macrocode}
\DeclareRobustCommand{\@ordinalstringMfrenchfrance}[2]{%
\ifnum#1=1\relax
\def#2{premier}%
\else
\let\@unitthstring=\@@unitthstringfrench
\let\@unitstring=\@@unitstringfrench
\let\@teenthstring=\@@teenthstringfrench
\let\@teenstring=\@@teenstringfrench
\let\@tenthstring=\@@tenthstringfrench
\let\@tenstring=\@@tenstringfrench
\let\@seventieths=\@@seventiethsfrench
\let\@eightieths=\@@eightiethsfrench
\let\@ninetieths=\@@ninetiethsfrench
\let\@seventies=\@@seventiesfrench
\let\@eighties=\@@eightiesfrench
\let\@nineties=\@@ninetiesfrench
\let\@teenstring=\@@teenstringfrench
\def\@hundredth{centi\`eme}\def\@hundred{cent}%
\def\@thousandth{mili\`eme}\def\@thousand{mille}%
\def\@andname{et}%
\@@ordinalstringfrench{#1}{#2}%
\fi}
%    \end{macrocode}
% Belgian dialect (masculine):
%    \begin{macrocode}
\DeclareRobustCommand{\@ordinalstringMfrenchbelgian}[2]{%
\ifnum#1=1\relax
\def#2{premier}%
\else
\let\@unitthstring=\@@unitthstringfrench
\let\@unitstring=\@@unitstringfrench
\let\@teenthstring=\@@teenthstringfrench
\let\@teenstring=\@@teenstringfrench
\let\@tenthstring=\@@tenthstringfrench
\let\@tenstring=\@@tenstringfrench
\let\@seventieths=\@@seventiethsfrenchswiss
\let\@eightieths=\@@eightiethsfrench
\let\@ninetieths=\@@ninetiethsfrenchswiss
\let\@seventies=\@@seventiesfrench
\let\@eighties=\@@eightiesfrench
\let\@nineties=\@@ninetiesfrench
\let\@teenstring=\@@teenstringfrench
\def\@hundredth{centi\`eme}\def\@hundred{cent}%
\def\@thousandth{mili\`eme}\def\@thousand{mille}%
\def\@andname{et}%
\@@ordinalstringfrench{#1}{#2}%
\fi}
%    \end{macrocode}
% Set up default dialect:
%    \begin{macrocode}
\let\@ordinalstringMfrench=\@ordinalstringMfrenchfrance
%    \end{macrocode}
% As above, but feminine. Swiss:
%    \begin{macrocode}
\DeclareRobustCommand{\@ordinalstringFfrenchswiss}[2]{%
\ifnum#1=1\relax
\def#2{premi\`ere}%
\else
\let\@unitthstring=\@@unitthstringfrench
\let\@unitstring=\@@unitstringFfrench
\let\@teenthstring=\@@teenthstringfrench
\let\@teenstring=\@@teenstringfrench
\let\@tenthstring=\@@tenthstringfrench
\let\@tenstring=\@@tenstringfrench
\let\@seventieths=\@@seventiethsfrenchswiss
\let\@eightieths=\@@eightiethsfrenchswiss
\let\@ninetieths=\@@ninetiethsfrenchswiss
\let\@seventies=\@@seventiesfrenchswiss
\let\@eighties=\@@eightiesfrenchswiss
\let\@nineties=\@@ninetiesfrenchswiss
\def\@hundredth{centi\`eme}\def\@hundred{cent}%
\def\@thousandth{mili\`eme}\def\@thousand{mille}%
\def\@andname{et}%
\@@ordinalstringfrench{#1}{#2}%
\fi}
%    \end{macrocode}
% French (feminine):
%    \begin{macrocode}
\DeclareRobustCommand{\@ordinalstringFfrenchfrance}[2]{%
\ifnum#1=1\relax
\def#2{premi\`ere}%
\else
\let\@unitthstring=\@@unitthstringfrench
\let\@unitstring=\@@unitstringFfrench
\let\@teenthstring=\@@teenthstringfrench
\let\@teenstring=\@@teenstringfrench
\let\@tenthstring=\@@tenthstringfrench
\let\@tenstring=\@@tenstringfrench
\let\@seventieths=\@@seventiethsfrench
\let\@eightieths=\@@eightiethsfrench
\let\@ninetieths=\@@ninetiethsfrench
\let\@seventies=\@@seventiesfrench
\let\@eighties=\@@eightiesfrench
\let\@nineties=\@@ninetiesfrench
\let\@teenstring=\@@teenstringfrench
\def\@hundredth{centi\`eme}\def\@hundred{cent}%
\def\@thousandth{mili\`eme}\def\@thousand{mille}%
\def\@andname{et}%
\@@ordinalstringfrench{#1}{#2}%
\fi}
%    \end{macrocode}
% Belgian (feminine):
%    \begin{macrocode}
\DeclareRobustCommand{\@ordinalstringFfrenchbelgian}[2]{%
\ifnum#1=1\relax
\def#2{premi\`ere}%
\else
\let\@unitthstring=\@@unitthstringfrench
\let\@unitstring=\@@unitstringFfrench
\let\@teenthstring=\@@teenthstringfrench
\let\@teenstring=\@@teenstringfrench
\let\@tenthstring=\@@tenthstringfrench
\let\@tenstring=\@@tenstringfrench
\let\@seventieths=\@@seventiethsfrenchswiss
\let\@eightieths=\@@eightiethsfrench
\let\@ninetieths=\@@ninetiethsfrench
\let\@seventies=\@@seventiesfrench
\let\@eighties=\@@eightiesfrench
\let\@nineties=\@@ninetiesfrench
\let\@teenstring=\@@teenstringfrench
\def\@hundredth{centi\`eme}\def\@hundred{cent}%
\def\@thousandth{mili\`eme}\def\@thousand{mille}%
\def\@andname{et}%
\@@ordinalstringfrench{#1}{#2}%
\fi}
%    \end{macrocode}
% Set up default dialect:
%    \begin{macrocode}
\let\@ordinalstringFfrench=\@ordinalstringFfrenchfrance
%    \end{macrocode}
% Make neuter same as masculine:
%    \begin{macrocode}
\let\@ordinalstringNfrench\@ordinalstringMfrench
%    \end{macrocode}
% As above, but with initial letters in upper case. Swiss (masculine):
%    \begin{macrocode}
\DeclareRobustCommand{\@OrdinalstringMfrenchswiss}[2]{%
\ifnum#1=1\relax
\def#2{Premi\`ere}%
\else
\let\@unitthstring=\@@Unitthstringfrench
\let\@unitstring=\@@Unitstringfrench
\let\@teenthstring=\@@Teenthstringfrench
\let\@teenstring=\@@Teenstringfrench
\let\@tenthstring=\@@Tenthstringfrench
\let\@tenstring=\@@Tenstringfrench
\let\@seventieths=\@@seventiethsfrenchswiss
\let\@eightieths=\@@eightiethsfrenchswiss
\let\@ninetieths=\@@ninetiethsfrenchswiss
\let\@seventies=\@@seventiesfrenchswiss
\let\@eighties=\@@eightiesfrenchswiss
\let\@nineties=\@@ninetiesfrenchswiss
\def\@hundredth{Centi\`eme}\def\@hundred{Cent}%
\def\@thousandth{Mili\`eme}\def\@thousand{Mille}%
\def\@andname{et}%
\@@ordinalstringfrench{#1}{#2}%
\fi}
%    \end{macrocode}
% French (masculine):
%    \begin{macrocode}
\DeclareRobustCommand{\@OrdinalstringMfrenchfrance}[2]{%
\ifnum#1=1\relax
\def#2{Premi\`ere}%
\else
\let\@unitthstring=\@@Unitthstringfrench
\let\@unitstring=\@@Unitstringfrench
\let\@teenthstring=\@@Teenthstringfrench
\let\@teenstring=\@@Teenstringfrench
\let\@tenthstring=\@@Tenthstringfrench
\let\@tenstring=\@@Tenstringfrench
\let\@seventieths=\@@seventiethsfrench
\let\@eightieths=\@@eightiethsfrench
\let\@ninetieths=\@@ninetiethsfrench
\let\@seventies=\@@seventiesfrench
\let\@eighties=\@@eightiesfrench
\let\@nineties=\@@ninetiesfrench
\let\@teenstring=\@@Teenstringfrench
\def\@hundredth{Centi\`eme}\def\@hundred{Cent}%
\def\@thousandth{Mili\`eme}\def\@thousand{Mille}%
\def\@andname{et}%
\@@ordinalstringfrench{#1}{#2}%
\fi}
%    \end{macrocode}
% Belgian (masculine):
%    \begin{macrocode}
\DeclareRobustCommand{\@OrdinalstringMfrenchbelgian}[2]{%
\ifnum#1=1\relax
\def#2{Premi\`ere}%
\else
\let\@unitthstring=\@@Unitthstringfrench
\let\@unitstring=\@@Unitstringfrench
\let\@teenthstring=\@@Teenthstringfrench
\let\@teenstring=\@@Teenstringfrench
\let\@tenthstring=\@@Tenthstringfrench
\let\@tenstring=\@@Tenstringfrench
\let\@seventieths=\@@seventiethsfrenchswiss
\let\@eightieths=\@@eightiethsfrench
\let\@ninetieths=\@@ninetiethsfrench
\let\@seventies=\@@seventiesfrench
\let\@eighties=\@@eightiesfrench
\let\@nineties=\@@ninetiesfrench
\let\@teenstring=\@@Teenstringfrench
\def\@hundredth{Centi\`eme}\def\@hundred{Cent}%
\def\@thousandth{Mili\`eme}\def\@thousand{Mille}%
\def\@andname{et}%
\@@ordinalstringfrench{#1}{#2}%
\fi}
%    \end{macrocode}
% Set up default dialect:
%    \begin{macrocode}
\let\@OrdinalstringMfrench=\@OrdinalstringMfrenchfrance
%    \end{macrocode}
% As above, but feminine form. Swiss:
%    \begin{macrocode}
\DeclareRobustCommand{\@OrdinalstringFfrenchswiss}[2]{%
\ifnum#1=1\relax
\def#2{Premi\`ere}%
\else
\let\@unitthstring=\@@Unitthstringfrench
\let\@unitstring=\@@UnitstringFfrench
\let\@teenthstring=\@@Teenthstringfrench
\let\@teenstring=\@@Teenstringfrench
\let\@tenthstring=\@@Tenthstringfrench
\let\@tenstring=\@@Tenstringfrench
\let\@seventieths=\@@seventiethsfrenchswiss
\let\@eightieths=\@@eightiethsfrenchswiss
\let\@ninetieths=\@@ninetiethsfrenchswiss
\let\@seventies=\@@seventiesfrenchswiss
\let\@eighties=\@@eightiesfrenchswiss
\let\@nineties=\@@ninetiesfrenchswiss
\def\@hundredth{Centi\`eme}\def\@hundred{Cent}%
\def\@thousandth{Mili\`eme}\def\@thousand{Mille}%
\def\@andname{et}%
\@@ordinalstringfrench{#1}{#2}%
\fi}
%    \end{macrocode}
% French (feminine):
%    \begin{macrocode}
\DeclareRobustCommand{\@OrdinalstringFfrenchfrance}[2]{%
\ifnum#1=1\relax
\def#2{Premi\`ere}%
\else
\let\@unitthstring=\@@Unitthstringfrench
\let\@unitstring=\@@UnitstringFfrench
\let\@teenthstring=\@@Teenthstringfrench
\let\@teenstring=\@@Teenstringfrench
\let\@tenthstring=\@@Tenthstringfrench
\let\@tenstring=\@@Tenstringfrench
\let\@seventieths=\@@seventiethsfrench
\let\@eightieths=\@@eightiethsfrench
\let\@ninetieths=\@@ninetiethsfrench
\let\@seventies=\@@seventiesfrench
\let\@eighties=\@@eightiesfrench
\let\@nineties=\@@ninetiesfrench
\let\@teenstring=\@@Teenstringfrench
\def\@hundredth{Centi\`eme}\def\@hundred{Cent}%
\def\@thousandth{Mili\`eme}\def\@thousand{Mille}%
\def\@andname{et}%
\@@ordinalstringfrench{#1}{#2}%
\fi}
%    \end{macrocode}
% Belgian (feminine):
%    \begin{macrocode}
\DeclareRobustCommand{\@OrdinalstringFfrenchbelgian}[2]{%
\ifnum#1=1\relax
\def#2{Premi\`ere}%
\else
\let\@unitthstring=\@@Unitthstringfrench
\let\@unitstring=\@@UnitstringFfrench
\let\@teenthstring=\@@Teenthstringfrench
\let\@teenstring=\@@Teenstringfrench
\let\@tenthstring=\@@Tenthstringfrench
\let\@tenstring=\@@Tenstringfrench
\let\@seventieths=\@@seventiethsfrenchswiss
\let\@eightieths=\@@eightiethsfrench
\let\@ninetieths=\@@ninetiethsfrench
\let\@seventies=\@@seventiesfrench
\let\@eighties=\@@eightiesfrench
\let\@nineties=\@@ninetiesfrench
\let\@teenstring=\@@Teenstringfrench
\def\@hundredth{Centi\`eme}\def\@hundred{Cent}%
\def\@thousandth{Mili\`eme}\def\@thousand{Mille}%
\def\@andname{et}%
\@@ordinalstringfrench{#1}{#2}%
\fi}
%    \end{macrocode}
% Set up default dialect:
%    \begin{macrocode}
\let\@OrdinalstringFfrench=\@OrdinalstringFfrenchfrance
%    \end{macrocode}
% Make neuter same as masculine:
%    \begin{macrocode}
\let\@OrdinalstringNfrench\@OrdinalstringMfrench
%    \end{macrocode}
% In order to convert numbers into textual ordinals, need
% to break it up into units, tens and teens. First the units.
% The argument must be a number or count register between 0
% and 9.
%    \begin{macrocode}
\newcommand*{\@@unitthstringfrench}[1]{%
\ifcase#1\relax
zero%
\or uni\`eme%
\or deuxi\`eme%
\or troisi\`eme%
\or quatri\`eme%
\or cinqui\`eme%
\or sixi\`eme%
\or septi\`eme%
\or huiti\`eme%
\or neuvi\`eme%
\fi
}
%    \end{macrocode}
% Tens (includes Swiss and Belgian variants, special cases are
% dealt with later.)
%    \begin{macrocode}
\newcommand*{\@@tenthstringfrench}[1]{%
\ifcase#1\relax
\or dixi\`eme%
\or vingti\`eme%
\or trentri\`eme%
\or quaranti\`eme%
\or cinquanti\`eme%
\or soixanti\`eme%
\or septenti\`eme%
\or huitanti\`eme%
\or nonenti\`eme%
\fi
}
%    \end{macrocode}
% Teens:
%    \begin{macrocode}
\newcommand*{\@@teenthstringfrench}[1]{%
\ifcase#1\relax
dixi\`eme%
\or onzi\`eme%
\or douzi\`eme%
\or treizi\`eme%
\or quatorzi\`eme%
\or quinzi\`eme%
\or seizi\`eme%
\or dix-septi\`eme%
\or dix-huiti\`eme%
\or dix-neuvi\`eme%
\fi
}
%    \end{macrocode}
% Seventies vary depending on dialect. Swiss:
%    \begin{macrocode}
\newcommand*{\@@seventiethsfrenchswiss}[1]{%
\ifcase#1\relax
\@tenthstring{7}%
\or
\@tenstring{7} \@andname\ \@unitthstring{1}%
\else
\@tenstring{7}-\@unitthstring{#1}%
\fi}
%    \end{macrocode}
% Eighties vary depending on dialect. Swiss:
%    \begin{macrocode}
\newcommand*{\@@eightiethsfrenchswiss}[1]{%
\ifcase#1\relax
\@tenthstring{8}%
\or
\@tenstring{8} \@andname\ \@unitthstring{1}%
\else
\@tenstring{8}-\@unitthstring{#1}%
\fi}
%    \end{macrocode}
% Nineties vary depending on dialect. Swiss:
%    \begin{macrocode}
\newcommand*{\@@ninetiethsfrenchswiss}[1]{%
\ifcase#1\relax
\@tenthstring{9}%
\or
\@tenstring{9} \@andname\ \@unitthstring{1}%
\else
\@tenstring{9}-\@unitthstring{#1}%
\fi}
%    \end{macrocode}
% French (as spoken in France) version:
%    \begin{macrocode}
\newcommand*{\@@seventiethsfrench}[1]{%
\ifnum#1=0\relax
\@tenstring{6}%
-%
\else
\@tenstring{6}%
\ \@andname\ 
\fi
\@teenthstring{#1}%
}
%    \end{macrocode}
% Eighties (as spoken in France):
%    \begin{macrocode}
\newcommand*{\@@eightiethsfrench}[1]{%
\ifnum#1>0\relax
\@unitstring{4}-\@tenstring{2}%
-\@unitthstring{#1}%
\else
\@unitstring{4}-\@tenthstring{2}%
\fi
}
%    \end{macrocode}
% Nineties (as spoken in France):
%    \begin{macrocode}
\newcommand*{\@@ninetiethsfrench}[1]{%
\@unitstring{4}-\@tenstring{2}-\@teenthstring{#1}%
}
%    \end{macrocode}
% As above, but with initial letter in upper case. Units:
%    \begin{macrocode}
\newcommand*{\@@Unitthstringfrench}[1]{%
\ifcase#1\relax
Zero%
\or Uni\`eme%
\or Deuxi\`eme%
\or Troisi\`eme%
\or Quatri\`eme%
\or Cinqui\`eme%
\or Sixi\`eme%
\or Septi\`eme%
\or Huiti\`eme%
\or Neuvi\`eme%
\fi
}
%    \end{macrocode}
% Tens (includes Belgian and Swiss variants):
%    \begin{macrocode}
\newcommand*{\@@Tenthstringfrench}[1]{%
\ifcase#1\relax
\or Dixi\`eme%
\or Vingti\`eme%
\or Trentri\`eme%
\or Quaranti\`eme%
\or Cinquanti\`eme%
\or Soixanti\`eme%
\or Septenti\`eme%
\or Huitanti\`eme%
\or Nonenti\`eme%
\fi
}
%    \end{macrocode}
% Teens:
%    \begin{macrocode}
\newcommand*{\@@Teenthstringfrench}[1]{%
\ifcase#1\relax
Dixi\`eme%
\or Onzi\`eme%
\or Douzi\`eme%
\or Treizi\`eme%
\or Quatorzi\`eme%
\or Quinzi\`eme%
\or Seizi\`eme%
\or Dix-Septi\`eme%
\or Dix-Huiti\`eme%
\or Dix-Neuvi\`eme%
\fi
}
%    \end{macrocode}
% Store textual representation of number (first argument) in given control
% sequence (second argument).
%    \begin{macrocode}
\newcommand*{\@@numberstringfrench}[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\relax
% #1 is greater or equal to 10000
  \@tmpstrctr=\@strctr
  \divide\@strctr by 10\relax
  \ifnum\@strctr>1\relax
    \ifthenelse{\(\@strctr>6\)\and\(\@strctr<10\)}{%
      \@modulo{\@tmpstrctr}{10}%
      \ifnum\@strctr<8\relax
        \let\@@fc@numstr#2\relax
        \edef#2{\@@fc@numstr\@seventies{\@tmpstrctr}}%
      \else
        \ifnum\@strctr<9\relax
          \let\@@fc@numstr#2\relax
          \edef#2{\@@fc@numstr\@eighties{\@tmpstrctr}}%
        \else
          \ifnum\@strctr<10\relax
             \let\@@fc@numstr#2\relax
             \edef#2{\@@fc@numstr\@nineties{\@tmpstrctr}}%
          \fi
        \fi
      \fi
    }{%
      \let\@@fc@numstr#2\relax
      \edef#2{\@@fc@numstr\@tenstring{\@strctr}}%
      \@strctr=#1\relax
      \divide\@strctr by 1000\relax
      \@modulo{\@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
    \@modulo{\@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 \@modulo{\@strctr}{1000}%
\divide\@strctr by 100
\ifnum\@strctr>0\relax
  \ifnum#1>1000\relax
    \let\@@fc@numstr#2\relax
    \edef#2{\@@fc@numstr\ }%
  \fi
  \@tmpstrctr=#1\relax
  \@modulo{\@tmpstrctr}{1000}\relax
  \ifnum\@tmpstrctr=100\relax
    \let\@@fc@numstr#2\relax
    \edef#2{\@@fc@numstr\@tenstring{10}}%
  \else
    \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\@hundred}%
  \fi
\fi
\@strctr=#1\relax \@modulo{\@strctr}{100}%
%\@tmpstrctr=#1\relax
%\divide\@tmpstrctr by 100\relax
\ifnum#1>100\relax
  \ifnum\@strctr>0\relax
    \let\@@fc@numstr#2\relax
    \edef#2{\@@fc@numstr\ }%
  \else
    \ifnum\@tmpstrctr>0\relax
       \let\@@fc@numstr#2\relax
       \edef#2{\@@fc@numstr s}%
    \fi%
  \fi
\fi
\ifnum\@strctr>19\relax
  \@tmpstrctr=\@strctr
  \divide\@strctr by 10\relax
  \ifthenelse{\@strctr>6}{%
    \@modulo{\@tmpstrctr}{10}%
    \ifnum\@strctr<8\relax
      \let\@@fc@numstr#2\relax
      \edef#2{\@@fc@numstr\@seventies{\@tmpstrctr}}%
    \else
      \ifnum\@strctr<9\relax
        \let\@@fc@numstr#2\relax
        \edef#2{\@@fc@numstr\@eighties{\@tmpstrctr}}%
      \else
        \let\@@fc@numstr#2\relax
        \edef#2{\@@fc@numstr\@nineties{\@tmpstrctr}}%
      \fi
    \fi
  }{%
    \let\@@fc@numstr#2\relax
    \edef#2{\@@fc@numstr\@tenstring{\@strctr}}%
    \@strctr=#1\relax \@modulo{\@strctr}{10}%
    \ifnum\@strctr>0\relax
      \let\@@fc@numstr#2\relax
      \ifnum\@strctr=1\relax
         \edef#2{\@@fc@numstr\ \@andname\ }%
      \else
         \edef#2{\@@fc@numstr-}%
      \fi
      \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%(>0,<10)
      \let\@@fc@numstr#2\relax
      \edef#2{\@@fc@numstr\@unitstring{\@strctr}}%
    \fi
  \else%>10
    \@modulo{\@strctr}{10}%
    \let\@@fc@numstr#2\relax
    \edef#2{\@@fc@numstr\@teenstring{\@strctr}}%
  \fi
\fi
}
%    \end{macrocode}
% Store textual representation of an ordinal (from number 
% specified in first argument) in given control
% sequence (second argument).
%    \begin{macrocode}
\newcommand*{\@@ordinalstringfrench}[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
% #1 is greater or equal to 10000
  \@tmpstrctr=\@strctr
  \divide\@strctr by 10\relax
  \ifnum\@strctr>1\relax
    \ifthenelse{\@strctr>6}{%
      \@modulo{\@tmpstrctr}{10}%
      \ifnum\@strctr=7\relax
        \let\@@fc@ordstr#2\relax
        \edef#2{\@@fc@ordstr\@seventies{\@tmpstrctr}}%
      \else
        \ifnum\@strctr=8\relax
          \let\@@fc@ordstr#2\relax
          \edef#2{\@@fc@ordstr\@eighties{\@tmpstrctr}}%
        \else
          \let\@@fc@ordstr#2\relax
          \edef#2{\@@fc@ordstr\@nineties{\@tmpstrctr}}%
        \fi
      \fi
    }{%
      \let\@@fc@ordstr#2\relax
      \edef#2{\@@fc@ordstr\@tenstring{\@strctr}}%
      \@strctr=#1\relax
      \divide\@strctr by 1000\relax
      \@modulo{\@strctr}{10}%
      \ifnum\@strctr=1\relax
         \let\@@fc@ordstr#2\relax
         \edef#2{\@@fc@ordstr\ \@andname}%
      \fi
      \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
    \@modulo{\@strctr}{10}%
    \let\@@fc@ordstr#2\relax
    \edef#2{\@@fc@ordstr\@teenstring{\@strctr}}%
  \fi
  \@strctr=#1\relax \@modulo{\@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 \@modulo{\@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
  \fi
\fi
\@strctr=#1\relax \@modulo{\@strctr}{1000}%
\divide\@strctr by 100\relax
\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 \@modulo{\@strctr}{100}%
  \let\@@fc@ordstr#2\relax
  \ifnum\@strctr=0\relax
    \edef#2{\@@fc@ordstr\ \@hundredth}%
  \else
    \edef#2{\@@fc@ordstr\ \@hundred}%
  \fi
\fi
\@tmpstrctr=\@strctr
\@strctr=#1\relax \@modulo{\@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
  \@modulo{\@tmpstrctr}{10}%
  \ifthenelse{\@strctr>6}{%
    \ifnum\@strctr=7\relax
      \let\@@fc@ordstr#2\relax
      \edef#2{\@@fc@ordstr\@seventieths{\@tmpstrctr}}%
    \else
      \ifnum\@strctr=8\relax
        \let\@@fc@ordstr#2\relax
        \edef#2{\@@fc@ordstr\@eightieths{\@tmpstrctr}}%
      \else
        \let\@@fc@ordstr#2\relax
        \edef#2{\@@fc@ordstr\@ninetieths{\@tmpstrctr}}%
      \fi
    \fi
  }{%
    \ifnum\@tmpstrctr=0\relax
      \let\@@fc@ordstr#2\relax
      \edef#2{\@@fc@ordstr\@tenthstring{\@strctr}}%
    \else 
      \let\@@fc@ordstr#2\relax
      \edef#2{\@@fc@ordstr\@tenstring{\@strctr}}%
    \fi
    \@strctr=#1\relax \@modulo{\@strctr}{10}%
    \ifnum\@strctr=1\relax
      \let\@@fc@ordstr#2\relax
      \edef#2{\@@fc@ordstr\ \@andname}%
    \fi
    \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
    \@modulo{\@strctr}{10}%
    \let\@@fc@ordstr#2\relax
    \edef#2{\@@fc@ordstr\@teenthstring{\@strctr}}%
  \fi
\fi
}
%    \end{macrocode}
%\iffalse
%    \begin{macrocode}
%</fc-french.def>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<*fc-german.def>
%    \end{macrocode}
%\fi
% \subsection{fc-german.def}
% German definitions (thank you to K. H. Fricke for supplying
% this information)
%    \begin{macrocode}
\ProvidesFile{fc-german.def}[2007/06/14]
%    \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.}}
%    \end{macrocode}
% Feminine:
%    \begin{macrocode}
\newcommand{\@ordinalFgerman}[2]{%
\edef#2{\number#1\relax.}}
%    \end{macrocode}
% Neuter:
%    \begin{macrocode}
\newcommand{\@ordinalNgerman}[2]{%
\edef#2{\number#1\relax.}}
%    \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
}
%    \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
}
%    \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}
%    \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
}
%    \end{macrocode}
% The results are stored in the second argument, but doesn't 
% display anything.
%    \begin{macrocode}
\DeclareRobustCommand{\@numberstringMgerman}[2]{%
\let\@unitstring=\@@unitstringgerman
\let\@teenstring=\@@teenstringgerman
\let\@tenstring=\@@tenstringgerman
\@@numberstringgerman{#1}{#2}}
%    \end{macrocode}
% Feminine and neuter forms:
%    \begin{macrocode}
\let\@numberstringFgerman=\@numberstringMgerman
\let\@numberstringNgerman=\@numberstringMgerman
%    \end{macrocode}
% As above, but initial letters in upper case:
%    \begin{macrocode}
\DeclareRobustCommand{\@NumberstringMgerman}[2]{%
\@numberstringMgerman{#1}{\@@num@str}%
\edef#2{\noexpand\MakeUppercase\@@num@str}}
%    \end{macrocode}
% Feminine and neuter form:
%    \begin{macrocode}
\let\@NumberstringFgerman=\@NumberstringMgerman
\let\@NumberstringNgerman=\@NumberstringMgerman
%    \end{macrocode}
% As above, but for ordinals.
%    \begin{macrocode}
\DeclareRobustCommand{\@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}}
%    \end{macrocode}
% Feminine form:
%    \begin{macrocode}
\DeclareRobustCommand{\@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}}
%    \end{macrocode}
% Neuter form:
%    \begin{macrocode}
\DeclareRobustCommand{\@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}}
%    \end{macrocode}
% As above, but with initial letters in upper case.
%    \begin{macrocode}
\DeclareRobustCommand{\@OrdinalstringMgerman}[2]{%
\@ordinalstringMgerman{#1}{\@@num@str}%
\edef#2{\protect\MakeUppercase\@@num@str}}
%    \end{macrocode}
% Feminine form:
%    \begin{macrocode}
\DeclareRobustCommand{\@OrdinalstringFgerman}[2]{%
\@ordinalstringFgerman{#1}{\@@num@str}%
\edef#2{\protect\MakeUppercase\@@num@str}}
%    \end{macrocode}
% Neuter form:
%    \begin{macrocode}
\DeclareRobustCommand{\@OrdinalstringNgerman}[2]{%
\@ordinalstringNgerman{#1}{\@@num@str}%
\edef#2{\protect\MakeUppercase\@@num@str}}
%    \end{macrocode}
% Code for converting numbers into textual ordinals. As before,
% it is easier to split it into units, tens and teens.
% Units:
%    \begin{macrocode}
\newcommand{\@@unitthstringMgerman}[1]{%
\ifcase#1%
nullter%
\or erster%
\or zweiter%
\or dritter%
\or vierter%
\or f\"unter%
\or sechster%
\or siebter%
\or achter%
\or neunter%
\fi
}
%    \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
}
%    \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
}
%    \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
}
%    \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
}
%    \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
}
%    \end{macrocode}
% Units (neuter):
%    \begin{macrocode}
\newcommand{\@@unitthstringNgerman}[1]{%
\ifcase#1%
nulltes%
\or erstes%
\or zweites%
\or drittes%
\or viertes%
\or f\"unte%
\or sechstes%
\or siebtes%
\or achtes%
\or neuntes%
\fi
}
%    \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
}
%    \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
}
%    \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
    \let\@@fc@numstr#2\relax
    \edef#2{\@@fc@numstr\@unitstring{#1}}%
  \fi
\else
  \@tmpstrctr=#1\relax
  \@modulo{\@tmpstrctr}{10}%
  \ifnum#1<20\relax
    \let\@@fc@numstr#2\relax
    \edef#2{\@@fc@numstr\@teenstring{\@tmpstrctr}}%
  \else
    \ifnum\@tmpstrctr=0\relax
    \else
      \let\@@fc@numstr#2\relax
      \edef#2{\@@fc@numstr\@unitstring{\@tmpstrctr}und}%
    \fi
    \@tmpstrctr=#1\relax
    \divide\@tmpstrctr by 10\relax
    \let\@@fc@numstr#2\relax
    \edef#2{\@@fc@numstr\@tenstring{\@tmpstrctr}}%
  \fi
\fi
}
%    \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
% #1 is >= 2000, \@strctr now contains the number of thousands
\@@numberunderhundredgerman{\@strctr}{#2}%
  \let\@@fc@numstr#2\relax
  \edef#2{\@@fc@numstr tausend}%
\else
% #1 lies in range [1000,1999]
  \ifnum\@strctr=1\relax
    \let\@@fc@numstr#2\relax
    \edef#2{\@@fc@numstr\eintausend}%
  \fi
\fi
\@strctr=#1\relax
\@modulo{\@strctr}{1000}%
\divide\@strctr by 100\relax
\ifnum\@strctr>1\relax
% now dealing with number in range [200,999]
  \let\@@fc@numstr#2\relax
  \edef#2{\@@fc@numstr\@unitstring{\@strctr}hundert}%
\else
   \ifnum\@strctr=1\relax
% dealing with number in range [100,199]
     \ifnum#1>1000\relax
% if orginal number > 1000, use einhundert
        \let\@@fc@numstr#2\relax
        \edef#2{\@@fc@numstr einhundert}%
     \else
% otherwise use \einhundert
        \let\@@fc@numstr#2\relax
        \edef#2{\@@fc@numstr\einhundert}%
      \fi
   \fi
\fi
\@strctr=#1\relax
\@modulo{\@strctr}{100}%
\ifnum#1=0\relax
  \def#2{null}%
\else
  \ifnum\@strctr=1\relax
    \let\@@fc@numstr#2\relax
    \edef#2{\@@fc@numstr eins}%
  \else
    \@@numberunderhundredgerman{\@strctr}{#2}%
  \fi
\fi
}
%    \end{macrocode}
% As above, but for ordinals
%    \begin{macrocode}
\newcommand{\@@numberunderhundredthgerman}[2]{%
\ifnum#1<10\relax
 \let\@@fc@numstr#2\relax
 \edef#2{\@@fc@numstr\@unitthstring{#1}}%
\else
  \@tmpstrctr=#1\relax
  \@modulo{\@tmpstrctr}{10}%
  \ifnum#1<20\relax
    \let\@@fc@numstr#2\relax
    \edef#2{\@@fc@numstr\@teenthstring{\@tmpstrctr}}%
  \else
    \ifnum\@tmpstrctr=0\relax
    \else
      \let\@@fc@numstr#2\relax
      \edef#2{\@@fc@numstr\@unitstring{\@tmpstrctr}und}%
    \fi
    \@tmpstrctr=#1\relax
    \divide\@tmpstrctr by 10\relax
    \let\@@fc@numstr#2\relax
    \edef#2{\@@fc@numstr\@tenthstring{\@tmpstrctr}}%
  \fi
\fi
}
%    \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
% #1 is >= 2000, \@strctr now contains the number of thousands
\@@numberunderhundredgerman{\@strctr}{#2}%
  \let\@@fc@numstr#2\relax
  % is that it, or is there more?
  \@tmpstrctr=#1\relax \@modulo{\@tmpstrctr}{1000}%
  \ifnum\@tmpstrctr=0\relax
    \edef#2{\@@fc@numstr\@thousandth}%
  \else
    \edef#2{\@@fc@numstr tausend}%
  \fi
\else
% #1 lies in range [1000,1999]
  \ifnum\@strctr=1\relax
    \ifnum#1=1000\relax
      \let\@@fc@numstr#2\relax
      \edef#2{\@@fc@numstr\@thousandth}%
    \else
      \let\@@fc@numstr#2\relax
      \edef#2{\@@fc@numstr\eintausend}%
    \fi
  \fi
\fi
\@strctr=#1\relax
\@modulo{\@strctr}{1000}%
\divide\@strctr by 100\relax
\ifnum\@strctr>1\relax
% now dealing with number in range [200,999]
  \let\@@fc@numstr#2\relax
  % is that it, or is there more?
  \@tmpstrctr=#1\relax \@modulo{\@tmpstrctr}{100}%
  \ifnum\@tmpstrctr=0\relax
     \ifnum\@strctr=1\relax
       \edef#2{\@@fc@numstr\@hundredth}%
     \else
       \edef#2{\@@fc@numstr\@unitstring{\@strctr}\@hundredth}%
     \fi
  \else
     \edef#2{\@@fc@numstr\@unitstring{\@strctr}hundert}%
  \fi
\else
   \ifnum\@strctr=1\relax
% dealing with number in range [100,199]
% is that it, or is there more?
     \@tmpstrctr=#1\relax \@modulo{\@tmpstrctr}{100}%
     \ifnum\@tmpstrctr=0\relax
        \let\@@fc@numstr#2\relax
        \edef#2{\@@fc@numstr\@hundredth}%
     \else
     \ifnum#1>1000\relax
        \let\@@fc@numstr#2\relax
        \edef#2{\@@fc@numstr einhundert}%
     \else
        \let\@@fc@numstr#2\relax
        \edef#2{\@@fc@numstr\einhundert}%
     \fi
     \fi
   \fi
\fi
\@strctr=#1\relax
\@modulo{\@strctr}{100}%
\ifthenelse{\@strctr=0 \and #1>0}{}{%
\@@numberunderhundredthgerman{\@strctr}{#2}%
}%
}
%    \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}
\let\@ordinalMngerman=\@ordinalMgerman
\let\@ordinalFngerman=\@ordinalFgerman
\let\@ordinalNngerman=\@ordinalNgerman
\let\@numberstringMngerman=\@numberstringMgerman
\let\@numberstringFngerman=\@numberstringFgerman
\let\@numberstringNngerman=\@numberstringNgerman
\let\@NumberstringMngerman=\@NumberstringMgerman
\let\@NumberstringFngerman=\@NumberstringFgerman
\let\@NumberstringNngerman=\@NumberstringNgerman
\let\@ordinalstringMngerman=\@ordinalstringMgerman
\let\@ordinalstringFngerman=\@ordinalstringFgerman
\let\@ordinalstringNngerman=\@ordinalstringNgerman
\let\@OrdinalstringMngerman=\@OrdinalstringMgerman
\let\@OrdinalstringFngerman=\@OrdinalstringFgerman
\let\@OrdinalstringNngerman=\@OrdinalstringNgerman
%    \end{macrocode}
%\iffalse
%    \begin{macrocode}
%</fc-german.def>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<*fc-portuges.def>
%    \end{macrocode}
%\fi
% \subsection{fc-portuges.def}
% Portuguse definitions
%    \begin{macrocode}
\ProvidesFile{fc-portuges.def}[2007/05/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}
%    \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}
%    \end{macrocode}
% Make neuter same as masculine:
%    \begin{macrocode}
\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):
%    \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
}
%   \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
}
%    \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
}
%    \end{macrocode}
% Teens (argument must be a number from 0 to 9):
%    \begin{macrocode}
\newcommand*{\@@teenstringportuges}[1]{%
\ifcase#1\relax
dez%
\or onze%
\or doze%
\or treze%
\or quatorze%
\or quinze%
\or dezesseis%
\or dezessete%
\or dezoito%
\or dezenove%
\fi
}
%    \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}
%    \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}
%    \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
}
%    \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
}
%    \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
}
%    \end{macrocode}
% Teens (with initial letter in upper case):
%    \begin{macrocode}
\newcommand*{\@@Teenstringportuges}[1]{%
\ifcase#1\relax
Dez%
\or Onze%
\or Doze%
\or Treze%
\or Quatorze%
\or Quinze%
\or Dezesseis%
\or Dezessete%
\or Dezoito%
\or Dezenove%
\fi
}
%    \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}
%    \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}
%    \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.)
%    \begin{macrocode}
\DeclareRobustCommand{\@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}}
%    \end{macrocode}
% As above, but feminine form:
%    \begin{macrocode}
\DeclareRobustCommand{\@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}}
%    \end{macrocode}
% Make neuter same as masculine:
%    \begin{macrocode}
\let\@numberstringNportuges\@numberstringMportuges
%    \end{macrocode}
% As above, but initial letters in upper case:
%    \begin{macrocode}
\DeclareRobustCommand{\@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}}
%    \end{macrocode}
% As above, but feminine form:
%    \begin{macrocode}
\DeclareRobustCommand{\@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}}
%    \end{macrocode}
% Make neuter same as masculine:
%    \begin{macrocode}
\let\@NumberstringNportuges\@NumberstringMportuges
%    \end{macrocode}
% As above, but for ordinals.
%    \begin{macrocode}
\DeclareRobustCommand{\@ordinalstringMportuges}[2]{%
\let\@unitthstring=\@@unitthstringportuges
\let\@unitstring=\@@unitstringportuges
\let\@teenthstring=\@@teenthstringportuges
\let\@tenthstring=\@@tenthstringportuges
\let\@hundredthstring=\@@hundredthstringportuges
\def\@thousandth{mil\'esimo}%
\@@ordinalstringportuges{#1}{#2}}
%    \end{macrocode}
% Feminine form:
%    \begin{macrocode}
\DeclareRobustCommand{\@ordinalstringFportuges}[2]{%
\let\@unitthstring=\@@unitthstringFportuges
\let\@unitstring=\@@unitstringFportuges
\let\@teenthstring=\@@teenthstringportuges
\let\@tenthstring=\@@tenthstringFportuges
\let\@hundredthstring=\@@hundredthstringFportuges
\def\@thousandth{mil\'esima}%
\@@ordinalstringportuges{#1}{#2}}
%    \end{macrocode}
% Make neuter same as masculine:
%    \begin{macrocode}
\let\@ordinalstringNportuges\@ordinalstringMportuges
%    \end{macrocode}
% As above, but initial letters in upper case (masculine):
%    \begin{macrocode}
\DeclareRobustCommand{\@OrdinalstringMportuges}[2]{%
\let\@unitthstring=\@@Unitthstringportuges
\let\@unitstring=\@@Unitstringportuges
\let\@teenthstring=\@@teenthstringportuges
\let\@tenthstring=\@@Tenthstringportuges
\let\@hundredthstring=\@@Hundredthstringportuges
\def\@thousandth{Mil\'esimo}%
\@@ordinalstringportuges{#1}{#2}}
%    \end{macrocode}
% Feminine form:
%    \begin{macrocode}
\DeclareRobustCommand{\@OrdinalstringFportuges}[2]{%
\let\@unitthstring=\@@UnitthstringFportuges
\let\@unitstring=\@@UnitstringFportuges
\let\@teenthstring=\@@teenthstringportuges
\let\@tenthstring=\@@TenthstringFportuges
\let\@hundredthstring=\@@HundredthstringFportuges
\def\@thousandth{Mil\'esima}%
\@@ordinalstringportuges{#1}{#2}}
%    \end{macrocode}
% Make neuter same as masculine:
%    \begin{macrocode}
\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
}
%    \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
}
%    \end{macrocode}
% Teens:
%    \begin{macrocode}
\newcommand*{\@@teenthstringportuges}[1]{%
\@tenthstring{1}%
\ifnum#1>0\relax
-\@unitthstring{#1}%
\fi}
%    \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}
%    \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
}
%    \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
}
%    \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}
%    \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
}
%    \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
}
%    \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}
%    \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
}
%    \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
}
%    \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}
%    \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
\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
% #1 is greater or equal to 10000
  \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
    \@modulo{\@strctr}{10}%
    \ifnum\@strctr>0
      \ifnum\@strctr=1\relax
        \let\@@fc@numstr#2\relax
        \edef#2{\@@fc@numstr\ \@andname}%
      \fi
      \let\@@fc@numstr#2\relax
      \edef#2{\@@fc@numstr\ \@unitstring{\@strctr}}%
    \fi
  \else
    \@strctr=#1\relax
    \divide\@strctr by 1000\relax
    \@modulo{\@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 \@modulo{\@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
  \@modulo{\@tmpstrctr}{1000}%
  \let\@@fc@numstr#2\relax
  \ifnum\@tmpstrctr=100\relax
    \edef#2{\@@fc@numstr\@tenstring{10}}%
  \else
    \edef#2{\@@fc@numstr\@hundredstring{\@strctr}}%
  \fi%
\fi
\@strctr=#1\relax \@modulo{\@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 \@modulo{\@strctr}{10}%
  \ifnum\@strctr>0
    \ifnum\@strctr=1\relax
      \let\@@fc@numstr#2\relax
      \edef#2{\@@fc@numstr\ \@andname}%
    \else
      \ifnum#1>100\relax
        \let\@@fc@numstr#2\relax
        \edef#2{\@@fc@numstr\ \@andname}%
      \fi
    \fi 
    \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%(>0,<10)
      \let\@@fc@numstr#2\relax
      \edef#2{\@@fc@numstr\@unitstring{\@strctr}}%
    \fi
  \else%>10
    \@modulo{\@strctr}{10}%
    \let\@@fc@numstr#2\relax
    \edef#2{\@@fc@numstr\@teenstring{\@strctr}}%
  \fi
\fi
}
%    \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
        \@modulo{\@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
        \@modulo{\@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
\@modulo{\@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
\@modulo{\@strctr}{100}%
\ifnum#1>99\relax
  \ifnum\@strctr>0\relax
    \let\@@fc@ordstr#2\relax
    \edef#2{\@@fc@ordstr-}%
  \fi
\fi
\ifnum\@strctr>9\relax
  \@tmpstrctr=\@strctr
  \divide\@tmpstrctr by 10\relax
  \let\@@fc@ordstr#2\relax
  \edef#2{\@@fc@ordstr\@tenthstring{\@tmpstrctr}}%
  \@tmpstrctr=\@strctr
  \@modulo{\@tmpstrctr}{10}%
  \ifnum\@tmpstrctr>0\relax
    \let\@@fc@ordstr#2\relax
    \edef#2{\@@fc@ordstr-\@unitthstring{\@tmpstrctr}}%
  \fi
\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
}
%    \end{macrocode}
%\iffalse
%    \begin{macrocode}
%</fc-portuges.def>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<*fc-spanish.def>
%    \end{macrocode}
%\fi
% \subsection{fc-spanish.def}
% Spanish definitions
%    \begin{macrocode}
\ProvidesFile{fc-spanish.def}[2007/05/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 must be a control sequence.
% Masculine:
%    \begin{macrocode}
\newcommand{\@ordinalMspanish}[2]{%
\edef#2{\number#1\relax\noexpand\fmtord{o}}}
%    \end{macrocode}
% Feminine:
%    \begin{macrocode}
\newcommand{\@ordinalFspanish}[2]{%
\edef#2{\number#1\relax\noexpand\fmtord{a}}}
%    \end{macrocode}
% Make neuter same as masculine:
%    \begin{macrocode}
\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
}
%    \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
}
%    \end{macrocode}
% Tens (argument must go from 1 to 10):
%    \begin{macrocode}
\newcommand{\@@tenstringspanish}[1]{%
\ifcase#1\relax
\or diez%
\or viente%
\or treinta%
\or cuarenta%
\or cincuenta%
\or sesenta%
\or setenta%
\or ochenta%
\or noventa%
\or cien%
\fi
}
%    \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
}
%    \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}
%    \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}
%    \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}
%    \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}
%    \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
}
%    \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
}
%    \end{macrocode}
% Tens:
%    \begin{macrocode}
\newcommand{\@@Tenstringspanish}[1]{%
\ifcase#1\relax
\or Diez%
\or Viente%
\or Treinta%
\or Cuarenta%
\or Cincuenta%
\or Sesenta%
\or Setenta%
\or Ochenta%
\or Noventa%
\or Cien%
\fi
}
%    \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
}
%    \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}
%    \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}
%    \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}
%    \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}
%    \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}
\DeclareRobustCommand{\@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}}
%    \end{macrocode}
% Feminine form:
%    \begin{macrocode}
\DeclareRobustCommand{\@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{y}%
\@@numberstringspanish{#1}{#2}}
%    \end{macrocode}
% Make neuter same as masculine:
%    \begin{macrocode}
\let\@numberstringNspanish\@numberstringMspanish
%    \end{macrocode}
% As above, but initial letters in upper case:
%    \begin{macrocode}
\DeclareRobustCommand{\@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}}
%    \end{macrocode}
% Feminine form:
%    \begin{macrocode}
\DeclareRobustCommand{\@NumberstringFspanish}[2]{%
\let\@unitstring=\@@UnitstringFspanish
\let\@teenstring=\@@Teenstringspanish
\let\@tenstring=\@@Tenstringspanish
\let\@twentystring=\@@TwentystringFspanish
\let\@hundredstring=\@@HundredstringFspanish
\def\@andname{y}%
\def\@hundred{Cien}\def\@thousand{Mil}%
\@@numberstringspanish{#1}{#2}}
%    \end{macrocode}
% Make neuter same as masculine:
%    \begin{macrocode}
\let\@NumberstringNspanish\@NumberstringMspanish
%    \end{macrocode}
% As above, but for ordinals.
%    \begin{macrocode}
\DeclareRobustCommand{\@ordinalstringMspanish}[2]{%
\let\@unitthstring=\@@unitthstringspanish
\let\@unitstring=\@@unitstringspanish
\let\@teenthstring=\@@teenthstringspanish
\let\@tenthstring=\@@tenthstringspanish
\let\@hundredthstring=\@@hundredthstringspanish
\def\@thousandth{mil\'esimo}%
\@@ordinalstringspanish{#1}{#2}}
%    \end{macrocode}
% Feminine form:
%    \begin{macrocode}
\DeclareRobustCommand{\@ordinalstringFspanish}[2]{%
\let\@unitthstring=\@@unitthstringFspanish
\let\@unitstring=\@@unitstringFspanish
\let\@teenthstring=\@@teenthstringFspanish
\let\@tenthstring=\@@tenthstringFspanish
\let\@hundredthstring=\@@hundredthstringFspanish
\def\@thousandth{mil\'esima}%
\@@ordinalstringspanish{#1}{#2}}
%    \end{macrocode}
% Make neuter same as masculine:
%    \begin{macrocode}
\let\@ordinalstringNspanish\@ordinalstringMspanish
%    \end{macrocode}
% As above, but with initial letters in upper case.
%    \begin{macrocode}
\DeclareRobustCommand{\@OrdinalstringMspanish}[2]{%
\let\@unitthstring=\@@Unitthstringspanish
\let\@unitstring=\@@Unitstringspanish
\let\@teenthstring=\@@Teenthstringspanish
\let\@tenthstring=\@@Tenthstringspanish
\let\@hundredthstring=\@@Hundredthstringspanish
\def\@thousandth{Mil\'esimo}%
\@@ordinalstringspanish{#1}{#2}}
%    \end{macrocode}
% Feminine form:
%    \begin{macrocode}
\DeclareRobustCommand{\@OrdinalstringFspanish}[2]{%
\let\@unitthstring=\@@UnitthstringFspanish
\let\@unitstring=\@@UnitstringFspanish
\let\@teenthstring=\@@TeenthstringFspanish
\let\@tenthstring=\@@TenthstringFspanish
\let\@hundredthstring=\@@HundredthstringFspanish
\def\@thousandth{Mil\'esima}%
\@@ordinalstringspanish{#1}{#2}}
%    \end{macrocode}
% Make neuter same as masculine:
%    \begin{macrocode}
\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
}
%    \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
}
%    \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
}
%    \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}
%    \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
}
%    \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
}
%    \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
}
%    \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}
%    \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
}
%    \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
}
%    \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
}
%    \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}
%    \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
}
%    \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
}
%    \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
}
%    \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}

%    \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
% #1 is greater or equal to 10000
  \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
    \@modulo{\@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
    \@modulo{\@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 \@modulo{\@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
  \@modulo{\@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 \@modulo{\@strctr}{100}%
\ifnum#1>100\relax
  \ifnum\@strctr>0\relax
    \let\@@fc@numstr#2\relax
    \edef#2{\@@fc@numstr\ \@andname\ }%
  \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 \@modulo{\@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
      \@modulo{\@strctr}{10}%
      \let\@@fc@numstr#2\relax
      \edef#2{\@@fc@numstr\@twentystring{\@strctr}}%
    \else
      \@modulo{\@strctr}{10}%
      \let\@@fc@numstr#2\relax
      \edef#2{\@@fc@numstr\@teenstring{\@strctr}}%
    \fi
  \fi
\fi
}
%    \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
        \@modulo{\@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
        \@modulo{\@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
\@modulo{\@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
\@modulo{\@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
  \@modulo{\@tmpstrctr}{10}%
  \ifnum\@tmpstrctr>0\relax
    \let\@@fc@ordstr#2\relax
    \edef#2{\@@fc@ordstr\ \@unitthstring{\@tmpstrctr}}%
  \fi
\else
  \ifnum\@strctr>9\relax
    \@modulo{\@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
}
%    \end{macrocode}
%\iffalse
%    \begin{macrocode}
%</fc-spanish.def>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<*fc-UKenglish.def>
%    \end{macrocode}
%\fi
% \subsection{fc-UKenglish.def}
% UK English definitions
%    \begin{macrocode}
\ProvidesFile{fc-UKenglish}[2007/06/14]
%    \end{macrocode}
% Check that fc-english.def has been loaded
%    \begin{macrocode}
\@ifundefined{@ordinalMenglish}{\input{fc-english.def}}{}
%    \end{macrocode}
% These are all just synonyms for the commands provided by
% fc-english.def.
%    \begin{macrocode}
\let\@ordinalMUKenglish\@ordinalMenglish
\let\@ordinalFUKenglish\@ordinalMenglish
\let\@ordinalNUKenglish\@ordinalMenglish
\let\@numberstringMUKenglish\@numberstringMenglish
\let\@numberstringFUKenglish\@numberstringMenglish
\let\@numberstringNUKenglish\@numberstringMenglish
\let\@NumberstringMUKenglish\@NumberstringMenglish
\let\@NumberstringFUKenglish\@NumberstringMenglish
\let\@NumberstringNUKenglish\@NumberstringMenglish
\let\@ordinalstringMUKenglish\@ordinalstringMenglish
\let\@ordinalstringFUKenglish\@ordinalstringMenglish
\let\@ordinalstringNUKenglish\@ordinalstringMenglish
\let\@OrdinalstringMUKenglish\@OrdinalstringMenglish
\let\@OrdinalstringFUKenglish\@OrdinalstringMenglish
\let\@OrdinalstringNUKenglish\@OrdinalstringMenglish
%    \end{macrocode}
%\iffalse
%    \begin{macrocode}
%</fc-UKenglish.def>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<*fc-USenglish.def>
%    \end{macrocode}
%\fi
% \subsection{fc-USenglish.def}
% US English definitions
%    \begin{macrocode}
\ProvidesFile{fc-USenglish}[2007/06/14]
%    \end{macrocode}
% Check that fc-english.def has been loaded
%    \begin{macrocode}
\@ifundefined{@ordinalMenglish}{\input{fc-english.def}}{}
%    \end{macrocode}
% These are all just synonyms for the commands provided by
% fc-english.def.
%    \begin{macrocode}
\let\@ordinalMUSenglish\@ordinalMenglish
\let\@ordinalFUSenglish\@ordinalMenglish
\let\@ordinalNUSenglish\@ordinalMenglish
\let\@numberstringMUSenglish\@numberstringMenglish
\let\@numberstringFUSenglish\@numberstringMenglish
\let\@numberstringNUSenglish\@numberstringMenglish
\let\@NumberstringMUSenglish\@NumberstringMenglish
\let\@NumberstringFUSenglish\@NumberstringMenglish
\let\@NumberstringNUSenglish\@NumberstringMenglish
\let\@ordinalstringMUSenglish\@ordinalstringMenglish
\let\@ordinalstringFUSenglish\@ordinalstringMenglish
\let\@ordinalstringNUSenglish\@ordinalstringMenglish
\let\@OrdinalstringMUSenglish\@OrdinalstringMenglish
\let\@OrdinalstringFUSenglish\@OrdinalstringMenglish
\let\@OrdinalstringNUSenglish\@OrdinalstringMenglish
%    \end{macrocode}
%\iffalse
%    \begin{macrocode}
%</fc-USenglish.def>
%    \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}[2007/07/20 v1.3]
\RequirePackage{ifthen}
\RequirePackage{keyval}
%    \end{macrocode}
% These commands need to be defined before the
% configuration file is loaded.\changes{1.3}{2007/7/19}{no
%longer using xspace package}
%
% Define the macro to format the |st|, |nd|, |rd| or |th| of an 
% ordinal.
%\begin{macro}{\fmtord}
%    \begin{macrocode}
\providecommand*{\fmtord}[1]{\textsuperscript{#1}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\padzeros}
%\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}
% Load appropriate language definition files:
%\changes{v1.1}{14 June 2007}{added check for UKenglish,
% british and USenglish babel settings}
%    \begin{macrocode}
\@ifundefined{l@english}{}{\input{fc-english.def}}
\@ifundefined{l@UKenglish}{}{\input{fc-UKenglish.def}}
\@ifundefined{l@british}{}{\input{fc-british.def}}
\@ifundefined{l@USenglish}{}{\input{fc-USenglish.def}}
\@ifundefined{l@spanish}{}{\input{fc-spanish.def}}
\@ifundefined{l@portuges}{}{\input{fc-portuges.def}}
\@ifundefined{l@french}{}{\input{fc-french.def}}
\@ifundefined{l@german}{%
\@ifundefined{l@ngerman}{}{\input{fc-german.def}}}{%
\input{fc-german.def}}
%    \end{macrocode}
%\begin{macro}{\fmtcount@french}
% Define keys for use with |\fmtcountsetoptions|.
% Key to switch French dialects (Does babel store
%this kind of information?)
%    \begin{macrocode}
\def\fmtcount@french{france}
\define@key{fmtcount}{french}[france]{%
\@ifundefined{datefrench}{%
\PackageError{fmtcount}{Language `french' not defined}{You need
to load babel before loading fmtcount}}{
\ifthenelse{\equal{#1}{france}
         \or\equal{#1}{swiss}
         \or\equal{#1}{belgian}}{%
         \def\fmtcount@french{#1}}{%
\PackageError{fmtcount}{Invalid value `#1' to french key}
{Option `french' can only take the values `france', 
`belgian' or `swiss'}}
}}
%    \end{macrocode}
%\end{macro}
% Key to determine how to display the ordinal
%    \begin{macrocode}
\define@key{fmtcount}{fmtord}{%
\ifthenelse{\equal{#1}{level}
          \or\equal{#1}{raise}
          \or\equal{#1}{user}}{
          \def\fmtcount@fmtord{#1}}{%
\PackageError{fmtcount}{Invalid value `#1' to fmtord key}
{Option `fmtord' can only take the values `level', `raise' 
or `user'}}}
%    \end{macrocode}
%\begin{macro}{\iffmtord@abbrv}
% Key to determine whether the ordinal should be abbreviated
% (language dependent, currently only affects French ordinals.)
%    \begin{macrocode}
\newif\iffmtord@abbrv
\fmtord@abbrvfalse
\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 `fmtord' can only take the values `true' or
`false'}}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\fmtcountsetoptions}
% Define command to set options.
%    \begin{macrocode}
\newcommand*{\fmtcountsetoptions}[1]{%
\def\fmtcount@fmtord{}%
\setkeys{fmtcount}{#1}%
\@ifundefined{datefrench}{}{%
\edef\@ordinalstringMfrench{\noexpand
\csname @ordinalstringMfrench\fmtcount@french\noexpand\endcsname}%
\edef\@ordinalstringFfrench{\noexpand
\csname @ordinalstringFfrench\fmtcount@french\noexpand\endcsname}%
\edef\@OrdinalstringMfrench{\noexpand
\csname @OrdinalstringMfrench\fmtcount@french\noexpand\endcsname}%
\edef\@OrdinalstringFfrench{\noexpand
\csname @OrdinalstringFfrench\fmtcount@french\noexpand\endcsname}%
\edef\@numberstringMfrench{\noexpand
\csname @numberstringMfrench\fmtcount@french\noexpand\endcsname}%
\edef\@numberstringFfrench{\noexpand
\csname @numberstringFfrench\fmtcount@french\noexpand\endcsname}%
\edef\@NumberstringMfrench{\noexpand
\csname @NumberstringMfrench\fmtcount@french\noexpand\endcsname}%
\edef\@NumberstringFfrench{\noexpand
\csname @NumberstringFfrench\fmtcount@french\noexpand\endcsname}%
}%
%
\ifthenelse{\equal{\fmtcount@fmtord}{level}}{%
\renewcommand{\fmtord}[1]{##1}}{%
\ifthenelse{\equal{\fmtcount@fmtord}{raise}}{%
\renewcommand{\fmtord}[1]{\textsuperscript{##1}}}{%
}}
}
%    \end{macrocode}
%\end{macro}
% Load confguration 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.
%    \begin{macrocode}
\InputIfFileExists{fmtcount.cfg}{%
\typeout{Using configuration file fmtcount.cfg}}{%
\typeout{No configuration file fmtcount.cfg found.}}
%    \end{macrocode}
%Declare options
%    \begin{macrocode}
\DeclareOption{level}{\def\fmtcount@fmtord{level}%
\def\fmtord#1{#1}}
\DeclareOption{raise}{\def\fmtcount@fmtord{raise}%
\def\fmtord#1{\textsuperscript{#1}}}
%    \end{macrocode}
% Process package options
%    \begin{macrocode}
\ProcessOptions
%    \end{macrocode}
%\begin{macro}{\@modulo}
%\begin{definition}
%\cs{@modulo}\marg{count reg}\marg{n}
%\end{definition}
% Sets the count register to be its value modulo \meta{n}. 
% This is used for the
% date, time, ordinal and numberstring commands. (The fmtcount
% package was originally part of the datetime package.)
%    \begin{macrocode}
\newcount\@DT@modctr
\def\@modulo#1#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.
%    \begin{macrocode}
\newcommand*{\@binary}[1]{%
\@DT@padzeroestrue
\@DT@loopN=17\relax
\@strctr=\@DT@loopN
\whiledo{\@strctr<\c@padzeroesN}{0\advance\@strctr by 1}%
\@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 2\relax
\advance\@DT@loopN by -1\relax
\ifnum\@strctr>1
\repeat
\the\@DT@X}

\let\binarynum=\@binary
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\octalnum}
% Converts a decimal number to octal, and displays.
%    \begin{macrocode}
\newcommand*{\@octal}[1]{%
\ifnum#1>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 1}%
\@strctr=32768\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 8\relax
\advance\@DT@loopN by -1\relax
\ifnum\@strctr>1
\repeat
\the\@DT@X
\fi}
\let\octalnum=\@octal
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\hexadecimalnum}
% Converts a decimal number to a lowercase hexadecimal number, 
% and displays it.
%    \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}

\newcommand*{\@hexadecimal}[1]{%
\@DT@padzeroestrue
\@DT@loopN=5\relax
\@strctr=\@DT@loopN
\whiledo{\@strctr<\c@padzeroesN}{0\advance\@strctr by 1}%
\@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 -1\relax
\ifnum\@strctr>1
\repeat
\@@hexadecimal\@DT@X}

\let\hexadecimalnum=\@hexadecimal
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\Hexadecimalnum}
% Uppercase hexadecimal
%    \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}

\newcommand*{\@Hexadecimal}[1]{%
\@DT@padzeroestrue
\@DT@loopN=5\relax
\@strctr=\@DT@loopN
\whiledo{\@strctr<\c@padzeroesN}{0\advance\@strctr by 1}%
\@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 -1\relax
\ifnum\@strctr>1
\repeat
\@@Hexadecimal\@DT@X}

\let\Hexadecimalnum=\@Hexadecimal
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\aaalphnum}
% Lowercase alphabetical representation (a \ldots\ z aa \ldots\ zz)
%    \begin{macrocode}
\newcommand*{\@aaalph}[1]{%
\@DT@loopN=#1\relax
\advance\@DT@loopN by -1\relax
\divide\@DT@loopN by 26\relax
\@DT@modctr=\@DT@loopN
\multiply\@DT@modctr by 26\relax
\@DT@X=#1\relax
\advance\@DT@X by -1\relax
\advance\@DT@X by -\@DT@modctr
\advance\@DT@loopN by 1\relax
\advance\@DT@X by 1\relax
\loop
\@alph\@DT@X
\advance\@DT@loopN by -1\relax
\ifnum\@DT@loopN>0
\repeat
}

\let\aaalphnum=\@aaalph
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\AAAlphnum}
% Uppercase alphabetical representation (a \ldots\ z aa \ldots\ zz)
%    \begin{macrocode}
\newcommand*{\@AAAlph}[1]{%
\@DT@loopN=#1\relax
\advance\@DT@loopN by -1\relax
\divide\@DT@loopN by 26\relax
\@DT@modctr=\@DT@loopN
\multiply\@DT@modctr by 26\relax
\@DT@X=#1\relax
\advance\@DT@X by -1\relax
\advance\@DT@X by -\@DT@modctr
\advance\@DT@loopN by 1\relax
\advance\@DT@X by 1\relax
\loop
\@Alph\@DT@X
\advance\@DT@loopN by -1\relax
\ifnum\@DT@loopN>0
\repeat
}

\let\AAAlphnum=\@AAAlph
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\abalphnum}
% Lowercase alphabetical representation
%    \begin{macrocode}
\newcommand*{\@abalph}[1]{%
\ifnum#1>17576\relax
\PackageError{fmtcount}{Value of counter too large for 
\protect\@abalph}{Maximum value 17576}%
\else
\@DT@padzeroestrue
\@strctr=17576\relax
\@DT@X=#1\relax
\advance\@DT@X by -1\relax
\loop
\@DT@modctr=\@DT@X
\divide\@DT@modctr by \@strctr
\ifthenelse{\boolean{@DT@padzeroes}\and
\(\@DT@modctr=1\)}{}{\@alph\@DT@modctr}%
\ifnum\@DT@modctr=1\else\@DT@padzeroesfalse\fi
\multiply\@DT@modctr by \@strctr
\advance\@DT@X by -\@DT@modctr
\divide\@strctr by 26\relax
\ifnum\@strctr>1
\repeat
\advance\@DT@X by 1\relax
\@alph\@DT@X
\fi}

\let\abalphnum=\@abalph
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\ABAlphnum}
% Uppercase alphabetical representation
%    \begin{macrocode}
\newcommand*{\@ABAlph}[1]{%
\ifnum#1>17576\relax
\PackageError{fmtcount}{Value of counter too large for 
\protect\@ABAlph}{Maximum value 17576}%
\else
\@DT@padzeroestrue
\@strctr=17576\relax
\@DT@X=#1\relax
\advance\@DT@X by -1\relax
\loop
\@DT@modctr=\@DT@X
\divide\@DT@modctr by \@strctr
\ifthenelse{\boolean{@DT@padzeroes}\and
\(\@DT@modctr=1\)}{}{\@Alph\@DT@modctr}%
\ifnum\@DT@modctr=1\else\@DT@padzeroesfalse\fi
\multiply\@DT@modctr by \@strctr
\advance\@DT@X by -\@DT@modctr
\divide\@strctr by 26\relax
\ifnum\@strctr>1
\repeat
\advance\@DT@X by 1\relax
\@Alph\@DT@X
\fi}

\let\ABAlphnum=\@ABAlph
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@fmtc@count}
% Recursive command to count number of characters in argument.
% |\@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}
% Format number as a decimal, possibly padded with zeroes in front.
%    \begin{macrocode}
\newcommand{\@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}%
\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. 
%    \begin{macrocode}
\newcommand{\FCordinal}[1]{%
\expandafter\protect\expandafter\ordinalnum{%
\expandafter\the\csname c@#1\endcsname}}
%    \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.
%    \begin{macrocode}
\@ifundefined{ordinal}{\let\ordinal\FCordinal}{%
\PackageWarning{fmtcount}{\string\ordinal
\space already defined use \string\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:
%    \begin{macrocode}
\newcommand*{\ordinalnum}[1]{\@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.)
%    \begin{macrocode}
\newcommand*{\storeordinal}[2]{%
\expandafter\protect\expandafter\storeordinalnum{#1}{%
\expandafter\the\csname c@#2\endcsname}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\storeordinalnum}
% Store ordinal (first argument
% is identifying name, second argument is a number or
% count register.)
%    \begin{macrocode}
\newcommand*{\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)
%    \begin{macrocode}
\newcommand*{\ordinalstring}[1]{%
\expandafter\protect\expandafter\ordinalstringnum{%
\expandafter\the\csname c@#1\endcsname}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\ordinalstringnum}
% Display ordinal as a string (argument is a count register or
% number.)
%    \begin{macrocode}
\newcommand{\ordinalstringnum}[1]{%
\@ifnextchar[{\@ordinal@string{#1}}{\@ordinal@string{#1}[m]}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@ordinal@string}
% Display ordinal as a string 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' to 
\string\ordinalstring}{Available options are m, f or f}}%
\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.
%    \begin{macrocode}
\newcommand*{\storeordinalstring}[2]{%
\expandafter\protect\expandafter\storeordinalstringnum{#1}{%
\expandafter\the\csname c@#2\endcsname}}
%    \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.
%    \begin{macrocode}
\newcommand*{\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.
%    \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 
\string\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)
%    \begin{macrocode}
\newcommand*{\Ordinalstring}[1]{%
\expandafter\protect\expandafter\Ordinalstringnum{%
\expandafter\the\csname c@#1\endcsname}}
%    \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)
%    \begin{macrocode}
\newcommand*{\Ordinalstringnum}[1]{%
\@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.
%    \begin{macrocode}
\newcommand*{\storeOrdinalstring}[2]{%
\expandafter\protect\expandafter\storeOrdinalstringnum{#1}{%
\expandafter\the\csname c@#2\endcsname}}
%    \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.
%    \begin{macrocode}
\newcommand*{\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.
%    \begin{macrocode}
\newcommand*{\storeORDINALstring}[2]{%
\expandafter\protect\expandafter\storeORDINALstringnum{#1}{%
\expandafter\the\csname c@#2\endcsname}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\storeORDINALstringnum}
% As above, but the second argument is a count register or a
% number.
%    \begin{macrocode}
\newcommand*{\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}}}%
\expandafter\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.
%    \begin{macrocode}
\newcommand*{\ORDINALstring}[1]{%
\expandafter\protect\expandafter\ORDINALstringnum{%
\expandafter\the\csname c@#1\endcsname}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\ORDINALstringnum}
% As above, but the argument is a count register or a number.
%    \begin{macrocode}
\newcommand*{\ORDINALstringnum}[1]{%
\@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.
%    \begin{macrocode}
\newcommand*{\storenumberstring}[2]{%
\expandafter\protect\expandafter\storenumberstringnum{#1}{%
\expandafter\the\csname c@#2\endcsname}}
%    \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.
%    \begin{macrocode}
\newcommand*{\numberstring}[1]{%
\expandafter\protect\expandafter\numberstringnum{%
\expandafter\the\csname c@#1\endcsname}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\numberstringnum}
% As above, but the argument is a count register or a number.
%    \begin{macrocode}
\newcommand*{\numberstringnum}[1]{%
\@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.
%    \begin{macrocode}
\newcommand*{\storeNumberstring}[2]{%
\expandafter\protect\expandafter\storeNumberstringnum{#1}{%
\expandafter\the\csname c@#2\endcsname}}
%    \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. 
%    \begin{macrocode}
\newcommand*{\Numberstring}[1]{%
\expandafter\protect\expandafter\Numberstringnum{%
\expandafter\the\csname c@#1\endcsname}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\Numberstringnum}
% As above, but the argument is a count register or number.
%    \begin{macrocode}
\newcommand*{\Numberstringnum}[1]{%
\@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.
%    \begin{macrocode}
\newcommand{\storeNUMBERstring}[2]{%
\expandafter\protect\expandafter\storeNUMBERstringnum{#1}{%
\expandafter\the\csname c@#2\endcsname}}
%    \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.
%    \begin{macrocode}
\newcommand*{\NUMBERstring}[1]{%
\expandafter\protect\expandafter\NUMBERstringnum{%
\expandafter\the\csname c@#1\endcsname}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\NUMBERstringnum}
% As above, but the argument is a count register or a number.
%    \begin{macrocode}
\newcommand*{\NUMBERstringnum}[1]{%
\@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:
%    \begin{macrocode}
\providecommand*{\binary}[1]{%
\expandafter\protect\expandafter\@binary{%
\expandafter\the\csname c@#1\endcsname}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\aaalph}
% Like \verb"\alph", but goes beyond 26.
% (a \ldots\ z aa \ldots zz \ldots)
%    \begin{macrocode}
\providecommand*{\aaalph}[1]{%
\expandafter\protect\expandafter\@aaalph{%
\expandafter\the\csname c@#1\endcsname}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\AAAlph}
% As before, but upper case.
%    \begin{macrocode}
\providecommand*{\AAAlph}[1]{%
\expandafter\protect\expandafter\@AAAlph{%
\expandafter\the\csname c@#1\endcsname}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\abalph}
% Like \verb"\alph", but goes beyond 26. 
% (a \ldots\ z ab \ldots az \ldots)
%    \begin{macrocode}
\providecommand*{\abalph}[1]{%
\expandafter\protect\expandafter\@abalph{%
\expandafter\the\csname c@#1\endcsname}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\ABAlph}
% As above, but upper case.
%    \begin{macrocode}
\providecommand*{\ABAlph}[1]{%
\expandafter\protect\expandafter\@ABAlph{%
\expandafter\the\csname c@#1\endcsname}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\hexadecimal}
% Hexadecimal:
%    \begin{macrocode}
\providecommand*{\hexadecimal}[1]{%
\expandafter\protect\expandafter\@hexadecimal{%
\expandafter\the\csname c@#1\endcsname}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\Hexadecimal}
% As above, but in upper case.
%    \begin{macrocode}
\providecommand*{\Hexadecimal}[1]{%
\expandafter\protect\expandafter\@Hexadecimal{%
\expandafter\the\csname c@#1\endcsname}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\octal}
% Octal:
%    \begin{macrocode}
\providecommand*{\octal}[1]{%
\expandafter\protect\expandafter\@octal{%
\expandafter\the\csname c@#1\endcsname}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\decimal}
% Decimal:
%    \begin{macrocode}
\providecommand*{\decimal}[1]{%
\expandafter\protect\expandafter\@decimal{%
\expandafter\the\csname c@#1\endcsname}}
%    \end{macrocode}
%\end{macro}
%
%\subsubsection{Multilinguage Definitions}
%\begin{macro}{\@setdef@ultfmtcount}
% If multilingual support is provided, make \verb"\@numberstring" 
% etc use the correct language (if defined).
% Otherwise use English definitions. "\@setdef@ultfmtcount"
% sets the macros to use English.
%    \begin{macrocode}
\def\@setdef@ultfmtcount{
\@ifundefined{@ordinalMenglish}{\input{fc-english.def}}{}
\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
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@set@mulitling@fmtcount}
% This defines the number and ordinal string macros to use 
% \cs{languagename}:
%    \begin{macrocode}
\def\@set@mulitling@fmtcount{%
%    \end{macrocode}
% The masculine version of \cs{numberstring}:
%    \begin{macrocode}
\def\@numberstringM{\@ifundefined{@numberstringM\languagename}{%
\PackageError{fmtcount}{No support for language '\languagename'}{%
The fmtcount package currently does not support language 
'\languagename' for command \string\@numberstringM}}{%
\csname @numberstringM\languagename\endcsname}}%
%    \end{macrocode}
% The feminine version of \cs{numberstring}:
%    \begin{macrocode}
\def\@numberstringF{\@ifundefined{@numberstringF\languagename}{%
\PackageError{fmtcount}{No support for language '\languagename'}{%
The fmtcount package currently does not support language 
'\languagename' for command \string\@numberstringF}}{%
\csname @numberstringF\languagename\endcsname}}%
%    \end{macrocode}
% The neuter version of \cs{numberstring}:
%    \begin{macrocode}
\def\@numberstringN{\@ifundefined{@numberstringN\languagename}{%
\PackageError{fmtcount}{No support for language '\languagename'}{%
The fmtcount package currently does not support language 
'\languagename' for command \string\@numberstringN}}{%
\csname @numberstringN\languagename\endcsname}}%
%    \end{macrocode}
% The masculine version of \cs{Numberstring}:
%    \begin{macrocode}
\def\@NumberstringM{\@ifundefined{@NumberstringM\languagename}{%
\PackageError{fmtcount}{No support for language '\languagename'}{%
The fmtcount package currently does not support language 
'\languagename' for command \string\@NumberstringM}}{%
\csname @NumberstringM\languagename\endcsname}}%
%    \end{macrocode}
% The feminine version of \cs{Numberstring}:
%    \begin{macrocode}
\def\@NumberstringF{\@ifundefined{@NumberstringF\languagename}{%
\PackageError{fmtcount}{No support for language '\languagename'}{%
The fmtcount package currently does not support language 
'\languagename' for command \string\@NumberstringF}}{%
\csname @NumberstringF\languagename\endcsname}}%
%    \end{macrocode}
% The neuter version of \cs{Numberstring}:
%    \begin{macrocode}
\def\@NumberstringN{\@ifundefined{@NumberstringN\languagename}{%
\PackageError{fmtcount}{No support for language '\languagename'}{%
The fmtcount package currently does not support language 
'\languagename' for command \string\@NumberstringN}}{%
\csname @NumberstringN\languagename\endcsname}}%
%    \end{macrocode}
% The masculine version of \cs{ordinal}:
%    \begin{macrocode}
\def\@ordinalM{\@ifundefined{@ordinalM\languagename}{%
\PackageError{fmtcount}{No support for language '\languagename'}{%
The fmtcount package currently does not support language 
'\languagename' for command \string\@ordinalM}}{%
\csname @ordinalM\languagename\endcsname}}%
%    \end{macrocode}
% The feminine version of \cs{ordinal}:
%    \begin{macrocode}
\def\@ordinalF{\@ifundefined{@ordinalF\languagename}{%
\PackageError{fmtcount}{No support for language '\languagename'}{%
The fmtcount package currently does not support language 
'\languagename' for command \string\@ordinalF}}{%
\csname @ordinalF\languagename\endcsname}}%
%    \end{macrocode}
% The neuter version of \cs{ordinal}:
%    \begin{macrocode}
\def\@ordinalN{\@ifundefined{@ordinalN\languagename}{%
\PackageError{fmtcount}{No support for language '\languagename'}{%
The fmtcount package currently does not support language 
'\languagename' for command \string\@ordinalN}}{%
\csname @ordinalN\languagename\endcsname}}%
%    \end{macrocode}
% The masculine version of \cs{ordinalstring}:
%    \begin{macrocode}
\def\@ordinalstringM{\@ifundefined{@ordinalstringM\languagename}{%
\PackageError{fmtcount}{No support for language '\languagename'}{%
The fmtcount package currently does not support language 
'\languagename' for command \string\@ordinalstringM}}{%
\csname @ordinalstringM\languagename\endcsname}}%
%    \end{macrocode}
% The feminine version of \cs{ordinalstring}:
%    \begin{macrocode}
\def\@ordinalstringF{\@ifundefined{@ordinalstringF\languagename}{%
\PackageError{fmtcount}{No support for language '\languagename'}{%
The fmtcount package currently does not support language 
'\languagename' for command \string\@ordinalstringF}}{%
\csname @ordinalstringF\languagename\endcsname}}%
%    \end{macrocode}
% The neuter version of \cs{ordinalstring}:
%    \begin{macrocode}
\def\@ordinalstringN{\@ifundefined{@ordinalstringN\languagename}{%
\PackageError{fmtcount}{No support for language '\languagename'}{%
The fmtcount package currently does not support language 
'\languagename' for command \string\@ordinalstringN}}{%
\csname @ordinalstringN\languagename\endcsname}}%
%    \end{macrocode}
% The masculine version of \cs{Ordinalstring}:
%    \begin{macrocode}
\def\@OrdinalstringM{\@ifundefined{@OrdinalstringM\languagename}{%
\PackageError{fmtcount}{No support for language '\languagename'}{%
The fmtcount package currently does not support language 
'\languagename' for command \string\@OrdinalstringM}}{%
\csname @OrdinalstringM\languagename\endcsname}}%
%    \end{macrocode}
% The feminine version of \cs{Ordinalstring}:
%    \begin{macrocode}
\def\@OrdinalstringF{\@ifundefined{@OrdinalstringF\languagename}{%
\PackageError{fmtcount}{No support for language '\languagename'}{%
The fmtcount package currently does not support language 
'\languagename' for command \string\@OrdinalstringF}}{%
\csname @OrdinalstringF\languagename\endcsname}}%
%    \end{macrocode}
% The neuter version of \cs{Ordinalstring}:
%    \begin{macrocode}
\def\@OrdinalstringN{\@ifundefined{@OrdinalstringN\languagename}{%
\PackageError{fmtcount}{No support for language '\languagename'}{%
The fmtcount package currently does not support language 
'\languagename' for command \string\@OrdinalstringN}}{%
\csname @OrdinalstringN\languagename\endcsname}}
}
%    \end{macrocode}
%\end{macro}
% Check to see if babel or ngerman packages have been loaded.
%    \begin{macrocode}
\@ifpackageloaded{babel}{%
\ifthenelse{\equal{\languagename}{nohyphenation}\or
\equal{languagename}{english}}{\@setdef@ultfmtcount}{%
\@set@mulitling@fmtcount}
}{%
\@ifpackageloaded{ngerman}{%
\@ifundefined{@numberstringMgerman}{%
\input{fc-german.def}}{}\@set@mulitling@fmtcount}{%
\@setdef@ultfmtcount}}
%    \end{macrocode}
% Backwards compatibility:
%    \begin{macrocode}
\let\@ordinal=\@ordinalM
\let\@ordinalstring=\@ordinalstringM
\let\@Ordinalstring=\@OrdinalstringM
\let\@numberstring=\@numberstringM
\let\@Numberstring=\@NumberstringM
%    \end{macrocode}
%\iffalse
%    \begin{macrocode}
%</fmtcount.sty>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<*fmtcount.perl>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
# File        : fmtcount.perl
# Author      : Nicola Talbot
# Date        : 26 May 2007
# Version     : 1.05
# Description : LaTeX2HTML implementation of fmtcount package

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',
              'septente',
              'huitante',
              'nonente');

$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;
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%</fmtcount.perl>
%    \end{macrocode}
%\fi
%\Finale
\endinput
