% \iffalse meta comment % File: isodateo.dtx Copyright (C) 2000 Harald Harders % \fi % % \iffalse % %<*package> \def\packagename{isodateo} \def\fileversion{1.06a} \def\filedate{2004/02/12} \def\docdate{2000/08/08} % %<*driver> \documentclass{ltxdoc} \IfFileExists{isodateo.sty}{\usepackage{isodateo} \let\isodateoSTYfound\active}{\GenericWarning{isodateo.dtx}{Package file isodateo.sty not found (Documentation will be messed up!^^J^^A Generate isodateo.sty by (La)TeXing isodateo.ins, process isodateo.dtx again)^^J}\stop} \usepackage{array} \isodate \title{The \texttt{isodateo} package\thanks{This file has version \fileversion\ last revised \printdateTeX{\filedate}, documentation dated \printdateTeX{\docdate}.}} \author{Harald Harders\\\texttt{h.harders@tu-bs.de}} \date{File Date \printdateTeX{\filedate}, Printed \today} \newlength{\tempdima}% \makeatletter \renewenvironment{table}[1][]{% \@float{table}[#1]% \centering% \setlength{\tempdima}{\abovecaptionskip}% \setlength{\abovecaptionskip}{\belowcaptionskip}% \setlength{\belowcaptionskip}{\tempdima}% }{% \end@float } \makeatother \EnableCrossrefs \CodelineIndex \DoNotIndex{\def,\edef,\let,\newcommand,\newenvironment,\newcounter,% \gdef,\@ifundefined,\@empty,\@firstoftwo,\@secondoftwo,\@nil,% \,,\number,\renewcommand,\setboolean,\whiledo} \DoNotIndex{\setcounter,\space} \CodelineNumbered \RecordChanges \CheckSum{272} \begin{document} \DocInput{isodateo.dtx} \end{document} % % \fi % % \changes{1.06a}{2004/02/12}{Path changed according to new CTAN % structure}% % \changes{1.05}{2000/06/15}{Throw out the commands \textbackslash % IfSubStringInString and \textbackslash IfCharInString and use the % package substr.sty instead} % \changes{1.05}{2000/06/15}{Change all internal command names to % start with \textbackslash iso@} % \changes{1.04}{2000/06/13}{Make the commands robust} % \changes{1.01}{2000/06/08}{Improve documentation} % \maketitle % % \begin{abstract} % \noindent This package provides commands to switch between different % date formats (standard, ISO, numeric, \LaTeX\ package). They are used by the % \verb|\today| command and by the \verb|\printdate| and % \verb|\printdateTeX| commands that print any date. % This package supports German (old and new rules, Austrian), US % English, and all languages that have the same date format as British % English does\footnote{E.g. Danish, French}. % % The idea for this package was taken from the akletter class. % \end{abstract} % % \tableofcontents % % \section{Commands} % % \subsection{Switching the date format} % % \DescribeMacro{\today}% % This package provides five commands to switch the output format of % the \verb|\today|, the \verb|\printdate|, and the % \verb|\printdateTeX| commands: % \medskip % % \DescribeMacro{\isodate}% % \DescribeMacro{\numdate}% % \DescribeMacro{\shortdate}% % \DescribeMacro{\TeXdate}% % \DescribeMacro{\origdate}% % \begin{tabular}{@{}ll} % \verb|\isodate|&date format described in ISO 8601 and DIN 5008\\ % &(yyyy-mm-dd)\\ % \verb|\numdate|&numeric date format with four digits of the year\\ % \verb|\shortdate|&short numeric date format with two digits of the % year\\ % \verb|\TeXdate|&date format used for version description of % packages\\ % &(yyyy/mm/dd)\\ % \verb|\origdate|&original \LaTeX\ format % \end{tabular} % \medskip % % The numeric and short numeric format change their behaviour % depending on the actual language: % % \noindent\begin{tabular}{@{}llll@{}} % German, nGerman&\verb|dd.\,mm.~yyyy|&resp.&\verb|dd.\,mm.\,yy|\\ % US English&\verb|mm/dd/yyyy|&resp.&\verb|mm/dd/yy|\\ % other languages&\verb|dd/mm/yyyy|&resp.&\verb|dd/mm/yy| % \end{tabular} % % So this package supports German (old and new rules, Austrian), US % English, and all languages that have the same date format as British % English does\footnote{E.g. Danish, French}. % \changes{1.05}{2000/06/29}{Note that every language that has the % same format as English is supported.} % Switching the language by using \textbackslash selectlanguage also % switches back to the original date format. % % \subsection{Printing any date} % % \DescribeMacro{\printdate}% % The command \verb|\printdate{#1}| prints any date in the actual % format. The argument may be a date in German, British English, or % ISO format, e.g.\\ % \begin{quote} % \verb|\printdate{24.12.2000}|\\ % \verb|\printdate{24/12/2000}|\\ % \verb|\printdate{2000-12-24}| % \end{quote} % % \DescribeMacro{\printdateTeX}% % The command \verb|\printdateTeX{#1}| prints any date in the actual % format. The argument must be in the \LaTeX\ format \verb|yyyy/mm/dd|, e.g.\\ % \begin{quote} % \verb|\printdateTeX{2000/12/24}| % \end{quote} % This command is useful for printing version information stored in a % macro. For example the version of this documentation is stored in % the macro \verb|\docdate| (``\docdate''). To print it with the actual % date format you can use the command \verb|\printdateTeX{\docdate}| % which leads to ``\printdateTeX{\docdate}''. % % \subsection{Changing the ISO format} % % \DescribeMacro{\isodash}% % I am not sure whether the ISO format should be yyyy-mm-dd or % yyyy--mm--dd. By default I use ``-'' as dash. You can change this % using the \verb|\isodash| command, e.g. % \begin{quote} % \verb|\printdate{24/12/2000}|\\ % \verb|\isodash{--}|\\ % \verb|\printdate{24/12/2000}| % \end{quote} % leads to ``2000-12-24 2000--12--24''. Or for example % \begin{quote} % \verb|\isodash{$\cdot$}|\\ % \verb|\printdate{24/12/2000}| % \end{quote} % leads to ``2000$\cdot$12$\cdot$24''. % % \section{Calling the package} % % The package is called using the \verb|\usepackage| command:\\ % \verb|\usepackage[|option\verb|]{isodate}|. % % The possible package options can be seen in table~\ref{tab:options}. % % % \begin{table}[h!tbp] % \centering % \caption{Package options} % \label{tab:options} % \begin{tabular}{ll}\hline % option&used date format\\ \hline % \verb|iso|&ISO date format\\ % \verb|num|&numeric date format with 4 digits of the year\\ % \verb|short|&numeric date format with 2 digits of the year\\ % \verb|TeX|&\LaTeX\ numeric date format (yyyy/mm/dd)\\ % \verb|orig|&normal \LaTeX\ date format (default)\\ % \hline % \end{tabular} % \end{table} % % \appendix % % \section{Licence} % % Copyright 2000 Harald Harders % % This program can be redistributed and/or modified under the terms % of the LaTeX Project Public License Distributed from CTAN % archives in directory macros/latex/base/lppl.txt; either % version 1 of the License, or any later version. % % \section{Known errors} % \begin{itemize} % \item The \verb|\printdate| and \verb|\printdateTeX| commands are not % very good in checking the argument for correct syntax. % \item For the language American: Using the package \verb|babel| only % the language name ``american'' works, using the package % \verb|*german| only ``USenglish'' works. % \end{itemize} % % \section{Planned features and changes} % % \begin{itemize} % \item Of course eliminate the errors. % \item Add other languages then german, ngerman, english, % USenglish. Please help me with this topic, I don't know the date % formats in other languages. % \end{itemize} % % \StopEventually{\PrintChanges \PrintIndex} % % % \section{The implementation} % \iffalse %<*package> % \fi % Heading of the package: % \begin{macrocode} \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{isodateo}[\filedate] \RequirePackage{ifthen} \RequirePackage{calc} \IfFileExists{substr.sty}{\RequirePackage{substr}% }{\PackageError{isodateo.sty}{Package file substr.sty not found} {This version of isodateo.sty needs the package substr.sty.^^J% You can download it from CTAN:/macros/latex/contrib/substr/^^J% E.g. one CTAN node is ftp.dante.de. Install substr.sty into your TeX tree.}} % \end{macrocode} % At the end of the preamble the package tests whether one of the % packages \verb|babel|, \verb|german|, or \verb|ngerman| is loaded. If % not it is assumed that American English is wanted (\LaTeX\ is an % American programme). The original date format is saved and the command % \verb|\iflanguage| is redefined to process the ``true part'' for % english, american, and USenglish options and otherwise the ``false part''. % \changes{1.03}{2000/06/13}{Insert code for handling not loaded % language packages} % \begin{macrocode} \AtBeginDocument{% \@ifpackageloaded{babel}{}{% \@ifpackageloaded{german}{}{% \@ifpackageloaded{ngerman}{}{% % \end{macrocode} % Here you can add new languages. Tell me what you have inserted in % order to enable me to actualize the package. % \begin{macrocode} \let\dateamerican\today% \setboolean{isodate@american}{true}% \def\iflanguage#1#2#3{\ifthenelse{% \equal{#1}{english}\or% \equal{#1}{american}\or% \equal{#1}{USenglish}% }{#2}{#3}}% }}}} % \end{macrocode} % % Declare the boolean variable isodate@american. This is necessary % because the command \textbackslash iflanguage cannot decide if the % language is English or American. % \changes{1.02}{2000/06/08}{Fix American language support by a hack} % \begin{macrocode} \newboolean{isodate@american}% % \changes{1.06}{2000/08/08}{Avoid using the hack with redefining % \selectlanguage} % Define the package options. % \begin{macrocode} \DeclareOption{iso}{\AtBeginDocument{\isodate}} \DeclareOption{num}{\AtBeginDocument{\numdate}} \DeclareOption{short}{\AtBeginDocument{\shortdate}} \DeclareOption{TeX}{\AtBeginDocument{\TeXdate}} \DeclareOption{orig}{\AtBeginDocument{\origdate}} \ExecuteOptions{orig} \ProcessOptions % \end{macrocode} % Print day or month filled with zero to a format with two digits. % \begin{macrocode} \def\dday{\ifthenelse{\number\day<10}{0}{}\number\day} \def\dmonth{\ifthenelse{\number\month<10}{0}{}\number\month} % \end{macrocode} % Print day and month in numerical format using the right format for % the present language. % \begin{macrocode} \DeclareRobustCommand*{\num@today}[1]{% \iflanguage{german}{\dday.\,\dmonth.#1}{% \iflanguage{austrian}{\dday.\,\dmonth.#1}{% \iflanguage{ngerman}{\dday.\,\dmonth.#1}{% \iflanguage{naustrian}{\dday.\,\dmonth.#1}{% % \end{macrocode} % Here you can add new languages. Tell me what you have inserted in % order to enable me to actualize the package. % \begin{macrocode} \iflanguage{english}{% \ifthenelse{\boolean{isodate@american}}{% \dmonth/\dday/}{\dday/\dmonth/}}{% \dday/\dmonth/}}}}}% } % \end{macrocode} % \begin{macro}{\numdate} % Switch to long numeric date format. % \begin{macrocode} \DeclareRobustCommand*{\numdate}{% % \end{macrocode} % Find out whether the language may be English or American. The % English original date format does not contain a komma while the % american does. % \changes{1.06}{2000/08/08}{Choose between English and American language} % \begin{macrocode} \origdate% \setboolean{isodate@american}{false}% \iflanguage{american}{\IfCharInString{,}{\today}{% \setboolean{isodate@american}{true}}{}}{}% % \end{macrocode} % Define the new \textbackslash today command. % \begin{macrocode} \gdef\today{% \num@today{~}% \number\year}} % \end{macrocode} % \end{macro} % \begin{macro}{\shortdate} % Switch to short numeric date format. % \begin{macrocode} \newcounter{yeartwo} \DeclareRobustCommand*{\shortdate}{% % \end{macrocode} % Find out whether the language may be English or American. The % English original date format does not contain a komma while the % american does. % \changes{1.06}{2000/08/08}{Choose between English and American language} % \begin{macrocode} \origdate% \setboolean{isodate@american}{false}% \iflanguage{american}{\IfCharInString{,}{\today}{% \setboolean{isodate@american}{true}}{}}{}% % \end{macrocode} % Define the new \textbackslash today command. % \begin{macrocode} \gdef\today{% \num@today{\,}% \setcounter{yeartwo}{\number\year}% \whiledo{\theyeartwo>99}{\setcounter{yeartwo}{\theyeartwo-100}}{}% \ifthenelse{\number\theyeartwo<10}{0}{}\theyeartwo}} % \end{macrocode} % \end{macro} % \begin{macro}{\isodate} % Switch to ISO date format. % \begin{macrocode} \DeclareRobustCommand*{\isodate}{% \gdef\today{% \number\year\iso@isodash% \ifthenelse{\number\month<10}{0}{}\number\month\iso@isodash% \ifthenelse{\number\day<10}{0}{}\number\day}} % \end{macrocode} % \end{macro} % Define the default ISO dash to ``-''. % \begin{macrocode} \def\iso@isodash{-}% % \end{macrocode} % \begin{macro}{\isodate} % Define the command \verb|\isodash| which changes the dash in the ISO % date format. % \begin{macrocode} \DeclareRobustCommand*{\isodash}[1]{\def\iso@isodash{#1}}% % \end{macrocode} % \end{macro} % \begin{macro}{\origdate} % Switch back to original date format. % \changes{1.06}{2000/08/08}{Use the command \textbackslash % date\emph{language} to switch back to the original date format} % \begin{macrocode} %\DeclareRobustCommand*{\origdate}{\gdef\today{\iso@origdate}} \DeclareRobustCommand*{\origdate}{\csname date\languagename\endcsname} % \end{macrocode} % \end{macro} % \begin{macro}{\TeXdate} % \changes{1.04}{2000/06/13}{Add \LaTeX\ date format yyyy/mm/dd} % Switch to the \TeX\ date format. % \begin{macrocode} \DeclareRobustCommand*{\TeXdate}{% \gdef\today{% \number\year/% \ifthenelse{\number\month<10}{0}{}\number\month/% \ifthenelse{\number\day<10}{0}{}\number\day}} % \end{macrocode} % \end{macro} % Print any date (internal command, syntax: % \verb|\iso@printdate{yyyy}{mm}{dd}|). % \begin{macrocode} \DeclareRobustCommand*{\iso@printdate}[3]{% \begingroup% \def\year{#1}% \def\month{#2}% \def\day{#3}% \today% \endgroup% } % \end{macrocode} % Define counters to count the numbers of special characters in the % arguments of the \verb|\printdate| and \verb|\printdateTeX| commands. % \begin{macrocode} \newcounter{iso@slash} \newcounter{iso@minus} \newcounter{iso@dot} % \end{macrocode} % \begin{macro}{\printdate} % Print any date in the actual date format. This command understands % the German, British, and ISO formats. % \begin{macrocode} \DeclareRobustCommand*{\printdate}[1]{% \expandafter\iso@expafterprintdate\expandafter{#1}}% % \end{macrocode} % \end{macro} % \begin{macro}{\iso@expafterprintdate} % The command \verb|\iso@expafterprintdate| needs an already expanded % argument. So the command \verb|\printdate| expands it and calls % \verb|\iso@expafterprintdate|. % % The error handling of this macro is very poor. It is just tested if % either a ``/'', ``-'', or ``.'' is included in the argument % twice. It is not tested if the argument consists of numbers, only. % \changes{1.05}{2000/06/15}{Count appearances of ``/'', ``.'', and % ``-'' and complain if not at least one of them is equal to 2} % \begin{macrocode} \DeclareRobustCommand*{\iso@expafterprintdate}[1]{% \SubStringsToCounter{iso@slash}{/}{#1}% \SubStringsToCounter{iso@minus}{-}{#1}% \SubStringsToCounter{iso@dot}{.}{#1}% \ifthenelse{\equal{\theiso@dot}{2}}{\printdatenumger{#1}}{% \ifthenelse{\equal{\theiso@minus}{2}}{\printdateiso{#1}}{% \ifthenelse{\equal{\theiso@slash}{2}}{\printdatenumeng{#1}}{% ????\iso@isodash ??\iso@isodash ??% \PackageError{isodateo}{unrecognized date format}{Use one of the following formats as macro argument:^^J% \space\space dd.mm.yyyy^^J% \space\space dd/mm/yyyy^^J% \space\space yyyy-mm-dd^^J% Don't use any spaces or commands like \protect\, or \protect~ inside the argument.}% }}}} % \end{macrocode} % \end{macro} % Analyze the argument containing a date in ISO format an print % it. This macros does not contain any error handling. % \begin{macrocode} \DeclareRobustCommand*{\printdateiso}[1]{% \expandafter\iso@printdateiso #1\@empty} \def\iso@printdateiso#1-#2-#3\@empty{\iso@printdate{#1}{#2}{#3}} % \end{macrocode} % Analyze the argument containing a date in German numeric format an % print it. This macros does not contain any error handling. % \begin{macrocode} \DeclareRobustCommand*{\printdatenumger}[1]{% \expandafter\iso@printdatenumger #1\@empty} \def\iso@printdatenumger#1.#2.#3\@empty{\iso@printdate{#3}{#2}{#1}} % \end{macrocode} % Analyze the argument containing a date in Britisch English numeric % format an print it. This macros does not contain any error handling. % \begin{macrocode} \DeclareRobustCommand*{\printdatenumeng}[1]{% \expandafter\iso@printdatenumeng #1\@empty} \def\iso@printdatenumeng#1/#2/#3\@empty{\iso@printdate{#3}{#2}{#1}} % \end{macrocode} % \changes{1.04}{2000/06/13}{Add \LaTeX\ date format yyyy/mm/dd} % \begin{macro}{\printdateTeX} % Analyze the argument containing a date in the LaTeX style yyyy/mm/dd % an print it. This format can not be handled automaticaly by % \verb|\printdate| because it could be mixed up with the English % format. The error handling of this routine is very poor. It just % checks whether the argument contains at least one ``/''. % \changes{1.05}{2000/06/15}{Count appearances of ``/'' and complain % if not equal to 2} % \begin{macrocode} \DeclareRobustCommand*{\printdateTeX}[1]{% \expandafter\iso@printdateTeX\expandafter{#1}} \DeclareRobustCommand*{\iso@printdateTeX}[1]{% \SubStringsToCounter{iso@slash}{/}{#1}% \ifthenelse{\equal{\theiso@slash}{2}}% {\expandafter\iso@@printdateTeX #1\@empty}{% ????\iso@isodash ??\iso@isodash ??% \PackageError{isodateo}{unrecognized date format}{Use the format yyyy/mm/dd.^^J% Don't use any spaces or commands like \protect\, or \protect~ inside the argument.}}% } \def\iso@@printdateTeX#1/#2/#3\@empty{\iso@printdate{#1}{#2}{#3}} % \end{macrocode} % \end{macro} % The end of the package. % \iffalse % % \fi % \Finale