%\iffalse % fmtcount.dtx generated using makedtx version 0.91b (c) Nicola Talbot % Command line args: % -macrocode ".*\.perl" % -setambles ".*\.perl=>\nopreamble\nopostamble" % -src "(.+)\.(def)=>\1.\2" % -src "(.+)\.(sty)=>\1.\2" % -src "(.+)\.(perl)=>\1.\2" % -src "(fc-samp\.tex)=>\1" % -src "(fc-lang\.tex)=>\1" % -doc "manual.tex" % -author "Nicola Talbot" % -dir "source" % fmtcount % Created on 2006/7/29 14:54 %\fi %\iffalse %<*package> %% \CharacterTable %% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z %% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z %% Digits \0\1\2\3\4\5\6\7\8\9 %% Exclamation \! Double quote \" Hash (number) \# %% Dollar \$ Percent \% Ampersand \& %% Acute accent \' Left paren \( Right paren \) %% Asterisk \* Plus \+ Comma \, %% Minus \- Point \. Solidus \/ %% Colon \: Semicolon \; Less than \< %% Equals \= Greater than \> Question mark \? %% Commercial at \@ Left bracket \[ Backslash \\ %% Right bracket \] Circumflex \^ Underscore \_ %% Grave accent \` Left brace \{ Vertical bar \| %% Right brace \} Tilde \~} % %\fi % \iffalse % Doc-Source file to use with LaTeX2e % Copyright (C) 2006 Nicola Talbot, all rights reserved. % \fi % \iffalse %<*driver> \documentclass{ltxdoc} \usepackage[colorlinks, bookmarks, bookmarksopen, pdfauthor={N.L.C. Talbot}, pdftitle={fmtcount.sty: Displaying the Values of LaTeX Counters}, pdfkeywords={LaTeX,counter}]{hyperref} \newcommand{\styname}[1]{\textsf{#1}}\newcommand{\clsname}[1]{\textsf{#1}} \begin{document} \DocInput{fmtcount.dtx} \end{document} % %\fi % %\RecordChanges %\OnlyDescription %\def\filedate{29 July 2006} %\def\fileversion{1.04} %\def\filename{fmtcount.dtx} %\def\docdate{29 July 2006} % % \title{fmtcount.sty v\fileversion: Displaying the Values of %\LaTeX\ Counters} % \author{Nicola L.C. Talbot} % \date{\docdate} % \maketitle % \tableofcontents % \section{Introduction} %The \styname{fmtcount} package provides commands to display %the values of \LaTeX\ counters in a variety of formats. It also %provides equivalent commands for actual numbers rather than %counter names. Limited multilingual support is available. % %\section{Installation} % %This package is distributed with the files \texttt{fmtcount.dtx} %and \texttt{fmtcount.ins}. To extract the code do: %\begin{verbatim} %latex fmtcount.ins %\end{verbatim} %This will create the files \texttt{fmtcount.sty} and %\texttt{fmtcount.perl}, along with several \texttt{.def} files. %Place \texttt{fmtcount.sty} and the \texttt{.def} files somewhere %where \LaTeX\ will find them (e.g.\ \texttt{texmf/tex/latex/fmtcount/}) and place \texttt{fmtcount.perl} somewhere where \LaTeX2HTML %will find it (e.g.\ latex2html/styles). Remember to refresh %the \TeX\ database (using \texttt{texhash} under Linux, for %other operating systems check the manual.) % %\section{Available Commands} % %The commands can be divided into two categories: those that %take the name of a counter as the argument, and those %that take a number as the argument. % % \DescribeMacro{\ordinal} % The macro \verb"\ordinal{"\meta{counter}\verb!}! will % print the value of a \LaTeX\ counter \meta{counter} as an ordinal, % \DescribeMacro{\fmtord} % where the macro \verb"\fmtord{"\meta{text}\verb!}! is used to format the st,nd,rd,th bit. % By default the ordinal is formatted as a superscript, if the package option \texttt{level} % is used, it is level with the text. % For example, if the current section is 3, then \verb"\ordinal{section}" will produce % the output: 3\textsuperscript{rd}. % %\textbf{Note:} the \clsname{memoir} class also defines a command called %\verb"\ordinal" which takes a number as an argument instead of a %counter. In order to overcome this incompatiblity, if you want %to use the \styname{fmtcount} package with the \clsname{memoir} class %you should use \verb"\FCordinal" to access \styname{fmtcount}'s %version of \verb"\ordinal", and use \verb"\ordinal" to use %\clsname{memoir}'s version of that command. % %\DescribeMacro{\ordinalnum} %The macro \verb"\ordinalnum" is like \verb!\ordinal! %but takes an actual number rather than a counter as the %argument. For example: \verb"\ordinalnum{3}" will %produce: 3\textsuperscript{rd}. % % \DescribeMacro{\numberstring} % The macro \verb"\numberstring{"\meta{counter}\verb!}! will print the value % of \meta{counter} as text. E.g.\ \verb"\numberstring{section}" will produce: % three. % \DescribeMacro{\Numberstring} % The macro \verb"\Numberstring{"\meta{counter}\verb!}! does the same as % \verb"\numberstring", but with initial letters in uppercase. For % example, \verb"\Numberstring{section}" will produce: Three. % %\DescribeMacro{\numberstringnum} %\DescribeMacro{\Numberstringnum} %The macros \verb!\numberstringnum! and %\verb!\Numberstringnum! work like %\verb!\numberstring! and %\verb!\Numberstring!, respectively, but take an actual number %rather than a counter as the argument. For example: %\verb'\Numberstringnum{105}' will produce: One Hundred and Five. % % \DescribeMacro{\ordinalstring} % The macro \verb"\ordinalstring{"\meta{counter}\verb!}! will print the % value of \meta{counter} as a textual ordinal. E.g.\ % \verb"\ordinalstring{section}" will produce: third. % \DescribeMacro{\Ordinalstring} % The macro \verb"\Ordinalstring{"\meta{counter}\verb!}! does the same as % \verb"\ordinalstring", but with initial letters in uppercase. For example, % \verb"\Ordinalstring{section}" will produce: Third. % %\DescribeMacro{\ordinalstringnum} %\DescribeMacro{\Ordinalstringnum} %The macros \verb!\ordinalstringnum! and %\verb!\Ordinalstringnum! work like %\verb!\Ordinalstring! and %\verb!\Ordinalstring!, respectively, but take an actual number %rather than a counter as the argument. For example, %\verb"\ordinalstringnum{3}" will produce: third. % % \DescribeMacro{\binary} %\changes{v2.4}{25 Sept 2004}{'binary added} % The macro \verb"\binary{"\meta{counter}\verb!}! will print the %value of \meta{counter} as a binary number. %E.g.\ \verb"\binary{section}" will produce: 11. The declaration %\DescribeMacro{\padzeroes}\verb"\padzeroes["\meta{n}\verb!]! %will ensure numbers are written to \meta{n} digits, padding with %zeroes if necessary. E.g.\ \verb"\padzeroes[8]\binary{section}" %will produce: 00000011. % The default value for \meta{n} is 17. % %\DescribeMacro{\binarynum} %The macro \verb"\binarynum" is like \verb!\binary! %but takes an actual number rather than a counter as the %argument. For example: \verb"\binarynum{5}" will %produce: 101. % % \DescribeMacro{\octal} %\changes{v2.4}{25 Sept 2004}{'octal added} % The macro \verb"\octal{"\meta{counter}\verb!}! will print the %value of \meta{counter} as an octal number. For example, if you %have a counter called, say \texttt{mycounter}, and you set the %value to 125, then \verb"\octal{mycounter}" will produce: 177. % Again, the number will be padded with zeroes if necessary, %depending on whether \verb"\padzeroes" has been used. % %\DescribeMacro{\octalnum} %The macro \verb"\octalnum" is like \verb!\octal! %but takes an actual number rather than a counter as the %argument. For example: \verb"\octalnum{125}" will %produce: 177. % % \DescribeMacro{\hexadecimal} %\changes{v2.4}{25 Sept 2004}{'hexadecimal added} % The macro \verb"\hexadecimal{"\meta{counter}\verb!}! will print %the value of \meta{counter} as a hexadecimal number. Going back %to the previous example, \verb"\hexadecimal{mycounter}" will % produce: 7d. Again, the number will be padded with zeroes if %necessary, depending on whether \verb"\padzeroes" has been used. % \DescribeMacro{\Hexadecimal} % \verb"\Hexadecimal{"\meta{counter}\verb!}! does the same thing, %but uses uppercase characters, e.g.\ % \verb"\Hexadecimal{mycounter}" will produce: 7D. % %\DescribeMacro{\hexadecimalnum} %\DescribeMacro{\Hexadecimalnum} %The macros \verb"\hexadecimalnum" and %\verb"\Hexadecimalnum" are like %\verb!\hexadecimal! and \verb"\Hexadecimal" %but take an actual number rather than a counter as the %argument. For example: \verb"\hexadecimalnum{125}" will %produce: 7d, and \verb"\Hexadecimalnum{125}" will %produce: 7D. % %\DescribeMacro{\decimal} %\changes{v2.41}{22 Oct 2004}{'decimal added} %The macro \verb"\decimal{"\meta{counter}\verb!}! is similar to %\verb"\arabic" but the number can be padded with zeroes % depending on whether \verb"\padzeroes" has been used. %For example: \verb"\padzeroes[8]\decimal{section}" will % produce: 00000005. % %\DescribeMacro{\decimalnum} %The macro \verb"\decimalnum" is like \verb!\decimal! %but takes an actual number rather than a counter as the %argument. For example: \verb"\padzeroes[8]\decimalnum{5}" will %produce: 00000005. % % \DescribeMacro{\aaalph} %\changes{v2.4}{25 Sept 2004}{'aaalph added} % The macro \verb"\aaalph{"\meta{counter}\verb!}! will print the %value of \meta{counter} as: a b \ldots\ z aa bb \ldots\ zz etc. % For example, \verb"\aaalpha{mycounter}" will produce: uuuuu if %\texttt{mycounter} is set to 125. % \DescribeMacro{\AAAlph} % \verb"\AAAlph{"\meta{counter}\verb!}! does the same thing, but %uses uppercase characters, e.g.\ % \verb"\AAAlph{mycounter}" will produce: UUUUU. % %\DescribeMacro{\aaalphnum} %\DescribeMacro{\AAAlphnum} %The macros \verb"\aaalphnum" and %\verb"\AAAlphnum" are like %\verb!\aaalph! and \verb"\AAAlph" %but take an actual number rather than a counter as the %argument. For example: \verb"\aaalphnum{125}" will %produce: uuuuu, and \verb"\AAAlphnum{125}" will %produce: UUUUU. % % \DescribeMacro{\abalph} %\changes{v2.4}{25 Sept 2004}{'abalph added} % The macro \verb"\abalph{"\meta{counter}\verb!}! will print the %value of \meta{counter} as: a b \ldots\ z aa ab \ldots\ az etc. % For example, \verb"\abalpha{mycounter}" will produce: du if %\texttt{mycounter} is set to 125. % \DescribeMacro{\ABAlph} % \verb"\ABAlph{"\meta{counter}\verb!}! does the same thing, but %uses uppercase characters, e.g.\ % \verb"\ABAlph{mycounter}" will produce: DU. % %\DescribeMacro{\abalphnum} %\DescribeMacro{\ABAlphnum} %The macros \verb"\abalphnum" and %\verb"\ABAlphnum" are like %\verb!\abalph! and \verb"\ABAlph" %but take an actual number rather than a counter as the %argument. For example: \verb"\abalphnum{125}" will %produce: du, and \verb"\ABAlphnum{125}" will %produce: DU. % %\section{Package Options} % %The following options can be passed to this package: % %\begin{tabular}{ll} % raise & make ordinal st,nd,rd,th appear as superscript\\ % level & make ordinal st,nd,rd,th appear level with rest of %text %\end{tabular} % %\noindent These can also be set using the command: % %\DescribeMacro{\fmtcountsetoptions} %\verb"\fmtcountsetoptions{fmtord="\meta{type}\verb'}' % %\noindent where \meta{type} is either \texttt{level} or %\texttt{raise}. % %\section{Multilingual Support} % %Version 1.02 of the \styname{fmtcount} package now has %limited multilingual support. The following languages are %implemented: English, Spanish, Portuguese, French, French (Swiss) %and French (Belgian). The package checks to see if the %command \verb"\date"\meta{language} is defined\footnote{this %will be true if you have loaded \styname{babel}}, and will %load the code for those languages. The commands \verb"\ordinal", %\verb"\ordinalstring" and \verb'\numberstring' (and their %variants) will then be formatted in the currently %selected language. % %If the French language is selected, the French (France) version %will be used by default (e.g.\ soxiante-dix for 70). To %select the Swiss or Belgian variants (e.g.\ septente for 70) use: %\verb"\fmtcountsetoptions{french="\meta{dialect}\verb'}' %where \meta{dialect} is either \texttt{swiss} or \texttt{belgian}. %You can also use this command to change the action of %\verb"\ordinal". %\verb"\fmtcountsetoptions{abbrv=true}" to produce ordinals %of the form 2\textsuperscript{e} or %\verb"\fmtcountsetoptions{abbrv=false}" to produce ordinals %of the form 2\textsuperscript{eme} (default). % %The \texttt{french} and \texttt{abbrv} settings only have an %effect if the French language has been defined. % %The male gender for all languages is used by default, however %the feminine form can be obtained by passing \texttt{f} as %an optional argument to \verb"\ordinal", \verb!\ordinalnum! etc. %For example: \verb"\numberstring{section}[f]". Note that the %optional argument comes \emph{after} the compulsory argument. % %Let me know if you find any spelling mistakes (has been known %to happen in English, let alone other languages I'm not so %familiar with.) % %\section{Configuration File \texttt{fmtcount.cfg}} % %You can save your preferred default settings to a file called %\texttt{fmtcount.cfg}, and place it on the \TeX\ path. These %settings will then be loaded by the \styname{fmtcount} %package. % %Note that if you are using the \styname{datetime} package, %the \texttt{datetime.cfg} configuration file will override %the \texttt{fmtcount.cfg} configuration file. %For example, if \texttt{datetime.cfg} has the line: %\begin{verbatim} %\renewcommand{\fmtord}[1]{\textsuperscript{\underline{#1}}} %\end{verbatim} %and if \texttt{fmtcount.cfg} has the line: %\begin{verbatim} %\fmtcountsetoptions{fmtord=level} %\end{verbatim} %then the former definition of \verb"\fmtord" will take %precedence. % %\section{LaTeX2HTML style} % %The \LaTeX2HTML\ style file \texttt{fmtcount.perl} is provided. %The following limitations apply: % %\begin{itemize} %\item \verb"\padzeroes" only has an effect in the preamble. % %\item The configuration file %\texttt{fmtcount.cfg} is currently ignored. (This is because %I can't work out the correct code to do this. If you %know how to do this, please let me know.) You can however %do: %\begin{verbatim} %\usepackage{fmtcount} %\html{\input{fmtcount.cfg}} %\end{verbatim} %This, I agree, is an unpleasant cludge. % %\end{itemize} % %\section{Acknowledgements} % %I would like to thank my mother for the French and Portuguese %support and my Spanish dictionary for the Spanish support. % % \section{Contact Details} % Dr Nicola Talbot\\ % School of Computing Sciences\\ % University of East Anglia\\ % Norwich. NR4 7TJ.\\ % United Kingdom.\\ % \url{http://theoval.cmp.uea.ac.uk/~nlct/} % % %\StopEventually{} %\section{The Code} % \begin{macrocode} %<*fc-english.def> % \end{macrocode} % English definitions % \begin{macrocode} \ProvidesFile{fc-english}[2005/04/29] % \end{macrocode} % Define macro that prints the value of the \TeX\ count % register as an ordinal. % \begin{macrocode} \newcommand{\@ordinalMenglish}[1]{% \@orgargctr=#1\relax \@ordinalctr=#1% \@modulo{\@ordinalctr}{100}% \ifnum\@ordinalctr=11 \the\@orgargctr\fmtord{th}% \else \ifnum\@ordinalctr=12 \the\@orgargctr\fmtord{th}% \else \ifnum\@ordinalctr=13 \the\@orgargctr\fmtord{th}% \else \@modulo{\@ordinalctr}{10}% \ifcase\@ordinalctr \the\@orgargctr\fmtord{th}% case 0 \or \the\@orgargctr\fmtord{st}% case 1 \or \the\@orgargctr\fmtord{nd}% case 2 \or \the\@orgargctr\fmtord{rd}% case 3 \else \the\@orgargctr\fmtord{th}% default case \fi \fi \fi \fi } \let\@ordinalFenglish=\@ordinalMenglish % \end{macrocode} % Define the macro that prints the value of a \TeX\ count register % as text % \begin{macrocode} \providecommand{\andname}{and} \newcommand{\@@unitstringenglish}[1]{% \ifcase#1\relax zero% \or one% \or two% \or three% \or four% \or five% \or six% \or seven% \or eight% \or nine% \fi } \newcommand{\@@tenstringenglish}[1]{% \ifcase#1\relax \or ten% \or twenty% \or thirty% \or forty% \or fifty% \or sixty% \or seventy% \or eighty% \or ninety% \fi } \newcommand{\@@teenstringenglish}[1]{% \ifcase#1\relax ten% \or eleven% \or twelve% \or thirteen% \or fourteen% \or fifteen% \or sixteen% \or seventeen% \or eighteen% \or nineteen% \fi } \newcommand{\@@Unitstringenglish}[1]{% \ifcase#1\relax Zero% \or One% \or Two% \or Three% \or Four% \or Five% \or Six% \or Seven% \or Eight% \or Nine% \fi } \newcommand{\@@Tenstringenglish}[1]{% \ifcase#1\relax \or Ten% \or Twenty% \or Thirty% \or Forty% \or Fifty% \or Sixty% \or Seventy% \or Eighty% \or Ninety% \fi } \newcommand{\@@Teenstringenglish}[1]{% \ifcase#1\relax Ten% \or Eleven% \or Twelve% \or Thirteen% \or Fourteen% \or Fifteen% \or Sixteen% \or Seventeen% \or Eighteen% \or Nineteen% \fi } \newcommand{\@@numberstringenglish}[1]{% \ifnum#1>99999 \PackageError{fmtcount}{Out of range}% {This macro only works for values less than 100000}% \else \ifnum#1<0 \PackageError{fmtcount}{Negative numbers not permitted}% {This macro does not work for negative numbers, however you can try typing "minus" first, and then pass the modulus of this number}% \fi \fi \@strctr=#1\relax \divide\@strctr by 1000\relax \ifnum\@strctr>9 % #1 is greater or equal to 10000 \divide\@strctr by 10 \ifnum\@strctr>1 \@tenstring{\@strctr}% \@strctr=#1 \divide\@strctr by 1000\relax \@modulo{\@strctr}{10}% \ifnum\@strctr>0 -\@unitstring{\@strctr}\fi \else \@strctr=#1\relax \divide\@strctr by 1000 \@modulo{\@strctr}{10}% \@teenstring{\@strctr}% \fi \ \@thousand% \else \ifnum\@strctr>0 \@unitstring{\@strctr}\ \@thousand\fi \fi \@strctr=#1\relax \@modulo{\@strctr}{1000}% \divide\@strctr by 100 \ifnum\@strctr>0 \ifnum#1>1000 \ \fi\@unitstring{\@strctr}\ \@hundred% \fi \@strctr=#1\relax \@modulo{\@strctr}{100}% \ifnum#1>100 \ifnum\@strctr>0 \ \andname\ \fi\fi \ifnum\@strctr>19 \divide\@strctr by 10 \@tenstring{\@strctr}% \@strctr=#1\relax \@modulo{\@strctr}{10}% \ifnum\@strctr>0 -\@unitstring{\@strctr}% \fi \else \ifnum\@strctr<10 \ifnum\@strctr=0 \ifnum#1<100 \@unitstring{\@strctr}\fi \else \@unitstring{\@strctr}% \fi \else \@modulo{\@strctr}{10}% \@teenstring{\@strctr}% \fi \fi } \newcommand{\@numberstringMenglish}[1]{% \let\@unitstring=\@@unitstringenglish \let\@teenstring=\@@teenstringenglish \let\@tenstring=\@@tenstringenglish \def\@hundred{hundred}\def\@thousand{thousand}% \@@numberstringenglish{#1}} \let\@numberstringFenglish=\@numberstringMenglish \newcommand{\@NumberstringMenglish}[1]{% \let\@unitstring=\@@Unitstringenglish \let\@teenstring=\@@Teenstringenglish \let\@tenstring=\@@Tenstringenglish \def\@hundred{Hundred}\def\@thousand{Thousand}% \@@numberstringenglish{#1}} \let\@NumberstringFenglish=\@NumberstringMenglish % \end{macrocode} % Define a macro that produces an ordinal as a string. % \begin{macrocode} \newcommand{\@@unitthstringenglish}[1]{% \ifcase#1\relax zeroth% \or first% \or second% \or third% \or fourth% \or fifth% \or sixth% \or seventh% \or eighth% \or ninth% \fi } \newcommand{\@@tenthstringenglish}[1]{% \ifcase#1\relax \or tenth% \or twentieth% \or thirtieth% \or fortieth% \or fiftieth% \or sixtieth% \or seventieth% \or eightieth% \or ninetieth% \fi } \newcommand{\@@teenthstringenglish}[1]{% \ifcase#1\relax tenth% \or eleventh% \or twelfth% \or thirteenth% \or fourteenth% \or fifteenth% \or sixteenth% \or seventeenth% \or eighteenth% \or nineteenth% \fi } \newcommand{\@@Unitthstringenglish}[1]{% \ifcase#1\relax Zeroth% \or First% \or Second% \or Third% \or Fourth% \or Fifth% \or Sixth% \or Seventh% \or Eighth% \or Ninth% \fi } \newcommand{\@@Tenthstringenglish}[1]{% \ifcase#1\relax \or Tenth% \or Twentieth% \or Thirtieth% \or Fortieth% \or Fiftieth% \or Sixtieth% \or Seventieth% \or Eightieth% \or Ninetieth% \fi } \newcommand{\@@Teenthstringenglish}[1]{% \ifcase#1\relax Tenth% \or Eleventh% \or Twelfth% \or Thirteenth% \or Fourteenth% \or Fifteenth% \or Sixteenth% \or Seventeenth% \or Eighteenth% \or Nineteenth% \fi } \newcommand{\@@ordinalstringenglish}[1]{% \@strctr=#1\relax \ifnum#1>99999 \PackageError{fmtcount}{Out of range}% {This macro only works for values less than 100000 (value given: \number\@strctr)}% \else \ifnum#1<0 \PackageError{fmtcount}{Negative numbers not permitted}% {This macro does not work for negative numbers, however you can try typing "minus" first, and then pass the modulus of this number}% \fi \fi \@strctr=#1\relax \divide\@strctr by 1000\relax \ifnum\@strctr>9 % #1 is greater or equal to 10000 \divide\@strctr by 10 \ifnum\@strctr>1\relax \@tenstring{\@strctr}% \@strctr=#1\relax \divide\@strctr by 1000\relax \@modulo{\@strctr}{10}% \ifnum\@strctr>0 -\@unitstring{\@strctr}\fi \else \@strctr=#1\relax \divide\@strctr by 1000\relax \@modulo{\@strctr}{10}% \@teenstring{\@strctr}% \fi \@strctr=#1\relax \@modulo{\@strctr}{1000}% \ifnum\@strctr=0\ \@thousandth\else\ \@thousand \fi \else \ifnum\@strctr>0\relax \@unitstring{\@strctr}% \@strctr=#1\relax \@modulo{\@strctr}{1000}% \ifnum\@strctr=0\ \@thousandth\else\ \@thousand\fi \fi \fi \@strctr=#1\relax \@modulo{\@strctr}{1000}% \divide\@strctr by 100 \ifnum\@strctr>0 \ifnum#1>1000 \ \fi\@unitstring{\@strctr}% \@strctr=#1\relax \@modulo{\@strctr}{100}% \ifnum\@strctr=0\ \@hundredth\else\ \@hundred\fi \fi \@strctr=#1\relax \@modulo{\@strctr}{100}% \ifnum#1>100 \ifnum\@strctr>0\ and \fi\fi \ifnum\@strctr>19 \@tmpstrctr=\@strctr \divide\@strctr by 10 \@modulo{\@tmpstrctr}{10}% \ifnum\@tmpstrctr=0 \@tenthstring{\@strctr}\else \@tenstring{\@strctr}\fi \@strctr=#1\relax \@modulo{\@strctr}{10}% \ifnum\@strctr>0 -\@unitthstring{\@strctr}% \fi \else \ifnum\@strctr<10 \ifnum\@strctr=0 \ifnum#1<100 \@unitthstring{\@strctr}\fi \else \@unitthstring{\@strctr}% \fi \else \@modulo{\@strctr}{10}% \@teenthstring{\@strctr}% \fi \fi } \newcommand{\@ordinalstringMenglish}[1]{% \let\@unitthstring=\@@unitthstringenglish \let\@teenthstring=\@@teenthstringenglish \let\@tenthstring=\@@tenthstringenglish \let\@unitstring=\@@unitstringenglish \let\@teenstring=\@@teenstringenglish \let\@tenstring=\@@tenstringenglish \def\@hundred{hundred}\def\@thousand{thousand}% \def\@hundredth{hundredth}\def\@thousandth{thousandth}% \@@ordinalstringenglish{#1}} \let\@ordinalstringFenglish=\@ordinalstringMenglish \newcommand{\@OrdinalstringMenglish}[1]{% \let\@unitthstring=\@@Unitthstringenglish \let\@teenthstring=\@@Teenthstringenglish \let\@tenthstring=\@@Tenthstringenglish \let\@unitstring=\@@Unitstringenglish \let\@teenstring=\@@Teenstringenglish \let\@tenstring=\@@Tenstringenglish \def\@hundred{Hundred}\def\@thousand{Thousand}% \def\@hundredth{Hundredth}\def\@thousandth{Thousandth}% \@@ordinalstringenglish{#1}} \let\@OrdinalstringFenglish=\@OrdinalstringMenglish % \end{macrocode} % \begin{macrocode} % % \end{macrocode} % \begin{macrocode} %<*fc-french.def> % \end{macrocode} % French % \begin{macrocode} \ProvidesFile{fc-french.def}[2005/04/29] % \end{macrocode} % \begin{macrocode} \newcommand{\@@unitstringfrench}[1]{% \ifcase#1\relax zero% \or un% \or deux% \or trois% \or quatre% \or cinq% \or six% \or sept% \or huit% \or neuf% \fi } \newcommand{\@@unitstringFfrench}[1]{% \ifnum#1=1\relax une% \else\@@unitstringfrench{#1}% \fi } \newcommand{\@@tenstringfrench}[1]{% \ifcase#1\relax \or dix% \or vingt% \or trente% \or quarante% \or cinquante% \or soixante% \or septente% \or huitante% \or nonente% \or cent% \fi } \newcommand{\@@teenstringfrench}[1]{% \ifcase#1\relax dix% \or onze% \or douze% \or treize% \or quatorze% \or quinze% \or seize% \or dix-sept% \or dix-huit% \or dix-neuf% \fi } \newcommand{\@@seventiesfrench}[1]{% \@tenstring{6}% \ifnum#1=1\relax \ \@andname\ \else -% \fi \@teenstring{#1}% } \newcommand{\@@eightiesfrench}[1]{% \@unitstring{4}-\@tenstring{2}% \ifnum#1>0 -\@unitstring{#1}% \else s% \fi } \newcommand{\@@ninetiesfrench}[1]{% \@unitstring{4}-\@tenstring{2}-\@teenstring{#1}% } \newcommand{\@@seventiesfrenchswiss}[1]{% \@tenstring{7}% \ifnum#1=1\ \@andname\ \fi \ifnum#1>1-\fi \ifnum#1>0\@unitstring{#1}\fi } \newcommand{\@@eightiesfrenchswiss}[1]{% \@tenstring{8}% \ifnum#1=1\ \@andname\ \fi \ifnum#1>1-\fi \ifnum#1>0\@unitstring{#1}\fi } \newcommand{\@@ninetiesfrenchswiss}[1]{% \@tenstring{9}% \ifnum#1=1\ \@andname\ \fi \ifnum#1>1-\fi \ifnum#1>0\@unitstring{#1}\fi } \newcommand{\@@Unitstringfrench}[1]{% \ifcase#1\relax Zero% \or Un% \or Deux% \or Trois% \or Quatre% \or Cinq% \or Six% \or Sept% \or Huit% \or Neuf% \fi } \newcommand{\@@UnitstringFfrench}[1]{% \ifnum#1=1\relax Une% \else \@@Unitstringfrench{#1}% \fi } \newcommand{\@@Tenstringfrench}[1]{% \ifcase#1\relax \or Dix% \or Vingt% \or Trente% \or Quarante% \or Cinquante% \or Soixante% \or Septente% \or Huitante% \or Nonente% \or Cent% \fi } \newcommand{\@@Teenstringfrench}[1]{% \ifcase#1\relax Dix% \or Onze% \or Douze% \or Treize% \or Quatorze% \or Quinze% \or Seize% \or Dix-Sept% \or Dix-Huit% \or Dix-Neuf% \fi } \newcommand{\@numberstringMfrenchswiss}[1]{% \let\@unitstring=\@@unitstringfrench \let\@teenstring=\@@teenstringfrench \let\@tenstring=\@@tenstringfrench \let\@seventies=\@@seventiesfrenchswiss \let\@eighties=\@@eightiesfrenchswiss \let\@nineties=\@@ninetiesfrenchswiss \def\@hundred{cent}\def\@thousand{mille}% \def\@andname{et}% \@@numberstringfrench{#1}} \newcommand{\@numberstringMfrenchfrance}[1]{% \let\@unitstring=\@@unitstringfrench \let\@teenstring=\@@teenstringfrench \let\@tenstring=\@@tenstringfrench \let\@seventies=\@@seventiesfrench \let\@eighties=\@@eightiesfrench \let\@nineties=\@@ninetiesfrench \def\@hundred{cent}\def\@thousand{mille}% \def\@andname{et}% \@@numberstringfrench{#1}} \newcommand{\@numberstringMfrenchbelgian}[1]{% \let\@unitstring=\@@unitstringfrench \let\@teenstring=\@@teenstringfrench \let\@tenstring=\@@tenstringfrench \let\@seventies=\@@seventiesfrenchswiss \let\@eighties=\@@eightiesfrench \let\@nineties=\@@ninetiesfrench \def\@hundred{cent}\def\@thousand{mille}% \def\@andname{et}% \@@numberstringfrench{#1}} \let\@numberstringMfrench=\@numberstringMfrenchfrance \newcommand{\@numberstringFfrenchswiss}[1]{% \let\@unitstring=\@@unitstringFfrench \let\@teenstring=\@@teenstringfrench \let\@tenstring=\@@tenstringfrench \let\@seventies=\@@seventiesfrenchswiss \let\@eighties=\@@eightiesfrenchswiss \let\@nineties=\@@ninetiesfrenchswiss \def\@hundred{cent}\def\@thousand{mille}% \def\@andname{et}% \@@numberstringfrench{#1}} \newcommand{\@numberstringFfrenchfrance}[1]{% \let\@unitstring=\@@unitstringFfrench \let\@teenstring=\@@teenstringfrench \let\@tenstring=\@@tenstringfrench \let\@seventies=\@@seventiesfrench \let\@eighties=\@@eightiesfrench \let\@nineties=\@@ninetiesfrench \def\@hundred{cent}\def\@thousand{mille}% \def\@andname{et}% \@@numberstringfrench{#1}} \newcommand{\@numberstringFfrenchbelgian}[1]{% \let\@unitstring=\@@unitstringFfrench \let\@teenstring=\@@teenstringfrench \let\@tenstring=\@@tenstringfrench \let\@seventies=\@@seventiesfrenchswiss \let\@eighties=\@@eightiesfrench \let\@nineties=\@@ninetiesfrench \def\@hundred{cent}\def\@thousand{mille}% \def\@andname{et}% \@@numberstringfrench{#1}} \let\@numberstringFfrench=\@numberstringFfrenchfrance \newcommand{\@NumberstringMfrenchswiss}[1]{% \let\@unitstring=\@@Unitstringfrench \let\@teenstring=\@@Teenstringfrench \let\@tenstring=\@@Tenstringfrench \let\@seventies=\@@seventiesfrenchswiss \let\@eighties=\@@eightiesfrenchswiss \let\@nineties=\@@ninetiesfrenchswiss \def\@hundred{Cent}\def\@thousand{Mille}% \def\@andname{et}% \@@numberstringfrench{#1}} \newcommand{\@NumberstringMfrenchfrance}[1]{% \let\@unitstring=\@@Unitstringfrench \let\@teenstring=\@@Teenstringfrench \let\@tenstring=\@@Tenstringfrench \let\@seventies=\@@seventiesfrench \let\@eighties=\@@eightiesfrench \let\@nineties=\@@ninetiesfrench \def\@hundred{Cent}\def\@thousand{Mille}% \def\@andname{et}% \@@numberstringfrench{#1}} \newcommand{\@NumberstringMfrenchbelgian}[1]{% \let\@unitstring=\@@Unitstringfrench \let\@teenstring=\@@Teenstringfrench \let\@tenstring=\@@Tenstringfrench \let\@seventies=\@@seventiesfrenchswiss \let\@eighties=\@@eightiesfrench \let\@nineties=\@@ninetiesfrench \def\@hundred{Cent}\def\@thousand{Mille}% \def\@andname{et}% \@@numberstringfrench{#1}} \let\@NumberstringMfrench=\@NumberstringMfrenchfrance \newcommand{\@NumberstringFfrenchswiss}[1]{% \let\@unitstring=\@@UnitstringFfrench \let\@teenstring=\@@Teenstringfrench \let\@tenstring=\@@Tenstringfrench \let\@seventies=\@@seventiesfrenchswiss \let\@eighties=\@@eightiesfrenchswiss \let\@nineties=\@@ninetiesfrenchswiss \def\@hundred{Cent}\def\@thousand{Mille}% \def\@andname{et}% \@@numberstringfrench{#1}} \newcommand{\@NumberstringFfrenchfrance}[1]{% \let\@unitstring=\@@UnitstringFfrench \let\@teenstring=\@@Teenstringfrench \let\@tenstring=\@@Tenstringfrench \let\@seventies=\@@seventiesfrench \let\@eighties=\@@eightiesfrench \let\@nineties=\@@ninetiesfrench \def\@hundred{Cent}\def\@thousand{Mille}% \def\@andname{et}% \@@numberstringfrench{#1}} \newcommand{\@NumberstringFfrenchbelgian}[1]{% \let\@unitstring=\@@UnitstringFfrench \let\@teenstring=\@@Teenstringfrench \let\@tenstring=\@@Tenstringfrench \let\@seventies=\@@seventiesfrenchswiss \let\@eighties=\@@eightiesfrench \let\@nineties=\@@ninetiesfrench \def\@hundred{Cent}\def\@thousand{Mille}% \def\@andname{et}% \@@numberstringfrench{#1}} \let\@NumberstringFfrench=\@NumberstringFfrenchfrance \newcommand{\@ordinalstringMfrenchswiss}[1]{% \ifnum#1=1\relax premier% \else \let\@unitthstring=\@@unitthstringfrench \let\@unitstring=\@@unitstringfrench \let\@teenthstring=\@@teenthstringfrench \let\@teenstring=\@@teenstringfrench \let\@tenthstring=\@@tenthstringfrench \let\@tenstring=\@@tenstringfrench \let\@seventieths=\@@seventiethsfrenchswiss \let\@eightieths=\@@eightiethsfrenchswiss \let\@ninetieths=\@@ninetiethsfrenchswiss \let\@seventies=\@@seventiesfrenchswiss \let\@eighties=\@@eightiesfrenchswiss \let\@nineties=\@@ninetiesfrenchswiss \def\@hundredth{centi\`eme}\def\@hundred{cent}% \def\@thousandth{mili\`eme}\def\@thousand{mille}% \def\@andname{et}% \@@ordinalstringfrench{#1}% \fi} \newcommand{\@ordinalstringMfrenchfrance}[1]{% \ifnum#1=1\relax premier% \else \let\@unitthstring=\@@unitthstringfrench \let\@unitstring=\@@unitstringfrench \let\@teenthstring=\@@teenthstringfrench \let\@teenstring=\@@teenstringfrench \let\@tenthstring=\@@tenthstringfrench \let\@tenstring=\@@tenstringfrench \let\@seventieths=\@@seventiethsfrench \let\@eightieths=\@@eightiethsfrench \let\@ninetieths=\@@ninetiethsfrench \let\@seventies=\@@seventiesfrench \let\@eighties=\@@eightiesfrench \let\@nineties=\@@ninetiesfrench \let\@teenstring=\@@teenstringfrench \def\@hundredth{centi\`eme}\def\@hundred{cent}% \def\@thousandth{mili\`eme}\def\@thousand{mille}% \def\@andname{et}% \@@ordinalstringfrench{#1}% \fi} \newcommand{\@ordinalstringMfrenchbelgian}[1]{% \ifnum#1=1\relax premier% \else \let\@unitthstring=\@@unitthstringfrench \let\@unitstring=\@@unitstringfrench \let\@teenthstring=\@@teenthstringfrench \let\@teenstring=\@@teenstringfrench \let\@tenthstring=\@@tenthstringfrench \let\@tenstring=\@@tenstringfrench \let\@seventieths=\@@seventiethsfrenchswiss \let\@eightieths=\@@eightiethsfrench \let\@ninetieths=\@@ninetiethsfrenchswiss \let\@seventies=\@@seventiesfrench \let\@eighties=\@@eightiesfrench \let\@nineties=\@@ninetiesfrench \let\@teenstring=\@@teenstringfrench \def\@hundredth{centi\`eme}\def\@hundred{cent}% \def\@thousandth{mili\`eme}\def\@thousand{mille}% \def\@andname{et}% \@@ordinalstringfrench{#1}% \fi} \let\@ordinalstringMfrench=\@ordinalstringMfrenchfrance \newcommand{\@ordinalstringFfrenchswiss}[1]{% \ifnum#1=1\relax premi\`ere% \else \let\@unitthstring=\@@unitthstringfrench \let\@unitstring=\@@unitstringFfrench \let\@teenthstring=\@@teenthstringfrench \let\@teenstring=\@@teenstringfrench \let\@tenthstring=\@@tenthstringfrench \let\@tenstring=\@@tenstringfrench \let\@seventieths=\@@seventiethsfrenchswiss \let\@eightieths=\@@eightiethsfrenchswiss \let\@ninetieths=\@@ninetiethsfrenchswiss \let\@seventies=\@@seventiesfrenchswiss \let\@eighties=\@@eightiesfrenchswiss \let\@nineties=\@@ninetiesfrenchswiss \def\@hundredth{centi\`eme}\def\@hundred{cent}% \def\@thousandth{mili\`eme}\def\@thousand{mille}% \def\@andname{et}% \@@ordinalstringfrench{#1}% \fi} \newcommand{\@ordinalstringFfrenchfrance}[1]{% \ifnum#1=1\relax premi\`ere% \else \let\@unitthstring=\@@unitthstringfrench \let\@unitstring=\@@unitstringFfrench \let\@teenthstring=\@@teenthstringfrench \let\@teenstring=\@@teenstringfrench \let\@tenthstring=\@@tenthstringfrench \let\@tenstring=\@@tenstringfrench \let\@seventieths=\@@seventiethsfrench \let\@eightieths=\@@eightiethsfrench \let\@ninetieths=\@@ninetiethsfrench \let\@seventies=\@@seventiesfrench \let\@eighties=\@@eightiesfrench \let\@nineties=\@@ninetiesfrench \let\@teenstring=\@@teenstringfrench \def\@hundredth{centi\`eme}\def\@hundred{cent}% \def\@thousandth{mili\`eme}\def\@thousand{mille}% \def\@andname{et}% \@@ordinalstringfrench{#1}% \fi} \newcommand{\@ordinalstringFfrenchbelgian}[1]{% \ifnum#1=1\relax premi\`ere% \else \let\@unitthstring=\@@unitthstringfrench \let\@unitstring=\@@unitstringFfrench \let\@teenthstring=\@@teenthstringfrench \let\@teenstring=\@@teenstringfrench \let\@tenthstring=\@@tenthstringfrench \let\@tenstring=\@@tenstringfrench \let\@seventieths=\@@seventiethsfrenchswiss \let\@eightieths=\@@eightiethsfrench \let\@ninetieths=\@@ninetiethsfrench \let\@seventies=\@@seventiesfrench \let\@eighties=\@@eightiesfrench \let\@nineties=\@@ninetiesfrench \let\@teenstring=\@@teenstringfrench \def\@hundredth{centi\`eme}\def\@hundred{cent}% \def\@thousandth{mili\`eme}\def\@thousand{mille}% \def\@andname{et}% \@@ordinalstringfrench{#1}% \fi} \let\@ordinalstringFfrench=\@ordinalstringFfrenchfrance \newcommand{\@OrdinalstringMfrenchswiss}[1]{% \ifnum#1=1\relax Premi\`ere% \else \let\@unitthstring=\@@Unitthstringfrench \let\@unitstring=\@@Unitstringfrench \let\@teenthstring=\@@Teenthstringfrench \let\@teenstring=\@@Teenstringfrench \let\@tenthstring=\@@Tenthstringfrench \let\@tenstring=\@@Tenstringfrench \let\@seventieths=\@@seventiethsfrenchswiss \let\@eightieths=\@@eightiethsfrenchswiss \let\@ninetieths=\@@ninetiethsfrenchswiss \let\@seventies=\@@seventiesfrenchswiss \let\@eighties=\@@eightiesfrenchswiss \let\@nineties=\@@ninetiesfrenchswiss \def\@hundredth{Centi\`eme}\def\@hundred{Cent}% \def\@thousandth{Mili\`eme}\def\@thousand{Mille}% \def\@andname{et}% \@@ordinalstringfrench{#1}% \fi} \newcommand{\@OrdinalstringMfrenchfrance}[1]{% \ifnum#1=1\relax Premi\`ere% \else \let\@unitthstring=\@@Unitthstringfrench \let\@unitstring=\@@Unitstringfrench \let\@teenthstring=\@@Teenthstringfrench \let\@teenstring=\@@Teenstringfrench \let\@tenthstring=\@@Tenthstringfrench \let\@tenstring=\@@Tenstringfrench \let\@seventieths=\@@seventiethsfrench \let\@eightieths=\@@eightiethsfrench \let\@ninetieths=\@@ninetiethsfrench \let\@seventies=\@@seventiesfrench \let\@eighties=\@@eightiesfrench \let\@nineties=\@@ninetiesfrench \let\@teenstring=\@@Teenstringfrench \def\@hundredth{Centi\`eme}\def\@hundred{Cent}% \def\@thousandth{Mili\`eme}\def\@thousand{Mille}% \def\@andname{et}% \@@ordinalstringfrench{#1}% \fi} \newcommand{\@OrdinalstringMfrenchbelgian}[1]{% \ifnum#1=1\relax Premi\`ere% \else \let\@unitthstring=\@@Unitthstringfrench \let\@unitstring=\@@Unitstringfrench \let\@teenthstring=\@@Teenthstringfrench \let\@teenstring=\@@Teenstringfrench \let\@tenthstring=\@@Tenthstringfrench \let\@tenstring=\@@Tenstringfrench \let\@seventieths=\@@seventiethsfrenchswiss \let\@eightieths=\@@eightiethsfrench \let\@ninetieths=\@@ninetiethsfrench \let\@seventies=\@@seventiesfrench \let\@eighties=\@@eightiesfrench \let\@nineties=\@@ninetiesfrench \let\@teenstring=\@@Teenstringfrench \def\@hundredth{Centi\`eme}\def\@hundred{Cent}% \def\@thousandth{Mili\`eme}\def\@thousand{Mille}% \def\@andname{et}% \@@ordinalstringfrench{#1}% \fi} \let\@OrdinalstringMfrench=\@OrdinalstringMfrenchfrance \newcommand{\@OrdinalstringFfrenchswiss}[1]{% \ifnum#1=1\relax Premi\`ere% \else \let\@unitthstring=\@@Unitthstringfrench \let\@unitstring=\@@UnitstringFfrench \let\@teenthstring=\@@Teenthstringfrench \let\@teenstring=\@@Teenstringfrench \let\@tenthstring=\@@Tenthstringfrench \let\@tenstring=\@@Tenstringfrench \let\@seventieths=\@@seventiethsfrenchswiss \let\@eightieths=\@@eightiethsfrenchswiss \let\@ninetieths=\@@ninetiethsfrenchswiss \let\@seventies=\@@seventiesfrenchswiss \let\@eighties=\@@eightiesfrenchswiss \let\@nineties=\@@ninetiesfrenchswiss \def\@hundredth{Centi\`eme}\def\@hundred{Cent}% \def\@thousandth{Mili\`eme}\def\@thousand{Mille}% \def\@andname{et}% \@@ordinalstringfrench{#1}% \fi} \newcommand{\@OrdinalstringFfrenchfrance}[1]{% \ifnum#1=1\relax Premi\`ere% \else \let\@unitthstring=\@@Unitthstringfrench \let\@unitstring=\@@UnitstringFfrench \let\@teenthstring=\@@Teenthstringfrench \let\@teenstring=\@@Teenstringfrench \let\@tenthstring=\@@Tenthstringfrench \let\@tenstring=\@@Tenstringfrench \let\@seventieths=\@@seventiethsfrench \let\@eightieths=\@@eightiethsfrench \let\@ninetieths=\@@ninetiethsfrench \let\@seventies=\@@seventiesfrench \let\@eighties=\@@eightiesfrench \let\@nineties=\@@ninetiesfrench \let\@teenstring=\@@Teenstringfrench \def\@hundredth{Centi\`eme}\def\@hundred{Cent}% \def\@thousandth{Mili\`eme}\def\@thousand{Mille}% \def\@andname{et}% \@@ordinalstringfrench{#1}% \fi} \newcommand{\@OrdinalstringFfrenchbelgian}[1]{% \ifnum#1=1\relax Premi\`ere% \else \let\@unitthstring=\@@Unitthstringfrench \let\@unitstring=\@@UnitstringFfrench \let\@teenthstring=\@@Teenthstringfrench \let\@teenstring=\@@Teenstringfrench \let\@tenthstring=\@@Tenthstringfrench \let\@tenstring=\@@Tenstringfrench \let\@seventieths=\@@seventiethsfrenchswiss \let\@eightieths=\@@eightiethsfrench \let\@ninetieths=\@@ninetiethsfrench \let\@seventies=\@@seventiesfrench \let\@eighties=\@@eightiesfrench \let\@nineties=\@@ninetiesfrench \let\@teenstring=\@@Teenstringfrench \def\@hundredth{Centi\`eme}\def\@hundred{Cent}% \def\@thousandth{Mili\`eme}\def\@thousand{Mille}% \def\@andname{et}% \@@ordinalstringfrench{#1}% \fi} \let\@OrdinalstringFfrench=\@OrdinalstringFfrenchfrance \newcommand{\@ordinalMfrench}[1]{% \iffmtord@abbrv #1\fmtord{e}% \else #1\ifnum#1=1\fmtord{er}\else\fmtord{eme}\fi \fi} \newcommand{\@ordinalFfrench}[1]{% \iffmtord@abbrv #1\fmtord{e}% \else #1\ifnum#1=1\fmtord{ere}\else\fmtord{eme}\fi \fi} \newcommand{\@@unitthstringfrench}[1]{% \ifcase#1\relax zero% \or uni\`eme% \or deuxi\`eme% \or troisi\`eme% \or quatri\`eme% \or cinqui\`eme% \or sixi\`eme% \or septi\`eme% \or huiti\`eme% \or neuvi\`eme% \fi } \newcommand{\@@tenthstringfrench}[1]{% \ifcase#1\relax \or dixi\`eme% \or vingti\`eme% \or trentri\`eme% \or quaranti\`eme% \or cinquanti\`eme% \or soixanti\`eme% \or septenti\`eme% \or huitanti\`eme% \or nonenti\`eme% \fi } \newcommand{\@@teenthstringfrench}[1]{% \ifcase#1\relax dixi\`eme% \or onzi\`eme% \or douzi\`eme% \or treizi\`eme% \or quatorzi\`eme% \or quinzi\`eme% \or seizi\`eme% \or dix-septi\`eme% \or dix-huiti\`eme% \or dix-neuvi\`eme% \fi } \newcommand{\@@seventiethsfrenchswiss}[1]{% \ifcase#1\relax \@tenthstring{7}% \or \@tenstring{7} \@andname\ \@unitthstring{1}% \else \@tenstring{7}-\@unitthstring{#1}% \fi} \newcommand{\@@eightiethsfrenchswiss}[1]{% \ifcase#1\relax \@tenthstring{8}% \or \@tenstring{8} \@andname\ \@unitthstring{1}% \else \@tenstring{8}-\@unitthstring{#1}% \fi} \newcommand{\@@ninetiethsfrenchswiss}[1]{% \ifcase#1\relax \@tenthstring{9}% \or \@tenstring{9} \@andname\ \@unitthstring{1}% \else \@tenstring{9}-\@unitthstring{#1}% \fi} \newcommand{\@@seventiethsfrench}[1]{% \ifnum#1=0\relax \@tenstring{6}% -% \else \@tenstring{6}% \ \@andname\ \fi \@teenthstring{#1}% } \newcommand{\@@eightiethsfrench}[1]{% \ifnum#1>0\relax \@unitstring{4}-\@tenstring{2}% -\@unitthstring{#1}% \else \@unitstring{4}-\@tenthstring{2}% \fi } \newcommand{\@@ninetiethsfrench}[1]{% \@unitstring{4}-\@tenstring{2}-\@teenthstring{#1}% } \newcommand{\@@Unitthstringfrench}[1]{% \ifcase#1\relax Zero% \or Uni\`eme% \or Deuxi\`eme% \or Troisi\`eme% \or Quatri\`eme% \or Cinqui\`eme% \or Sixi\`eme% \or Septi\`eme% \or Huiti\`eme% \or Neuvi\`eme% \fi } \newcommand{\@@Tenthstringfrench}[1]{% \ifcase#1\relax \or Dixi\`eme% \or Vingti\`eme% \or Trentri\`eme% \or Quaranti\`eme% \or Cinquanti\`eme% \or Soixanti\`eme% \or Septenti\`eme% \or Huitanti\`eme% \or Nonenti\`eme% \fi } \newcommand{\@@Teenthstringfrench}[1]{% \ifcase#1\relax Dixi\`eme% \or Onzi\`eme% \or Douzi\`eme% \or Treizi\`eme% \or Quatorzi\`eme% \or Quinzi\`eme% \or Seizi\`eme% \or Dix-Septi\`eme% \or Dix-Huiti\`eme% \or Dix-Neuvi\`eme% \fi } % \end{macrocode} % \begin{macrocode} \newcommand{\@@numberstringfrench}[1]{% \ifnum#1>99999 \PackageError{fmtcount}{Out of range}% {This macro only works for values less than 100000}% \else \ifnum#1<0 \PackageError{fmtcount}{Negative numbers not permitted}% {This macro does not work for negative numbers, however you can try typing "minus" first, and then pass the modulus of this number}% \fi \fi \@strctr=#1\relax \divide\@strctr by 1000\relax \ifnum\@strctr>9 % #1 is greater or equal to 10000 \@tmpstrctr=\@strctr \divide\@strctr by 10 \ifnum\@strctr>1 \ifthenelse{\(\@strctr>6\)\and\(\@strctr<10\)}{% \@modulo{\@tmpstrctr}{10}% \ifnum\@strctr<8\relax \@seventies{\@tmpstrctr}% \else \ifnum\@strctr<9\relax \@eighties{\@tmpstrctr}% \else \ifnum\@strctr<10\@nineties{\@tmpstrctr}\fi \fi \fi }{% \@tenstring{\@strctr}% \@strctr=#1\relax \divide\@strctr by 1000\relax \@modulo{\@strctr}{10}% \ifnum\@strctr>0\relax % \ifnum\@strctr=1\ \@andname\fi \ \@unitstring{\@strctr}% \fi }% \else \@strctr=#1\relax \divide\@strctr by 1000 \@modulo{\@strctr}{10}% \@teenstring{\@strctr}% \fi \ \@thousand% \else \ifnum\@strctr>0 \ifnum\@strctr>1\@unitstring{\@strctr}\ \fi \@thousand \fi \fi \@strctr=#1\relax \@modulo{\@strctr}{1000}% \divide\@strctr by 100 \ifnum\@strctr>0\relax \ifnum#1>1000 \ \fi \@tmpstrctr=#1\relax \@modulo{\@tmpstrctr}{1000}\relax \ifnum\@tmpstrctr=100\relax \@tenstring{10}\relax \else \ifnum\@strctr>1\@unitstring{\@strctr}\ \fi \@hundred \fi \fi \@strctr=#1\relax \@modulo{\@strctr}{100}% %\@tmpstrctr=#1\relax %\divide\@tmpstrctr by 100\relax \ifnum#1>100\relax \ifnum\@strctr>0\relax \ % \ \@andname\ \else \ifnum\@tmpstrctr>0s\fi% \fi \fi \ifnum\@strctr>19 \@tmpstrctr=\@strctr \divide\@strctr by 10 \ifthenelse{\@strctr>6}{% \@modulo{\@tmpstrctr}{10}% \ifnum\@strctr<8 \@seventies{\@tmpstrctr}% \else \ifnum\@strctr<9 \@eighties{\@tmpstrctr}% \else \@nineties{\@tmpstrctr}% \fi \fi }{% \@tenstring{\@strctr}% \@strctr=#1\relax \@modulo{\@strctr}{10}% \ifnum\@strctr>0\relax \ifnum\@strctr=1\ \@andname\ \else-\fi \@unitstring{\@strctr}% \fi }% \else \ifnum\@strctr<10 \ifnum\@strctr=0 \ifnum#1<100 \@unitstring{\@strctr}\fi \else%(>0,<10) \@unitstring{\@strctr}% \fi \else%>10 \@modulo{\@strctr}{10}% \@teenstring{\@strctr}% \fi \fi } % \end{macrocode} % \begin{macrocode} \newcommand{\@@ordinalstringfrench}[1]{% \ifnum#1>99999 \PackageError{fmtcount}{Out of range}% {This macro only works for values less than 100000}% \else \ifnum#1<0 \PackageError{fmtcount}{Negative numbers not permitted}% {This macro does not work for negative numbers, however you can try typing "minus" first, and then pass the modulus of this number}% \fi \fi \@strctr=#1\relax \divide\@strctr by 1000\relax \ifnum\@strctr>9 % #1 is greater or equal to 10000 \@tmpstrctr=\@strctr \divide\@strctr by 10\relax \ifnum\@strctr>1\relax \ifthenelse{\@strctr>6}{% \@modulo{\@tmpstrctr}{10}% \ifnum\@strctr=7\relax \@seventies{\@tmpstrctr}% \else \ifnum\@strctr=8\relax \@eighties{\@tmpstrctr}% \else \@nineties{\@tmpstrctr}% \fi \fi }{% \@tenstring{\@strctr}% \@strctr=#1\relax \divide\@strctr by 1000\relax \@modulo{\@strctr}{10}% \ifnum\@strctr=1\ \@andname\fi \ifnum\@strctr>0\ \@unitstring{\@strctr}\fi }% \else \@strctr=#1\relax \divide\@strctr by 1000\relax \@modulo{\@strctr}{10}% \@teenstring{\@strctr}% \fi \@strctr=#1\relax \@modulo{\@strctr}{1000}% \ifnum\@strctr=0\ \@thousandth\else\ \@thousand \fi \else \ifnum\@strctr>0\relax \@unitstring{\@strctr}% \@strctr=#1\relax \@modulo{\@strctr}{1000}% \ifnum\@strctr=0\ \@thousandth\else\ \@thousand\fi \fi \fi \@strctr=#1\relax \@modulo{\@strctr}{1000}% \divide\@strctr by 100 \ifnum\@strctr>0 \ifnum#1>1000 \ \fi\@unitstring{\@strctr}% \@strctr=#1\relax \@modulo{\@strctr}{100}% \ifnum\@strctr=0\ \@hundredth\else\ \@hundred\fi \fi \@tmpstrctr=\@strctr \@strctr=#1\relax \@modulo{\@strctr}{100}% \ifnum#1>100\relax \ifnum\@strctr>0\ \@andname\ \fi\fi \ifnum\@strctr>19 \@tmpstrctr=\@strctr \divide\@strctr by 10 \@modulo{\@tmpstrctr}{10}% \ifthenelse{\@strctr>6}{% \ifnum\@strctr=7\relax \@seventieths{\@tmpstrctr}% \else \ifnum\@strctr=8\relax \@eightieths{\@tmpstrctr}% \else \@ninetieths{\@tmpstrctr}% \fi \fi }{% \ifnum\@tmpstrctr=0\relax \@tenthstring{\@strctr}% \else \@tenstring{\@strctr}% \fi \@strctr=#1\relax \@modulo{\@strctr}{10}% \ifnum\@strctr=1\ \@andname\fi \ifnum\@strctr>0 \ \@unitthstring{\@strctr}% \fi }% \else \ifnum\@strctr<10 \ifnum\@strctr=0 \ifnum#1<100 \@unitthstring{\@strctr}\fi \else \@unitthstring{\@strctr}% \fi \else \@modulo{\@strctr}{10}% \@teenthstring{\@strctr}% \fi \fi } % \end{macrocode} % \begin{macrocode} % % \end{macrocode} % \begin{macrocode} %<*fc-portuges.def> % \end{macrocode} % Portuguse % \begin{macrocode} \ProvidesFile{fc-portuges.def}[2005/04/29] % \end{macrocode} % \begin{macrocode} \newcommand{\@@unitstringportuges}[1]{% \ifcase#1\relax zero% \or um% \or dois% \or tr\`es% \or quatro% \or cinco% \or seis% \or sete% \or oito% \or nove% \fi } \newcommand{\@@unitstringFportuges}[1]{% \ifcase#1\relax zero% \or uma% \or duas% \or tr\`es% \or quatro% \or cinco% \or seis% \or sete% \or oito% \or nove% \fi } \newcommand{\@@tenstringportuges}[1]{% \ifcase#1\relax \or dez% \or vinte% \or trinta% \or quarenta% \or cinq\"uenta% \or sessenta% \or setenta% \or oitenta% \or noventa% \or cem% \fi } \newcommand{\@@teenstringportuges}[1]{% \ifcase#1\relax dez% \or onze% \or doze% \or treze% \or quatorze% \or quinze% \or dezesseis% \or dezessete% \or dezoito% \or dezenove% \fi } \newcommand{\@@hundredstringportuges}[1]{% \ifcase#1\relax \or cento% \or duzentos% \or trezentos% \or quatrocentos% \or quinhentos% \or seiscentos% \or setecentos% \or oitocentos% \or novecentos% \fi} \newcommand{\@@hundredstringFportuges}[1]{% \ifcase#1\relax \or centa% \or duzentas% \or trezentas% \or quatrocentas% \or quinhentas% \or seiscentas% \or setecentas% \or oitocentas% \or novecentas% \fi} \newcommand{\@@Unitstringportuges}[1]{% \ifcase#1\relax Zero% \or Um% \or Dois% \or Tr\`es% \or Quatro% \or Cinco% \or Seis% \or Sete% \or Oito% \or Nove% \fi } \newcommand{\@@UnitstringFportuges}[1]{% \ifcase#1\relax Zera% \or Uma% \or Duas% \or Tr\`es% \or Quatro% \or Cinco% \or Seis% \or Sete% \or Oito% \or Nove% \fi } \newcommand{\@@Tenstringportuges}[1]{% \ifcase#1\relax \or Dez% \or Vinte% \or Trinta% \or Quarenta% \or Cinq\"uenta% \or Sessenta% \or Setenta% \or Oitenta% \or Noventa% \or Cem% \fi } \newcommand{\@@Teenstringportuges}[1]{% \ifcase#1\relax Dez% \or Onze% \or Doze% \or Treze% \or Quatorze% \or Quinze% \or Dezesseis% \or Dezessete% \or Dezoito% \or Dezenove% \fi } \newcommand{\@@Hundredstringportuges}[1]{% \ifcase#1\relax \or Cento% \or Duzentos% \or Trezentos% \or Quatrocentos% \or Quinhentos% \or Seiscentos% \or Setecentos% \or Oitocentos% \or Novecentos% \fi} \newcommand{\@@HundredstringFportuges}[1]{% \ifcase#1\relax \or Centa% \or Duzentas% \or Trezentas% \or Quatrocentas% \or Quinhentas% \or Seiscentas% \or Setecentas% \or Oitocentas% \or Novecentas% \fi} \newcommand{\@numberstringMportuges}[1]{% \let\@unitstring=\@@unitstringportuges \let\@teenstring=\@@teenstringportuges \let\@tenstring=\@@tenstringportuges \let\@hundredstring=\@@hundredstringportuges \def\@hundred{cem}\def\@thousand{mil}% \def\@andname{e}% \@@numberstringportuges{#1}} \newcommand{\@numberstringFportuges}[1]{% \let\@unitstring=\@@unitstringFportuges \let\@teenstring=\@@teenstringportuges \let\@tenstring=\@@tenstringportuges \let\@hundredstring=\@@hundredstringFportuges \def\@hundred{cem}\def\@thousand{mil}% \def\@andname{e}% \@@numberstringportuges{#1}} \newcommand{\@NumberstringMportuges}[1]{% \let\@unitstring=\@@Unitstringportuges \let\@teenstring=\@@Teenstringportuges \let\@tenstring=\@@Tenstringportuges \let\@hundredstring=\@@Hundredstringportuges \def\@hundred{Cem}\def\@thousand{Mil}% \def\@andname{e}% \@@numberstringportuges{#1}} \newcommand{\@NumberstringFportuges}[1]{% \let\@unitstring=\@@UnitstringFportuges \let\@teenstring=\@@Teenstringportuges \let\@tenstring=\@@Tenstringportuges \let\@hundredstring=\@@HundredstringFportuges \def\@hundred{Cem}\def\@thousand{Mil}% \def\@andname{e}% \@@numberstringportuges{#1}} \newcommand{\@ordinalstringMportuges}[1]{% \let\@unitthstring=\@@unitthstringportuges \let\@unitstring=\@@unitstringportuges \let\@teenthstring=\@@teenthstringportuges \let\@tenthstring=\@@tenthstringportuges \let\@hundredthstring=\@@hundredthstringportuges \def\@thousandth{mil\'esimo}% \@@ordinalstringportuges{#1}} \newcommand{\@ordinalstringFportuges}[1]{% \let\@unitthstring=\@@unitthstringFportuges \let\@unitstring=\@@unitstringFportuges \let\@teenthstring=\@@teenthstringportuges \let\@tenthstring=\@@tenthstringFportuges \let\@hundredthstring=\@@hundredthstringFportuges \def\@thousandth{mil\'esima}% \@@ordinalstringportuges{#1}} \newcommand{\@OrdinalstringMportuges}[1]{% \let\@unitthstring=\@@Unitthstringportuges \let\@unitstring=\@@Unitstringportuges \let\@teenthstring=\@@teenthstringportuges \let\@tenthstring=\@@Tenthstringportuges \let\@hundredthstring=\@@Hundredthstringportuges \def\@thousandth{Mil\'esimo}% \@@ordinalstringportuges{#1}} \newcommand{\@OrdinalstringFportuges}[1]{% \let\@unitthstring=\@@UnitthstringFportuges \let\@unitstring=\@@UnitstringFportuges \let\@teenthstring=\@@teenthstringportuges \let\@tenthstring=\@@TenthstringFportuges \let\@hundredthstring=\@@HundredthstringFportuges \def\@thousandth{Mil\'esima}% \@@ordinalstringportuges{#1}} \newcommand{\@ordinalMportuges}[1]{% #1\ifnum#1=0\else\fmtord{o}\fi} \newcommand{\@ordinalFportuges}[1]{% #1\ifnum#1=0\else\fmtord{a}\fi} \newcommand{\@@unitthstringportuges}[1]{% \ifcase#1\relax zero% \or primeiro% \or segundo% \or terceiro% \or quarto% \or quinto% \or sexto% \or s\'etimo% \or oitavo% \or nono% \fi } \newcommand{\@@tenthstringportuges}[1]{% \ifcase#1\relax \or d\'ecimo% \or vig\'esimo% \or trig\'esimo% \or quadrag\'esimo% \or q\"uinquag\'esimo% \or sexag\'esimo% \or setuag\'esimo% \or octog\'esimo% \or nonag\'esimo% \fi } \newcommand{\@@teenthstringportuges}[1]{% \@tenthstring{1}% \ifnum#1>0\relax -\@unitthstring{#1}% \fi} \newcommand{\@@hundredthstringportuges}[1]{% \ifcase#1\relax \or cent\'esimo% \or ducent\'esimo% \or trecent\'esimo% \or quadringent\'esimo% \or q\"uingent\'esimo% \or seiscent\'esimo% \or setingent\'esimo% \or octingent\'esimo% \or nongent\'esimo% \fi} \newcommand{\@@unitthstringFportuges}[1]{% \ifcase#1\relax zero% \or primeira% \or segunda% \or terceira% \or quarta% \or quinta% \or sexta% \or s\'etima% \or oitava% \or nona% \fi } \newcommand{\@@tenthstringFportuges}[1]{% \ifcase#1\relax \or d\'ecima% \or vig\'esima% \or trig\'esima% \or quadrag\'esima% \or q\"uinquag\'esima% \or sexag\'esima% \or setuag\'esima% \or octog\'esima% \or nonag\'esima% \fi } \newcommand{\@@hundredthstringFportuges}[1]{% \ifcase#1\relax \or cent\'esima% \or ducent\'esima% \or trecent\'esima% \or quadringent\'esima% \or q\"uingent\'esima% \or seiscent\'esima% \or setingent\'esima% \or octingent\'esima% \or nongent\'esima% \fi} \newcommand{\@@Unitthstringportuges}[1]{% \ifcase#1\relax Zero% \or Primeiro% \or Segundo% \or Terceiro% \or Quarto% \or Quinto% \or Sexto% \or S\'etimo% \or Oitavo% \or Nono% \fi } \newcommand{\@@Tenthstringportuges}[1]{% \ifcase#1\relax \or D\'ecimo% \or Vig\'esimo% \or Trig\'esimo% \or Quadrag\'esimo% \or Q\"uinquag\'esimo% \or Sexag\'esimo% \or Setuag\'esimo% \or Octog\'esimo% \or Nonag\'esimo% \fi } \newcommand{\@@Hundredthstringportuges}[1]{% \ifcase#1\relax \or Cent\'esimo% \or Ducent\'esimo% \or Trecent\'esimo% \or Quadringent\'esimo% \or Q\"uingent\'esimo% \or Seiscent\'esimo% \or Setingent\'esimo% \or Octingent\'esimo% \or Nongent\'esimo% \fi} \newcommand{\@@UnitthstringFportuges}[1]{% \ifcase#1\relax Zera% \or Primeira% \or Segunda% \or Terceira% \or Quarta% \or Quinta% \or Sexta% \or S\'etima% \or Oitava% \or Nona% \fi } \newcommand{\@@TenthstringFportuges}[1]{% \ifcase#1\relax \or D\'ecima% \or Vig\'esima% \or Trig\'esima% \or Quadrag\'esima% \or Q\"uinquag\'esima% \or Sexag\'esima% \or Setuag\'esima% \or Octog\'esima% \or Nonag\'esima% \fi } \newcommand{\@@HundredthstringFportuges}[1]{% \ifcase#1\relax \or Cent\'esima% \or Ducent\'esima% \or Trecent\'esima% \or Quadringent\'esima% \or Q\"uingent\'esima% \or Seiscent\'esima% \or Setingent\'esima% \or Octingent\'esima% \or Nongent\'esima% \fi} % \end{macrocode} % \begin{macrocode} \newcommand{\@@numberstringportuges}[1]{% \ifnum#1>99999 \PackageError{fmtcount}{Out of range}% {This macro only works for values less than 100000}% \else \ifnum#1<0 \PackageError{fmtcount}{Negative numbers not permitted}% {This macro does not work for negative numbers, however you can try typing "minus" first, and then pass the modulus of this number}% \fi \fi \@strctr=#1\relax \divide\@strctr by 1000\relax \ifnum\@strctr>9 % #1 is greater or equal to 10000 \divide\@strctr by 10 \ifnum\@strctr>1 \@tenstring{\@strctr}% \@strctr=#1 \divide\@strctr by 1000\relax \@modulo{\@strctr}{10}% \ifnum\@strctr>0 \ifnum\@strctr=1\ \@andname\fi \ \@unitstring{\@strctr}% \fi \else \@strctr=#1\relax \divide\@strctr by 1000\relax \@modulo{\@strctr}{10}% \@teenstring{\@strctr}% \fi \ \@thousand% \else \ifnum\@strctr>0 \ifnum\@strctr>1\@unitstring{\@strctr}\ \fi \@thousand \fi \fi \@strctr=#1\relax \@modulo{\@strctr}{1000}% \divide\@strctr by 100 \ifnum\@strctr>0 \ifnum#1>1000 \ \fi \@tmpstrctr=#1\relax \@modulo{\@tmpstrctr}{1000}% \ifnum\@tmpstrctr=100\@tenstring{10}\else\@hundredstring{\@strctr}\fi% \fi \@strctr=#1\relax \@modulo{\@strctr}{100}% \ifnum#1>100 \ifnum\@strctr>0\ \@andname\ \fi\fi \ifnum\@strctr>19 \divide\@strctr by 10 \@tenstring{\@strctr}% \@strctr=#1\relax \@modulo{\@strctr}{10}% \ifnum\@strctr>0 \ifnum\@strctr=1\ \@andname\else\ifnum#1>100\ \@andname\fi\fi \ \@unitstring{\@strctr}% \fi \else \ifnum\@strctr<10 \ifnum\@strctr=0 \ifnum#1<100 \@unitstring{\@strctr}\fi \else%(>0,<10) \@unitstring{\@strctr}% \fi \else%>10 \@modulo{\@strctr}{10}% \@teenstring{\@strctr}% \fi \fi } % \end{macrocode} % \begin{macrocode} \newcommand{\@@ordinalstringportuges}[1]{% \@strctr=#1\relax \ifnum#1>99999 \PackageError{fmtcount}{Out of range}% {This macro only works for values less than 100000}% \else \ifnum#1<0 \PackageError{fmtcount}{Negative numbers not permitted}% {This macro does not work for negative numbers, however you can try typing "minus" first, and then pass the modulus of this number}% \else \ifnum\@strctr>999\relax \divide\@strctr by 1000\relax \ifnum\@strctr>1\relax \ifnum\@strctr>9\relax \@tmpstrctr=\@strctr \ifnum\@strctr<20 \@modulo{\@tmpstrctr}{10}% \@teenthstring{\@tmpstrctr} \else \divide\@tmpstrctr by 10\relax \@tenthstring{\@tmpstrctr} \@tmpstrctr=\@strctr \@modulo{\@tmpstrctr}{10}% \ifnum\@tmpstrctr>0\@unitthstring{\@tmpstrctr} \fi \fi \else \@unitstring{\@strctr} \fi \fi \@thousandth \fi \@strctr=#1\relax \@modulo{\@strctr}{1000}% \ifnum\@strctr>99\relax \@tmpstrctr=\@strctr \divide\@tmpstrctr by 100\relax \ifnum#1>1000-\fi \@hundredthstring{\@tmpstrctr}% \fi \@modulo{\@strctr}{100}% \ifnum#1>99\ifnum\@strctr>0-\fi\fi \ifnum\@strctr>9\relax \@tmpstrctr=\@strctr \divide\@tmpstrctr by 10\relax \@tenthstring{\@tmpstrctr}% \@tmpstrctr=\@strctr \@modulo{\@tmpstrctr}{10}% \ifnum\@tmpstrctr>0-\@unitthstring{\@tmpstrctr}\fi \else \ifnum\@strctr=0\relax \ifnum#1=0\@unitstring{0}\fi \else \@unitthstring{\@strctr}% \fi \fi \fi \fi } % \end{macrocode} % \begin{macrocode} % % \end{macrocode} % \begin{macrocode} %<*fc-spanish.def> % \end{macrocode} % Spanish % \begin{macrocode} \ProvidesFile{fc-spanish.def}[2005/04/29] % \end{macrocode} % \begin{macrocode} \newcommand{\@@unitstringspanish}[1]{% \ifcase#1\relax cero% \or uno% \or dos% \or tres% \or cuatro% \or cinco% \or seis% \or siete% \or ocho% \or nueve% \fi } \newcommand{\@@unitstringFspanish}[1]{% \ifcase#1\relax cera% \or una% \or dos% \or tres% \or cuatro% \or cinco% \or seis% \or siete% \or ocho% \or nueve% \fi } \newcommand{\@@tenstringspanish}[1]{% \ifcase#1\relax \or diez% \or viente% \or treinta% \or cuarenta% \or cincuenta% \or sesenta% \or setenta% \or ochenta% \or noventa% \or cien% \fi } \newcommand{\@@teenstringspanish}[1]{% \ifcase#1\relax diez% \or once% \or doce% \or trece% \or catorce% \or quince% \or diecis\'eis% \or diecisiete% \or dieciocho% \or diecinueve% \fi } \newcommand{\@@twentystringspanish}[1]{% \ifcase#1\relax veinte% \or veintiuno% \or veintid\'os% \or veintitr\'es% \or veinticuatro% \or veinticinco% \or veintis\'eis% \or veintisiete% \or veintiocho% \or veintinueve% \fi} \newcommand{\@@twentystringFspanish}[1]{% \ifcase#1\relax veinte% \or veintiuna% \or veintid\'os% \or veintitr\'es% \or veinticuatro% \or veinticinco% \or veintis\'eis% \or veintisiete% \or veintiocho% \or veintinueve% \fi} \newcommand{\@@hundredstringspanish}[1]{% \ifcase#1\relax \or ciento% \or doscientos% \or trescientos% \or cuatrocientos% \or quinientos% \or seiscientos% \or setecientos% \or ochocientos% \or novecientos% \fi} \newcommand{\@@hundredstringFspanish}[1]{% \ifcase#1\relax \or cienta% \or doscientas% \or trescientas% \or cuatrocientas% \or quinientas% \or seiscientas% \or setecientas% \or ochocientas% \or novecientas% \fi} \newcommand{\@@Unitstringspanish}[1]{% \ifcase#1\relax Cero% \or Uno% \or Dos% \or Tres% \or Cuatro% \or Cinco% \or Seis% \or Siete% \or Ocho% \or Nueve% \fi } \newcommand{\@@UnitstringFspanish}[1]{% \ifcase#1\relax Cera% \or Una% \or Dos% \or Tres% \or Cuatro% \or Cinco% \or Seis% \or Siete% \or Ocho% \or Nueve% \fi } \newcommand{\@@Tenstringspanish}[1]{% \ifcase#1\relax \or Diez% \or Viente% \or Treinta% \or Cuarenta% \or Cincuenta% \or Sesenta% \or Setenta% \or Ochenta% \or Noventa% \or Cien% \fi } \newcommand{\@@Teenstringspanish}[1]{% \ifcase#1\relax Diez% \or Once% \or Doce% \or Trece% \or Catorce% \or Quince% \or Diecis\'eis% \or Diecisiete% \or Dieciocho% \or Diecinueve% \fi } \newcommand{\@@Twentystringspanish}[1]{% \ifcase#1\relax Veinte% \or Veintiuno% \or Veintid\'os% \or Veintitr\'es% \or Veinticuatro% \or Veinticinco% \or Veintis\'eis% \or Veintisiete% \or Veintiocho% \or Veintinueve% \fi} \newcommand{\@@TwentystringFspanish}[1]{% \ifcase#1\relax Veinte% \or Veintiuna% \or Veintid\'os% \or Veintitr\'es% \or Veinticuatro% \or Veinticinco% \or Veintis\'eis% \or Veintisiete% \or Veintiocho% \or Veintinueve% \fi} \newcommand{\@@Hundredstringspanish}[1]{% \ifcase#1\relax \or Ciento% \or Doscientos% \or Trescientos% \or Cuatrocientos% \or Quinientos% \or Seiscientos% \or Setecientos% \or Ochocientos% \or Novecientos% \fi} \newcommand{\@@HundredstringFspanish}[1]{% \ifcase#1\relax \or Cienta% \or Doscientas% \or Trescientas% \or Cuatrocientas% \or Quinientas% \or Seiscientas% \or Setecientas% \or Ochocientas% \or Novecientas% \fi} \newcommand{\@numberstringMspanish}[1]{% \let\@unitstring=\@@unitstringspanish \let\@teenstring=\@@teenstringspanish \let\@tenstring=\@@tenstringspanish \let\@twentystring=\@@twentystringspanish \let\@hundredstring=\@@hundredstringspanish \def\@hundred{cien}\def\@thousand{mil}% \def\@andname{y}% \@@numberstringspanish{#1}} \newcommand{\@numberstringFspanish}[1]{% \let\@unitstring=\@@unitstringFspanish \let\@teenstring=\@@teenstringspanish \let\@tenstring=\@@tenstringspanish \let\@twentystring=\@@twentystringFspanish \let\@hundredstring=\@@hundredstringFspanish \def\@hundred{cien}\def\@thousand{mil}% \def\@andname{y}% \@@numberstringspanish{#1}} \newcommand{\@NumberstringMspanish}[1]{% \let\@unitstring=\@@Unitstringspanish \let\@teenstring=\@@Teenstringspanish \let\@tenstring=\@@Tenstringspanish \let\@twentystring=\@@Twentystringspanish \let\@hundredstring=\@@Hundredstringspanish \def\@andname{y}% \def\@hundred{Cien}\def\@thousand{Mil}% \@@numberstringspanish{#1}} \newcommand{\@NumberstringFspanish}[1]{% \let\@unitstring=\@@UnitstringFspanish \let\@teenstring=\@@Teenstringspanish \let\@tenstring=\@@Tenstringspanish \let\@twentystring=\@@TwentystringFspanish \let\@hundredstring=\@@HundredstringFspanish \def\@andname{y}% \def\@hundred{Cien}\def\@thousand{Mil}% \@@numberstringspanish{#1}} \newcommand{\@ordinalstringMspanish}[1]{% \let\@unitthstring=\@@unitthstringspanish \let\@unitstring=\@@unitstringspanish \let\@teenthstring=\@@teenthstringspanish \let\@tenthstring=\@@tenthstringspanish \let\@hundredthstring=\@@hundredthstringspanish \def\@thousandth{mil\'esimo}% \@@ordinalstringspanish{#1}} \newcommand{\@ordinalstringFspanish}[1]{% \let\@unitthstring=\@@unitthstringFspanish \let\@unitstring=\@@unitstringFspanish \let\@teenthstring=\@@teenthstringFspanish \let\@tenthstring=\@@tenthstringFspanish \let\@hundredthstring=\@@hundredthstringFspanish \def\@thousandth{mil\'esima}% \@@ordinalstringspanish{#1}} \newcommand{\@OrdinalstringMspanish}[1]{% \let\@unitthstring=\@@Unitthstringspanish \let\@unitstring=\@@Unitstringspanish \let\@teenthstring=\@@Teenthstringspanish \let\@tenthstring=\@@Tenthstringspanish \let\@hundredthstring=\@@Hundredthstringspanish \def\@thousandth{Mil\'esimo}% \@@ordinalstringspanish{#1}} \newcommand{\@OrdinalstringFspanish}[1]{% \let\@unitthstring=\@@UnitthstringFspanish \let\@unitstring=\@@UnitstringFspanish \let\@teenthstring=\@@TeenthstringFspanish \let\@tenthstring=\@@TenthstringFspanish \let\@hundredthstring=\@@HundredthstringFspanish \def\@thousandth{Mil\'esima}% \@@ordinalstringspanish{#1}} \newcommand{\@ordinalMspanish}[1]{#1\fmtord{o}} \newcommand{\@ordinalFspanish}[1]{#1\fmtord{a}} \newcommand{\@@unitthstringspanish}[1]{% \ifcase#1\relax cero% \or primero% \or segundo% \or tercero% \or cuarto% \or quinto% \or sexto% \or s\'eptimo% \or octavo% \or noveno% \fi } \newcommand{\@@tenthstringspanish}[1]{% \ifcase#1\relax \or d\'ecimo% \or vig\'esimo% \or trig\'esimo% \or cuadrag\'esimo% \or quincuag\'esimo% \or sexag\'esimo% \or septuag\'esimo% \or octog\'esimo% \or nonag\'esimo% \fi } \newcommand{\@@teenthstringspanish}[1]{% \ifcase#1\relax d\'ecimo% \or und\'ecimo% \or duod\'ecimo% \or decimotercero% \or decimocuarto% \or decimoquinto% \or decimosexto% \or decimos\'eptimo% \or decimoctavo% \or decimonoveno% \fi } \newcommand{\@@hundredthstringspanish}[1]{% \ifcase#1\relax \or cent\'esimo% \or ducent\'esimo% \or tricent\'esimo% \or cuadringent\'esimo% \or quingent\'esimo% \or sexcent\'esimo% \or septing\'esimo% \or octingent\'esimo% \or noningent\'esimo% \fi} \newcommand{\@@unitthstringFspanish}[1]{% \ifcase#1\relax cera% \or primera% \or segunda% \or tercera% \or cuarta% \or quinta% \or sexta% \or s\'eptima% \or octava% \or novena% \fi } \newcommand{\@@tenthstringFspanish}[1]{% \ifcase#1\relax \or d\'ecima% \or vig\'esima% \or trig\'esima% \or cuadrag\'esima% \or quincuag\'esima% \or sexag\'esima% \or septuag\'esima% \or octog\'esima% \or nonag\'esima% \fi } \newcommand{\@@teenthstringFspanish}[1]{% \ifcase#1\relax d\'ecima% \or und\'ecima% \or duod\'ecima% \or decimotercera% \or decimocuarta% \or decimoquinta% \or decimosexta% \or decimos\'eptima% \or decimoctava% \or decimonovena% \fi } \newcommand{\@@hundredthstringFspanish}[1]{% \ifcase#1\relax \or cent\'esima% \or ducent\'esima% \or tricent\'esima% \or cuadringent\'esima% \or quingent\'esima% \or sexcent\'esima% \or septing\'esima% \or octingent\'esima% \or noningent\'esima% \fi} \newcommand{\@@Unitthstringspanish}[1]{% \ifcase#1\relax Cero% \or Primero% \or Segundo% \or Tercero% \or Cuarto% \or Quinto% \or Sexto% \or S\'eptimo% \or Octavo% \or Noveno% \fi } \newcommand{\@@Tenthstringspanish}[1]{% \ifcase#1\relax \or D\'ecimo% \or Vig\'esimo% \or Trig\'esimo% \or Cuadrag\'esimo% \or Quincuag\'esimo% \or Sexag\'esimo% \or Septuag\'esimo% \or Octog\'esimo% \or Nonag\'esimo% \fi } \newcommand{\@@Teenthstringspanish}[1]{% \ifcase#1\relax D\'ecimo% \or Und\'ecimo% \or Duod\'ecimo% \or Decimotercero% \or Decimocuarto% \or Decimoquinto% \or Decimosexto% \or Decimos\'eptimo% \or Decimoctavo% \or Decimonoveno% \fi } \newcommand{\@@Hundredthstringspanish}[1]{% \ifcase#1\relax \or Cent\'esimo% \or Ducent\'esimo% \or Tricent\'esimo% \or Cuadringent\'esimo% \or Quingent\'esimo% \or Sexcent\'esimo% \or Septing\'esimo% \or Octingent\'esimo% \or Noningent\'esimo% \fi} \newcommand{\@@UnitthstringFspanish}[1]{% \ifcase#1\relax Cera% \or Primera% \or Segunda% \or Tercera% \or Cuarta% \or Quinta% \or Sexta% \or S\'eptima% \or Octava% \or Novena% \fi } \newcommand{\@@TenthstringFspanish}[1]{% \ifcase#1\relax \or D\'ecima% \or Vig\'esima% \or Trig\'esima% \or Cuadrag\'esima% \or Quincuag\'esima% \or Sexag\'esima% \or Septuag\'esima% \or Octog\'esima% \or Nonag\'esima% \fi } \newcommand{\@@TeenthstringFspanish}[1]{% \ifcase#1\relax D\'ecima% \or Und\'ecima% \or Duod\'ecima% \or Decimotercera% \or Decimocuarta% \or Decimoquinta% \or Decimosexta% \or Decimos\'eptima% \or Decimoctava% \or Decimonovena% \fi } \newcommand{\@@HundredthstringFspanish}[1]{% \ifcase#1\relax \or Cent\'esima% \or Ducent\'esima% \or Tricent\'esima% \or Cuadringent\'esima% \or Quingent\'esima% \or Sexcent\'esima% \or Septing\'esima% \or Octingent\'esima% \or Noningent\'esima% \fi} % \end{macrocode} % \begin{macrocode} \newcommand{\@@numberstringspanish}[1]{% \ifnum#1>99999 \PackageError{fmtcount}{Out of range}% {This macro only works for values less than 100000}% \else \ifnum#1<0 \PackageError{fmtcount}{Negative numbers not permitted}% {This macro does not work for negative numbers, however you can try typing "minus" first, and then pass the modulus of this number}% \fi \fi \@strctr=#1\relax \divide\@strctr by 1000\relax \ifnum\@strctr>9 % #1 is greater or equal to 10000 \divide\@strctr by 10 \ifnum\@strctr>1 \@tenstring{\@strctr}% \@strctr=#1 \divide\@strctr by 1000\relax \@modulo{\@strctr}{10}% \ifnum\@strctr>0\ \@andname\ \@unitstring{\@strctr}\fi \else \@strctr=#1\relax \divide\@strctr by 1000\relax \@modulo{\@strctr}{10}% \@teenstring{\@strctr}% \fi \ \@thousand% \else \ifnum\@strctr>0 \ifnum\@strctr>1\@unitstring{\@strctr}\ \fi \@thousand \fi \fi \@strctr=#1\relax \@modulo{\@strctr}{1000}% \divide\@strctr by 100 \ifnum\@strctr>0 \ifnum#1>1000\ \fi \@tmpstrctr=#1\relax \@modulo{\@tmpstrctr}{1000}% \ifnum\@tmpstrctr=100\@tenstring{10}\else\@hundredstring{\@strctr}\fi% \fi \@strctr=#1\relax \@modulo{\@strctr}{100}% \ifnum#1>100 \ifnum\@strctr>0\ \@andname\ \fi\fi \ifnum\@strctr>29 \divide\@strctr by 10 \@tenstring{\@strctr}% \@strctr=#1\relax \@modulo{\@strctr}{10}% \ifnum\@strctr>0 \ \@andname\ \@unitstring{\@strctr}% \fi \else \ifnum\@strctr<10 \ifnum\@strctr=0 \ifnum#1<100 \@unitstring{\@strctr}\fi \else \@unitstring{\@strctr}% \fi \else \ifnum\@strctr>19 \@modulo{\@strctr}{10}% \@twentystring{\@strctr}% \else \@modulo{\@strctr}{10}% \@teenstring{\@strctr}% \fi \fi \fi } % \end{macrocode} % \begin{macrocode} \newcommand{\@@ordinalstringspanish}[1]{% \@strctr=#1\relax \ifnum#1>99999 \PackageError{fmtcount}{Out of range}% {This macro only works for values less than 100000}% \else \ifnum#1<0 \PackageError{fmtcount}{Negative numbers not permitted}% {This macro does not work for negative numbers, however you can try typing "minus" first, and then pass the modulus of this number}% \else \ifnum\@strctr>999\relax \divide\@strctr by 1000\relax \ifnum\@strctr>1\relax \ifnum\@strctr>9\relax \@tmpstrctr=\@strctr \ifnum\@strctr<20 \@modulo{\@tmpstrctr}{10}% \@teenthstring{\@tmpstrctr} \else \divide\@tmpstrctr by 10\relax \@tenthstring{\@tmpstrctr} \@tmpstrctr=\@strctr \@modulo{\@tmpstrctr}{10}% \ifnum\@tmpstrctr>0\@unitthstring{\@tmpstrctr} \fi \fi \else \@unitstring{\@strctr} \fi \fi \@thousandth \fi \@strctr=#1\relax \@modulo{\@strctr}{1000}% \ifnum\@strctr>99\relax \@tmpstrctr=\@strctr \divide\@tmpstrctr by 100\relax \ifnum#1>1000\ \fi \@hundredthstring{\@tmpstrctr}% \fi \@modulo{\@strctr}{100}% \ifnum#1>99\ifnum\@strctr>0\ \fi\fi \ifnum\@strctr>19\relax \@tmpstrctr=\@strctr \divide\@tmpstrctr by 10\relax \@tenthstring{\@tmpstrctr}% \@tmpstrctr=\@strctr \@modulo{\@tmpstrctr}{10}% \ifnum\@tmpstrctr>0\ \@unitthstring{\@tmpstrctr}\fi \else \ifnum\@strctr>9 \@modulo{\@strctr}{10}% \@teenthstring{\@strctr}% \else \ifnum\@strctr=0\relax \ifnum#1=0\@unitstring{0}\fi \else \@unitthstring{\@strctr}% \fi \fi \fi \fi \fi } % \end{macrocode} % \begin{macrocode} % % \end{macrocode} % \begin{macrocode} %<*fmtcount.sty> % \end{macrocode} %\subsection{fmtcount.sty} % This section deals with the code for |fmtcount.sty| % \begin{macrocode} \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{fmtcount}[2006/07/29 v1.04] \RequirePackage{ifthen} \RequirePackage{keyval} % \end{macrocode} % These commands need to be defined before the % configuration file is loaded. % \begin{macrocode} \providecommand{\fmtord}[1]{\textsuperscript{#1}} \newcount\c@padzeroesN \c@padzeroesN=1\relax \providecommand{\padzeroes}[1][17]{\c@padzeroesN=#1} % \end{macrocode} % Load appropriate language definition files (I don't % know if there is a standard way of detecting which % languages are defined, so I'm just going to check % if \verb"\date"\meta{language} is defined): % \begin{macrocode} \@ifundefined{dateenglish}{}{\input{fc-english.def}} \@ifundefined{datespanish}{}{\input{fc-spanish.def}} \@ifundefined{dateportuges}{}{\input{fc-portuges.def}} \@ifundefined{datefrench}{}{\input{fc-french.def}} % \end{macrocode} %Provide Command to switch dialects (Does babel store %this kind of information?) % \begin{macrocode} \def\fmtcount@french{france} \define@key{fmtcount}{french}[france]{% \@ifundefined{datefrench}{% \PackageError{fmtcount}{Language `french' not defined}{You need to load babel before loading fmtcount}}{ \ifthenelse{\equal{#1}{france} \or\equal{#1}{swiss} \or\equal{#1}{belgian}}{% \def\fmtcount@french{#1}}{% \PackageError{fmtcount}{Invalid value `#1' to french key} {Option `french' can only take the values `france', `belgian' or `swiss'}} }} \define@key{fmtcount}{fmtord}{% \ifthenelse{\equal{#1}{level} \or\equal{#1}{raise} \or\equal{#1}{user}}{ \def\fmtcount@fmtord{#1}}{% \PackageError{fmtcount}{Invalid value `#1' to fmtord key} {Option `fmtord' can only take the values `level', `raise' or `user'}}} \newif\iffmtord@abbrv \fmtord@abbrvfalse \define@key{fmtcount}{abbrv}[true]{% \ifthenelse{\equal{#1}{true}\or\equal{#1}{false}}{ \csname fmtord@abbrv#1\endcsname}{% \PackageError{fmtcount}{Invalid value `#1' to fmtord key} {Option `fmtord' can only take the values `true' or `false'}}} \newcommand{\fmtcountsetoptions}[1]{% \def\fmtcount@fmtord{}% \setkeys{fmtcount}{#1}% \@ifundefined{datefrench}{}{% \edef\@ordinalstringMfrench{\noexpand\csname @ordinalstringMfrench\fmtcount@french\noexpand\endcsname}% \edef\@ordinalstringFfrench{\noexpand\csname @ordinalstringFfrench\fmtcount@french\noexpand\endcsname}% \edef\@OrdinalstringMfrench{\noexpand\csname @OrdinalstringMfrench\fmtcount@french\noexpand\endcsname}% \edef\@OrdinalstringFfrench{\noexpand\csname @OrdinalstringFfrench\fmtcount@french\noexpand\endcsname}% \edef\@numberstringMfrench{\noexpand\csname @numberstringMfrench\fmtcount@french\noexpand\endcsname}% \edef\@numberstringFfrench{\noexpand\csname @numberstringFfrench\fmtcount@french\noexpand\endcsname}% \edef\@NumberstringMfrench{\noexpand\csname @NumberstringMfrench\fmtcount@french\noexpand\endcsname}% \edef\@NumberstringFfrench{\noexpand\csname @NumberstringFfrench\fmtcount@french\noexpand\endcsname}% }% % \ifthenelse{\equal{\fmtcount@fmtord}{level}}{% \renewcommand{\fmtord}[1]{##1}}{% \ifthenelse{\equal{\fmtcount@fmtord}{raise}}{% \renewcommand{\fmtord}[1]{\textsuperscript{##1}}}{% }} } % \end{macrocode} % Load confguration file if it exists. This needs to be done % before the package options, to allow the user to override % the settings in the configuration file. % \begin{macrocode} \InputIfFileExists{fmtcount.cfg}{% \typeout{Using configuration file fmtcount.cfg}}{% \typeout{No configuration file fmtcount.cfg found.}} % \end{macrocode} %Declare options % \begin{macrocode} \DeclareOption{level}{\def\fmtcount@fmtord{level}% \def\fmtord#1{#1}} \DeclareOption{raise}{\def\fmtcount@fmtord{raise}% \def\fmtord#1{\textsuperscript{#1}}} \ProcessOptions % \end{macrocode} % Define macro that performs modulo arthmetic. This is used for the % date, time, ordinal and numberstring commands. % \begin{macrocode} \newcount\@DT@modctr \def\@modulo#1#2{% \@DT@modctr=#1\relax \divide \@DT@modctr by #2\relax \multiply \@DT@modctr by #2\relax \advance #1 by -\@DT@modctr} % \end{macrocode} % Define the macro to format the |st|, |nd|, |rd| or |th| of an ordinal. % The following registers are needed by |\@ordinal| etc % \begin{macrocode} \newcount\@ordinalctr \newcount\@orgargctr \newcount\@strctr \newcount\@tmpstrctr % \end{macrocode} %Define commands that display numbers in different bases. % \begin{macrocode} \newif\if@DT@padzeroes \newcount\@DT@loopN \newcount\@DT@X \newcommand{\@binary}[1]{% \@DT@padzeroestrue \@DT@loopN=17\relax \@strctr=\@DT@loopN \whiledo{\@strctr<\c@padzeroesN}{0\advance\@strctr by 1}% \@strctr=65536\relax \@DT@X=#1\relax \loop \@DT@modctr=\@DT@X \divide\@DT@modctr by \@strctr \ifthenelse{\boolean{@DT@padzeroes} \and \(\@DT@modctr=0\) \and \(\@DT@loopN>\c@padzeroesN\)}{}{\the\@DT@modctr}% \ifnum\@DT@modctr=0\else\@DT@padzeroesfalse\fi \multiply\@DT@modctr by \@strctr \advance\@DT@X by -\@DT@modctr \divide\@strctr by 2\relax \advance\@DT@loopN by -1\relax \ifnum\@strctr>1 \repeat \the\@DT@X} \let\binarynum=\@binary % \end{macrocode} % % \begin{macrocode} \newcommand{\@octal}[1]{% \ifnum#1>32768 \PackageError{fmtcount}{Value of counter too large for \protect\@octal}{Maximum value 32768} \else \@DT@padzeroestrue \@DT@loopN=6\relax \@strctr=\@DT@loopN \whiledo{\@strctr<\c@padzeroesN}{0\advance\@strctr by 1}% \@strctr=32768\relax \@DT@X=#1\relax \loop \@DT@modctr=\@DT@X \divide\@DT@modctr by \@strctr \ifthenelse{\boolean{@DT@padzeroes} \and \(\@DT@modctr=0\) \and \(\@DT@loopN>\c@padzeroesN\)}{}{\the\@DT@modctr}% \ifnum\@DT@modctr=0\else\@DT@padzeroesfalse\fi \multiply\@DT@modctr by \@strctr \advance\@DT@X by -\@DT@modctr \divide\@strctr by 8\relax \advance\@DT@loopN by -1\relax \ifnum\@strctr>1 \repeat \the\@DT@X \fi} \let\octalnum=\@octal % \end{macrocode} % % \begin{macrocode} \newcommand{\@@hexadecimal}[1]{\ifcase#10\or1\or2\or3\or4\or5\or6\or7\or8\or9\or a\or b\or c\or d\or e\or f\fi} \newcommand{\@hexadecimal}[1]{% \@DT@padzeroestrue \@DT@loopN=5\relax \@strctr=\@DT@loopN \whiledo{\@strctr<\c@padzeroesN}{0\advance\@strctr by 1}% \@strctr=65536\relax \@DT@X=#1\relax \loop \@DT@modctr=\@DT@X \divide\@DT@modctr by \@strctr \ifthenelse{\boolean{@DT@padzeroes} \and \(\@DT@modctr=0\) \and \(\@DT@loopN>\c@padzeroesN\)}{}{\@@hexadecimal\@DT@modctr}% \ifnum\@DT@modctr=0\else\@DT@padzeroesfalse\fi \multiply\@DT@modctr by \@strctr \advance\@DT@X by -\@DT@modctr \divide\@strctr by 16\relax \advance\@DT@loopN by -1\relax \ifnum\@strctr>1 \repeat \@@hexadecimal\@DT@X} \let\hexadecimalnum=\@hexadecimal \newcommand{\@@Hexadecimal}[1]{\ifcase#10\or1\or2\or3\or4\or5\or6\or7\or8\or9\or A\or B\or C\or D\or E\or F\fi} \newcommand{\@Hexadecimal}[1]{% \@DT@padzeroestrue \@DT@loopN=5\relax \@strctr=\@DT@loopN \whiledo{\@strctr<\c@padzeroesN}{0\advance\@strctr by 1}% \@strctr=65536\relax \@DT@X=#1\relax \loop \@DT@modctr=\@DT@X \divide\@DT@modctr by \@strctr \ifthenelse{\boolean{@DT@padzeroes} \and \(\@DT@modctr=0\) \and \(\@DT@loopN>\c@padzeroesN\)}{}{\@@Hexadecimal\@DT@modctr}% \ifnum\@DT@modctr=0\else\@DT@padzeroesfalse\fi \multiply\@DT@modctr by \@strctr \advance\@DT@X by -\@DT@modctr \divide\@strctr by 16\relax \advance\@DT@loopN by -1\relax \ifnum\@strctr>1 \repeat \@@Hexadecimal\@DT@X} \let\Hexadecimalnum=\@Hexadecimal % \end{macrocode} % % \begin{macrocode} \newcommand{\@aaalph}[1]{% \@DT@loopN=#1\relax \advance\@DT@loopN by -1\relax \divide\@DT@loopN by 26\relax \@DT@modctr=\@DT@loopN \multiply\@DT@modctr by 26\relax \@DT@X=#1\relax \advance\@DT@X by -1\relax \advance\@DT@X by -\@DT@modctr \advance\@DT@loopN by 1\relax \advance\@DT@X by 1\relax \loop \@alph\@DT@X \advance\@DT@loopN by -1\relax \ifnum\@DT@loopN>0 \repeat } \let\aaalphnum=\@aaalph \newcommand{\@AAAlph}[1]{% \@DT@loopN=#1\relax \advance\@DT@loopN by -1\relax \divide\@DT@loopN by 26\relax \@DT@modctr=\@DT@loopN \multiply\@DT@modctr by 26\relax \@DT@X=#1\relax \advance\@DT@X by -1\relax \advance\@DT@X by -\@DT@modctr \advance\@DT@loopN by 1\relax \advance\@DT@X by 1\relax \loop \@Alph\@DT@X \advance\@DT@loopN by -1\relax \ifnum\@DT@loopN>0 \repeat } \let\AAAlphnum=\@AAAlph % \end{macrocode} % % \begin{macrocode} \newcommand{\@abalph}[1]{% \ifnum#1>17576 \PackageError{fmtcount}{Value of counter too large for \protect\@abalph}{Maximum value 17576} \else \@DT@padzeroestrue \@strctr=17576\relax \@DT@X=#1\relax \advance\@DT@X by -1\relax \loop \@DT@modctr=\@DT@X \divide\@DT@modctr by \@strctr \ifthenelse{\boolean{@DT@padzeroes} \and \(\@DT@modctr=1\)}{}{\@alph\@DT@modctr}% \ifnum\@DT@modctr=1\else\@DT@padzeroesfalse\fi \multiply\@DT@modctr by \@strctr \advance\@DT@X by -\@DT@modctr \divide\@strctr by 26\relax \ifnum\@strctr>1 \repeat \advance\@DT@X by 1\relax \@alph\@DT@X \fi} \let\abalphnum=\@abalph \newcommand{\@ABAlph}[1]{% \ifnum#1>17576 \PackageError{fmtcount}{Value of counter too large for \protect\@ABAlph}{Maximum value 17576} \else \@DT@padzeroestrue \@strctr=17576\relax \@DT@X=#1\relax \advance\@DT@X by -1\relax \loop \@DT@modctr=\@DT@X \divide\@DT@modctr by \@strctr \ifthenelse{\boolean{@DT@padzeroes} \and \(\@DT@modctr=1\)}{}{\@Alph\@DT@modctr}% \ifnum\@DT@modctr=1\else\@DT@padzeroesfalse\fi \multiply\@DT@modctr by \@strctr \advance\@DT@X by -\@DT@modctr \divide\@strctr by 26\relax \ifnum\@strctr>1 \repeat \advance\@DT@X by 1\relax \@Alph\@DT@X \fi} \let\ABAlphnum=\@ABAlph \newcommand{\@decimal}[1]{% \ifnum#1>10000 \PackageError{fmtcount}{Value of counter too large for \protect\@decimal}{Maximum value 10000}\number#1\relax \else \@DT@padzeroestrue \@DT@loopN=6\relax \@strctr=\@DT@loopN \whiledo{\(\@strctr<\c@padzeroesN\) \TE@or \(\@strctr=\c@padzeroesN\)}{0\advance\@strctr by 1}% \@strctr=10000\relax \@DT@X=#1\relax \loop \@DT@modctr=\@DT@X \divide\@DT@modctr by \@strctr \ifthenelse{\boolean{@DT@padzeroes} \and \(\@DT@modctr=0\) \and \(\@DT@loopN>\c@padzeroesN\)}{}{\the\@DT@modctr}% \ifnum\@DT@modctr=0\else\@DT@padzeroesfalse\fi \multiply\@DT@modctr by \@strctr \advance\@DT@X by -\@DT@modctr \divide\@strctr by 10\relax \advance\@DT@loopN by -1\relax \ifnum\@strctr>1 \repeat \the\@DT@X \fi} \let\decimalnum=\@decimal % \end{macrocode} % This is a bit cumbersome. Previously \verb"\@ordinal" % was defined in a similar way to \verb"\abalph" etc. % This ensured that the actual value of the counter was % written in the new label stuff in the .aux file. However % adding in an optional argument to determine the gender % for multilingual compatibility messed things up somewhat. % This was the only work around I could get to keep the % the cross-referencing stuff working, which is why % the optional argument comes \emph{after} the compulsory % argument, instead of the usual manner of placing it before. % Version 1.04 changed \verb"\ordinal" to \verb"\FCordinal" % to prevent it clashing with the memoir class. % \begin{macrocode} \newcommand{\FCordinal}[1]{% \expandafter\protect\expandafter\ordinalnum{% \expandafter\the\csname c@#1\endcsname}} % \end{macrocode} % If \verb"\ordinal" isn't defined make "\ordinal" a synonym % for \verb"\FCordinal" to maintain compatibility with previous % versions. % \begin{macrocode} \@ifundefined{ordinal}{\let\ordinal\FCordinal}{% \PackageWarning{fmtcount}{\string\ordinal \space already defined use \string\FCordinal \space instead.}} % \end{macrocode} % \begin{macrocode} \newcommand{\ordinalnum}[1]{\@ifnextchar[{\@ordinalnum{#1}}{% \@ordinalnum{#1}[m]}} \def\@ordinalnum#1[#2]{% \ifthenelse{\equal{#2}{f}}{% \protect\@ordinalF{#1}}{% \ifthenelse{\equal{#2}{m}}{}{% \PackageError{fmtcount}{Invalid gender option `#2'}{% Available options are m or f}}% \protect\@ordinalM{#1}}} \newcommand{\ordinalstring}[1]{% \expandafter\protect\expandafter\ordinalstringnum{% \expandafter\the\csname c@#1\endcsname}} \newcommand{\ordinalstringnum}[1]{% \@ifnextchar[{\@ordinal@string{#1}}{\@ordinal@string{#1}[m]}} \def\@ordinal@string#1[#2]{% \ifthenelse{\equal{#2}{f}}{% \protect\@ordinalstringF{#1}}{% \ifthenelse{\equal{#2}{m}}{}{% \PackageError{fmtcount}{Invalid gender option `#2' to \string\ordinalstring}{Available options are m or f}}% \protect\@ordinalstringM{#1}}} \newcommand{\Ordinalstring}[1]{% \expandafter\protect\expandafter\Ordinalstringnum{% \expandafter\the\csname c@#1\endcsname}} \newcommand{\Ordinalstringnum}[1]{% \@ifnextchar[{\@Ordinal@string{#1}}{\@Ordinal@string{#1}[m]}} \def\@Ordinal@string#1[#2]{% \ifthenelse{\equal{#2}{f}}{% \protect\@OrdinalstringF{#1}}{% \ifthenelse{\equal{#2}{m}}{}{% \PackageError{fmtcount}{Invalid gender option `#2' to \string\Ordinalstring}{Available options are m or f}}% \protect\@OrdinalstringM{#1}}} \newcommand{\numberstring}[1]{% \expandafter\protect\expandafter\numberstringnum{% \expandafter\the\csname c@#1\endcsname}} \newcommand{\numberstringnum}[1]{% \@ifnextchar[{\@number@string{#1}}{\@number@string{#1}[m]}} \def\@number@string#1[#2]{% \ifthenelse{\equal{#2}{f}}{% \protect\@numberstringF{#1}}{% \ifthenelse{\equal{#2}{m}}{}{% \PackageError{fmtcount}{Invalid gender option `#2' to \string\numberstring}{Available options are m or f}}% \protect\@numberstringM{#1}}} \newcommand{\Numberstring}[1]{% \expandafter\protect\expandafter\Numberstringnum{% \expandafter\the\csname c@#1\endcsname}} \newcommand{\Numberstringnum}[1]{% \@ifnextchar[{\@Number@string{#1}}{\@Number@string{#1}[m]}} \def\@Number@string#1[#2]{% \ifthenelse{\equal{#2}{f}}{% \protect\@NumberstringF{#1}}{% \ifthenelse{\equal{#2}{m}}{}{% \PackageError{fmtcount}{Invalid gender option `#2' to \string\Numberstring}{Available options are m or f}}% \protect\@NumberstringM{#1}}} \providecommand{\binary}[1]{\expandafter\protect\expandafter\@binary{\expandafter\the\csname c@#1\endcsname}} \providecommand{\aaalph}[1]{\expandafter\protect\expandafter\@aaalph{\expandafter\the\csname c@#1\endcsname}} \providecommand{\AAAlph}[1]{\expandafter\protect\expandafter\@AAAlph{\expandafter\the\csname c@#1\endcsname}} \providecommand{\abalph}[1]{\expandafter\protect\expandafter\@abalph{\expandafter\the\csname c@#1\endcsname}} \providecommand{\ABAlph}[1]{\expandafter\protect\expandafter\@ABAlph{\expandafter\the\csname c@#1\endcsname}} \providecommand{\hexadecimal}[1]{\expandafter\protect\expandafter\@hexadecimal{\expandafter\the\csname c@#1\endcsname}} \providecommand{\Hexadecimal}[1]{\expandafter\protect\expandafter\@Hexadecimal{\expandafter\the\csname c@#1\endcsname}} \providecommand{\octal}[1]{\expandafter\protect\expandafter\@octal{\expandafter\the\csname c@#1\endcsname}} \providecommand{\decimal}[1]{\expandafter\protect\expandafter\@decimal{\expandafter\the\csname c@#1\endcsname}} % \end{macrocode} %\subsubsection{Multilinguage Definitions} % If multilingual support is provided, make \verb"\@numberstring" % etc use the correct language (if defined). % Otherwise use English definitions. % \begin{macrocode} \def\@setdef@ultfmtcount{ \@ifundefined{@ordinalenglish}{\input{fc-english.def}}{} \def\@ordinalstringM{\@ordinalstringMenglish} \let\@ordinalstringF=\@ordinalstringMenglish \def\@OrdinalstringM{\@OrdinalstringMenglish} \let\@OrdinalstringF=\@OrdinalstringMenglish \def\@numberstringM{\@numberstringMenglish} \let\@numberstringF=\@numberstringMenglish \def\@NumberstringM{\@NumberstringMenglish} \let\@NumberstringF=\@NumberstringMenglish \def\@ordinalM{\@ordinalMenglish} \let\@ordinalF=\@ordinalM} \@ifundefined{languagename}{% \@setdef@ultfmtcount}{ \ifthenelse{\equal{\languagename}{nohyphenation}}{\@setdef@ultfmtcount}{ \def\@numberstringM{\@ifundefined{@numberstringM\languagename}{% \PackageError{fmtcount}{No support for language '\languagename'}{% The fmtcount package currently does not support language '\languagename' for command \string\@numberstringM}}{% \csname @numberstringM\languagename\endcsname}} \def\@numberstringF{\@ifundefined{@numberstringF\languagename}{% \PackageError{fmtcount}{No support for language '\languagename'}{% The fmtcount package currently does not support language '\languagename' for command \string\@numberstringF}}{% \csname @numberstringF\languagename\endcsname}} \def\@NumberstringM{\@ifundefined{@NumberstringM\languagename}{% \PackageError{fmtcount}{No support for language '\languagename'}{% The fmtcount package currently does not support language '\languagename' for command \string\@NumberstringM}}{% \csname @NumberstringM\languagename\endcsname}} \def\@NumberstringF{\@ifundefined{@NumberstringF\languagename}{% \PackageError{fmtcount}{No support for language '\languagename'}{% The fmtcount package currently does not support language '\languagename' for command \string\@NumberstringF}}{% \csname @NumberstringF\languagename\endcsname}} \def\@ordinalM{\@ifundefined{@ordinalM\languagename}{% \PackageError{fmtcount}{No support for language '\languagename'}{% The fmtcount package currently does not support language '\languagename' for command \string\@ordinalM}}{% \csname @ordinalM\languagename\endcsname}} \def\@ordinalF{\@ifundefined{@ordinalF\languagename}{% \PackageError{fmtcount}{No support for language '\languagename'}{% The fmtcount package currently does not support language '\languagename' for command \string\@ordinalF}}{% \csname @ordinalF\languagename\endcsname}} \def\@ordinalstringM{\@ifundefined{@ordinalstringM\languagename}{% \PackageError{fmtcount}{No support for language '\languagename'}{% The fmtcount package currently does not support language '\languagename' for command \string\@ordinalstringM}}{% \csname @ordinalstringM\languagename\endcsname}} \def\@ordinalstringF{\@ifundefined{@ordinalstringF\languagename}{% \PackageError{fmtcount}{No support for language '\languagename'}{% The fmtcount package currently does not support language '\languagename' for command \string\@ordinalstringF}}{% \csname @ordinalstringF\languagename\endcsname}} \def\@OrdinalstringM{\@ifundefined{@OrdinalstringM\languagename}{% \PackageError{fmtcount}{No support for language '\languagename'}{% The fmtcount package currently does not support language '\languagename' for command \string\@OrdinalstringM}}{% \csname @OrdinalstringM\languagename\endcsname}} \def\@OrdinalstringF{\@ifundefined{@OrdinalstringF\languagename}{% \PackageError{fmtcount}{No support for language '\languagename'}{% The fmtcount package currently does not support language '\languagename' for command \string\@OrdinalstringF}}{% \csname @OrdinalstringF\languagename\endcsname}} }} % \end{macrocode} % Backwards compatibility: % \begin{macrocode} \let\@ordinal=\@ordinalM \let\@ordinalstring=\@ordinalstringM \let\@Ordinalstring=\@OrdinalstringM \let\@numberstring=\@numberstringM \let\@Numberstring=\@NumberstringM % \end{macrocode} % \begin{macrocode} % % \end{macrocode} % \begin{macrocode} %<*fmtcount.perl> % \end{macrocode} % \begin{macrocode} # File : fmtcount.perl # Author : Nicola Talbot # Date : 3 Mar 2005 # Version : 1.02 # Description : LaTeX2HTML implementation of fmtcount package package main; sub do_fmtcount_raise{ local($tmp)=""; $tmp .= 'sub do_cmd_fmtord{'; $tmp .= 'local($_) = @_;'; $tmp .= 'local($num) = &missing_braces unless ((s/$next_pair_pr_rx//o)&&($num=$2));'; $tmp .= 'join("", "",$num,"",$_);'; $tmp .='}'; eval($tmp); } sub do_fmtcount_level{ local($tmp)=""; $tmp .= 'sub do_cmd_fmtord{'; $tmp .= 'local($_) = @_;'; $tmp .= 'local($num) = &missing_braces unless ((s/$next_pair_pr_rx//o)&&($num=$2));'; $tmp .= 'join("", $num,$_);'; $tmp .='}'; eval($tmp); } if (not defined &do_cmd_fmtord) { &do_fmtcount_raise(@_); } $frenchdialect = 'france'; $ordinalabbrv = 0; sub get_ordinal_suffix_english{ local($num,$gender) = @_; local($suffix); if ((($num % 10) == 1) && ($num%100 != 11)) { $suffix = 'st'; } elsif ((($num % 10) == 2) && ($num%100 != 12)) { $suffix = 'nd'; } elsif ((($num % 10) == 3) && ($num%100 != 13)) { $suffix = 'rd'; } else { $suffix = 'th'; } $suffix; } sub get_ordinal_suffix_french{ local($num,$gender) = @_; local($_); if ($ordinalabbrv > 0) { $_ = 'e'; } else { if ($num == 1) { $_ = ($gender eq 'f' ? 'ere' : 'er'); } else { $_ = 'eme'; } } } sub get_ordinal_suffix_spanish{ local($num,$gender) = @_; ($gender eq 'f' ? 'a' : 'o'); } sub get_ordinal_suffix_portuges{ local($num,$gender) = @_; ($gender eq 'f' ? 'a' : 'o'); } sub get_ordinal_suffix{ local($num,$gender) = @_; local($suffix,$suffixsub); $suffixsub = "get_ordinal_suffix_$default_language"; if (defined ($suffixsub)) { $suffix = &$suffixsub($num,$gender); } else { $suffix = &get_ordinal_suffix_english($num,$gender); } $suffix; } sub getordinal{ local($num,$gender) = @_; local($suffix) = &get_ordinal_suffix($num,$gender); if ($suffix eq '') { $num; } else { local($br_id) = ++$global{'max_id'}; $num . "\\fmtord${OP}$br_id${CP}$suffix${OP}$br_id${CP}"; } } sub do_cmd_ordinalnum{ local($_) = @_; local($num) = &missing_braces unless ($_[0]=~(s/$next_pair_pr_rx//o)&&($num=$2)); local($gender)='m'; local($suffix)=''; if ($_[0]=~s/\[([mf])\]//) { $gender = $1; } $suffix = &get_ordinal_suffix($num,$gender); local($br_id) = ++$global{'max_id'}; join('', $num, "\\fmtord${OP}$br_id${CP}$suffix${OP}$br_id${CP}", $_[0]); } sub do_cmd_FCordinal{ &do_cmd_ordinal; } sub do_cmd_ordinal{ local($ctr, $val, $id, $_) = &read_counter_value($_[0]); local($gender)='m'; $_[0] =~ s/${OP}$id${CP}$ctr${OP}$id${CP}//; if ($_[0]=~s/\[(.)\]//) { $gender = $1; } if ($ctr eq 'DAY' or $ctr eq 'MONTH' or $str eq 'YEAR') { # this is a cludge to make it work with newdateformat join('', '{ORDINAL{', $ctr, '}}', $_[0]); } else { join('', &getordinal($val, $gender), $_[0]); } } @unitthstring = ('zeroth', 'first', 'second', 'third', 'fourth', 'fifth', 'sixth', 'seventh', 'eighth', 'ninth'); @tenthstring = ('', 'tenth', 'twentieth', 'thirtieth', 'fortieth', 'fiftieth', 'sixtieth', 'seventieth', 'eightieth', 'ninetieth'); @teenthstring = ('tenth', 'eleventh', 'twelfth', 'thirteenth', 'fourteenth', 'fifteenth', 'sixteenth', 'seventeenth', 'eighteenth', 'nineteenth'); @unitstring = ('zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine'); @teenstring = ('ten', 'eleven', 'twelve', 'thirteen', 'fourteen', 'fifteen', 'sixteen', 'seventeen', 'eighteen', 'nineteen'); @tenstring = ('', 'ten', 'twenty', 'thirty', 'forty', 'fifty', 'sixty', 'seventy', 'eighty', 'ninety'); $hundredname = "hundred"; $hundredthname = "hundredth"; $thousandname = "thousand"; $thousandthname = "thousandth"; sub get_numberstringenglish{ local($num) = @_; local($name)=""; unless (($num >= 1000000) || ($num < 0)) { if ($num >= 1000) { local($thousands) = &get_numberstringenglish($num/1000); $name .= $thousands . " $thousandname"; $num = $num%1000; } if ($num >= 100) { if ($_[0] >= 1000) { $name .= " "; } local($hundreds) = &get_numberstringenglish($num/100); $name .= $hundreds . " $hundredname"; $num = $num%100; } if (($_[0] > 100) && ($_[0]%100 > 0)) { $name .= " and "; } if ($num >= 20) { $name .= $tenstring[$num/10]; if ($num%10 > 0) { $name .= '-'; } } if (($num >= 10) && ($num < 20)) { $name .= $teenstring[$num%10]; } elsif (($num%10 > 0) || ($_[0] == 0)) { $name .= $unitstring[$num%10]; } } $name; } @unitthstringfrench = ('zeroi\`eme', 'uni\`eme', 'deuxi\`eme', 'troisi\`eme', 'quatri\`eme', 'cinqui\`eme', 'sixi\`eme', 'septi\`eme', 'huiti\`eme', 'neuvi\`eme'); @tenthstringfrench = ('', 'dixi\`eme', 'vingti\`eme', 'trentri\`eme', 'quaranti\`eme', 'cinquanti\`eme', 'soixanti\`eme', 'septenti\`eme', 'huitanti\`eme', 'nonenti\`eme'); @teenthstringfrench = ('dixi\`eme', 'onzi\`eme', 'douzi\`eme', 'treizi\`eme', 'quatorzi\`eme', 'quinzi\`eme', 'seizi\`eme', 'dix-septi\`eme', 'dix-huiti\`eme', 'dix-neuvi\`eme'); @unitstringfrench = ('zero', 'un', 'deux', 'trois', 'quatre', 'cinq', 'six', 'sept', 'huit', 'neuf'); @teenstringfrench = ('dix', 'onze', 'douze', 'treize', 'quatorze', 'quinze', 'seize', 'dix-sept', 'dix-huit', 'dix-neuf'); @tenstringfrench = ('', 'dix', 'vingt', 'trente', 'quarante', 'cinquante', 'soixante', 'septente', 'huitante', 'nonente'); $hundrednamefrench = "cent"; $hundredthnamefrench = "centi\\`eme"; $thousandnamefrench = "mille"; $thousandthnamefrench = "mili\\`eme"; @unitthstringspanish = ('cero', 'primero', 'segundo', 'tercero', 'cuarto', 'quinto', 'sexto', 's\\\'eptimo', 'octavo', 'noveno'); @tenthstringspanish = ('', 'd\\\'ecimo', 'vig\\\'esimo', 'trig\\\'esimo', 'cuadrag\\\'esimo', 'quincuag\\\'esimo', 'sexag\\\'esimo', 'septuag\\\'esimo', 'octog\\\'esimo', 'nonag\\\'esimo'); @teenthstringspanish = ('d\\\'ecimo', 'und\\\'ecimo', 'duod\\\'ecimo', 'decimotercero', 'decimocuarto', 'decimoquinto', 'decimosexto', 'decimos\\\'eptimo', 'decimoctavo', 'decimonoveno'); @hundredthstringspanish = ('', 'cent\\\'esimo', 'ducent\\\'esimo', 'tricent\\\'esimo', 'cuadringent\\\'esimo', 'quingent\\\'esimo', 'sexcent\\\'esimo', 'septing\\\'esimo', 'octingent\\\'esimo', 'noningent\\\'esimo'); @unitstringspanish = ('cero', 'uno', 'dos', 'tres', 'cuatro', 'cinco', 'seis', 'siete', 'ocho', 'nueve'); @teenstringspanish = ('diez', 'once', 'doce', 'trece', 'catorce', 'quince', 'diecis\\\'eis', 'diecisiete', 'dieciocho', 'diecinueve'); @twentystringspanish = ('viente', 'vientiuno', 'vientid\\\'os', 'vientitr\\\'es', 'vienticuatro', 'vienticinco', 'vientis\\\'eis', 'vientisiete', 'vientiocho', 'vientinueve'); @tenstringspanish = ('', 'diez', 'viente', 'treinta', 'cuarenta', 'cincuenta', 'sesenta', 'setenta', 'ochenta', 'noventa'); @hundredstringspanish = ('', 'ciento', 'doscientos', 'trescientos', 'cuatrocientos', 'quinientos', 'seiscientos', 'setecientos', 'ochocientos', 'novecientos'); $hundrednamespanish = "cien"; $hundredthnamespanish = "centi\\`eme"; $thousandnamespanish = "mil"; $thousandthnamespanish = "mil\\'esimo"; @unitthstringportuges = ('zero', 'primeiro', 'segundo', 'terceiro', 'quatro', 'quinto', 'sexto', 's\\\'etimo', 'oitavo', 'nono'); @tenthstringportuges = ('', 'd\\\'ecimo', 'vig\\\'esimo', 'trig\\\'esimo', 'quadrag\\\'esimo', 'q\"uinquag\\\'esimo', 'sexag\\\'esimo', 'setuag\\\'esimo', 'octog\\\'esimo', 'nonag\\\'esimo'); @hundredthstringportuges = ('', 'cent\\\'esimo', 'ducent\\\'esimo', 'trecent\\\'esimo', 'quadringent\\\'esimo', 'q\"uingent\\\'esimo', 'seiscent\\\'esimo', 'setingent\\\'esimo', 'octingent\\\'esimo', 'nongent\\\'esimo'); @unitstringportuges = ('zero', 'um', 'dois', 'tr\`es', 'quatro', 'cinco', 'seis', 'sete', 'oito', 'nove'); @teenstringportuges = ('dez', 'onze', 'doze', 'treze', 'quatorze', 'quinze', 'dezesseis', 'dezessete', 'dezoito', 'dezenove'); @tenstringportuges = ('', 'dez', 'vinte', 'trinta', 'quaranta', 'cinq\"uenta', 'sessenta', 'setenta', 'oitenta', 'noventa'); @hundredstringportuges = ('', 'cento', 'duzentos', 'trezentos', 'quatrocentos', 'quinhentos', 'seiscentos', 'setecentos', 'oitocentos', 'novecentos'); $hundrednameportuges = "cem"; $thousandnameportuges = "mil"; $thousandthnameportuges = "mil\\'esimo"; sub get_numberstringfrench{ local($num,$gender) = @_; local($name)=""; if ($gender eq 'f') { $unitstringfrench[1] = 'une'; } else { $unitstringfrench[1] = 'un'; } unless (($num >= 1000000) || ($num < 0)) { if ($num >= 1000) { local($thousands) = ''; if ($num >= 2000) { $thousands = &get_numberstringfrench($num/1000,$gender).' '; } $name .= $thousands . $thousandnamefrench; $num = $num%1000; } if ($num >= 100) { if ($_[0] >= 1000) { $name .= " "; } local($hundreds) = ''; if ($num >= 200) { $hundreds = &get_numberstringfrench($num/100,$gender).' '; } $name .= $hundreds . $hundrednamefrench; $num = $num%100; if (($_[0]%100 == 0) && ($_[0]/100 > 1)) { $name .= 's'; } } if (($_[0] > 100) && ($_[0]%100 > 0)) { $name .= " "; } if ($num >= 20) { if ($frenchdialect eq 'france' and $num >= 70) { if ($num < 80) { $name .= $tenstringfrench[6]; if ($num%10 == 1) { $name .= ' et '; } else { $name .= '-'; } $num = 10+($num%10); } else { $name .= 'quatre-vingt' . ($num==80?'s':'-'); if ($num >= 90) { $num = 10+($num%10); } } } elsif ($frenchdialect eq 'belgian' && ($num >= 80) && ($num < 90)) { $name .= 'quatre-vingt' . ($num==80?'s':'-'); } else { $name .= $tenstringfrench[$num/10]; if ($num%10 == 1) { $name .= ' et ';} elsif ($num%10 > 0) { $name .= '-'; } } } if (($num >= 10) && ($num < 20)) { $name .= $teenstringfrench[$num%10]; } elsif (($num%10 > 0) || ($_[0] == 0)) { $name .= $unitstringfrench[$num%10]; } } $name; } sub get_numberstringspanish{ local($num,$gender) = @_; local($name)=""; if ($gender eq 'f') { $unitstringspanish[1] = 'una'; } else { $unitstringspanish[1] = 'uno'; } unless (($num >= 1000000) || ($num < 0)) { if ($num >= 1000) { local($thousands) = ''; if ($num >= 2000) { $thousands = &get_numberstringspanish($num/1000,$gender).' '; } $name .= $thousands . $thousandnamespanish; $num = $num%1000; } if ($num >= 100) { if ($_[0] >= 1000) { $name .= " "; } local($hundreds) = ''; if ($num > 100) { $hundreds = $hundredstringspanish[$num/100]; } else { $hundreds = 'cien'; } $name .= $hundreds; $num = $num%100; } if (($_[0] > 100) && ($_[0]%100 > 0)) { $name .= " y "; } if ($num >= 30) { $name .= $tenstringspanish[$num/10]; if ($num%10 > 0) { $name .= ' y '; } } if (($num >=20) && ($num < 30)) { $name .= $twentystringspanish[$num%10]; } elsif (($num >= 10) && ($num < 20)) { $name .= $teenstringspanish[$num%10]; } elsif (($num%10 > 0) || ($_[0] == 0)) { $name .= $unitstringspanish[$num%10]; } } $name; } sub get_numberstringportuges{ local($num,$gender) = @_; local($name)=""; if ($gender eq 'f') { $unitstringportuges[0] = 'zera'; $unitstringportuges[1] = 'uma'; $unitstringportuges[2] = 'duas'; } else { $unitstringportuges[0] = 'zero'; $unitstringportuges[1] = 'um'; $unitstringportuges[2] = 'dois'; } unless (($num >= 1000000) || ($num < 0)) { if ($num >= 1000) { local($thousands) = ''; if ($num >= 2000) { $thousands = &get_numberstringportuges($num/1000,$gender).' '; } $name .= $thousands . $thousandnameportuges; $num = $num%1000; } if ($num >= 100) { if ($_[0] >= 1000) { $name .= " "; } local($hundreds) = ''; if ($num > 100) { $hundreds = $hundredstringportuges[$num/100]; if ($gender eq 'f') { $hundreds =~s/o(s?)$/a\1/; } } else { $hundreds = $hundrednameportuges; } $name .= $hundreds; $num = $num%100; } if (($_[0] > 100) && ($_[0]%100 > 0)) { $name .= " e "; } if ($num >= 20) { $name .= $tenstringportuges[$num/10]; if ($num%10 == 1) { $name .= ' e ';} elsif ($num%10 > 0) { $name .= ' '; } } if (($num >= 10) && ($num < 20)) { $name .= $teenstringportuges[$num%10]; } elsif (($num%10 > 0) || ($_[0] == 0)) { $name .= $unitstringportuges[$num%10]; } } $name; } sub get_numberstring{ local($val,$gender) = @_; if ($default_language eq 'french') { &get_numberstringfrench($val,$gender); } elsif ($default_language eq 'spanish') { &get_numberstringspanish($val,$gender); } elsif ($default_language eq 'portuges') { &get_numberstringportuges($val,$gender); } else { &get_numberstringenglish($val); } } sub do_cmd_numberstringnum{ local($_) = @_; local($num,$gender); $num = &missing_braces unless (($_[0]=~s/$next_pair_pr_rx//o)&&($num=$2)); if ($_[0] =~ s/\[(m|f)\]//) { $gender = $1; } else { $gender = 'm'; } join('', &get_numberstring($num,$gender), $_[0]); } sub do_cmd_numberstring{ local($ctr, $val, $id, $_) = &read_counter_value($_[0]); local($gender)='m'; $_[0] =~ s/${OP}$id${CP}$ctr${OP}$id${CP}//; if ($_[0]=~s/\[(.)\]//) { $gender = $1; } if ($ctr eq 'DAY' or $ctr eq 'MONTH' or $ctr eq 'YEAR') { # this is a cludge to make it work with newdateformat join('', '{NUMBERSTRING{', $ctr, '}}', $_[0]); } else { join('', &get_numberstring($val, $gender), $_[0]); } } sub get_Numberstring{ local($val,$gender) = @_; local($string) = &get_numberstring($val,$gender); $string =~ s/([a-z])([^\s\-]+)/\u\1\2/g; if ($default_language eq 'french') { $string =~ s/ Et / et /g; } elsif ($default_language eq 'spanish') { $string =~ s/ Y / y /g; } elsif ($default_language eq 'portuges') { $string =~ s/ E / e /g; } else { $string =~ s/ And / and /g; } $string; } sub do_cmd_Numberstringnum{ local($_) = @_; local($num,$gender); $num = &missing_braces unless (($_[0]=~s/$next_pair_pr_rx//o)&&($num=$2)); if ($_[0] =~ s/\[(m|f)\]//) { $gender = $1; } else { $gender = 'm'; } join('', &get_Numberstring($num,$gender), $_[0]); } sub do_cmd_Numberstring{ local($ctr, $val, $id, $_) = &read_counter_value($_[0]); local($gender)='m'; $_[0] =~ s/${OP}$id${CP}$ctr${OP}$id${CP}//; if ($_[0]=~s/\[(.)\]//) { $gender = $1; } if ($ctr eq 'DAY' or $ctr eq 'MONTH' or $ctr eq 'YEAR') { # this is a cludge to make it work with newdateformat join('', '{NNUMBERSTRING{', $ctr, '}}', $_[0]); } else { join('', &get_Numberstring($val, $gender), $_[0]); } } sub get_ordinalstringenglish{ local($num) = @_; local($name)=""; unless (($num >= 1000000) || ($num < 0)) { if ($num >= 1000) { local($thousands) = &get_numberstring($num/1000); $name .= $thousands; if ($num%1000 > 0) { $name .= " $thousandname"; } else { $name .= " $thousandthname"; } $num = $num%1000; } if ($num >= 100) { if ($_[0] >= 1000) { $name .= " "; } local($hundreds) = &get_numberstring($num/100); $name .= $hundreds; if ($num%100 > 0) { $name .= " $hundredname"; } else { $name .= " $hundredthname"; } $num = $num%100; } if (($_[0] > 100) && ($_[0]%100 > 0)) { $name .= " and "; } if ($num >= 20) { if ($num%10 > 0) { $name .= $tenstring[$num/10] . '-'; } else { $name .= $tenthstring[$num/10]; } } if (($num >= 10) && ($num < 20)) { $name .= $teenthstring[$num%10]; } elsif (($num%10 > 0) || ($_[0] == 0)) { $name .= $unitthstring[$num%10]; } } $name; } sub get_ordinalstringfrench{ local($num,$gender) = @_; local($name)=""; unless (($num >= 1000000) || ($num < 0)) { if ($num >= 1000) { local($thousands) = ''; if ($num >= 2000) { $thousands = &get_numberstringfrench($num/1000,$gender).' '; } $num = $num%1000; if ($num > 0) { $name .= $thousands . $thousandnamefrench; } else { $name .= $thousands . $thousandthnamefrench; } } if ($num >= 100) { if ($_[0] >= 1000) { $name .= " "; } local($hundreds) = ''; if ($num >= 200) { $hundreds = &get_numberstringfrench($num/100,$gender).' '; } $num = $num%100; if ($num > 0) { $name .= $hundreds . $hundrednamefrench; } else { $name .= $hundreds . $hundredthnamefrench; } } if (($_[0] > 100) && ($_[0]%100 > 0)) { $name .= " "; } if ($num >= 20) { if ($frenchdialect eq 'france' and $num >= 70) { if ($num < 80) { if ($num%10 > 0) { $name .= $tenstringfrench[6]; } else { $name .= $tenthstringfrench[6]; } if ($num%10 == 1) { $name .= ' et '; } else { $name .= '-'; } $num = 10+($num%10); } else { $name .= 'quatre-vingt' . ($num==80?'i\`eme':'-'); if ($num >= 90) { $num = 10+($num%10); } } } elsif ($frenchdialect eq 'belgian' and $num >= 80) { $name .= 'quatre-vingt' . ($num==80?'i\`eme':'-'); if ($num >= 90) { $num = 10+($num%10); } } else { if ($num%10 > 0) { $name .= $tenstringfrench[$num/10]; } else { $name .= $tenthstringfrench[$num/10]; } if ($num%10 == 1) { $name .= ' et ';} elsif ($num%10 > 0) { $name .= '-'; } } } if (($num >= 10) && ($num < 20)) { $name .= $teenthstringfrench[$num%10]; } elsif ($_[0] == 1) { $name = 'premi\`ere'; } elsif (($num%10 > 0) || ($_[0] == 0)) { $name .= $unitthstringfrench[$num%10]; } } $name; } sub get_ordinalstringspanish{ local($num,$gender) = @_; local($name)=""; local($str); unless (($num >= 1000000) || ($num < 0)) { if ($num >= 1000) { if ($num >= 2000) { local($thousands) = &get_ordinalstringspanish($num/1000); if ($gender eq 'f') { $thousands =~s/o(s?)$/a\1/; } $name .= $thousands. " "; } else { $name = ""; } $name .= "$thousandthnamespanish"; if ($gender eq 'f') { $name =~s/o$/a/; } $num = $num%1000; } if ($num >= 100) { if ($_[0] >= 1000) { $name .= " "; } local($hundreds) = $hundredthstringspanish[$num/100]; if ($gender eq 'f') { $hundreds =~s/o$/a/; } $name .= $hundreds; $num = $num%100; } if (($_[0] > 100) && ($_[0]%100 > 0)) { $name .= " "; } local($lastbit)=""; if ($num >= 20) { $lastbit = $tenthstringspanish[$num/10]; if ($num%10 > 0) { $lastbit .= ' '; } if ($gender eq 'f') { $lastbit =~s/o([ s]*)$/a\1/; } $name .= $lastbit; $lastbit = ""; } if (($num >= 10) && ($num < 20)) { $lastbit = $teenthstringspanish[$num%10]; } elsif (($num%10 > 0) || ($_[0] == 0)) { $lastbit = $unitthstringspanish[$num%10]; } if ($gender eq 'f') { $lastbit =~s/o([ s]*)$/a\1/; } $name .= $lastbit; } $name; } sub get_ordinalstringportuges{ local($num,$gender) = @_; local($name)=""; local($str); unless (($num >= 1000000) || ($num < 0)) { if ($num >= 1000) { if ($num >= 2000) { local($thousands) = &get_ordinalstringportuges($num/1000); if ($gender eq 'f') { $thousands =~s/o(s?)$/a\1/; } $name .= $thousands. " "; } else { $name = ""; } $name .= "$thousandthnameportuges"; if ($gender eq 'f') { $name =~s/o$/a/; } $num = $num%1000; } if ($num >= 100) { if ($_[0] >= 1000) { $name .= " "; } local($hundreds) = $hundredthstringportuges[$num/100]; if ($gender eq 'f') { $hundreds =~s/o$/a/; } $name .= $hundreds; $num = $num%100; } if (($_[0] > 100) && ($_[0]%100 > 0)) { $name .= "-"; } local($lastbit)=""; if ($num >= 10) { $lastbit = $tenthstringportuges[$num/10]; if ($num%10 > 0) { $lastbit .= '-'; } if ($gender eq 'f') { $lastbit =~s/o([ s]*)$/a\1/; } $name .= $lastbit; $lastbit = ""; } if (($num%10 > 0) || ($_[0] == 0)) { $lastbit = $unitthstringportuges[$num%10]; } if ($gender eq 'f') { $lastbit =~s/o([ s]*)$/a\1/; } $name .= $lastbit; } $name; } sub get_ordinalstring{ local($val,$gender) = @_; if ($default_language eq 'french') { &get_ordinalstringfrench($val,$gender); } elsif ($default_language eq 'spanish') { &get_ordinalstringspanish($val,$gender); } elsif ($default_language eq 'portuges') { &get_ordinalstringportuges($val,$gender); } else { &get_ordinalstringenglish($val); } } sub do_cmd_ordinalstringnum{ local($_) = @_; local($num,$gender); $num = &missing_braces unless (($_[0]=~s/$next_pair_pr_rx//o)&&($num=$2)); if ($_[0] =~ s/\[(m|f)\]//) { $gender = $1; } else { $gender = 'm'; } join('', &get_ordinalstring($num,$gender), $_[0]); } sub do_cmd_ordinalstring{ local($ctr, $val, $id, $_) = &read_counter_value($_[0]); local($gender)='m'; $_[0] =~ s/${OP}$id${CP}$ctr${OP}$id${CP}//; if ($_[0]=~s/\[(.)\]//) { $gender = $1; } if ($ctr eq 'DAY' or $ctr eq 'MONTH' or $ctr eq 'YEAR') { # this is a cludge to make it work with newdateformat join('', '{ORDINALSTRING{', $ctr, '}}', $_[0]); } else { join('', &get_ordinalstring($val, $gender), $_[0]); } } sub get_Ordinalstring{ local($val,$gender) = @_; local($string) = &get_ordinalstring($val,$gender); $string =~ s/([a-z])([^\s\-]+)/\u\1\2/g; if ($default_language eq 'french') { $string =~ s/ Et / et /g; } else { $string =~ s/ And / and /g; } $string; } sub do_cmd_Ordinalstringnum{ local($_) = @_; local($num,$gender); $num = &missing_braces unless (($_[0]=~s/$next_pair_pr_rx//o)&&($num=$2)); if ($_[0] =~ s/\[(m|f)\]//) { $gender = $1; } else { $gender = 'm'; } join('', &get_Ordinalstring($num,$gender), $_[0]); } sub do_cmd_Ordinalstring{ local($ctr, $val, $id, $_) = &read_counter_value($_[0]); local($gender)='m'; $_[0] =~ s/${OP}$id${CP}$ctr${OP}$id${CP}//; if ($_[0]=~s/\[(.)\]//) { $gender = $1; } if ($ctr eq 'DAY' or $ctr eq 'MONTH' or $ctr eq 'YEAR') { # this is a cludge to make it work with newdateformat join('', '{OORDINALSTRING{', $ctr, '}}', $_[0]); } else { join('', &get_Ordinalstring($val, $gender), $_[0]); } } sub do_cmd_fmtcountsetoptions{ local($_) = @_; local($options) = &missing_braces unless ($_[0]=~(s/$next_pair_pr_rx//o)&&($options=$2)); if ($options =~ m/french=?(\w*)(,|$)/) { if ($1 eq 'france' or $1 eq 'swiss' or $1 eq 'belgian') { $frenchdialect = $1; print "Using French dialect: $1" if ($VERBOSITY > 0) ; } elsif ($1 eq '') { $frenchdialect = 'france'; print "Using French dialect: france" if ($VERBOSITY > 0); } else { &write_warnings("unknown french dialect '$1'"); } } if ($options =~ m/abbrv=?(\w*)(,|$)/) { if ($1 eq 'true' or $1 eq '') { $ordinalabbrv = 1; print "Setting abbrv=true" if ($VERBOSITY > 0); } elsif ($1 eq 'false') { $ordinalabbrv = 0; print "Setting abbrv=false" if ($VERBOSITY > 0); } else { &write_warnings("fmtcountsetoptions key abbrv: unknown value '$1'."); } } if ($options =~ m/fmtord=(\w*)(,|$)/) { if ($1 eq 'raise') { &do_fmtcount_raise(); print "Using raised ordinals" if ($VERBOSITY > 0); } elsif ($1 eq 'level') { &do_fmtcount_level(); print "Using level ordinals" if ($VERBOSITY > 0); } elsif ($1 eq 'user') { # do nothing print "Using user defined fmtord" if ($VERBOSITY > 0); } else { &write_warnings("unknown fmtcount option fmtord=$1"); } } $_[0]; } $padzeroes = 0; sub do_cmd_padzeroes{ local($_) = @_; local($val,$pat) = &get_next_optional_argument; if ($val eq '') { $padzeroes = 17; } else { $padzeroes = $val; } $_; } sub get_binary{ local($num) = @_; local($val) = ""; for (my $i=17; $i>=0; $i--) { if (($i < $padzeroes) || ($num & (1 << $i)) || !($val eq "")) { $val .= ($num & (1 << $i) ? 1 : 0); } } $val; } sub do_cmd_binary{ local($ctr, $val, $id, $_) = &read_counter_value($_[0]); join('', &get_binary($val), $_); } sub do_cmd_binarynum{ local($_) = @_; local($num) = &missing_braces unless ($_[0]=~(s/$next_pair_pr_rx//o)&&($num=$2)); join('', &get_binary($num), $_); } sub get_decimal{ local($num) = @_; sprintf "%0${padzeroes}d", $num; } sub do_cmd_decimal{ local($ctr, $val, $id, $_) = &read_counter_value($_[0]); join('', &get_decimal($val), $_); } sub do_cmd_decimalnum{ local($_) = @_; local($num) = &missing_braces unless ($_[0]=~(s/$next_pair_pr_rx//o)&&($num=$2)); join('', &get_decimal($num), $_); } sub get_hexadecimal{ local($num) = @_; sprintf "%0${padzeroes}lx", $num; } sub do_cmd_hexadecimal{ local($ctr, $val, $id, $_) = &read_counter_value($_[0]); join('', &get_hexadecimal($val), $_); } sub do_cmd_hexadecimalnum{ local($_) = @_; local($num) = &missing_braces unless ($_[0]=~(s/$next_pair_pr_rx//o)&&($num=$2)); join('', &get_hexadecimal($num), $_); } sub get_Hexadecimal{ local($num) = @_; sprintf "%0${padzeroes}lX", $num; } sub do_cmd_Hexadecimal{ local($ctr, $val, $id, $_) = &read_counter_value($_[0]); join('', &get_Hexadecimal($val), $_); } sub do_cmd_Hexadecimalnum{ local($_) = @_; local($num) = &missing_braces unless ($_[0]=~(s/$next_pair_pr_rx//o)&&($num=$2)); join('', &get_Hexadecimal($num), $_); } sub get_octal{ local($num) = @_; sprintf "%0${padzeroes}lo", $num; } sub do_cmd_octal{ local($ctr, $val, $id, $_) = &read_counter_value($_[0]); join('', &get_octal($val), $_); } sub do_cmd_octalnum{ local($_) = @_; local($num) = &missing_braces unless ($_[0]=~(s/$next_pair_pr_rx//o)&&($num=$2)); join('', &get_octal($num), $_); } sub get_aaalph{ local($num) = @_; local($rep) = int($num/26) + 1; local($c) = chr(ord('a')-1+$num%26); local($_) = $c x $rep; } sub do_cmd_aaalph{ local($ctr, $val, $id, $_) = &read_counter_value($_[0]); join('', &get_aaalph($val), $_); } sub get_AAAlph{ local($num) = @_; local($rep) = int($num/26) + 1; local($c) = chr(ord('A')-1+$num%26); local($_) = $c x $rep; } sub do_cmd_AAAlph{ local($ctr, $val, $id, $_) = &read_counter_value($_[0]); join('', &get_AAAlph($val), $_); } sub do_cmd_aaalphnum{ local($_) = @_; local($num) = &missing_braces unless ($_[0]=~(s/$next_pair_pr_rx//o)&&($num=$2)); join('', (sprintf "%${padzeroes}s", &get_aaalph($num)), $_); } sub do_cmd_AAAlphnum{ local($_) = @_; local($num) = &missing_braces unless ($_[0]=~(s/$next_pair_pr_rx//o)&&($num=$2)); join('', uc(sprintf "%${padzeroes}s", &get_aaalph($num)), $_); } sub get_abalph{ local($num) = @_; local($str); if ($num == 0) { $str = ''; } elsif ($num > 0 && $num <= 26) { $str = chr(ord('a')-1+$num); } else { $str = &get_abalph(int($num/26)) . chr(ord('a')-1+($num%26)); } $str; } sub do_cmd_abalph{ local($ctr, $val, $id, $_) = &read_counter_value($_[0]); join('', (sprintf "%${padzeroes}s", &get_abalph($val)), $_); } sub do_cmd_abalphnum{ local($_) = @_; local($num) = &missing_braces unless ($_[0]=~(s/$next_pair_pr_rx//o)&&($num=$2)); join('', (sprintf "%${padzeroes}s", &get_abalph($num)), $_); } sub do_cmd_ABAlph{ local($ctr, $val, $id, $_) = &read_counter_value($_[0]); join('', uc(sprintf "%${padzeroes}s", &get_abalph($val)), $_); } sub do_cmd_ABAlphnum{ local($_) = @_; local($num) = &missing_braces unless ($_[0]=~(s/$next_pair_pr_rx//o)&&($num=$2)); join('', uc(sprintf "%${padzeroes}s", &get_abalph($num)), $_); } sub get_twodigit{ local($num) = @_; sprintf "%02d", $num; } sub do_cmd_twodigit{ local($_) = @_; local($num) = &missing_braces unless ($_[0]=~(s/$next_pair_pr_rx//o)&&($num=$2)); # this is a cludge if ($num eq "THEDAY" or $num eq "THEYEAR" or $num eq "THEMONTH") { join('', 'TWODIGIT{', $num, '}', $_[0]); } else { join('', get_twodigit($num), $_[0]); } } # this was put here to help with the definition of \datelatin sub do_cmd_romannumeral{ local($_) = @_; local($num) = &missing_braces unless ($_[0]=~(s/$next_pair_pr_rx//o)&&($num=$2)); # this is a cludge if ($num eq "THEDAY" or $num eq "THEYEAR" or $num eq "THEMONTH") { join('', 'ROMANNUMERAL{', $num, '}', $_[0]); } else { join('', &froman($num), $_[0]); } } # load configuration file if it exists # Note: The configuration file should be loaded before # the package options are executed. # why doesn't this work? If I call this subroutine it # causes an infinite loop. sub load_fmtcount_cfg{ local($file,$found); $file = &fulltexpath('fmtcount.cfg'); $found = (-f $file); if (!$found) { foreach $texpath (split /$envkey/, $TEXINPUTS) { $file = "$texpath${dd}fmtcount.cfg"; last if ($found = (-f $file)); } } if ($found) { print "\nusing configuration file $file\n"; &slurp_input($file); &pre_process; &substitute_meta_cmds if (%new_command || %new_environment); &wrap_shorthand_environments; $_ = &translate_commands(&translate_environments($_)); print "\n processed size: ".length($_)."\n" if ($VERBOSITY>1) } else { print "\nNo configuation file fmtcount.cfg found\n" if ($VERBOSITY>1) } } 1; % \end{macrocode} % \begin{macrocode} % % \end{macrocode} % \begin{macrocode} %<*fc-samp.tex> % \end{macrocode} \documentclass[a4paper]{article} \usepackage[french]{babel} \usepackage{fmtcount} \newcounter{N} \newcommand{\printrow}[1]{% \newline \setcounter{N}{#1} \makebox[0.25in][r]{\theN\quad} \makebox[0.75in][r]{\hexadecimal{N}\quad} \makebox[0.75in][r]{\ordinal{N}\quad} \makebox[2in][l]{\numberstring{N}} } \renewcommand{\thesection}{\ordinal{section}} \begin{document} \section{Displaying the value of a counter} \label{ex} \begin{ttfamily} \noindent \makebox[0.25in][c]{N} \makebox[0.75in][c]{hexadecimal} \makebox[0.75in][c]{ordinal} numberstring \printrow{0} \printrow{1} \printrow{2} \printrow{3} \printrow{4} \printrow{5} \printrow{6} \printrow{7} \printrow{8} \printrow{9} \printrow{10} \printrow{11} \printrow{12} \printrow{13} \printrow{14} \printrow{15} \printrow{16} \printrow{17} \printrow{18} \printrow{19} \printrow{20} \printrow{21} \printrow{22} \printrow{23} \printrow{24} \printrow{25} \printrow{30} \printrow{40} \printrow{50} \printrow{60} \printrow{70} \printrow{71} \printrow{75} \printrow{80} \printrow{81} \printrow{85} \printrow{90} \printrow{91} \printrow{95} \printrow{100} \printrow{101} \printrow{110} \printrow{125} \printrow{150} \printrow{170} \printrow{180} \printrow{190} \printrow{200} \printrow{250} \printrow{300} \printrow{400} \printrow{500} \printrow{600} \printrow{700} \printrow{800} \printrow{900} \printrow{1000} \printrow{99999} \end{ttfamily} \section{Cross-Referencing} Referencing a label: \ref{ex}. Passing numbers explicitly: \ordinalnum{10}, \Numberstringnum{10}, \Ordinalstringnum{10}. \end{document} % \begin{macrocode} % % \end{macrocode} % \begin{macrocode} %<*fc-lang.tex> % \end{macrocode} % This is an interactive script. Run it through \LaTeX % and enter appropriate responses. \documentclass[a4paper]{article} \usepackage[french,english,spanish,portuges]{babel} \usepackage{fmtcount} \newcounter{startval} \newcounter{endval} \newcounter{stepsize} \newcounter{N} \newcount\myctr \newcount\langid \begin{document} \section{Displaying the value of a counter} \typeout{This is an interactive script, testing the fmtcount package.} \langid=-1 \loop \typeout{Which language?^^J} \typeout{[1] English} \typeout{[2] Portuguese} \typeout{[3] Spanish} \typeout{[4] French} \typeout{[5] French (Swiss)} \typeout{[6] French (Belgium)} \typein[\response]{} \ifthenelse{\equal{\response}{1}}{\langid=1}{ \ifthenelse{\equal{\response}{2}}{\langid=2}{ \ifthenelse{\equal{\response}{3}}{\langid=3}{ \ifthenelse{\equal{\response}{4}}{\langid=4\fmtcountsetoptions{french}}{ \ifthenelse{\equal{\response}{5}}{\langid=5\fmtcountsetoptions{french=swiss}}{ \ifthenelse{\equal{\response}{6}}{\langid=6\fmtcountsetoptions{french=belgian}} {\langid=-1 \typeout{Invalid response '\response', please select a number from 1 to 6}}}}}}} \ifnum\langid=-1 \repeat \ifcase\langid \or \selectlanguage{english} Current language: English. \or \selectlanguage{portuges} Current language: Portuguese. \or \selectlanguage{spanish} Current language: Spanish. \or \selectlanguage{french} Current language: French. \or \selectlanguage{french} Current language: French (Swiss). \or \selectlanguage{french} Current language: French (Belgium). \fi \def\startval{-1} \loop \typein[\startval]{Start value? (Integer from 0 to 99000) [Default 1]} \ifthenelse{\equal{\startval}{}}{\def\startval{1}}{} \ifnum\startval<0\def\startval{-1}\fi \ifnum\startval>99999\def\startval{-1}\fi \ifnum\startval=-1 \repeat \def\endval{-1} \loop \typein[\endval]{End value? (Integer from 0 to 99999) [Default 1000]} \ifthenelse{\equal{\endval}{}}{\def\endval{1000}}{} \ifnum\endval<0\def\endval{-1}\fi \ifnum\endval>99000\def\endval{-1}\fi \ifnum\endval=-1 \repeat \def\stepsize{0} \loop \typein[\stepsize]{Step size? (Non zero integer) [Default 1]} \ifthenelse{\equal{\stepsize}{}}{\def\stepsize{1}}{} \ifnum\stepsize=0 \repeat \typeout{From {\startval} to {\endval} step {\stepsize}} \ifnum\startval<\endval \ifnum\stepsize<0 \PackageError{fc-lang}{Infinite loop not permitted!}{} \def\endval{\startval} \fi \fi \ifnum\startval>\endval \ifnum\stepsize>0 \PackageError{fc-lang}{Infinite loop not permitted!}{} \def\endval{\startval} \fi \fi \myctr=-1 \loop \typeout{Which format?^^J} \typeout{[1] ordinalstring} \typeout{[2] Ordinalstring} \typeout{[3] numberstring} \typeout{[4] Numberstring} \typein[\response]{Default: 1} \ifthenelse{\equal{\response}{}}{\def\response{1}}{}%default val \ifthenelse{\equal{\response}{1}}{\myctr=1}{ \ifthenelse{\equal{\response}{2}}{\myctr=2}{ \ifthenelse{\equal{\response}{3}}{\myctr=3}{ \ifthenelse{\equal{\response}{4}}{\myctr=4}{\myctr=-1 \typeout{Invalid response '\response', please select a number from 1 to 4}}}}} \ifnum\myctr=-1 \repeat \ifcase\myctr \or\def\stringtype{ordinalstring} \or\def\stringtype{Ordinalstring} \or\def\stringtype{numberstring} \or\def\stringtype{Numberstring} \fi \ifnum\langid>3 \myctr=-1 \loop \typeout{Ordinal type?^^J} \typeout{[1] eme} \typeout{[2] e} \typein[\response]{Default: 1} \ifthenelse{\equal{\response}{}}{\def\response{1}}{}%default \ifthenelse{\equal{\response}{1}}{% \fmtcountsetoptions{abbrv=false}\myctr=1}{% \ifthenelse{\equal{\response}{2}}{% \fmtcountsetoptions{abbrv}\myctr=2}{% \myctr=-1}} \ifnum\myctr=-1 \repeat \fi \myctr=-1 \loop \typeout{Ordinal format?^^J} \typeout{[1] raised} \typeout{[2] level} \typein[\response]{Default: 1} \ifthenelse{\equal{\response}{1}\or\equal{\response}{}}{% \fmtcountsetoptions{fmtord=raise}\myctr=1}{% \ifthenelse{\equal{\response}{2}}{% \fmtcountsetoptions{fmtord=level}\myctr=2}{% \myctr=-1}} \ifnum\myctr=-1 \repeat \ifnum\langid=1 \myctr=1 \else \loop \typein[\response]{Gender? (m or f) [Default: m]} \ifthenelse{\equal{\response}{m}\or\equal{\response}{}}{\myctr=1}{ \ifthenelse{\equal{\response}{f}}{\myctr=2}{\myctr=-1 \typeout{Invalid response '\response'}}} \ifnum\myctr=-1 \repeat \fi \ifcase\myctr \or \def\gender{m} \or \def\gender{f} \fi \setcounter{startval}{\startval} \setcounter{endval}{\endval} \setcounter{stepsize}{\stepsize} \stepcounter{endval} \begin{ttfamily} \noindent \makebox[0.25in][c]{N} \makebox[0.5in][c]{ordinal}\quad \stringtype \par \myctr=\value{startval} \loop \noindent \setcounter{N}{\myctr} \makebox[0.25in][r]{\arabic{N}} \makebox[0.5in][r]{\ordinal{N}[\gender]}\quad \csname\stringtype\endcsname{N}[\gender]. \par \advance\myctr by \value{stepsize}\relax \ifnum\myctr<\value{endval} \repeat \end{ttfamily} \end{document} % \begin{macrocode} % % \end{macrocode} %\Finale \endinput