%\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} % %<*driver> \documentclass{ltxdoc} \EnableCrossrefs \CodelineIndex \RecordChanges \usepackage{german} \parindent0pt \begin{document} \DocInput{datenumber.dtx} \PrintIndex \PrintChanges \end{document} % %<*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 % %<*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 % %<*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 % %<*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 % %<*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 % %<*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 % %<*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 % %\fi %\Finale \endinput %\def{\fileversion}{v0.03}\def{\filedate}{2022/01/27}