<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">% \iffalse meta-comment
% Line endings: UNIX
% Tab size:     4
%
% Copyright 2004 Jonathan Sauer
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3
% of this license or (at your option) any later version.
% The latest version of this license is in
%
%   http://www.latex-project.org/lppl.txt
%
% and version 1.3 or later is part of all distributions of LaTeX
% version 2003/12/01 or later.
%
% This work has the LPPL maintenance status "maintained".
%
% The Current Maintainer of this work is Jonathan Sauer
% (&lt;jonathan.sauer@gmx.de&gt;).
%
% This work consists of the files zahl2string.dtx and zahl2string.ins
% and the derived file zahl2string.sty.
%
% \fi
%
% \iffalse
%
%&lt;*driver&gt;
\documentclass{ltxdoc}
\usepackage{zahl2string}
\EnableCrossrefs
\CodelineIndex
\RecordChanges
% Modification of verbatim for tabs in listings
\makeatletter
{\catcode`\ =\active%
\catcode`\^^I=\active%
\gdef\@vobeyspaces{%
\catcode`\ \active\let \@xobeysp%
\catcode`\^^I\active\def^^I{~~}%
}}%
\makeatother
\begin{document}
	\DocInput{\jobname.dtx}
\end{document}
%&lt;/driver&gt;
%
%&lt;package&gt;\NeedsTeXFormat{LaTeX2e}
%&lt;package&gt;\ProvidesPackage{zahl2string}
%&lt;package&gt;   [2004/11/25 v1.2.1 format a number as german words]
%
% \fi
%
% \CheckSum{331}
% \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     \&amp;
%   Acute accent  \'     Left paren    \(     Right paren   \)
%   Asterisk      \*     Plus          \+     Comma         \,
%   Minus         \-     Point         \.     Solidus       \/
%   Colon         \:     Semicolon     \;     Less than     \&lt;
%   Equals        \=     Greater than  \&gt;     Question mark \?
%   Commercial at \@     Left bracket  \[     Backslash     \\
%   Right bracket \]     Circumflex    \^     Underscore    \_
%   Grave accent  \`     Left brace    \{     Vertical bar  \|
%   Right brace   \}     Tilde         \~}
%
% \DoNotIndex{\",\@empty,\@M,\@m,\@tempa,\csname,\DeclareOption}
% \DoNotIndex{\DeclareRobustCommand,\def}
% \DoNotIndex{\else,\endcsname,\expandafter,\fi,\if,\ifcase}
% \DoNotIndex{\ifnum,\let,\MakeUppercase,\newcommand,\number,\or}
% \DoNotIndex{\PackageError,\PackageWarning,\ProcessOptions}
% \DoNotIndex{\protected@edef,\relax,\space,\ss,\string,\z@}
% \DoNotIndex{\@ne,\@nil,\-}
%
% \GetFileInfo{\jobname.sty}
%
% \changes{1.1}{2004/08/08}{Range expanded to 999,999,999.}
% \changes{1.2.1}{2004/10/20}{@Numstring and @Ordstring made robust.}
%
% \title{The \textsf{zahl2string} package\thanks{This document
% corresponds to \textsf{\filename}~\fileversion, dated \filedate.}}
%
% \author{Jonathan Sauer \\ \texttt{jonathan.sauer@gmx.de}}
%
% \date{\filedate}
%
% \maketitle
%
% \begin{abstract}
% This file describes the \textsf{zahl2string} package that provides
% macros for formatting numbers as german words, i.e. `1' gets
% formatted as `eins'.
%
% \end{abstract}
%
% \tableofcontents
%
% \section{Introduction}
%
% Sometimes, for example when formatting a chapter title, you do not
% want to say `Kapitel 1' (`Chapter 1') but `Kapitel eins' (`Chapter
% one') or `Erstes Kapitel' (`First chapter'). This package provides
% macros to format a \LaTeX-counter or more generally speaking a
% number as a german word.
%
%
% \section{Description of the macros}
%
% All macros format numbers in the range 0 to 999,999,999. Larger
% numbers are formatted as an arabic number, smaller numbers are
% formatted as zero. This can be changed using the package options
% described on page \pageref{sec:Options}.
%
% \subsection{\LaTeX\ macros}
%
% The four macros |\numstring|, |\Numstring|, |\ordstring| and
% |\Ordstring| are macros taking a \LaTeX-counter as their only
% argument.
%
% \DescribeMacro{\numstring} Usage: |\numstring| \marg{LaTeX counter}.
%
% Formats a \LaTeX\ counter in the range of 0 to 999,999,999 as a
% word.
%
% \DescribeMacro{\Numstring} Usage: |\Numstring| \marg{LaTeX counter}.
%
% Formats a \LaTeX\ counter in the range of 0 to 999,999,999 as words,
% where the first letter is a capital letter.
%
% \DescribeMacro{\ordstring} Usage: |\ordstring| \marg{LaTeX counter}.
%
% Formats a \LaTeX\ counter in the range of 0 to 999,999,999 as an ordinal
% word.
%
% \DescribeMacro{\Ordstring} Usage: |\Ordstring| \marg{LaTeX counter}.
%
% Formats a \LaTeX\ counter in the range of 0 to 999,999,999 as an ordinal
% word, where the first letter is a capital letter.
%
%
%
% \subsection{General macros}
%
% The four macros |\@numstring|, |\@Numstring|, |\@ordstring| and
% |\@Ordstring| as well as their aliases |\numstr|, |\Numstr|,
% |\ordstr| and |\Ordstr| are macros taking a number or a \TeX\ count
% register as their only argument.
%
% \DescribeMacro{\@numstring} \DescribeMacro{\numstr} Usage:
% |\@numstring| \marg{number} / |\numstr| \marg{number}.
%
% Formats a number or a \TeX\ count register in the range of 0 to
% 999,999,999 as words.
%
% \DescribeMacro{\@Numstring} \DescribeMacro{\Numstr} Usage:
% |\@Numstring| \marg{number} / |\Numstr| \marg{number}.
%
% Formats a number or a \TeX\ count register in the range of 0 to
% 999,999,999 as words, where the first letter is a capital letter.
%
% \DescribeMacro{\@ordstring} \DescribeMacro{\ordstr} Usage:
% |\@ordstring| \marg{number} / |\ordstr| \marg{number}.
%
% Formats a number or a \TeX\ count register in the range of 0 to
% 999,999,999 as an ordinal word.
%
% \DescribeMacro{\@Ordstring} \DescribeMacro{\Ordstr} Usage:
% |\@Ordstring| \marg{number} / |\Ordstr| \marg{number}.
%
% Formats a number or a \TeX\ count register in the range of 0 to
% 999,999,999 as an ordinal word, where the first letter is a capital
% letter.
%
% ^^A For debugging discretionary hyphens:
% ^^A\def\-{.\discretionary{}{}{}}
%
%
%
% \section{Examples}
%
% \newcommand{\zahlexamples}[1]{
% 	0 $\Longrightarrow$ #1{0}
%
% 	7 $\Longrightarrow$ #1{7}
%
%	13 $\Longrightarrow$ #1{13}
%
%	23 $\Longrightarrow$ #1{23}
%
%	42 $\Longrightarrow$ #1{42}
%
%	99 $\Longrightarrow$ #1{99}
%
%	127 $\Longrightarrow$ #1{127}
%
%	999 $\Longrightarrow$ #1{999}
%
% 	1000 $\Longrightarrow$ #1{1000}
%
%	1001 $\Longrightarrow$ #1{1001}
%
%	2004 $\Longrightarrow$ #1{2004}
%
%	2017 $\Longrightarrow$ #1{2017}
%
%	2029 $\Longrightarrow$ #1{2029}
%
%	9999 $\Longrightarrow$ #1{9999}
%
%	10000 $\Longrightarrow$ #1{10000}
%
%	101101 $\Longrightarrow$ #1{101101}
%
%	999999 $\Longrightarrow$ #1{999999}
%
%	1000000 $\Longrightarrow$ #1{1000000}
%
%	1234567 $\Longrightarrow$ #1{1234567}
%
%	123456789 $\Longrightarrow$ #1{123456789}
%
%	101101101 $\Longrightarrow$ #1{101101101}
%
%	999999999 $\Longrightarrow$ #1{999999999}
% }
%
% \addvspace{\baselineskip}\noindent Some examples using |\numstring|,
% |\numstr| and |\@numstring|:
%
% \zahlexamples{\numstr}
%
% \addvspace{\baselineskip}\noindent Some examples using |\ordstring|,
% |\ordstr| and |\@ordstring|:
%
% \zahlexamples{\ordstr}
%
%
% \addvspace{\baselineskip}\noindent Formatting the current page
% number (a \LaTeX\ counter) results in: Dies ist Seite
% \numstring{page} (|\numstring{page}|). Dies ist die \ordstring{page}
% Seite (|\ordstring{page}|). Seite: \Numstring{page}
% (|\Numstring{page}|). \Ordstring{page} Seite (|\Ordstring{page}|).
%
%
%
% \section{Options}\label{sec:Options}
%
% The package has the following option:
%
% \begin{description}
% 	\item[showrangeerrors]	If a number larger than 999,999,999
% 							is to be formatted, normally the number
% 							is not formatted as words, but using
% 							arabic digits. This option changes this
% 							behaviour to display an error instead,
% 							thus notifying you when you format too
% 							large a number
%
% \end{description}
%
%
%
% \section{Creating your own formatting}
%
% You can modify output of the \textsf{zahl2string} macros in a
% limited way by providing your own macros for formatting the numbers
% between `1' and `19. \emph{But note} that if you simply want to add
% something to the suffix, , i.e. if you want to format numbers with
% the suffix `tens' (`erstens', `zweitens' \ldots), then you can
% simply say |\ordstr{|\meta{number}|}ns|, resulting in i.e.
% `\ordstr{42}ns'.
%
%
% If on the other hand you want to create a more complicated
% formatting, then you have to do the following:
%
% \begin{itemize}
% 	\item	Create a macro for formatting the numbers `1' to `19',
% 			i.e. |\my@neunzehnte|. See the predefined macros in
% 			section \ref{sec:LabFor} on page \pageref{sec:LabFor},
% 			|\ns@neunzehn|, |\ns@neunzehns|, |\ns@neunzehne| and
% 			|\ns@neunzehnord| for examples and notes.
%
%			This macro has one parameter, the number (up to two
%			digits, in the range of `0' to `19'. `0' must expand to the
%			generic suffix, i.e. `stens'; `19' to `19' simply format
%			the number.
%
%			Do not forget to insert discretionary hyphens using |\-|,
%			or hyphenation will not be perfect!
%
% 	\item	Create another macro you want to call, i.e. |\mynumstring|.
%			This macro takes one parameter, the number, and calls
%			|\ns@numstr| using the following parameters:
%
%			\begin{enumerate}
% 				\item	The number to be formatted (the parameter to
% 						|\mynumstring|).
%
% 				\item	The macro for formatting numbers `1' to `19',
% 						i.e. |\my@neunzehnte|.
%
% 				\item	The value that represents the number zero,
% 						i.e. `nulltens'.
%
% 				\item	The suffix for numbers larger than 999,999,999,
% 						i.e. `tens'.
%
%			\end{enumerate}
%
% 	\item	Call the macro |\mynumstring| with the number to format.
%
% \end{itemize}
% If you want to create a macro to format a \LaTeX-counter, create an
% additional macro, i.e. |\myLnumstring|, that calls |\mynumstring| by
% saying:
%
% \begin{verbatim}
% \newcommand{\myLnumstring}[1]{%
%	\expandafter\mynumstring\csname c@#1\endcsname%
% }
% \end{verbatim}
% See also the notes and predefined macros in section \ref{sec:LabFor}
% on page \pageref{sec:LabFor}.
%
%
%
% \section{Notes/Limitations}
%
% \begin{itemize}
%
%	\item	Ordinal numbers larger than 999999 do not look that
%			good, as i.e. 1000000 gets formatted as
%			`\ordstr{1000000}' instead of `einmillionste'.
%
% \end{itemize}
%
%
%
% \StopEventually{}
%
% \section{Implementation}
%
% \subsection{Main macros}
%
%
% \begin{macro}{\numstring}
%
% Usage: |\numstring| \marg{LaTeX counter}.
%
% Formats a \LaTeX\ counter in the range of 0 to 999,999,999 as words.
%
%    \begin{macrocode}
\newcommand{\numstring}[1]{%
	\expandafter\@numstring\csname c@#1\endcsname%
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\Numstring}
%
% Usage: |\Numstring| \marg{LaTeX counter}.
%
% Formats a \LaTeX\ counter in the range of 0 to 999,999,999 as words. The
% first letter is uppercase.
%
%    \begin{macrocode}
\newcommand{\Numstring}[1]{%
	\expandafter\@Numstring\csname c@#1\endcsname%
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\ordstring}
%
% Usage: |\ordstring| \marg{LaTeX counter}.
%
% Formats a \LaTeX\ counter in the range of 0 to 999,999,999 as an ordinal
% word.
%
%    \begin{macrocode}
\newcommand{\ordstring}[1]{%
	\expandafter\@ordstring\csname c@#1\endcsname%
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\Ordstring}
%
% Usage: |\Ordstring| \marg{LaTeX counter}.
%
% Formats a \LaTeX\ counter in the range of 0 to 999,999,999 as an ordinal
% word. The first letter is uppercase.
%
%    \begin{macrocode}
\newcommand{\Ordstring}[1]{%
	\expandafter\@Ordstring\csname c@#1\endcsname%
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@numstring}
%
% Usage: |\@numstring| \marg{number or \TeX\ count register}.
%
% Formats a number or a \TeX\ count register in the range of 0 to
% 999,999,999 as words.
%
%    \begin{macrocode}
\newcommand{\@numstring}[1]{%
	\ns@numstr{#1}\ns@neunzehns{null}{}%
}
%    \end{macrocode}
%
% \end{macro}
%
%
% \begin{macro}{\@Numstring}
%
% Usage: |\@Numstring| \marg{number or \TeX\ count register}.
%
% Formats a number or a \TeX\ count register in the range of 0 to
% 999,999,999 as words. The first letter is uppercase.
%
%    \begin{macrocode}
\newcommand\@Numstring[1]{%
	\expandafter\@@Numstring\expandafter{\number#1}%
}
%    \end{macrocode}
%
% \end{macro}
%
%
% \begin{macro}{\@@Numstring}
%
% Support macro for |\@Numstring| to make |\@Numstring| robust.
%
% \changes{1.2.1}{2004/10/20}{Added}
%
%    \begin{macrocode}
\DeclareRobustCommand{\@@Numstring}[1]{%
	\protected@edef\@tempa{\@numstring{#1}}%
	\expandafter\MakeUppercase\@tempa%
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@ordstring}
%
% Usage: |\@ordstring| \marg{number or \TeX\ count register}.
%
% Formats a number or a \TeX\ count register in the range of 0 to
% 999,999,999 as an ordinalword, i.e. `erste', `zweite' et cetera.
%
%    \begin{macrocode}
\newcommand{\@ordstring}[1]{%
	\ns@numstr{#1}\ns@neunzehnord{null\-te}{te}%
}
%    \end{macrocode}
%
% \end{macro}
%
%
% \begin{macro}{\@Ordstring}
%
% Usage: |\@Ordstring| \marg{number or \TeX\ count register}.
%
% Formats a number or a \TeX\ count register in the range of 0 to
% 999,999,999 as an ordinalword, i.e. `Erste', `Zweite' et cetera. The
% first letter is uppercase.
%
%    \begin{macrocode}
\newcommand{\@Ordstring}[1]{%
	\expandafter\@@Ordstring\expandafter{\number#1}%
}
%    \end{macrocode}
%
% \end{macro}
%
%
% \begin{macro}{\@@Ordstring}
%
% Support macro for |\@Ordstring| to make |\@Ordstring| robust.
%
% \changes{1.2.1}{2004/10/20}{Added}
%
%    \begin{macrocode}
\DeclareRobustCommand{\@@Ordstring}[1]{%
	\protected@edef\@tempa{\@ordstring{#1}}%
	\expandafter\MakeUppercase\@tempa%
}
%    \end{macrocode}
% \end{macro}
%
%
%
% We provide public aliases for the macros. The macros beginning with
% |@| are still necessary in order to be able to format the page
% number as a string. (see \textsf{ltpageno.dtx})
%
% \changes{1.2}{2004/09/08}{Added}
%
%    \begin{macrocode}
\let\numstr\@numstring%
\let\Numstr\@Numstring%
\let\ordstr\@ordstring%
\let\Ordstr\@Ordstring%
%    \end{macrocode}
%
%
% \subsection{Option processing}
%
% \changes{1.1}{2004/08/13}{Options `publicnumstr' and `showrangeerrors'
% added.}
% \changes{1.2}{2004/09/08}{Option `publicnumstr' deprecated}
%
%    \begin{macrocode}
\DeclareOption{publicnumstr}{%
	\PackageWarning{zahl2string}{Option `publicnumstr' is %
		deprecated and will be removed in version 1.3}%
}
%    \end{macrocode}
%
%
% \begin{macro}{\ns@numoutofrange}
%
% Formats a number that is too large to be formatted as words.
%
% Usage: |\ns@numoutofrange| \marg{number} \marg{suffix}.
%
% This macro is redefined to show an error message using the package
% option |showrangeerrors|.
%
%    \begin{macrocode}
\def\ns@numoutofrange#1#2{%
	\number#1#2%
}
%    \end{macrocode}
% \end{macro}
%

%    \begin{macrocode}
\DeclareOption{showrangeerrors}{%
	\def\ns@numoutofrange#1#2{%
		\PackageError{zahl2string}{The number `#1' is too large %
			to be formatted using zahl2string}{The largest possible %
			number is 999,999,999.}
	}%
}
%    \end{macrocode}
%
%
%
%    \begin{macrocode}
\ProcessOptions\relax
%    \end{macrocode}
%
%
%
% \subsection{Internal macros}
%
% \subsubsection{Splitting and formatting a number}
%
% \begin{macro}{\ns@numstr}
%
% Base macro for formatting a number.
%
% Usage: |\ns@numstr| \marg{number} \marg{macro} \marg{nullvalue}
% \marg{suffix}, where \meta{macro} is the macro to use for the
% numbers between |1| and |19|, as these require some special
% treatment, \meta{nullvalue} is the value this macro expands to when
% \meta{number} is zero, and \meta{suffix} is text added as a suffix
% to a number larger than 999,999,999.
%
% \changes{1.1}{2004/08/08}{Macro added}
%
%    \begin{macrocode}
\def\ns@numstr#1#2#3#4{%
	\ifnum\number#1&lt;\@ne%
		#3%
	\else\ifnum\number#1&lt;1000000000 %
		\expandafter\ns@numstring\expandafter{\number#1}#2%
	\else%
		\ns@numoutofrange{#1}{#4}%
	\fi\fi%
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\ns@numstring}
%
% \changes{1.1}{2004/08/14}{Reimplemented to avoid using up TeX's
% space for control sequences}
%
% Formats a number as words.
%
% Usage: |\ns@numstring| \marg{number} \marg{macro}, where
% \meta{macro} is the macro to use for the numbers between |1| and
% |19|, as these require some special treatment.
%
% \emph{Note: \meta{number} must be a real number consisting of digits
% in the range 0 to 9! It must not be a \TeX\ count register!}
%
% How does this work? Modulo operations are not trivial in \TeX\ as in
% order to achieve $a \bmod b$ you have to calculate $a - (a \div b)
% \times b$. This is complicated and also not expandable, so another
% solution has to be found.
%
% \TeX's capabilities of parsing text using macro arguments are fairly
% strong, so why not use them? It would be much easier if it would be
% possible of defining a macro with, say, six parameters, where each
% parameter is one digit of the number to be formatted. Then it would
% be possible to directly access each digit (or several digits
% combined by grouping several parameters) without having to perform
% lengthy modulo calculations.
%
% Adding leading zeros to a number is easily done by comparing it
% using |\ifnum| and adding zeros if the number is too small. However,
% the macro must not receive the |\ifnum| et.al. tokens as a
% parameter, but the result of the expansion, that is the number with
% leading zeros.
%
% |\expandafter| would not suffice, as it expands a macro only once,
% not fully. |\edef| would accomplish the task at hand, however
% |\edef| is not fully expandable.
%
% So what do we do? We take advantage of the fact that when expanding
% an |\ifcase|, \TeX\ goes on expanding until it has made sure that
% the number for the |\ifcase| is complete. So immediately after the
% |\ifcase| we launch into several nested |\ifnum|s, which \TeX\
% expands dutifully in order to determine the number to use.
%
% What these nested |\ifnum|s do is the following: Depending on the
% length of \meta{number}, they expand to a digit between one and
% nine, one being the digit if \meta{number} is less than 10 and nine
% being the digit if \meta{number} is larger than 99,999,999.
%
% Then \TeX\ uses this digit between one and nine to jump to the
% appropriate part of the |\ifcase|-clause. There \meta{number} is
% prefixed with the necessary amount of zeros to result in a number
% exactly nine digits long: For the digit one (resulting from the
% nested |\ifnum|s), eight leading zeros have to be prefixed, as
% \meta{number} is only one digit long, for the digit two, seven zeros
% are prefixed, as \meta{number} is less than 100 (but more than 9) et
% cetera, until for digit nine no zeros have to be prefixed, as
% \meta{number} is already nine digits long.
%
% Let's have an example: Suppose \meta{number} is 42. Then the result
% of the nested |\ifnum|s is 2, as \meta{number} is not less than 10
% but less than 100 (the second |\ifnum| is true). This 2 leads to
% jumping to part after the second |\or| (before the first |\or| is
% the part for the number 0, in this case left blank, and after the
% first |\or| for the number 1), which is |0000000#1|. |#1| is 42. So
% the result is: |000000042|, a number prefixed with leading zeros and
% exactly nine digits long.
%
% Another example: Suppose \meta{number} is 12,345,678. Then the
% result of the nested |\ifnum|s is 8, as the eigths |\ifnum| is true
% (less than 100,000,000 but not less than 10,000,000). Then only one
% zero is prefixed, resulting in |012345678|.
%
% However, we are not finished yet, as \TeX\ does not expand further.
% So we are left (picking up the second example above) with this:
% |012345678\or12345678\or| (the second incarnation of |12345678| is
% due to the ninth part of the |\ifcase| clause, |\or#1|).
%
% We do not need all this |\or| baggage, we only want the number. But
% \TeX\ is good at matching text using macros with delimited
% parameters, so we just define |\ns@@numstring| in a way that gobbles
% up the first |\or| and whatever follows.
%
% And we are done: We have a number padded perfectly with leading
% zeros to a length of nine digits!
%
% \paragraph{Implementation note} In Version 1.0, we used |\csname|
% \ldots\ |\endcsname| to add the leading zeros, as |\csname| \ldots\
% |\endcsname| expands everything inbetween until only unexpandable
% tokens remain, in this case digits (the |\ifnum|s are expanded).
% Afterwards, the resulting control sequence was converted into
% separate tokens using |\string| and finally, the backslash at the
% beginning was gobbled by |\ns@@numstring| as its first (and unused)
% argument.
%
% Unfortunately, this had its price: For every number we formatted
% using |\ns@numstring| and that had not been formatted before, a new
% entry was inserted into the hash table \TeX\ uses to store all
% control sequences. So if you had a document where you formatted a
% lot of numbers this way, you would run out of hash table space, and
% \TeX\ would complain. (The number of hash table entries used is
% indicated in the |log|-file as `multiletter control sequences'.)
%
% This was less than optimal, so we changed the implementation to this
% |\ifcase|-|\ifnum| construct.
%
%    \begin{macrocode}
\def\ns@numstring#1#2{%
	\expandafter\ns@@numstring%
		\ifcase%
			\ifnum#1&lt;10 1%
%    \end{macrocode}
%
% Why are the constants predefined by the \LaTeX-kernel used instead
% of numbers? Because they save tokens: |1000| are four tokens, |\@m|
% is only one.
%
%    \begin{macrocode}
			\else\ifnum#1&lt;100 2%
			\else\ifnum#1&lt;\@m 3%
			\else\ifnum#1&lt;\@M 4%
			\else\ifnum#1&lt;100000 5%
			\else\ifnum#1&lt;1000000 6%
			\else\ifnum#1&lt;10000000 7%
			\else\ifnum#1&lt;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
%    \end{macrocode}
%
% The next |\or| is only necessary because |\ns@@numstring| needs an
% |\or| as a delimiter of the number:
%
%    \begin{macrocode}
		\or%
%    \end{macrocode}
%
% The last parameter to |\ns@@numstring| is \meta{macro}; we delimit
% it using |\@nil|:
%
%    \begin{macrocode}
	\@nil#2%
%    \end{macrocode}
%
% Finally we end the |\ifcase| (note that this is \emph{after} the
% number has been formatted):
%
%    \begin{macrocode}
	\fi%
}
%    \end{macrocode}
%
% \end{macro}
%
%
% \begin{macro}{\ns@@numstring}
%
% Expands to a number in words between |1| and |999,999,999|.
%
% Usage: |\ns@@numstring| \marg{9. digit} \marg{8. digit} \marg{7.
% digit} \marg{6. digit} \marg{5. digit} \marg{4. digit} \marg{3rd -
% 1st digit} \marg{(ignored)} \marg{macro}, where \meta{macro} is, as
% is the case with |\ns@numstring|, the macro to use for the numbers
% between |1| and |19|, as these require some special treatment.
%
% |\or| and the following |#8| (\meta{ignored}) gobble up whatever was
% left from the expansion of |\ifcase| in |\ns@numstring|. |\@nil|
% acts as a delimiter for the last parameter, \meta{macro}.
%
% \changes{1.1}{2004/08/08}{Formatting of millions added.}
% \changes{1.1}{2004/08/14}{Changed to match reeimplementation of
% ns@numstring.}
%
%    \begin{macrocode}
\def\ns@@numstring#1#2#3#4#5#6#7\or#8\@nil#9{%
	\ifnum#1#2#3&gt;\z@
		\ns@million#1#2#3%
%    \end{macrocode}
%
% We insert a space if a number follows:
%
%    \begin{macrocode}
		\ifnum#4#5#6&gt;\z@\space\fi%
	\fi%
	\ifnum#4#5#6&gt;\z@%
		\ns@hundred#4#5#6{#1#2#3}{#4#5}\ns@neunzehn%
%    \end{macrocode}
%
% If there has been a number larger than one before the `tausend',
% insert a discretionary hyphen before:
%
%    \begin{macrocode}
		\ifnum#4#5#6&gt;\@ne\-\fi%
		tau\-send%
%    \end{macrocode}
%
% If there will be a number after the `tausend', insert a
% discretionary hyphen after:
%
%    \begin{macrocode}
		\ifnum#7&gt;\z@\-\fi%
	\fi%
	\ns@hundred#7{#4#5#6}1#9%
}
%    \end{macrocode}
%
% \end{macro}
%
%
% \begin{macro}{\ns@million}
%
% Expands to millions.
%
% Usage: |\ns@million| \marg{third digit} \marg{second digit}
% \marg{first digit}.
%
% \changes{1.1}{2004/08/08}{Macro added.}
%
%    \begin{macrocode}
\def\ns@million#1#2#3{%
	\ifnum#1#2#3=\@ne%
		\ns@hundred#1#2#301\ns@neunzehne%
		\space%
		Mil\-lion%
	\else%
		\ns@hundred#1#2#301\ns@neunzehns%
		\space%
		Mil\-lio\-nen%
	\fi%
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\ns@hundred}
%
% Expands to a number in words between |1| and |100|.
%
% Usage: |\ns@hundred| \marg{third digit} \marg{second digit}
% \marg{first digit} \marg{shownumber} \marg{showone}
% \marg{macro}.
%
% \meta{shownumber} defines if the number before the |hundert|
% (`hundred') should be shown, i.e. |einhundert| (`onehundred')
% instead of |hundert|. |0| is |false|, everything else |true|.
% Can contain more than one digit.
%
% \meta{showone} defines if \meta{macro} should be called for the
% number |1|. |0| is |false|, everything else |true|. Can contain more
% than one digit.
%
% What does all this code do? First the third digit (`hundred'),
% contained in |#1|, is expanded -- if it is not zero. However, there
% is a catch: If the third digit is one, this digit is only included
% in the result of this macro if |#4| says so. The reason is that
% normally you would say |hunderteins| (`101') instead of
% |einhunderteins| -- but not if there is a fourth digit. Then the
% digit has to be included in the output of the macro, i.e.
% |tausendeinhunderteins|
%
% So we want to include the digit in the output of the macro, if |#3|
% is larger than one \emph{or} |#4| is larger than zero. We could use
% two |\ifnum|s to accomplish this, but it can be combined into a
% single |\ifnum|, saving tokens and time:
%
% We check if |#4#1| is larger than one. That means that if |#1|, the
% third digit, is larger than one, it is included in the output. But
% that also means that if |#4| is not zero, |#4#1| is always at least
% |10|, which is also larger than one and exactly what we want.
%
% After successfully processing the third digit, the remaining last
% two digits (|#2| and |#3|) are not really complicated anymore. We
% perform some special treatment of the numbers between |1| and |19|
% as these numbers are not constructed systematically. Here we have to
% perform a check similar to the one performed for the third digit: We
% have to check if we have to output the number if it is |1|, using
% the same trick for a logical |or| as before, only this time with
% |#5|, |#2| and |#3|.
%
% The macro to output |1| to |19| is parametrized as |#6| in order to
% be able to use different macros for normal numbers and ordinal
% numbers.
%
% If the last two digits are larger than |19|, we first output the
% third digit using |\ns@neunzehn|, followed by |und| (`and') and then
% the second digit. Here we don't have to use the parametrized macro
% as before, as the ordinal suffix is appended at the end of the
% number, not inbetween.
%
% But where to get the suffix from? We could pass it as a macro, but
% that would be tedious. So we simply define the macro to output the
% numbers |1| to |19| (|\ns@neunzehns| for normal numbers and
% |\ns@neunzehnord| for ordinal numbers) to output the suffix if
% called with |0| as its parameter.
%
% And we are done!
%
%    \begin{macrocode}
\def\ns@hundred#1#2#3#4#5#6{%
%    \end{macrocode}
%
% We expand the third digit:
%
%    \begin{macrocode}
	\ifnum#1&gt;\z@%
%    \end{macrocode}
%
% Logical |OR| hidden in |#4#1| (see above):
%
%    \begin{macrocode}
		\ifnum#4#1&gt;\@ne\ns@neunzehn#1\-\fi%
		hun\-dert%
%    \end{macrocode}
%
% We insert a discretionary hyphen, if a number follows:
%
%    \begin{macrocode}
		\ifnum#2#3&gt;\z@\-\fi%
	\fi%
%    \end{macrocode}
%
% We expand the first an second digit:
%
%    \begin{macrocode}
	\ifnum#2#3&lt;20 %
%    \end{macrocode}
%
% Again: Logical |OR| in |#5#2#3|:
%
%    \begin{macrocode}
		\ifnum#5#2#3&gt;\@ne#6{#2#3}\fi%
	\else%
		\ifnum#3&gt;\z@\ns@neunzehn#3\-und\-\fi%
		\ns@neunzig#2%
		#60%
	\fi%
}
%    \end{macrocode}
%
% \end{macro}
%
%
% \subsubsection{Macros for formatting `1' to `19'}\label{sec:LabFor}
%
% Very important: The position for |0| must expand to the suffix of
% the number (\emph{any number}), see the explanations for
% |\ns@hundred| above. If it expands to a text (as opposed to
% |\@empty|), this text must be prefixed by a discretionary hyphen!
%
%
% \begin{macro}{\ns@neunzehn}
%
% Expands to |ein| (`1') to |neunzehn| (`19').
%
% \changes{1.1}{2004/08/08}{Hyphenation added.}
%
%    \begin{macrocode}
\def\ns@neunzehn#1{%
	\ifcase#1\@empty\or ein\or zwei\or drei\or vier\or f\"unf\or sechs\or%
		sie\-ben\or acht\or neun\or zehn\or elf\or zw\"olf\or drei\-zehn\or%
		vier\-zehn\or f\"unf\-zehn\or sech\-zehn\or sieb\-zehn\or%
		acht\-zehn\or neun\-zehn\fi%
}
%    \end{macrocode}
%
% \end{macro}
%
%
% \begin{macro}{\ns@neunzehns}
%
% Expands to |eins| (`1') to |neunzehn| (`19'). |0| expands to
% |\@empty|.
%
% Why |\@empty| instead of nothing? Because then \TeX\ would insert a
% |\relax| before the first |\or| in order to finish expansion of the
% number. This |\relax| would remain in the output and would stay
% there even when |\edef|ed, whereas |\@empty| expands to nothing.
%
% This is necessary for |\Numstring| and |\Ordstring|, as they convert
% the first token of the |\edef|ed result of |\numstring| and
% |\ordstring| to uppercase, and they need this token to be the first
% letter of the number, not |\relax|.
%
%    \begin{macrocode}
\def\ns@neunzehns#1{%
	\ifcase#1\@empty\or eins\else\ns@neunzehn{#1}\fi%
}
%    \end{macrocode}
%
% \end{macro}
%
%
\def\ns@neunzehne#1{%
	\ifcase#1\@empty\or ei\-ne\else\ns@neunzehn{#1}\fi%
}
%
%
% \begin{macro}{\ns@neunzehnord}
%
% Expands to |erste| (`1st') to |neunzehnte| (`19th'). |0| expands to
% |ste|.
%
% \changes{1.1}{2004/08/08}{Hyphenation added.}
%
%    \begin{macrocode}
\def\ns@neunzehnord#1{%
	\ifcase#1\-ste\or er\-ste\or zwei\-te\or drit\-te\or vier\-te\or%
		f\"unf\-te\or sech\-ste\or sieb\-te\or ach\-te\or neun\-te\or%
		zehn\-te\or elf\-te\or zw\"olf\-te\or drei\-zehn\-te\or%
		vier\-zehn\-te\or f\"unf\-zehn\-te\or sech\-zehn\-te\or%
		sieb\-zehn\-te\or acht\-zehn\-te\or neun\-zehn\-te\fi%
}
%    \end{macrocode}
%
% \end{macro}
%
%
% \begin{macro}{\ns@neunzig}
%
% Expands to |zwanzig| (twenty) to |neunzig| (ninety) in steps of ten.
%
% \changes{1.1}{2004/08/08}{Hyphenation added.}
%
%    \begin{macrocode}
\def\ns@neunzig#1{%
	\ifcase#1\or\or zwan\-zig\or drei\ss ig\or vier\-zig\or%
		f\"unf\-zig\or sech\-zig\or sieb\-zig\or acht\-zig\or%
		neun\-zig\fi%
}
%    \end{macrocode}
%
% \end{macro}
%
% \Finale
% \PrintChanges
% \PrintIndex
\endinput</pre></body></html>