summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/numspell
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/numspell
Initial commit
Diffstat (limited to 'macros/latex/contrib/numspell')
-rw-r--r--macros/latex/contrib/numspell/README29
-rw-r--r--macros/latex/contrib/numspell/numspell-english.sty250
-rw-r--r--macros/latex/contrib/numspell/numspell-french.sty335
-rw-r--r--macros/latex/contrib/numspell/numspell-german.sty262
-rw-r--r--macros/latex/contrib/numspell/numspell-italian.sty332
-rw-r--r--macros/latex/contrib/numspell/numspell-magyar.sty398
-rw-r--r--macros/latex/contrib/numspell/numspell.pdfbin0 -> 222065 bytes
-rw-r--r--macros/latex/contrib/numspell/numspell.sty301
-rw-r--r--macros/latex/contrib/numspell/numspell.tex578
9 files changed, 2485 insertions, 0 deletions
diff --git a/macros/latex/contrib/numspell/README b/macros/latex/contrib/numspell/README
new file mode 100644
index 0000000000..9afd9185e2
--- /dev/null
+++ b/macros/latex/contrib/numspell/README
@@ -0,0 +1,29 @@
+numspell.sty package
+
+Copyright 2017- by Tibor Tomacs
+
+This package supports the spelling of cardinal and ordinal numbers.
+Supported languages are English, French, German, Hungarian and Italian.
+
+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 2005/12/01 or later.
+
+This work has the LPPL maintenance status `maintained'.
+
+The Current Maintainer of this work is Tibor Tomacs.
+
+This work consists of the files
+
+README (this file)
+numspell.sty (main package file)
+numspell-english.sty (English package for numspell)
+numspell-french.sty (French package for numspell)
+numspell-german.sty (German package for numspell)
+numspell-magyar.sty (Hungarian package for numspell)
+numspell-italian.sty (Italian package for numspell)
+numspell.tex and the derived file numspell.pdf (documentation). \ No newline at end of file
diff --git a/macros/latex/contrib/numspell/numspell-english.sty b/macros/latex/contrib/numspell/numspell-english.sty
new file mode 100644
index 0000000000..2bf2f69bbf
--- /dev/null
+++ b/macros/latex/contrib/numspell/numspell-english.sty
@@ -0,0 +1,250 @@
+%%
+%% `numspell-english.sty' English language package for 'numspell.sty'
+%%
+%% Copyright 2017- by Tibor Tomacs
+%%
+%% 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 2005/12/01 or later.
+%%
+%% This work has the LPPL maintenance status `maintained'.
+%%
+%% The Current Maintainer of this work is Tibor Tomacs.
+%%
+\NeedsTeXFormat{LaTeX2e}[1999/12/01]
+\ProvidesPackage{numspell-english}[2017/02/09 v1.0 English language package for numspell]
+
+%% -----------
+%% \numspellGB (Default)
+%% -----------
+%% It changes to British English
+%%
+\def\numspellGB{%
+ \def\numspell@and@en{\numspell@{ and }}%
+ \def\numspell@and@@en{\numspell@{ and }}%
+}
+\numspellGB
+
+%% -----------
+%% \numspellUS
+%% -----------
+%% It changes to American English
+%%
+\def\numspellUS{%
+ \def\numspell@and@en{\numspell@{ }}%
+ \def\numspell@and@@en{\numspell@{, }}%
+}
+
+%% GROUP NAMES
+\def\numspell@group@ii@en@name{\numspell@{thousand}}
+\def\numspell@group@iii@en@name{\numspell@{million}}
+\def\numspell@group@iv@en@name{\numspell@{billion}}
+\def\numspell@group@v@en@name{\numspell@{trillion}}
+\def\numspell@group@vi@en@name{\numspell@{quadrillion}}
+\def\numspell@group@vii@en@name{\numspell@{quintillion}}
+\def\numspell@group@viii@en@name{\numspell@{sextillion}}
+\def\numspell@group@ix@en@name{\numspell@{septillion}}
+\def\numspell@group@x@en@name{\numspell@{octillion}}
+\def\numspell@group@xi@en@name{\numspell@{nonillion}}
+\def\numspell@group@xii@en@name{\numspell@{decillion}}
+\def\numspell@group@xiii@en@name{\numspell@{undecillion}}
+\def\numspell@group@xiv@en@name{\numspell@{duodecillion}}
+\def\numspell@group@xv@en@name{\numspell@{tredecillion}}
+\def\numspell@group@xvi@en@name{\numspell@{quattuordecillion}}
+\def\numspell@group@xvii@en@name{\numspell@{quindecillion}}
+\def\numspell@group@xviii@en@name{\numspell@{sexdecillion}}
+\def\numspell@group@xix@en@name{\numspell@{septendecillion}}
+\def\numspell@group@xx@en@name{\numspell@{octodecillion}}
+\def\numspell@group@xxi@en@name{\numspell@{novemdecillion}}
+\def\numspell@group@xxii@en@name{\numspell@{vigintillion}}
+
+%% SPELLING CARDINAL NUMBER GROUP
+%% ---------------------------------
+%% \numspell@group@spell@en{<group>} (<group>=000,001,...,999)
+%% ---------------------------------
+%% \numspell@group@digits{<group>}
+%% Adding the <group> spelling to \thenumspell
+%%
+\def\numspell@group@spell@en#1{%
+ \numspell@group@digits{#1}%
+ \ifcase\numspell@group@digit@i%
+ \or\numspell@{one}\or\numspell@{two}\or\numspell@{three}\or\numspell@{four}\or\numspell@{five}%
+ \or\numspell@{six}\or\numspell@{seven}\or\numspell@{eight}\or\numspell@{nine}%
+ \fi%
+ \ifnum\numspell@group@digit@i>0%
+ \numspell@{ hundred}%
+ \fi%
+ \ifnum\number\numexpr\numspell@group@digit@i*(\numspell@group@digit@ii+\numspell@group@digit@iii)>0%
+ \numspell@and@en%
+ \fi%
+ \ifcase\numspell@group@digit@ii%
+ \or\or\numspell@{twenty}\or\numspell@{thirty}\or\numspell@{forty}\or\numspell@{fifty}\or\numspell@{sixty}%
+ \or\numspell@{seventy}\or\numspell@{eighty}\or\numspell@{ninety}%
+ \fi%
+ \ifnum\numspell@group@digit@ii>1%
+ \ifcase\numspell@group@digit@iii%
+ \or\numspell@dash@\numspell@{one}\or\numspell@dash@\numspell@{two}\or\numspell@dash@\numspell@{three}%
+ \or\numspell@dash@\numspell@{four}\or\numspell@dash@\numspell@{five}\or\numspell@dash@\numspell@{six}%
+ \or\numspell@dash@\numspell@{seven}\or\numspell@dash@\numspell@{eight}\or\numspell@dash@\numspell@{nine}%
+ \fi%
+ \fi%
+ \ifnum\numspell@group@digit@ii<2%
+ \ifcase\number\numexpr10*\numspell@group@digit@ii+\numspell@group@digit@iii%
+ \or\numspell@{one}\or\numspell@{two}\or\numspell@{three}\or\numspell@{four}\or\numspell@{five}\or\numspell@{six}%
+ \or\numspell@{seven}\or\numspell@{eight}\or\numspell@{nine}\or\numspell@{ten}\or\numspell@{eleven}\or\numspell@{twelve}%
+ \or\numspell@{thirteen}\or\numspell@{fourteen}\or\numspell@{fifteen}\or\numspell@{sixteen}\or\numspell@{seventeen}%
+ \or\numspell@{eighteen}\or\numspell@{nineteen}%
+ \fi%
+ \fi%
+}
+
+%% SPELLING ORDINAL NUMBER GROUP
+%% ------------------------------------
+%% \numspell@ordgroup@spell@en{<group>} (<group>=000,001,...,999)
+%% ------------------------------------
+%% \numspell@group@digits{<group>}
+%% Adding the <group> ordinal spelling to \thenumspell
+%%
+\def\numspell@ordgroup@spell@en#1{%
+ \numspell@group@digits{#1}%
+ \ifcase\numspell@group@digit@i%
+ \or\numspell@{one}\or\numspell@{two}\or\numspell@{three}\or\numspell@{four}\or\numspell@{five}%
+ \or\numspell@{six}\or\numspell@{seven}\or\numspell@{eight}\or\numspell@{nine}%
+ \fi%
+ \ifnum\numspell@group@digit@i>0%
+ \ifnum\number\numexpr\numspell@group@digit@i*(\numspell@group@digit@ii+\numspell@group@digit@iii)>0%
+ \numspell@{ hundred}%
+ \else%
+ \numspell@{ hundredth}%
+ \fi%
+ \fi%
+ \ifnum\number\numexpr\numspell@group@digit@i*(\numspell@group@digit@ii+\numspell@group@digit@iii)>0%
+ \numspell@and@en%
+ \fi%
+ \ifnum\numspell@group@digit@iii>0%
+ \ifcase\numspell@group@digit@ii%
+ \or\or\numspell@{twenty}\or\numspell@{thirty}\or\numspell@{forty}\or\numspell@{fifty}\or\numspell@{sixty}%
+ \or\numspell@{seventy}\or\numspell@{eighty}\or\numspell@{ninety}%
+ \fi%
+ \else%
+ \ifcase\numspell@group@digit@ii%
+ \or\or\numspell@{twentieth}\or\numspell@{thirtieth}\or\numspell@{fortieth}\or\numspell@{fiftieth}%
+ \or\numspell@{sixtieth}\or\numspell@{seventieth}\or\numspell@{eightieth}\or\numspell@{ninetieth}%
+ \fi%
+ \fi%
+ \ifnum\numspell@group@digit@ii>1%
+ \ifcase\numspell@group@digit@iii%
+ \or\numspell@dash@\numspell@{first}\or\numspell@dash@\numspell@{second}\or\numspell@dash@\numspell@{third}%
+ \or\numspell@dash@\numspell@{fourth}\or\numspell@dash@\numspell@{fifth}\or\numspell@dash@\numspell@{sixth}%
+ \or\numspell@dash@\numspell@{seventh}\or\numspell@dash@\numspell@{eighth}\or\numspell@dash@\numspell@{ninth}%
+ \fi%
+ \fi%
+ \ifnum\numspell@group@digit@ii<2%
+ \ifcase\number\numexpr10*\numspell@group@digit@ii+\numspell@group@digit@iii%
+ \or\numspell@{first}\or\numspell@{second}\or\numspell@{third}\or\numspell@{fourth}\or\numspell@{fifth}%
+ \or\numspell@{sixth}\or\numspell@{seventh}\or\numspell@{eighth}\or\numspell@{ninth}\or\numspell@{tenth}%
+ \or\numspell@{eleventh}\or\numspell@{twelfth}\or\numspell@{thirteenth}\or\numspell@{fourteenth}%
+ \or\numspell@{fifteenth}\or\numspell@{sixteenth}\or\numspell@{seventeenth}\or\numspell@{eighteenth}\or\numspell@{nineteenth}%
+ \fi%
+ \fi%
+}
+
+%% SPELLING CARDINAL NUMBER
+%% --------------------------------------
+%% \numspell@num@spell@en{<num1>}{<num2>}
+%% --------------------------------------
+%% \numspell@groups{<num1>}{<num2>}
+%% Adding the \numspell@num spelling to \thenumspell
+%%
+\def\numspell@num@spell@en#1#2{%
+ \gdef\thenumspell{}%
+ \numspell@groups{#1}{#2}%
+ \setcounter{numspell@groupcount}{22}%
+ \@whilenum\value{numspell@groupcount}>2%
+ \do{%
+ \IfEq{\csname numspell@group@\roman{numspell@groupcount}\endcsname}{0}{}{%
+ \numspell@group@spell@en{\csname numspell@group@\roman{numspell@groupcount}\endcsname}%
+ \numspell@{ }%
+ \csname numspell@group@\roman{numspell@groupcount}@en@name\endcsname%
+ \ifnum\csname numspell@group@\roman{numspell@groupcount}@before\endcsname>1\numspell@{, }\fi%
+ \ifnum\csname numspell@group@\roman{numspell@groupcount}@before\endcsname=1\numspell@and@@en\fi%
+ }%
+ \addtocounter{numspell@groupcount}{-1}%
+ }%
+ \IfEq{\numspell@group@ii}{0}{}{%
+ \numspell@group@spell@en{\numspell@group@ii}%
+ \numspell@{ }%
+ \numspell@group@ii@en@name%
+ \ifnum\numspell@group@ii@before=1\numspell@and@@en\fi%
+ }%
+ \IfEq{\numspell@group@i}{0}{}{%
+ \numspell@group@spell@en{\numspell@group@i}%
+ }%
+ \ifnum\numspell@group@max=0\numspell@{nought}\fi%
+}
+
+%% SPELLING ORDINAL NUMBER
+%% -----------------------------------------
+%% \numspell@ordnum@spell@en{<num1>}{<num2>}
+%% -----------------------------------------
+%% \numspell@groups{<num1>}{<num2>}
+%% Adding the \numspell@num ordinal spelling to \thenumspell
+%%
+\def\numspell@ordnum@spell@en#1#2{%
+ \gdef\thenumspell{}%
+ \numspell@groups{#1}{#2}%
+ \setcounter{numspell@groupcount}{22}%
+ \@whilenum\value{numspell@groupcount}>2%
+ \do{%
+ \IfEq{\csname numspell@group@\roman{numspell@groupcount}\endcsname}{0}{}{%
+ \numspell@group@spell@en{\csname numspell@group@\roman{numspell@groupcount}\endcsname}%
+ \numspell@{ }%
+ \csname numspell@group@\roman{numspell@groupcount}@en@name\endcsname%
+ \ifnum\csname numspell@group@\roman{numspell@groupcount}@before\endcsname>1\numspell@{, }\fi%
+ \ifnum\csname numspell@group@\roman{numspell@groupcount}@before\endcsname=1\numspell@and@@en\fi%
+ }%
+ \addtocounter{numspell@groupcount}{-1}%
+ }%
+ \IfEq{\numspell@group@ii}{0}{}{%
+ \numspell@group@spell@en{\numspell@group@ii}%
+ \numspell@{ }%
+ \numspell@group@ii@en@name%
+ \ifnum\numspell@group@ii@before=1\numspell@and@@en\fi%
+ }%
+ \IfEq{\numspell@group@i}{0}{}{%
+ \numspell@ordgroup@spell@en{\numspell@group@i}%
+ }%
+ \IfEq{\numspell@group@i}{0}{\ifnum\numspell@group@max>0\numspell@{th}\fi}{}%
+ \ifnum\numspell@group@max=0\numspell@{zeroth}\fi%
+}
+
+%% ----------------------
+%% \numspell@uppercase@en
+%% ----------------------
+%% E.g. \def\thenumspell{one}\numspell@uppercase\thenumspell --> 'One'
+%% \MakeUppercase does not work on pdf bookmark (see hyperref), so using another effective macro.
+%%
+\def\numspell@uppercase@en{%
+ \fullexpandarg%
+ \StrChar{\thenumspell}{1}[\numspell@firstletter]%
+ \expandarg%
+ \StrGobbleLeft{\thenumspell}{1}[\numspell@trunc]%
+ \fullexpandarg%
+ \def\numspell@the{}%
+ \IfStrEq{\numspell@firstletter}{o}{\g@addto@macro\numspell@the{O}}{}% one
+ \IfStrEq{\numspell@firstletter}{t}{\g@addto@macro\numspell@the{T}}{}% two
+ \IfStrEq{\numspell@firstletter}{f}{\g@addto@macro\numspell@the{F}}{}% four
+ \IfStrEq{\numspell@firstletter}{s}{\g@addto@macro\numspell@the{S}}{}% six
+ \IfStrEq{\numspell@firstletter}{e}{\g@addto@macro\numspell@the{E}}{}% eight
+ \IfStrEq{\numspell@firstletter}{n}{\g@addto@macro\numspell@the{N}}{}% nine
+ \IfStrEq{\numspell@firstletter}{z}{\g@addto@macro\numspell@the{Z}}{}% zero
+ \ifx\numspell@the\@empty\@latexerr{'numspell.sty' error! There is not '\numspell@firstletter' in uppercase!}{}\fi%
+ \g@addto@macro\numspell@the{\numspell@trunc}%
+ \def\thenumspell{\numspell@the}%
+}
+
+\endinput \ No newline at end of file
diff --git a/macros/latex/contrib/numspell/numspell-french.sty b/macros/latex/contrib/numspell/numspell-french.sty
new file mode 100644
index 0000000000..00426043bf
--- /dev/null
+++ b/macros/latex/contrib/numspell/numspell-french.sty
@@ -0,0 +1,335 @@
+%%
+%% `numspell-french.sty' French language package for 'numspell.sty'
+%%
+%% Copyright 2017- by Tibor Tomacs
+%%
+%% 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 2005/12/01 or later.
+%%
+%% This work has the LPPL maintenance status `maintained'.
+%%
+%% The Current Maintainer of this work is Tibor Tomacs.
+%%
+\NeedsTeXFormat{LaTeX2e}[1999/12/01]
+\ProvidesPackage{numspell-french}[2017/02/09 v1.0 French language package for numspell]
+
+%% For 'cent' or 'cents'
+\newif\if@numspell@fr@firstgroup@
+
+%% 'premier' or 'premiere'
+\def\numspellpremier{\def\numspell@fr@premier{\numspell@{premier}}}
+\def\numspellpremiere{\def\numspell@fr@premier{\numspell@{premi\`{e}re}}}
+\numspellpremier
+
+%% GROUP NAMES
+\def\numspell@group@ii@fr@name{\numspell@{mille}}
+\def\numspell@group@iii@fr@name{\numspell@{million}}
+\def\numspell@group@iv@fr@name{\numspell@{milliard}}
+\def\numspell@group@v@fr@name{\numspell@{billion}}
+\def\numspell@group@vi@fr@name{\numspell@{billiard}}
+\def\numspell@group@vii@fr@name{\numspell@{trillion}}
+\def\numspell@group@viii@fr@name{\numspell@{trilliard}}
+\def\numspell@group@ix@fr@name{\numspell@{quadrillion}}
+\def\numspell@group@x@fr@name{\numspell@{quadrilliard}}
+\def\numspell@group@xi@fr@name{\numspell@{quintilion}}
+\def\numspell@group@xii@fr@name{\numspell@{quintilliard}}
+\def\numspell@group@xiii@fr@name{\numspell@{sextillion}}
+\def\numspell@group@xiv@fr@name{\numspell@{sextilliard}}
+\def\numspell@group@xv@fr@name{\numspell@{septillion}}
+\def\numspell@group@xvi@fr@name{\numspell@{septilliard}}
+\def\numspell@group@xvii@fr@name{\numspell@{octillion}}
+\def\numspell@group@xviii@fr@name{\numspell@{octilliard}}
+\def\numspell@group@xix@fr@name{\numspell@{nonillion}}
+\def\numspell@group@xx@fr@name{\numspell@{nonilliard}}
+\def\numspell@group@xxi@fr@name{\numspell@{d\'{e}cillion}}
+\def\numspell@group@xxii@fr@name{\numspell@{d\'{e}cilliard}}
+
+%% SPELLING CARDINAL NUMBER GROUP
+%% ---------------------------------
+%% \numspell@group@spell@fr{<group>} (<group>=000,001,...,999)
+%% ---------------------------------
+%% \numspell@group@digits{<group>}
+%% Adding the <group> spelling to \thenumspell
+%%
+\def\numspell@group@spell@fr#1{%
+ \numspell@group@digits{#1}%
+ \ifcase\numspell@group@digit@i%
+ \or\or\numspell@{deux }\or\numspell@{trois }\or\numspell@{quatre }\or\numspell@{cinq }%
+ \or\numspell@{six }\or\numspell@{sept }\or\numspell@{huit }\or\numspell@{neuf }%
+ \fi%
+ \ifnum\numspell@group@digit@i>0%
+ \numspell@{cent}%
+ \if@numspell@fr@firstgroup@%
+ \ifnum\number\numexpr\numspell@group@digit@ii+\numspell@group@digit@iii=0%
+ \ifnum\numspell@group@digit@i>1%
+ \numspell@{s}%
+ \fi%
+ \fi%
+ \fi%
+ \ifnum\number\numexpr\numspell@group@digit@ii+\numspell@group@digit@iii>0%
+ \numspell@{ }%
+ \fi%
+ \ifnum\number\numexpr10*\numspell@group@digit@ii+\numspell@group@digit@iii=1%
+ \numspell@{un}%
+ \fi%
+ \fi%
+ \ifcase\number\numexpr10*\numspell@group@digit@ii+\numspell@group@digit@iii%
+ \or\or\numspell@{deux}\or\numspell@{trois}\or\numspell@{quatre}\or\numspell@{cinq}%
+ \or\numspell@{six}\or\numspell@{sept}\or\numspell@{huit}\or\numspell@{neuf}%
+ \or\numspell@{dix}\or\numspell@{onze}\or\numspell@{douze}\or\numspell@{treize}%
+ \or\numspell@{quatorze}\or\numspell@{quinze}\or\numspell@{seize}\or\numspell@{dix}\numspell@dash@\numspell@{sept}%
+ \or\numspell@{dix}\numspell@dash@\numspell@{huit}\or\numspell@{dix}\numspell@dash@\numspell@{neuf}%
+ \fi%
+ \ifnum\number\numexpr10*\numspell@group@digit@ii+\numspell@group@digit@iii>19%
+ \ifnum\number\numexpr10*\numspell@group@digit@ii+\numspell@group@digit@iii<70%
+ \ifcase\numspell@group@digit@ii%
+ \or\or\numspell@{vingt}\or\numspell@{trente}\or\numspell@{quarante}\or\numspell@{cinquante}\or\numspell@{soixante}%
+ \fi%
+ \ifcase\numspell@group@digit@iii%
+ \or\numspell@{ et un}\or\numspell@dash@\numspell@{deux}\or\numspell@dash@\numspell@{trois}%
+ \or\numspell@dash@\numspell@{quatre}\or\numspell@dash@\numspell@{cinq}\or\numspell@dash@\numspell@{six}%
+ \or\numspell@dash@\numspell@{sept}\or\numspell@dash@\numspell@{huit}\or\numspell@dash@\numspell@{neuf}%
+ \fi%
+ \fi%
+ \fi%
+ \ifnum\number\numexpr10*\numspell@group@digit@ii+\numspell@group@digit@iii>69%
+ \ifnum\number\numexpr10*\numspell@group@digit@ii+\numspell@group@digit@iii<80%
+ \numspell@{soixante}%
+ \ifcase\numspell@group@digit@iii%
+ \numspell@dash@\numspell@{dix}\or\numspell@{ et onze}\or\numspell@dash@\numspell@{douze}\or\numspell@dash@\numspell@{treize}%
+ \or\numspell@dash@\numspell@{quatorze}\or\numspell@dash@\numspell@{quinze}\or\numspell@dash@\numspell@{seize}%
+ \or\numspell@dash@\numspell@{dix}\numspell@dash@\numspell@{sept}\or\numspell@dash@\numspell@{dix}\numspell@dash@\numspell@{huit}%
+ \or\numspell@dash@\numspell@{dix}\numspell@dash@\numspell@{neuf}%
+ \fi%
+ \fi%
+ \fi%
+ \ifnum\number\numexpr10*\numspell@group@digit@ii+\numspell@group@digit@iii>79%
+ \ifnum\number\numexpr10*\numspell@group@digit@ii+\numspell@group@digit@iii<90%
+ \numspell@{quatre}\numspell@dash@\numspell@{vingt}%
+ \ifcase\numspell@group@digit@iii%
+ \numspell@{s}\or\numspell@dash@\numspell@{un}\or\numspell@dash@\numspell@{deux}\or\numspell@dash@\numspell@{trois}%
+ \or\numspell@dash@\numspell@{quatre}\or\numspell@dash@\numspell@{cinq}\or\numspell@dash@\numspell@{six}%
+ \or\numspell@dash@\numspell@{sept}\or\numspell@dash@\numspell@{huit}\or\numspell@dash@\numspell@{neuf}%
+ \fi%
+ \fi%
+ \fi%
+ \ifnum\number\numexpr10*\numspell@group@digit@ii+\numspell@group@digit@iii>89%
+ \numspell@{quatre}\numspell@dash@\numspell@{vingt}\numspell@dash@%
+ \ifcase\numspell@group@digit@iii%
+ \numspell@{dix}\or\numspell@{onze}\or\numspell@{douze}\or\numspell@{treize}%
+ \or\numspell@{quatorze}\or\numspell@{quinze}\or\numspell@{seize}%
+ \or\numspell@{dix}\numspell@dash@\numspell@{sept}\or\numspell@{dix}\numspell@dash@\numspell@{huit}%
+ \or\numspell@{dix}\numspell@dash@\numspell@{neuf}%
+ \fi%
+ \fi%
+}
+
+%% SPELLING ORDINAL NUMBER GROUP
+%% ------------------------------------
+%% \numspell@ordgroup@spell@fr{<group>} (<group>=000,001,...,999)
+%% ------------------------------------
+%% \numspell@group@digits{<group>}
+%% Adding the <group> ordinal spelling to \thenumspell
+%%
+\def\numspell@ordgroup@spell@fr#1{%
+ \numspell@group@digits{#1}%
+ \ifcase\numspell@group@digit@i%
+ \or\or\numspell@{deux }\or\numspell@{trois }\or\numspell@{quatre }\or\numspell@{cinq }%
+ \or\numspell@{six }\or\numspell@{sept }\or\numspell@{huit }\or\numspell@{neuf }%
+ \fi%
+ \ifnum\numspell@group@digit@i>0%
+ \numspell@{cent}%
+ \ifnum\number\numexpr\numspell@group@digit@ii+\numspell@group@digit@iii=0%
+ \numspell@{i\`{e}me}%
+ \else%
+ \numspell@{ }%
+ \fi%
+ \ifnum\number\numexpr10*\numspell@group@digit@ii+\numspell@group@digit@iii=1%
+ \numspell@{uni\`{e}me}%
+ \fi%
+ \fi%
+ \ifcase\number\numexpr10*\numspell@group@digit@ii+\numspell@group@digit@iii%
+ \or\or\numspell@{deuxi\`{e}me}\or\numspell@{troisi\`{e}me}\or\numspell@{quatri\`{e}me}\or\numspell@{cinqui\`{e}me}%
+ \or\numspell@{sixi\`{e}me}\or\numspell@{septi\`{e}me}\or\numspell@{huiti\`{e}me}\or\numspell@{neuvi\`{e}me}%
+ \or\numspell@{dixi\`{e}me}\or\numspell@{onzi\`{e}me}\or\numspell@{douzi\`{e}me}\or\numspell@{treizi\`{e}me}%
+ \or\numspell@{quatorzi\`{e}me}\or\numspell@{quinzi\`{e}me}\or\numspell@{seizi\`{e}me}%
+ \or\numspell@{dix}\numspell@dash@\numspell@{septi\`{e}me}\or\numspell@{dix}\numspell@dash@\numspell@{huiti\`{e}me}%
+ \or\numspell@{dix}\numspell@dash@\numspell@{neuvi\`{e}me}%
+ \fi%
+ \ifnum\number\numexpr10*\numspell@group@digit@ii+\numspell@group@digit@iii>19%
+ \ifnum\number\numexpr10*\numspell@group@digit@ii+\numspell@group@digit@iii<70%
+ \ifnum\numspell@group@digit@iii=0%
+ \ifcase\numspell@group@digit@ii%
+ \or\or\numspell@{vingti\`{e}me}\or\numspell@{trenti\`{e}me}\or\numspell@{quaranti\`{e}me}%
+ \or\numspell@{cinquanti\`{e}me}\or\numspell@{soixanti\`{e}me}%
+ \fi%
+ \else%
+ \ifcase\numspell@group@digit@ii%
+ \or\or\numspell@{vingt}\or\numspell@{trente}\or\numspell@{quarante}\or\numspell@{cinquante}\or\numspell@{soixante}%
+ \fi%
+ \fi%
+ \ifcase\numspell@group@digit@iii%
+ \or\numspell@{ et uni\`{e}me}\or\numspell@dash@\numspell@{deuxi\`{e}me}\or\numspell@dash@\numspell@{troisi\`{e}me}%
+ \or\numspell@dash@\numspell@{quatri\`{e}me}\or\numspell@dash@\numspell@{cinqui\`{e}me}\or\numspell@dash@\numspell@{sixi\`{e}me}%
+ \or\numspell@dash@\numspell@{septi\`{e}me}\or\numspell@dash@\numspell@{huiti\`{e}me}\or\numspell@dash@\numspell@{neuvi\`{e}me}%
+ \fi%
+ \fi%
+ \fi%
+ \ifnum\number\numexpr10*\numspell@group@digit@ii+\numspell@group@digit@iii>69%
+ \ifnum\number\numexpr10*\numspell@group@digit@ii+\numspell@group@digit@iii<80%
+ \numspell@{soixante}%
+ \ifcase\numspell@group@digit@iii%
+ \numspell@dash@\numspell@{dixi\`{e}me}\or\numspell@{ et onzi\`{e}me}\or\numspell@dash@\numspell@{douzi\`{e}me}\or\numspell@dash@\numspell@{treizi\`{e}me}%
+ \or\numspell@dash@\numspell@{quatorzi\`{e}me}\or\numspell@dash@\numspell@{quinzi\`{e}me}%
+ \or\numspell@dash@\numspell@{seizi\`{e}me}\or\numspell@dash@\numspell@{dix}\numspell@dash@\numspell@{septi\`{e}me}%
+ \or\numspell@dash@\numspell@{dix}\numspell@dash@\numspell@{huiti\`{e}me}%
+ \or\numspell@dash@\numspell@{dix}\numspell@dash@\numspell@{neuvi\`{e}me}%
+ \fi%
+ \fi%
+ \fi%
+ \ifnum\number\numexpr10*\numspell@group@digit@ii+\numspell@group@digit@iii>79%
+ \ifnum\number\numexpr10*\numspell@group@digit@ii+\numspell@group@digit@iii<90%
+ \numspell@{quatre}\numspell@dash@\numspell@{vingt}%
+ \ifcase\numspell@group@digit@iii%
+ \numspell@{i\`{e}me}\or\numspell@dash@\numspell@{uni\`{e}me}\or\numspell@dash@\numspell@{deuxi\`{e}me}%
+ \or\numspell@dash@\numspell@{troisi\`{e}me}%
+ \or\numspell@dash@\numspell@{quatri\`{e}me}\or\numspell@dash@\numspell@{cinqui\`{e}me}\or\numspell@dash@\numspell@{sixi\`{e}me}%
+ \or\numspell@dash@\numspell@{septi\`{e}me}\or\numspell@dash@\numspell@{huiti\`{e}me}\or\numspell@dash@\numspell@{neuvi\`{e}me}%
+ \fi%
+ \fi%
+ \fi%
+ \ifnum\number\numexpr10*\numspell@group@digit@ii+\numspell@group@digit@iii>89%
+ \numspell@{quatre}\numspell@dash@\numspell@{vingt}\numspell@dash@%
+ \ifcase\numspell@group@digit@iii%
+ \numspell@{dixi\`{e}me}\or\numspell@{onzi\`{e}me}\or\numspell@{douzi\`{e}me}\or\numspell@{treizi\`{e}me}%
+ \or\numspell@{quatorzi\`{e}me}\or\numspell@{quinzi\`{e}me}\or\numspell@{seizi\`{e}me}%
+ \or\numspell@{dix}\numspell@dash@\numspell@{septi\`{e}me}\or\numspell@{dix}\numspell@dash@\numspell@{huiti\`{e}me}%
+ \or\numspell@{dix}\numspell@dash@\numspell@{neuvi\`{e}me}%
+ \fi%
+ \fi%
+}
+
+%% SPELLING CARDINAL NUMBER
+%% --------------------------------------
+%% \numspell@num@spell@fr{<num1>}{<num2>}
+%% --------------------------------------
+%% \numspell@groups{<num1>}{<num2>}
+%% Adding the \numspell@num spelling to \thenumspell
+%%
+\def\numspell@num@spell@fr#1#2{%
+ \gdef\thenumspell{}%
+ \@numspell@fr@firstgroup@false%
+ \numspell@groups{#1}{#2}%
+ \setcounter{numspell@groupcount}{22}%
+ \@whilenum\value{numspell@groupcount}>2%
+ \do{%
+ \IfEq{\csname numspell@group@\roman{numspell@groupcount}\endcsname}{0}{}{%
+ \IfEq{\csname numspell@group@\roman{numspell@groupcount}\endcsname}{1}{\numspell@{un}}{}%
+ \numspell@group@spell@fr{\csname numspell@group@\roman{numspell@groupcount}\endcsname}%
+ \numspell@{ }%
+ \csname numspell@group@\roman{numspell@groupcount}@fr@name\endcsname%
+ \IfEq{\csname numspell@group@\roman{numspell@groupcount}\endcsname}{1}{}{\numspell@{s}}%
+ \ifnum\csname numspell@group@\roman{numspell@groupcount}@before\endcsname>0\numspell@{ }\fi%
+ }%
+ \addtocounter{numspell@groupcount}{-1}%
+ }%
+ \IfEq{\numspell@group@ii}{0}{}{%
+ \IfEq{\numspell@group@ii}{1}{\numspell@group@ii@fr@name}{%
+ \numspell@group@spell@fr{\numspell@group@ii}%
+ \numspell@{ }%
+ \numspell@group@ii@fr@name%
+ }%
+ \ifnum\numspell@group@ii@before>0\numspell@{ }\fi%
+ }%
+ \IfEq{\numspell@group@i}{0}{}{%
+ \@numspell@fr@firstgroup@true%
+ \IfEq{\numspell@group@i}{1}{\numspell@{un}}{}%
+ \numspell@group@spell@fr{\numspell@group@i}%
+ }%
+ \ifnum\numspell@group@max=0\numspell@{z\'{e}ro}\fi%
+}
+
+%% SPELLING ORDINAL NUMBER
+%% -----------------------------------------
+%% \numspell@ordnum@spell@fr{<num1>}{<num2>}
+%% -----------------------------------------
+%% \numspell@groups{<num1>}{<num2>}
+%% Adding the \numspell@num ordinal spelling to \thenumspell
+%%
+\def\numspell@ordnum@spell@fr#1#2{%
+ \gdef\thenumspell{}%
+ \numspell@groups{#1}{#2}%
+ \setcounter{numspell@groupcount}{22}%
+ \@whilenum\value{numspell@groupcount}>2%
+ \do{%
+ \IfEq{\csname numspell@group@\roman{numspell@groupcount}\endcsname}{0}{}{%
+ \IfEq{\csname numspell@group@\roman{numspell@groupcount}\endcsname}{1}{\numspell@{un}}{}%
+ \numspell@group@spell@fr{\csname numspell@group@\roman{numspell@groupcount}\endcsname}%
+ \numspell@{ }%
+ \csname numspell@group@\roman{numspell@groupcount}@fr@name\endcsname%
+ \ifnum\csname numspell@group@\roman{numspell@groupcount}@before\endcsname>0%
+ \IfEq{\csname numspell@group@\roman{numspell@groupcount}\endcsname}{1}{\numspell@{ }}{\numspell@{s }}%
+ \else%
+ \numspell@{i\`{e}me}%
+ \fi%
+ }%
+ \addtocounter{numspell@groupcount}{-1}%
+ }%
+ \IfEq{\numspell@group@ii}{0}{}{%
+ \numspell@group@spell@fr{\numspell@group@ii}%
+ \IfEq{\numspell@group@ii}{1}{}{\numspell@{ }}%
+ \ifnum\numspell@group@ii@before>0%
+ \numspell@{mille }%
+ \else%
+ \numspell@{milli\`{e}me}%
+ \fi%
+ }%
+ \IfEq{\numspell@group@i}{0}{}{%
+ \numspell@ordgroup@spell@fr{\numspell@group@i}%
+ \IfEq{\numspell@group@i}{1}{%
+ \ifnum\numspell@group@max=1%
+ \numspell@fr@premier%
+ \else%
+ \numspell@{uni\`{e}me}%
+ \fi%
+ }{}%
+ }%
+ \ifnum\numspell@group@max=0\numspell@{z\'{e}roi\`{e}me}\fi%
+}
+
+%% ----------------------
+%% \numspell@uppercase@fr
+%% ----------------------
+%% E.g. \def\thenumspell{un}\numspell@uppercase\thenumspell --> 'Un'
+%% \MakeUppercase does not work on pdf bookmark (see hyperref), so using another effective macro.
+%%
+\def\numspell@uppercase@fr{%
+ \fullexpandarg%
+ \StrChar{\thenumspell}{1}[\numspell@firstletter]%
+ \expandarg%
+ \StrGobbleLeft{\thenumspell}{1}[\numspell@trunc]%
+ \fullexpandarg%
+ \def\numspell@the{}%
+ \IfStrEq{\numspell@firstletter}{z}{\g@addto@macro\numspell@the{Z}}{}% z\'{e}ro
+ \IfStrEq{\numspell@firstletter}{u}{\g@addto@macro\numspell@the{U}}{}% un
+ \IfStrEq{\numspell@firstletter}{p}{\g@addto@macro\numspell@the{P}}{}% premier
+ \IfStrEq{\numspell@firstletter}{d}{\g@addto@macro\numspell@the{D}}{}% deux
+ \IfStrEq{\numspell@firstletter}{t}{\g@addto@macro\numspell@the{T}}{}% trois
+ \IfStrEq{\numspell@firstletter}{q}{\g@addto@macro\numspell@the{Q}}{}% quatre
+ \IfStrEq{\numspell@firstletter}{c}{\g@addto@macro\numspell@the{C}}{}% cinq
+ \IfStrEq{\numspell@firstletter}{s}{\g@addto@macro\numspell@the{S}}{}% six
+ \IfStrEq{\numspell@firstletter}{h}{\g@addto@macro\numspell@the{H}}{}% huit
+ \IfStrEq{\numspell@firstletter}{n}{\g@addto@macro\numspell@the{N}}{}% neuf
+ \IfStrEq{\numspell@firstletter}{v}{\g@addto@macro\numspell@the{V}}{}% vingt
+ \IfStrEq{\numspell@firstletter}{m}{\g@addto@macro\numspell@the{M}}{}% mille
+ \ifx\numspell@the\@empty\@latexerr{'numspell.sty' error! There is not '\numspell@firstletter' in uppercase!}{}\fi%
+ \g@addto@macro\numspell@the{\numspell@trunc}%
+ \def\thenumspell{\numspell@the}%
+}
+
+\endinput \ No newline at end of file
diff --git a/macros/latex/contrib/numspell/numspell-german.sty b/macros/latex/contrib/numspell/numspell-german.sty
new file mode 100644
index 0000000000..bd100313f8
--- /dev/null
+++ b/macros/latex/contrib/numspell/numspell-german.sty
@@ -0,0 +1,262 @@
+%%
+%% `numspell-german.sty' German language package for 'numspell.sty'
+%%
+%% Copyright 2017- by Tibor Tomacs
+%%
+%% 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 2005/12/01 or later.
+%%
+%% This work has the LPPL maintenance status `maintained'.
+%%
+%% The Current Maintainer of this work is Tibor Tomacs.
+%%
+\NeedsTeXFormat{LaTeX2e}[1999/12/01]
+\ProvidesPackage{numspell-german}[2017/02/09 v1.0 German language package for numspell]
+
+%% GROUP NAMES
+\def\numspell@group@ii@de@name{\numspell@{tausend}}
+\def\numspell@group@iii@de@name{\numspell@{Million}}
+\def\numspell@group@iv@de@name{\numspell@{Milliarde}}
+\def\numspell@group@v@de@name{\numspell@{Billion}}
+\def\numspell@group@vi@de@name{\numspell@{Billiarde}}
+\def\numspell@group@vii@de@name{\numspell@{Trillion}}
+\def\numspell@group@viii@de@name{\numspell@{Trilliarde}}
+\def\numspell@group@ix@de@name{\numspell@{Quadrillion}}
+\def\numspell@group@x@de@name{\numspell@{Quadrilliarde}}
+\def\numspell@group@xi@de@name{\numspell@{Quintillion}}
+\def\numspell@group@xii@de@name{\numspell@{Quintilliarde}}
+\def\numspell@group@xiii@de@name{\numspell@{Sextillion}}
+\def\numspell@group@xiv@de@name{\numspell@{Sextilliarde}}
+\def\numspell@group@xv@de@name{\numspell@{Septillion}}
+\def\numspell@group@xvi@de@name{\numspell@{Septilliarde}}
+\def\numspell@group@xvii@de@name{\numspell@{Oktillion}}
+\def\numspell@group@xviii@de@name{\numspell@{Oktilliarde}}
+\def\numspell@group@xix@de@name{\numspell@{Nonillion}}
+\def\numspell@group@xx@de@name{\numspell@{Nonilliarde}}
+\def\numspell@group@xxi@de@name{\numspell@{Dezillion}}
+\def\numspell@group@xxii@de@name{\numspell@{Dezilliarde}}
+
+%% ORDINAL GROUP NAMES
+\def\numspell@ordgroup@iii@de@name{\numspell@{millionste}}
+\def\numspell@ordgroup@iv@de@name{\numspell@{milliardste}}
+\def\numspell@ordgroup@v@de@name{\numspell@{billionste}}
+\def\numspell@ordgroup@vi@de@name{\numspell@{billiardste}}
+\def\numspell@ordgroup@vii@de@name{\numspell@{trillionste}}
+\def\numspell@ordgroup@viii@de@name{\numspell@{trilliardste}}
+\def\numspell@ordgroup@ix@de@name{\numspell@{quadrillionste}}
+\def\numspell@ordgroup@x@de@name{\numspell@{quadrilliardste}}
+\def\numspell@ordgroup@xi@de@name{\numspell@{quintillionste}}
+\def\numspell@ordgroup@xii@de@name{\numspell@{quintilliardste}}
+\def\numspell@ordgroup@xiii@de@name{\numspell@{sextillionste}}
+\def\numspell@ordgroup@xiv@de@name{\numspell@{sextilliardste}}
+\def\numspell@ordgroup@xv@de@name{\numspell@{septillionste}}
+\def\numspell@ordgroup@xvi@de@name{\numspell@{septilliardste}}
+\def\numspell@ordgroup@xvii@de@name{\numspell@{oktillionste}}
+\def\numspell@ordgroup@xviii@de@name{\numspell@{oktilliardste}}
+\def\numspell@ordgroup@xix@de@name{\numspell@{nonillionste}}
+\def\numspell@ordgroup@xx@de@name{\numspell@{nonilliardste}}
+\def\numspell@ordgroup@xxi@de@name{\numspell@{dezillionste}}
+\def\numspell@ordgroup@xxii@de@name{\numspell@{dezilliardste}}
+
+%% SPELLING CARDINAL NUMBER GROUP
+%% ---------------------------------
+%% \numspell@group@spell@de{<group>} (<group>=000,001,...,999)
+%% ---------------------------------
+%% \numspell@group@digits{<group>}
+%% Adding the <group> spelling to \thenumspell
+%%
+\def\numspell@group@spell@de#1{%
+ \numspell@group@digits{#1}%
+ \ifcase\numspell@group@digit@i%
+ \or\numspell@{ein}\or\numspell@{zwei}\or\numspell@{drei}\or\numspell@{vier}\or\numspell@{f\"{u}nf}%
+ \or\numspell@{sechs}\or\numspell@{sieben}\or\numspell@{acht}\or\numspell@{neun}%
+ \fi%
+ \ifnum\numspell@group@digit@i>0%
+ \numspell@{hundert}%
+ \fi%
+ \ifnum\number\numexpr100*\numspell@group@digit@i+10*\numspell@group@digit@ii+\numspell@group@digit@iii>1%
+ \ifcase\number\numexpr10*\numspell@group@digit@ii+\numspell@group@digit@iii%
+ \or\numspell@{eins}\or\numspell@{zwei}\or\numspell@{drei}\or\numspell@{vier}\or\numspell@{f\"{u}nf}%
+ \or\numspell@{sechs}\or\numspell@{sieben}\or\numspell@{acht}\or\numspell@{neun}%
+ \or\numspell@{zehn}\or\numspell@{elf}\or\numspell@{zw\"{o}lf}\or\numspell@{dreizehn}%
+ \or\numspell@{vierzehn}\or\numspell@{f\"{u}nfzehn}\or\numspell@{sechzehn}\or\numspell@{siebzehn}%
+ \or\numspell@{achtzehn}\or\numspell@{neunzehn}%
+ \fi%
+ \fi%
+ \ifnum\number\numexpr10*\numspell@group@digit@ii+\numspell@group@digit@iii>19%
+ \ifcase\numspell@group@digit@iii%
+ \or\numspell@{ein}\or\numspell@{zwei}\or\numspell@{drei}\or\numspell@{vier}\or\numspell@{f\"{u}nf}%
+ \or\numspell@{sechs}\or\numspell@{sieben}\or\numspell@{acht}\or\numspell@{neun}%
+ \fi%
+ \fi%
+ \ifnum\number\numexpr\numspell@group@digit@ii*\numspell@group@digit@iii>0%
+ \ifnum\number\numexpr10*\numspell@group@digit@ii+\numspell@group@digit@iii>20%
+ \numspell@{und}%
+ \fi%
+ \fi%
+ \ifnum\number\numexpr10*\numspell@group@digit@ii+\numspell@group@digit@iii>19%
+ \ifcase\numspell@group@digit@ii%
+ \or\or\numspell@{zwanzig}\or\numspell@{drei\ss{}ig}\or\numspell@{vierzig}\or\numspell@{f\"{u}nfzig}%
+ \or\numspell@{sechzig}\or\numspell@{siebzig}\or\numspell@{achtzig}\or\numspell@{neunzig}%
+ \fi%
+ \fi%
+}
+
+%% SPELLING ORDINAL NUMBER GROUP
+%% ------------------------------------
+%% \numspell@ordgroup@spell@de{<group>} (<group>=000,001,...,999)
+%% ------------------------------------
+%% \numspell@group@digits{<group>}
+%% Adding the <group> ordinal spelling to \thenumspell
+%%
+\def\numspell@ordgroup@spell@de#1{%
+ \numspell@group@digits{#1}%
+ \ifcase\numspell@group@digit@i%
+ \or\numspell@{ein}\or\numspell@{zwei}\or\numspell@{drei}\or\numspell@{vier}\or\numspell@{f\"{u}nf}%
+ \or\numspell@{sechs}\or\numspell@{sieben}\or\numspell@{acht}\or\numspell@{neun}%
+ \fi%
+ \ifnum\numspell@group@digit@i>0%
+ \ifnum\number\numexpr\numspell@group@digit@ii+\numspell@group@digit@iii=0%
+ \numspell@{hundertste}%
+ \else%
+ \numspell@{hundert}%
+ \fi%
+ \fi%
+ \ifnum\number\numexpr100*\numspell@group@digit@i+10*\numspell@group@digit@ii+\numspell@group@digit@iii>1%
+ \ifcase\number\numexpr10*\numspell@group@digit@ii+\numspell@group@digit@iii%
+ \or\numspell@{erste}\or\numspell@{zweite}\or\numspell@{dritte}\or\numspell@{vierte}\or\numspell@{f\"{u}nfte}%
+ \or\numspell@{sechste}\or\numspell@{siebte}\or\numspell@{achte}\or\numspell@{neunte}%
+ \or\numspell@{zehnte}\or\numspell@{elfte}\or\numspell@{zw\"{o}lfte}\or\numspell@{dreizehnte}%
+ \or\numspell@{vierzehnte}\or\numspell@{f\"{u}nfzehnte}\or\numspell@{sechzehnte}\or\numspell@{siebzehnte}%
+ \or\numspell@{achtzehnte}\or\numspell@{neunzehnte}%
+ \fi%
+ \fi%
+ \ifnum\number\numexpr10*\numspell@group@digit@ii+\numspell@group@digit@iii>19%
+ \ifcase\numspell@group@digit@iii%
+ \or\numspell@{ein}\or\numspell@{zwei}\or\numspell@{drei}\or\numspell@{vier}\or\numspell@{f\"{u}nf}%
+ \or\numspell@{sechs}\or\numspell@{sieben}\or\numspell@{acht}\or\numspell@{neun}%
+ \fi%
+ \fi%
+ \ifnum\number\numexpr\numspell@group@digit@ii*\numspell@group@digit@iii>0%
+ \ifnum\number\numexpr10*\numspell@group@digit@ii+\numspell@group@digit@iii>20%
+ \numspell@{und}%
+ \fi%
+ \fi%
+ \ifnum\number\numexpr10*\numspell@group@digit@ii+\numspell@group@digit@iii>19%
+ \ifcase\numspell@group@digit@ii%
+ \or\or\numspell@{zwanzigste}\or\numspell@{drei\ss{}igste}\or\numspell@{vierzigste}\or\numspell@{f\"{u}nfzigste}%
+ \or\numspell@{sechzigste}\or\numspell@{siebzigste}\or\numspell@{achtzigste}\or\numspell@{neunzigste}%
+ \fi%
+ \fi%
+}
+
+%% SPELLING CARDINAL NUMBER
+%% --------------------------------------
+%% \numspell@num@spell@de{<num1>}{<num2>}
+%% --------------------------------------
+%% \numspell@groups{<num1>}{<num2>}
+%% Adding the \numspell@num spelling to \thenumspell
+%%
+\def\numspell@num@spell@de#1#2{%
+ \gdef\thenumspell{}%
+ \numspell@groups{#1}{#2}%
+ \setcounter{numspell@groupcount}{22}%
+ \@whilenum\value{numspell@groupcount}>2%
+ \do{%
+ \IfEq{\csname numspell@group@\roman{numspell@groupcount}\endcsname}{0}{}{%
+ \IfEq{\csname numspell@group@\roman{numspell@groupcount}\endcsname}{1}{\numspell@{eine}}{}%
+ \numspell@group@spell@de{\csname numspell@group@\roman{numspell@groupcount}\endcsname}%
+ \numspell@{ }%
+ \csname numspell@group@\roman{numspell@groupcount}@de@name\endcsname%
+ \IfEq{\csname numspell@group@\roman{numspell@groupcount}\endcsname}{1}{}{\ifodd\value{numspell@groupcount}\numspell@{e}\fi}%
+ \IfEq{\csname numspell@group@\roman{numspell@groupcount}\endcsname}{1}{}{\numspell@{n}}%
+ \ifnum\csname numspell@group@\roman{numspell@groupcount}@before\endcsname>0\numspell@{ }\fi%
+ }%
+ \addtocounter{numspell@groupcount}{-1}%
+ }%
+ \IfEq{\numspell@group@ii}{0}{}{%
+ \IfEq{\numspell@group@ii}{1}{\numspell@{ein}}{}%
+ \numspell@group@spell@de{\numspell@group@ii}%
+ \numspell@group@ii@de@name%
+ }%
+ \IfEq{\numspell@group@i}{0}{}{%
+ \IfEq{\numspell@group@i}{1}{\numspell@{eins}}{}%
+ \numspell@group@spell@de{\numspell@group@i}%
+ }%
+ \ifnum\numspell@group@max=0\numspell@{null}\fi%
+}
+
+%% SPELLING ORDINAL NUMBER
+%% -----------------------------------------
+%% \numspell@ordnum@spell@de{<num1>}{<num2>}
+%% -----------------------------------------
+%% \numspell@groups{<num1>}{<num2>}
+%% Adding the \numspell@num ordinal spelling to \thenumspell
+%%
+\def\numspell@ordnum@spell@de#1#2{%
+ \gdef\thenumspell{}%
+ \numspell@groups{#1}{#2}%
+ \setcounter{numspell@groupcount}{22}%
+ \@whilenum\value{numspell@groupcount}>2%
+ \do{%
+ \IfEq{\csname numspell@group@\roman{numspell@groupcount}\endcsname}{0}{}{%
+ \ifnum\csname numspell@group@\roman{numspell@groupcount}@before\endcsname>0%
+ \IfEq{\csname numspell@group@\roman{numspell@groupcount}\endcsname}{1}{\numspell@{eine}}{}%
+ \numspell@group@spell@de{\csname numspell@group@\roman{numspell@groupcount}\endcsname}%
+ \numspell@{ }%
+ \csname numspell@group@\roman{numspell@groupcount}@de@name\endcsname%
+ \IfEq{\csname numspell@group@\roman{numspell@groupcount}\endcsname}{1}{}{\ifodd\value{numspell@groupcount}\numspell@{e}\fi}%
+ \IfEq{\csname numspell@group@\roman{numspell@groupcount}\endcsname}{1}{}{\numspell@{n}}\numspell@{ }%
+ \else%
+ \IfEq{\csname numspell@group@\roman{numspell@groupcount}\endcsname}{1}{\numspell@{ein}}{}%
+ \numspell@group@spell@de{\csname numspell@group@\roman{numspell@groupcount}\endcsname}%
+ \csname numspell@ordgroup@\roman{numspell@groupcount}@de@name\endcsname%
+ \fi%
+ }%
+ \addtocounter{numspell@groupcount}{-1}%
+ }%
+ \IfEq{\numspell@group@ii}{0}{}{%
+ \IfEq{\numspell@group@ii}{1}{\numspell@{ein}}{}%
+ \numspell@group@spell@de{\numspell@group@ii}%
+ \numspell@group@ii@de@name%
+ \ifnum\numspell@group@ii@before=0\numspell@{ste}\fi%
+ }%
+ \IfEq{\numspell@group@i}{0}{}{%
+ \IfEq{\numspell@group@i}{1}{\numspell@{erste}}{}%
+ \numspell@ordgroup@spell@de{\numspell@group@i}%
+ }%
+ \ifnum\numspell@group@max=0\numspell@{nullte}\fi%
+}
+
+%% ----------------------
+%% \numspell@uppercase@de
+%% ----------------------
+%% E.g. \def\thenumspell{ein}\numspell@uppercase\thenumspell --> 'Ein'
+%% \MakeUppercase does not work on pdf bookmark (see hyperref), so using another effective macro.
+%%
+\def\numspell@uppercase@de{%
+ \fullexpandarg%
+ \StrChar{\thenumspell}{1}[\numspell@firstletter]%
+ \expandarg%
+ \StrGobbleLeft{\thenumspell}{1}[\numspell@trunc]%
+ \fullexpandarg%
+ \def\numspell@the{}%
+ \IfStrEq{\numspell@firstletter}{e}{\g@addto@macro\numspell@the{E}}{}% ein
+ \IfStrEq{\numspell@firstletter}{z}{\g@addto@macro\numspell@the{Z}}{}% zwei
+ \IfStrEq{\numspell@firstletter}{d}{\g@addto@macro\numspell@the{D}}{}% drei
+ \IfStrEq{\numspell@firstletter}{v}{\g@addto@macro\numspell@the{V}}{}% vier
+ \IfStrEq{\numspell@firstletter}{f}{\g@addto@macro\numspell@the{F}}{}% f\"{u}nf
+ \IfStrEq{\numspell@firstletter}{s}{\g@addto@macro\numspell@the{S}}{}% sechs
+ \IfStrEq{\numspell@firstletter}{a}{\g@addto@macro\numspell@the{A}}{}% acht
+ \IfStrEq{\numspell@firstletter}{n}{\g@addto@macro\numspell@the{N}}{}% neun
+ \ifx\numspell@the\@empty\@latexerr{'numspell.sty' error! There is not '\numspell@firstletter' in uppercase!}{}\fi%
+ \g@addto@macro\numspell@the{\numspell@trunc}%
+ \def\thenumspell{\numspell@the}%
+}
+
+\endinput \ No newline at end of file
diff --git a/macros/latex/contrib/numspell/numspell-italian.sty b/macros/latex/contrib/numspell/numspell-italian.sty
new file mode 100644
index 0000000000..da1f9dc178
--- /dev/null
+++ b/macros/latex/contrib/numspell/numspell-italian.sty
@@ -0,0 +1,332 @@
+%%
+%% `numspell-italian.sty' Italian language package for 'numspell.sty'
+%%
+%% Copyright 2017- by Tibor Tomacs
+%%
+%% 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 2005/12/01 or later.
+%%
+%% This work has the LPPL maintenance status `maintained'.
+%%
+%% The Current Maintainer of this work is Tibor Tomacs.
+%%
+\NeedsTeXFormat{LaTeX2e}[1999/12/01]
+\ProvidesPackage{numspell-italian}[2017/09/30 v1.0 Italian language package for numspell]
+
+%% GROUP NAMES
+\def\numspell@group@ii@it@name{\numspell@{mille}}
+\def\numspell@group@iii@it@name{\numspell@{milione}}
+\def\numspell@group@iv@it@name{\numspell@{miliardo}}
+\def\numspell@group@v@it@name{\numspell@{bilione}}
+\def\numspell@group@vi@it@name{\numspell@{biliardo}}
+\def\numspell@group@vii@it@name{\numspell@{trilione}}
+\def\numspell@group@viii@it@name{\numspell@{triliardo}}
+\def\numspell@group@ix@it@name{\numspell@{quadrilione}}
+\def\numspell@group@x@it@name{\numspell@{quadriliardo}}
+\def\numspell@group@xi@it@name{\numspell@{quintilione}}
+\def\numspell@group@xii@it@name{\numspell@{quintiliardo}}
+\def\numspell@group@xiii@it@name{\numspell@{sextilione}}
+\def\numspell@group@xiv@it@name{\numspell@{sextiliardo}}
+\def\numspell@group@xv@it@name{\numspell@{septilione}}
+\def\numspell@group@xvi@it@name{\numspell@{septiliardo}}
+\def\numspell@group@xvii@it@name{\numspell@{octilione}}
+\def\numspell@group@xviii@it@name{\numspell@{octiliardo}}
+\def\numspell@group@xix@it@name{\numspell@{nonilione}}
+\def\numspell@group@xx@it@name{\numspell@{noniliardo}}
+\def\numspell@group@xxi@it@name{\numspell@{decilione}}
+\def\numspell@group@xxii@it@name{\numspell@{deciliardo}}
+
+%% GROUP NAMES (PLURAL)
+\def\numspell@group@ii@it@name@plural{\numspell@{mila}}
+\def\numspell@group@iii@it@name@plural{\numspell@{milioni}}
+\def\numspell@group@iv@it@name@plural{\numspell@{miliardi}}
+\def\numspell@group@v@it@name@plural{\numspell@{bilioni}}
+\def\numspell@group@vi@it@name@plural{\numspell@{biliardi}}
+\def\numspell@group@vii@it@name@plural{\numspell@{trilioni}}
+\def\numspell@group@viii@it@name@plural{\numspell@{triliardi}}
+\def\numspell@group@ix@it@name@plural{\numspell@{quadrilioni}}
+\def\numspell@group@x@it@name@plural{\numspell@{quadriliardi}}
+\def\numspell@group@xi@it@name@plural{\numspell@{quintilioni}}
+\def\numspell@group@xii@it@name@plural{\numspell@{quintiliardi}}
+\def\numspell@group@xiii@it@name@plural{\numspell@{sextilioni}}
+\def\numspell@group@xiv@it@name@plural{\numspell@{sextiliardi}}
+\def\numspell@group@xv@it@name@plural{\numspell@{septilioni}}
+\def\numspell@group@xvi@it@name@plural{\numspell@{septiliardi}}
+\def\numspell@group@xvii@it@name@plural{\numspell@{octilioni}}
+\def\numspell@group@xviii@it@name@plural{\numspell@{octiliardi}}
+\def\numspell@group@xix@it@name@plural{\numspell@{nonilioni}}
+\def\numspell@group@xx@it@name@plural{\numspell@{noniliardi}}
+\def\numspell@group@xxi@it@name@plural{\numspell@{decilioni}}
+\def\numspell@group@xxii@it@name@plural{\numspell@{deciliardi}}
+
+%% ORDINAL GROUP NAMES
+\def\numspell@ordgroup@ii@it@name{\numspell@{millesim}}
+\def\numspell@ordgroup@iii@it@name{\numspell@{milionesim}}
+\def\numspell@ordgroup@iv@it@name{\numspell@{miliardesim}}
+\def\numspell@ordgroup@v@it@name{\numspell@{bilionesim}}
+\def\numspell@ordgroup@vi@it@name{\numspell@{biliardesim}}
+\def\numspell@ordgroup@vii@it@name{\numspell@{trilionesim}}
+\def\numspell@ordgroup@viii@it@name{\numspell@{triliardesim}}
+\def\numspell@ordgroup@ix@it@name{\numspell@{quadrilionesim}}
+\def\numspell@ordgroup@x@it@name{\numspell@{quadriliardesim}}
+\def\numspell@ordgroup@xi@it@name{\numspell@{quintilionesim}}
+\def\numspell@ordgroup@xii@it@name{\numspell@{quintiliardesim}}
+\def\numspell@ordgroup@xiii@it@name{\numspell@{sextilionesim}}
+\def\numspell@ordgroup@xiv@it@name{\numspell@{sextiliardesim}}
+\def\numspell@ordgroup@xv@it@name{\numspell@{septilionesim}}
+\def\numspell@ordgroup@xvi@it@name{\numspell@{septiliardesim}}
+\def\numspell@ordgroup@xvii@it@name{\numspell@{octilionesim}}
+\def\numspell@ordgroup@xviii@it@name{\numspell@{octiliardesim}}
+\def\numspell@ordgroup@xix@it@name{\numspell@{nonilionesim}}
+\def\numspell@ordgroup@xx@it@name{\numspell@{noniliardesim}}
+\def\numspell@ordgroup@xxi@it@name{\numspell@{decilionesim}}
+\def\numspell@ordgroup@xxii@it@name{\numspell@{deciliardesim}}
+
+%% GENDER
+\def\numspellitmasculine{\def\numspell@it@gender{\numspell@{o}}}
+\def\numspellitfeminine{\def\numspell@it@gender{\numspell@{a}}}
+\numspellitmasculine
+
+%% SPELLING CARDINAL NUMBER GROUP
+%% ---------------------------------
+%% \numspell@group@spell@it{<group>} (<group>=000,001,...,999)
+%% ---------------------------------
+%% \numspell@group@digits{<group>}
+%% Adding the <group> spelling to \thenumspell
+%%
+\def\numspell@group@spell@it#1{%
+ \numspell@group@digits{#1}%
+ \ifcase\numspell@group@digit@i%
+ \or\or\numspell@{due}\or\numspell@{tre}\or\numspell@{quattro}\or\numspell@{cinque}%
+ \or\numspell@{sei}\or\numspell@{sette}\or\numspell@{otto}\or\numspell@{nove}%
+ \fi%
+ \ifnum\numspell@group@digit@i>0%
+ \numspell@{cent}%
+ \ifnum\numspell@group@digit@ii=8\else%
+ \numspell@{o}%
+ \fi%
+ \fi%
+ \ifcase\number\numexpr10*\numspell@group@digit@ii+\numspell@group@digit@iii%
+ \or\or\numspell@{due}\or\or\numspell@{quattro}\or\numspell@{cinque}\or\numspell@{sei}\or\numspell@{sette}%
+ \or\numspell@{otto}\or\numspell@{nove}\or\numspell@{dieci}\or\numspell@{undici}\or\numspell@{dodici}%
+ \or\numspell@{tredici}\or\numspell@{quattordici}\or\numspell@{quindici}\or\numspell@{sedici}%
+ \or\numspell@{diciassette}\or\numspell@{diciotto}\or\numspell@{diciannove}\or\numspell@{venti}%
+ \or\numspell@{ventuno}\or\numspell@{ventidue}\or\numspell@{ventitr\'{e}}\or\numspell@{ventiquattro}%
+ \or\numspell@{venticinque}\or\numspell@{ventisei}\or\numspell@{ventisette}\or\numspell@{ventotto}\or\numspell@{ventinove}%
+ \fi%
+ \ifcase\numspell@group@digit@ii%
+ \or\or\or\numspell@{trent}\or\numspell@{quarant}\or\numspell@{cinquant}\or\numspell@{sessant}%
+ \or\numspell@{settant}\or\numspell@{ottant}\or\numspell@{novant}%
+ \fi%
+ \ifnum\numspell@group@digit@ii>2%
+ \ifcase\numspell@group@digit@iii%
+ \numspell@{a}\or\numspell@{uno}\or\numspell@{adue}\or\numspell@{atr\'{e}}\or\numspell@{aquattro}%
+ \or\numspell@{acinque}\or\numspell@{asei}\or\numspell@{asette}\or\numspell@{otto}\or\numspell@{anove}%
+ \fi%
+ \fi%
+ \ifnum\numspell@group@digit@i>0%
+ \ifnum\numspell@group@digit@ii=0%
+ \ifcase\numspell@group@digit@iii%
+ \or\numspell@{uno}\or\or\numspell@{tr\'{e}}%
+ \fi%
+ \fi%
+ \fi%
+ \ifnum\number\numexpr\numspell@group@digit@i+\numspell@group@digit@ii=0%
+ \ifcase\numspell@group@digit@iii%
+ \or\or\or\numspell@{tre}%
+ \fi%
+ \fi%
+}
+
+%% SPELLING ORDINAL NUMBER GROUP
+%% ------------------------------------
+%% \numspell@ordgroup@spell@it{<group>} (<group>=000,001,...,999)
+%% ------------------------------------
+%% \numspell@group@digits{<group>}
+%% Adding the <group> ordinal spelling to \thenumspell
+%%
+\def\numspell@ordgroup@spell@it#1{%
+ \numspell@group@digits{#1}%
+ \ifcase\numspell@group@digit@i%
+ \or\or\numspell@{due}\or\numspell@{tre}\or\numspell@{quattro}\or\numspell@{cinque}%
+ \or\numspell@{sei}\or\numspell@{sette}\or\numspell@{otto}\or\numspell@{nove}%
+ \fi%
+ \ifnum\numspell@group@digit@i>0%
+ \numspell@{cent}%
+ \ifnum\numspell@group@digit@ii=8\else%
+ \ifnum\number\numexpr\numspell@group@digit@ii+\numspell@group@digit@iii>0\numspell@{o}\fi%
+ \fi%
+ \fi%
+ \ifcase\number\numexpr10*\numspell@group@digit@ii+\numspell@group@digit@iii%
+ \or\or\numspell@{du}\or\or\numspell@{quattr}\or\numspell@{cinqu}\or\numspell@{sei}\or\numspell@{sett}%
+ \or\numspell@{ott}\or\numspell@{nov}\or\numspell@{diec}\or\numspell@{undic}\or\numspell@{dodic}%
+ \or\numspell@{tredic}\or\numspell@{quattordic}\or\numspell@{quindic}\or\numspell@{sedic}%
+ \or\numspell@{diciassett}\or\numspell@{diciott}\or\numspell@{diciannov}\or\numspell@{vent}%
+ \or\numspell@{ventun}\or\numspell@{ventidu}\or\numspell@{ventitre}\or\numspell@{ventiquattr}%
+ \or\numspell@{venticinqu}\or\numspell@{ventisei}\or\numspell@{ventisett}\or\numspell@{ventott}\or\numspell@{ventinov}%
+ \fi%
+ \ifcase\numspell@group@digit@ii%
+ \or\or\or\numspell@{trent}\or\numspell@{quarant}\or\numspell@{cinquant}\or\numspell@{sessant}%
+ \or\numspell@{settant}\or\numspell@{ottant}\or\numspell@{novant}%
+ \fi%
+ \ifnum\numspell@group@digit@ii>2%
+ \ifcase\numspell@group@digit@iii%
+ \or\numspell@{un}\or\numspell@{adu}\or\numspell@{atre}\or\numspell@{aquattr}%
+ \or\numspell@{acinqu}\or\numspell@{asei}\or\numspell@{asett}\or\numspell@{ott}\or\numspell@{anov}%
+ \fi%
+ \fi%
+ \ifnum\numspell@group@digit@i>0%
+ \ifnum\numspell@group@digit@ii=0%
+ \ifcase\numspell@group@digit@iii%
+ \or\numspell@{un}\or\or\numspell@{tre}%
+ \fi%
+ \fi%
+ \fi%
+ \ifnum\number\numexpr\numspell@group@digit@i+\numspell@group@digit@ii=0%
+ \ifcase\numspell@group@digit@iii%
+ \or\or\or\numspell@{tre}%
+ \fi%
+ \fi%
+}
+
+%% SPELLING CARDINAL NUMBER
+%% --------------------------------------
+%% \numspell@num@spell@it{<num1>}{<num2>}
+%% --------------------------------------
+%% \numspell@groups{<num1>}{<num2>}
+%% Adding the \numspell@num spelling to \thenumspell
+%%
+\def\numspell@num@spell@it#1#2{%
+ \gdef\thenumspell{}%
+ \numspell@groups{#1}{#2}%
+ \setcounter{numspell@groupcount}{22}%
+ \@whilenum\value{numspell@groupcount}>2%
+ \do{%
+ \IfEq{\csname numspell@group@\roman{numspell@groupcount}\endcsname}{0}{}{%
+ \IfEq{\csname numspell@group@\roman{numspell@groupcount}\endcsname}{1}{\numspell@{un}}{}%
+ \numspell@group@spell@it{\csname numspell@group@\roman{numspell@groupcount}\endcsname}%
+ \numspell@{ }%
+ \IfEq{\csname numspell@group@\roman{numspell@groupcount}\endcsname}{1}%
+ {\csname numspell@group@\roman{numspell@groupcount}@it@name\endcsname}%
+ {\csname numspell@group@\roman{numspell@groupcount}@it@name@plural\endcsname}%
+ \ifnum\csname numspell@group@\roman{numspell@groupcount}@before\endcsname>0\numspell@{ }\fi%
+ }%
+ \addtocounter{numspell@groupcount}{-1}%
+ }%
+ \IfEq{\numspell@group@ii}{0}{}{%
+ \numspell@group@spell@it{\numspell@group@ii}%
+ \IfEq{\numspell@group@ii}{1}{\numspell@group@ii@it@name}{\numspell@group@ii@it@name@plural}%
+ \numspell@group@digits{\numspell@group@ii}%
+ \ifnum\numspell@group@digit@i>0\ifnum\number\numexpr\numspell@group@digit@ii+\numspell@group@digit@iii>0%
+ \ifnum\numspell@group@ii@before>0\numspell@{ }\fi%
+ \fi\fi%
+ }%
+ \IfEq{\numspell@group@i}{0}{}{%
+ \IfEq{\numspell@group@i}{1}{\numspell@{uno}}{}%
+ \ifnum\numspell@group@max>1%
+ \IfEq{\numspell@group@i}{3}{\numspell@{tr\'{e}}}{\numspell@group@spell@it{\numspell@group@i}}%
+ \else%
+ \numspell@group@spell@it{\numspell@group@i}%
+ \fi%
+ }%
+ \ifnum\numspell@group@max=0\numspell@{zero}\fi%
+}
+
+%% SPELLING ORDINAL NUMBER
+%% -----------------------------------------
+%% \numspell@ordnum@spell@it{<num1>}{<num2>}
+%% -----------------------------------------
+%% \numspell@groups{<num1>}{<num2>}
+%% Adding the \numspell@num ordinal spelling to \thenumspell
+%%
+\def\numspell@ordnum@spell@it#1#2{%
+ \gdef\thenumspell{}%
+ \numspell@groups{#1}{#2}%
+ \setcounter{numspell@groupcount}{22}%
+ \@whilenum\value{numspell@groupcount}>2%
+ \do{%
+ \IfEq{\csname numspell@group@\roman{numspell@groupcount}\endcsname}{0}{}{%
+ \IfEq{\csname numspell@group@\roman{numspell@groupcount}\endcsname}{1}{\numspell@{un}}{}%
+ \numspell@group@spell@it{\csname numspell@group@\roman{numspell@groupcount}\endcsname}%
+ \numspell@{ }%
+ \ifnum\csname numspell@group@\roman{numspell@groupcount}@before\endcsname>0%
+ \IfEq{\csname numspell@group@\roman{numspell@groupcount}\endcsname}{1}%
+ {\csname numspell@group@\roman{numspell@groupcount}@it@name\endcsname}%
+ {\csname numspell@group@\roman{numspell@groupcount}@it@name@plural\endcsname}%
+ \numspell@{ }%
+ \else%
+ \csname numspell@ordgroup@\roman{numspell@groupcount}@it@name\endcsname%
+ \numspell@it@gender%
+ \fi%
+ }%
+ \addtocounter{numspell@groupcount}{-1}%
+ }%
+ \IfEq{\numspell@group@ii}{0}{}{%
+ \numspell@group@spell@it{\numspell@group@ii}%
+ \ifnum\numspell@group@ii@before>0%
+ \IfEq{\numspell@group@ii}{1}{\numspell@group@ii@it@name}{\numspell@group@ii@it@name@plural}%
+ \else%
+ \numspell@ordgroup@ii@it@name%
+ \numspell@it@gender%
+ \fi%
+ \numspell@group@digits{\numspell@group@ii}%
+ \ifnum\numspell@group@digit@i>0\ifnum\number\numexpr\numspell@group@digit@ii+\numspell@group@digit@iii>0%
+ \ifnum\numspell@group@ii@before>0\numspell@{ }\fi%
+ \fi\fi%
+ }%
+ \IfEq{\numspell@group@i}{0}{}{%
+ \ifnum\numspell@group@max>1%
+ \IfEq{\numspell@group@i}{1}{\numspell@{un}}{}%
+ \numspell@ordgroup@spell@it{\numspell@group@i}%
+ \numspell@{esim}%
+ \numspell@it@gender%
+ \else%
+ \ifcase\numspell@group@i%
+ \or\numspell@{prim}\or\numspell@{second}\or\numspell@{terz}\or\numspell@{quart}\or\numspell@{quint}%
+ \or\numspell@{sest}\or\numspell@{settim}\or\numspell@{ottav}\or\numspell@{non}\or\numspell@{decim}%
+ \else%
+ \numspell@ordgroup@spell@it{\numspell@group@i}%
+ \numspell@{esim}%
+ \fi%
+ \numspell@it@gender%
+ \fi%
+ }%
+ \ifnum\numspell@group@max=0\numspell@{zeresim}\numspell@it@gender\fi%
+}
+
+%% ----------------------
+%% \numspell@uppercase@it
+%% ----------------------
+%% E.g. \def\thenumspell{uno}\numspell@uppercase\thenumspell --> 'Uno'
+%% \MakeUppercase does not work on pdf bookmark (see hyperref), so using another effective macro.
+%%
+\def\numspell@uppercase@it{%
+ \fullexpandarg%
+ \StrChar{\thenumspell}{1}[\numspell@firstletter]%
+ \expandarg%
+ \StrGobbleLeft{\thenumspell}{1}[\numspell@trunc]%
+ \fullexpandarg%
+ \def\numspell@the{}%
+ \IfStrEq{\numspell@firstletter}{u}{\g@addto@macro\numspell@the{U}}{}% uno
+ \IfStrEq{\numspell@firstletter}{d}{\g@addto@macro\numspell@the{D}}{}% due
+ \IfStrEq{\numspell@firstletter}{t}{\g@addto@macro\numspell@the{T}}{}% tre
+ \IfStrEq{\numspell@firstletter}{q}{\g@addto@macro\numspell@the{Q}}{}% quattro
+ \IfStrEq{\numspell@firstletter}{c}{\g@addto@macro\numspell@the{C}}{}% cinque
+ \IfStrEq{\numspell@firstletter}{s}{\g@addto@macro\numspell@the{S}}{}% sei
+ \IfStrEq{\numspell@firstletter}{o}{\g@addto@macro\numspell@the{O}}{}% otto
+ \IfStrEq{\numspell@firstletter}{n}{\g@addto@macro\numspell@the{N}}{}% nove
+ \IfStrEq{\numspell@firstletter}{v}{\g@addto@macro\numspell@the{V}}{}% venti
+ \IfStrEq{\numspell@firstletter}{m}{\g@addto@macro\numspell@the{M}}{}% mille
+ \IfStrEq{\numspell@firstletter}{z}{\g@addto@macro\numspell@the{Z}}{}% zero
+ \IfStrEq{\numspell@firstletter}{p}{\g@addto@macro\numspell@the{P}}{}% primo
+ \ifx\numspell@the\@empty\@latexerr{'numspell.sty' error! There is not '\numspell@firstletter' in uppercase!}{}\fi%
+ \g@addto@macro\numspell@the{\numspell@trunc}%
+ \def\thenumspell{\numspell@the}%
+}
+
+\endinput \ No newline at end of file
diff --git a/macros/latex/contrib/numspell/numspell-magyar.sty b/macros/latex/contrib/numspell/numspell-magyar.sty
new file mode 100644
index 0000000000..ce4c1d2442
--- /dev/null
+++ b/macros/latex/contrib/numspell/numspell-magyar.sty
@@ -0,0 +1,398 @@
+%%
+%% `numspell-magyar.sty' Hungarian language package for 'numspell.sty'
+%%
+%% Copyright 2017- by Tibor Tomacs
+%%
+%% 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 2005/12/01 or later.
+%%
+%% This work has the LPPL maintenance status `maintained'.
+%%
+%% The Current Maintainer of this work is Tibor Tomacs.
+%%
+\NeedsTeXFormat{LaTeX2e}[1999/12/01]
+\ProvidesPackage{numspell-magyar}[2017/02/09 v1.0 Hungarian language package for numspell]
+
+%% Automatic Hungarian definite article ('a' or 'az')
+%% ---------------
+%% \numspell@az@hu
+%% ---------------
+%% E.g. \def\thenumspell{egy}\numspell@az@hu\thenumspell --> 'az egy'
+%% \def\thenumspell{hat}\numspell@az@hu\thenumspell --> 'a hat'
+%%
+\def\numspell@az@hu{%
+ \fullexpandarg%
+ \StrChar{\thenumspell}{1}[\numspell@firstletter]%
+ \expandarg%
+ \StrGobbleLeft{\thenumspell}{0}[\numspell@original]%
+ \fullexpandarg%
+ \def\numspell@the{}%
+ \IfStrEq{\numspell@firstletter}{e}{\g@addto@macro\numspell@the{az }}{% az egy, az ezer
+ \IfStrEq{\numspell@firstletter}{{\"{o}}}{\g@addto@macro\numspell@the{az }}{% az \"{o}t
+ \g@addto@macro\numspell@the{a }}}% a hat
+ \g@addto@macro\numspell@the{\numspell@original}%
+ \def\thenumspell{\numspell@the}%
+}
+
+%% Automatic Hungarian definite article ('A' or 'Az')
+%% ---------------
+%% \numspell@Az@hu
+%% ---------------
+%% E.g. \def\thenumspell{egy}\numspell@Az@hu\thenumspell --> 'Az egy'
+%% \def\thenumspell{hat}\numspell@Az@hu\thenumspell --> 'A hat'
+%%
+\def\numspell@Az@hu{%
+ \fullexpandarg%
+ \StrChar{\thenumspell}{1}[\numspell@firstletter]%
+ \expandarg%
+ \StrGobbleLeft{\thenumspell}{0}[\numspell@original]%
+ \fullexpandarg%
+ \def\numspell@the{}%
+ \IfStrEq{\numspell@firstletter}{e}{\g@addto@macro\numspell@the{Az }}{% Az egy, Az ezer
+ \IfStrEq{\numspell@firstletter}{{\"{o}}}{\g@addto@macro\numspell@the{Az }}{% Az \"{o}t
+ \g@addto@macro\numspell@the{A }}}% A hat, A nyolc,...
+ \g@addto@macro\numspell@the{\numspell@original}%
+ \def\thenumspell{\numspell@the}%
+}
+
+%% --------------------------
+%% \anumspell[<num2>]{<num1>} (Default <num2> is 0)
+%% --------------------------
+%% \numspell@num@spell@hu{<num1>}{<num2>}
+%% \numspell@az@hu
+%% \thenumspell
+%%
+%% ---------------------------
+%% \anumspell*[<num2>]{<num1>} works like \anumspell, but \thenumspell will not be expanded.
+%% ---------------------------
+%%
+\newcommand{\anumspell@output}[2][0]{\numspell@num@spell@hu{#2}{#1}\numspell@az@hu\thenumspell}
+\newcommand{\anumspell@@output}[2][0]{\numspell@num@spell@hu{#2}{#1}\numspell@az@hu\ignorespaces}
+\DeclareRobustCommand*{\anumspell}{%
+ \ifnum\pdf@strcmp{\languagename}{magyar}=\z@\else\@latexerr{'numspell.sty' error! \protect\anumspell\space supported only in 'magyar' language}{}\fi%
+ \@ifstar{\anumspell@@output}{\anumspell@output}%
+}
+
+%% --------------------------
+%% \Anumspell[<num2>]{<num1>} (Default <num2> is 0)
+%% --------------------------
+%% \numspell@num@spell@hu{<num1>}{<num2>}
+%% \numspell@Az@hu
+%% \thenumspell
+%%
+%% ---------------------------
+%% \Anumspell*[<num2>]{<num1>} works like \Anumspell, but \thenumspell will not be expanded.
+%% ---------------------------
+%%
+\newcommand{\Anumspell@output}[2][0]{\numspell@num@spell@hu{#2}{#1}\numspell@Az@hu\thenumspell}
+\newcommand{\Anumspell@@output}[2][0]{\numspell@num@spell@hu{#2}{#1}\numspell@Az@hu\ignorespaces}
+\DeclareRobustCommand*{\Anumspell}{%
+ \ifnum\pdf@strcmp{\languagename}{magyar}=\z@\else\@latexerr{'numspell.sty' error! \protect\Anumspell\space supported only in 'magyar' language}{}\fi%
+ \@ifstar{\Anumspell@@output}{\Anumspell@output}%
+}
+
+%% -----------------------------
+%% \aordnumspell[<num2>]{<num1>} (Default <num2> is 0)
+%% -----------------------------
+%% \numspell@ordnum@spell@hu{<num1>}{<num2>}
+%% \numspell@az@hu
+%% \thenumspell
+%%
+%% ------------------------------
+%% \aordnumspell*[<num2>]{<num1>} works like \aordnumspell, but \thenumspell will not be expanded.
+%% ------------------------------
+%%
+\newcommand{\aordnumspell@output}[2][0]{\numspell@ordnum@spell@hu{#2}{#1}\numspell@az@hu\thenumspell}
+\newcommand{\aordnumspell@@output}[2][0]{\numspell@ordnum@spell@hu{#2}{#1}\numspell@az@hu\ignorespaces}
+\DeclareRobustCommand*{\aordnumspell}{%
+ \ifnum\pdf@strcmp{\languagename}{magyar}=\z@\else\@latexerr{'numspell.sty' error! \protect\aordnumspell\space supported only in 'magyar' language}{}\fi%
+ \@ifstar{\aordnumspell@@output}{\aordnumspell@output}%
+}
+
+%% -----------------------------
+%% \Aordnumspell[<num2>]{<num1>} (Default <num2> is 0)
+%% -----------------------------
+%% \numspell@ordnum@spell@hu{<num1>}{<num2>}
+%% \numspell@Az@hu
+%% \thenumspell
+%%
+%% ------------------------------
+%% \Aordnumspell*[<num2>]{<num1>} works like \Aordnumspell, but \thenumspell will not be expanded.
+%% ------------------------------
+%%
+\newcommand{\Aordnumspell@output}[2][0]{\numspell@ordnum@spell@hu{#2}{#1}\numspell@Az@hu\thenumspell}
+\newcommand{\Aordnumspell@@output}[2][0]{\numspell@ordnum@spell@hu{#2}{#1}\numspell@Az@hu\ignorespaces}
+\DeclareRobustCommand*{\Aordnumspell}{%
+ \ifnum\pdf@strcmp{\languagename}{magyar}=\z@\else\@latexerr{'numspell.sty' error! \protect\Aordnumspell\space supported only in 'magyar' language}{}\fi%
+ \@ifstar{\Aordnumspell@@output}{\Aordnumspell@output}%
+}
+
+%% GROUP NAMES
+\def\numspell@group@ii@hu@name{\numspell@{ezer}}
+\def\numspell@group@iii@hu@name{\numspell@{milli\'{o}}}
+\def\numspell@group@iv@hu@name{\numspell@{milli\'{a}rd}}
+\def\numspell@group@v@hu@name{\numspell@{billi\'{o}}}
+\def\numspell@group@vi@hu@name{\numspell@{billi\'{a}rd}}
+\def\numspell@group@vii@hu@name{\numspell@{trilli\'{o}}}
+\def\numspell@group@viii@hu@name{\numspell@{trilli\'{a}rd}}
+\def\numspell@group@ix@hu@name{\numspell@{kvadrilli\'{o}}}
+\def\numspell@group@x@hu@name{\numspell@{kvadrilli\'{a}rd}}
+\def\numspell@group@xi@hu@name{\numspell@{kvintilli\'{o}}}
+\def\numspell@group@xii@hu@name{\numspell@{kvintilli\'{a}rd}}
+\def\numspell@group@xiii@hu@name{\numspell@{szextilli\'{o}}}
+\def\numspell@group@xiv@hu@name{\numspell@{szextilli\'{a}rd}}
+\def\numspell@group@xv@hu@name{\numspell@{szeptilli\'{o}}}
+\def\numspell@group@xvi@hu@name{\numspell@{szeptilli\'{a}rd}}
+\def\numspell@group@xvii@hu@name{\numspell@{oktilli\'{o}}}
+\def\numspell@group@xviii@hu@name{\numspell@{oktilli\'{a}rd}}
+\def\numspell@group@xix@hu@name{\numspell@{nonilli\'{o}}}
+\def\numspell@group@xx@hu@name{\numspell@{nonilli\'{a}rd}}
+\def\numspell@group@xxi@hu@name{\numspell@{decilli\'{o}}}
+\def\numspell@group@xxii@hu@name{\numspell@{decilli\'{a}rd}}
+
+%% ORDINAL GROUP NAMES
+\def\numspell@ordgroup@ii@hu@name{\numspell@{ezredik}}
+\def\numspell@ordgroup@iii@hu@name{\numspell@{milliomodik}}
+\def\numspell@ordgroup@iv@hu@name{\numspell@{milli\'{a}rdodik}}
+\def\numspell@ordgroup@v@hu@name{\numspell@{billiomodik}}
+\def\numspell@ordgroup@vi@hu@name{\numspell@{billi\'{a}rdodik}}
+\def\numspell@ordgroup@vii@hu@name{\numspell@{trilliomodik}}
+\def\numspell@ordgroup@viii@hu@name{\numspell@{trilli\'{a}rdodik}}
+\def\numspell@ordgroup@ix@hu@name{\numspell@{kvadrilliomodik}}
+\def\numspell@ordgroup@x@hu@name{\numspell@{kvadrilli\'{a}rdodik}}
+\def\numspell@ordgroup@xi@hu@name{\numspell@{kvintilliomodik}}
+\def\numspell@ordgroup@xii@hu@name{\numspell@{kvintilli\'{a}rdodik}}
+\def\numspell@ordgroup@xiii@hu@name{\numspell@{szextilliomodik}}
+\def\numspell@ordgroup@xiv@hu@name{\numspell@{szextilli\'{a}rdodik}}
+\def\numspell@ordgroup@xv@hu@name{\numspell@{szeptilliomodik}}
+\def\numspell@ordgroup@xvi@hu@name{\numspell@{szeptilli\'{a}rdodik}}
+\def\numspell@ordgroup@xvii@hu@name{\numspell@{oktilliomodik}}
+\def\numspell@ordgroup@xviii@hu@name{\numspell@{oktilli\'{a}rdodik}}
+\def\numspell@ordgroup@xix@hu@name{\numspell@{nonilliomodik}}
+\def\numspell@ordgroup@xx@hu@name{\numspell@{nonilli\'{a}rdodik}}
+\def\numspell@ordgroup@xxi@hu@name{\numspell@{decilliomodik}}
+\def\numspell@ordgroup@xxii@hu@name{\numspell@{decilli\'{a}rdodik}}
+
+%% SPELLING CARDINAL NUMBER GROUP
+%% ---------------------------------
+%% \numspell@group@spell@hu{<group>} (<group>=000,001,...,999)
+%% ---------------------------------
+%% \numspell@group@digits{<group>}
+%% Adding the <group> spelling to \thenumspell
+%%
+\def\numspell@group@spell@hu#1{%
+ \numspell@group@digits{#1}%
+ \ifcase\numspell@group@digit@i%
+ \or\or\numspell@{k\'{e}t}\or\numspell@{h\'{a}rom}\or\numspell@{n\'{e}gy}\or\numspell@{{\"{o}}t}% 1 --> 'ezeregysz\'{a}z' but 'sz\'{a}z'
+ \or\numspell@{hat}\or\numspell@{h\'{e}t}\or\numspell@{nyolc}\or\numspell@{kilenc}%
+ \fi%
+ \ifnum\numspell@group@digit@i>0%
+ \numspell@{sz\'{a}z}%
+ \fi%
+ \ifnum\numspell@group@digit@iii>0%
+ \ifcase\numspell@group@digit@ii%
+ \or\numspell@{tizen}\or\numspell@{huszon}%
+ \fi%
+ \else%
+ \ifcase\numspell@group@digit@ii%
+ \or\numspell@{t\'{i}z}\or\numspell@{h\'{u}sz}%
+ \fi%
+ \fi%
+ \ifcase\numspell@group@digit@ii%
+ \or\or\or\numspell@{harminc}\or\numspell@{negyven}\or\numspell@{{\"{o}}tven}\or\numspell@{hatvan}%
+ \or\numspell@{hetven}\or\numspell@{nyolcvan}\or\numspell@{kilencven}%
+ \fi%
+ \ifcase\numspell@group@digit@iii%
+ \or\numspell@{egy}\or\or\numspell@{h\'{a}rom}\or\numspell@{n\'{e}gy}\or\numspell@{{\"{o}}t}% 2 --> 'k\'{e}t' or 'kett\H{o}'
+ \or\numspell@{hat}\or\numspell@{h\'{e}t}\or\numspell@{nyolc}\or\numspell@{kilenc}%
+ \fi%
+}
+
+%% SPELLING ORDINAL NUMBER GROUP
+%% ------------------------------------
+%% \numspell@ordgroup@spell@hu{<group>} (<group>=000,001,...,999)
+%% ------------------------------------
+%% \numspell@group@digits{<group>}
+%% Adding the <group> ordinal spelling to \thenumspell
+%%
+\def\numspell@ordgroup@spell@hu#1{%
+ \numspell@group@digits{#1}%
+ \ifcase\numspell@group@digit@i%
+ \or\or\numspell@{k\'{e}t}\or\numspell@{h\'{a}rom}\or\numspell@{n\'{e}gy}\or\numspell@{{\"{o}}t}% 1 --> 'ezeregysz\'{a}z' but 'sz\'{a}z'
+ \or\numspell@{hat}\or\numspell@{h\'{e}t}\or\numspell@{nyolc}\or\numspell@{kilenc}%
+ \fi%
+ \ifnum\numspell@group@digit@i>0%
+ \ifnum\number\numexpr\numspell@group@digit@i*(\numspell@group@digit@ii+\numspell@group@digit@iii)>0%
+ \numspell@{sz\'{a}z}%
+ \else%
+ \numspell@{sz\'{a}zadik}%
+ \fi%
+ \fi%
+ \ifnum\numspell@group@digit@iii>0%
+ \ifcase\numspell@group@digit@ii%
+ \or\numspell@{tizen}\or\numspell@{huszon}\or\numspell@{harminc}\or\numspell@{negyven}\or\numspell@{{\"{o}}tven}%
+ \or\numspell@{hatvan}\or\numspell@{hetven}\or\numspell@{nyolcvan}\or\numspell@{kilencven}%
+ \fi%
+ \else%
+ \ifcase\numspell@group@digit@ii%
+ \or\numspell@{tizedik}\or\numspell@{huszadik}\or\numspell@{harmincadik}\or\numspell@{negyvenedik}%
+ \or\numspell@{{\"{o}}tvenedik}\or\numspell@{hatvanadik}\or\numspell@{hetvenedik}%
+ \or\numspell@{nyolcvanadik}\or\numspell@{kilencvenedik}%
+ \fi%
+ \fi%
+ \ifcase\numspell@group@digit@iii%
+ \or\or\or\numspell@{harmadik}\or\numspell@{negyedik}\or\numspell@{{\"{o}}t\"{o}dik}% 1 --> 'els\H{o}' or 'egyedik' 2 --> 'm\'{a}sodik' or 'kettedik'
+ \or\numspell@{hatodik}\or\numspell@{hetedik}\or\numspell@{nyolcadik}\or\numspell@{kilencedik}%
+ \fi%
+}
+
+%% SPELLING CARDINAL NUMBER
+%% --------------------------------------
+%% \numspell@num@spell@hu{<num1>}{<num2>}
+%% --------------------------------------
+%% \numspell@groups{<num1>}{<num2>}
+%% Adding the \numspell@num spelling to \thenumspell
+%%
+\def\numspell@num@spell@hu#1#2{%
+ \gdef\thenumspell{}%
+ \numspell@groups{#1}{#2}%
+ \setcounter{numspell@groupcount}{22}%
+ \@whilenum\value{numspell@groupcount}>2%
+ \do{%
+ \IfEq{\csname numspell@group@\roman{numspell@groupcount}\endcsname}{0}{}{%
+ \numspell@group@digits{\csname numspell@group@\roman{numspell@groupcount}\endcsname}%
+ \ifnum\numspell@group@max>\value{numspell@groupcount}%
+ \ifcase\numspell@group@digit@i\or\numspell@{egy}\fi%
+ \fi%
+ \numspell@group@spell@hu{\csname numspell@group@\roman{numspell@groupcount}\endcsname}%
+ \ifcase\numspell@group@digit@iii\or\or\numspell@{k\'{e}t}\fi%
+ \csname numspell@group@\roman{numspell@groupcount}@hu@name\endcsname%
+ \ifnum\numspell@group@min<\value{numspell@groupcount}\numspell@dash@\fi%
+ }%
+ \addtocounter{numspell@groupcount}{-1}%
+ }%
+ \IfEq{\numspell@group@ii}{0}{}{%
+ \numspell@group@digits{\numspell@group@ii}%
+ \ifnum\numspell@group@max>2%
+ \ifcase\numspell@group@digit@i\or\numspell@{egy}\fi%
+ \fi%
+ \IfEq{\numspell@group@ii}{1}{%
+ \ifnum\numspell@group@max>2%
+ \numspell@group@spell@hu{\numspell@group@ii}%
+ \fi}%
+ {\numspell@group@spell@hu{\numspell@group@ii}}%
+ \ifcase\numspell@group@digit@iii\or\or\numspell@{k\'{e}t}\fi%
+ \numspell@group@ii@hu@name%
+ \ifnum\numspell@group@min<2%
+ \IfEq{\numspell@group@ii}{1}{}{\numspell@dash@}%
+ \fi%
+ }%
+ \IfEq{\numspell@group@i}{0}{}{%
+ \numspell@group@digits{\numspell@group@i}%
+ \ifnum\numspell@group@max>1%
+ \ifcase\numspell@group@digit@i\or\numspell@{egy}\fi%
+ \fi%
+ \numspell@group@spell@hu{\numspell@group@i}%
+ \ifcase\numspell@group@digit@iii\or\or\numspell@{kett\H{o}}\fi%
+ }%
+ \ifnum\numspell@group@max=0\numspell@{nulla}\fi%
+}
+
+%% SPELLING ORDINAL NUMBER
+%% -----------------------------------------
+%% \numspell@ordnum@spell@hu{<num1>}{<num2>}
+%% -----------------------------------------
+%% \numspell@groups{<num1>}{<num2>}
+%% Adding the \numspell@num ordinal spelling to \thenumspell
+%%
+\def\numspell@ordnum@spell@hu#1#2{%
+ \gdef\thenumspell{}%
+ \numspell@groups{#1}{#2}%
+ \setcounter{numspell@groupcount}{22}%
+ \@whilenum\value{numspell@groupcount}>2%
+ \do{%
+ \IfEq{\csname numspell@group@\roman{numspell@groupcount}\endcsname}{0}{}{%
+ \numspell@group@digits{\csname numspell@group@\roman{numspell@groupcount}\endcsname}%
+ \ifnum\numspell@group@max>\value{numspell@groupcount}%
+ \ifcase\numspell@group@digit@i\or\numspell@{egy}\fi%
+ \fi%
+ \numspell@group@spell@hu{\csname numspell@group@\roman{numspell@groupcount}\endcsname}%
+ \ifcase\numspell@group@digit@iii\or\or\numspell@{k\'{e}t}\fi%
+ \ifnum\numspell@group@min<\value{numspell@groupcount}%
+ \csname numspell@group@\roman{numspell@groupcount}@hu@name\endcsname%
+ \numspell@dash@%
+ \else%
+ \csname numspell@ordgroup@\roman{numspell@groupcount}@hu@name\endcsname%
+ \fi%
+ }%
+ \addtocounter{numspell@groupcount}{-1}%
+ }%
+ \IfEq{\numspell@group@ii}{0}{}{%
+ \numspell@group@digits{\numspell@group@ii}%
+ \ifnum\numspell@group@max>2%
+ \ifcase\numspell@group@digit@i\or\numspell@{egy}\fi%
+ \fi%
+ \IfEq{\numspell@group@ii}{1}{%
+ \ifnum\numspell@group@max>2%
+ \numspell@group@spell@hu{\numspell@group@ii}%
+ \fi}%
+ {\numspell@group@spell@hu{\numspell@group@ii}}%
+ \ifcase\numspell@group@digit@iii\or\or\numspell@{k\'{e}t}\fi%
+ \ifnum\numspell@group@min<2%
+ \numspell@group@ii@hu@name%
+ \IfEq{\numspell@group@ii}{1}{}{\numspell@dash@}%
+ \else%
+ \numspell@ordgroup@ii@hu@name%
+ \fi%
+ }%
+ \IfEq{\numspell@group@i}{0}{}{%
+ \numspell@group@digits{\numspell@group@i}%
+ \ifnum\numspell@group@max>1%
+ \ifcase\numspell@group@digit@i\or\numspell@{egy}\fi%
+ \fi%
+ \numspell@ordgroup@spell@hu{\numspell@group@i}%
+ \ifnum\numspell@numlength>1%
+ \ifcase\numspell@group@digit@iii%
+ \or\numspell@{egyedik}\or\numspell@{kettedik}%
+ \fi%
+ \else%
+ \ifcase\numspell@group@digit@iii%
+ \or\numspell@{els\H{o}}\or\numspell@{m\'{a}sodik}%
+ \fi%
+ \fi%
+ }%
+ \ifnum\numspell@group@max=0\numspell@{nulladik}\fi%
+}
+
+%% ----------------------
+%% \numspell@uppercase@hu
+%% ----------------------
+%% E.g. \def\thenumspell{egy}\numspell@uppercase\thenumspell --> 'Egy'
+%% \MakeUppercase does not work on pdf bookmark (see hyperref), so using another effective macro.
+%%
+\def\numspell@uppercase@hu{%
+ \fullexpandarg%
+ \StrChar{\thenumspell}{1}[\numspell@firstletter]%
+ \expandarg%
+ \StrGobbleLeft{\thenumspell}{1}[\numspell@trunc]%
+ \fullexpandarg%
+ \def\numspell@the{}%
+ \IfStrEq{\numspell@firstletter}{e}{\g@addto@macro\numspell@the{E}}{}% egy
+ \IfStrEq{\numspell@firstletter}{k}{\g@addto@macro\numspell@the{K}}{}% kett\H{o}
+ \IfStrEq{\numspell@firstletter}{m}{\g@addto@macro\numspell@the{M}}{}% m\'{a}sodik
+ \IfStrEq{\numspell@firstletter}{h}{\g@addto@macro\numspell@the{H}}{}% h\'{a}rom
+ \IfStrEq{\numspell@firstletter}{n}{\g@addto@macro\numspell@the{N}}{}% n\'{e}gy
+ \IfStrEq{\numspell@firstletter}{{\"{o}}}{\g@addto@macro\numspell@the{\"{O}}}{}% \"{o}t
+ \IfStrEq{\numspell@firstletter}{t}{\g@addto@macro\numspell@the{T}}{}% t\'{i}z
+ \IfStrEq{\numspell@firstletter}{s}{\g@addto@macro\numspell@the{S}}{}% sz\'{a}z
+ \ifx\numspell@the\@empty\@latexerr{'numspell.sty' error! There is not '\numspell@firstletter' in uppercase!}{}\fi%
+ \g@addto@macro\numspell@the{\numspell@trunc}%
+ \def\thenumspell{\numspell@the}%
+}
+
+\endinput \ No newline at end of file
diff --git a/macros/latex/contrib/numspell/numspell.pdf b/macros/latex/contrib/numspell/numspell.pdf
new file mode 100644
index 0000000000..60ea99893f
--- /dev/null
+++ b/macros/latex/contrib/numspell/numspell.pdf
Binary files differ
diff --git a/macros/latex/contrib/numspell/numspell.sty b/macros/latex/contrib/numspell/numspell.sty
new file mode 100644
index 0000000000..3fd2fcc178
--- /dev/null
+++ b/macros/latex/contrib/numspell/numspell.sty
@@ -0,0 +1,301 @@
+%%
+%% `numspell.sty'
+%%
+%% Package for spelling the non-negative cardinal and ordinal numbers (maximum 66 digits).
+%%
+%% Copyright 2017- by Tibor Tomacs
+%%
+%% 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 2005/12/01 or later.
+%%
+%% This work has the LPPL maintenance status `maintained'.
+%%
+%% The Current Maintainer of this work is Tibor Tomacs.
+%%
+\NeedsTeXFormat{LaTeX2e}[1999/12/01]
+\ProvidesPackage{numspell}[2017/09/30 v1.2 Package for spelling cardinal and ordinal numbers]
+
+\RequirePackage{xstring}
+\RequirePackage{pdftexcmds}
+\RequirePackage{etoolbox}
+
+\newcounter{numspell@counter@tempa}
+\newcounter{numspell@counter@tempb}
+\newcounter{numspell@counter@tempc}
+\newcounter{numspell@groupcount}
+
+%% -------------------------------
+%% \numspell@group@digits{<group>} (<group>=000,001,...,999)
+%% -------------------------------
+%% It generates the following parameters:
+%%
+%% \numspell@group@digit@i = 1st digit
+%% \numspell@group@digit@ii = 2nd digit
+%% \numspell@group@digit@iii = 3rd digit
+%%
+\def\numspell@group@digits#1{%
+ \StrChar{#1}{1}[\numspell@group@digit@i]%
+ \StrChar{#1}{2}[\numspell@group@digit@ii]%
+ \StrChar{#1}{3}[\numspell@group@digit@iii]%
+}
+
+%% --------------------------------
+%% \numspell@groups{<num1>}{<num2>} (<num1>*10^<num2>=0,1,...,999999999999...9 (66 digits)=10^67-1)
+%% --------------------------------
+%% It generates the following parameters:
+%%
+%% \numspell@num = <num1>*10^<num2>
+%% \numspell@numlength = number of \numspell@num digits
+%% \numspell@fullnum = (66-\numspell@numlength) pieces 0, then \numspell@num
+%% \numspell@group@i = 64th, 65th and 66th digits of \numspell@fullnum --> [group1]
+%% \numspell@group@ii = 61th, 62th and 63th digits of \numspell@fullnum --> [group2]
+%% \numspell@group@iii = 58th, 59th and 60th digits of \numspell@fullnum --> [group3]
+%% ... ... ...
+%% \numspell@group@xxii = 1st, 2nd and 3rd digits of \numspell@fullnum --> [group22]
+%% \numspell@group@max = maximum <number>, which such that, [group<number>] is positive
+%% \numspell@group@min = minimum <number>, which such that, [group<number>] is positive
+%% \numspell@group@<num>@before = number of positive groups, whose serial number is less then <num> (<num>=ii,iii,...,xxii)
+%%
+\def\numspell@groups#1#2{%
+ \def\numspell@num{#1}%
+ \setcounter{numspell@counter@tempa}{0}%
+ \@whilenum\value{numspell@counter@tempa}<#2%
+ \do{%
+ \stepcounter{numspell@counter@tempa}%
+ \g@addto@macro\numspell@num{0}%
+ }%
+ \def\numspell@fullnum{}%
+ \StrLen{\numspell@num}[\numspell@numlength]%
+ \ifnum\numspell@numlength>66\@latexerr{Number too big (\numspell@numlength\space digits). Maximum 66 digits}{}\fi%
+ \setcounter{numspell@counter@tempa}{66}%
+ \addtocounter{numspell@counter@tempa}{-\numspell@numlength}%
+ \setcounter{numspell@counter@tempb}{0}%
+ \@whilenum\value{numspell@counter@tempb}<\value{numspell@counter@tempa}%
+ \do{%
+ \stepcounter{numspell@counter@tempb}%
+ \g@addto@macro\numspell@fullnum{0}%
+ }%
+ \g@addto@macro\numspell@fullnum{\numspell@num}%
+ \StrMid{\numspell@fullnum}{64}{66}[\numspell@group@i]%
+ \StrMid{\numspell@fullnum}{61}{63}[\numspell@group@ii]%
+ \StrMid{\numspell@fullnum}{58}{60}[\numspell@group@iii]%
+ \StrMid{\numspell@fullnum}{55}{57}[\numspell@group@iv]%
+ \StrMid{\numspell@fullnum}{52}{54}[\numspell@group@v]%
+ \StrMid{\numspell@fullnum}{49}{51}[\numspell@group@vi]%
+ \StrMid{\numspell@fullnum}{46}{48}[\numspell@group@vii]%
+ \StrMid{\numspell@fullnum}{43}{45}[\numspell@group@viii]%
+ \StrMid{\numspell@fullnum}{40}{42}[\numspell@group@ix]%
+ \StrMid{\numspell@fullnum}{37}{39}[\numspell@group@x]%
+ \StrMid{\numspell@fullnum}{34}{36}[\numspell@group@xi]%
+ \StrMid{\numspell@fullnum}{31}{33}[\numspell@group@xii]%
+ \StrMid{\numspell@fullnum}{28}{30}[\numspell@group@xiii]%
+ \StrMid{\numspell@fullnum}{25}{27}[\numspell@group@xiv]%
+ \StrMid{\numspell@fullnum}{22}{24}[\numspell@group@xv]%
+ \StrMid{\numspell@fullnum}{19}{21}[\numspell@group@xvi]%
+ \StrMid{\numspell@fullnum}{16}{18}[\numspell@group@xvii]%
+ \StrMid{\numspell@fullnum}{13}{15}[\numspell@group@xviii]%
+ \StrMid{\numspell@fullnum}{10}{12}[\numspell@group@xix]%
+ \StrMid{\numspell@fullnum}{7}{9}[\numspell@group@xx]%
+ \StrMid{\numspell@fullnum}{4}{6}[\numspell@group@xxi]%
+ \StrMid{\numspell@fullnum}{1}{3}[\numspell@group@xxii]%
+ \def\numspell@group@max{0}%
+ \setcounter{numspell@counter@tempa}{0}%
+ \@whilenum\value{numspell@counter@tempa}<22%
+ \do{%
+ \stepcounter{numspell@counter@tempa}%
+ \ifnum\csname numspell@group@\roman{numspell@counter@tempa}\endcsname>0%
+ \edef\numspell@group@max{\thenumspell@counter@tempa}%
+ \fi%
+ }%
+ \def\numspell@group@min{0}%
+ \setcounter{numspell@counter@tempa}{23}%
+ \@whilenum\value{numspell@counter@tempa}>1%
+ \do{%
+ \addtocounter{numspell@counter@tempa}{-1}%
+ \ifnum\csname numspell@group@\roman{numspell@counter@tempa}\endcsname>0%
+ \edef\numspell@group@min{\thenumspell@counter@tempa}%
+ \fi%
+ }%
+ \setcounter{numspell@counter@tempa}{1}%
+ \@whilenum\value{numspell@counter@tempa}<22%
+ \do{%
+ \stepcounter{numspell@counter@tempa}%
+ \setcounter{numspell@counter@tempb}{1}%
+ \setcounter{numspell@counter@tempc}{0}%
+ \@whilenum\value{numspell@counter@tempb}<\value{numspell@counter@tempa}%
+ \do{%
+ \ifnum\csname numspell@group@\roman{numspell@counter@tempb}\endcsname>0%
+ \stepcounter{numspell@counter@tempc}%
+ \fi%
+ \stepcounter{numspell@counter@tempb}%
+ }%
+ \expandafter\protected@edef\csname numspell@group@\roman{numspell@counter@tempa}@before\endcsname{\thenumspell@counter@tempc}%
+ }%
+}
+
+%% --------------------
+%% \numspell@{<string>}
+%% --------------------
+%% E.g. \def\thenumspell{}\numspell@{one}\numspell@{ hundred}\thenumspell --> 'one hundred'
+%%
+\def\thenumspell{}
+\def\numspell@#1{\g@addto@macro\thenumspell{#1}}
+
+%% ---------------------
+%% \numspellsave{<name>}
+%% ---------------------
+%% E.g. \def\thenumspell{one}\numspellsave{foo}\thenumspellfoo --> 'one'
+%%
+\DeclareRobustCommand*{\numspellsave}[1]{\expandafter\protected@xdef\csname thenumspell#1\endcsname{\thenumspell}\ignorespaces}
+
+%% -------------------------------
+%% \numspelldashspace{<length>}
+%% -------------------------------
+%% It determinates the maximal flexibility of the spaces around the dashes. Default: 2pt
+%% E.g. \numspelldashspace{5pt} --> \numspell@dash@ = \numspell@{\nobreak\hskip0pt plus5pt-\hskip0pt plus5pt}
+%%
+\def\numspell@dash@@#1{\leavevmode\nobreak\hskip0pt plus#1-\hskip0pt plus#1\relax}
+\def\numspelldashspace#1{\def\numspell@dash@{\numspell@{\numspell@dash@@{#1}}}\ignorespaces}
+\numspelldashspace{2pt}
+
+%% -------------------------
+%% \numspell[<num2>]{<num1>} (Default <num2> is 0)
+%% -------------------------
+%% \numspell@num@spell@<lang>{<num1>}{<num2>}\thenumspell
+%%
+%% --------------------------
+%% \numspell*[<num2>]{<num1>}
+%% --------------------------
+%% It works like \numspell, but \thenumspell will not be expanded.
+%%
+\newcommand{\numspell@output}[2][0]{\csname numspell@num@spell@\numspell@langname\endcsname{#2}{#1}\thenumspell}
+\newcommand{\numspell@@output}[2][0]{\csname numspell@num@spell@\numspell@langname\endcsname{#2}{#1}\ignorespaces}
+\DeclareRobustCommand*{\numspell}{\numspell@lang@check\@ifstar{\numspell@@output}{\numspell@output}}
+
+%% -------------------------
+%% \Numspell[<num2>]{<num1>} (Default <num2> is 0)
+%% -------------------------
+%% \numspell@num@spell@<lang>{<num1>}{<num2>}\numspell@uppercase\thenumspell
+%%
+%% --------------------------
+%% \Numspell*[<num2>]{<num1>}
+%% --------------------------
+%% It works like \Numspell, but \thenumspell will not be expanded.
+%%
+\newcommand{\Numspell@output}[2][0]{\csname numspell@num@spell@\numspell@langname\endcsname{#2}{#1}%
+ \csname numspell@uppercase@\numspell@langname\endcsname\thenumspell}
+\newcommand{\Numspell@@output}[2][0]{\csname numspell@num@spell@\numspell@langname\endcsname{#2}{#1}%
+ \csname numspell@uppercase@\numspell@langname\endcsname\ignorespaces}
+\DeclareRobustCommand*{\Numspell}{\numspell@lang@check\@ifstar{\Numspell@@output}{\Numspell@output}}
+
+%% ----------------------------
+%% \ordnumspell[<num2>]{<num1>} (Default <num2> is 0)
+%% ----------------------------
+%% \numspell@ordnum@spell@<lang>{<num1>}{<num2>}\thenumspell
+%%
+%% -----------------------------
+%% \ordnumspell*[<num2>]{<num1>}
+%% -----------------------------
+%% It works like \ordnumspell, but \thenumspell will not be expanded.
+%%
+\newcommand{\ordnumspell@output}[2][0]{\csname numspell@ordnum@spell@\numspell@langname\endcsname{#2}{#1}\thenumspell}
+\newcommand{\ordnumspell@@output}[2][0]{\csname numspell@ordnum@spell@\numspell@langname\endcsname{#2}{#1}\ignorespaces}
+\DeclareRobustCommand*{\ordnumspell}{\numspell@lang@check\@ifstar{\ordnumspell@@output}{\ordnumspell@output}}
+
+%% ----------------------------
+%% \Ordnumspell[<num2>]{<num1>} (Default <num2> is 0)
+%% ----------------------------
+%% \numspell@ordnum@spell@<lang>{<num1>}{<num2>}\numspell@uppercase\thenumspell
+%%
+%% -----------------------------
+%% \Ordnumspell*[<num2>]{<num1>}
+%% -----------------------------
+%% It works like \Ordnumspell, but \thenumspell will not be expanded.
+%%
+\newcommand{\Ordnumspell@output}[2][0]{\csname numspell@ordnum@spell@\numspell@langname\endcsname{#2}{#1}%
+ \csname numspell@uppercase@\numspell@langname\endcsname\thenumspell}
+\newcommand{\Ordnumspell@@output}[2][0]{\csname numspell@ordnum@spell@\numspell@langname\endcsname{#2}{#1}%
+ \csname numspell@uppercase@\numspell@langname\endcsname\ignorespaces}
+\DeclareRobustCommand*{\Ordnumspell}{\numspell@lang@check\@ifstar{\Ordnumspell@@output}{\Ordnumspell@output}}
+
+%% --------------------
+%% \numspell@lang@check
+%% --------------------
+%% If english is active, then \numspell@langname will be 'en'.
+%% If magyar is active, then \numspell@langname will be 'hu'.
+%% If german or ngerman is active, then \numspell@langname will be 'de'.
+%% If french is active, then \numspell@langname will be 'fr'.
+%% If italian is active, then \numspell@langname will be 'it'.
+%% Otherwise error.
+%%
+\newif\if@numspell@lang@notsupported@
+\def\numspell@lang@check{%
+ \@numspell@lang@notsupported@true%
+ \ifnum\pdf@strcmp{\languagename}{english}=\z@\@numspell@lang@notsupported@false\def\numspell@langname{en}\fi%
+ \ifnum\pdf@strcmp{\languagename}{magyar}=\z@\@numspell@lang@notsupported@false\def\numspell@langname{hu}\fi%
+ \ifnum\pdf@strcmp{\languagename}{german}=\z@\@numspell@lang@notsupported@false\def\numspell@langname{de}\fi%
+ \ifnum\pdf@strcmp{\languagename}{ngerman}=\z@\@numspell@lang@notsupported@false\def\numspell@langname{de}\fi%
+ \ifnum\pdf@strcmp{\languagename}{french}=\z@\@numspell@lang@notsupported@false\def\numspell@langname{fr}\fi%
+ \ifnum\pdf@strcmp{\languagename}{italian}=\z@\@numspell@lang@notsupported@false\def\numspell@langname{it}\fi%
+ \if@numspell@lang@notsupported@\@latexerr{'numspell.sty' error! Not supported language: \languagename}{}\fi%
+}
+
+%% -------------------------
+%% Loading language packages
+%% -------------------------
+%% If babel or polyglossia loads english, then numspell loads numspell-english.sty.
+%% If babel or polyglossia loads magyar, then numspell loads numspell-magyar.sty.
+%% If babel or polyglossia loads german or ngerman, then numspell loads numspell-german.sty.
+%% If babel or polyglossia loads french, then numspell loads numspell-french.sty.
+%% If babel or polyglossia loads italian, then numspell loads numspell-italian.sty.
+%% Otherwise numspell loads numspell-english.sty.
+%%
+\AtEndPreamble{%
+\newif\if@numspell@lang@loaded@
+\bbl@iflanguage\languagename{\expandafter\ifx\csname dateenglish\endcsname\relax\else\RequirePackage{numspell-english}\@numspell@lang@loaded@true\fi}%
+\bbl@iflanguage\languagename{\expandafter\ifx\csname datemagyar\endcsname\relax\else\RequirePackage{numspell-magyar}\@numspell@lang@loaded@true\fi}%
+\bbl@iflanguage\languagename{\expandafter\ifx\csname dategerman\endcsname\relax\else\RequirePackage{numspell-german}\@numspell@lang@loaded@true\fi}%
+\bbl@iflanguage\languagename{\expandafter\ifx\csname datengerman\endcsname\relax\else\RequirePackage{numspell-german}\@numspell@lang@loaded@true\fi}%
+\bbl@iflanguage\languagename{\expandafter\ifx\csname datefrench\endcsname\relax\else\RequirePackage{numspell-french}\@numspell@lang@loaded@true\fi}%
+\bbl@iflanguage\languagename{\expandafter\ifx\csname dateitalian\endcsname\relax\else\RequirePackage{numspell-italian}\@numspell@lang@loaded@true\fi}%
+\if@numspell@lang@loaded@\else\RequirePackage{numspell-english}\fi%
+}
+
+%% ---------------------------------
+%% Instructions for language package
+%% ---------------------------------
+%%
+%% If the language name is <language> in babel or polyglossia,
+%% then the name of the language package file will be numspell-<language>.sty (e.g. numspell-english.sty).
+%%
+%% Extend the following commands in the numspell.sty:
+%% \AtEndPreamble
+%% \numspell@lang@check (Use the \def\numspell@langname{<lang>}, where <lang> is abbreviation of the <language>, e.g. 'en' in case 'english'.)
+%%
+%% Define the following commands in numspell-<language>.sty:
+%% \numspell@uppercase@<lang>
+%% \numspell@group@<num>@<lang>@name
+%% \numspell@ordgroup@<num>@<lang>@name
+%% \numspell@group@spell@<lang>
+%% \numspell@ordgroup@spell@<lang>
+%% \numspell@num@spell@<lang>
+%% \numspell@ordnum@spell@<lang>
+%% (See <lang> at \numspell@lang@check.)
+%%
+%% Put into the \numspell@{...} command the words of the spelling (e.g. \numspell@{one}).
+%%
+%% Type the non-ascii characters as LaTeX-commands: \'{a}, \'{e}, \ss{}, etc.
+%%
+%% If the first character is non-ascii, then place it within braces (see \numspell@uppercase@<lang>) (e.g. {\"{o}}t).
+%%
+%% Do not use \numspell@{-} as dash! Instead of it: \numspell@dash@ (see \numspelldashspace).
+%%
+%% Do not use the following form: \def\foo{text} ... \numspell@{\foo}
+%% Instead of it: \def\numspell@foo@<lang>{\numspell@{text}} ... \numspell@foo@<lang>
+
+\endinput \ No newline at end of file
diff --git a/macros/latex/contrib/numspell/numspell.tex b/macros/latex/contrib/numspell/numspell.tex
new file mode 100644
index 0000000000..5c8186fe48
--- /dev/null
+++ b/macros/latex/contrib/numspell/numspell.tex
@@ -0,0 +1,578 @@
+%%
+%% `numspell.tex' documentation of the numspell package
+%%
+%% Copyright 2017- by Tibor Tomacs
+%%
+%% 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 2005/12/01 or later.
+%%
+%% This work has the LPPL maintenance status `maintained'.
+%%
+%% The Current Maintainer of this work is Tibor Tomacs.
+%%
+\documentclass{article}
+\usepackage[a4paper,margin=25mm]{geometry}
+\usepackage[pdfstartview=FitH,colorlinks,allcolors=black,bookmarksnumbered]{hyperref}
+\usepackage[utf8]{inputenc}
+\usepackage[T1]{fontenc}
+\usepackage{numspell}
+\usepackage[magyar,italian,ngerman,french,english]{babel}
+\usepackage{listings,xcolor,amsmath,upquote}
+\usepackage[group-separator={,}]{siunitx}
+\flushbottom
+\setlength{\labelsep}{0pt}
+\setlength{\parindent}{0pt}
+\setlength{\parskip}{6pt}
+
+\lstnewenvironment{examplelst}{\lstset{
+belowskip=\bigskipamount,
+basicstyle=\ttfamily,
+backgroundcolor=\color{black!10},
+columns=fullflexible,
+keepspaces}}{}
+
+\newcommand{\commandinline}{\lstinline[
+literate={<}{{$\langle$}}1{>}{{$\rangle$}}1,
+delim={[is][\color{green!50!black}\normalfont\itshape]{!}{!}},
+basicstyle=\color{blue!80!black}\ttfamily,
+columns=fullflexible,
+keepspaces]}
+
+\newcommand{\verbinline}{\lstinline[
+literate={<}{{$\langle$}}1{>}{{$\rangle$}}1,
+delim={[is][\color{green!50!black}\normalfont\itshape]{!}{!}},
+basicstyle=\ttfamily,
+columns=fullflexible,
+keepspaces]}
+
+\begin{document}
+
+\title{The {\bfseries\sffamily numspell} package\\{\large v1.2 (2017/09/30)}}
+\author{Tibor Tómács\\{\normalsize\url{tomacs.tibor@uni-eszterhazy.hu}}}
+\date{}
+\maketitle
+
+\section{Introduction}
+The aim of the \texttt{numspell} package is to spell the cardinal and ordinal numbers from 0 to $10^{67}-1$ (i.e.~maximum 66 digits).
+
+Currently, the supported languages are English, French, German, Hungarian and Italian.
+The spelling will happen in the current language.
+
+The \texttt{numspell} package requires the services of the following packages: \texttt{xstring}, \texttt{etoolbox}, \texttt{pdftexcmds}.
+
+Load the package as usual, with
+\begin{flushleft}
+\commandinline|\usepackage{numspell}|
+\end{flushleft}
+
+\section{Commands}
+\begin{description}
+\item\commandinline|\numspell[!<zeros>!]{!<num>!}|\\
+Spelling the cardinal number $n=\text{\color{green!50!black}\itshape$\langle$num$\rangle$}\cdot10^{\text{\color{green!50!black}\itshape$\langle$zeros$\rangle$}}$, where $0\leq n\leq 10^{67}-1$. The default value of \commandinline|!<zeros>!| is \texttt{0}. For example
+\begin{flushleft}
+\verb|\numspell{12000}| $\to$ \numspell{12000}\\
+\verb|\numspell[3]{12}| $\to$ \numspell[3]{12}\\
+\verb|\numspell[6]{12}| $\to$ \numspell[6]{12}\\
+\verb|\numspell[63]{1}| $\to$ \numspell[63]{1}
+\end{flushleft}
+
+\item\commandinline|\thenumspell|\\
+The \verb|\numspell| stores the result in this command. For example
+\begin{flushleft}
+\verb|\numspell{12000}; \thenumspell| $\to$ \numspell{12000}; \thenumspell\\
+\verb|\numspell{1}; \numspell{2}; \thenumspell| $\to$ \numspell{1}; \numspell{2}; \thenumspell
+\end{flushleft}
+
+\item\commandinline|\numspellsave{!<name>!}|\\
+It generates the \commandinline|\thenumspell!<name>!| command, which saves the current \verb|\thenumspell|. For example
+\begin{verbatim}
+\numspell{1};
+\numspellsave{MyNum}
+\numspell{2};
+\thenumspell;
+\thenumspellMyNum
+\end{verbatim}
+\numspell{1};
+\numspellsave{MyNum}
+\numspell{2};
+\thenumspell;
+\thenumspellMyNum
+
+\item\commandinline|\numspelldashspace{!<length>!}|\\
+In the number spelling, the spaces around the dashes are flexibility for the optimal hyphenation. Its value is \texttt{0pt plus} \commandinline|!<length>!|.
+The default value of \commandinline|!<length>!| is \texttt{2pt}. For example
+\begin{verbatim}
+\selectlanguage{magyar}
+\numspell{6512312354762547162546254756}\\[2mm]
+\numspelldashspace{10pt}
+\numspell{6512312354762547162546254756}
+\end{verbatim}
+{\selectlanguage{magyar}
+\numspell{6512312354762547162546254756}\\[2mm]
+\numspelldashspace{10pt}
+\numspell{6512312354762547162546254756}}
+
+\item\commandinline|\numspell*[!<zeros>!]{!<num>!}|\\
+It works like \verb|\numspell|, but the number spelling will not be printed.
+In other words, the following two lines are equivalent:
+\begin{flushleft}
+\verbinline|\numspell[!<zeros>!]{!<num>!}|\\
+\verbinline|\numspell*[!<zeros>!]{!<num>!}\thenumspell|
+\end{flushleft}
+For example
+\begin{verbatim}
+\numspell*{1}
+\numspellsave{MyNum}
+\numspell*{2}
+\thenumspell;
+\thenumspellMyNum
+\end{verbatim}
+\numspell*{1}
+\numspellsave{MyNum}
+\numspell*{2}
+\thenumspell;
+\thenumspellMyNum
+
+\item\commandinline|\Numspell[!<zeros>!]{!<num>!}|\\
+It works like \verb|\numspell|, but the first letter will be capital. For example
+\begin{flushleft}
+\verb|\Numspell{12000}| $\to$ \Numspell{12000}\\
+\verb|\Numspell[3]{12}| $\to$ \Numspell[3]{12}\\
+\verb|\Numspell[6]{12}| $\to$ \Numspell[6]{12}\\
+\verb|\Numspell[63]{1}| $\to$ \Numspell[63]{1}
+\end{flushleft}
+
+\item\commandinline|\Numspell*[!<zeros>!]{!<num>!}|\\
+It works like \verb|\Numspell|, but the number spelling will not be printed.
+In other words, the following two lines are equivalent:
+\begin{flushleft}
+\verbinline|\Numspell[!<zeros>!]{!<num>!}|\\
+\verbinline|\Numspell*[!<zeros>!]{!<num>!}\thenumspell|
+\end{flushleft}
+For example
+\begin{verbatim}
+\Numspell*{1}
+\numspellsave{MyNum}
+\Numspell*{2}
+\thenumspell;
+\thenumspellMyNum
+\end{verbatim}
+\Numspell*{1}
+\numspellsave{MyNum}
+\Numspell*{2}
+\thenumspell;
+\thenumspellMyNum
+
+\item\commandinline|\ordnumspell[!<zeros>!]{!<num>!}|\\
+Spelling the ordinal number
+$n=\text{\color{green!50!black}\itshape$\langle$num$\rangle$}\cdot10^{\text{\color{green!50!black}\itshape$\langle$zeros$\rangle$}}$,
+where $0\leq n\leq 10^{67}-1$. The default value of \commandinline|!<zeros>!| is \texttt{0}. For example
+\begin{flushleft}
+\verb|\ordnumspell{12000}| $\to$ \ordnumspell{12000}\\
+\verb|\ordnumspell[3]{12}| $\to$ \ordnumspell[3]{12}\\
+\verb|\ordnumspell[6]{12}| $\to$ \ordnumspell[6]{12}\\
+\verb|\ordnumspell[63]{1}| $\to$ \ordnumspell[63]{1}
+\end{flushleft}
+
+\item\commandinline|\ordnumspell*[!<zeros>!]{!<num>!}|\\
+It works like \verb|\ordnumspell|, but the number spelling will not be printed.
+In other words, the following two lines are equivalent:
+\begin{flushleft}
+\verbinline|\ordnumspell[!<zeros>!]{!<num>!}|\\
+\verbinline|\ordnumspell*[!<zeros>!]{!<num>!}\thenumspell|
+\end{flushleft}
+For example
+\begin{verbatim}
+\ordnumspell*{1}
+\numspellsave{MyNum}
+\ordnumspell*{2}
+\thenumspell;
+\thenumspellMyNum
+\end{verbatim}
+\ordnumspell*{1}
+\numspellsave{MyNum}
+\ordnumspell*{2}
+\thenumspell;
+\thenumspellMyNum
+
+\item\commandinline|\Ordnumspell[!<zeros>!]{!<num>!}|\\
+It works like \verb|\ordnumspell|, but the first letter will be capital. For example
+\begin{flushleft}
+\verb|\Ordnumspell{12000}| $\to$ \Ordnumspell{12000}\\
+\verb|\Ordnumspell[3]{12}| $\to$ \Ordnumspell[3]{12}\\
+\verb|\Ordnumspell[6]{12}| $\to$ \Ordnumspell[6]{12}\\
+\verb|\Ordnumspell[63]{1}| $\to$ \Ordnumspell[63]{1}
+\end{flushleft}
+
+\item\commandinline|\Ordnumspell*[!<zeros>!]{!<num>!}|\\
+It works like \verb|\Ordnumspell|, but the number spelling will not be printed.
+In other words, the following two lines are equivalent:
+\begin{flushleft}
+\verbinline|\Ordnumspell[!<zeros>!]{!<num>!}|\\
+\verbinline|\Ordnumspell*[!<zeros>!]{!<num>!}\thenumspell|
+\end{flushleft}
+For example
+\begin{verbatim}
+\Ordnumspell*{1}
+\numspellsave{MyNum}
+\Ordnumspell*{2}
+\thenumspell;
+\thenumspellMyNum
+\end{verbatim}
+\Ordnumspell*{1}
+\numspellsave{MyNum}
+\Ordnumspell*{2}
+\thenumspell;
+\thenumspellMyNum
+\end{description}
+
+\section{Commands for English language}
+\begin{description}
+\item\commandinline|\numspellUS|\\
+By default, the number spelling will happen in British English, if the \texttt{english} language is active.
+This command changes it to American English. For example
+\begin{flushleft}
+\verb|\numspellUS\numspell{1012345}| $\to$ \numspellUS\numspell{1012345}\numspellGB
+\end{flushleft}
+
+\item\commandinline|\numspellGB|\\
+Using the \verb|\numspellUS| command, you can rechange it to British English by this command. For example
+\begin{verbatim}
+\numspellUS\numspell{1012345}\\
+\numspellGB\numspell{1012345}
+\end{verbatim}
+\numspellUS\numspell{1012345}\\
+\numspellGB\numspell{1012345}
+\end{description}
+
+\section{Commands for French language}
+The following commands only work, if \texttt{french} language is active.
+\begin{description}
+\selectlanguage{french}
+\item\commandinline|\numspellpremiere|\\
+By default, \verb|\ordnumspell{1}| $\to$ \ordnumspell{1},\\
+but \verb|\numspellpremiere\ordnumspell{1}| $\to$ {\numspellpremiere\ordnumspell{1}}
+
+\item\commandinline|\numspellpremier| (default)\\
+\verb|\numspellpremiere\ordnumspell{1};|\\
+\verb|\numspellpremier\ordnumspell{1}|\\[2mm]
+{\numspellpremiere\ordnumspell{1}}; {\numspellpremier\ordnumspell{1}}
+\end{description}
+
+\section{Commands for Hungarian language}
+The following commands only work, if \texttt{magyar} language is active.
+\begin{description}
+\item\commandinline|\anumspell[!<zeros>!]{!<num>!}|\\
+It works like \verb|\numspell|, but the number spelling will start with Hungarian definite article. For example
+\begin{flushleft}
+{\selectlanguage{magyar}
+\verb|\anumspell{1}| $\to$ \anumspell{1}\\
+\verb|\anumspell{2}| $\to$ \anumspell{2}}
+\end{flushleft}
+
+\item\commandinline|\anumspell*[!<zeros>!]{!<num>!}|\\
+It works like \verb|\anumspell|, but the number spelling will not be printed.
+In other words, the following two lines are equivalent:
+\begin{flushleft}
+\verbinline|\anumspell[!<zeros>!]{!<num>!}|\\
+\verbinline|\anumspell*[!<zeros>!]{!<num>!}\thenumspell|
+\end{flushleft}
+For example
+\begin{verbatim}
+\anumspell*{1}
+\numspellsave{MyNum}
+\anumspell*{2}
+\thenumspell;
+\thenumspellMyNum
+\end{verbatim}
+{\selectlanguage{magyar}
+\anumspell*{1}
+\numspellsave{MyNum}
+\anumspell*{2}
+\thenumspell;
+\thenumspellMyNum}
+
+\item\commandinline|\Anumspell[!<zeros>!]{!<num>!}|\\
+It works like \verb|\anumspell|, but the first letter will be capital. For example
+\begin{flushleft}
+{\selectlanguage{magyar}
+\verb|\Anumspell{1}| $\to$ \Anumspell{1}\\
+\verb|\Anumspell{2}| $\to$ \Anumspell{2}}
+\end{flushleft}
+
+\item\commandinline|\Anumspell*[!<zeros>!]{!<num>!}|\\
+It works like \verb|\Anumspell|, but the number spelling will not be printed.
+In other words, the following two lines are equivalent:
+\begin{flushleft}
+\verbinline|\Anumspell[!<zeros>!]{!<num>!}|\\
+\verbinline|\Anumspell*[!<zeros>!]{!<num>!}\thenumspell|
+\end{flushleft}
+For example
+\begin{verbatim}
+\Anumspell*{1}
+\numspellsave{MyNum}
+\Anumspell*{2}
+\thenumspell;
+\thenumspellMyNum
+\end{verbatim}
+{\selectlanguage{magyar}
+\Anumspell*{1}
+\numspellsave{MyNum}
+\Anumspell*{2}
+\thenumspell;
+\thenumspellMyNum}
+
+\item\commandinline|\aordnumspell[!<zeros>!]{!<num>!}|\\
+It works like \verb|\ordnumspell|, but the number spelling will start with Hungarian definite article. For example
+\begin{flushleft}
+{\selectlanguage{magyar}
+\verb|\aordnumspell{1}| $\to$ \aordnumspell{1}\\
+\verb|\aordnumspell{2}| $\to$ \aordnumspell{2}}
+\end{flushleft}
+
+\item\commandinline|\aordnumspell*[!<zeros>!]{!<num>!}|\\
+It works like \verb|\aordnumspell|, but the number spelling will not be printed.
+In other words, the following two lines are equivalent:
+\begin{flushleft}
+\verbinline|\aordnumspell[!<zeros>!]{!<num>!}|\\
+\verbinline|\aordnumspell*[!<zeros>!]{!<num>!}\thenumspell|
+\end{flushleft}
+For example
+\begin{verbatim}
+\aordnumspell*{1}
+\numspellsave{MyNum}
+\aordnumspell*{2}
+\thenumspell;
+\thenumspellMyNum
+\end{verbatim}
+{\selectlanguage{magyar}
+\aordnumspell*{1}
+\numspellsave{MyNum}
+\aordnumspell*{2}
+\thenumspell;
+\thenumspellMyNum}
+
+\item\commandinline|\Aordnumspell[!<zeros>!]{!<num>!}|\\
+It works like \verb|\aordnumspell|, but the first letter will be capital. For example
+\begin{flushleft}
+{\selectlanguage{magyar}
+\verb|\Aordnumspell{1}| $\to$ \Aordnumspell{1}\\
+\verb|\Aordnumspell{2}| $\to$ \Aordnumspell{2}}
+\end{flushleft}
+
+\item\commandinline|\Aordnumspell*[!<zeros>!]{!<num>!}|\\
+It works like \verb|\Aordnumspell|, but the number spelling will not be printed.
+In other words, the following two lines are equivalent:
+\begin{flushleft}
+\verbinline|\Aordnumspell[!<zeros>!]{!<num>!}|\\
+\verbinline|\Aordnumspell*[!<zeros>!]{!<num>!}\thenumspell|
+\end{flushleft}
+For example
+\begin{verbatim}
+\Aordnumspell*{1}
+\numspellsave{MyNum}
+\Aordnumspell*{2}
+\thenumspell;
+\thenumspellMyNum
+\end{verbatim}
+{\selectlanguage{magyar}
+\Aordnumspell*{1}
+\numspellsave{MyNum}
+\Aordnumspell*{2}
+\thenumspell;
+\thenumspellMyNum}
+\end{description}
+
+\section{Commands for Italian language}
+The following commands only work, if \texttt{italian} language is active.
+\begin{description}
+\selectlanguage{italian}
+\item\commandinline|\numspellitmasculine| (default)\\
+The ordinal numbers will be printed in masculine form. For example\\
+\verb|\ordnumspell{1}| $\to$ \ordnumspell{1}
+
+\item\commandinline|\numspellitfeminine|\\
+The ordinal numbers will be printed in feminine form. For example\\
+\verb|\numspellitfeminine\ordnumspell{1};|\\
+\verb|\numspellitmasculine\ordnumspell{1}|\\[2mm]
+{\numspellitfeminine\ordnumspell{1}}; {\numspellitmasculine\ordnumspell{1}}
+\end{description}
+
+\section{Examples}
+\subsection*{Example \stepcounter{subsection}\arabic{subsection}}
+\begin{examplelst}
+\documentclass{article}
+\usepackage[utf8]{inputenc}
+\usepackage[T1]{fontenc}
+\usepackage[magyar,italian,ngerman,french,english]{babel}
+\usepackage{numspell}
+\usepackage[group-separator={,}]{siunitx}
+\begin{document}
+
+\def\mynum{123456789}
+
+\noindent
+In American English the spelling of \num{\mynum} is
+{\numspellUS\emph{``\numspell{\mynum}''}}.
+
+\smallskip\noindent
+In British English the spelling of \num{\mynum} is
+\emph{``\numspell{\mynum}''}.
+
+\smallskip\noindent
+In French the spelling of \num{\mynum} is
+{\selectlanguage{french}\emph{``\numspell{\mynum}''}}.
+
+\smallskip\noindent
+In German the spelling of \num{\mynum} is
+{\selectlanguage{ngerman}\emph{``\numspell{\mynum}''}}.
+
+\smallskip\noindent
+In Hungarian the spelling of \num{\mynum} is
+{\selectlanguage{magyar}\emph{`'\numspell{\mynum}''}}.
+
+\smallskip\noindent
+In Italian the spelling of \num{\mynum} is
+{\selectlanguage{italian}\emph{``\numspell{\mynum}''}}.
+
+\end{document}
+\end{examplelst}
+
+\def\mynum{123456789}
+
+\noindent
+In American English the spelling of \num{\mynum} is
+{\numspellUS\emph{``\numspell{\mynum}''}}.
+
+\smallskip\noindent
+In British English the spelling of \num{\mynum} is \emph{``\numspell{\mynum}''}.
+
+\smallskip\noindent
+In French the spelling of \num{\mynum} is
+{\selectlanguage{french}\emph{``\numspell{\mynum}''}}.
+
+\smallskip\noindent
+In German the spelling of \num{\mynum} is
+{\selectlanguage{ngerman}\emph{``\numspell{\mynum}''}}.
+
+\smallskip\noindent
+In Hungarian the spelling of \num{\mynum} is
+{\selectlanguage{magyar}\emph{`'\numspell{\mynum}''}}.
+
+\smallskip\noindent
+In Italian the spelling of \num{\mynum} is
+{\selectlanguage{italian}\emph{``\numspell{\mynum}''}}.
+
+\bigskip
+\subsection*{Example \stepcounter{subsection}\arabic{subsection}}
+\begin{examplelst}
+\documentclass{article}
+\usepackage{numspell}
+\usepackage[group-separator={,}]{siunitx}
+\begin{document}
+
+\def\mynum{123456789012345678901234567890123456789012345678901234567890123456}
+\Numspell{\mynum}, that is \num{\mynum}.
+
+\end{document}
+\end{examplelst}
+
+\def\mynum{123456789012345678901234567890123456789012345678901234567890123456}
+\Numspell{\mynum}, that is \num{\mynum}.
+
+\bigskip
+\subsection*{Example \stepcounter{subsection}\arabic{subsection}}
+\begin{examplelst}
+\documentclass{article}
+\usepackage{numspell}
+\newcounter{mycount}
+\makeatletter
+\begin{document}
+
+The
+\@whilenum\value{mycount}<51
+\do{\ordnumspell{\themycount}\stepcounter{mycount},\ }\dots
+
+\end{document}
+\end{examplelst}
+
+\makeatletter
+\newcounter{mycount}
+The
+\@whilenum\value{mycount}<51
+\do{\ordnumspell{\themycount}\stepcounter{mycount},\ }\dots
+\makeatother
+
+\bigskip
+\subsection*{Example \stepcounter{subsection}\arabic{subsection}}
+\begin{examplelst}
+\documentclass{article}
+\usepackage{numspell}
+\newcounter{mycount}
+\def\themycount{\numspell{\arabic{mycount}}}
+\makeatletter
+\begin{document}
+
+\Numspell{0},
+\@whilenum\value{mycount}<30
+\do{\stepcounter{mycount}\themycount,\ }\dots
+
+\end{document}
+\end{examplelst}
+
+\def\themycount{\numspell{\arabic{mycount}}}
+\setcounter{mycount}{0}
+\makeatletter
+\Numspell{0},
+\@whilenum\value{mycount}<30
+\do{\stepcounter{mycount}\themycount,\ }\dots
+\makeatother
+
+\bigskip
+\section{Limitations}
+Do not use the \verb|\numspell|, \verb|\numspell*|, \verb|\Numspell|, \verb|\Numspell*|, etc.\ commands inside \verb|\MakeUppercase| and sectioning commands.
+An example for the illustration of the problem:
+\begin{examplelst}
+\documentclass{article}
+\usepackage{hyperref,numspell}
+\pagestyle{headings}
+\begin{document}
+
+\section{The \ordnumspell{123} factor}
+\MakeUppercase{\numspell{123}}
+\newpage
+Text
+
+\end{document}
+\end{examplelst}
+\noindent
+The bugs:
+\begin{enumerate}
+\setlength{\labelsep}{5pt}
+\item
+You can see it on the page 1: ``\numspell{123}''\\
+Required: \numspell*{123}\MakeUppercase{``\thenumspell''}
+
+\item
+You can see it on the heading: \emph{``THE \ordnumspell{123} FACTOR''}\\
+Required: \ordnumspell*{123}\MakeUppercase{\em``The \thenumspell\ factor''}
+
+\item
+You can see it on the pdf bookmark: ``The 123 factor''\\
+Required: ``The \ordnumspell{123} factor''
+\end{enumerate}
+\noindent
+The solution is very easy:
+\begin{examplelst}
+\ordnumspell*{123}
+\section{The \thenumspell\ factor}
+\numspell*{123}
+\MakeUppercase{\thenumspell}
+\end{examplelst}
+
+\end{document} \ No newline at end of file