summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/shipunov/tex/numerus.sty
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/contrib/shipunov/tex/numerus.sty')
-rw-r--r--macros/latex/contrib/shipunov/tex/numerus.sty213
1 files changed, 213 insertions, 0 deletions
diff --git a/macros/latex/contrib/shipunov/tex/numerus.sty b/macros/latex/contrib/shipunov/tex/numerus.sty
new file mode 100644
index 0000000000..58d3d6b7a2
--- /dev/null
+++ b/macros/latex/contrib/shipunov/tex/numerus.sty
@@ -0,0 +1,213 @@
+% Author: Alexey Shipunov, dactylorhiza@gmail.com
+% Russian encoding below: Windows-1251
+
+\ProvidesPackage{numerus}%
+ [2019/10/03 v1.21 Spell numbers in Russian words]
+
+% 20191003: "numeral" -> "numerus"
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% Синтаксис: \propis[необязательный_аргумент]{<число>} %
+% \Propis[необязательный_аргумент]{<число>} %
+% \PROpis[необязательный_аргумент]{<число>} %
+% %
+% Необязательный_аргумент: k (по умолчанию, количественное %
+% числительное) %
+% z (порядковое числительное женского рода %
+% в именительном падеже) %
+% m (порядковое числительное мужского рода %
+% в именительном падеже) %
+% %
+% <Число>: цифра < 999 для порядковых числительных и < 999999 для %
+% количественных, или счетчик, принимающий аналогичные %
+% значения %
+% ВНИМАНИЕ: пакет не работает с оглавлениями и %
+% с более чем однобайтовыми кодировками %
+% порядковые номера больше 999 не поддерживаются %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% Простой пример: \propis{99} дает `девяносто девять' %
+% %
+% Сложный пример: сначала %
+% \renewcommand*{\thechapter}{\PROpis[z]{\c@chapter}}, %
+% потом (если \c@chapter=99) \textsl{\uppercase{Глава} \thechapter} %
+% дает текст `ГЛАВА ДЕВЯНОСТО ДЕВЯТАЯ' наклонным шрифтом %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\newif\ifKol@
+\newif\ifPor@Zen
+\newcount\Vrem@A
+
+% Все буквы маленькие (`девяносто девять')
+\newcommand*{\propis}[2][k]{%
+ \let\V@\relax
+ \Delat@Propis{#1}{#2}}
+
+% Первая буква большая (`Девяносто девять')
+\newcommand*{\Propis}[2][k]{%
+ \let\V@\Perv@B
+ \let\B@=B%
+ \Delat@Propis{#1}{#2}}
+
+\def\Verh@#1{\uppercase{#1}}
+\def\Perv@B#1{\if B\B@ \Verh@ #1\else
+ #1\fi
+ \let\B@\relax}
+
+% Все буквы большие (`ДЕВЯНОСТО ДЕВЯТЬ') ---
+% \uppercase{\propis{...}} не работает
+\newcommand*{\PROpis}[2][k]{%
+ \let\V@\uppercase
+ \Delat@Propis{#1}{#2}}
+
+% Основная команда
+\def\Delat@Propis#1#2{{%
+ \if k#1\Kol@true\else
+ \if z#1\Por@Zentrue\else
+ \if m#1\relax\else
+ \Oshibka@Arg
+\fi\fi\fi\Test@Propis{#2}}}
+
+% Проверка ошибок и разветвление
+\def\Test@Propis#1{%
+ \ifnum #1<0\Oshibka@Otr\else
+ \ifnum #1<10\Delat@Ed#1\else
+ \ifnum #1<20\expandafter\expandafter\expandafter
+ \Nadz@\expandafter\number#1\else
+ \ifnum #1<100\expandafter\expandafter\expandafter
+ \Delat@Des\expandafter\number#1\else
+ \ifnum #1<1000\expandafter\expandafter\expandafter
+ \Delat@Sot\expandafter\number#1\else
+ \ifnum #1<1000000\ifKol@\Vrem@A#1\advance\Vrem@A1000000
+ \expandafter\expandafter\expandafter
+ \Delat@Tys\expandafter\number\Vrem@A\else
+ \Oshibka@Tys\fi\else
+ \Oshibka@Mill
+\fi\fi\fi\fi\fi\fi}
+
+% Ошибки
+\def\Oshibka@Arg{\PackageWarning{numerus}{%
+`propis' got wrong mandatory argument!^^J%
+Command did not executed}}
+
+\def\Oshibka@Otr{\PackageWarning{numerus}{%
+`propis' got argument < 0!^^J%
+Command did not executed}}
+
+\def\Oshibka@Tys{\PackageWarning{numerus}{%
+Ordinal numeruss > 999 not supported :(^^J%
+Command did not executed}}
+
+\def\Ошибка@Mill{\PackageWarning{numerus}{%
+`propis' got argument > 999 999!^^J%
+Command did not executed}}
+
+% Единицы (0...10)
+\def\Delat@Ed#1{\ifKol@\Kol@Ed#1\else
+ \Por@Ed#1\fi}
+
+\def\Kol@Ed#1{\ifcase#1\V@{ноль}\or\V@{один}\or\V@{два}\or
+\V@{три}\or\V@{четыре}\or\V@{пять}\or\V@{шесть}\or\V@{семь}\or
+\V@{восемь}\or\V@{девять}\or\V@{десять}\fi}
+
+\def\Por@Ed#1{\ifcase#1\V@{нулев}\or\V@{перв}\or\V@{втор}\or
+\V@{трет}\or\V@{четверт}\or\V@{пят}\or\V@{шест}\or\V@{седьм}\or
+\V@{восьм}\or\V@{девят}\or\V@{десят}\fi\Ok@Ed#1}
+
+\def\Ok@Ed#1{\ifKol@\relax\else
+ \ifPor@Zen\ifcase#1\V@{ая}\or\V@{ая}\or\V@{ая}\or
+ \V@{ья}\else\V@{ая}\fi\else
+ \ifcase#1\V@{ой}\or\V@{ый}\or\V@{ой}\or
+ \V@{ий}\or\V@{ый}%
+ \or\V@{ый}\or\V@{ой}\or\V@{ой}\or
+ \V@{ой}\or\V@{ый}%
+\fi\fi\fi}
+
+% От 10 до 19
+\def\Nadz@#1#2{\ifcase#2\V@{десят}\or\V@{одиннадцат}\or
+\V@{двенадцат}\or\V@{тринадцат}\or\V@{четырнадцат}\or
+\V@{пятнадцат}\or\V@{шестнадцат}\or\V@{семнадцат}\or
+\V@{восемнадцат}\or\V@{девятнадцат}\fi\Ok@Nadz}
+
+\def\Ok@Nadz{\ifKol@\V@{ь}\else
+ \ifPor@Zen\V@{ая}\else\V@{ый}%
+\fi\fi}
+
+% 20--99
+\def\Delat@Des#1#2{\ifKol@\Kol@Des#1%
+ \ifnum #2=0\relax\else
+ \ \Kol@Ed#2\fi\else
+ \ifnum #2=0\Por@Des#1\else
+ \Kol@Des#1\ \Por@Ed#2%
+\fi\fi}
+
+\def\Kol@Des#1{\ifcase#1\or\or\V@{двадцать}\or\V@{тридцать}\or
+\V@{сорок}\or\V@{пятьдесят}\or\V@{шестьдесят}\or
+\V@{семьдесят}\or\V@{восемьдесят}\or\V@{девяносто}\fi}
+
+\def\Por@Des#1{\ifcase#1\or\or\V@{двадцат}\or\V@{тридцат}\or
+\V@{сороков}\or\V@{пятидесят}\or\V@{шестидесят}\or
+\V@{семидесят}\or\V@{восьмидесят}\or\V@{девяност}\fi\Ok@Des#1}
+
+\def\Ok@Des#1{\ifKol@\relax\else
+ \ifPor@Zen\V@{ая}\else
+ \ifcase#1\or\or\V@{ый}\or\V@{ый}\or\V@{ой}\else
+ \V@{ый}\fi
+\fi\fi}
+
+% 100--999
+\def\Delat@Sot#1#2#3{%
+\ifnum #2=0%
+ \ifnum #3=0%
+ \ifKol@\Kol@Sot#1\else\Por@Sot#1\fi\else
+ \Kol@Sot#1\ \Delat@Ed#3\fi\else
+\Delat@Ост@Sot#1#2#3\fi}
+
+\def\Delat@Ост@Sot#1#2#3{\Kol@Sot#1\ \ifnum#2=1\Nadz@#2#3\else
+ \Delat@Des#2#3\fi}
+
+\def\Kol@Sot#1{\ifcase#1\or\V@{сто}\or\V@{двести}\or
+\V@{триста}\or\V@{четыреста}\or\V@{пятьсот}\or\V@{шестьсот}\or
+\V@{семьсот}\or\V@{восемьсот}\or\V@{девятьсот}\fi}
+
+\def\Por@Sot#1{\ifcase#1\or\V@{сот}\or\V@{двухсот}\or
+\V@{трехсот}\or\V@{четырехсот}\or\V@{пятисот}\or\V@{шестисот}\or
+\V@{семисот}\or\V@{восьмисот}\or\V@{девятисот}\fi\Ok@Nadz}
+
+% 1000--999999 (только для количественных числительных)
+\def\Delat@Tys1#1#2#3#4#5#6{%
+ \Delat@P@Tys{#1}{#2}{#3}%
+\Delat@V@Tys{#4}{#5}{#6}}
+
+% Первые три цифры
+\def\Delat@P@Tys#1#2#3{%
+\ifnum #1=0%
+ \ifnum #2=0%
+ \ifnum #3=1\V@{тысяча}\else
+ \ifnum #3=2\V@{две тысячи}\else
+ \Delat@Ed#3\ \V@{тысяч}%
+\ifcase#3\or\or\or\V@{и}\or\V@{и}\else\relax\fi\fi\fi\else
+ \ifnum #2=1\Nadz@#2#3\ \V@{тысяч}\else
+ \ifnum #3=1\Delat@Des{#2}{0}\V@{одна тысяча}\else
+ \ifnum #3=2\Delat@Des{#2}{0}\V@{две тысячи}\else
+ \Delat@Des#2#3\ \V@{тысяч}%
+\ifcase#3\or\or\or\V@{и}\or\V@{и}\else\relax\fi\fi\fi\fi\fi\else
+ \ifnum #3=1\Delat@Sot{#1}{#2}{0}\V@{одна тысяча}\else
+ \ifnum #3=2\Delat@Sot{#1}{#2}{0}\V@{две тысячи}\else
+\Delat@Sot#1#2#3\ \V@{тысяч}\ifnum #2=1\relax\else
+\ifcase#3\or\or\or\V@{и}\or\V@{и}\else\relax\fi\fi\fi\fi\fi}
+
+% Вторые три цифры
+\def\Delat@V@Tys#1#2#3{%
+\ifnum #1=0%
+ \ifnum #2=0%
+ \ifnum #3=0\relax\else
+ \ \Delat@Ed#3\fi\else
+ \ifnum #2=1\ \Nadz@#2#3\else
+ \ \Delat@Des#2#3\fi\fi\else
+\ \Delat@Sot#1#2#3\fi}
+
+\endinput