From c65c25c59074eaa09621f4fd782362b2c5227e32 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Tue, 24 Apr 2007 23:55:24 +0000 Subject: fmtcount 1.09 (24apr07) git-svn-id: svn://tug.org/texlive/trunk@4182 c570f23f-e606-0410-a88d-b1316a301751 --- .../texmf-dist/source/latex/fmtcount/fmtcount.dtx | 3116 +++++++++++++++----- .../texmf-dist/source/latex/fmtcount/fmtcount.ins | 2 +- 2 files changed, 2335 insertions(+), 783 deletions(-) (limited to 'Master/texmf-dist/source/latex/fmtcount') diff --git a/Master/texmf-dist/source/latex/fmtcount/fmtcount.dtx b/Master/texmf-dist/source/latex/fmtcount/fmtcount.dtx index ba813b38d30..4a1bf4eb979 100644 --- a/Master/texmf-dist/source/latex/fmtcount/fmtcount.dtx +++ b/Master/texmf-dist/source/latex/fmtcount/fmtcount.dtx @@ -12,7 +12,7 @@ % -author "Nicola Talbot" % -dir "source" % fmtcount -% Created on 2007/1/6 16:52 +% Created on 2007/4/21 19:25 %\fi %\iffalse %<*package> @@ -50,7 +50,8 @@ -\newcommand{\styname}[1]{\textsf{#1}}\newcommand{\clsname}[1]{\textsf{#1}} +\newcommand{\styname}[1]{\textsf{#1}}\newcommand{\clsname}[1]{\textsf{#1}}\newcommand{\cmdname}[1]{\texttt{\symbol{92}#1}} + \begin{document} \DocInput{fmtcount.dtx} \end{document} @@ -58,11 +59,12 @@ %\fi % %\RecordChanges +%\CheckSum{7392} %\OnlyDescription -%\def\filedate{6 January 2007} -%\def\fileversion{1.06} +%\def\filedate{20 April 2007} +%\def\fileversion{1.09} %\def\filename{fmtcount.dtx} -%\def\docdate{6 January 2007} +%\def\docdate{21st April 2007} % % \title{fmtcount.sty v\fileversion: Displaying the Values of %\LaTeX\ Counters} @@ -129,16 +131,27 @@ % 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{\NUMBERstring} +%The macro \verb"\NUMBERstring{"\meta{counter}\verb'}' does the same +%as \verb"\numberstring", but converted to upper case. Note that +%\verb"\MakeUppercase{\NUMBERstring{"\meta{counter}\verb'}}' doesn't +%work, due to the way that \verb"\MakeUppercase" expands its +%argument\footnote{See all the various postings to +%\texttt{comp.text.tex} about \cmdname{MakeUppercase}}. % %\DescribeMacro{\numberstringnum} %\DescribeMacro{\Numberstringnum} -%The macros \verb!\numberstringnum! and -%\verb!\Numberstringnum! work like -%\verb!\numberstring! and -%\verb!\Numberstring!, respectively, but take an actual number +%\DescribeMacro{\NUMBERstringnum} +%The macros \verb!\numberstringnum!, +%\verb!\Numberstringnum! and +%\verb"\NUMBERstringnum" work like +%\verb!\numberstring!, +%\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.\ @@ -147,16 +160,78 @@ % 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{\ORDINALstring} +% The macro \verb"\ORDINALstring{"\meta{counter}\verb!}! does the same as +%\verb"\ordinalstring", but with all words in upper case (see previous +%note about \cmdname{MakeUppercase}). % %\DescribeMacro{\ordinalstringnum} %\DescribeMacro{\Ordinalstringnum} -%The macros \verb!\ordinalstringnum! and -%\verb!\Ordinalstringnum! work like -%\verb!\Ordinalstring! and -%\verb!\Ordinalstring!, respectively, but take an actual number +%\DescribeMacro{\ORDINALstringnum} +%The macros \verb!\ordinalstringnum!, +%\verb!\Ordinalstringnum! and \cmdname{ORDINALstringnum} work like +%\verb!\ordinalstring!, +%\verb!\Ordinalstring! and \cmdname{ORDINALstring}, respectively, but take an actual number %rather than a counter as the argument. For example, %\verb"\ordinalstringnum{3}" will produce: third. % +%\changes{v.1.09}{21 Apr 2007}{store facility added} +%As from version 1.09, textual representations can be stored for +%later use. This overcomes the problems encountered when you +%attempt to use one of the above commands in \cmdname{edef}. +% +%Each of the following commands takes a label as the first argument, +%the other arguments are as the analogous commands above. These +%commands do not display anything, but store the textual +%representation. This can later be retrieved using +%\DescribeMacro{\FMCuse}\cmdname{FMCuse}\{\meta{label}\}. +%Note: with \cmdname{storeordinal} and \cmdname{storeordinalnum}, the +%only bit that doesn't get expanded is \cmdname{fmtord}. So, for +%example, \verb"\storeordinalnum{mylabel}{3}" will be stored as +%\verb"3\relax \fmtord{rd}". +% +%\DescribeMacro{\storeordinal} +%\cmdname{storeordinal}\{\meta{label}\}\{\meta{counter}\}[\meta{gender}] +%\par +%\DescribeMacro{\storeordinalstring} +%\cmdname{storeordinalstring}\{\meta{label}\}\{\meta{counter}\}[\meta{gender}] +%\par +%\DescribeMacro{\storeOrdinalstring} +%\cmdname{storeOrdinalstring}\{\meta{label}\}\{\meta{counter}\}[\meta{gender}] +%\par +%\DescribeMacro{\storeORDINALstring} +%\cmdname{storeORDINALstring}\{\meta{label}\}\{\meta{counter}\}[\meta{gender}] +%\par +%\DescribeMacro{\storenumberstring} +%\cmdname{storenumberstring}\{\meta{label}\}\{\meta{counter}\}[\meta{gender}] +%\par +%\DescribeMacro{\storeNumberstring} +%\cmdname{storeNumberstring}\{\meta{label}\}\{\meta{counter}\}[\meta{gender}] +%\par +%\DescribeMacro{\storeNUMBERstring} +%\cmdname{storeNUMBERstring}\{\meta{label}\}\{\meta{counter}\}[\meta{gender}] +%\par +%\DescribeMacro{\storeordinalnum} +%\cmdname{storeordinalnum}\{\meta{label}\}\{\meta{number}\}[\meta{gender}] +%\par +%\DescribeMacro{\storeordinalstringnum} +%\cmdname{storeordinalstring}\{\meta{label}\}\{\meta{number}\}[\meta{gender}] +%\par +%\DescribeMacro{\storeOrdinalstringnum} +%\cmdname{storeOrdinalstringnum}\{\meta{label}\}\{\meta{number}\}[\meta{gender}] +%\par +%\DescribeMacro{\storeORDINALstringnum} +%\cmdname{storeORDINALstringnum}\{\meta{label}\}\{\meta{number}\}[\meta{gender}] +%\par +%\DescribeMacro{\storenumberstringnum} +%\cmdname{storenumberstring}\{\meta{label}\}\{\meta{number}\}[\meta{gender}] +%\par +%\DescribeMacro{\storeNumberstringnum} +%\cmdname{storeNumberstring}\{\meta{label}\}\{\meta{number}\}[\meta{gender}] +%\par +%\DescribeMacro{\storeNUMBERstringnum} +%\cmdname{storeNUMBERstring}\{\meta{label}\}\{\meta{number}\}[\meta{gender}] +% % \DescribeMacro{\binary} %\changes{v2.4}{25 Sept 2004}{'binary added} % The macro \verb"\binary{"\meta{counter}\verb!}! will print the @@ -390,47 +465,55 @@ %<*fc-english.def> % \end{macrocode} %\fi +% \subsection{fc-english.def} % English definitions % \begin{macrocode} -\ProvidesFile{fc-english}[2005/04/29] +\ProvidesFile{fc-english}[2007/04/20] % \end{macrocode} -% Define macro that prints the value of the \TeX\ count -% register as an ordinal. +% Define macro that converts a number or count register (first +% argument) to an ordinal, and stores the result in the +% second argument, which should be a control sequence. % \begin{macrocode} -\newcommand{\@ordinalMenglish}[1]{% +\newcommand*{\@ordinalMenglish}[2]{% +\def\@fc@ord{}% \@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 +\ifnum\@ordinalctr=11\relax + \def\@fc@ord{th}% \else -\the\@orgargctr\fmtord{th}% default case -\fi -\fi -\fi + \ifnum\@ordinalctr=12\relax + \def\@fc@ord{th}% + \else + \ifnum\@ordinalctr=13\relax + \def\@fc@ord{th}% + \else + \@modulo{\@ordinalctr}{10}% + \ifcase\@ordinalctr + \def\@fc@ord{th}% case 0 + \or \def\@fc@ord{st}% case 1 + \or \def\@fc@ord{nd}% case 2 + \or \def\@fc@ord{rd}% case 3 + \else + \def\@fc@ord{th}% default case + \fi + \fi + \fi \fi +\edef#2{\number#1\relax\noexpand\fmtord{\@fc@ord}}% } +% \end{macrocode} +% There is no gender difference in English, so make feminine +% the same as the masculine. +% \begin{macrocode} \let\@ordinalFenglish=\@ordinalMenglish % \end{macrocode} % Define the macro that prints the value of a \TeX\ count register -% as text +% as text. To make it easier, break it up into units, teens and +% tens. First, the units: the argument should be between 0 and 9 +% inclusive. % \begin{macrocode} -\providecommand{\andname}{and} - -\newcommand{\@@unitstringenglish}[1]{% +\newcommand*{\@@unitstringenglish}[1]{% \ifcase#1\relax zero% \or one% @@ -444,8 +527,11 @@ zero% \or nine% \fi } - -\newcommand{\@@tenstringenglish}[1]{% +% \end{macrocode} +% Next the tens, again the argument should be between 0 and 9 +% inclusive. +% \begin{macrocode} +\newcommand*{\@@tenstringenglish}[1]{% \ifcase#1\relax \or ten% \or twenty% @@ -458,8 +544,11 @@ zero% \or ninety% \fi } - -\newcommand{\@@teenstringenglish}[1]{% +% \end{macrocode} +% Finally the teens, again the argument should be between 0 and 9 +% inclusive. +% \begin{macrocode} +\newcommand*{\@@teenstringenglish}[1]{% \ifcase#1\relax ten% \or eleven% @@ -473,8 +562,10 @@ ten% \or nineteen% \fi } - -\newcommand{\@@Unitstringenglish}[1]{% +% \end{macrocode} +% As above, but with the initial letter in uppercase. The units: +% \begin{macrocode} +\newcommand*{\@@Unitstringenglish}[1]{% \ifcase#1\relax Zero% \or One% @@ -488,8 +579,10 @@ Zero% \or Nine% \fi } - -\newcommand{\@@Tenstringenglish}[1]{% +% \end{macrocode} +% The tens: +% \begin{macrocode} +\newcommand*{\@@Tenstringenglish}[1]{% \ifcase#1\relax \or Ten% \or Twenty% @@ -502,8 +595,10 @@ Zero% \or Ninety% \fi } - -\newcommand{\@@Teenstringenglish}[1]{% +% \end{macrocode} +% The teens: +% \begin{macrocode} +\newcommand*{\@@Teenstringenglish}[1]{% \ifcase#1\relax Ten% \or Eleven% @@ -517,8 +612,14 @@ Ten% \or Nineteen% \fi } - -\newcommand{\@@numberstringenglish}[1]{% +% \end{macrocode} +% This has changed in version 1.09, so that it now stores +% the result in the second argument, but doesn't display anything. +% Since it only affects internal macros, it shouldn't affect +% documents created with older versions. (These internal macros are +% not meant for use in documents.) +% \begin{macrocode} +\newcommand*{\@@numberstringenglish}[2]{% \ifnum#1>99999 \PackageError{fmtcount}{Out of range}% {This macro only works for values less than 100000}% @@ -530,74 +631,118 @@ you can try typing "minus" first, and then pass the modulus of this number}% \fi \fi +\def#2{}% \@strctr=#1\relax \divide\@strctr by 1000\relax \ifnum\@strctr>9 % #1 is greater or equal to 10000 -\divide\@strctr by 10 -\ifnum\@strctr>1 -\@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% + \divide\@strctr by 10 + \ifnum\@strctr>1\relax + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr\@tenstring{\@strctr}}% + \@strctr=#1 \divide\@strctr by 1000\relax + \@modulo{\@strctr}{10}% + \ifnum\@strctr>0\relax + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr-\@unitstring{\@strctr}}% + \fi + \else + \@strctr=#1\relax + \divide\@strctr by 1000\relax + \@modulo{\@strctr}{10}% + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr\@teenstring{\@strctr}}% + \fi + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr\ \@thousand}% \else -\ifnum\@strctr>0 \@unitstring{\@strctr}\ \@thousand\fi + \ifnum\@strctr>0\relax + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr\@unitstring{\@strctr}\ \@thousand}% + \fi \fi \@strctr=#1\relax \@modulo{\@strctr}{1000}% \divide\@strctr by 100 -\ifnum\@strctr>0 -\ifnum#1>1000 \ \fi\@unitstring{\@strctr}\ \@hundred% +\ifnum\@strctr>0\relax + \ifnum#1>1000\relax + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr\ }% + \fi + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr\@unitstring{\@strctr}\ \@hundred}% \fi \@strctr=#1\relax \@modulo{\@strctr}{100}% -\ifnum#1>100 \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}% +\ifnum#1>100\relax + \ifnum\@strctr>0\relax + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr\ \@andname\ }% + \fi \fi +\ifnum\@strctr>19\relax + \divide\@strctr by 10\relax + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr\@tenstring{\@strctr}}% + \@strctr=#1\relax \@modulo{\@strctr}{10}% + \ifnum\@strctr>0\relax + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr-\@unitstring{\@strctr}}% + \fi \else -\@modulo{\@strctr}{10}% -\@teenstring{\@strctr}% -\fi + \ifnum\@strctr<10\relax + \ifnum\@strctr=0\relax + \ifnum#1<100\relax + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr\@unitstring{\@strctr}}% + \fi + \else + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr\@unitstring{\@strctr}}% + \fi + \else + \@modulo{\@strctr}{10}% + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr\@teenstring{\@strctr}}% + \fi \fi } - -\newcommand{\@numberstringMenglish}[1]{% +% \end{macrocode} +% All lower case version, the second argument must be a +% control sequence. +% \begin{macrocode} +\DeclareRobustCommand{\@numberstringMenglish}[2]{% \let\@unitstring=\@@unitstringenglish \let\@teenstring=\@@teenstringenglish \let\@tenstring=\@@tenstringenglish \def\@hundred{hundred}\def\@thousand{thousand}% -\@@numberstringenglish{#1}} - +\def\@andname{and}% +\@@numberstringenglish{#1}{#2}% +} +% \end{macrocode} +% There is no gender in English, so make feminine form the same +% as the masculine. +% \begin{macrocode} \let\@numberstringFenglish=\@numberstringMenglish - -\newcommand{\@NumberstringMenglish}[1]{% +% \end{macrocode} +% This version makes the first letter of each word an uppercase +% character (except ``and''). The second argument must be a control +% sequence. +% \begin{macrocode} +\newcommand*{\@NumberstringMenglish}[2]{% \let\@unitstring=\@@Unitstringenglish \let\@teenstring=\@@Teenstringenglish \let\@tenstring=\@@Tenstringenglish \def\@hundred{Hundred}\def\@thousand{Thousand}% -\@@numberstringenglish{#1}} - +\def\@andname{and}% +\@@numberstringenglish{#1}{#2}} +% \end{macrocode} +% There is no gender in English, so make feminine form the same +% as the masculine. +% \begin{macrocode} \let\@NumberstringFenglish=\@NumberstringMenglish % \end{macrocode} -% Define a macro that produces an ordinal as a string. +% Define a macro that produces an ordinal as a string. Again, break +% it up into units, teens and tens. First the units: % \begin{macrocode} -\newcommand{\@@unitthstringenglish}[1]{% +\newcommand*{\@@unitthstringenglish}[1]{% \ifcase#1\relax zeroth% \or first% @@ -611,8 +756,10 @@ zeroth% \or ninth% \fi } - -\newcommand{\@@tenthstringenglish}[1]{% +% \end{macrocode} +% Next the tens: +% \begin{macrocode} +\newcommand*{\@@tenthstringenglish}[1]{% \ifcase#1\relax \or tenth% \or twentieth% @@ -625,8 +772,10 @@ zeroth% \or ninetieth% \fi } - -\newcommand{\@@teenthstringenglish}[1]{% +% \end{macrocode} +% The teens: +% \begin{macrocode} +\newcommand*{\@@teenthstringenglish}[1]{% \ifcase#1\relax tenth% \or eleventh% @@ -640,8 +789,10 @@ tenth% \or nineteenth% \fi } - -\newcommand{\@@Unitthstringenglish}[1]{% +% \end{macrocode} +% As before, but with the first letter in upper case. The units: +% \begin{macrocode} +\newcommand*{\@@Unitthstringenglish}[1]{% \ifcase#1\relax Zeroth% \or First% @@ -655,8 +806,10 @@ Zeroth% \or Ninth% \fi } - -\newcommand{\@@Tenthstringenglish}[1]{% +% \end{macrocode} +% The tens: +% \begin{macrocode} +\newcommand*{\@@Tenthstringenglish}[1]{% \ifcase#1\relax \or Tenth% \or Twentieth% @@ -669,8 +822,10 @@ Zeroth% \or Ninetieth% \fi } - -\newcommand{\@@Teenthstringenglish}[1]{% +% \end{macrocode} +% The teens: +% \begin{macrocode} +\newcommand*{\@@Teenthstringenglish}[1]{% \ifcase#1\relax Tenth% \or Eleventh% @@ -684,8 +839,13 @@ Tenth% \or Nineteenth% \fi } - -\newcommand{\@@ordinalstringenglish}[1]{% +% \end{macrocode} +% Again, as from version 1.09, this has been changed to take two +% arguments, where the second argument is a control sequence. +% The resulting text is stored in the control sequence, and nothing +% is displayed. +% \begin{macrocode} +\newcommand*{\@@ordinalstringenglish}[2]{% \@strctr=#1\relax \ifnum#1>99999 \PackageError{fmtcount}{Out of range}% @@ -697,89 +857,143 @@ Tenth% you can try typing "minus" first, and then pass the modulus of this number}% \fi +\def#2{}% \fi \@strctr=#1\relax \divide\@strctr by 1000\relax -\ifnum\@strctr>9 +\ifnum\@strctr>9\relax % #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 + \divide\@strctr by 10 + \ifnum\@strctr>1\relax + \let\@@fc@ordstr#2\relax + \edef#2{\@@fc@ordstr\@tenstring{\@strctr}}% + \@strctr=#1\relax + \divide\@strctr by 1000\relax + \@modulo{\@strctr}{10}% + \ifnum\@strctr>0\relax + \let\@@fc@ordstr#2\relax + \edef#2{\@@fc@ordstr-\@unitstring{\@strctr}}% + \fi + \else + \@strctr=#1\relax \divide\@strctr by 1000\relax + \@modulo{\@strctr}{10}% + \let\@@fc@ordstr#2\relax + \edef#2{\@@fc@ordstr\@teenstring{\@strctr}}% + \fi + \@strctr=#1\relax \@modulo{\@strctr}{1000}% + \ifnum\@strctr=0\relax + \let\@@fc@ordstr#2\relax + \edef#2{\@@fc@ordstr\ \@thousandth}% + \else + \let\@@fc@ordstr#2\relax + \edef#2{\@@fc@ordstr\ \@thousand}% + \fi \else -\ifnum\@strctr>0\relax -\@unitstring{\@strctr}% -\@strctr=#1\relax \@modulo{\@strctr}{1000}% -\ifnum\@strctr=0\ \@thousandth\else\ \@thousand\fi -\fi + \ifnum\@strctr>0\relax + \let\@@fc@ordstr#2\relax + \edef#2{\@@fc@ordstr\@unitstring{\@strctr}}% + \@strctr=#1\relax \@modulo{\@strctr}{1000}% + \let\@@fc@ordstr#2\relax + \ifnum\@strctr=0\relax + \edef#2{\@@fc@ordstr\ \@thousandth}% + \else + \edef#2{\@@fc@ordstr\ \@thousand}% + \fi + \fi \fi \@strctr=#1\relax \@modulo{\@strctr}{1000}% \divide\@strctr by 100 -\ifnum\@strctr>0 -\ifnum#1>1000 \ \fi\@unitstring{\@strctr}% -\@strctr=#1\relax \@modulo{\@strctr}{100}% -\ifnum\@strctr=0\ \@hundredth\else\ \@hundred\fi +\ifnum\@strctr>0\relax + \ifnum#1>1000\relax + \let\@@fc@ordstr#2\relax + \edef#2{\@@fc@ordstr\ }% + \fi + \let\@@fc@ordstr#2\relax + \edef#2{\@@fc@ordstr\@unitstring{\@strctr}}% + \@strctr=#1\relax \@modulo{\@strctr}{100}% + \let\@@fc@ordstr#2\relax + \ifnum\@strctr=0\relax + \edef#2{\@@fc@ordstr\ \@hundredth}% + \else + \edef#2{\@@fc@ordstr\ \@hundred}% + \fi \fi \@strctr=#1\relax \@modulo{\@strctr}{100}% -\ifnum#1>100 \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}% +\ifnum#1>100\relax + \ifnum\@strctr>0\relax + \let\@@fc@ordstr#2\relax + \edef#2{\@@fc@ordstr\ \@andname\ }% + \fi \fi +\ifnum\@strctr>19\relax + \@tmpstrctr=\@strctr + \divide\@strctr by 10\relax + \@modulo{\@tmpstrctr}{10}% + \let\@@fc@ordstr#2\relax + \ifnum\@tmpstrctr=0\relax + \edef#2{\@@fc@ordstr\@tenthstring{\@strctr}}% + \else + \edef#2{\@@fc@ordstr\@tenstring{\@strctr}}% + \fi + \@strctr=#1\relax \@modulo{\@strctr}{10}% + \ifnum\@strctr>0\relax + \let\@@fc@ordstr#2\relax + \edef#2{\@@fc@ordstr-\@unitthstring{\@strctr}}% + \fi \else -\@modulo{\@strctr}{10}% -\@teenthstring{\@strctr}% -\fi + \ifnum\@strctr<10\relax + \ifnum\@strctr=0\relax + \ifnum#1<100\relax + \let\@@fc@ordstr#2\relax + \edef#2{\@@fc@ordstr\@unitthstring{\@strctr}}% + \fi + \else + \let\@@fc@ordstr#2\relax + \edef#2{\@@fc@ordstr\@unitthstring{\@strctr}}% + \fi + \else + \@modulo{\@strctr}{10}% + \let\@@fc@ordstr#2\relax + \edef#2{\@@fc@ordstr\@teenthstring{\@strctr}}% + \fi \fi } - -\newcommand{\@ordinalstringMenglish}[1]{% +% \end{macrocode} +% All lower case version. Again, the second argument must be a +% control sequence in which the resulting text is stored. +% \begin{macrocode} +\DeclareRobustCommand{\@ordinalstringMenglish}[2]{% \let\@unitthstring=\@@unitthstringenglish \let\@teenthstring=\@@teenthstringenglish \let\@tenthstring=\@@tenthstringenglish \let\@unitstring=\@@unitstringenglish \let\@teenstring=\@@teenstringenglish \let\@tenstring=\@@tenstringenglish +\def\@andname{and}% \def\@hundred{hundred}\def\@thousand{thousand}% \def\@hundredth{hundredth}\def\@thousandth{thousandth}% -\@@ordinalstringenglish{#1}} - +\@@ordinalstringenglish{#1}{#2}} +% \end{macrocode} +% No gender in English, so make feminine form same as masculine: +% \begin{macrocode} \let\@ordinalstringFenglish=\@ordinalstringMenglish - -\newcommand{\@OrdinalstringMenglish}[1]{% +% \end{macrocode} +% First letter of each word in upper case: +% \begin{macrocode} +\DeclareRobustCommand{\@OrdinalstringMenglish}[2]{% \let\@unitthstring=\@@Unitthstringenglish \let\@teenthstring=\@@Teenthstringenglish \let\@tenthstring=\@@Tenthstringenglish \let\@unitstring=\@@Unitstringenglish \let\@teenstring=\@@Teenstringenglish \let\@tenstring=\@@Tenstringenglish +\def\@andname{and}% \def\@hundred{Hundred}\def\@thousand{Thousand}% \def\@hundredth{Hundredth}\def\@thousandth{Thousandth}% -\@@ordinalstringenglish{#1}} - +\@@ordinalstringenglish{#1}{#2}} +% \end{macrocode} +% No gender in English, so make feminine form same as masculine: +% \begin{macrocode} \let\@OrdinalstringFenglish=\@OrdinalstringMenglish - % \end{macrocode} %\iffalse % \begin{macrocode} @@ -791,12 +1005,43 @@ this number}% %<*fc-french.def> % \end{macrocode} %\fi -% French +% \subsection{fc-french.def} +% French definitions +% \begin{macrocode} +\ProvidesFile{fc-french.def}[2007/04/20] +% \end{macrocode} +% Define macro that converts a number or count register (first +% argument) to an ordinal, and store the result in the second +% argument, which must be a control sequence. Masculine: % \begin{macrocode} -\ProvidesFile{fc-french.def}[2005/04/29] +\newcommand*{\@ordinalMfrench}[2]{% +\iffmtord@abbrv + \edef#2{\number#1\relax\noexpand\fmtord{e}}% +\else + \ifnum#1=1\relax + \edef#2{\number#1\relax\noexpand\fmtord{er}}% + \else + \edef#2{\number#1\relax\noexpand\fmtord{eme}}% + \fi +\fi} % \end{macrocode} +% Feminine: % \begin{macrocode} -\newcommand{\@@unitstringfrench}[1]{% +\newcommand*{\@ordinalFfrench}[2]{% +\iffmtord@abbrv + \edef#2{\number#1\relax\noexpand\fmtord{e}}% +\else + \ifnum#1=1\relax + \edef#2{\number#1\relax\noexpand\fmtord{ere}}% + \else + \edef#2{\number#1\relax\noexpand\fmtord{eme}}% + \fi +\fi} +% \end{macrocode} +% Textual representation of a number. To make it easier break it +% into units, tens and teens. First the units: +% \begin{macrocode} +\newcommand*{\@@unitstringfrench}[1]{% \ifcase#1\relax zero% \or un% @@ -810,15 +1055,20 @@ zero% \or neuf% \fi } - -\newcommand{\@@unitstringFfrench}[1]{% +% \end{macrocode} +% Feminine only changes for 1: +% \begin{macrocode} +\newcommand*{\@@unitstringFfrench}[1]{% \ifnum#1=1\relax une% \else\@@unitstringfrench{#1}% \fi } - -\newcommand{\@@tenstringfrench}[1]{% +% \end{macrocode} +% Tens (this includes the Belgian and Swiss variants, special +% cases employed lower down.) +% \begin{macrocode} +\newcommand*{\@@tenstringfrench}[1]{% \ifcase#1\relax \or dix% \or vingt% @@ -832,8 +1082,10 @@ une% \or cent% \fi } - -\newcommand{\@@teenstringfrench}[1]{% +% \end{macrocode} +% Teens: +% \begin{macrocode} +\newcommand*{\@@teenstringfrench}[1]{% \ifcase#1\relax dix% \or onze% @@ -847,8 +1099,10 @@ dix% \or dix-neuf% \fi } - -\newcommand{\@@seventiesfrench}[1]{% +% \end{macrocode} +% Seventies are a special case, depending on dialect: +% \begin{macrocode} +\newcommand*{\@@seventiesfrench}[1]{% \@tenstring{6}% \ifnum#1=1\relax \ \@andname\ @@ -857,8 +1111,10 @@ dix% \fi \@teenstring{#1}% } - -\newcommand{\@@eightiesfrench}[1]{% +% \end{macrocode} +% Eighties are a special case, depending on dialect: +% \begin{macrocode} +\newcommand*{\@@eightiesfrench}[1]{% \@unitstring{4}-\@tenstring{2}% \ifnum#1>0 -\@unitstring{#1}% @@ -866,33 +1122,43 @@ dix% s% \fi } - -\newcommand{\@@ninetiesfrench}[1]{% +% \end{macrocode} +% Nineties are a special case, depending on dialect: +% \begin{macrocode} +\newcommand*{\@@ninetiesfrench}[1]{% \@unitstring{4}-\@tenstring{2}-\@teenstring{#1}% } - -\newcommand{\@@seventiesfrenchswiss}[1]{% +% \end{macrocode} +% Swiss seventies: +% \begin{macrocode} +\newcommand*{\@@seventiesfrenchswiss}[1]{% \@tenstring{7}% \ifnum#1=1\ \@andname\ \fi \ifnum#1>1-\fi \ifnum#1>0\@unitstring{#1}\fi } - -\newcommand{\@@eightiesfrenchswiss}[1]{% +% \end{macrocode} +% Swiss eighties: +% \begin{macrocode} +\newcommand*{\@@eightiesfrenchswiss}[1]{% \@tenstring{8}% \ifnum#1=1\ \@andname\ \fi \ifnum#1>1-\fi \ifnum#1>0\@unitstring{#1}\fi } - -\newcommand{\@@ninetiesfrenchswiss}[1]{% +% \end{macrocode} +% Swiss nineties: +% \begin{macrocode} +\newcommand*{\@@ninetiesfrenchswiss}[1]{% \@tenstring{9}% \ifnum#1=1\ \@andname\ \fi \ifnum#1>1-\fi \ifnum#1>0\@unitstring{#1}\fi } - -\newcommand{\@@Unitstringfrench}[1]{% +% \end{macrocode} +% Units with initial letter in upper case: +% \begin{macrocode} +\newcommand*{\@@Unitstringfrench}[1]{% \ifcase#1\relax Zero% \or Un% @@ -906,15 +1172,20 @@ Zero% \or Neuf% \fi } - -\newcommand{\@@UnitstringFfrench}[1]{% +% \end{macrocode} +% As above, but feminine: +% \begin{macrocode} +\newcommand*{\@@UnitstringFfrench}[1]{% \ifnum#1=1\relax Une% \else \@@Unitstringfrench{#1}% \fi } - -\newcommand{\@@Tenstringfrench}[1]{% +% \end{macrocode} +% Tens, with initial letter in upper case (includes Swiss and +% Belgian variants): +% \begin{macrocode} +\newcommand*{\@@Tenstringfrench}[1]{% \ifcase#1\relax \or Dix% \or Vingt% @@ -928,8 +1199,10 @@ Une% \or Cent% \fi } - -\newcommand{\@@Teenstringfrench}[1]{% +% \end{macrocode} +% Teens, with initial letter in upper case: +% \begin{macrocode} +\newcommand*{\@@Teenstringfrench}[1]{% \ifcase#1\relax Dix% \or Onze% @@ -943,8 +1216,15 @@ Dix% \or Dix-Neuf% \fi } - -\newcommand{\@numberstringMfrenchswiss}[1]{% +% \end{macrocode} +% This has changed in version 1.09, so that it now stores the +% result in the second argument, but doesn't display anything. +% Since it only affects internal macros, it shouldn't affect +% documents created with older versions. (These internal macros +% are not defined for use in documents.) Firstly, the Swiss +% version: +% \begin{macrocode} +\DeclareRobustCommand{\@numberstringMfrenchswiss}[2]{% \let\@unitstring=\@@unitstringfrench \let\@teenstring=\@@teenstringfrench \let\@tenstring=\@@tenstringfrench @@ -953,9 +1233,11 @@ Dix% \let\@nineties=\@@ninetiesfrenchswiss \def\@hundred{cent}\def\@thousand{mille}% \def\@andname{et}% -\@@numberstringfrench{#1}} - -\newcommand{\@numberstringMfrenchfrance}[1]{% +\@@numberstringfrench{#1}{#2}} +% \end{macrocode} +% Same as above, but for French as spoken in France: +% \begin{macrocode} +\DeclareRobustCommand{\@numberstringMfrenchfrance}[2]{% \let\@unitstring=\@@unitstringfrench \let\@teenstring=\@@teenstringfrench \let\@tenstring=\@@tenstringfrench @@ -964,9 +1246,11 @@ Dix% \let\@nineties=\@@ninetiesfrench \def\@hundred{cent}\def\@thousand{mille}% \def\@andname{et}% -\@@numberstringfrench{#1}} - -\newcommand{\@numberstringMfrenchbelgian}[1]{% +\@@numberstringfrench{#1}{#2}} +% \end{macrocode} +% Same as above, but for Belgian dialect: +% \begin{macrocode} +\DeclareRobustCommand{\@numberstringMfrenchbelgian}[2]{% \let\@unitstring=\@@unitstringfrench \let\@teenstring=\@@teenstringfrench \let\@tenstring=\@@tenstringfrench @@ -975,11 +1259,15 @@ Dix% \let\@nineties=\@@ninetiesfrench \def\@hundred{cent}\def\@thousand{mille}% \def\@andname{et}% -\@@numberstringfrench{#1}} - +\@@numberstringfrench{#1}{#2}} +% \end{macrocode} +% Set default dialect: +% \begin{macrocode} \let\@numberstringMfrench=\@numberstringMfrenchfrance - -\newcommand{\@numberstringFfrenchswiss}[1]{% +% \end{macrocode} +% As above, but for feminine version. Swiss: +% \begin{macrocode} +\DeclareRobustCommand{\@numberstringFfrenchswiss}[2]{% \let\@unitstring=\@@unitstringFfrench \let\@teenstring=\@@teenstringfrench \let\@tenstring=\@@tenstringfrench @@ -988,9 +1276,11 @@ Dix% \let\@nineties=\@@ninetiesfrenchswiss \def\@hundred{cent}\def\@thousand{mille}% \def\@andname{et}% -\@@numberstringfrench{#1}} - -\newcommand{\@numberstringFfrenchfrance}[1]{% +\@@numberstringfrench{#1}{#2}} +% \end{macrocode} +% French: +% \begin{macrocode} +\DeclareRobustCommand{\@numberstringFfrenchfrance}[2]{% \let\@unitstring=\@@unitstringFfrench \let\@teenstring=\@@teenstringfrench \let\@tenstring=\@@tenstringfrench @@ -999,9 +1289,11 @@ Dix% \let\@nineties=\@@ninetiesfrench \def\@hundred{cent}\def\@thousand{mille}% \def\@andname{et}% -\@@numberstringfrench{#1}} - -\newcommand{\@numberstringFfrenchbelgian}[1]{% +\@@numberstringfrench{#1}{#2}} +% \end{macrocode} +% Belgian: +% \begin{macrocode} +\DeclareRobustCommand{\@numberstringFfrenchbelgian}[2]{% \let\@unitstring=\@@unitstringFfrench \let\@teenstring=\@@teenstringfrench \let\@tenstring=\@@tenstringfrench @@ -1010,11 +1302,15 @@ Dix% \let\@nineties=\@@ninetiesfrench \def\@hundred{cent}\def\@thousand{mille}% \def\@andname{et}% -\@@numberstringfrench{#1}} - +\@@numberstringfrench{#1}{#2}} +% \end{macrocode} +% Set default dialect: +% \begin{macrocode} \let\@numberstringFfrench=\@numberstringFfrenchfrance - -\newcommand{\@NumberstringMfrenchswiss}[1]{% +% \end{macrocode} +% As above, but with initial letter in upper case. Swiss (masculine): +% \begin{macrocode} +\DeclareRobustCommand{\@NumberstringMfrenchswiss}[2]{% \let\@unitstring=\@@Unitstringfrench \let\@teenstring=\@@Teenstringfrench \let\@tenstring=\@@Tenstringfrench @@ -1023,9 +1319,11 @@ Dix% \let\@nineties=\@@ninetiesfrenchswiss \def\@hundred{Cent}\def\@thousand{Mille}% \def\@andname{et}% -\@@numberstringfrench{#1}} - -\newcommand{\@NumberstringMfrenchfrance}[1]{% +\@@numberstringfrench{#1}{#2}} +% \end{macrocode} +% French: +% \begin{macrocode} +\DeclareRobustCommand{\@NumberstringMfrenchfrance}[2]{% \let\@unitstring=\@@Unitstringfrench \let\@teenstring=\@@Teenstringfrench \let\@tenstring=\@@Tenstringfrench @@ -1034,9 +1332,11 @@ Dix% \let\@nineties=\@@ninetiesfrench \def\@hundred{Cent}\def\@thousand{Mille}% \def\@andname{et}% -\@@numberstringfrench{#1}} - -\newcommand{\@NumberstringMfrenchbelgian}[1]{% +\@@numberstringfrench{#1}{#2}} +% \end{macrocode} +% Belgian: +% \begin{macrocode} +\DeclareRobustCommand{\@NumberstringMfrenchbelgian}[2]{% \let\@unitstring=\@@Unitstringfrench \let\@teenstring=\@@Teenstringfrench \let\@tenstring=\@@Tenstringfrench @@ -1045,11 +1345,15 @@ Dix% \let\@nineties=\@@ninetiesfrench \def\@hundred{Cent}\def\@thousand{Mille}% \def\@andname{et}% -\@@numberstringfrench{#1}} - +\@@numberstringfrench{#1}{#2}} +% \end{macrocode} +% Set default dialect: +% \begin{macrocode} \let\@NumberstringMfrench=\@NumberstringMfrenchfrance - -\newcommand{\@NumberstringFfrenchswiss}[1]{% +% \end{macrocode} +% As above, but feminine. Swiss: +% \begin{macrocode} +\DeclareRobustCommand{\@NumberstringFfrenchswiss}[2]{% \let\@unitstring=\@@UnitstringFfrench \let\@teenstring=\@@Teenstringfrench \let\@tenstring=\@@Tenstringfrench @@ -1058,9 +1362,11 @@ Dix% \let\@nineties=\@@ninetiesfrenchswiss \def\@hundred{Cent}\def\@thousand{Mille}% \def\@andname{et}% -\@@numberstringfrench{#1}} - -\newcommand{\@NumberstringFfrenchfrance}[1]{% +\@@numberstringfrench{#1}{#2}} +% \end{macrocode} +% French (feminine): +% \begin{macrocode} +\DeclareRobustCommand{\@NumberstringFfrenchfrance}[2]{% \let\@unitstring=\@@UnitstringFfrench \let\@teenstring=\@@Teenstringfrench \let\@tenstring=\@@Tenstringfrench @@ -1069,9 +1375,11 @@ Dix% \let\@nineties=\@@ninetiesfrench \def\@hundred{Cent}\def\@thousand{Mille}% \def\@andname{et}% -\@@numberstringfrench{#1}} - -\newcommand{\@NumberstringFfrenchbelgian}[1]{% +\@@numberstringfrench{#1}{#2}} +% \end{macrocode} +% Belgian (feminine): +% \begin{macrocode} +\DeclareRobustCommand{\@NumberstringFfrenchbelgian}[2]{% \let\@unitstring=\@@UnitstringFfrench \let\@teenstring=\@@Teenstringfrench \let\@tenstring=\@@Tenstringfrench @@ -1080,13 +1388,20 @@ Dix% \let\@nineties=\@@ninetiesfrench \def\@hundred{Cent}\def\@thousand{Mille}% \def\@andname{et}% -\@@numberstringfrench{#1}} - +\@@numberstringfrench{#1}{#2}} +% \end{macrocode} +% Set default dialect: +% \begin{macrocode} \let\@NumberstringFfrench=\@NumberstringFfrenchfrance - -\newcommand{\@ordinalstringMfrenchswiss}[1]{% +% \end{macrocode} +% Again, as from version 1.09, this has been changed to take +% two arguments, where the second argument is a control +% sequence, and nothing is displayed. Store textual representation +% of an ordinal in the given control sequence. Swiss dialect (masculine): +% \begin{macrocode} +\DeclareRobustCommand{\@ordinalstringMfrenchswiss}[2]{% \ifnum#1=1\relax -premier% +\def#2{premier}% \else \let\@unitthstring=\@@unitthstringfrench \let\@unitstring=\@@unitstringfrench @@ -1103,12 +1418,14 @@ premier% \def\@hundredth{centi\`eme}\def\@hundred{cent}% \def\@thousandth{mili\`eme}\def\@thousand{mille}% \def\@andname{et}% -\@@ordinalstringfrench{#1}% +\@@ordinalstringfrench{#1}{#2}% \fi} - -\newcommand{\@ordinalstringMfrenchfrance}[1]{% +% \end{macrocode} +% French (masculine): +% \begin{macrocode} +\DeclareRobustCommand{\@ordinalstringMfrenchfrance}[2]{% \ifnum#1=1\relax -premier% +\def#2{premier}% \else \let\@unitthstring=\@@unitthstringfrench \let\@unitstring=\@@unitstringfrench @@ -1126,12 +1443,14 @@ premier% \def\@hundredth{centi\`eme}\def\@hundred{cent}% \def\@thousandth{mili\`eme}\def\@thousand{mille}% \def\@andname{et}% -\@@ordinalstringfrench{#1}% +\@@ordinalstringfrench{#1}{#2}% \fi} - -\newcommand{\@ordinalstringMfrenchbelgian}[1]{% +% \end{macrocode} +% Belgian dialect (masculine): +% \begin{macrocode} +\DeclareRobustCommand{\@ordinalstringMfrenchbelgian}[2]{% \ifnum#1=1\relax -premier% +\def#2{premier}% \else \let\@unitthstring=\@@unitthstringfrench \let\@unitstring=\@@unitstringfrench @@ -1149,14 +1468,18 @@ premier% \def\@hundredth{centi\`eme}\def\@hundred{cent}% \def\@thousandth{mili\`eme}\def\@thousand{mille}% \def\@andname{et}% -\@@ordinalstringfrench{#1}% +\@@ordinalstringfrench{#1}{#2}% \fi} - +% \end{macrocode} +% Set up default dialect: +% \begin{macrocode} \let\@ordinalstringMfrench=\@ordinalstringMfrenchfrance - -\newcommand{\@ordinalstringFfrenchswiss}[1]{% +% \end{macrocode} +% As above, but feminine. Swiss: +% \begin{macrocode} +\DeclareRobustCommand{\@ordinalstringFfrenchswiss}[2]{% \ifnum#1=1\relax -premi\`ere% +\def#2{premi\`ere}% \else \let\@unitthstring=\@@unitthstringfrench \let\@unitstring=\@@unitstringFfrench @@ -1173,12 +1496,14 @@ premi\`ere% \def\@hundredth{centi\`eme}\def\@hundred{cent}% \def\@thousandth{mili\`eme}\def\@thousand{mille}% \def\@andname{et}% -\@@ordinalstringfrench{#1}% +\@@ordinalstringfrench{#1}{#2}% \fi} - -\newcommand{\@ordinalstringFfrenchfrance}[1]{% +% \end{macrocode} +% French (feminine): +% \begin{macrocode} +\DeclareRobustCommand{\@ordinalstringFfrenchfrance}[2]{% \ifnum#1=1\relax -premi\`ere% +\def#2{premi\`ere}% \else \let\@unitthstring=\@@unitthstringfrench \let\@unitstring=\@@unitstringFfrench @@ -1196,12 +1521,14 @@ premi\`ere% \def\@hundredth{centi\`eme}\def\@hundred{cent}% \def\@thousandth{mili\`eme}\def\@thousand{mille}% \def\@andname{et}% -\@@ordinalstringfrench{#1}% +\@@ordinalstringfrench{#1}{#2}% \fi} - -\newcommand{\@ordinalstringFfrenchbelgian}[1]{% +% \end{macrocode} +% Belgian (feminine): +% \begin{macrocode} +\DeclareRobustCommand{\@ordinalstringFfrenchbelgian}[2]{% \ifnum#1=1\relax -premi\`ere% +\def#2{premi\`ere}% \else \let\@unitthstring=\@@unitthstringfrench \let\@unitstring=\@@unitstringFfrench @@ -1219,14 +1546,18 @@ premi\`ere% \def\@hundredth{centi\`eme}\def\@hundred{cent}% \def\@thousandth{mili\`eme}\def\@thousand{mille}% \def\@andname{et}% -\@@ordinalstringfrench{#1}% +\@@ordinalstringfrench{#1}{#2}% \fi} - +% \end{macrocode} +% Set up default dialect: +% \begin{macrocode} \let\@ordinalstringFfrench=\@ordinalstringFfrenchfrance - -\newcommand{\@OrdinalstringMfrenchswiss}[1]{% +% \end{macrocode} +% As above, but with initial letters in upper case. Swiss (masculine): +% \begin{macrocode} +\DeclareRobustCommand{\@OrdinalstringMfrenchswiss}[2]{% \ifnum#1=1\relax -Premi\`ere% +\def#2{Premi\`ere}% \else \let\@unitthstring=\@@Unitthstringfrench \let\@unitstring=\@@Unitstringfrench @@ -1243,12 +1574,14 @@ Premi\`ere% \def\@hundredth{Centi\`eme}\def\@hundred{Cent}% \def\@thousandth{Mili\`eme}\def\@thousand{Mille}% \def\@andname{et}% -\@@ordinalstringfrench{#1}% +\@@ordinalstringfrench{#1}{#2}% \fi} - -\newcommand{\@OrdinalstringMfrenchfrance}[1]{% +% \end{macrocode} +% French (masculine): +% \begin{macrocode} +\DeclareRobustCommand{\@OrdinalstringMfrenchfrance}[2]{% \ifnum#1=1\relax -Premi\`ere% +\def#2{Premi\`ere}% \else \let\@unitthstring=\@@Unitthstringfrench \let\@unitstring=\@@Unitstringfrench @@ -1266,12 +1599,14 @@ Premi\`ere% \def\@hundredth{Centi\`eme}\def\@hundred{Cent}% \def\@thousandth{Mili\`eme}\def\@thousand{Mille}% \def\@andname{et}% -\@@ordinalstringfrench{#1}% +\@@ordinalstringfrench{#1}{#2}% \fi} - -\newcommand{\@OrdinalstringMfrenchbelgian}[1]{% +% \end{macrocode} +% Belgian (masculine): +% \begin{macrocode} +\DeclareRobustCommand{\@OrdinalstringMfrenchbelgian}[2]{% \ifnum#1=1\relax -Premi\`ere% +\def#2{Premi\`ere}% \else \let\@unitthstring=\@@Unitthstringfrench \let\@unitstring=\@@Unitstringfrench @@ -1289,14 +1624,18 @@ Premi\`ere% \def\@hundredth{Centi\`eme}\def\@hundred{Cent}% \def\@thousandth{Mili\`eme}\def\@thousand{Mille}% \def\@andname{et}% -\@@ordinalstringfrench{#1}% +\@@ordinalstringfrench{#1}{#2}% \fi} - +% \end{macrocode} +% Set up default dialect: +% \begin{macrocode} \let\@OrdinalstringMfrench=\@OrdinalstringMfrenchfrance - -\newcommand{\@OrdinalstringFfrenchswiss}[1]{% +% \end{macrocode} +% As above, but feminine form. Swiss: +% \begin{macrocode} +\DeclareRobustCommand{\@OrdinalstringFfrenchswiss}[2]{% \ifnum#1=1\relax -Premi\`ere% +\def#2{Premi\`ere}% \else \let\@unitthstring=\@@Unitthstringfrench \let\@unitstring=\@@UnitstringFfrench @@ -1313,12 +1652,14 @@ Premi\`ere% \def\@hundredth{Centi\`eme}\def\@hundred{Cent}% \def\@thousandth{Mili\`eme}\def\@thousand{Mille}% \def\@andname{et}% -\@@ordinalstringfrench{#1}% +\@@ordinalstringfrench{#1}{#2}% \fi} - -\newcommand{\@OrdinalstringFfrenchfrance}[1]{% +% \end{macrocode} +% French (feminine): +% \begin{macrocode} +\DeclareRobustCommand{\@OrdinalstringFfrenchfrance}[2]{% \ifnum#1=1\relax -Premi\`ere% +\def#2{Premi\`ere}% \else \let\@unitthstring=\@@Unitthstringfrench \let\@unitstring=\@@UnitstringFfrench @@ -1336,12 +1677,14 @@ Premi\`ere% \def\@hundredth{Centi\`eme}\def\@hundred{Cent}% \def\@thousandth{Mili\`eme}\def\@thousand{Mille}% \def\@andname{et}% -\@@ordinalstringfrench{#1}% +\@@ordinalstringfrench{#1}{#2}% \fi} - -\newcommand{\@OrdinalstringFfrenchbelgian}[1]{% +% \end{macrocode} +% Belgian (feminine): +% \begin{macrocode} +\DeclareRobustCommand{\@OrdinalstringFfrenchbelgian}[2]{% \ifnum#1=1\relax -Premi\`ere% +\def#2{Premi\`ere}% \else \let\@unitthstring=\@@Unitthstringfrench \let\@unitstring=\@@UnitstringFfrench @@ -1359,26 +1702,19 @@ Premi\`ere% \def\@hundredth{Centi\`eme}\def\@hundred{Cent}% \def\@thousandth{Mili\`eme}\def\@thousand{Mille}% \def\@andname{et}% -\@@ordinalstringfrench{#1}% +\@@ordinalstringfrench{#1}{#2}% \fi} - +% \end{macrocode} +% Set up default dialect: +% \begin{macrocode} \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]{% +% \end{macrocode} +% In order to convert numbers into textual ordinals, need +% to break it up into units, tens and teens. First the units. +% The argument must be a number or count register between 0 +% and 9. +% \begin{macrocode} +\newcommand*{\@@unitthstringfrench}[1]{% \ifcase#1\relax zero% \or uni\`eme% @@ -1392,8 +1728,11 @@ zero% \or neuvi\`eme% \fi } - -\newcommand{\@@tenthstringfrench}[1]{% +% \end{macrocode} +% Tens (includes Swiss and Belgian variants, special cases are +% dealt with later.) +% \begin{macrocode} +\newcommand*{\@@tenthstringfrench}[1]{% \ifcase#1\relax \or dixi\`eme% \or vingti\`eme% @@ -1406,8 +1745,10 @@ zero% \or nonenti\`eme% \fi } - -\newcommand{\@@teenthstringfrench}[1]{% +% \end{macrocode} +% Teens: +% \begin{macrocode} +\newcommand*{\@@teenthstringfrench}[1]{% \ifcase#1\relax dixi\`eme% \or onzi\`eme% @@ -1421,8 +1762,10 @@ dixi\`eme% \or dix-neuvi\`eme% \fi } - -\newcommand{\@@seventiethsfrenchswiss}[1]{% +% \end{macrocode} +% Seventies vary depending on dialect. Swiss: +% \begin{macrocode} +\newcommand*{\@@seventiethsfrenchswiss}[1]{% \ifcase#1\relax \@tenthstring{7}% \or @@ -1430,8 +1773,10 @@ dixi\`eme% \else \@tenstring{7}-\@unitthstring{#1}% \fi} - -\newcommand{\@@eightiethsfrenchswiss}[1]{% +% \end{macrocode} +% Eighties vary depending on dialect. Swiss: +% \begin{macrocode} +\newcommand*{\@@eightiethsfrenchswiss}[1]{% \ifcase#1\relax \@tenthstring{8}% \or @@ -1439,8 +1784,10 @@ dixi\`eme% \else \@tenstring{8}-\@unitthstring{#1}% \fi} - -\newcommand{\@@ninetiethsfrenchswiss}[1]{% +% \end{macrocode} +% Nineties vary depending on dialect. Swiss: +% \begin{macrocode} +\newcommand*{\@@ninetiethsfrenchswiss}[1]{% \ifcase#1\relax \@tenthstring{9}% \or @@ -1448,8 +1795,10 @@ dixi\`eme% \else \@tenstring{9}-\@unitthstring{#1}% \fi} - -\newcommand{\@@seventiethsfrench}[1]{% +% \end{macrocode} +% French (as spoken in France) version: +% \begin{macrocode} +\newcommand*{\@@seventiethsfrench}[1]{% \ifnum#1=0\relax \@tenstring{6}% -% @@ -1459,8 +1808,10 @@ dixi\`eme% \fi \@teenthstring{#1}% } - -\newcommand{\@@eightiethsfrench}[1]{% +% \end{macrocode} +% Eighties (as spoken in France): +% \begin{macrocode} +\newcommand*{\@@eightiethsfrench}[1]{% \ifnum#1>0\relax \@unitstring{4}-\@tenstring{2}% -\@unitthstring{#1}% @@ -1468,12 +1819,16 @@ dixi\`eme% \@unitstring{4}-\@tenthstring{2}% \fi } - -\newcommand{\@@ninetiethsfrench}[1]{% +% \end{macrocode} +% Nineties (as spoken in France): +% \begin{macrocode} +\newcommand*{\@@ninetiethsfrench}[1]{% \@unitstring{4}-\@tenstring{2}-\@teenthstring{#1}% } - -\newcommand{\@@Unitthstringfrench}[1]{% +% \end{macrocode} +% As above, but with initial letter in upper case. Units: +% \begin{macrocode} +\newcommand*{\@@Unitthstringfrench}[1]{% \ifcase#1\relax Zero% \or Uni\`eme% @@ -1487,8 +1842,10 @@ Zero% \or Neuvi\`eme% \fi } - -\newcommand{\@@Tenthstringfrench}[1]{% +% \end{macrocode} +% Tens (includes Belgian and Swiss variants): +% \begin{macrocode} +\newcommand*{\@@Tenthstringfrench}[1]{% \ifcase#1\relax \or Dixi\`eme% \or Vingti\`eme% @@ -1501,8 +1858,10 @@ Zero% \or Nonenti\`eme% \fi } - -\newcommand{\@@Teenthstringfrench}[1]{% +% \end{macrocode} +% Teens: +% \begin{macrocode} +\newcommand*{\@@Teenthstringfrench}[1]{% \ifcase#1\relax Dixi\`eme% \or Onzi\`eme% @@ -1516,10 +1875,11 @@ Dixi\`eme% \or Dix-Neuvi\`eme% \fi } - % \end{macrocode} +% Store textual representation of number (first argument) in given control +% sequence (second argument). % \begin{macrocode} -\newcommand{\@@numberstringfrench}[1]{% +\newcommand*{\@@numberstringfrench}[2]{% \ifnum#1>99999 \PackageError{fmtcount}{Out of range}% {This macro only works for values less than 100000}% @@ -1531,57 +1891,78 @@ you can try typing "minus" first, and then pass the modulus of this number}% \fi \fi +\def#2{}% \@strctr=#1\relax \divide\@strctr by 1000\relax -\ifnum\@strctr>9 +\ifnum\@strctr>9\relax % #1 is greater or equal to 10000 \@tmpstrctr=\@strctr - \divide\@strctr by 10 - \ifnum\@strctr>1 + \divide\@strctr by 10\relax + \ifnum\@strctr>1\relax \ifthenelse{\(\@strctr>6\)\and\(\@strctr<10\)}{% \@modulo{\@tmpstrctr}{10}% \ifnum\@strctr<8\relax - \@seventies{\@tmpstrctr}% + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr\@seventies{\@tmpstrctr}}% \else \ifnum\@strctr<9\relax - \@eighties{\@tmpstrctr}% + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr\@eighties{\@tmpstrctr}}% \else - \ifnum\@strctr<10\@nineties{\@tmpstrctr}\fi + \ifnum\@strctr<10\relax + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr\@nineties{\@tmpstrctr}}% + \fi \fi \fi }{% - \@tenstring{\@strctr}% + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr\@tenstring{\@strctr}}% \@strctr=#1\relax \divide\@strctr by 1000\relax \@modulo{\@strctr}{10}% \ifnum\@strctr>0\relax -% \ifnum\@strctr=1\ \@andname\fi - \ \@unitstring{\@strctr}% + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr\ \@unitstring{\@strctr}}% \fi }% \else \@strctr=#1\relax \divide\@strctr by 1000 \@modulo{\@strctr}{10}% - \@teenstring{\@strctr}% + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr\@teenstring{\@strctr}}% \fi - \ \@thousand% + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr\ \@thousand}% \else - \ifnum\@strctr>0 - \ifnum\@strctr>1\@unitstring{\@strctr}\ \fi - \@thousand + \ifnum\@strctr>0\relax + \ifnum\@strctr>1\relax + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr\@unitstring{\@strctr}\ }% + \fi + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr\@thousand}% \fi \fi \@strctr=#1\relax \@modulo{\@strctr}{1000}% \divide\@strctr by 100 \ifnum\@strctr>0\relax - \ifnum#1>1000 \ \fi + \ifnum#1>1000\relax + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr\ }% + \fi \@tmpstrctr=#1\relax \@modulo{\@tmpstrctr}{1000}\relax \ifnum\@tmpstrctr=100\relax - \@tenstring{10}\relax + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr\@tenstring{10}}% \else - \ifnum\@strctr>1\@unitstring{\@strctr}\ \fi - \@hundred + \ifnum\@strctr>1\relax + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr\@unitstring{\@strctr}\ }% + \fi + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr\@hundred}% \fi \fi \@strctr=#1\relax \@modulo{\@strctr}{100}% @@ -1589,49 +1970,71 @@ this number}% %\divide\@tmpstrctr by 100\relax \ifnum#1>100\relax \ifnum\@strctr>0\relax -\ % \ \@andname\ + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr\ }% \else - \ifnum\@tmpstrctr>0s\fi% + \ifnum\@tmpstrctr>0\relax + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr s}% + \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 -}% +\ifnum\@strctr>19\relax + \@tmpstrctr=\@strctr + \divide\@strctr by 10\relax + \ifthenelse{\@strctr>6}{% + \@modulo{\@tmpstrctr}{10}% + \ifnum\@strctr<8\relax + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr\@seventies{\@tmpstrctr}}% + \else + \ifnum\@strctr<9\relax + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr\@eighties{\@tmpstrctr}}% + \else + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr\@nineties{\@tmpstrctr}}% + \fi + \fi + }{% + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr\@tenstring{\@strctr}}% + \@strctr=#1\relax \@modulo{\@strctr}{10}% + \ifnum\@strctr>0\relax + \let\@@fc@numstr#2\relax + \ifnum\@strctr=1\relax + \edef#2{\@@fc@numstr\ \@andname\ }% + \else + \edef#2{\@@fc@numstr-}% + \fi + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr\@unitstring{\@strctr}}% + \fi + }% \else -\ifnum\@strctr<10 -\ifnum\@strctr=0 -\ifnum#1<100 \@unitstring{\@strctr}\fi -\else%(>0,<10) -\@unitstring{\@strctr}% -\fi -\else%>10 -\@modulo{\@strctr}{10}% -\@teenstring{\@strctr}% -\fi + \ifnum\@strctr<10\relax + \ifnum\@strctr=0\relax + \ifnum#1<100\relax + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr\@unitstring{\@strctr}}% + \fi + \else%(>0,<10) + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr\@unitstring{\@strctr}}% + \fi + \else%>10 + \@modulo{\@strctr}{10}% + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr\@teenstring{\@strctr}}% + \fi \fi } % \end{macrocode} +% Store textual representation of an ordinal (from number +% specified in first argument) in given control +% sequence (second argument). % \begin{macrocode} -\newcommand{\@@ordinalstringfrench}[1]{% +\newcommand*{\@@ordinalstringfrench}[2]{% \ifnum#1>99999 \PackageError{fmtcount}{Out of range}% {This macro only works for values less than 100000}% @@ -1643,6 +2046,7 @@ you can try typing "minus" first, and then pass the modulus of this number}% \fi \fi +\def#2{}% \@strctr=#1\relax \divide\@strctr by 1000\relax \ifnum\@strctr>9 % #1 is greater or equal to 10000 @@ -1652,85 +2056,137 @@ this number}% \ifthenelse{\@strctr>6}{% \@modulo{\@tmpstrctr}{10}% \ifnum\@strctr=7\relax - \@seventies{\@tmpstrctr}% + \let\@@fc@ordstr#2\relax + \edef#2{\@@fc@ordstr\@seventies{\@tmpstrctr}}% \else \ifnum\@strctr=8\relax - \@eighties{\@tmpstrctr}% + \let\@@fc@ordstr#2\relax + \edef#2{\@@fc@ordstr\@eighties{\@tmpstrctr}}% \else - \@nineties{\@tmpstrctr}% + \let\@@fc@ordstr#2\relax + \edef#2{\@@fc@ordstr\@nineties{\@tmpstrctr}}% \fi \fi }{% - \@tenstring{\@strctr}% + \let\@@fc@ordstr#2\relax + \edef#2{\@@fc@ordstr\@tenstring{\@strctr}}% \@strctr=#1\relax \divide\@strctr by 1000\relax \@modulo{\@strctr}{10}% - \ifnum\@strctr=1\ \@andname\fi - \ifnum\@strctr>0\ \@unitstring{\@strctr}\fi + \ifnum\@strctr=1\relax + \let\@@fc@ordstr#2\relax + \edef#2{\@@fc@ordstr\ \@andname}% + \fi + \ifnum\@strctr>0\relax + \let\@@fc@ordstr#2\relax + \edef#2{\@@fc@ordstr\ \@unitstring{\@strctr}}% + \fi }% \else \@strctr=#1\relax \divide\@strctr by 1000\relax \@modulo{\@strctr}{10}% - \@teenstring{\@strctr}% + \let\@@fc@ordstr#2\relax + \edef#2{\@@fc@ordstr\@teenstring{\@strctr}}% \fi \@strctr=#1\relax \@modulo{\@strctr}{1000}% - \ifnum\@strctr=0\ \@thousandth\else\ \@thousand \fi + \ifnum\@strctr=0\relax + \let\@@fc@ordstr#2\relax + \edef#2{\@@fc@ordstr\ \@thousandth}% + \else + \let\@@fc@ordstr#2\relax + \edef#2{\@@fc@ordstr\ \@thousand}% + \fi \else \ifnum\@strctr>0\relax - \@unitstring{\@strctr}% + \let\@@fc@ordstr#2\relax + \edef#2{\@@fc@ordstr\@unitstring{\@strctr}}% \@strctr=#1\relax \@modulo{\@strctr}{1000}% - \ifnum\@strctr=0\ \@thousandth\else\ \@thousand\fi + \ifnum\@strctr=0\relax + \let\@@fc@ordstr#2\relax + \edef#2{\@@fc@ordstr\ \@thousandth}% + \else + \let\@@fc@ordstr#2\relax + \edef#2{\@@fc@ordstr\ \@thousand}% + \fi \fi \fi \@strctr=#1\relax \@modulo{\@strctr}{1000}% -\divide\@strctr by 100 -\ifnum\@strctr>0 -\ifnum#1>1000 \ \fi\@unitstring{\@strctr}% -\@strctr=#1\relax \@modulo{\@strctr}{100}% -\ifnum\@strctr=0\ \@hundredth\else\ \@hundred\fi +\divide\@strctr by 100\relax +\ifnum\@strctr>0\relax + \ifnum#1>1000\relax + \let\@@fc@ordstr#2\relax + \edef#2{\@@fc@ordstr\ }% + \fi + \let\@@fc@ordstr#2\relax + \edef#2{\@@fc@ordstr\@unitstring{\@strctr}}% + \@strctr=#1\relax \@modulo{\@strctr}{100}% + \let\@@fc@ordstr#2\relax + \ifnum\@strctr=0\relax + \edef#2{\@@fc@ordstr\ \@hundredth}% + \else + \edef#2{\@@fc@ordstr\ \@hundred}% + \fi \fi \@tmpstrctr=\@strctr \@strctr=#1\relax \@modulo{\@strctr}{100}% \ifnum#1>100\relax -\ifnum\@strctr>0\ \@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}% + \ifnum\@strctr>0\relax + \let\@@fc@ordstr#2\relax + \edef#2{\@@fc@ordstr\ \@andname\ }% + \fi \fi +\ifnum\@strctr>19\relax + \@tmpstrctr=\@strctr + \divide\@strctr by 10\relax + \@modulo{\@tmpstrctr}{10}% + \ifthenelse{\@strctr>6}{% + \ifnum\@strctr=7\relax + \let\@@fc@ordstr#2\relax + \edef#2{\@@fc@ordstr\@seventieths{\@tmpstrctr}}% + \else + \ifnum\@strctr=8\relax + \let\@@fc@ordstr#2\relax + \edef#2{\@@fc@ordstr\@eightieths{\@tmpstrctr}}% + \else + \let\@@fc@ordstr#2\relax + \edef#2{\@@fc@ordstr\@ninetieths{\@tmpstrctr}}% + \fi + \fi + }{% + \ifnum\@tmpstrctr=0\relax + \let\@@fc@ordstr#2\relax + \edef#2{\@@fc@ordstr\@tenthstring{\@strctr}}% + \else + \let\@@fc@ordstr#2\relax + \edef#2{\@@fc@ordstr\@tenstring{\@strctr}}% + \fi + \@strctr=#1\relax \@modulo{\@strctr}{10}% + \ifnum\@strctr=1\relax + \let\@@fc@ordstr#2\relax + \edef#2{\@@fc@ordstr\ \@andname}% + \fi + \ifnum\@strctr>0\relax + \let\@@fc@ordstr#2\relax + \edef#2{\@@fc@ordstr\ \@unitthstring{\@strctr}}% + \fi + }% \else -\@modulo{\@strctr}{10}% -\@teenthstring{\@strctr}% -\fi + \ifnum\@strctr<10\relax + \ifnum\@strctr=0\relax + \ifnum#1<100\relax + \let\@@fc@ordstr#2\relax + \edef#2{\@@fc@ordstr\@unitthstring{\@strctr}}% + \fi + \else + \let\@@fc@ordstr#2\relax + \edef#2{\@@fc@ordstr\@unitthstring{\@strctr}}% + \fi + \else + \@modulo{\@strctr}{10}% + \let\@@fc@ordstr#2\relax + \edef#2{\@@fc@ordstr\@teenthstring{\@strctr}}% + \fi \fi } % \end{macrocode} @@ -1744,17 +2200,41 @@ this number}% %<*fc-portuges.def> % \end{macrocode} %\fi -% Portuguse +% \subsection{fc-portuges.def} +% Portuguse definitions % \begin{macrocode} -\ProvidesFile{fc-portuges.def}[2005/04/29] +\ProvidesFile{fc-portuges.def}[2007/04/20] % \end{macrocode} +% Define macro that converts a number or count register (first +% argument) to an ordinal, and stores the result in the second +% argument, which should be a control sequence. Masculine: % \begin{macrocode} -\newcommand{\@@unitstringportuges}[1]{% +\newcommand*{\@ordinalMportuges}[2]{% +\ifnum#1=0\relax + \edef#2{\number#1}% +\else + \edef#2{\number#1\relax\noexpand\fmtord{o}}% +\fi} +% \end{macrocode} +% Feminine: +% \begin{macrocode} +\newcommand*{\@ordinalFportuges}[2]{% +\ifnum#1=0\relax + \edef#2{\number#1}% +\else + \edef#2{\number#1\relax\noexpand\fmtord{a}}% +\fi} +% \end{macrocode} +% Convert a number to a textual representation. To make it easier, +% split it up into units, tens, teens and hundreds. Units (argument must +% be a number from 0 to 9): +% \begin{macrocode} +\newcommand*{\@@unitstringportuges}[1]{% \ifcase#1\relax zero% \or um% \or dois% -\or tr\`es% +\or tr\^es% \or quatro% \or cinco% \or seis% @@ -1763,13 +2243,15 @@ zero% \or nove% \fi } - -\newcommand{\@@unitstringFportuges}[1]{% +% \end{macrocode} +% As above, but for feminine: +% \begin{macrocode} +\newcommand*{\@@unitstringFportuges}[1]{% \ifcase#1\relax zero% \or uma% \or duas% -\or tr\`es% +\or tr\^es% \or quatro% \or cinco% \or seis% @@ -1778,8 +2260,10 @@ zero% \or nove% \fi } - -\newcommand{\@@tenstringportuges}[1]{% +% \end{macrocode} +% Tens (argument must be a number from 0 to 10): +% \begin{macrocode} +\newcommand*{\@@tenstringportuges}[1]{% \ifcase#1\relax \or dez% \or vinte% @@ -1793,8 +2277,10 @@ zero% \or cem% \fi } - -\newcommand{\@@teenstringportuges}[1]{% +% \end{macrocode} +% Teens (argument must be a number from 0 to 9): +% \begin{macrocode} +\newcommand*{\@@teenstringportuges}[1]{% \ifcase#1\relax dez% \or onze% @@ -1808,8 +2294,10 @@ dez% \or dezenove% \fi } - -\newcommand{\@@hundredstringportuges}[1]{% +% \end{macrocode} +% Hundreds: +% \begin{macrocode} +\newcommand*{\@@hundredstringportuges}[1]{% \ifcase#1\relax \or cento% \or duzentos% @@ -1821,10 +2309,12 @@ dez% \or oitocentos% \or novecentos% \fi} - -\newcommand{\@@hundredstringFportuges}[1]{% +% \end{macrocode} +% Hundreds (feminine): +% \begin{macrocode} +\newcommand*{\@@hundredstringFportuges}[1]{% \ifcase#1\relax -\or centa% +\or cento% \or duzentas% \or trezentas% \or quatrocentas% @@ -1834,13 +2324,15 @@ dez% \or oitocentas% \or novecentas% \fi} - -\newcommand{\@@Unitstringportuges}[1]{% +% \end{macrocode} +% Units (initial letter in upper case): +% \begin{macrocode} +\newcommand*{\@@Unitstringportuges}[1]{% \ifcase#1\relax Zero% \or Um% \or Dois% -\or Tr\`es% +\or Tr\^es% \or Quatro% \or Cinco% \or Seis% @@ -1849,13 +2341,15 @@ Zero% \or Nove% \fi } - -\newcommand{\@@UnitstringFportuges}[1]{% +% \end{macrocode} +% As above, but feminine: +% \begin{macrocode} +\newcommand*{\@@UnitstringFportuges}[1]{% \ifcase#1\relax Zera% \or Uma% \or Duas% -\or Tr\`es% +\or Tr\^es% \or Quatro% \or Cinco% \or Seis% @@ -1864,8 +2358,10 @@ Zera% \or Nove% \fi } - -\newcommand{\@@Tenstringportuges}[1]{% +% \end{macrocode} +% Tens (with initial letter in upper case): +% \begin{macrocode} +\newcommand*{\@@Tenstringportuges}[1]{% \ifcase#1\relax \or Dez% \or Vinte% @@ -1879,8 +2375,10 @@ Zera% \or Cem% \fi } - -\newcommand{\@@Teenstringportuges}[1]{% +% \end{macrocode} +% Teens (with initial letter in upper case): +% \begin{macrocode} +\newcommand*{\@@Teenstringportuges}[1]{% \ifcase#1\relax Dez% \or Onze% @@ -1894,8 +2392,10 @@ Dez% \or Dezenove% \fi } - -\newcommand{\@@Hundredstringportuges}[1]{% +% \end{macrocode} +% Hundreds (with initial letter in upper case): +% \begin{macrocode} +\newcommand*{\@@Hundredstringportuges}[1]{% \ifcase#1\relax \or Cento% \or Duzentos% @@ -1907,10 +2407,12 @@ Dez% \or Oitocentos% \or Novecentos% \fi} - -\newcommand{\@@HundredstringFportuges}[1]{% +% \end{macrocode} +% As above, but feminine: +% \begin{macrocode} +\newcommand*{\@@HundredstringFportuges}[1]{% \ifcase#1\relax -\or Centa% +\or Cento% \or Duzentas% \or Trezentas% \or Quatrocentas% @@ -1920,85 +2422,103 @@ Dez% \or Oitocentas% \or Novecentas% \fi} - -\newcommand{\@numberstringMportuges}[1]{% +% \end{macrocode} +% This has changed in version 1.08, so that it now stores +% the result in the second argument, but doesn't display +% anything. Since it only affects internal macros, it shouldn't +% affect documents created with older versions. (These internal +% macros are not meant for use in documents.) +% \begin{macrocode} +\DeclareRobustCommand{\@numberstringMportuges}[2]{% \let\@unitstring=\@@unitstringportuges \let\@teenstring=\@@teenstringportuges \let\@tenstring=\@@tenstringportuges \let\@hundredstring=\@@hundredstringportuges \def\@hundred{cem}\def\@thousand{mil}% \def\@andname{e}% -\@@numberstringportuges{#1}} - -\newcommand{\@numberstringFportuges}[1]{% +\@@numberstringportuges{#1}{#2}} +% \end{macrocode} +% As above, but feminine form: +% \begin{macrocode} +\DeclareRobustCommand{\@numberstringFportuges}[2]{% \let\@unitstring=\@@unitstringFportuges \let\@teenstring=\@@teenstringportuges \let\@tenstring=\@@tenstringportuges \let\@hundredstring=\@@hundredstringFportuges \def\@hundred{cem}\def\@thousand{mil}% \def\@andname{e}% -\@@numberstringportuges{#1}} - -\newcommand{\@NumberstringMportuges}[1]{% +\@@numberstringportuges{#1}{#2}} +% \end{macrocode} +% As above, but initial letters in upper case: +% \begin{macrocode} +\DeclareRobustCommand{\@NumberstringMportuges}[2]{% \let\@unitstring=\@@Unitstringportuges \let\@teenstring=\@@Teenstringportuges \let\@tenstring=\@@Tenstringportuges \let\@hundredstring=\@@Hundredstringportuges \def\@hundred{Cem}\def\@thousand{Mil}% \def\@andname{e}% -\@@numberstringportuges{#1}} - -\newcommand{\@NumberstringFportuges}[1]{% +\@@numberstringportuges{#1}{#2}} +% \end{macrocode} +% As above, but feminine form: +% \begin{macrocode} +\DeclareRobustCommand{\@NumberstringFportuges}[2]{% \let\@unitstring=\@@UnitstringFportuges \let\@teenstring=\@@Teenstringportuges \let\@tenstring=\@@Tenstringportuges \let\@hundredstring=\@@HundredstringFportuges \def\@hundred{Cem}\def\@thousand{Mil}% \def\@andname{e}% -\@@numberstringportuges{#1}} - -\newcommand{\@ordinalstringMportuges}[1]{% +\@@numberstringportuges{#1}{#2}} +% \end{macrocode} +% As above, but for ordinals. +% \begin{macrocode} +\DeclareRobustCommand{\@ordinalstringMportuges}[2]{% \let\@unitthstring=\@@unitthstringportuges \let\@unitstring=\@@unitstringportuges \let\@teenthstring=\@@teenthstringportuges \let\@tenthstring=\@@tenthstringportuges \let\@hundredthstring=\@@hundredthstringportuges \def\@thousandth{mil\'esimo}% -\@@ordinalstringportuges{#1}} - -\newcommand{\@ordinalstringFportuges}[1]{% +\@@ordinalstringportuges{#1}{#2}} +% \end{macrocode} +% Feminine form: +% \begin{macrocode} +\DeclareRobustCommand{\@ordinalstringFportuges}[2]{% \let\@unitthstring=\@@unitthstringFportuges \let\@unitstring=\@@unitstringFportuges \let\@teenthstring=\@@teenthstringportuges \let\@tenthstring=\@@tenthstringFportuges \let\@hundredthstring=\@@hundredthstringFportuges \def\@thousandth{mil\'esima}% -\@@ordinalstringportuges{#1}} - -\newcommand{\@OrdinalstringMportuges}[1]{% +\@@ordinalstringportuges{#1}{#2}} +% \end{macrocode} +% As above, but initial letters in upper case (masculine): +% \begin{macrocode} +\DeclareRobustCommand{\@OrdinalstringMportuges}[2]{% \let\@unitthstring=\@@Unitthstringportuges \let\@unitstring=\@@Unitstringportuges \let\@teenthstring=\@@teenthstringportuges \let\@tenthstring=\@@Tenthstringportuges \let\@hundredthstring=\@@Hundredthstringportuges \def\@thousandth{Mil\'esimo}% -\@@ordinalstringportuges{#1}} - -\newcommand{\@OrdinalstringFportuges}[1]{% +\@@ordinalstringportuges{#1}{#2}} +% \end{macrocode} +% Feminine form: +% \begin{macrocode} +\DeclareRobustCommand{\@OrdinalstringFportuges}[2]{% \let\@unitthstring=\@@UnitthstringFportuges \let\@unitstring=\@@UnitstringFportuges \let\@teenthstring=\@@teenthstringportuges \let\@tenthstring=\@@TenthstringFportuges \let\@hundredthstring=\@@HundredthstringFportuges \def\@thousandth{Mil\'esima}% -\@@ordinalstringportuges{#1}} - -\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]{% +\@@ordinalstringportuges{#1}{#2}} +% \end{macrocode} +% In order to do the ordinals, split into units, teens, tens +% and hundreds. Units: +% \begin{macrocode} +\newcommand*{\@@unitthstringportuges}[1]{% \ifcase#1\relax zero% \or primeiro% @@ -2012,8 +2532,10 @@ zero% \or nono% \fi } - -\newcommand{\@@tenthstringportuges}[1]{% +% \end{macrocode} +% Tens: +% \begin{macrocode} +\newcommand*{\@@tenthstringportuges}[1]{% \ifcase#1\relax \or d\'ecimo% \or vig\'esimo% @@ -2026,14 +2548,18 @@ zero% \or nonag\'esimo% \fi } - -\newcommand{\@@teenthstringportuges}[1]{% +% \end{macrocode} +% Teens: +% \begin{macrocode} +\newcommand*{\@@teenthstringportuges}[1]{% \@tenthstring{1}% \ifnum#1>0\relax -\@unitthstring{#1}% \fi} - -\newcommand{\@@hundredthstringportuges}[1]{% +% \end{macrocode} +% Hundreds: +% \begin{macrocode} +\newcommand*{\@@hundredthstringportuges}[1]{% \ifcase#1\relax \or cent\'esimo% \or ducent\'esimo% @@ -2045,8 +2571,10 @@ zero% \or octingent\'esimo% \or nongent\'esimo% \fi} - -\newcommand{\@@unitthstringFportuges}[1]{% +% \end{macrocode} +% Units (feminine): +% \begin{macrocode} +\newcommand*{\@@unitthstringFportuges}[1]{% \ifcase#1\relax zero% \or primeira% @@ -2060,8 +2588,10 @@ zero% \or nona% \fi } - -\newcommand{\@@tenthstringFportuges}[1]{% +% \end{macrocode} +% Tens (feminine): +% \begin{macrocode} +\newcommand*{\@@tenthstringFportuges}[1]{% \ifcase#1\relax \or d\'ecima% \or vig\'esima% @@ -2074,8 +2604,10 @@ zero% \or nonag\'esima% \fi } - -\newcommand{\@@hundredthstringFportuges}[1]{% +% \end{macrocode} +% Hundreds (feminine): +% \begin{macrocode} +\newcommand*{\@@hundredthstringFportuges}[1]{% \ifcase#1\relax \or cent\'esima% \or ducent\'esima% @@ -2087,8 +2619,10 @@ zero% \or octingent\'esima% \or nongent\'esima% \fi} - -\newcommand{\@@Unitthstringportuges}[1]{% +% \end{macrocode} +% As above, but with initial letter in upper case. Units: +% \begin{macrocode} +\newcommand*{\@@Unitthstringportuges}[1]{% \ifcase#1\relax Zero% \or Primeiro% @@ -2102,8 +2636,10 @@ Zero% \or Nono% \fi } - -\newcommand{\@@Tenthstringportuges}[1]{% +% \end{macrocode} +% Tens: +% \begin{macrocode} +\newcommand*{\@@Tenthstringportuges}[1]{% \ifcase#1\relax \or D\'ecimo% \or Vig\'esimo% @@ -2116,8 +2652,10 @@ Zero% \or Nonag\'esimo% \fi } - -\newcommand{\@@Hundredthstringportuges}[1]{% +% \end{macrocode} +% Hundreds: +% \begin{macrocode} +\newcommand*{\@@Hundredthstringportuges}[1]{% \ifcase#1\relax \or Cent\'esimo% \or Ducent\'esimo% @@ -2129,8 +2667,10 @@ Zero% \or Octingent\'esimo% \or Nongent\'esimo% \fi} - -\newcommand{\@@UnitthstringFportuges}[1]{% +% \end{macrocode} +% As above, but feminine. Units: +% \begin{macrocode} +\newcommand*{\@@UnitthstringFportuges}[1]{% \ifcase#1\relax Zera% \or Primeira% @@ -2144,8 +2684,10 @@ Zera% \or Nona% \fi } - -\newcommand{\@@TenthstringFportuges}[1]{% +% \end{macrocode} +% Tens (feminine); +% \begin{macrocode} +\newcommand*{\@@TenthstringFportuges}[1]{% \ifcase#1\relax \or D\'ecima% \or Vig\'esima% @@ -2158,8 +2700,10 @@ Zera% \or Nonag\'esima% \fi } - -\newcommand{\@@HundredthstringFportuges}[1]{% +% \end{macrocode} +% Hundreds (feminine): +% \begin{macrocode} +\newcommand*{\@@HundredthstringFportuges}[1]{% \ifcase#1\relax \or Cent\'esima% \or Ducent\'esima% @@ -2172,8 +2716,13 @@ Zera% \or Nongent\'esima% \fi} % \end{macrocode} +% This has changed in version 1.09, so that it now stores +% the result in the second argument (a control sequence), but it +% doesn't display anything. Since it only affects internal macros, +% it shouldn't affect documents created with older versions. +% (These internal macros are not meant for use in documents.) % \begin{macrocode} -\newcommand{\@@numberstringportuges}[1]{% +\newcommand*{\@@numberstringportuges}[2]{% \ifnum#1>99999 \PackageError{fmtcount}{Out of range}% {This macro only works for values less than 100000}% @@ -2185,66 +2734,106 @@ you can try typing "minus" first, and then pass the modulus of this number}% \fi \fi +\def#2{}% \@strctr=#1\relax \divide\@strctr by 1000\relax \ifnum\@strctr>9 % #1 is greater or equal to 10000 \divide\@strctr by 10 - \ifnum\@strctr>1 - \@tenstring{\@strctr}% + \ifnum\@strctr>1\relax + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr\@tenstring{\@strctr}}% \@strctr=#1 \divide\@strctr by 1000\relax \@modulo{\@strctr}{10}% \ifnum\@strctr>0 - \ifnum\@strctr=1\ \@andname\fi - \ \@unitstring{\@strctr}% + \ifnum\@strctr=1\relax + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr\ \@andname}% + \fi + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr\ \@unitstring{\@strctr}}% \fi \else \@strctr=#1\relax \divide\@strctr by 1000\relax \@modulo{\@strctr}{10}% - \@teenstring{\@strctr}% + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr\@teenstring{\@strctr}}% \fi - \ \@thousand% + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr\ \@thousand}% \else - \ifnum\@strctr>0 - \ifnum\@strctr>1\@unitstring{\@strctr}\ \fi - \@thousand + \ifnum\@strctr>0\relax + \ifnum\@strctr>1\relax + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr\@unitstring{\@strctr}\ }% + \fi + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr\@thousand}% \fi \fi \@strctr=#1\relax \@modulo{\@strctr}{1000}% -\divide\@strctr by 100 -\ifnum\@strctr>0 -\ifnum#1>1000 \ \fi -\@tmpstrctr=#1\relax -\@modulo{\@tmpstrctr}{1000}% -\ifnum\@tmpstrctr=100\@tenstring{10}\else\@hundredstring{\@strctr}\fi% +\divide\@strctr by 100\relax +\ifnum\@strctr>0\relax + \ifnum#1>1000 \relax + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr\ }% + \fi + \@tmpstrctr=#1\relax + \@modulo{\@tmpstrctr}{1000}% + \let\@@fc@numstr#2\relax + \ifnum\@tmpstrctr=100\relax + \edef#2{\@@fc@numstr\@tenstring{10}}% + \else + \edef#2{\@@fc@numstr\@hundredstring{\@strctr}}% + \fi% \fi \@strctr=#1\relax \@modulo{\@strctr}{100}% -\ifnum#1>100 \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}% +\ifnum#1>100\relax + \ifnum\@strctr>0\relax + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr\ \@andname\ }% + \fi \fi +\ifnum\@strctr>19\relax + \divide\@strctr by 10\relax + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr\@tenstring{\@strctr}}% + \@strctr=#1\relax \@modulo{\@strctr}{10}% + \ifnum\@strctr>0 + \ifnum\@strctr=1\relax + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr\ \@andname}% + \else + \ifnum#1>100\relax + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr\ \@andname}% + \fi + \fi + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr\ \@unitstring{\@strctr}}% + \fi \else -\ifnum\@strctr<10 -\ifnum\@strctr=0 -\ifnum#1<100 \@unitstring{\@strctr}\fi -\else%(>0,<10) -\@unitstring{\@strctr}% -\fi -\else%>10 -\@modulo{\@strctr}{10}% -\@teenstring{\@strctr}% -\fi + \ifnum\@strctr<10\relax + \ifnum\@strctr=0\relax + \ifnum#1<100\relax + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr\@unitstring{\@strctr}}% + \fi + \else%(>0,<10) + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr\@unitstring{\@strctr}}% + \fi + \else%>10 + \@modulo{\@strctr}{10}% + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr\@teenstring{\@strctr}}% + \fi \fi } - % \end{macrocode} +% As above, but for ordinals. % \begin{macrocode} -\newcommand{\@@ordinalstringportuges}[1]{% +\newcommand*{\@@ordinalstringportuges}[2]{% \@strctr=#1\relax \ifnum#1>99999 \PackageError{fmtcount}{Out of range}% @@ -2256,6 +2845,7 @@ this number}% you can try typing "minus" first, and then pass the modulus of this number}% \else +\def#2{}% \ifnum\@strctr>999\relax \divide\@strctr by 1000\relax \ifnum\@strctr>1\relax @@ -2263,43 +2853,67 @@ this number}% \@tmpstrctr=\@strctr \ifnum\@strctr<20 \@modulo{\@tmpstrctr}{10}% - \@teenthstring{\@tmpstrctr} + \let\@@fc@ordstr#2\relax + \edef#2{\@@fc@ordstr\@teenthstring{\@tmpstrctr}}% \else \divide\@tmpstrctr by 10\relax - \@tenthstring{\@tmpstrctr} + \let\@@fc@ordstr#2\relax + \edef#2{\@@fc@ordstr\@tenthstring{\@tmpstrctr}}% \@tmpstrctr=\@strctr \@modulo{\@tmpstrctr}{10}% - \ifnum\@tmpstrctr>0\@unitthstring{\@tmpstrctr} \fi + \ifnum\@tmpstrctr>0\relax + \let\@@fc@ordstr#2\relax + \edef#2{\@@fc@ordstr\@unitthstring{\@tmpstrctr}}% + \fi \fi \else - \@unitstring{\@strctr} + \let\@@fc@ordstr#2\relax + \edef#2{\@@fc@ordstr\@unitstring{\@strctr}}% \fi \fi - \@thousandth + \let\@@fc@ordstr#2\relax + \edef#2{\@@fc@ordstr\@thousandth}% \fi \@strctr=#1\relax \@modulo{\@strctr}{1000}% \ifnum\@strctr>99\relax -\@tmpstrctr=\@strctr -\divide\@tmpstrctr by 100\relax -\ifnum#1>1000-\fi -\@hundredthstring{\@tmpstrctr}% + \@tmpstrctr=\@strctr + \divide\@tmpstrctr by 100\relax + \ifnum#1>1000\relax + \let\@@fc@ordstr#2\relax + \edef#2{\@@fc@ordstr-}% + \fi + \let\@@fc@ordstr#2\relax + \edef#2{\@@fc@ordstr\@hundredthstring{\@tmpstrctr}}% \fi \@modulo{\@strctr}{100}% -\ifnum#1>99\ifnum\@strctr>0-\fi\fi +\ifnum#1>99\relax + \ifnum\@strctr>0\relax + \let\@@fc@ordstr#2\relax + \edef#2{\@@fc@ordstr-}% + \fi +\fi \ifnum\@strctr>9\relax -\@tmpstrctr=\@strctr -\divide\@tmpstrctr by 10\relax -\@tenthstring{\@tmpstrctr}% -\@tmpstrctr=\@strctr -\@modulo{\@tmpstrctr}{10}% -\ifnum\@tmpstrctr>0-\@unitthstring{\@tmpstrctr}\fi -\else -\ifnum\@strctr=0\relax -\ifnum#1=0\@unitstring{0}\fi + \@tmpstrctr=\@strctr + \divide\@tmpstrctr by 10\relax + \let\@@fc@ordstr#2\relax + \edef#2{\@@fc@ordstr\@tenthstring{\@tmpstrctr}}% + \@tmpstrctr=\@strctr + \@modulo{\@tmpstrctr}{10}% + \ifnum\@tmpstrctr>0\relax + \let\@@fc@ordstr#2\relax + \edef#2{\@@fc@ordstr-\@unitthstring{\@tmpstrctr}}% + \fi \else -\@unitthstring{\@strctr}% -\fi + \ifnum\@strctr=0\relax + \ifnum#1=0\relax + \let\@@fc@ordstr#2\relax + \edef#2{\@@fc@ordstr\@unitstring{0}}% + \fi + \else + \let\@@fc@ordstr#2\relax + \edef#2{\@@fc@ordstr\@unitthstring{\@strctr}}% + \fi \fi \fi \fi @@ -2315,10 +2929,27 @@ this number}% %<*fc-spanish.def> % \end{macrocode} %\fi -% Spanish +% \subsection{fc-spanish.def} +% Spanish definitions % \begin{macrocode} -\ProvidesFile{fc-spanish.def}[2005/04/29] +\ProvidesFile{fc-spanish.def}[2007/04/20] % \end{macrocode} +% Define macro that converts a number or count register (first +% argument) to an ordinal, and stores the result in the +% second argument, which must be a control sequence. +% Masculine: +% \begin{macrocode} +\newcommand{\@ordinalMspanish}[2]{% +\edef#2{\number#1\relax\noexpand\fmtord{o}}} +% \end{macrocode} +% Feminine: +% \begin{macrocode} +\newcommand{\@ordinalFspanish}[2]{% +\edef#2{\number#1\relax\noexpand\fmtord{a}}} +% \end{macrocode} +% Convert a number to text. The easiest way to do this is to +% break it up into units, tens, teens, twenties and hundreds. +% Units (argument must be a number from 0 to 9): % \begin{macrocode} \newcommand{\@@unitstringspanish}[1]{% \ifcase#1\relax @@ -2334,7 +2965,9 @@ cero% \or nueve% \fi } - +% \end{macrocode} +% Feminine: +% \begin{macrocode} \newcommand{\@@unitstringFspanish}[1]{% \ifcase#1\relax cera% @@ -2349,7 +2982,9 @@ cera% \or nueve% \fi } - +% \end{macrocode} +% Tens (argument must go from 1 to 10): +% \begin{macrocode} \newcommand{\@@tenstringspanish}[1]{% \ifcase#1\relax \or diez% @@ -2364,7 +2999,9 @@ cera% \or cien% \fi } - +% \end{macrocode} +% Teens: +% \begin{macrocode} \newcommand{\@@teenstringspanish}[1]{% \ifcase#1\relax diez% @@ -2379,7 +3016,9 @@ diez% \or diecinueve% \fi } - +% \end{macrocode} +% Twenties: +% \begin{macrocode} \newcommand{\@@twentystringspanish}[1]{% \ifcase#1\relax veinte% @@ -2393,7 +3032,9 @@ veinte% \or veintiocho% \or veintinueve% \fi} - +% \end{macrocode} +% Feminine form: +% \begin{macrocode} \newcommand{\@@twentystringFspanish}[1]{% \ifcase#1\relax veinte% @@ -2407,7 +3048,9 @@ veinte% \or veintiocho% \or veintinueve% \fi} - +% \end{macrocode} +% Hundreds: +% \begin{macrocode} \newcommand{\@@hundredstringspanish}[1]{% \ifcase#1\relax \or ciento% @@ -2420,7 +3063,9 @@ veinte% \or ochocientos% \or novecientos% \fi} - +% \end{macrocode} +% Feminine form: +% \begin{macrocode} \newcommand{\@@hundredstringFspanish}[1]{% \ifcase#1\relax \or cienta% @@ -2433,7 +3078,9 @@ veinte% \or ochocientas% \or novecientas% \fi} - +% \end{macrocode} +% As above, but with initial letter uppercase: +% \begin{macrocode} \newcommand{\@@Unitstringspanish}[1]{% \ifcase#1\relax Cero% @@ -2448,7 +3095,9 @@ Cero% \or Nueve% \fi } - +% \end{macrocode} +% Feminine form: +% \begin{macrocode} \newcommand{\@@UnitstringFspanish}[1]{% \ifcase#1\relax Cera% @@ -2463,7 +3112,9 @@ Cera% \or Nueve% \fi } - +% \end{macrocode} +% Tens: +% \begin{macrocode} \newcommand{\@@Tenstringspanish}[1]{% \ifcase#1\relax \or Diez% @@ -2478,7 +3129,9 @@ Cera% \or Cien% \fi } - +% \end{macrocode} +% Teens: +% \begin{macrocode} \newcommand{\@@Teenstringspanish}[1]{% \ifcase#1\relax Diez% @@ -2493,7 +3146,9 @@ Diez% \or Diecinueve% \fi } - +% \end{macrocode} +% Twenties: +% \begin{macrocode} \newcommand{\@@Twentystringspanish}[1]{% \ifcase#1\relax Veinte% @@ -2507,7 +3162,9 @@ Veinte% \or Veintiocho% \or Veintinueve% \fi} - +% \end{macrocode} +% Feminine form: +% \begin{macrocode} \newcommand{\@@TwentystringFspanish}[1]{% \ifcase#1\relax Veinte% @@ -2521,7 +3178,9 @@ Veinte% \or Veintiocho% \or Veintinueve% \fi} - +% \end{macrocode} +% Hundreds: +% \begin{macrocode} \newcommand{\@@Hundredstringspanish}[1]{% \ifcase#1\relax \or Ciento% @@ -2534,7 +3193,9 @@ Veinte% \or Ochocientos% \or Novecientos% \fi} - +% \end{macrocode} +% Feminine form: +% \begin{macrocode} \newcommand{\@@HundredstringFspanish}[1]{% \ifcase#1\relax \or Cienta% @@ -2547,8 +3208,14 @@ Veinte% \or Ochocientas% \or Novecientas% \fi} - -\newcommand{\@numberstringMspanish}[1]{% +% \end{macrocode} +% This has changed in version 1.09, so that it now stores the +% result in the second argument, but doesn't display anything. +% Since it only affects internal macros, it shouldn't affect +% documents created with older versions. (These internal macros +% are not meant for use in documents.) +% \begin{macrocode} +\DeclareRobustCommand{\@numberstringMspanish}[2]{% \let\@unitstring=\@@unitstringspanish \let\@teenstring=\@@teenstringspanish \let\@tenstring=\@@tenstringspanish @@ -2556,9 +3223,11 @@ Veinte% \let\@hundredstring=\@@hundredstringspanish \def\@hundred{cien}\def\@thousand{mil}% \def\@andname{y}% -\@@numberstringspanish{#1}} - -\newcommand{\@numberstringFspanish}[1]{% +\@@numberstringspanish{#1}{#2}} +% \end{macrocode} +% Feminine form: +% \begin{macrocode} +\DeclareRobustCommand{\@numberstringFspanish}[2]{% \let\@unitstring=\@@unitstringFspanish \let\@teenstring=\@@teenstringspanish \let\@tenstring=\@@tenstringspanish @@ -2566,9 +3235,11 @@ Veinte% \let\@hundredstring=\@@hundredstringFspanish \def\@hundred{cien}\def\@thousand{mil}% \def\@andname{y}% -\@@numberstringspanish{#1}} - -\newcommand{\@NumberstringMspanish}[1]{% +\@@numberstringspanish{#1}{#2}} +% \end{macrocode} +% As above, but initial letters in upper case: +% \begin{macrocode} +\DeclareRobustCommand{\@NumberstringMspanish}[2]{% \let\@unitstring=\@@Unitstringspanish \let\@teenstring=\@@Teenstringspanish \let\@tenstring=\@@Tenstringspanish @@ -2576,9 +3247,11 @@ Veinte% \let\@hundredstring=\@@Hundredstringspanish \def\@andname{y}% \def\@hundred{Cien}\def\@thousand{Mil}% -\@@numberstringspanish{#1}} - -\newcommand{\@NumberstringFspanish}[1]{% +\@@numberstringspanish{#1}{#2}} +% \end{macrocode} +% Feminine form: +% \begin{macrocode} +\DeclareRobustCommand{\@NumberstringFspanish}[2]{% \let\@unitstring=\@@UnitstringFspanish \let\@teenstring=\@@Teenstringspanish \let\@tenstring=\@@Tenstringspanish @@ -2586,47 +3259,56 @@ Veinte% \let\@hundredstring=\@@HundredstringFspanish \def\@andname{y}% \def\@hundred{Cien}\def\@thousand{Mil}% -\@@numberstringspanish{#1}} - -\newcommand{\@ordinalstringMspanish}[1]{% +\@@numberstringspanish{#1}{#2}} +% \end{macrocode} +% As above, but for ordinals. +% \begin{macrocode} +\DeclareRobustCommand{\@ordinalstringMspanish}[2]{% \let\@unitthstring=\@@unitthstringspanish \let\@unitstring=\@@unitstringspanish \let\@teenthstring=\@@teenthstringspanish \let\@tenthstring=\@@tenthstringspanish \let\@hundredthstring=\@@hundredthstringspanish \def\@thousandth{mil\'esimo}% -\@@ordinalstringspanish{#1}} - -\newcommand{\@ordinalstringFspanish}[1]{% +\@@ordinalstringspanish{#1}{#2}} +% \end{macrocode} +% Feminine form: +% \begin{macrocode} +\DeclareRobustCommand{\@ordinalstringFspanish}[2]{% \let\@unitthstring=\@@unitthstringFspanish \let\@unitstring=\@@unitstringFspanish \let\@teenthstring=\@@teenthstringFspanish \let\@tenthstring=\@@tenthstringFspanish \let\@hundredthstring=\@@hundredthstringFspanish \def\@thousandth{mil\'esima}% -\@@ordinalstringspanish{#1}} - -\newcommand{\@OrdinalstringMspanish}[1]{% +\@@ordinalstringspanish{#1}{#2}} +% \end{macrocode} +% As above, but with initial letters in upper case. +% \begin{macrocode} +\DeclareRobustCommand{\@OrdinalstringMspanish}[2]{% \let\@unitthstring=\@@Unitthstringspanish \let\@unitstring=\@@Unitstringspanish \let\@teenthstring=\@@Teenthstringspanish \let\@tenthstring=\@@Tenthstringspanish \let\@hundredthstring=\@@Hundredthstringspanish \def\@thousandth{Mil\'esimo}% -\@@ordinalstringspanish{#1}} - -\newcommand{\@OrdinalstringFspanish}[1]{% +\@@ordinalstringspanish{#1}{#2}} +% \end{macrocode} +% Feminine form: +% \begin{macrocode} +\DeclareRobustCommand{\@OrdinalstringFspanish}[2]{% \let\@unitthstring=\@@UnitthstringFspanish \let\@unitstring=\@@UnitstringFspanish \let\@teenthstring=\@@TeenthstringFspanish \let\@tenthstring=\@@TenthstringFspanish \let\@hundredthstring=\@@HundredthstringFspanish \def\@thousandth{Mil\'esima}% -\@@ordinalstringspanish{#1}} - -\newcommand{\@ordinalMspanish}[1]{#1\fmtord{o}} -\newcommand{\@ordinalFspanish}[1]{#1\fmtord{a}} - +\@@ordinalstringspanish{#1}{#2}} +% \end{macrocode} +% Code for convert numbers into textual ordinals. As before, +% it is easier to split it into units, tens, teens and hundreds. +% Units: +% \begin{macrocode} \newcommand{\@@unitthstringspanish}[1]{% \ifcase#1\relax cero% @@ -2641,7 +3323,9 @@ cero% \or noveno% \fi } - +% \end{macrocode} +% Tens: +% \begin{macrocode} \newcommand{\@@tenthstringspanish}[1]{% \ifcase#1\relax \or d\'ecimo% @@ -2655,7 +3339,9 @@ cero% \or nonag\'esimo% \fi } - +% \end{macrocode} +% Teens: +% \begin{macrocode} \newcommand{\@@teenthstringspanish}[1]{% \ifcase#1\relax d\'ecimo% @@ -2670,7 +3356,9 @@ d\'ecimo% \or decimonoveno% \fi } - +% \end{macrocode} +% Hundreds: +% \begin{macrocode} \newcommand{\@@hundredthstringspanish}[1]{% \ifcase#1\relax \or cent\'esimo% @@ -2683,7 +3371,9 @@ d\'ecimo% \or octingent\'esimo% \or noningent\'esimo% \fi} - +% \end{macrocode} +% Units (feminine): +% \begin{macrocode} \newcommand{\@@unitthstringFspanish}[1]{% \ifcase#1\relax cera% @@ -2698,7 +3388,9 @@ cera% \or novena% \fi } - +% \end{macrocode} +% Tens (feminine): +% \begin{macrocode} \newcommand{\@@tenthstringFspanish}[1]{% \ifcase#1\relax \or d\'ecima% @@ -2712,7 +3404,9 @@ cera% \or nonag\'esima% \fi } - +% \end{macrocode} +% Teens (feminine) +% \begin{macrocode} \newcommand{\@@teenthstringFspanish}[1]{% \ifcase#1\relax d\'ecima% @@ -2727,7 +3421,9 @@ d\'ecima% \or decimonovena% \fi } - +% \end{macrocode} +% Hundreds (feminine) +% \begin{macrocode} \newcommand{\@@hundredthstringFspanish}[1]{% \ifcase#1\relax \or cent\'esima% @@ -2740,7 +3436,9 @@ d\'ecima% \or octingent\'esima% \or noningent\'esima% \fi} - +% \end{macrocode} +% As above, but with initial letters in upper case +% \begin{macrocode} \newcommand{\@@Unitthstringspanish}[1]{% \ifcase#1\relax Cero% @@ -2755,7 +3453,9 @@ Cero% \or Noveno% \fi } - +% \end{macrocode} +% Tens: +% \begin{macrocode} \newcommand{\@@Tenthstringspanish}[1]{% \ifcase#1\relax \or D\'ecimo% @@ -2769,7 +3469,9 @@ Cero% \or Nonag\'esimo% \fi } - +% \end{macrocode} +% Teens: +% \begin{macrocode} \newcommand{\@@Teenthstringspanish}[1]{% \ifcase#1\relax D\'ecimo% @@ -2784,7 +3486,9 @@ D\'ecimo% \or Decimonoveno% \fi } - +% \end{macrocode} +% Hundreds +% \begin{macrocode} \newcommand{\@@Hundredthstringspanish}[1]{% \ifcase#1\relax \or Cent\'esimo% @@ -2797,7 +3501,9 @@ D\'ecimo% \or Octingent\'esimo% \or Noningent\'esimo% \fi} - +% \end{macrocode} +% As above, but feminine. +% \begin{macrocode} \newcommand{\@@UnitthstringFspanish}[1]{% \ifcase#1\relax Cera% @@ -2812,7 +3518,9 @@ Cera% \or Novena% \fi } - +% \end{macrocode} +% Tens (feminine) +% \begin{macrocode} \newcommand{\@@TenthstringFspanish}[1]{% \ifcase#1\relax \or D\'ecima% @@ -2826,7 +3534,9 @@ Cera% \or Nonag\'esima% \fi } - +% \end{macrocode} +% Teens (feminine): +% \begin{macrocode} \newcommand{\@@TeenthstringFspanish}[1]{% \ifcase#1\relax D\'ecima% @@ -2841,7 +3551,9 @@ D\'ecima% \or Decimonovena% \fi } - +% \end{macrocode} +% Hundreds (feminine): +% \begin{macrocode} \newcommand{\@@HundredthstringFspanish}[1]{% \ifcase#1\relax \or Cent\'esima% @@ -2856,8 +3568,14 @@ D\'ecima% \fi} % \end{macrocode} +% This has changed in version 1.09, so that it now stores the +% results in the second argument (which must be a control +% sequence), but it doesn't display anything. Since it only +% affects internal macros, it shouldn't affect documnets created +% with older versions. (These internal macros are not meant for +% use in documents.) % \begin{macrocode} -\newcommand{\@@numberstringspanish}[1]{% +\newcommand{\@@numberstringspanish}[2]{% \ifnum#1>99999 \PackageError{fmtcount}{Out of range}% {This macro only works for values less than 100000}% @@ -2869,67 +3587,100 @@ you can try typing "minus" first, and then pass the modulus of this number}% \fi \fi +\def#2{}% \@strctr=#1\relax \divide\@strctr by 1000\relax \ifnum\@strctr>9 % #1 is greater or equal to 10000 \divide\@strctr by 10 \ifnum\@strctr>1 - \@tenstring{\@strctr}% + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr\@tenstring{\@strctr}}% \@strctr=#1 \divide\@strctr by 1000\relax \@modulo{\@strctr}{10}% - \ifnum\@strctr>0\ \@andname\ \@unitstring{\@strctr}\fi + \ifnum\@strctr>0\relax + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr\ \@andname\ \@unitstring{\@strctr}}% + \fi \else \@strctr=#1\relax \divide\@strctr by 1000\relax \@modulo{\@strctr}{10}% - \@teenstring{\@strctr}% + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr\@teenstring{\@strctr}}% \fi - \ \@thousand% + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr\ \@thousand}% \else - \ifnum\@strctr>0 - \ifnum\@strctr>1\@unitstring{\@strctr}\ \fi - \@thousand + \ifnum\@strctr>0\relax + \ifnum\@strctr>1\relax + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr\@unitstring{\@strctr}\ }% + \fi + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr\@thousand}% \fi \fi \@strctr=#1\relax \@modulo{\@strctr}{1000}% -\divide\@strctr by 100 -\ifnum\@strctr>0 -\ifnum#1>1000\ \fi -\@tmpstrctr=#1\relax -\@modulo{\@tmpstrctr}{1000}% -\ifnum\@tmpstrctr=100\@tenstring{10}\else\@hundredstring{\@strctr}\fi% +\divide\@strctr by 100\relax +\ifnum\@strctr>0\relax + \ifnum#1>1000\relax + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr\ }% + \fi + \@tmpstrctr=#1\relax + \@modulo{\@tmpstrctr}{1000}% + \ifnum\@tmpstrctr=100\relax + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr\@tenstring{10}}% + \else + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr\@hundredstring{\@strctr}}% + \fi \fi \@strctr=#1\relax \@modulo{\@strctr}{100}% -\ifnum#1>100 \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}% +\ifnum#1>100\relax + \ifnum\@strctr>0\relax + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr\ \@andname\ }% + \fi \fi +\ifnum\@strctr>29\relax + \divide\@strctr by 10\relax + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr\@tenstring{\@strctr}}% + \@strctr=#1\relax \@modulo{\@strctr}{10}% + \ifnum\@strctr>0\relax + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr\ \@andname\ \@unitstring{\@strctr}}% + \fi \else -\ifnum\@strctr>19 -\@modulo{\@strctr}{10}% -\@twentystring{\@strctr}% -\else -\@modulo{\@strctr}{10}% -\@teenstring{\@strctr}% -\fi -\fi + \ifnum\@strctr<10\relax + \ifnum\@strctr=0\relax + \ifnum#1<100\relax + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr\@unitstring{\@strctr}}% + \fi + \else + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr\@unitstring{\@strctr}}% + \fi + \else + \ifnum\@strctr>19\relax + \@modulo{\@strctr}{10}% + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr\@twentystring{\@strctr}}% + \else + \@modulo{\@strctr}{10}% + \let\@@fc@numstr#2\relax + \edef#2{\@@fc@numstr\@teenstring{\@strctr}}% + \fi + \fi \fi } - % \end{macrocode} +% As above, but for ordinals % \begin{macrocode} -\newcommand{\@@ordinalstringspanish}[1]{% +\newcommand{\@@ordinalstringspanish}[2]{% \@strctr=#1\relax \ifnum#1>99999 \PackageError{fmtcount}{Out of range}% @@ -2941,6 +3692,7 @@ this number}% you can try typing "minus" first, and then pass the modulus of this number}% \else +\def#2{}% \ifnum\@strctr>999\relax \divide\@strctr by 1000\relax \ifnum\@strctr>1\relax @@ -2948,48 +3700,73 @@ this number}% \@tmpstrctr=\@strctr \ifnum\@strctr<20 \@modulo{\@tmpstrctr}{10}% - \@teenthstring{\@tmpstrctr} + \let\@@fc@ordstr#2\relax + \edef#2{\@@fc@ordstr\@teenthstring{\@tmpstrctr}}% \else \divide\@tmpstrctr by 10\relax - \@tenthstring{\@tmpstrctr} + \let\@@fc@ordstr#2\relax + \edef#2{\@@fc@ordstr\@tenthstring{\@tmpstrctr}}% \@tmpstrctr=\@strctr \@modulo{\@tmpstrctr}{10}% - \ifnum\@tmpstrctr>0\@unitthstring{\@tmpstrctr} \fi + \ifnum\@tmpstrctr>0\relax + \let\@@fc@ordstr#2\relax + \edef#2{\@@fc@ordstr\@unitthstring{\@tmpstrctr}}% + \fi \fi \else - \@unitstring{\@strctr} + \let\@@fc@ordstr#2\relax + \edef#2{\@@fc@ordstr\@unitstring{\@strctr}}% \fi \fi - \@thousandth + \let\@@fc@ordstr#2\relax + \edef#2{\@@fc@ordstr\@thousandth}% \fi \@strctr=#1\relax \@modulo{\@strctr}{1000}% \ifnum\@strctr>99\relax -\@tmpstrctr=\@strctr -\divide\@tmpstrctr by 100\relax -\ifnum#1>1000\ \fi -\@hundredthstring{\@tmpstrctr}% + \@tmpstrctr=\@strctr + \divide\@tmpstrctr by 100\relax + \ifnum#1>1000\relax + \let\@@fc@ordstr#2\relax + \edef#2{\@@fc@ordstr\ }% + \fi + \let\@@fc@ordstr#2\relax + \edef#2{\@@fc@ordstr\@hundredthstring{\@tmpstrctr}}% \fi \@modulo{\@strctr}{100}% -\ifnum#1>99\ifnum\@strctr>0\ \fi\fi +\ifnum#1>99\relax + \ifnum\@strctr>0\relax + \let\@@fc@ordstr#2\relax + \edef#2{\@@fc@ordstr\ }% + \fi +\fi \ifnum\@strctr>19\relax -\@tmpstrctr=\@strctr -\divide\@tmpstrctr by 10\relax -\@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 + \@tmpstrctr=\@strctr + \divide\@tmpstrctr by 10\relax + \let\@@fc@ordstr#2\relax + \edef#2{\@@fc@ordstr\@tenthstring{\@tmpstrctr}}% + \@tmpstrctr=\@strctr + \@modulo{\@tmpstrctr}{10}% + \ifnum\@tmpstrctr>0\relax + \let\@@fc@ordstr#2\relax + \edef#2{\@@fc@ordstr\ \@unitthstring{\@tmpstrctr}}% + \fi \else -\@unitthstring{\@strctr}% -\fi -\fi + \ifnum\@strctr>9\relax + \@modulo{\@strctr}{10}% + \let\@@fc@ordstr#2\relax + \edef#2{\@@fc@ordstr\@teenthstring{\@strctr}}% + \else + \ifnum\@strctr=0\relax + \ifnum#1=0\relax + \let\@@fc@ordstr#2\relax + \edef#2{\@@fc@ordstr\@unitstring{0}}% + \fi + \else + \let\@@fc@ordstr#2\relax + \edef#2{\@@fc@ordstr\@unitthstring{\@strctr}}% + \fi + \fi \fi \fi \fi @@ -3009,7 +3786,7 @@ this number}% % This section deals with the code for |fmtcount.sty| % \begin{macrocode} \NeedsTeXFormat{LaTeX2e} -\ProvidesPackage{fmtcount}[2007/01/06 v1.06] +\ProvidesPackage{fmtcount}[2007/04/20 v1.09] \RequirePackage{ifthen} \RequirePackage{keyval} % \end{macrocode} @@ -3230,9 +4007,9 @@ or `user'}}} \@@hexadecimal\@DT@X} \let\hexadecimalnum=\@hexadecimal -% \begin{macrocode} -% Uppercase hexadecimal % \end{macrocode} +% Uppercase hexadecimal +% \begin{macrocode} \newcommand{\@@Hexadecimal}[1]{\ifcase#10\or1\or2\or3\or4\or5\or6\or 7\or8\or9\or A\or B\or C\or D\or E\or F\fi} @@ -3397,7 +4174,7 @@ or `user'}}} \expandafter\protect\expandafter\ordinalnum{% \expandafter\the\csname c@#1\endcsname}} % \end{macrocode} -% If \verb"\ordinal" isn't defined make "\ordinal" a synonym +% If \verb"\ordinal" isn't defined make \verb"\ordinal" a synonym % for \verb"\FCordinal" to maintain compatibility with previous % versions. % \begin{macrocode} @@ -3405,87 +4182,397 @@ or `user'}}} \PackageWarning{fmtcount}{\string\ordinal \space already defined use \string\FCordinal \space instead.}} % \end{macrocode} +% Display ordinal where value is given as a number or +% count register instead of a counter: % \begin{macrocode} \newcommand{\ordinalnum}[1]{\@ifnextchar[{\@ordinalnum{#1}}{% \@ordinalnum{#1}[m]}} - -\def\@ordinalnum#1[#2]{% +% \end{macrocode} +% Display ordinal according to gender: +% \begin{macrocode} +\def\@ordinalnum#1[#2]{{% \ifthenelse{\equal{#2}{f}}{% -\protect\@ordinalF{#1}}{% +\protect\@ordinalF{#1}{\@fc@ordstr}}{% \ifthenelse{\equal{#2}{m}}{}{% \PackageError{fmtcount}{Invalid gender option `#2'}{% Available options are m or f}}% -\protect\@ordinalM{#1}}} - +\protect\@ordinalM{#1}{\@fc@ordstr}}\@fc@ordstr}} +% \end{macrocode} +% Store the ordinal (first argument +% is identifying name, second argument is a counter.) +% \begin{macrocode} +\newcommand*{\storeordinal}[2]{% +\expandafter\protect\expandafter\storeordinalnum{#1}{% +\expandafter\the\csname c@#2\endcsname}} +% \end{macrocode} +% Store ordinal (first argument +% is identifying name, second argument is a number or +% count register.) +% \begin{macrocode} +\newcommand*{\storeordinalnum}[2]{% +\@ifnextchar[{\@storeordinalnum{#1}{#2}}{% +\@storeordinalnum{#1}{#2}[m]}} +% \end{macrocode} +% Store ordinal according to gender: +% \begin{macrocode} +\def\@storeordinalnum#1#2[#3]{% +\ifthenelse{\equal{#3}{f}}{% +\protect\@ordinalF{#2}{\@fc@ord}}{% +\ifthenelse{\equal{#3}{m}}{}{% +\PackageError{fmtcount}{Invalid gender option `#3'}{% +Available options are m or f}}% +\protect\@ordinalM{#2}{\@fc@ord}}% +\expandafter\let\csname @fcs@#1\endcsname\@fc@ord} +% \end{macrocode} +% Get stored information: +% \begin{macrocode} +\newcommand*{\FMCuse}[1]{\csname @fcs@#1\endcsname} +% \end{macrocode} +% Display ordinal as a string (argument is a counter) +% \begin{macrocode} \newcommand{\ordinalstring}[1]{% \expandafter\protect\expandafter\ordinalstringnum{% \expandafter\the\csname c@#1\endcsname}} - +% \end{macrocode} +% Display ordinal as a string (argument is a count register or +% number.) +% \begin{macrocode} \newcommand{\ordinalstringnum}[1]{% \@ifnextchar[{\@ordinal@string{#1}}{\@ordinal@string{#1}[m]}} - -\def\@ordinal@string#1[#2]{% +% \end{macrocode} +% Display ordinal as a string according to gender. +% \begin{macrocode} +\def\@ordinal@string#1[#2]{{% \ifthenelse{\equal{#2}{f}}{% -\protect\@ordinalstringF{#1}}{% +\protect\@ordinalstringF{#1}{\@fc@ordstr}}{% \ifthenelse{\equal{#2}{m}}{}{% \PackageError{fmtcount}{Invalid gender option `#2' to \string\ordinalstring}{Available options are m or f}}% -\protect\@ordinalstringM{#1}}} - +\protect\@ordinalstringM{#1}{\@fc@ordstr}}\@fc@ordstr}} +% \end{macrocode} +% Store textual representation of number. First argument is +% identifying name, second argument is the counter set to the +% required number. +% \begin{macrocode} +\newcommand{\storeordinalstring}[2]{% +\expandafter\protect\expandafter\storeordinalstringnum{#1}{% +\expandafter\the\csname c@#2\endcsname}} +% \end{macrocode} +% Store textual representation of number. First argument is +% identifying name, second argument is a count register or number. +% \begin{macrocode} +\newcommand{\storeordinalstringnum}[2]{% +\@ifnextchar[{\@store@ordinal@string{#1}{#2}}{% +\@store@ordinal@string{#1}{#2}[m]}} +% \end{macrocode} +% Store textual representation of number according to gender. +% \begin{macrocode} +\def\@store@ordinal@string#1#2[#3]{% +\ifthenelse{\equal{#3}{f}}{% +\protect\@ordinalstringF{#2}{\@fc@ordstr}}{% +\ifthenelse{\equal{#3}{m}}{}{% +\PackageError{fmtcount}{Invalid gender option `#3' to +\string\ordinalstring}{Available options are m or f}}% +\protect\@ordinalstringM{#2}{\@fc@ordstr}}% +\expandafter\let\csname @fcs@#1\endcsname\@fc@ordstr} +% \end{macrocode} +% Display ordinal as a string with initial letters in upper case +% (argument is a counter) +% \begin{macrocode} \newcommand{\Ordinalstring}[1]{% \expandafter\protect\expandafter\Ordinalstringnum{% \expandafter\the\csname c@#1\endcsname}} - +% \end{macrocode} +% Display ordinal as a string with initial letters in upper case +% (argument is a number or count register) +% \begin{macrocode} \newcommand{\Ordinalstringnum}[1]{% \@ifnextchar[{\@Ordinal@string{#1}}{\@Ordinal@string{#1}[m]}} - -\def\@Ordinal@string#1[#2]{% +% \end{macrocode} +% Display ordinal as a string with initial letters in upper case +% according to gender +% \begin{macrocode} +\def\@Ordinal@string#1[#2]{{% \ifthenelse{\equal{#2}{f}}{% -\protect\@OrdinalstringF{#1}}{% +\protect\@OrdinalstringF{#1}{\@fc@ordstr}}{% \ifthenelse{\equal{#2}{m}}{}{% -\PackageError{fmtcount}{Invalid gender option `#2' to -\string\Ordinalstring}{Available options are m or f}}% -\protect\@OrdinalstringM{#1}}} - +\PackageError{fmtcount}{Invalid gender option `#2'}{% +Available options are m or f}}% +\protect\@OrdinalstringM{#1}{\@fc@ordstr}}\@fc@ordstr}} +% \end{macrocode} +% Store textual representation of number, with initial letters in +% upper case. First argument is identifying name, second argument +% is the counter set to the +% required number. +% \begin{macrocode} +\newcommand{\storeOrdinalstring}[2]{% +\expandafter\protect\expandafter\storeOrdinalstringnum{#1}{% +\expandafter\the\csname c@#2\endcsname}} +% \end{macrocode} +% Store textual representation of number, with initial letters in +% upper case. First argument is identifying name, second argument +% is a count register or number. +% \begin{macrocode} +\newcommand{\storeOrdinalstringnum}[2]{% +\@ifnextchar[{\@store@Ordinal@string{#1}{#2}}{% +\@store@Ordinal@string{#1}{#2}[m]}} +% \end{macrocode} +% Store textual representation of number according to gender, +% with initial letters in upper case. +% \begin{macrocode} +\def\@store@Ordinal@string#1#2[#3]{% +\ifthenelse{\equal{#3}{f}}{% +\protect\@OrdinalstringF{#2}{\@fc@ordstr}}{% +\ifthenelse{\equal{#3}{m}}{}{% +\PackageError{fmtcount}{Invalid gender option `#3'}{% +Available options are m or f}}% +\protect\@OrdinalstringM{#2}{\@fc@ordstr}}% +\expandafter\let\csname @fcs@#1\endcsname\@fc@ordstr} +% \end{macrocode} +% Store upper case textual representation of ordinal. The first +% argument is identifying name, the second argument is a counter. +% \begin{macrocode} +\newcommand{\storeORDINALstring}[2]{% +\expandafter\protect\expandafter\storeORDINALstringnum{#1}{% +\expandafter\the\csname c@#2\endcsname}} +% \end{macrocode} +% As above, but the second argument is a count register or a +% number. +% \begin{macrocode} +\newcommand{\storeORDINALstringnum}[2]{% +\@ifnextchar[{\@store@ORDINAL@string{#1}{#2}}{% +\@store@ORDINAL@string{#1}{#2}[m]}} +% \end{macrocode} +% Gender is specified as an optional argument at the end. +% \begin{macrocode} +\def\@store@ORDINAL@string#1#2[#3]{% +\ifthenelse{\equal{#3}{f}}{% +\protect\@ordinalstringF{#2}{\@fc@ordstr}}{% +\ifthenelse{\equal{#3}{m}}{}{% +\PackageError{fmtcount}{Invalid gender option `#3'}{% +Available options are m or f}}% +\protect\@ordinalstringM{#2}{\@fc@ordstr}}% +\expandafter\edef\csname @fcs@#1\endcsname{% +\noexpand\MakeUppercase{\@fc@ordstr}}} +% \end{macrocode} +% Display upper case textual representation of an ordinal. The +% argument must be a counter. +% \begin{macrocode} +\newcommand{\ORDINALstring}[1]{% +\expandafter\protect\expandafter\ORDINALstringnum{% +\expandafter\the\csname c@#1\endcsname}} +% \end{macrocode} +% As above, but the argument is a count register or a number. +% \begin{macrocode} +\newcommand{\ORDINALstringnum}[1]{% +\@ifnextchar[{\@ORDINAL@string{#1}}{\@ORDINAL@string{#1}[m]}} +% \end{macrocode} +% Gender is specified as an optional argument at the end. +% \begin{macrocode} +\def\@ORDINAL@string#1[#2]{{% +\ifthenelse{\equal{#2}{f}}{% +\protect\@ordinalstringF{#1}{\@fc@ordstr}}{% +\ifthenelse{\equal{#2}{m}}{}{% +\PackageError{fmtcount}{Invalid gender option `#2'}{% +Available options are m or f}}% +\protect\@ordinalstringM{#1}{\@fc@ordstr}}% +\MakeUppercase{\@fc@ordstr}}} +% \end{macrocode} +% Convert number to textual respresentation, and store. First +% argument is the identifying name, second argument is a counter +% containing the number. +% \begin{macrocode} +\newcommand{\storenumberstring}[2]{% +\expandafter\protect\expandafter\storenumberstringnum{#1}{% +\expandafter\the\csname c@#2\endcsname}} +% \end{macrocode} +% As above, but second argument is a number or count register. +% \begin{macrocode} +\newcommand{\storenumberstringnum}[2]{% +\@ifnextchar[{\@store@number@string{#1}{#2}}{% +\@store@number@string{#1}{#2}[m]}} +% \end{macrocode} +% Gender is given as optional argument, \emph{at the end}. +% \begin{macrocode} +\def\@store@number@string#1#2[#3]{% +\ifthenelse{\equal{#3}{f}}{% +\protect\@numberstringF{#2}{\@fc@numstr}}{% +\ifthenelse{\equal{#3}{m}}{}{% +\PackageError{fmtcount}{Invalid gender option `#3'}{% +Available options are m or f}}% +\protect\@numberstringM{#2}{\@fc@numstr}}% +\expandafter\let\csname @fcs@#1\endcsname\@fc@numstr} +% \end{macrocode} +% Display textual representation of a number. The argument +% must be a counter. +% \begin{macrocode} \newcommand{\numberstring}[1]{% \expandafter\protect\expandafter\numberstringnum{% \expandafter\the\csname c@#1\endcsname}} - +% \end{macrocode} +% As above, but the argument is a count register or a number. +% \begin{macrocode} \newcommand{\numberstringnum}[1]{% \@ifnextchar[{\@number@string{#1}}{\@number@string{#1}[m]}} - -\def\@number@string#1[#2]{% +% \end{macrocode} +% Gender is specified as an optional argument \emph{at the end}. +% \begin{macrocode} +\def\@number@string#1[#2]{{% \ifthenelse{\equal{#2}{f}}{% -\protect\@numberstringF{#1}}{% +\protect\@numberstringF{#1}{\@fc@numstr}}{% \ifthenelse{\equal{#2}{m}}{}{% -\PackageError{fmtcount}{Invalid gender option `#2' to -\string\numberstring}{Available options are m or f}}% -\protect\@numberstringM{#1}}} - +\PackageError{fmtcount}{Invalid gender option `#2'}{% +Available options are m or f}}% +\protect\@numberstringM{#1}{\@fc@numstr}}\@fc@numstr}} +% \end{macrocode} +% Store textual representation of number. First argument is +% identifying name, second argument is a counter. +% \begin{macrocode} +\newcommand{\storeNumberstring}[2]{% +\expandafter\protect\expandafter\storeNumberstringnum{#1}{% +\expandafter\the\csname c@#2\endcsname}} +% \end{macrocode} +% As above, but second argument is a count register or number. +% \begin{macrocode} +\newcommand{\storeNumberstringnum}[2]{% +\@ifnextchar[{\@store@Number@string{#1}{#2}}{% +\@store@Number@string{#1}{#2}[m]}} +% \end{macrocode} +% Gender is specified as an optional argument \emph{at the end}: +% \begin{macrocode} +\def\@store@Number@string#1#2[#3]{% +\ifthenelse{\equal{#3}{f}}{% +\protect\@NumberstringF{#2}{\@fc@numstr}}{% +\ifthenelse{\equal{#3}{m}}{}{% +\PackageError{fmtcount}{Invalid gender option `#3'}{% +Available options are m or f}}% +\protect\@NumberstringM{#2}{\@fc@numstr}}% +\expandafter\let\csname @fcs@#1\endcsname\@fc@numstr} +% \end{macrocode} +% Display textual representation of number. The argument must be +% a counter. +% \begin{macrocode} \newcommand{\Numberstring}[1]{% \expandafter\protect\expandafter\Numberstringnum{% \expandafter\the\csname c@#1\endcsname}} - +% \end{macrocode} +% As above, but the argument is a count register or number. +% \begin{macrocode} \newcommand{\Numberstringnum}[1]{% \@ifnextchar[{\@Number@string{#1}}{\@Number@string{#1}[m]}} - -\def\@Number@string#1[#2]{% +% \end{macrocode} +% Gender is specified as an optional argument at the end. +% \begin{macrocode} +\def\@Number@string#1[#2]{{% \ifthenelse{\equal{#2}{f}}{% -\protect\@NumberstringF{#1}}{% +\protect\@NumberstringF{#1}{\@fc@numstr}}{% \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}} +\PackageError{fmtcount}{Invalid gender option `#2'}{% +Available options are m or f}}% +\protect\@NumberstringM{#1}{\@fc@numstr}}\@fc@numstr}} +% \end{macrocode} +% Store upper case textual representation of number. The first +% argument is identifying name, the second argument is a counter. +% \begin{macrocode} +\newcommand{\storeNUMBERstring}[2]{% +\expandafter\protect\expandafter\storeNUMBERstringnum{#1}{% +\expandafter\the\csname c@#2\endcsname}} +% \end{macrocode} +% As above, but the second argument is a count register or a +% number. +% \begin{macrocode} +\newcommand{\storeNUMBERstringnum}[2]{% +\@ifnextchar[{\@store@NUMBER@string{#1}{#2}}{% +\@store@NUMBER@string{#1}{#2}[m]}} +% \end{macrocode} +% Gender is specified as an optional argument at the end. +% \begin{macrocode} +\def\@store@NUMBER@string#1#2[#3]{% +\ifthenelse{\equal{#3}{f}}{% +\protect\@numberstringF{#2}{\@fc@numstr}}{% +\ifthenelse{\equal{#3}{m}}{}{% +\PackageError{fmtcount}{Invalid gender option `#3'}{% +Available options are m or f}}% +\protect\@numberstringM{#2}{\@fc@numstr}}% +\expandafter\edef\csname @fcs@#1\endcsname{% +\noexpand\MakeUppercase{\@fc@numstr}}} +% \end{macrocode} +% Display upper case textual representation of a number. The +% argument must be a counter. +% \begin{macrocode} +\newcommand{\NUMBERstring}[1]{% +\expandafter\protect\expandafter\NUMBERstringnum{% +\expandafter\the\csname c@#1\endcsname}} +% \end{macrocode} +% As above, but the argument is a count register or a number. +% \begin{macrocode} +\newcommand{\NUMBERstringnum}[1]{% +\@ifnextchar[{\@NUMBER@string{#1}}{\@NUMBER@string{#1}[m]}} +% \end{macrocode} +% Gender is specified as an optional argument at the end. +% \begin{macrocode} +\def\@NUMBER@string#1[#2]{{% +\ifthenelse{\equal{#2}{f}}{% +\protect\@numberstringF{#1}{\@fc@numstr}}{% +\ifthenelse{\equal{#2}{m}}{}{% +\PackageError{fmtcount}{Invalid gender option `#2'}{% +Available options are m or f}}% +\protect\@numberstringM{#1}{\@fc@numstr}}% +\MakeUppercase{\@fc@numstr}}} +% \end{macrocode} +% Number representations in other bases. Binary: +% \begin{macrocode} +\providecommand{\binary}[1]{% +\expandafter\protect\expandafter\@binary{% +\expandafter\the\csname c@#1\endcsname}} +% \end{macrocode} +% Like \verb"\alph", but goes beyond 26. (a \ldots\ z aa \ldots zz \ldots) +% \begin{macrocode} +\providecommand{\aaalph}[1]{% +\expandafter\protect\expandafter\@aaalph{% +\expandafter\the\csname c@#1\endcsname}} +% \end{macrocode} +% As before, but upper case. +% \begin{macrocode} +\providecommand{\AAAlph}[1]{% +\expandafter\protect\expandafter\@AAAlph{% +\expandafter\the\csname c@#1\endcsname}} +% \end{macrocode} +% Like \verb"\alph", but goes beyond 26. (a \ldots\ z ab \ldots az \ldots) +% \begin{macrocode} +\providecommand{\abalph}[1]{% +\expandafter\protect\expandafter\@abalph{% +\expandafter\the\csname c@#1\endcsname}} +% \end{macrocode} +% As above, but upper case. +% \begin{macrocode} +\providecommand{\ABAlph}[1]{% +\expandafter\protect\expandafter\@ABAlph{% +\expandafter\the\csname c@#1\endcsname}} +% \end{macrocode} +% Hexadecimal: +% \begin{macrocode} +\providecommand{\hexadecimal}[1]{% +\expandafter\protect\expandafter\@hexadecimal{% +\expandafter\the\csname c@#1\endcsname}} +% \end{macrocode} +% As above, but in upper case. +% \begin{macrocode} +\providecommand{\Hexadecimal}[1]{% +\expandafter\protect\expandafter\@Hexadecimal{% +\expandafter\the\csname c@#1\endcsname}} +% \end{macrocode} +% Octal: +% \begin{macrocode} +\providecommand{\octal}[1]{% +\expandafter\protect\expandafter\@octal{% +\expandafter\the\csname c@#1\endcsname}} +% \end{macrocode} +% Decimal: +% \begin{macrocode} +\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" @@ -3493,7 +4580,7 @@ Available options are m or f}}% % Otherwise use English definitions. % \begin{macrocode} \def\@setdef@ultfmtcount{ -\@ifundefined{@ordinalenglish}{\input{fc-english.def}}{} +\@ifundefined{@ordinalMenglish}{\input{fc-english.def}}{} \def\@ordinalstringM{\@ordinalstringMenglish} \let\@ordinalstringF=\@ordinalstringMenglish \def\@OrdinalstringM{\@OrdinalstringMenglish} @@ -3590,8 +4677,8 @@ The fmtcount package currently does not support language % \begin{macrocode} # File : fmtcount.perl # Author : Nicola Talbot -# Date : 3 Mar 2005 -# Version : 1.02 +# Date : 21 April 2007 +# Version : 1.04 # Description : LaTeX2HTML implementation of fmtcount package package main; @@ -3761,6 +4848,58 @@ sub do_cmd_ordinal{ } } +sub do_cmd_storeordinal{ + local($_) = @_; + local($key); + + $key = &missing_braces + unless ((s/$next_pair_pr_rx//o)&&($key=$2)); + + local($ctr, $val, $id, $_) = &read_counter_value($_); + local($gender)='m'; + + $_ =~ s/${OP}$id${CP}$ctr${OP}$id${CP}//; + + if ($_ =~s/\s*\[(.)\]//) + { + $gender = $1; + } + + if ($ctr eq 'DAY' or $ctr eq 'MONTH' or $ctr eq 'YEAR') + { + # this is a cludge to make it work with newdateformat + $fmtcntvar{$key} = join('', '{ORDINAL{', $ctr, '}}'); + } + else + { + $fmtcntvar{$key} = &getordinal($val, $gender); + } + + $_; +} + +sub do_cmd_storeordinalnum{ + local($_) = @_; + local($key, $val); + + $key = &missing_braces + unless ((s/$next_pair_pr_rx//o)&&($key=$2)); + + $val = &missing_braces + unless ((s/$next_pair_pr_rx//o)&&($val=$2)); + + local($gender)='m'; + + if ($_ =~s/\s*\[(.)\]//) + { + $gender = $1; + } + + $fmtcntvar{$key} = &getordinal($val, $gender); + + $_; +} + @unitthstring = ('zeroth', 'first', 'second', @@ -4086,7 +5225,7 @@ $thousandthnamespanish = "mil\\'esimo"; @unitstringportuges = ('zero', 'um', 'dois', - 'tr\`es', + 'tr\^es', 'quatro', 'cinco', 'seis', @@ -4353,7 +5492,7 @@ sub get_numberstringportuges{ { $hundreds = $hundredstringportuges[$num/100]; - if ($gender eq 'f') + if ($gender eq 'f' and $num >= 200) { $hundreds =~s/o(s?)$/a\1/; } @@ -4387,31 +5526,148 @@ sub get_numberstringportuges{ } } - $name; + $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 do_cmd_storenumberstring{ + local($_) = @_; + local($key); + + $key = &missing_braces + unless ((s/$next_pair_pr_rx//o)&&($key=$2)); + + local($ctr, $val, $id, $_) = &read_counter_value($_); + local($gender)='m'; + + $_ =~ s/${OP}$id${CP}$ctr${OP}$id${CP}//; + + if ($_ =~s/\s*\[(.)\]//) + { + $gender = $1; + } + + if ($ctr eq 'DAY' or $ctr eq 'MONTH' or $ctr eq 'YEAR') + { + # this is a cludge to make it work with newdateformat + $fmtcntvar{$key} = join('', '{NUMBERSTRING{', $ctr, '}}'); + } + else + { + $fmtcntvar{$key} = join('', &get_numberstring($val, $gender)); + } + + $_; +} + +sub do_cmd_storenumberstringnum{ + local($_) = @_; + local($key, $val); + + $key = &missing_braces + unless ((s/$next_pair_pr_rx//o)&&($key=$2)); + + $val = &missing_braces + unless ((s/$next_pair_pr_rx//o)&&($val=$2)); + + local($gender)='m'; + + if ($_ =~s/\s*\[(.)\]//) + { + $gender = $1; + } + + $fmtcntvar{$key} = join('', &get_numberstring($val, $gender)); + + $_; } -sub get_numberstring{ +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') { - &get_numberstringfrench($val,$gender); + $string =~ s/ Et / et /g; } elsif ($default_language eq 'spanish') { - &get_numberstringspanish($val,$gender); + $string =~ s/ Y / y /g; } elsif ($default_language eq 'portuges') { - &get_numberstringportuges($val,$gender); + $string =~ s/ E / e /g; } else { - &get_numberstringenglish($val); + $string =~ s/ And / and /g; } + + $string; } -sub do_cmd_numberstringnum{ +sub do_cmd_Numberstringnum{ local($_) = @_; local($num,$gender); $num = &missing_braces @@ -4426,10 +5682,10 @@ sub do_cmd_numberstringnum{ $gender = 'm'; } - join('', &get_numberstring($num,$gender), $_[0]); + join('', &get_Numberstring($num,$gender), $_[0]); } -sub do_cmd_numberstring{ +sub do_cmd_Numberstring{ local($ctr, $val, $id, $_) = &read_counter_value($_[0]); local($gender)='m'; @@ -4443,40 +5699,67 @@ sub do_cmd_numberstring{ 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]); + join('', '{NNUMBERSTRING{', $ctr, '}}', $_[0]); } else { - join('', &get_numberstring($val, $gender), $_[0]); + 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; +sub do_cmd_storeNumberstring{ + local($_) = @_; + local($key); - if ($default_language eq 'french') + $key = &missing_braces + unless ((s/$next_pair_pr_rx//o)&&($key=$2)); + + local($ctr, $val, $id, $_) = &read_counter_value($_); + local($gender)='m'; + + $_ =~ s/${OP}$id${CP}$ctr${OP}$id${CP}//; + + if ($_ =~s/\s*\[(.)\]//) { - $string =~ s/ Et / et /g; + $gender = $1; } - elsif ($default_language eq 'spanish') + + if ($ctr eq 'DAY' or $ctr eq 'MONTH' or $ctr eq 'YEAR') { - $string =~ s/ Y / y /g; + # this is a cludge to make it work with newdateformat + $fmtcntvar{$key} = join('', '{NNUMBERSTRING{', $ctr, '}}'); } - elsif ($default_language eq 'portuges') + else { - $string =~ s/ E / e /g; + $fmtcntvar{$key} = join('', &get_Numberstring($val, $gender)); } - else + + $_; +} + +sub do_cmd_storeNumberstringnum{ + local($_) = @_; + local($key, $val); + + $key = &missing_braces + unless ((s/$next_pair_pr_rx//o)&&($key=$2)); + + $val = &missing_braces + unless ((s/$next_pair_pr_rx//o)&&($val=$2)); + + local($gender)='m'; + + if ($_ =~s/\s*\[(.)\]//) { - $string =~ s/ And / and /g; + $gender = $1; } - $string; + $fmtcntvar{$key} = join('', &get_Numberstring($val, $gender)); + + $_; } -sub do_cmd_Numberstringnum{ +sub do_cmd_NUMBERstringnum{ local($_) = @_; local($num,$gender); $num = &missing_braces @@ -4491,10 +5774,10 @@ sub do_cmd_Numberstringnum{ $gender = 'm'; } - join('', &get_Numberstring($num,$gender), $_[0]); + join('', uc(&get_numberstring($num,$gender)), $_[0]); } -sub do_cmd_Numberstring{ +sub do_cmd_NUMBERstring{ local($ctr, $val, $id, $_) = &read_counter_value($_[0]); local($gender)='m'; @@ -4508,12 +5791,64 @@ sub do_cmd_Numberstring{ 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]); + join('', '{CAPNUMBERSTRING{', $ctr, '}}', $_); } else { - join('', &get_Numberstring($val, $gender), $_[0]); + join('', uc(&get_numberstring($val, $gender)), $_); + } +} + +sub do_cmd_storeNUMBERstring{ + local($_) = @_; + local($key); + + $key = &missing_braces + unless ((s/$next_pair_pr_rx//o)&&($key=$2)); + + local($ctr, $val, $id, $_) = &read_counter_value($_); + local($gender)='m'; + + $_ =~ s/${OP}$id${CP}$ctr${OP}$id${CP}//; + + if ($_ =~s/\s*\[(.)\]//) + { + $gender = $1; + } + + if ($ctr eq 'DAY' or $ctr eq 'MONTH' or $ctr eq 'YEAR') + { + # this is a cludge to make it work with newdateformat + $fmtcntvar{$key} = join('', '{CAPNUMBERSTRING{', $ctr, '}}'); + } + else + { + $fmtcntvar{$key} = uc(&get_numberstring($val, $gender)); + } + + $_; +} + +sub do_cmd_storeNUMBERstringnum{ + local($_) = @_; + local($key, $val); + + $key = &missing_braces + unless ((s/$next_pair_pr_rx//o)&&($key=$2)); + + $val = &missing_braces + unless ((s/$next_pair_pr_rx//o)&&($val=$2)); + + local($gender)='m'; + + if ($_ =~s/\s*\[(.)\]//) + { + $gender = $1; } + + $fmtcntvar{$key} = uc(&get_numberstring($val, $gender)); + + $_; } sub get_ordinalstringenglish{ @@ -4952,18 +6287,82 @@ sub do_cmd_ordinalstring{ 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]); + join('', '{ORDINALSTRING{', $ctr, '}}', $_); + } + else + { + join('', &get_ordinalstring($val, $gender), $_); + } +} + + %fmtcntvar = (); + +sub do_cmd_FMCuse{ + local($_) = @_; + local($key); + + $key = &missing_braces + unless ((s/$next_pair_pr_rx//o)&&($key=$2)); + + $fmtcntvar{$key}.$_; +} + +sub do_cmd_storeordinalstring{ + local($_) = @_; + local($key); + + $key = &missing_braces + unless ((s/$next_pair_pr_rx//o)&&($key=$2)); + + local($ctr, $val, $id, $_) = &read_counter_value($_); + local($gender)='m'; + + $_ =~ s/${OP}$id${CP}$ctr${OP}$id${CP}//; + + if ($_ =~s/\s*\[(.)\]//) + { + $gender = $1; + } + + if ($ctr eq 'DAY' or $ctr eq 'MONTH' or $ctr eq 'YEAR') + { + # this is a cludge to make it work with newdateformat + $fmtcntvar{$key} = join('', '{ORDINALSTRING{', $ctr, '}}'); } else { - join('', &get_ordinalstring($val, $gender), $_[0]); + $fmtcntvar{$key} = join('', &get_ordinalstring($val, $gender)); + } + + $_; +} + +sub do_cmd_storeordinalstringnum{ + local($_) = @_; + local($key, $val); + + $key = &missing_braces + unless ((s/$next_pair_pr_rx//o)&&($key=$2)); + + $val = &missing_braces + unless ((s/$next_pair_pr_rx//o)&&($val=$2)); + + local($gender)='m'; + + if ($_ =~s/\s*\[(.)\]//) + { + $gender = $1; } + + $fmtcntvar{$key} = join('', &get_ordinalstring($val, $gender)); + + $_; } sub get_Ordinalstring{ local($val,$gender) = @_; local($string) = &get_ordinalstring($val,$gender); - $string =~ s/([a-z])([^\s\-]+)/\u\1\2/g; + $string =~ s/\b([a-z])([^\s\-]+)/\u\1\2/g; if ($default_language eq 'french') { @@ -5017,6 +6416,149 @@ sub do_cmd_Ordinalstring{ } } +sub do_cmd_storeOrdinalstring{ + local($_) = @_; + local($key); + + $key = &missing_braces + unless ((s/$next_pair_pr_rx//o)&&($key=$2)); + + local($ctr, $val, $id, $_) = &read_counter_value($_); + local($gender)='m'; + + $_ =~ s/${OP}$id${CP}$ctr${OP}$id${CP}//; + + if ($_ =~s/\s*\[(.)\]//) + { + $gender = $1; + } + + if ($ctr eq 'DAY' or $ctr eq 'MONTH' or $ctr eq 'YEAR') + { + # this is a cludge to make it work with newdateformat + $fmtcntvar{$key} = join('', '{OORDINALSTRING{', $ctr, '}}'); + } + else + { + $fmtcntvar{$key} = join('', &get_Ordinalstring($val, $gender)); + } + + $_; +} + +sub do_cmd_storeOrdinalstringnum{ + local($_) = @_; + local($key, $val); + + $key = &missing_braces + unless ((s/$next_pair_pr_rx//o)&&($key=$2)); + + $val = &missing_braces + unless ((s/$next_pair_pr_rx//o)&&($val=$2)); + + local($gender)='m'; + + if ($_ =~s/\s*\[(.)\]//) + { + $gender = $1; + } + + $fmtcntvar{$key} = join('', &get_Ordinalstring($val, $gender)); + + $_; +} + +sub do_cmd_ORDINALstringnum{ + local($_) = @_; + local($num,$gender); + $num = &missing_braces + unless (($_[0]=~s/$next_pair_pr_rx//o)&&($num=$2)); + + if ($_[0] =~ s/\[(m|f)\]//) + { + $gender = $1; + } + else + { + $gender = 'm'; + } + + join('', uc(&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('', '{CAPORDINALSTRING{', $ctr, '}}', $_); + } + else + { + join('', uc(&get_ordinalstring($val, $gender)), $_); + } +} + +sub do_cmd_storeORDINALstring{ + local($_) = @_; + local($key); + + $key = &missing_braces + unless ((s/$next_pair_pr_rx//o)&&($key=$2)); + + local($ctr, $val, $id, $_) = &read_counter_value($_); + local($gender)='m'; + + $_ =~ s/${OP}$id${CP}$ctr${OP}$id${CP}//; + + if ($_ =~s/\s*\[(.)\]//) + { + $gender = $1; + } + + if ($ctr eq 'DAY' or $ctr eq 'MONTH' or $ctr eq 'YEAR') + { + # this is a cludge to make it work with newdateformat + $fmtcntvar{$key} = join('', '{CAPORDINALSTRING{', $ctr, '}}'); + } + else + { + $fmtcntvar{$key} = uc(&get_ordinalstring($val, $gender)); + } + + $_; +} + +sub do_cmd_storeORDINALstringnum{ + local($_) = @_; + local($key, $val); + + $key = &missing_braces + unless ((s/$next_pair_pr_rx//o)&&($key=$2)); + + $val = &missing_braces + unless ((s/$next_pair_pr_rx//o)&&($val=$2)); + + local($gender)='m'; + + if ($_ =~s/\s*\[(.)\]//) + { + $gender = $1; + } + + $fmtcntvar{$key} = uc(&get_ordinalstring($val, $gender)); + + $_; +} sub do_cmd_fmtcountsetoptions{ local($_) = @_; @@ -5393,9 +6935,9 @@ sub load_fmtcount_cfg{ %<*fc-samp.tex> % \end{macrocode} %\fi +% \begin{macrocode} \documentclass[a4paper]{article} -%\usepackage[french]{babel} \usepackage{fmtcount} \newcounter{N} @@ -5488,9 +7030,11 @@ numberstring Referencing a label: \ref{ex}. Passing numbers explicitly: \ordinalnum{10}, -\Numberstringnum{10}, \Ordinalstringnum{10}. +\Numberstringnum{10}, \NUMBERstringnum{10}, \Ordinalstringnum{10}, +\ORDINALstringnum{10}. \end{document} +% \end{macrocode} %\iffalse % \begin{macrocode} % @@ -5501,6 +7045,7 @@ Passing numbers explicitly: \ordinalnum{10}, %<*fc-lang.tex> % \end{macrocode} %\fi +% \begin{macrocode} % This is an interactive script. Run it through \LaTeX % and enter appropriate responses. @@ -5613,8 +7158,10 @@ Current language: French (Belgium). \typeout{Which format?^^J} \typeout{[1] ordinalstring} \typeout{[2] Ordinalstring} -\typeout{[3] numberstring} -\typeout{[4] Numberstring} +\typeout{[3] ORDINALstring} +\typeout{[4] numberstring} +\typeout{[5] Numberstring} +\typeout{[6] NUMBERstring} \typein[\response]{Default: 1} @@ -5622,16 +7169,20 @@ Current language: French (Belgium). \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}}}}} +\ifthenelse{\equal{\response}{4}}{\myctr=4}{ +\ifthenelse{\equal{\response}{5}}{\myctr=5}{ +\ifthenelse{\equal{\response}{6}}{\myctr=6}{\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{ORDINALstring} \or\def\stringtype{numberstring} \or\def\stringtype{Numberstring} +\or\def\stringtype{NUMBERstring} \fi \ifnum\langid>3 @@ -5708,6 +7259,7 @@ Current language: French (Belgium). \end{ttfamily} \end{document} +% \end{macrocode} %\iffalse % \begin{macrocode} % diff --git a/Master/texmf-dist/source/latex/fmtcount/fmtcount.ins b/Master/texmf-dist/source/latex/fmtcount/fmtcount.ins index 736dd9f169f..6138342bbe6 100644 --- a/Master/texmf-dist/source/latex/fmtcount/fmtcount.ins +++ b/Master/texmf-dist/source/latex/fmtcount/fmtcount.ins @@ -1,4 +1,4 @@ -% fmtcount.ins generated using makedtx version 0.91b 2007/1/6 16:52 +% fmtcount.ins generated using makedtx version 0.91b 2007/4/21 19:25 \input docstrip \preamble -- cgit v1.2.3