% slownie.sty % Zamiana liczb na zapis słowami % Copyright (c) Marcin Woli\'nski 1996, 2000 % v. 0.5 <2000 Jul, 18> % % \liczba{liczba} % Rozwija się do liczby wyrażonej słownie po polsku % \slownie{liczba}{temat}{konc1}{konc2}{konc5} % Służy do liczenia czegoś. Nazwa tego czegoś powinna być % rozbita na temat i~końcówki właściwe dla 1, 2 (lub 3 lub 4) % i~5 elementów. Np. % \slownie{1}{złot}{y}{e}{ych} -> jeden złoty % \slownie{125}{złot}{y}{e}{ych} -> sto dwadzieścia pięć złotych % \slownie{1002}{złot}{y}{e}{ych} -> tysiąc dwa złote % W obecnej wersji stosowane są formy liczebników łączące się z % rzeczownikami rodzaju męskiego nieżywotnego (bo takiego rodzaju % jest złoty:-). Być może makro zostanie sparametryzowane % jeszcze rodzajem. % \slowspace{cokolwiek} % Powoduje, że będzie wstawiane jako % odstęp separujący słowa (domyślnie: zwykły odstęp) % \usejedentrue \usejedenfalse % Przełączniki sterujące sposobem wypisywania % liczb typu 1001001: % \usejedentrue: jeden milion jeden tysiąc jeden (domyślne) % \usejedenfalse: milion tysiąc jeden % Ten pierwszy sposób jest zdziebko dziwaczny, ale wymagany na % niektórych drukach \ProvidesPackage{slownie}[2000/07/18 v0.5 S/lowny zapis liczb ca/lkowitych] \def\mw@afterfi#1#2\fi{\fi#1} \AtBeginDocument{\let\@acute\'} % \mw@applytolastthree % Znajduje trzy ostatnie leksemy listy przekazanej w #2. % Następnie wywołuje makro dane przez #1 przekazując mu jako % parametry: jako drugi te trzy leksemy, a jako pierwszy wszystko co % było przed nimi. (Uwaga: #1 musi zachowywać się jak dwuargumentowe % makro ale wcale nie musi nim być.) % Założenie: #2 składa się co najmniej z trzech leksemów. % % #1 dwuargumentowe makro do wykonania na podzielonej liście % #2 lista leksemów do podzielenia \def\mw@applytolastthree#1#2{% \mw@applytolastthreeX{#1}{}#2\mw@stop } % #1 makro do wykonania na podzielonej liscie % #2 akumuluje leksemy % #3#4#5 kandydat na trzy leksemy % #6 podgląd następnego \def\mw@applytolastthreeX#1#2#3#4#5#6{% \ifx\mw@stop#6% znaleziono koniec \mw@afterfi{#1{#2}{#3#4#5}}% zastosuj makro \else \mw@afterfi{\mw@applytolastthreeX{#1}{#2#3}#4#5#6}% szukaj dalej \fi} \def\mw@stop{\mw@stop} % wypisz liczbę słownie (po polsku) % \def\liczba#1{\slownie@hack{#1}{}{}{}{}} \def\slownie#1#2{\slownie@hack{#1}{\slow@odstep#2}} % najpierw normalizacja przez \number: \def\slownie@hack#1{\expandafter\slow@X\expandafter{\number#1}} % następnie badamy znak: \def\slow@X#1{% \ifnum#1<0 minus\slow@odstep \mw@afterfi{\expandafter\slow@XX\expandafter{\@gobble#1}}% \else \mw@afterfi{\slow@XX{#1}}% \fi } % wreszcie dwa przypadki szczególne --- 0 i 1: \def\slow@XX#1#2#3#4#5{% \ifcase#1 zero#2#5% \or jeden#2#3% \else \slow@dod{#1}{#2}{#3}{#4}{#5}\fi } % #1 makro, które poradzi sobie z bardziej znaczącymi cyframi % #2 początek liczby bez ostatnich trzech cyfr % #3 ostatnie trzy cyfry \def\wypisz@ale@najpierw#1#2#3{\ifnum#2=0 \else #1{#2}\fi \slow@robodstep{#2}{#3}% \grupa@cyfr#3} \def\wypiszjedn@ale@najpierw#1#2#3{\ifnum#2=0 \else #1{#2}\fi \slow@robodstep{#2}{#3}% \grupa@jednostek#3} % wypisz liczbę dodatnią % to makro i wszystkie następne operują nie na liczbie, % ale na jej dziesiętnej reprezentacji % % Dodanie trzech wiodących zer zapewnia, że reprezentacja liczby ma co % najmniej 3 cyfry, oraz że po kolejnym odrzucaniu ostatnich 3 cyfr w % końcu pozostanie niepusty ciąg zer. \def\slow@dod#1{\mw@applytolastthree{\wypiszjedn@ale@najpierw\sl@tysiace}{000#1}} \def\sl@tysiace#1{\mw@applytolastthree {\wypisz@ale@najpierw\sl@miliony}{#1}% {tysi}{\k{a}c}{\k{a}ce}{\k{e}cy}} \def\sl@miliony#1{\mw@applytolastthree {\wypisz@ale@najpierw\sl@miliardy}{#1}% {milion}{}{y}{\@acute ow}} \def\sl@miliardy#1{\mw@applytolastthree {\wypisz@ale@najpierw\sl@biliony}{#1}% {miliard}{}{y}{\@acute ow}} \def\sl@biliony#1{\mw@applytolastthree {\wypisz@ale@najpierw\sl@bladzakresu}{#1}% {bilion}{}{y}{\@acute ow}} \def\sl@bladzakresu#1{\errmessage{Zbyt wielka liczba}} % #1#2#3 trzy cyfry % #4 rdzeń słowa % #5 #6 i #7 końcówki dla 1 2 i 5 \def\grupa@cyfr#1#2#3#4#5#6#7{% \ifcase#1#2#3 % zero \or \sl@wypiszjeden#4#5% \else \sl@trzycyfry#1#2#3\slow@odstep \if1\ifcase#3 0\or0\or\or\or\else0\fi \if1#20\fi1% #4#6% \else #4#7% \fi \fi } \def\grupa@jednostek#1#2#3#4#5#6#7{% \ifcase#1#2#3 #4#7% zero \or jeden#4#7% \else \sl@trzycyfry#1#2#3% \if1\ifcase#3 0\or0\or\or\or\else0\fi \if1#20\fi1% #4#6% \else #4#7% \fi \fi } \def\sl@trzycyfry#1#2#3{% \sl@setki#1% \slow@robodstep#1{#2#3}% \ifnum#2>1 \sl@dziesiatki#2% \slow@robodstep#2#3% \sl@nascie#3% \else \sl@nascie{#2#3}% \fi} \def\sl@setki#1{\ifcase#1 \or sto\or dwie\@acute scie\or trzysta\or czterysta\or pi\k{e}\@acute cset\or sze\@acute s\@acute cset\or siedemset\or osiemset\or dziewi\k{e}\@acute cset\fi} \def\sl@dziesiatki#1{\ifcase#1 \or \ddt\or dwadzie\@acute scia\or trzydzie\@acute sci\or czterdzie\@acute sci\or pi\k{e}\@acute cdziesi\k{a}t\or sze\@acute s\@acute cdziesi\k{a}t\or siedemdziesi\k{a}t\or osiemdziesi\k{a}t\or dziewi\k{e}\@acute cdziesi\k{a}t\fi} \def\sl@nascie#1{\ifcase#1 \or jeden\or dwa\or trzy\or cztery\or pi\k{e}\@acute c\or sze\@acute s\@acute c\or siedem\or osiem\or dziewi\k{e}\@acute c\or dziesi\k{e}\@acute c\or jedena\@acute scie\or dwana\@acute scie\or trzyna\@acute scie\or czterna\@acute scie\or pi\k{e}tna\@acute scie\or szesna\@acute scie\or siedemna\@acute scie\or osiemna\@acute scie\or dziewi\k{e}tna\@acute scie\fi} % odstęp jeżeli oba parametry są liczbami dodatnimi \def\slow@robodstep#1#2{% \ifnum#1>0 \ifnum#2>0 \slow@odstep \fi \fi} \def\slowspace#1{\def\slow@odstep{#1}} \slowspace\space \def\usejedentrue{\def\sl@wypiszjeden{jeden\slow@odstep}} \def\usejedenfalse{\let\sl@wypiszjeden\empty} \usejedentrue \endinput