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

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



\newcommand{\stynamefmt}[1]{\textsf{#1}}
\begin{document}
\DocInput{fmtcount.dtx}
\end{document}
%</driver>
%\fi
%
%\RecordChanges
%\OnlyDescription
%\def\filedate{20 June 2005}
%\def\fileversion{1.03}
%\def\filename{fmtcount.dtx}
%\def\docdate{1 July 2005}
%
% \title{fmtcount.sty v\fileversion: Displaying the Values of 
%\LaTeX\ Counters}
% \author{N.L.C. Talbot}
% \date{\docdate}
% \maketitle
% \tableofcontents
% \section{Introduction}
%The \stynamefmt{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.
%
%\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.\ latex2html/styles). Remember to refresh
%the \TeX\ database (using \texttt{texhash} 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}
% The macro \verb"\ordinal{"\meta{counter}\verb!}! will
% print the value of a \LaTeX\ counter \meta{counter} as an ordinal,
% \DescribeMacro{\fmtord}
% where the macro \verb"\fmtord{"\meta{text}\verb!}! 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}.
%
%\DescribeMacro{\ordinalnum}
%The macro \verb"\ordinalnum" is like \verb!\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}
% The macro \verb"\numberstring{"\meta{counter}\verb!}! will print the value
% of \meta{counter} as text.  E.g.\ \verb"\numberstring{section}" will produce:
% three.
% \DescribeMacro{\Numberstring}
% The macro \verb"\Numberstring{"\meta{counter}\verb!}! does the same as
% \verb"\numberstring", but with initial letters in uppercase.  For
% example, \verb"\Numberstring{section}" will produce: Three.
%
%\DescribeMacro{\numberstringnum}
%\DescribeMacro{\Numberstringnum}
%The macros \verb!\numberstringnum! and 
%\verb!\Numberstringnum! work like 
%\verb!\numberstring! and 
%\verb!\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}
% The macro \verb"\ordinalstring{"\meta{counter}\verb!}! will print the
% value of \meta{counter} as a textual ordinal.  E.g.\
% \verb"\ordinalstring{section}" will produce: third.
% \DescribeMacro{\Ordinalstring}
% The macro \verb"\Ordinalstring{"\meta{counter}\verb!}! does the same as 
% \verb"\ordinalstring", but with initial letters in uppercase.  For example,
% \verb"\Ordinalstring{section}" will produce: Third.
%
%\DescribeMacro{\ordinalstringnum}
%\DescribeMacro{\Ordinalstringnum}
%The macros \verb!\ordinalstringnum! and 
%\verb!\Ordinalstringnum! work like 
%\verb!\Ordinalstring! and 
%\verb!\Ordinalstring!, respectively, but take an actual number
%rather than a counter as the argument. For example,
%\verb"\ordinalstringnum{3}" will produce: third.
%
% \DescribeMacro{\binary}
%\changes{v2.4}{25 Sept 2004}{'binary added}
% The macro \verb"\binary{"\meta{counter}\verb!}! will print the 
%value of \meta{counter} as a binary number.  
%E.g.\ \verb"\binary{section}" will produce: 11.  The declaration 
%\DescribeMacro{\padzeroes}\verb"\padzeroes["\meta{n}\verb!]! 
%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}
%The macro \verb"\binarynum" is like \verb!\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}
% The macro \verb"\octal{"\meta{counter}\verb!}! 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 \verb"\padzeroes" has been used.
%
%\DescribeMacro{\octalnum}
%The macro \verb"\octalnum" is like \verb!\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}
% The macro \verb"\hexadecimal{"\meta{counter}\verb!}! will print 
%the value of \meta{counter} as a hexadecimal number.  Going back 
%to the previous example, \verb"\hexadecimal{mycounter}" will
% produce: 7d. Again, the number will be padded with zeroes if 
%necessary, depending on whether \verb"\padzeroes" has been used.
% \DescribeMacro{\Hexadecimal}
% \verb"\Hexadecimal{"\meta{counter}\verb!}! does the same thing, 
%but uses uppercase characters, e.g.\ 
% \verb"\Hexadecimal{mycounter}" will produce: 7D.
%
%\DescribeMacro{\hexadecimalnum}
%\DescribeMacro{\Hexadecimalnum}
%The macros \verb"\hexadecimalnum" and
%\verb"\Hexadecimalnum" are like 
%\verb!\hexadecimal! and \verb"\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}
%The macro \verb"\decimal{"\meta{counter}\verb!}! is similar to 
%\verb"\arabic" but the number can be padded with zeroes
% depending on whether \verb"\padzeroes" has been used.  
%For example: \verb"\padzeroes[8]\decimal{section}" will
% produce: 00000005.
%
%\DescribeMacro{\decimalnum}
%The macro \verb"\decimalnum" is like \verb!\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}
% The macro \verb"\aaalph{"\meta{counter}\verb!}! 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}
% \verb"\AAAlph{"\meta{counter}\verb!}! does the same thing, but 
%uses uppercase characters, e.g.\ 
% \verb"\AAAlph{mycounter}" will produce: UUUUU.
%
%\DescribeMacro{\aaalphnum}
%\DescribeMacro{\AAAlphnum}
%The macros \verb"\aaalphnum" and
%\verb"\AAAlphnum" are like 
%\verb!\aaalph! and \verb"\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}
% The macro \verb"\abalph{"\meta{counter}\verb!}! 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}
% \verb"\ABAlph{"\meta{counter}\verb!}! does the same thing, but 
%uses uppercase characters, e.g.\ 
% \verb"\ABAlph{mycounter}" will produce: DU.
%
%\DescribeMacro{\abalphnum}
%\DescribeMacro{\ABAlphnum}
%The macros \verb"\abalphnum" and
%\verb"\ABAlphnum" are like 
%\verb!\abalph! and \verb"\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}
%\verb"\fmtcountsetoptions{fmtord="\meta{type}\verb'}'
%
%\noindent where \meta{type} is either \texttt{level} or 
%\texttt{raise}.
%
%\section{Multilingual Support}
%
%Version 1.02 of the \stynamefmt{fmtcount} package now has
%limited multilingual support.  The following languages are
%implemented: English, Spanish, Portuguese, French, French (Swiss)
%and French (Belgian).  The package checks to see if the
%command \verb"\date"\meta{language} is defined\footnote{this
%will be true if you have loaded \stynamefmt{babel}}, and will
%load the code for those languages.  The commands \verb"\ordinal",
%\verb"\ordinalstring" and \verb'\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 
%\verb"\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 form can be obtained by passing \texttt{f} as
%an optional argument to \verb"\ordinal", \verb!\ordinalnum! etc.  
%For example: \verb"\numberstring{section}[f]". Note that the
%optional argument comes \emph{after} the compulsory argument.  
%
%Let me know if you find any spelling mistakes (has been known
%to happen in English, let alone other languages I'm not so
%familiar with.)
%
%\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 \stynamefmt{fmtcount}
%package.
%
%Note that if you are using the \stynamefmt{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 \verb"\fmtord" will take
%precedence.
%
%\section{LaTeX2HTML style}
%
%The \LaTeX2HTML\ style file \texttt{fmtcount.perl} is provided.
%The following limitations apply:
%
%\begin{itemize}
%\item \verb"\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.
%
% \section{Contact Details}
% Dr Nicola Talbot\\
% School of Computing Sciences\\
% University of East Anglia\\
% Norwich.  NR4 7TJ.\\
% United Kingdom.\\
% \url{http://theoval.cmp.uea.ac.uk/~nlct/}
%
%
%\StopEventually{}
%\section{The Code}
%    \begin{macrocode}
%<*fc-english.def>
%    \end{macrocode}
% English definitions
%    \begin{macrocode}
\ProvidesFile{fc-english}[2005/04/29]
%    \end{macrocode}
% Define macro that prints the value of the \TeX\ count
% register as an ordinal.
%    \begin{macrocode}
\newcommand{\@ordinalMenglish}[1]{%
\@orgargctr=#1\relax
\@ordinalctr=#1%
\@modulo{\@ordinalctr}{100}%
\ifnum\@ordinalctr=11
\the\@orgargctr\fmtord{th}%
\else
\ifnum\@ordinalctr=12
\the\@orgargctr\fmtord{th}%
\else
\ifnum\@ordinalctr=13
\the\@orgargctr\fmtord{th}%
\else
\@modulo{\@ordinalctr}{10}%
\ifcase\@ordinalctr
\the\@orgargctr\fmtord{th}%      case 0
\or \the\@orgargctr\fmtord{st}%  case 1
\or \the\@orgargctr\fmtord{nd}%  case 2
\or \the\@orgargctr\fmtord{rd}%  case 3
\else
\the\@orgargctr\fmtord{th}%      default case
\fi
\fi
\fi
\fi
}
\let\@ordinalFenglish=\@ordinalMenglish
%    \end{macrocode}
% Define the macro that prints the value of a \TeX\ count register
% as text
%    \begin{macrocode}
\providecommand{\andname}{and}

\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
}

\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
}

\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
}

\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
}

\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
}

\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
}

\newcommand{\@@numberstringenglish}[1]{%
\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
\@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
\@tenstring{\@strctr}%
\@strctr=#1 \divide\@strctr by 1000\relax
\@modulo{\@strctr}{10}%
\ifnum\@strctr>0 -\@unitstring{\@strctr}\fi
\else
\@strctr=#1\relax
\divide\@strctr by 1000
\@modulo{\@strctr}{10}%
\@teenstring{\@strctr}%
\fi
\ \@thousand%
\else
\ifnum\@strctr>0 \@unitstring{\@strctr}\ \@thousand\fi
\fi
\@strctr=#1\relax \@modulo{\@strctr}{1000}%
\divide\@strctr by 100
\ifnum\@strctr>0
\ifnum#1>1000 \ \fi\@unitstring{\@strctr}\ \@hundred%
\fi
\@strctr=#1\relax \@modulo{\@strctr}{100}%
\ifnum#1>100 \ifnum\@strctr>0 \ \andname\ \fi\fi
\ifnum\@strctr>19
\divide\@strctr by 10
\@tenstring{\@strctr}%
\@strctr=#1\relax \@modulo{\@strctr}{10}%
\ifnum\@strctr>0
-\@unitstring{\@strctr}%
\fi
\else
\ifnum\@strctr<10
\ifnum\@strctr=0
\ifnum#1<100 \@unitstring{\@strctr}\fi
\else
\@unitstring{\@strctr}%
\fi
\else
\@modulo{\@strctr}{10}%
\@teenstring{\@strctr}%
\fi
\fi
}

\newcommand{\@numberstringMenglish}[1]{%
\let\@unitstring=\@@unitstringenglish 
\let\@teenstring=\@@teenstringenglish 
\let\@tenstring=\@@tenstringenglish
\def\@hundred{hundred}\def\@thousand{thousand}%
\@@numberstringenglish{#1}}

\let\@numberstringFenglish=\@numberstringMenglish

\newcommand{\@NumberstringMenglish}[1]{%
\let\@unitstring=\@@Unitstringenglish 
\let\@teenstring=\@@Teenstringenglish 
\let\@tenstring=\@@Tenstringenglish
\def\@hundred{Hundred}\def\@thousand{Thousand}%
\@@numberstringenglish{#1}}

\let\@NumberstringFenglish=\@NumberstringMenglish
%    \end{macrocode}
% Define a macro that produces an ordinal as a string.
%    \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
}

\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
}

\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
}

\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
}

\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
}

\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
}

\newcommand{\@@ordinalstringenglish}[1]{%
\@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
\fi
\@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
  \@tenstring{\@strctr}%
  \@strctr=#1\relax
  \divide\@strctr by 1000\relax
  \@modulo{\@strctr}{10}%
  \ifnum\@strctr>0 -\@unitstring{\@strctr}\fi
\else
  \@strctr=#1\relax \divide\@strctr by 1000\relax
  \@modulo{\@strctr}{10}%
  \@teenstring{\@strctr}%
\fi
\@strctr=#1\relax \@modulo{\@strctr}{1000}%
\ifnum\@strctr=0\ \@thousandth\else\ \@thousand \fi
\else
\ifnum\@strctr>0\relax
\@unitstring{\@strctr}%
\@strctr=#1\relax \@modulo{\@strctr}{1000}%
\ifnum\@strctr=0\ \@thousandth\else\ \@thousand\fi
\fi
\fi
\@strctr=#1\relax \@modulo{\@strctr}{1000}%
\divide\@strctr by 100
\ifnum\@strctr>0
\ifnum#1>1000 \ \fi\@unitstring{\@strctr}%
\@strctr=#1\relax \@modulo{\@strctr}{100}%
\ifnum\@strctr=0\ \@hundredth\else\ \@hundred\fi
\fi
\@strctr=#1\relax \@modulo{\@strctr}{100}%
\ifnum#1>100 \ifnum\@strctr>0\ and \fi\fi
\ifnum\@strctr>19
\@tmpstrctr=\@strctr
\divide\@strctr by 10
\@modulo{\@tmpstrctr}{10}%
\ifnum\@tmpstrctr=0 \@tenthstring{\@strctr}\else \@tenstring{\@strctr}\fi
\@strctr=#1\relax \@modulo{\@strctr}{10}%
\ifnum\@strctr>0
-\@unitthstring{\@strctr}%
\fi
\else
\ifnum\@strctr<10
\ifnum\@strctr=0
\ifnum#1<100 \@unitthstring{\@strctr}\fi
\else
\@unitthstring{\@strctr}%
\fi
\else
\@modulo{\@strctr}{10}%
\@teenthstring{\@strctr}%
\fi
\fi
}

\newcommand{\@ordinalstringMenglish}[1]{%
\let\@unitthstring=\@@unitthstringenglish 
\let\@teenthstring=\@@teenthstringenglish 
\let\@tenthstring=\@@tenthstringenglish
\let\@unitstring=\@@unitstringenglish 
\let\@teenstring=\@@teenstringenglish
\let\@tenstring=\@@tenstringenglish
\def\@hundred{hundred}\def\@thousand{thousand}%
\def\@hundredth{hundredth}\def\@thousandth{thousandth}%
\@@ordinalstringenglish{#1}}

\let\@ordinalstringFenglish=\@ordinalstringMenglish

\newcommand{\@OrdinalstringMenglish}[1]{%
\let\@unitthstring=\@@Unitthstringenglish
\let\@teenthstring=\@@Teenthstringenglish
\let\@tenthstring=\@@Tenthstringenglish
\let\@unitstring=\@@Unitstringenglish
\let\@teenstring=\@@Teenstringenglish
\let\@tenstring=\@@Tenstringenglish
\def\@hundred{Hundred}\def\@thousand{Thousand}%
\def\@hundredth{Hundredth}\def\@thousandth{Thousandth}%
\@@ordinalstringenglish{#1}}

\let\@OrdinalstringFenglish=\@OrdinalstringMenglish

%    \end{macrocode}
%    \begin{macrocode}
%</fc-english.def>
%    \end{macrocode}
%    \begin{macrocode}
%<*fc-french.def>
%    \end{macrocode}
% French
%    \begin{macrocode}
\ProvidesFile{fc-french.def}[2005/04/29]
%    \end{macrocode}
%    \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
}

\newcommand{\@@unitstringFfrench}[1]{%
\ifnum#1=1\relax
une%
\else\@@unitstringfrench{#1}%
\fi
}

\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
}

\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
}

\newcommand{\@@seventiesfrench}[1]{%
\@tenstring{6}%
\ifnum#1=1\relax
\ \@andname\ 
\else
-%
\fi
\@teenstring{#1}%
}

\newcommand{\@@eightiesfrench}[1]{%
\@unitstring{4}-\@tenstring{2}%
\ifnum#1>0
-\@unitstring{#1}%
\else
s%
\fi
}

\newcommand{\@@ninetiesfrench}[1]{%
\@unitstring{4}-\@tenstring{2}-\@teenstring{#1}%
}

\newcommand{\@@seventiesfrenchswiss}[1]{%
\@tenstring{7}%
\ifnum#1=1\ \@andname\ \fi
\ifnum#1>1-\fi
\ifnum#1>0\@unitstring{#1}\fi
}

\newcommand{\@@eightiesfrenchswiss}[1]{%
\@tenstring{8}%
\ifnum#1=1\ \@andname\ \fi
\ifnum#1>1-\fi
\ifnum#1>0\@unitstring{#1}\fi
}

\newcommand{\@@ninetiesfrenchswiss}[1]{%
\@tenstring{9}%
\ifnum#1=1\ \@andname\ \fi
\ifnum#1>1-\fi
\ifnum#1>0\@unitstring{#1}\fi
}

\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
}

\newcommand{\@@UnitstringFfrench}[1]{%
\ifnum#1=1\relax
Une%
\else \@@Unitstringfrench{#1}%
\fi
}

\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
}

\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
}

\newcommand{\@numberstringMfrenchswiss}[1]{%
\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}}

\newcommand{\@numberstringMfrenchfrance}[1]{%
\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}}

\newcommand{\@numberstringMfrenchbelgian}[1]{%
\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}}

\let\@numberstringMfrench=\@numberstringMfrenchfrance

\newcommand{\@numberstringFfrenchswiss}[1]{%
\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}}

\newcommand{\@numberstringFfrenchfrance}[1]{%
\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}}

\newcommand{\@numberstringFfrenchbelgian}[1]{%
\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}}

\let\@numberstringFfrench=\@numberstringFfrenchfrance

\newcommand{\@NumberstringMfrenchswiss}[1]{%
\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}}

\newcommand{\@NumberstringMfrenchfrance}[1]{%
\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}}

\newcommand{\@NumberstringMfrenchbelgian}[1]{%
\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}}

\let\@NumberstringMfrench=\@NumberstringMfrenchfrance

\newcommand{\@NumberstringFfrenchswiss}[1]{%
\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}}

\newcommand{\@NumberstringFfrenchfrance}[1]{%
\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}}

\newcommand{\@NumberstringFfrenchbelgian}[1]{%
\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}}

\let\@NumberstringFfrench=\@NumberstringFfrenchfrance

\newcommand{\@ordinalstringMfrenchswiss}[1]{%
\ifnum#1=1\relax
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}%
\fi}

\newcommand{\@ordinalstringMfrenchfrance}[1]{%
\ifnum#1=1\relax
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}%
\fi}

\newcommand{\@ordinalstringMfrenchbelgian}[1]{%
\ifnum#1=1\relax
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}%
\fi}

\let\@ordinalstringMfrench=\@ordinalstringMfrenchfrance

\newcommand{\@ordinalstringFfrenchswiss}[1]{%
\ifnum#1=1\relax
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}%
\fi}

\newcommand{\@ordinalstringFfrenchfrance}[1]{%
\ifnum#1=1\relax
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}%
\fi}

\newcommand{\@ordinalstringFfrenchbelgian}[1]{%
\ifnum#1=1\relax
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}%
\fi}

\let\@ordinalstringFfrench=\@ordinalstringFfrenchfrance

\newcommand{\@OrdinalstringMfrenchswiss}[1]{%
\ifnum#1=1\relax
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}%
\fi}

\newcommand{\@OrdinalstringMfrenchfrance}[1]{%
\ifnum#1=1\relax
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}%
\fi}

\newcommand{\@OrdinalstringMfrenchbelgian}[1]{%
\ifnum#1=1\relax
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}%
\fi}

\let\@OrdinalstringMfrench=\@OrdinalstringMfrenchfrance

\newcommand{\@OrdinalstringFfrenchswiss}[1]{%
\ifnum#1=1\relax
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}%
\fi}

\newcommand{\@OrdinalstringFfrenchfrance}[1]{%
\ifnum#1=1\relax
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}%
\fi}

\newcommand{\@OrdinalstringFfrenchbelgian}[1]{%
\ifnum#1=1\relax
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}%
\fi}

\let\@OrdinalstringFfrench=\@OrdinalstringFfrenchfrance

\newcommand{\@ordinalMfrench}[1]{%
\iffmtord@abbrv
#1\fmtord{e}%
\else
#1\ifnum#1=1\fmtord{er}\else\fmtord{eme}\fi
\fi}

\newcommand{\@ordinalFfrench}[1]{%
\iffmtord@abbrv
#1\fmtord{e}%
\else
#1\ifnum#1=1\fmtord{ere}\else\fmtord{eme}\fi
\fi}

\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
}

\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
}

\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
}

\newcommand{\@@seventiethsfrenchswiss}[1]{%
\ifcase#1\relax
\@tenthstring{7}%
\or
\@tenstring{7} \@andname\ \@unitthstring{1}%
\else
\@tenstring{7}-\@unitthstring{#1}%
\fi}

\newcommand{\@@eightiethsfrenchswiss}[1]{%
\ifcase#1\relax
\@tenthstring{8}%
\or
\@tenstring{8} \@andname\ \@unitthstring{1}%
\else
\@tenstring{8}-\@unitthstring{#1}%
\fi}

\newcommand{\@@ninetiethsfrenchswiss}[1]{%
\ifcase#1\relax
\@tenthstring{9}%
\or
\@tenstring{9} \@andname\ \@unitthstring{1}%
\else
\@tenstring{9}-\@unitthstring{#1}%
\fi}

\newcommand{\@@seventiethsfrench}[1]{%
\ifnum#1=0\relax
\@tenstring{6}%
-%
\else
\@tenstring{6}%
\ \@andname\ 
\fi
\@teenthstring{#1}%
}

\newcommand{\@@eightiethsfrench}[1]{%
\ifnum#1>0\relax
\@unitstring{4}-\@tenstring{2}%
-\@unitthstring{#1}%
\else
\@unitstring{4}-\@tenthstring{2}%
\fi
}

\newcommand{\@@ninetiethsfrench}[1]{%
\@unitstring{4}-\@tenstring{2}-\@teenthstring{#1}%
}

\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
}

\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
}

\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}
%    \begin{macrocode}
\newcommand{\@@numberstringfrench}[1]{%
\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
\@strctr=#1\relax \divide\@strctr by 1000\relax
\ifnum\@strctr>9
% #1 is greater or equal to 10000
  \@tmpstrctr=\@strctr
  \divide\@strctr by 10
  \ifnum\@strctr>1
    \ifthenelse{\(\@strctr>6\)\and\(\@strctr<10\)}{%
      \@modulo{\@tmpstrctr}{10}%
      \ifnum\@strctr<8\relax
        \@seventies{\@tmpstrctr}%
      \else
        \ifnum\@strctr<9\relax
          \@eighties{\@tmpstrctr}%
        \else
          \ifnum\@strctr<10\@nineties{\@tmpstrctr}\fi
        \fi
      \fi
    }{%
      \@tenstring{\@strctr}%
      \@strctr=#1\relax
      \divide\@strctr by 1000\relax
      \@modulo{\@strctr}{10}%
      \ifnum\@strctr>0\relax
%        \ifnum\@strctr=1\ \@andname\fi
        \ \@unitstring{\@strctr}%
      \fi
    }%
  \else
    \@strctr=#1\relax
    \divide\@strctr by 1000
    \@modulo{\@strctr}{10}%
    \@teenstring{\@strctr}%
  \fi
  \ \@thousand%
\else
  \ifnum\@strctr>0 
    \ifnum\@strctr>1\@unitstring{\@strctr}\ \fi
    \@thousand
  \fi
\fi
\@strctr=#1\relax \@modulo{\@strctr}{1000}%
\divide\@strctr by 100
\ifnum\@strctr>0\relax
  \ifnum#1>1000 \ \fi
  \@tmpstrctr=#1\relax
  \@modulo{\@tmpstrctr}{1000}\relax
  \ifnum\@tmpstrctr=100\relax
    \@tenstring{10}\relax
  \else
    \ifnum\@strctr>1\@unitstring{\@strctr}\ \fi
    \@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
\ %    \ \@andname\
  \else
  \ifnum\@tmpstrctr>0s\fi%
  \fi
\fi
\ifnum\@strctr>19
\@tmpstrctr=\@strctr
\divide\@strctr by 10
\ifthenelse{\@strctr>6}{%
\@modulo{\@tmpstrctr}{10}%
\ifnum\@strctr<8
\@seventies{\@tmpstrctr}%
\else
\ifnum\@strctr<9
\@eighties{\@tmpstrctr}%
\else
\@nineties{\@tmpstrctr}%
\fi
\fi
}{%
\@tenstring{\@strctr}%
\@strctr=#1\relax \@modulo{\@strctr}{10}%
\ifnum\@strctr>0\relax
 \ifnum\@strctr=1\ \@andname\ \else-\fi
 \@unitstring{\@strctr}%
\fi
}%
\else
\ifnum\@strctr<10
\ifnum\@strctr=0
\ifnum#1<100 \@unitstring{\@strctr}\fi
\else%(>0,<10)
\@unitstring{\@strctr}%
\fi
\else%>10
\@modulo{\@strctr}{10}%
\@teenstring{\@strctr}%
\fi
\fi
}
%    \end{macrocode}
%    \begin{macrocode}
\newcommand{\@@ordinalstringfrench}[1]{%
\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
\@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
        \@seventies{\@tmpstrctr}%
      \else
        \ifnum\@strctr=8\relax
          \@eighties{\@tmpstrctr}%
        \else
          \@nineties{\@tmpstrctr}%
        \fi
      \fi
    }{%
      \@tenstring{\@strctr}%
      \@strctr=#1\relax
      \divide\@strctr by 1000\relax
      \@modulo{\@strctr}{10}%
      \ifnum\@strctr=1\ \@andname\fi
      \ifnum\@strctr>0\ \@unitstring{\@strctr}\fi
    }%
  \else
    \@strctr=#1\relax
    \divide\@strctr by 1000\relax
    \@modulo{\@strctr}{10}%
    \@teenstring{\@strctr}%
  \fi
  \@strctr=#1\relax \@modulo{\@strctr}{1000}%
  \ifnum\@strctr=0\ \@thousandth\else\ \@thousand \fi
\else
  \ifnum\@strctr>0\relax
    \@unitstring{\@strctr}%
    \@strctr=#1\relax \@modulo{\@strctr}{1000}%
    \ifnum\@strctr=0\ \@thousandth\else\ \@thousand\fi
  \fi
\fi
\@strctr=#1\relax \@modulo{\@strctr}{1000}%
\divide\@strctr by 100
\ifnum\@strctr>0
\ifnum#1>1000 \ \fi\@unitstring{\@strctr}%
\@strctr=#1\relax \@modulo{\@strctr}{100}%
\ifnum\@strctr=0\ \@hundredth\else\ \@hundred\fi
\fi
\@tmpstrctr=\@strctr
\@strctr=#1\relax \@modulo{\@strctr}{100}%
\ifnum#1>100\relax
\ifnum\@strctr>0\ \@andname\ \fi\fi
\ifnum\@strctr>19
\@tmpstrctr=\@strctr
\divide\@strctr by 10
\@modulo{\@tmpstrctr}{10}%
\ifthenelse{\@strctr>6}{%
\ifnum\@strctr=7\relax
\@seventieths{\@tmpstrctr}%
\else
\ifnum\@strctr=8\relax
\@eightieths{\@tmpstrctr}%
\else
\@ninetieths{\@tmpstrctr}%
\fi
\fi
}{%
\ifnum\@tmpstrctr=0\relax
  \@tenthstring{\@strctr}%
\else 
  \@tenstring{\@strctr}%
\fi
\@strctr=#1\relax \@modulo{\@strctr}{10}%
\ifnum\@strctr=1\ \@andname\fi
\ifnum\@strctr>0
\ \@unitthstring{\@strctr}%
\fi
}%
\else
\ifnum\@strctr<10
\ifnum\@strctr=0
\ifnum#1<100 \@unitthstring{\@strctr}\fi
\else
\@unitthstring{\@strctr}%
\fi
\else
\@modulo{\@strctr}{10}%
\@teenthstring{\@strctr}%
\fi
\fi
}
%    \end{macrocode}
%    \begin{macrocode}
%</fc-french.def>
%    \end{macrocode}
%    \begin{macrocode}
%<*fc-portuges.def>
%    \end{macrocode}
% Portuguse
%    \begin{macrocode}
\ProvidesFile{fc-portuges.def}[2005/04/29]
%    \end{macrocode}
%    \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
}

\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
}

\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
}

\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
}

\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}

\newcommand{\@@hundredstringFportuges}[1]{%
\ifcase#1\relax
\or centa%
\or duzentas%
\or trezentas%
\or quatrocentas%
\or quinhentas%
\or seiscentas%
\or setecentas%
\or oitocentas%
\or novecentas%
\fi}

\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
}

\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
}

\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
}

\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
}

\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}

\newcommand{\@@HundredstringFportuges}[1]{%
\ifcase#1\relax
\or Centa%
\or Duzentas%
\or Trezentas%
\or Quatrocentas%
\or Quinhentas%
\or Seiscentas%
\or Setecentas%
\or Oitocentas%
\or Novecentas%
\fi}

\newcommand{\@numberstringMportuges}[1]{%
\let\@unitstring=\@@unitstringportuges
\let\@teenstring=\@@teenstringportuges
\let\@tenstring=\@@tenstringportuges
\let\@hundredstring=\@@hundredstringportuges
\def\@hundred{cem}\def\@thousand{mil}%
\def\@andname{e}%
\@@numberstringportuges{#1}}

\newcommand{\@numberstringFportuges}[1]{%
\let\@unitstring=\@@unitstringFportuges
\let\@teenstring=\@@teenstringportuges
\let\@tenstring=\@@tenstringportuges
\let\@hundredstring=\@@hundredstringFportuges
\def\@hundred{cem}\def\@thousand{mil}%
\def\@andname{e}%
\@@numberstringportuges{#1}}

\newcommand{\@NumberstringMportuges}[1]{%
\let\@unitstring=\@@Unitstringportuges
\let\@teenstring=\@@Teenstringportuges
\let\@tenstring=\@@Tenstringportuges
\let\@hundredstring=\@@Hundredstringportuges
\def\@hundred{Cem}\def\@thousand{Mil}%
\def\@andname{e}%
\@@numberstringportuges{#1}}

\newcommand{\@NumberstringFportuges}[1]{%
\let\@unitstring=\@@UnitstringFportuges
\let\@teenstring=\@@Teenstringportuges
\let\@tenstring=\@@Tenstringportuges
\let\@hundredstring=\@@HundredstringFportuges
\def\@hundred{Cem}\def\@thousand{Mil}%
\def\@andname{e}%
\@@numberstringportuges{#1}}

\newcommand{\@ordinalstringMportuges}[1]{%
\let\@unitthstring=\@@unitthstringportuges
\let\@unitstring=\@@unitstringportuges
\let\@teenthstring=\@@teenthstringportuges
\let\@tenthstring=\@@tenthstringportuges
\let\@hundredthstring=\@@hundredthstringportuges
\def\@thousandth{mil\'esimo}%
\@@ordinalstringportuges{#1}}

\newcommand{\@ordinalstringFportuges}[1]{%
\let\@unitthstring=\@@unitthstringFportuges
\let\@unitstring=\@@unitstringFportuges
\let\@teenthstring=\@@teenthstringportuges
\let\@tenthstring=\@@tenthstringFportuges
\let\@hundredthstring=\@@hundredthstringFportuges
\def\@thousandth{mil\'esima}%
\@@ordinalstringportuges{#1}}

\newcommand{\@OrdinalstringMportuges}[1]{%
\let\@unitthstring=\@@Unitthstringportuges
\let\@unitstring=\@@Unitstringportuges
\let\@teenthstring=\@@teenthstringportuges
\let\@tenthstring=\@@Tenthstringportuges
\let\@hundredthstring=\@@Hundredthstringportuges
\def\@thousandth{Mil\'esimo}%
\@@ordinalstringportuges{#1}}

\newcommand{\@OrdinalstringFportuges}[1]{%
\let\@unitthstring=\@@UnitthstringFportuges
\let\@unitstring=\@@UnitstringFportuges
\let\@teenthstring=\@@teenthstringportuges
\let\@tenthstring=\@@TenthstringFportuges
\let\@hundredthstring=\@@HundredthstringFportuges
\def\@thousandth{Mil\'esima}%
\@@ordinalstringportuges{#1}}

\newcommand{\@ordinalMportuges}[1]{%
#1\ifnum#1=0\else\fmtord{o}\fi}
\newcommand{\@ordinalFportuges}[1]{%
#1\ifnum#1=0\else\fmtord{a}\fi}

\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
}

\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
}

\newcommand{\@@teenthstringportuges}[1]{%
\@tenthstring{1}%
\ifnum#1>0\relax
-\@unitthstring{#1}%
\fi}

\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}

\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
}

\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
}

\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}

\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
}

\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
}

\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}

\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
}

\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
}

\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}
%    \begin{macrocode}
\newcommand{\@@numberstringportuges}[1]{%
\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
\@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
    \@tenstring{\@strctr}%
    \@strctr=#1 \divide\@strctr by 1000\relax
    \@modulo{\@strctr}{10}%
    \ifnum\@strctr>0
      \ifnum\@strctr=1\ \@andname\fi
      \ \@unitstring{\@strctr}%
    \fi
  \else
    \@strctr=#1\relax
    \divide\@strctr by 1000\relax
    \@modulo{\@strctr}{10}%
    \@teenstring{\@strctr}%
  \fi
  \ \@thousand%
\else
  \ifnum\@strctr>0 
    \ifnum\@strctr>1\@unitstring{\@strctr}\ \fi
    \@thousand
  \fi
\fi
\@strctr=#1\relax \@modulo{\@strctr}{1000}%
\divide\@strctr by 100
\ifnum\@strctr>0
\ifnum#1>1000 \ \fi
\@tmpstrctr=#1\relax
\@modulo{\@tmpstrctr}{1000}%
\ifnum\@tmpstrctr=100\@tenstring{10}\else\@hundredstring{\@strctr}\fi%
\fi
\@strctr=#1\relax \@modulo{\@strctr}{100}%
\ifnum#1>100 \ifnum\@strctr>0\ \@andname\ \fi\fi
\ifnum\@strctr>19
\divide\@strctr by 10
\@tenstring{\@strctr}%
\@strctr=#1\relax \@modulo{\@strctr}{10}%
\ifnum\@strctr>0
\ifnum\@strctr=1\ \@andname\else\ifnum#1>100\ \@andname\fi\fi 
\ \@unitstring{\@strctr}%
\fi
\else
\ifnum\@strctr<10
\ifnum\@strctr=0
\ifnum#1<100 \@unitstring{\@strctr}\fi
\else%(>0,<10)
\@unitstring{\@strctr}%
\fi
\else%>10
\@modulo{\@strctr}{10}%
\@teenstring{\@strctr}%
\fi
\fi
}

%    \end{macrocode}
%    \begin{macrocode}
\newcommand{\@@ordinalstringportuges}[1]{%
\@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
\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}%
        \@teenthstring{\@tmpstrctr}
      \else
        \divide\@tmpstrctr by 10\relax
        \@tenthstring{\@tmpstrctr}
        \@tmpstrctr=\@strctr
        \@modulo{\@tmpstrctr}{10}%
        \ifnum\@tmpstrctr>0\@unitthstring{\@tmpstrctr} \fi
      \fi
    \else
      \@unitstring{\@strctr}
    \fi
  \fi
  \@thousandth
\fi
\@strctr=#1\relax
\@modulo{\@strctr}{1000}%
\ifnum\@strctr>99\relax
\@tmpstrctr=\@strctr
\divide\@tmpstrctr by 100\relax
\ifnum#1>1000-\fi
\@hundredthstring{\@tmpstrctr}%
\fi
\@modulo{\@strctr}{100}%
\ifnum#1>99\ifnum\@strctr>0-\fi\fi
\ifnum\@strctr>9\relax
\@tmpstrctr=\@strctr
\divide\@tmpstrctr by 10\relax
\@tenthstring{\@tmpstrctr}%
\@tmpstrctr=\@strctr
\@modulo{\@tmpstrctr}{10}%
\ifnum\@tmpstrctr>0-\@unitthstring{\@tmpstrctr}\fi
\else
\ifnum\@strctr=0\relax
\ifnum#1=0\@unitstring{0}\fi
\else
\@unitthstring{\@strctr}%
\fi
\fi
\fi
\fi
}
%    \end{macrocode}
%    \begin{macrocode}
%</fc-portuges.def>
%    \end{macrocode}
%    \begin{macrocode}
%<*fc-spanish.def>
%    \end{macrocode}
% Spanish
%    \begin{macrocode}
\ProvidesFile{fc-spanish.def}[2005/04/29]
%    \end{macrocode}
%    \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
}

\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
}

\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
}

\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
}

\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}

\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}

\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}

\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}

\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
}

\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
}

\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
}

\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
}

\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}

\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}

\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}

\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}

\newcommand{\@numberstringMspanish}[1]{%
\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}}

\newcommand{\@numberstringFspanish}[1]{%
\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}}

\newcommand{\@NumberstringMspanish}[1]{%
\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}}

\newcommand{\@NumberstringFspanish}[1]{%
\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}}

\newcommand{\@ordinalstringMspanish}[1]{%
\let\@unitthstring=\@@unitthstringspanish
\let\@unitstring=\@@unitstringspanish
\let\@teenthstring=\@@teenthstringspanish
\let\@tenthstring=\@@tenthstringspanish
\let\@hundredthstring=\@@hundredthstringspanish
\def\@thousandth{mil\'esimo}%
\@@ordinalstringspanish{#1}}

\newcommand{\@ordinalstringFspanish}[1]{%
\let\@unitthstring=\@@unitthstringFspanish
\let\@unitstring=\@@unitstringFspanish
\let\@teenthstring=\@@teenthstringFspanish
\let\@tenthstring=\@@tenthstringFspanish
\let\@hundredthstring=\@@hundredthstringFspanish
\def\@thousandth{mil\'esima}%
\@@ordinalstringspanish{#1}}

\newcommand{\@OrdinalstringMspanish}[1]{%
\let\@unitthstring=\@@Unitthstringspanish
\let\@unitstring=\@@Unitstringspanish
\let\@teenthstring=\@@Teenthstringspanish
\let\@tenthstring=\@@Tenthstringspanish
\let\@hundredthstring=\@@Hundredthstringspanish
\def\@thousandth{Mil\'esimo}%
\@@ordinalstringspanish{#1}}

\newcommand{\@OrdinalstringFspanish}[1]{%
\let\@unitthstring=\@@UnitthstringFspanish
\let\@unitstring=\@@UnitstringFspanish
\let\@teenthstring=\@@TeenthstringFspanish
\let\@tenthstring=\@@TenthstringFspanish
\let\@hundredthstring=\@@HundredthstringFspanish
\def\@thousandth{Mil\'esima}%
\@@ordinalstringspanish{#1}}

\newcommand{\@ordinalMspanish}[1]{#1\fmtord{o}}
\newcommand{\@ordinalFspanish}[1]{#1\fmtord{a}}

\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
}

\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
}

\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
}

\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}

\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
}

\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
}

\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
}

\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}

\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
}

\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
}

\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
}

\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}

\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
}

\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
}

\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
}

\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}
%    \begin{macrocode}
\newcommand{\@@numberstringspanish}[1]{%
\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
\@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
    \@tenstring{\@strctr}%
    \@strctr=#1 \divide\@strctr by 1000\relax
    \@modulo{\@strctr}{10}%
    \ifnum\@strctr>0\ \@andname\ \@unitstring{\@strctr}\fi
  \else
    \@strctr=#1\relax
    \divide\@strctr by 1000\relax
    \@modulo{\@strctr}{10}%
    \@teenstring{\@strctr}%
  \fi
  \ \@thousand%
\else
  \ifnum\@strctr>0 
    \ifnum\@strctr>1\@unitstring{\@strctr}\ \fi
    \@thousand
  \fi
\fi
\@strctr=#1\relax \@modulo{\@strctr}{1000}%
\divide\@strctr by 100
\ifnum\@strctr>0
\ifnum#1>1000\ \fi
\@tmpstrctr=#1\relax
\@modulo{\@tmpstrctr}{1000}%
\ifnum\@tmpstrctr=100\@tenstring{10}\else\@hundredstring{\@strctr}\fi%
\fi
\@strctr=#1\relax \@modulo{\@strctr}{100}%
\ifnum#1>100 \ifnum\@strctr>0\ \@andname\ \fi\fi
\ifnum\@strctr>29
\divide\@strctr by 10
\@tenstring{\@strctr}%
\@strctr=#1\relax \@modulo{\@strctr}{10}%
\ifnum\@strctr>0
\ \@andname\ \@unitstring{\@strctr}%
\fi
\else
\ifnum\@strctr<10
\ifnum\@strctr=0
\ifnum#1<100 \@unitstring{\@strctr}\fi
\else
\@unitstring{\@strctr}%
\fi
\else
\ifnum\@strctr>19
\@modulo{\@strctr}{10}%
\@twentystring{\@strctr}%
\else
\@modulo{\@strctr}{10}%
\@teenstring{\@strctr}%
\fi
\fi
\fi
}

%    \end{macrocode}
%    \begin{macrocode}
\newcommand{\@@ordinalstringspanish}[1]{%
\@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
\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}%
        \@teenthstring{\@tmpstrctr}
      \else
        \divide\@tmpstrctr by 10\relax
        \@tenthstring{\@tmpstrctr}
        \@tmpstrctr=\@strctr
        \@modulo{\@tmpstrctr}{10}%
        \ifnum\@tmpstrctr>0\@unitthstring{\@tmpstrctr} \fi
      \fi
    \else
       \@unitstring{\@strctr}
    \fi
  \fi
  \@thousandth
\fi
\@strctr=#1\relax
\@modulo{\@strctr}{1000}%
\ifnum\@strctr>99\relax
\@tmpstrctr=\@strctr
\divide\@tmpstrctr by 100\relax
\ifnum#1>1000\ \fi
\@hundredthstring{\@tmpstrctr}%
\fi
\@modulo{\@strctr}{100}%
\ifnum#1>99\ifnum\@strctr>0\ \fi\fi
\ifnum\@strctr>19\relax
\@tmpstrctr=\@strctr
\divide\@tmpstrctr by 10\relax
\@tenthstring{\@tmpstrctr}%
\@tmpstrctr=\@strctr
\@modulo{\@tmpstrctr}{10}%
\ifnum\@tmpstrctr>0\ \@unitthstring{\@tmpstrctr}\fi
\else
\ifnum\@strctr>9
\@modulo{\@strctr}{10}%
\@teenthstring{\@strctr}%
\else
\ifnum\@strctr=0\relax
\ifnum#1=0\@unitstring{0}\fi
\else
\@unitthstring{\@strctr}%
\fi
\fi
\fi
\fi
\fi
}
%    \end{macrocode}
%    \begin{macrocode}
%</fc-spanish.def>
%    \end{macrocode}
%    \begin{macrocode}
%<*fmtcount.sty>
%    \end{macrocode}
%\subsection{fmtcount.sty}
% This section deals with the code for |fmtcount.sty|
%    \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{fmtcount}[2005/06/20 v1.03]
\RequirePackage{ifthen}
\RequirePackage{keyval}
%    \end{macrocode}
% These commands need to be defined before the
% configuration file is loaded.
%    \begin{macrocode}
\providecommand{\fmtord}[1]{\textsuperscript{#1}}

\newcount\c@padzeroesN
\c@padzeroesN=1\relax
\providecommand{\padzeroes}[1][17]{\c@padzeroesN=#1}
%    \end{macrocode}
% Load appropriate language definition files (I don't
% know if there is a standard way of detecting which
% languages are defined, so I'm just going to check
% if \verb"\date"\meta{language} is defined):
%    \begin{macrocode}
\@ifundefined{dateenglish}{}{\input{fc-english.def}}
\@ifundefined{datespanish}{}{\input{fc-spanish.def}}
\@ifundefined{dateportuges}{}{\input{fc-portuges.def}}
\@ifundefined{datefrench}{}{\input{fc-french.def}}
%    \end{macrocode}
%Provide Command to switch 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'}}
}}

\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'}}}

\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'}}}

\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}
% 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}}}

\ProcessOptions

%    \end{macrocode}
% Define macro that performs modulo arthmetic. This is used for the
% date, time, ordinal and numberstring commands.
%    \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}
% Define the macro to format the |st|, |nd|, |rd| or |th| of an ordinal.
% 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.
%    \begin{macrocode}
\newif\if@DT@padzeroes
\newcount\@DT@loopN
\newcount\@DT@X
\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}
%
%    \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}
%
%    \begin{macrocode}
\newcommand{\@@hexadecimal}[1]{\ifcase#10\or1\or2\or3\or4\or5\or6\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

\newcommand{\@@Hexadecimal}[1]{\ifcase#10\or1\or2\or3\or4\or5\or6\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}
%
%    \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

\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}
%
%    \begin{macrocode}
\newcommand{\@abalph}[1]{%
\ifnum#1>17576
\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

\newcommand{\@ABAlph}[1]{%
\ifnum#1>17576
\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

\newcommand{\@decimal}[1]{%
\ifnum#1>10000
\PackageError{fmtcount}{Value of counter too large for \protect\@decimal}{Maximum value 10000}\number#1\relax
\else
\@DT@padzeroestrue
\@DT@loopN=6\relax
\@strctr=\@DT@loopN
\whiledo{\(\@strctr<\c@padzeroesN\) \TE@or \(\@strctr=\c@padzeroesN\)}{0\advance\@strctr by 1}%
\@strctr=10000\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 10\relax
\advance\@DT@loopN by -1\relax
\ifnum\@strctr>1
\repeat
\the\@DT@X
\fi}

\let\decimalnum=\@decimal
%    \end{macrocode}
% This is a bit cumbersome.  Previously \verb"\@ordinal"
% was defined in a similar way to \verb"\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.
%    \begin{macrocode}
\newcommand{\ordinal}[1]{%
\expandafter\protect\expandafter\ordinalnum{%
\expandafter\the\csname c@#1\endcsname}}

\newcommand{\ordinalnum}[1]{\@ifnextchar[{\@ordinalnum{#1}}{%
\@ordinalnum{#1}[m]}}

\def\@ordinalnum#1[#2]{%
\ifthenelse{\equal{#2}{f}}{%
\protect\@ordinalF{#1}}{%
\ifthenelse{\equal{#2}{m}}{}{%
\PackageError{fmtcount}{Invalid gender option `#2' to 
\string\ordinal}{Available options are m or f}}%
\protect\@ordinalM{#1}}}

\newcommand{\ordinalstring}[1]{%
\expandafter\protect\expandafter\ordinalstringnum{%
\expandafter\the\csname c@#1\endcsname}}

\newcommand{\ordinalstringnum}[1]{%
\@ifnextchar[{\@ordinal@string{#1}}{\@ordinal@string{#1}[m]}}

\def\@ordinal@string#1[#2]{%
\ifthenelse{\equal{#2}{f}}{%
\protect\@ordinalstringF{#1}}{%
\ifthenelse{\equal{#2}{m}}{}{%
\PackageError{fmtcount}{Invalid gender option `#2' to 
\string\ordinalstring}{Available options are m or f}}%
\protect\@ordinalstringM{#1}}}

\newcommand{\Ordinalstring}[1]{%
\expandafter\protect\expandafter\Ordinalstringnum{%
\expandafter\the\csname c@#1\endcsname}}

\newcommand{\Ordinalstringnum}[1]{%
\@ifnextchar[{\@Ordinal@string{#1}}{\@Ordinal@string{#1}[m]}}

\def\@Ordinal@string#1[#2]{%
\ifthenelse{\equal{#2}{f}}{%
\protect\@OrdinalstringF{#1}}{%
\ifthenelse{\equal{#2}{m}}{}{%
\PackageError{fmtcount}{Invalid gender option `#2' to 
\string\Ordinalstring}{Available options are m or f}}%
\protect\@OrdinalstringM{#1}}}

\newcommand{\numberstring}[1]{%
\expandafter\protect\expandafter\numberstringnum{%
\expandafter\the\csname c@#1\endcsname}}

\newcommand{\numberstringnum}[1]{%
\@ifnextchar[{\@number@string{#1}}{\@number@string{#1}[m]}}

\def\@number@string#1[#2]{%
\ifthenelse{\equal{#2}{f}}{%
\protect\@numberstringF{#1}}{%
\ifthenelse{\equal{#2}{m}}{}{%
\PackageError{fmtcount}{Invalid gender option `#2' to 
\string\numberstring}{Available options are m or f}}%
\protect\@numberstringM{#1}}}

\newcommand{\Numberstring}[1]{%
\expandafter\protect\expandafter\Numberstringnum{%
\expandafter\the\csname c@#1\endcsname}}

\newcommand{\Numberstringnum}[1]{%
\@ifnextchar[{\@Number@string{#1}}{\@Number@string{#1}[m]}}

\def\@Number@string#1[#2]{%
\ifthenelse{\equal{#2}{f}}{%
\protect\@NumberstringF{#1}}{%
\ifthenelse{\equal{#2}{m}}{}{%
\PackageError{fmtcount}{Invalid gender option `#2' to 
\string\Numberstring}{Available options are m or f}}%
\protect\@NumberstringM{#1}}}

\providecommand{\binary}[1]{\expandafter\protect\expandafter\@binary{\expandafter\the\csname c@#1\endcsname}}
\providecommand{\aaalph}[1]{\expandafter\protect\expandafter\@aaalph{\expandafter\the\csname c@#1\endcsname}}
\providecommand{\AAAlph}[1]{\expandafter\protect\expandafter\@AAAlph{\expandafter\the\csname c@#1\endcsname}}
\providecommand{\abalph}[1]{\expandafter\protect\expandafter\@abalph{\expandafter\the\csname c@#1\endcsname}}
\providecommand{\ABAlph}[1]{\expandafter\protect\expandafter\@ABAlph{\expandafter\the\csname c@#1\endcsname}}
\providecommand{\hexadecimal}[1]{\expandafter\protect\expandafter\@hexadecimal{\expandafter\the\csname c@#1\endcsname}}
\providecommand{\Hexadecimal}[1]{\expandafter\protect\expandafter\@Hexadecimal{\expandafter\the\csname c@#1\endcsname}}
\providecommand{\octal}[1]{\expandafter\protect\expandafter\@octal{\expandafter\the\csname c@#1\endcsname}}
\providecommand{\decimal}[1]{\expandafter\protect\expandafter\@decimal{\expandafter\the\csname c@#1\endcsname}}
%    \end{macrocode}
%\subsubsection{Multilinguage Definitions}
% If multilingual support is provided, make \verb"\@numberstring" 
% etc use the correct language (if defined).
% Otherwise use English definitions.
%    \begin{macrocode}
\def\@setdef@ultfmtcount{
\@ifundefined{@ordinalenglish}{\input{fc-english.def}}{}
\def\@ordinalstringM{\@ordinalstringMenglish}
\let\@ordinalstringF=\@ordinalstringMenglish
\def\@OrdinalstringM{\@OrdinalstringMenglish}
\let\@OrdinalstringF=\@OrdinalstringMenglish
\def\@numberstringM{\@numberstringMenglish}
\let\@numberstringF=\@numberstringMenglish
\def\@NumberstringM{\@NumberstringMenglish}
\let\@NumberstringF=\@NumberstringMenglish
\def\@ordinalM{\@ordinalMenglish}
\let\@ordinalF=\@ordinalM}

\@ifundefined{languagename}{%
\@setdef@ultfmtcount}{
\ifthenelse{\equal{\languagename}{nohyphenation}}{\@setdef@ultfmtcount}{
\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}}

\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}}

\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}}

\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}}

\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}}

\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}}

\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}}

\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}}

\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}}

\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}
% Backwards compatibility:
%    \begin{macrocode}
\let\@ordinal=\@ordinalM
\let\@ordinalstring=\@ordinalstringM
\let\@Ordinalstring=\@OrdinalstringM
\let\@numberstring=\@numberstringM
\let\@Numberstring=\@NumberstringM
%    \end{macrocode}
%    \begin{macrocode}
%</fmtcount.sty>
%    \end{macrocode}
%    \begin{macrocode}
%<*fmtcount.perl>
%    \end{macrocode}
%    \begin{macrocode}
# File        : fmtcount.perl
# Author      : Nicola Talbot
# Date        : 3 Mar 2005
# Version     : 1.02
# Description : LaTeX2HTML implementation of fmtcount package

package main;

sub do_fmtcount_raise{
   local($tmp)="";

   $tmp .= 'sub do_cmd_fmtord{';
   $tmp .= 'local($_) = @_;';
   $tmp .= 'local($num) = &missing_braces unless ((s/$next_pair_pr_rx//o)&&($num=$2));';
   $tmp .= 'join("", "<SUP>",$num,"</SUP>",$_);';
   $tmp .='}';

   eval($tmp);
}

sub do_fmtcount_level{
   local($tmp)="";

   $tmp .= 'sub do_cmd_fmtord{';
   $tmp .= 'local($_) = @_;';
   $tmp .= 'local($num) = &missing_braces unless ((s/$next_pair_pr_rx//o)&&($num=$2));';
   $tmp .= 'join("", $num,$_);';
   $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{
   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);

   if ($suffix eq '')
   {
      $num;
   }
   else
   {
      local($br_id) = ++$global{'max_id'};
      $num . "\\fmtord${OP}$br_id${CP}$suffix${OP}$br_id${CP}";
   }
}

sub do_cmd_ordinalnum{
   local($_) = @_;
   local($num) = &missing_braces unless ($_[0]=~(s/$next_pair_pr_rx//o)&&($num=$2));
   local($gender)='m';
   local($suffix)='';

   if ($_[0]=~s/\[([mf])\]//)
   {
      $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}", $_[0]);
}

sub do_cmd_ordinal{
   local($ctr, $val, $id, $_) = &read_counter_value($_[0]);
   local($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]);
   }
}

@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')
            {
               $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;
}

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);
   }
   else
   {
      &get_numberstringenglish($val);
   }
}

sub do_cmd_numberstringnum{
   local($_) = @_;
   local($num,$gender);
   $num = &missing_braces 
          unless (($_[0]=~s/$next_pair_pr_rx//o)&&($num=$2));

   if ($_[0] =~ s/\[(m|f)\]//)
   {
      $gender = $1;
   }
   else
   {
      $gender = 'm';
   }

   join('', &get_numberstring($num,$gender), $_[0]);
}

sub do_cmd_numberstring{
   local($ctr, $val, $id, $_) = &read_counter_value($_[0]);
   local($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 get_Numberstring{
   local($val,$gender) = @_;
   local($string) = &get_numberstring($val,$gender);
   $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 (($_[0]=~s/$next_pair_pr_rx//o)&&($num=$2));

   if ($_[0] =~ s/\[(m|f)\]//)
   {
      $gender = $1;
   }
   else
   {
      $gender = 'm';
   }

   join('', &get_Numberstring($num,$gender), $_[0]);
}

sub do_cmd_Numberstring{
   local($ctr, $val, $id, $_) = &read_counter_value($_[0]);
   local($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 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_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);
   }
   else
   {
      &get_ordinalstringenglish($val);
   }
}

sub do_cmd_ordinalstringnum{
   local($_) = @_;
   local($num,$gender);
   $num = &missing_braces 
          unless (($_[0]=~s/$next_pair_pr_rx//o)&&($num=$2));

   if ($_[0] =~ s/\[(m|f)\]//)
   {
      $gender = $1;
   }
   else
   {
      $gender = 'm';
   }

   join('', &get_ordinalstring($num,$gender), $_[0]);
}

sub do_cmd_ordinalstring{
   local($ctr, $val, $id, $_) = &read_counter_value($_[0]);
   local($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, '}}', $_[0]);
   }
   else
   {
      join('', &get_ordinalstring($val, $gender), $_[0]);
   }
}

sub get_Ordinalstring{
   local($val,$gender) = @_;
   local($string) = &get_ordinalstring($val,$gender);
   $string =~ s/([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 (($_[0]=~s/$next_pair_pr_rx//o)&&($num=$2));

   if ($_[0] =~ s/\[(m|f)\]//)
   {
      $gender = $1;
   }
   else
   {
      $gender = 'm';
   }

   join('', &get_Ordinalstring($num,$gender), $_[0]);
}

sub do_cmd_Ordinalstring{
   local($ctr, $val, $id, $_) = &read_counter_value($_[0]);
   local($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_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 ($_[0]=~(s/$next_pair_pr_rx//o)&&($num=$2));
   
   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 ($_[0]=~(s/$next_pair_pr_rx//o)&&($num=$2));
   
   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 ($_[0]=~(s/$next_pair_pr_rx//o)&&($num=$2));
   
   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 ($_[0]=~(s/$next_pair_pr_rx//o)&&($num=$2));
   
   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 ($_[0]=~(s/$next_pair_pr_rx//o)&&($num=$2));
   
   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 ($_[0]=~(s/$next_pair_pr_rx//o)&&($num=$2));
   
   join('', (sprintf "%${padzeroes}s", &get_aaalph($num)), $_);
}

sub do_cmd_AAAlphnum{
   local($_) = @_;
   local($num) = &missing_braces unless ($_[0]=~(s/$next_pair_pr_rx//o)&&($num=$2));
   
   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 ($_[0]=~(s/$next_pair_pr_rx//o)&&($num=$2));
   
   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 ($_[0]=~(s/$next_pair_pr_rx//o)&&($num=$2));
   
   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 ($_[0]=~(s/$next_pair_pr_rx//o)&&($num=$2));

   # this is a cludge
   if ($num eq "THEDAY" or $num eq "THEYEAR" or $num eq "THEMONTH")
   {
      join('', 'TWODIGIT{', $num, '}', $_[0]);
   }
   else
   {
      join('', get_twodigit($num), $_[0]);
   }
}

# this was put here to help with the definition of \datelatin

sub do_cmd_romannumeral{
   local($_) = @_;
   local($num) = &missing_braces unless ($_[0]=~(s/$next_pair_pr_rx//o)&&($num=$2));

   # this is a cludge
   if ($num eq "THEDAY" or $num eq "THEYEAR" or $num eq "THEMONTH")
   {
      join('', 'ROMANNUMERAL{', $num, '}', $_[0]);
   }
   else
   {
      join('', &froman($num), $_[0]);
   }
}

# 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}
%    \begin{macrocode}
%</fmtcount.perl>
%    \end{macrocode}
%    \begin{macrocode}
%<*fc-samp.tex>
%    \end{macrocode}
\documentclass[a4paper]{article}

\usepackage[french]{babel}
\usepackage{fmtcount}
\newcounter{N}

\newcommand{\printrow}[1]{%
\newline
\setcounter{N}{#1}
\makebox[0.25in][r]{\theN\quad}
\makebox[0.75in][r]{\hexadecimal{N}\quad}
\makebox[0.75in][r]{\ordinal{N}\quad}
\makebox[2in][l]{\numberstring{N}}
}

\renewcommand{\thesection}{\ordinal{section}}

\begin{document}

\section{Displaying the value of a counter}
\label{ex} 

\begin{ttfamily}
\noindent 
\makebox[0.25in][c]{N}
\makebox[0.75in][c]{hexadecimal}
\makebox[0.75in][c]{ordinal}
numberstring
\printrow{0}
\printrow{1}
\printrow{2}
\printrow{3}
\printrow{4}
\printrow{5}
\printrow{6}
\printrow{7}
\printrow{8}
\printrow{9}
\printrow{10}
\printrow{11}
\printrow{12}
\printrow{13}
\printrow{14}
\printrow{15}
\printrow{16}
\printrow{17}
\printrow{18}
\printrow{19}
\printrow{20}
\printrow{21}
\printrow{22}
\printrow{23}
\printrow{24}
\printrow{25}
\printrow{30}
\printrow{40}
\printrow{50}
\printrow{60}
\printrow{70}
\printrow{71}
\printrow{75}
\printrow{80}
\printrow{81}
\printrow{85}
\printrow{90}
\printrow{91}
\printrow{95}
\printrow{100}
\printrow{101}
\printrow{110}
\printrow{125}
\printrow{150}
\printrow{170}
\printrow{180}
\printrow{190}
\printrow{200}
\printrow{250}
\printrow{300}
\printrow{400}
\printrow{500}
\printrow{600}
\printrow{700}
\printrow{800}
\printrow{900}
\printrow{1000}
\printrow{99999}
\end{ttfamily}

\section{Cross-Referencing}

Referencing a label: \ref{ex}.

Passing numbers explicitly: \ordinalnum{10},
\Numberstringnum{10}, \Ordinalstringnum{10}.

\end{document}
%    \begin{macrocode}
%</fc-samp.tex>
%    \end{macrocode}
%    \begin{macrocode}
%<*fc-lang.tex>
%    \end{macrocode}
 % This is an interactive script. Run it through \LaTeX
 % and enter appropriate responses.

\documentclass[a4paper]{article}

\usepackage[french,english,spanish,portuges]{babel}
\usepackage{fmtcount}

\newcounter{startval}
\newcounter{endval}
\newcounter{stepsize}
\newcounter{N}
\newcount\myctr
\newcount\langid

\begin{document}

\section{Displaying the value of a counter}

\typeout{This is an interactive script, testing the fmtcount package.}

\langid=-1

\loop
\typeout{Which language?^^J}
\typeout{[1] English}
\typeout{[2] Portuguese}
\typeout{[3] Spanish}
\typeout{[4] French}
\typeout{[5] French (Swiss)}
\typeout{[6] French (Belgium)}

\typein[\response]{}

\ifthenelse{\equal{\response}{1}}{\langid=1}{
\ifthenelse{\equal{\response}{2}}{\langid=2}{
\ifthenelse{\equal{\response}{3}}{\langid=3}{
\ifthenelse{\equal{\response}{4}}{\langid=4\fmtcountsetoptions{french}}{
\ifthenelse{\equal{\response}{5}}{\langid=5\fmtcountsetoptions{french=swiss}}{
\ifthenelse{\equal{\response}{6}}{\langid=6\fmtcountsetoptions{french=belgian}}
{\langid=-1
\typeout{Invalid response '\response', please select a number from 1 to 6}}}}}}}
\ifnum\langid=-1
\repeat

\ifcase\langid
\or \selectlanguage{english}
Current language: English.
\or \selectlanguage{portuges}
Current language: Portuguese.
\or \selectlanguage{spanish}
Current language: Spanish.
\or \selectlanguage{french}
Current language: French.
\or \selectlanguage{french}
Current language: French (Swiss).
\or \selectlanguage{french}
Current language: French (Belgium).
\fi

\def\startval{-1}

\loop
\typein[\startval]{Start value? (Integer from 0 to 99000)
[Default 1]}
\ifthenelse{\equal{\startval}{}}{\def\startval{1}}{}
\ifnum\startval<0\def\startval{-1}\fi
\ifnum\startval>99999\def\startval{-1}\fi
\ifnum\startval=-1
\repeat

\def\endval{-1}

\loop
\typein[\endval]{End value? (Integer from 0 to 99999)
[Default 1000]}
\ifthenelse{\equal{\endval}{}}{\def\endval{1000}}{}
\ifnum\endval<0\def\endval{-1}\fi
\ifnum\endval>99000\def\endval{-1}\fi
\ifnum\endval=-1
\repeat

\def\stepsize{0}

\loop
\typein[\stepsize]{Step size? (Non zero integer)
[Default 1]}
\ifthenelse{\equal{\stepsize}{}}{\def\stepsize{1}}{}
\ifnum\stepsize=0
\repeat

\typeout{From {\startval} to {\endval} step {\stepsize}}

\ifnum\startval<\endval
\ifnum\stepsize<0
\PackageError{fc-lang}{Infinite loop not permitted!}{}
\def\endval{\startval}
\fi
\fi

\ifnum\startval>\endval
\ifnum\stepsize>0
\PackageError{fc-lang}{Infinite loop not permitted!}{}
\def\endval{\startval}
\fi
\fi

\myctr=-1
\loop
\typeout{Which format?^^J}
\typeout{[1] ordinalstring}
\typeout{[2] Ordinalstring}
\typeout{[3] numberstring}
\typeout{[4] Numberstring}

\typein[\response]{Default: 1}

\ifthenelse{\equal{\response}{}}{\def\response{1}}{}%default val
\ifthenelse{\equal{\response}{1}}{\myctr=1}{
\ifthenelse{\equal{\response}{2}}{\myctr=2}{
\ifthenelse{\equal{\response}{3}}{\myctr=3}{
\ifthenelse{\equal{\response}{4}}{\myctr=4}{\myctr=-1
\typeout{Invalid response '\response', please select a number from 1 to 4}}}}}
\ifnum\myctr=-1
\repeat

\ifcase\myctr
\or\def\stringtype{ordinalstring}
\or\def\stringtype{Ordinalstring}
\or\def\stringtype{numberstring}
\or\def\stringtype{Numberstring}
\fi

\ifnum\langid>3
\myctr=-1
\loop
\typeout{Ordinal type?^^J}
\typeout{[1] eme}
\typeout{[2] e}
\typein[\response]{Default: 1}
\ifthenelse{\equal{\response}{}}{\def\response{1}}{}%default
\ifthenelse{\equal{\response}{1}}{%
\fmtcountsetoptions{abbrv=false}\myctr=1}{%
\ifthenelse{\equal{\response}{2}}{%
\fmtcountsetoptions{abbrv}\myctr=2}{%
\myctr=-1}}
\ifnum\myctr=-1
\repeat
\fi

\myctr=-1
\loop
\typeout{Ordinal format?^^J}
\typeout{[1] raised}
\typeout{[2] level}
\typein[\response]{Default: 1}
\ifthenelse{\equal{\response}{1}\or\equal{\response}{}}{%
\fmtcountsetoptions{fmtord=raise}\myctr=1}{%
\ifthenelse{\equal{\response}{2}}{%
\fmtcountsetoptions{fmtord=level}\myctr=2}{%
\myctr=-1}}
\ifnum\myctr=-1
\repeat

\ifnum\langid=1
\myctr=1
\else
\loop
\typein[\response]{Gender? (m or f) [Default: m]}
\ifthenelse{\equal{\response}{m}\or\equal{\response}{}}{\myctr=1}{
\ifthenelse{\equal{\response}{f}}{\myctr=2}{\myctr=-1
\typeout{Invalid response '\response'}}}
\ifnum\myctr=-1
\repeat
\fi

\ifcase\myctr
\or \def\gender{m}
\or \def\gender{f}
\fi

\setcounter{startval}{\startval}
\setcounter{endval}{\endval}
\setcounter{stepsize}{\stepsize}

\stepcounter{endval}
\begin{ttfamily}
\noindent 
\makebox[0.25in][c]{N}
\makebox[0.5in][c]{ordinal}\quad
\stringtype
\par
\myctr=\value{startval}
\loop
\noindent 
\setcounter{N}{\myctr}
\makebox[0.25in][r]{\arabic{N}}
\makebox[0.5in][r]{\ordinal{N}[\gender]}\quad
\csname\stringtype\endcsname{N}[\gender].
\par
\advance\myctr by \value{stepsize}\relax
\ifnum\myctr<\value{endval}
\repeat

\end{ttfamily}

\end{document}
%    \begin{macrocode}
%</fc-lang.tex>
%    \end{macrocode}
%\Finale
\endinput
