Page numbering in words

From ConTeXt wiki
Jump to: navigation, search

To number pages using words rather than numbers (eg 'three' or 'twentyfive' rather than 3 or 25), put the following code in your document:

\input numstr

\defineconversion [numstring][\numstr]
\setuppagenumbering[conversion=numstring]

and make the following macro file (numstr.tex) available:

\unprotect

\def\numstring#1{\expandafter\@numstring\csname c@#1\endcsname}

\def\@numstring#1{\ns@numstr{#1}\ns@nineteens{null}{}}

\let\numstr\@numstring%

\def\ns@numoutofrange#1#2{\number#1#2}

\def\ns@numstr#1#2#3#4%
  {\ifnum\number#1<\plusone%
     #3%
   \else\ifnum\number#1<1000000000 %
     \expandafter\ns@numstring\expandafter{\number#1}#2%
   \else%
     \ns@numoutofrange{#1}{#4}%
   \fi\fi}

\def\ns@numstring#1#2{%
  \expandafter\ns@@numstring%
  \ifcase%
  \ifnum#1<10 1%
  \else\ifnum#1<100 2%
  \else\ifnum#1<\@m 3%
  \else\ifnum#1<\@M 4%
  \else\ifnum#1<100000 5%
  \else\ifnum#1<1000000 6%
  \else\ifnum#1<10000000 7%
  \else\ifnum#1<100000000 8%
  \else9%
  \fi\fi\fi\fi\fi\fi\fi\fi %
  \or00000000#1% case 1: Add 8 leading zeros
  \or0000000#1%  case 2: Add 7 leading zeros
  \or000000#1%   case 3: Add 6 leading zeros
  \or00000#1%    case 4: Add 5 leading zeros
  \or0000#1%     case 5: Add 4 leading zeros
  \or000#1%      case 6: Add 3 leading zeros
  \or00#1%       case 7: Add 2 leading zeros
  \or0#1%        case 8: Add 1 leading zero
  \or#1%         case 9: Add no leading zeros
  \or%
  \@nil#2%
  \fi}

\def\ns@@numstring#1#2#3#4#5#6#7\or#8\@nil#9%
  {\ifnum#1#2#3>\z@
   \ns@million#1#2#3%
   \ifnum#4#5#6>\z@\space\fi%
   \fi%
   \ifnum#4#5#6>\z@%
   \ns@hundred#4#5#6{#1#2#3}{#4#5}\ns@nineteen%
   \ifnum#4#5#6>\z@\space\fi%
   thousand%
   \ifnum#7>\z@\space\fi%
   \fi%
   \ns@hundred#7{#4#5#6}1#9}

\def\ns@million#1#2#3%
  {\ifnum#1#2#3=\plusone%
   \ns@hundred#1#2#301\ns@nineteene%
   \space%
   million%
   \else%
   \ns@hundred#1#2#301\ns@nineteens%
   \space%
   millions%
   \fi}

\def\ns@hundred#1#2#3#4#5#6%
  {\ifnum#1>\z@%
   \ifnum#4#1>\z@\ns@nineteen#1\space\fi%
   hundred%
   \ifnum#2#3>\z@\space and\space\fi%
   \fi%
   \ifnum#2#3<20 %
   \ifnum#5#2#3>\z@#6{#2#3}\fi%
   \else%
   \ns@ninety#2\ifnum#3>\z@-\ns@nineteen#3\fi%
   #60%
   \fi}

\def\ns@nineteen#1%
  {\ifcase#1\empty\or one\or two\or three\or four\or five\or six\or%
   seven\or eight\or nine\or ten\or eleven\or twelve\or thirteen\or%
   fourteen\or fifteen\or sixteen\or seventeen\or%
   eighteen\or nineteen\fi}

\def\ns@nineteens#1{\ns@nineteen{#1}}

\def\ns@nineteene#1{\ns@nineteen{#1}}


\def\ns@ninety#1%
  {\ifcase#1
   \or
   \or twenty%
   \or thirty%
   \or forty%
   \or fifty%
   \or sixty%
   \or seventy%
   \or eighty%
   \or ninety%
   \fi}

\protect

This code originated with Jonathan Sauerand (in German), and was modified and explained by Wolfgang Schuster and Zhichu Chen.

C O N T E X T G A R D E N

Personal tools
Namespaces
Variants
Actions
Help
External Help
Installation
Navigation
Toolbox