%\iffalse meta comment % % This is file `datenumber.dtx', % % This file is part of the `datenumber' package, % % Copyright (C) 2001 J"org-Michael Schr"oder. % % IMPORTANT NOTICE: % % This program may be distributed and/or modified under the % conditions of the LaTeX Project Public License, either version 1.2 % 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.2 or later is part of all distributions of LaTeX % version 1999/12/01 or later. % % This program consists of all files listed in README.txt. % % For error reports, or offers to help make this a more powerful % tool, please contact me on schrj020@mail.uni-mainz.de % % 2022/01/27: Corrects small error in datenumberfrench.ldf und in datenumberspanish.ldf (F. P\'etiard) % %\fi % %\iffalse %<*datenumber> \def\fileversion{v0.03} \def\filedate{2022/01/27} %</datenumber> %<*driver> \documentclass{ltxdoc} \EnableCrossrefs \CodelineIndex \RecordChanges \usepackage{german} \parindent0pt \begin{document} \DocInput{datenumber.dtx} \PrintIndex \PrintChanges \end{document} %</driver> %<*datenumber> %\fi % \DoNotIndex{\setcounter, \addtocounter, \newcount, \newcounter, \value, \the} % \DoNotIndex{\@tempcnta, \@tempcntb} % \DoNotIndex{\day,\month, \year,\relax} % \DoNotIndex{\ifcase,\or,\else,\fi,\if,\ifdim,\ifnum,\ifx, \loop, \repeat} % \DoNotIndex{\def,\gdef} % \DoNotIndex{\advance, \multiply, \divide} % \DoNotIndex{\csname, \endcsname, \expandafter} % \DoNotIndex{\ProvidesPackage,\NeedsTeXFormat, \DeclareOption, \ProcessOptions} % \DoNotIndex{\input, \endinput, \empty, \errmessage} % %\title{Das {\tt datenum.sty} Paket \fileversion} %\author{J\"org-Michael Schr\"oder\\%{\small\texttt{schrj020@mail.uni-mainz.de}} %} %\date{\filedate} %\maketitle %\MakeShortVerb{\|} %\section{Der Programmcode} %\subsection{Am Anfang} % Identifizierung % \begin{macrocode} \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{datenumber}[\filedate \fileversion] % \end{macrocode} % Sprachoptionen deklarieren und entsprechende Dateien laden. % \begin{macrocode} \DeclareOption{english}{\input datenumberenglish.ldf} \DeclareOption{USenglish}{\input datenumberUSenglish.ldf} \DeclareOption{french}{\input datenumberfrench.ldf} \DeclareOption{italian}{\input datenumberitalian.ldf} \DeclareOption{spanish}{\input datenumberspanish.ldf} \DeclareOption{german}{\input datenumbergerman.ldf} \DeclareOption{ngerman}{\input datenumbergerman.ldf} \input datenumberUSenglish.ldf \ProcessOptions % \end{macrocode} % Interne Z��hler % \begin{macrocode} \newcounter{@dayscnt} \newcounter{@startyear} % \end{macrocode} %\DescribeMacro{\setstartyear} %Hiermit kann der Start der Nummerierung festgelegt werden. Au��erden werden alle Z��hler %(siehe Abschnitt~\ref{defcounter}) Auf den heutigen Tag gesetzt. %Am Ende der Datei wird diese Makro aufgerufen. %|@startyear| mu�� gr����er als 0 sein und %kleiner als das Jahr eines, zu berechnenden Datums. Je kleiner der Wert ist, desto l��nger %dauern die Rechnungen. % \begin{macrocode} \def\setstartyear#1{% \ifnum#1<1 \errmessage{Package datenumber: startyear < 1}% \fi \setcounter{@startyear}{#1}% \setdatetoday } % \end{macrocode} %\DescribeMacro{\thestartyear} %Hiermit kann auf einfache Weise der Wert von |@startyear| ausgegeben werden. % \begin{macrocode} \def\thestartyear{\the@startyear} % \end{macrocode} %\subsection{Die grundlegenden Berechnungen} %\DescribeMacro{\setmydatenumber} %Berechnung einer laufenden Nummer f��r ein gegebenes Datum. Der erste Parameter ist der Name %eines Z��hlers in dem die Nummer gespeichtert wird. \#2, \#3, \#4 sind die Werte f��r das Jahr, den Monat und den Tag. %Es wird getestet, ob das Datum g��ltig ist, ob |startyear| gr����er 1 und ob das ��bergebene %Jahr nicht kleiner als |startyear| ist. Die Zwischenergebnisse werden in |@dayscnt| gespeichert und zum %Schlu�� in den Z��hler \#1 geschrieben. % \begin{macrocode} \def\setmydatenumber#1#2#3#4{% \ifvaliddate{#2}{#3}{#4}% \else \errmessage{\@errmessage}% \fi \ifnum\the@startyear<1 \errmessage{Package datenumber: startyear < 1}% \fi \ifnum#2<\the@startyear \errmessage{Package datenumber: datenumber < startyear (#2 < \the@startyear)}% \fi \setcounter{@dayscnt}{0}% \ifnum#2>\the@startyear \relax\@yearloop{#2}% \fi \addtocounter{@dayscnt}{% \ifcase #3% \or 0\or 31\or 59 \or 90\or 120\or 151 \or 181\or 212\or 243 \or 273\or 304\or 334 \fi }% \ifleapyear{#2}% \ifnum#3>2 \addtocounter{@dayscnt}{1}% \fi \fi \ifnum#2=1582 \ifnum#3>10 \addtocounter{@dayscnt}{-10}% \fi \ifnum#3=10 \ifnum#4>14 \addtocounter{@dayscnt}{-10}% \fi \fi \fi \addtocounter{@dayscnt}{#4}% \setcounter{#1}{\the@dayscnt}% } % \end{macrocode} %\DescribeMacro{\setmydatebynumber} %Berechnung eines Datums aus der laufenden Nummer. Der erste Parameter ist der Wert der Nummer. %\#2, \#3, \#4 sind die Namen von Z��hlern in denen das Jahr, der Monat und der Tag gespeichert werden sollen. %Es wird getestet, ob |startyear| gr����er 1 und ob die ��bergebene Nummer gr����er 0 ist. %Die |loop|, |return| Schleife ist nicht unbedingt erforderlich, macht das Ganze aber schneller. % \begin{macrocode} \def\setmydatebynumber#1#2#3#4{% \ifnum\the@startyear<1 \errmessage{Package datenumber: startyear < 1}% \fi \ifnum#1<1 \errmessage{Package datenumber: datenumber < 1}% \fi \setcounter{#2}{\the@startyear}% \setcounter{@dayscnt}{1}% \loop \ifleapyear{\thedateyear}% \@tempcnta=366 \else \@tempcnta=365 \fi \ifnum\thedateyear=1582 \@tempcnta=355 \fi \addtocounter{@dayscnt}{\the\@tempcnta}% \ifnum\the@dayscnt<#1\addtocounter{dateyear}{1}% \repeat \addtocounter{@dayscnt}{-\the\@tempcnta}% % \setcounter{#3}{1}% \setcounter{#4}{1}% \setmydatenumber{@dayscnt}{\value{#2}}{\value{#3}}{\value{#4}}% \ifnum#1>\the@dayscnt\relax \loop \mynextdate{#2}{#3}{#4}% \addtocounter{@dayscnt}{1}% \ifnum\the@dayscnt<#1\relax \repeat \setmydatenumber{@dayscnt}{\value{#2}}{\value{#3}}{\value{#4}}% \fi } % \end{macrocode} %\DescribeMacro{\mynextdate} %Berechnung des n��chsten Datums. Die Parameter \#1, \#2, \#3 sind die Namen von Z��hlern %in denen das Jahr, der Monat und der Tag steht und in die das neues Datum geschrieben werden soll. %Es wird getestet, ob das Datum g��ltig ist. Auf den 4.10.1582 folgt der 15.10.1582 %(siehe hierzu auch Abschnitt \ref{sonstiges}, Stichwort |\ifleapyear| und |\ifvaliddate|). %Vielen Dank an David und Heiko f��r die Anregungen zu diesem Makro % \begin{macrocode} \def\mynextdate#1#2#3{% \ifvaliddate{\value{#1}}{\value{#2}}{\value{#3}}% \else \errmessage{\@errmessage}% \fi \addtocounter{#3}{1}% \ifleapyear{\value{#1}}% \@tempcnta=29 \else \@tempcnta=28 \fi \ifnum\value{#3}>% \ifcase\value{#2}\or31\or\@tempcnta\or31\or30\or31\or30% \or31\or31\or30\or31\or30\else31% \fi\relax \setcounter{#3}{1}% \addtocounter{#2}{1}% \ifnum\value{#2}>12 \setcounter{#2}{1}% \addtocounter{#1}{1}% \fi \fi \ifnum\value{#1}=1582 \ifnum\value{#2}=10 \ifnum\value{#3}=5 \setcounter{#3}{15}% \fi \fi \fi } % \end{macrocode} %\DescribeMacro{\myprevdate} %Das gleiche wie eben nur anders herum. % \begin{macrocode} \def\myprevdate#1#2#3{% \ifvaliddate{\value{#1}}{\value{#2}}{\value{#3}}% \else \errmessage{\@errmessage}% \fi \addtocounter{#3}{-1}% \ifleapyear{\value{#1}}% \@tempcnta=29 \else \@tempcnta=28 \fi \ifnum\value{#3}=0 \addtocounter{#2}{-1}% \ifnum\value{#2}=0 \addtocounter{#1}{-1}% \setcounter{#2}{12}% \fi \setcounter{#3}{% \ifcase\value{#2}\or 31\or\the\@tempcnta\or 31\or 30\or 31\or 30 \or 31\or 31\or 30\or 31\or 30\else 31 \fi }% \fi \ifnum\value{#1}=1582 \ifnum\value{#2}=10 \ifnum\value{#3}=14 \setcounter{#3}{4}% \fi \fi \fi } % \end{macrocode} %\subsection{F��r den Anwender\label{defcounter}} % Es werden 5 Z��hler definiert, damit man das nicht jedesmal selbst machen mu��. % \begin{macrocode} \newcounter{datenumber} \newcounter{dateyear} \newcounter{datemonth} \newcounter{dateday} \newcounter{datedayname} % \end{macrocode} %Dann kommen die gleichen Makros wie eben, nur das diese mit den definierten Z��hlern arbeiten. %Au��erdem werden alle Z��hler aktualisiert und die Kommandos |\datedayname| und |\datemonthname| %neu definiert (siehe Abschnitt \ref{month} und \ref{dayname}). %\DescribeMacro{\setdatenumber} %Parameter \#1, \#2, \#3: Jahr, Monat und Tag % \begin{macrocode} \def\setdatenumber#1#2#3{% \setmydatenumber{datenumber}{#1}{#2}{#3}% \setcounter{dateyear}{#1}% \setcounter{datemonth}{#2}% \setcounter{dateday}{#3}% \setdaynamebynumber{\thedatenumber}% \setmonthname{\thedatemonth}% } % \end{macrocode} %\DescribeMacro{\setdatebynumber} %Parameter: Nummer des Tages % \begin{macrocode} \def\setdatebynumber#1{% \setmydatebynumber{#1}{dateyear}{datemonth}{dateday}% \setcounter{datenumber}{#1}% \setdaynamebynumber{\thedatenumber}% \setmonthname{\thedatemonth}% } % \end{macrocode} %\DescribeMacro{\nextdate} % \begin{macrocode} \def\nextdate{% \mynextdate{dateyear}{datemonth}{dateday}% \setdate{\thedateyear}{\thedatemonth}{\thedateday}% } % \end{macrocode} %\DescribeMacro{\prevdate} % \begin{macrocode} \def\prevdate{% \myprevdate{dateyear}{datemonth}{dateday}% \setdate{\thedateyear}{\thedatemonth}{\thedateday}% } % \end{macrocode} % Jetzt noch ein paar Makros, die das Leben einfacher machen. %\DescribeMacro{\setdate} %F��r intuitivere Schreibweise % \begin{macrocode} \def\setdate#1#2#3{%#1 year, #2 month, #3 day \setdatenumber{#1}{#2}{#3}% } % \end{macrocode} %\DescribeMacro{\setdatetoday} %Setzt alles auf Heute % \begin{macrocode} \def\setdatetoday{% \setdatenumber{\the\year}{\the\month}{\the\day}% } % \end{macrocode} %\subsection{Monat\label{month}} %\DescribeMacro{\setmonthname} %Definiert |\datemonthname| entsprechend des ��bergebenen Wertes (1--12, Januar--Dezember). %Wird von den Makros in Abschnitt \ref{defcounter} aufgerufen. %Das Makro |\@monthname| wird in den |.ldf|-Dateien definiert. % \begin{macrocode} \def\setmonthname#1{% \def\datemonthname{\@monthname{#1}}% } % \end{macrocode} %\subsection{Wochentag\label{dayname}} %\DescribeMacro{\setdayname} %Definiert |\datedayname| entsprechend des ��bergebenen Wertes (1--7, Montag--Sonntag). %Das Makro |\@dayname| wird in den |.ldf|-Dateien definiert. % \begin{macrocode} \def\setdayname#1{% \def\datedayname{\@dayname{#1}}% } % \end{macrocode} %\DescribeMacro{\setdaynamebynumber} %Berechnung des Wochentages aus der Nummer des Tages und Aktualisierung %von |\datedayname|. Funktioniert, wenn %|startyear| auf 1800, 1900 oder 2000 gesetzt ist oder aus Zufall. %Wird von den Makros in Abschnitt \ref{defcounter} aufgerufen. % \begin{macrocode} \def\setdaynamebynumber#1{% \@tempcnta=#1\relax \ifnum\the@startyear=1800\advance \@tempcnta by 1\fi \ifnum\the@startyear=1900\advance \@tempcnta by 6\fi \ifnum\the@startyear=2000\advance \@tempcnta by 4\fi \@modulo{\the\@tempcnta}{7}% \setcounter{datedayname}{\the\@den}% \addtocounter{datedayname}{1}% \setdayname{\thedatedayname}% } % \end{macrocode} %\subsection{Sonstiges\label{sonstiges}} %\DescribeMacro{\datedate} %Gibt das Datum aus, das in den Standardz��hlern steht (siehe Abschnitt\ref{defcounter}). %Das Makro |\@datedate| wird in den |.ldf|-Dateien definiert. % \begin{macrocode} \def\datedate{\@datedate}% % \end{macrocode} %\subsection{Sonstiges\label{sonstiges}} %\DescribeMacro{\dateselectlanguage} %Umschalten der Sprache. Das Makro |\@datelanguage#1| wird in den |.ldf|-Dateien definiert. % \begin{macrocode} \def\dateselectlanguage#1{% \csname @datelanguage#1\endcsname \setdayname{\thedatedayname}% \setmonthname{\thedatemonth}% } % \end{macrocode} %\DescribeMacro{\ifleapyear} %Schaltjahrtest (\#1 Jahr). Nach dem Julianischen Kalender ist jedes Jahr ein Schaltjahr, das ein ganzahliges %Vielfaches von 4 ist. Der Gregorianischer Kalender wurde 1582 eingef��hrt, aber nicht von %allen (Christen) ��bernommen. Dieses Paket ��bernimmt ihn ab 1582. D.h., ab 1582 ist ein Jahr, da�� %ein ganzzahlige Vielfaches von 100 ist nur dann ein Schaltjahr, wenn es auch %ein ganzzahlige Vielfaches von 400 ist. % \begin{macrocode} \def\ifleapyear#1{%#1 year \ifnum#1>1500 \@modulo{#1}{100}% \ifnum\@den=0 \@modulo{#1}{400}% \else \@modulo{#1}{4}% \fi \else \@modulo{#1}{4}% \fi \ifnum\@den=0 } % \end{macrocode} %\DescribeMacro{\ifvaliddate} %Testet auf g��ltige Datum (\#1, \#2, \#3: Jahr, Monat, Tag). %Eine Fehlermeldung wird in |\@errmessage| geschrieben, wenn das Datum ung��ltig ist. %Im Jahr 1582 folgte nach der Gregorianischer Kalenderreform auf den 4.10 der 15.10. %Er hat uns also 10 Tage geklaut. % \begin{macrocode} \def\ifvaliddate#1#2#3{% \ifleapyear{#1}% \@tempcnta=29 \else \@tempcnta=28 \fi \gdef\@errmessage{}% \ifnum#1<1 \gdef\@errmessage{Package datenumber: % invalid date: year < 1, #1/#2/#3}% \fi% \ifnum#2<1 \gdef\@errmessage{Package datenumber: % invalid date: month < 1, #1/#2/#3}% \fi% \ifnum#2>12 \gdef\@errmessage{Package datenumber: % invalid date: month > 12, #1/#2/#3}% \fi% \ifnum#3<1 \gdef\@errmessage{Package datenumber: % invalid date: day < 1, #1/#2/#3}% \fi% \@tempcntb= \ifcase#2 31\or 31\or\the\@tempcnta\or 31\or 30\or 31\or 30 \or 31\or 31\or 30\or 31\or 30\else 31 \fi\relax \ifnum#3>\@tempcntb \gdef\@errmessage{Package datenumber: % invalid date: day > \the\@tempcntb, #1/#2/#3}% \fi% \ifnum#1=1582 \ifnum#2=10 \ifnum#3>4 \ifnum#3<15 \gdef\@errmessage{Package datenumber: % invalid date: #1/#2/#3}% \fi \fi \fi \fi \ifx\@errmessage\empty } % \end{macrocode} %\subsection{Interna} %\DescribeMacro{\@yearloop} %Berechnet die Anzahl der Tage vom Startjahr bis zum Jahr \#1. % \begin{macrocode} \def\@yearloop#1{% \@tempcnta=\the@startyear% \loop \ifleapyear{\@tempcnta}% \addtocounter{@dayscnt}{366}% \else \addtocounter{@dayscnt}{365}% \fi \ifnum\@tempcnta=1582 \addtocounter{@dayscnt}{-10}% \fi \advance \@tempcnta by 1 \ifnum\@tempcnta=#1\else \repeat } % \end{macrocode} % Die brauchen wir gleich % \begin{macrocode} \newcount\@nom\newcount\@den % \end{macrocode} %\DescribeMacro{\@modulo} %Berechnet \#1 modulo \#2 und speichert das Ergebnis in |\@den| %Vielen Dank an Christian f��r dieses Makro und an Heiko f��r die %Verbesserungen % \begin{macrocode} \def\@modulo#1#2{% \@nom=#1\relax \@den=#2\relax \divide\@nom by \@den% \multiply\@nom by \@den% \@den=#1% \advance\@den by -\@nom% } % \end{macrocode} %\subsection{Zum Schlu��} %Zum Schlu�� setzen wir noch das Startjahr, was gleichzeitig %alle Z��hler auf das heutige Datum setzt. % \begin{macrocode} \setstartyear{1800} % \end{macrocode} %\iffalse %</datenumber> %<*english> \ProvidesFile{datenumberenglish.ldf} \def\@datelanguageenglish{% \def\@dayname{\@daynameenglish} \def\@monthname{\@monthnameenglish}% \def\@datedate{\@datedateenglish}% } \def\@monthnameenglish#1{% \ifcase#1\or January\or February\or March\or April\or May\or June\or July\or August\or September\or October\or November\or December\fi}% \def\@daynameenglish#1{% \ifcase#1\or Monday\or Tuesday\or Wednesday\or Thursday\or Friday\or Saturday\or Sunday\fi} \def\@datedateenglish{\thedateday \ifcase\thedateday \or st\or nd\or rd\or th\or th\or th\or th\or th\or th\or th\or th\or th\or th\or th\or th\or th\or th\or th\or th\or th\or st\or nd\or rd\or th\or th\or th\or th\or th\or th\or th\or st\fi~\datemonthname \space\thedateyear} \@datelanguageenglish %</english> %<*USenglish> \ProvidesFile{datenumberUSenglish.ldf} \def\@datelanguageUSenglish{% \def\@dayname{\@daynameUSenglish} \def\@monthname{\@monthnameUSenglish}% \def\@datedate{\@datedateUSenglish}% } \def\@monthnameUSenglish#1{% \ifcase#1\or January\or February\or March\or April\or May\or June\or July\or August\or September\or October\or November\or December\fi}% \def\@daynameUSenglish#1{% \ifcase#1\or Monday\or Tuesday\or Wednesday\or Thursday\or Friday\or Saturday\or Sunday\fi} \def\@datedateUSenglish{\datemonthname\space\thedateday, \thedateyear} \@datelanguageUSenglish %</USenglish> %<*french> \ProvidesFile{datenumberfrench.ldf} \def\@datelanguagefrench{% \def\@dayname{\@daynamefrench} \def\@monthname{\@monthnamefrench}% \def\@datedate{\@datedatefrench}% } \def\@monthnamefrench#1{% \ifcase#1\or janvier\or f\'evrier\or mars\or avril\or mai\or juin\or juillet\or ao\^ut\or septembre\or octobre\or novembre\or d\'ecembre\fi}% \def\@daynamefrench#1{% \ifcase#1\or Lundi\or Mardi\or Mercredi\or Jeudi\or Vendredi\or Samedi\or Dimanche\fi} \def\@datedatefrench{\thedateday \ifnum1=\thedateday \/$^{\rm er}$\fi \space \datemonthname\space\thedateyear} \@datelanguagefrench %</french> %<*spanish> \ProvidesFile{datenumberspanish.ldf} \def\@datelanguagespanish{% \def\@dayname{\@daynamespanish} \def\@monthname{\@monthnamespanish}% \def\@datedate{\@datedatespanish}% } \def\@monthnamespanish#1{% \ifcase#1\or enero\or febrero\or marzo\or abril\or mayo\or junio\or julio\or agosto\or septiembre\or octubre\or noviembre\or diciembre\fi}% \def\@daynamespanish#1{% \ifcase#1\or Lunes\or Martes\or Mi\'ercoles\or Jueves\or Viernes\or S\'abado\or Domingo\fi} \def\@datedatespanish{\thedateday~de \datemonthname\ de~\thedateyear} \@datelanguagespanish %</spanish> %<*german> \ProvidesFile{datenumbergerman.ldf} \def\@datelanguagegerman{% \def\@dayname{\@daynamegerman}% \def\@monthname{\@monthnamegerman}% \def\@datedate{\@datedategerman}% } \def\@monthnamegerman#1{% \ifcase#1\or Januar\or Februar\or M\"arz\or April\or Mai\or Juni\or Juli\or August\or September\or Oktober\or November\or Dezember\fi}% \def\@daynamegerman#1{% \ifcase#1\or Montag\or Dienstag\or Mittwoch\or Donnerstag\or Freitag\or Samstag\or Sonntag\fi} \def\@datedategerman{\thedateday.~\datemonthname\space\thedateyear} \@datelanguagegerman %</german> %<*dummy> \ProvidesFile{datenumberdummy.ldf} \makeatletter \def\@datelanguagedummy{% \def\@dayname{\@daynamedummy} \def\@monthname{\@monthnamedummy}% \def\@datedate{\@datedatedummy}% } \def\@monthnamedummy#1{% \ifcase#1\or January\or February\or March\or April\or May\or June\or July\or August\or September\or October\or November\or December\fi}% \def\@daynamedummy#1{% \ifcase#1\or Monday\or Tuesday\or Wednesday\or Thursday\or Friday\or Saturday\or Sunday\fi} \def\@datedatedummy{\datemonthname\space\thedateday, \thedateyear} \@datelanguagedummy \makeatother %</dummy> %\fi %\Finale \endinput %\def{\fileversion}{v0.03}\def{\filedate}{2022/01/27}