Difference between revisions of "Page numbering in words"

From Wiki
Jump to navigation Jump to search
(neutral POV...)
m
 
Line 121: Line 121:
  
 
This code originated with Jonathan Sauerand (in German), and was modified and explained by Wolfgang Schuster and Zhichu Chen.
 
This code originated with Jonathan Sauerand (in German), and was modified and explained by Wolfgang Schuster and Zhichu Chen.
 +
 +
[[Category:Basics]]

Latest revision as of 15:10, 8 June 2020

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.