From e0c6872cf40896c7be36b11dcc744620f10adf1d Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Mon, 2 Sep 2019 13:46:59 +0900 Subject: Initial commit --- macros/latex/contrib/datetime2/CHANGES | 67 + macros/latex/contrib/datetime2/README | 18 + macros/latex/contrib/datetime2/datetime2.dtx | 9763 ++++++++++++++++++++ macros/latex/contrib/datetime2/datetime2.ins | 33 + macros/latex/contrib/datetime2/datetime2.pdf | Bin 0 -> 685060 bytes .../datetime2/samples/datetime2-sample-babel.pdf | Bin 0 -> 72937 bytes .../datetime2/samples/datetime2-sample-babel.tex | 84 + .../datetime2/samples/datetime2-sample-calc.pdf | Bin 0 -> 28801 bytes .../datetime2/samples/datetime2-sample-calc.tex | 76 + .../samples/datetime2-sample-filedate.pdf | Bin 0 -> 17006 bytes .../samples/datetime2-sample-filedate.tex | 23 + .../samples/datetime2-sample-hyperref.pdf | Bin 0 -> 62797 bytes .../samples/datetime2-sample-hyperref.tex | 81 + .../datetime2/samples/datetime2-sample-journal.pdf | Bin 0 -> 100517 bytes .../datetime2/samples/datetime2-sample-journal.tex | 127 + .../datetime2/samples/datetime2-sample-styles.pdf | Bin 0 -> 53846 bytes .../datetime2/samples/datetime2-sample-styles.tex | 102 + .../datetime2/samples/datetime2-sample-xe.pdf | Bin 0 -> 7343 bytes .../datetime2/samples/datetime2-sample-xe.tex | 20 + 19 files changed, 10394 insertions(+) create mode 100644 macros/latex/contrib/datetime2/CHANGES create mode 100644 macros/latex/contrib/datetime2/README create mode 100644 macros/latex/contrib/datetime2/datetime2.dtx create mode 100644 macros/latex/contrib/datetime2/datetime2.ins create mode 100644 macros/latex/contrib/datetime2/datetime2.pdf create mode 100644 macros/latex/contrib/datetime2/samples/datetime2-sample-babel.pdf create mode 100644 macros/latex/contrib/datetime2/samples/datetime2-sample-babel.tex create mode 100644 macros/latex/contrib/datetime2/samples/datetime2-sample-calc.pdf create mode 100644 macros/latex/contrib/datetime2/samples/datetime2-sample-calc.tex create mode 100644 macros/latex/contrib/datetime2/samples/datetime2-sample-filedate.pdf create mode 100644 macros/latex/contrib/datetime2/samples/datetime2-sample-filedate.tex create mode 100644 macros/latex/contrib/datetime2/samples/datetime2-sample-hyperref.pdf create mode 100644 macros/latex/contrib/datetime2/samples/datetime2-sample-hyperref.tex create mode 100644 macros/latex/contrib/datetime2/samples/datetime2-sample-journal.pdf create mode 100644 macros/latex/contrib/datetime2/samples/datetime2-sample-journal.tex create mode 100644 macros/latex/contrib/datetime2/samples/datetime2-sample-styles.pdf create mode 100644 macros/latex/contrib/datetime2/samples/datetime2-sample-styles.tex create mode 100644 macros/latex/contrib/datetime2/samples/datetime2-sample-xe.pdf create mode 100644 macros/latex/contrib/datetime2/samples/datetime2-sample-xe.tex (limited to 'macros/latex/contrib/datetime2') diff --git a/macros/latex/contrib/datetime2/CHANGES b/macros/latex/contrib/datetime2/CHANGES new file mode 100644 index 0000000000..3435b72e1f --- /dev/null +++ b/macros/latex/contrib/datetime2/CHANGES @@ -0,0 +1,67 @@ +1.5.3 (2018-07-20): + + * Bug fix: removed unwanted \relax inserted in negative time zones + for all base numeric styles. + +1.5.2 (2016-07-12): + + * Added \DTMifhasstyle, \DTMifhasdatestyle, \DTMifhastimestyle, + \DTMifhaszonestyle, \DTMsetregional, \DTMtryregional + and \DTMsavefrompdfdata + + * Added check for texosquery (allows seconds and time zone + to be supported with xelatex but requires shell escape) + +1.5.1 (2016-06-05) : + + * Added check for \pdffeedback + +1.5 (2016-06-04) : + + * Bug fix www.dickimaw-books.com/cgi-bin/bugtracker.cgi?action=view&key=109 + (added \dtm@pdfcreationdate) + +1.4 (2016-02-11) : + + * datetime2-calc.sty: + + - new command \DTMcomputedayofweekindex + + * datetime2.sty: + + - new commands \DTMtoday and \DTMToday. + \today and \Today are now \let to them, respectively. + + - added check for scrlttr2. + + * Added extra sample file datetime2-sample-journal.tex + +1.3 (2016-01-22) : + + * datetime2.sty: + + - new styles: ddmmyy, mmddyy + + - new command: \DTMusemodule + + - added starred version of \DTMlangsetup + + * datetime2-calc.sty: + + - new standalone language-sensitive month name, weekday name + and date ordinal commands + + * datetime2 manual: + + - added chapter on migrating from datetime.sty + +1.2 (2015-11-10) : + * Added \DTMrenewdatestyle, \DTMrenewtimestyle, + \DTMrenewzonestyle, \DTMrenewstyle, \DTMprovidedatestyle, + \DTMprovidetimestyle, \DTMprovidezonestyle and \DTMprovidestyle. + +1.1 (2015-09-15) : + * Fixed bug in conversion to +00:00 + +1.0 (2015-03-24) : + * Initial Release diff --git a/macros/latex/contrib/datetime2/README b/macros/latex/contrib/datetime2/README new file mode 100644 index 0000000000..5f393336d8 --- /dev/null +++ b/macros/latex/contrib/datetime2/README @@ -0,0 +1,18 @@ +LaTeX Package : datetime2 v1.5.3 + +Last Modified : 2018-07-20 + +Author : Nicola Talbot + +Provides commands for formatting dates, times and time zones. +Language and regional support is provided by independently +maintained and installed modules. + +The datetime2 package replaces the datetime package, which is now +obsolete. + +This material is subject to the LaTeX Project Public License. +See http://www.ctan.org/license/lppl1.3 for the details of that license. + +http://www.dickimaw-books.com/ + diff --git a/macros/latex/contrib/datetime2/datetime2.dtx b/macros/latex/contrib/datetime2/datetime2.dtx new file mode 100644 index 0000000000..8791e302ed --- /dev/null +++ b/macros/latex/contrib/datetime2/datetime2.dtx @@ -0,0 +1,9763 @@ +%\iffalse +% datetime2.dtx generated using makedtx version 1.2 (c) Nicola Talbot +% Command line args: +% -src "datetime2.sty\Z=>datetime2.sty" +% -src "datetime2-calc.sty\Z=>datetime2-calc.sty" +% -author "Nicola Talbot" +% -doc "datetime2-manual.tex" +% -section "chapter" +% datetime2 +% Created on 2018/7/20 12:36 +%\fi +%\iffalse +%<*package> +%% \CharacterTable +%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +%% Digits \0\1\2\3\4\5\6\7\8\9 +%% Exclamation \! Double quote \" Hash (number) \# +%% Dollar \$ Percent \% Ampersand \& +%% Acute accent \' Left paren \( Right paren \) +%% Asterisk \* Plus \+ Comma \, +%% Minus \- Point \. Solidus \/ +%% Colon \: Semicolon \; Less than \< +%% Equals \= Greater than \> Question mark \? +%% Commercial at \@ Left bracket \[ Backslash \\ +%% Right bracket \] Circumflex \^ Underscore \_ +%% Grave accent \` Left brace \{ Vertical bar \| +%% Right brace \} Tilde \~} +% +%\fi +% \iffalse +% Doc-Source file to use with LaTeX2e +% Copyright (C) 2018 Nicola Talbot, all rights reserved. +% \fi +% \iffalse +%<*driver> +\documentclass[widecs,report]{nlctdoc} + +\usepackage{metalogo} +\usepackage{graphicx} +\usepackage[utf8]{inputenc} +\usepackage[T1]{fontenc} +\usepackage[calc,english,en-GB,useregional=false]{datetime2} +\usepackage[colorlinks, + bookmarks, + hyperindex=false, + pdfauthor={Nicola L.C. Talbot}, + pdftitle={datetime2: date and time formats}]{hyperref} + +\CheckSum{2622} +\RecordChanges +\DisableCrossrefs + +\renewcommand*{\usage}[1]{\hyperpage{#1}} +\renewcommand*{\main}[1]{\hyperpage{#1}} +\IndexPrologue{\chapter*{\indexname}\markboth{\indexname}{\indexname}% +\addcontentsline{toc}{chapter}{Index}} +\setcounter{IndexColumns}{2} + +\newcommand{\style}[1]{\texttt{#1}% + \index{#1=\texttt{#1} style|main}% + \index{styles:>#1=\texttt{#1}|main}} + +\newcommand*{\module}[2][]{% + \ifblank{#1}% + {% + \href{http://ctan.org/pkg/datetime2-#2}{\texttt{#2}}% + }% + {% + \href{http://ctan.org/pkg/datetime2-#1}{\texttt{#2}}% + }% +} + +\doxitem{Option}{option}{options (definitions)} + +\DTMsavetimestamp{gmt}{2015-03-01T15:35:09+00:00} +\DTMsavetimestamp{bst}{2015-04-01T08:55:39+01:00} + +\newcommand*{\inpkg}[1]{\llap{\styfmt{#1}}} +\newcommand*{\oldcs}[1]{\cs{#1}% + \index{datetime commands:=\styfmt{datetime} package commands>#1=\cs{#1}|main}% +} + +\setlength\marginparwidth{70pt} + +\begin{document} +\DocInput{datetime2.dtx} +\end{document} +% +%\fi +% +%\MakeShortVerb{"} +% +%\title{datetime2 v1.5.3: +%date and time formats} +%\author{Nicola L. C. Talbot\\\url{http://www.dickimaw-books.com/}} +% +%\date{2018-07-20} +%\maketitle +% +%\begin{abstract} +%The \styfmt{datetime2} package replaces the \styfmt{datetime} +%package. Languages and regional variations are dealt with by the +%\styfmt{datetime2} language modules which are independently +%maintained and installed. Make sure that when you install +%\styfmt{datetime2} you also install the required \styfmt{datetime2} +%language modules. +%\end{abstract} +% +%\tableofcontents +% +%\chapter{Introduction} +%\label{sec:intro} +% +%I~wrote the original \styfmt{datetime} package back in the 1990s as +%an alternative to the \sty{ukdate} package, which had dropped out of +%some of the TeX distributions, so it was designed specifically for +%UK date formats.\footnote{Of course, \texttt{ukdatetime} would've +%been a better name, but the 8 dot 3 filename restriction was a concern back +%then.} However some users found the time formats useful +%and the ability to save dates for later use, so when \sty{babel} +%came along I~had a number of requests to make \styfmt{datetime} +%compatible with \sty{babel} so that the regional date formats were +%preserved but the other \styfmt{datetime} functions could be used. +%Then PDF\TeX\ came into existence and its \cs{pdfcreationdate} now +%provided a~way of obtaining the seconds and time zone, which can't +%be obtained from \TeX's \cs{time} primitive. Over time, the +%continual updates to the package has started to put a~strain on the +%original na\"ive \LaTeX\ code of my first package, as it's been +%stretched well past its intended design. +% +%The other problem with \styfmt{datetime} is that some of the commands +%aren't expandable but some users want to be able to use them in +%expandable contexts (such as, for example, PDF bookmarks or writing +%a date stamp to an external file) or they +%want to be able to upper case the first letter if the date comes at +%the start of a~sentence. This isn't an issue in English, as the +%weekday and month names are proper nouns and so automatically start +%with an upper case letter, regardless of where they appear in +%a~sentence. Users who don't know the history and original purpose of +%the \styfmt{datetime} package are puzzled as to why the defaults are +%all UK English or some styles were hard-coded, and some users are +%confused as to the ordering of the day, month and year parameters. +%In addition, some command names were incompatible with other +%date-related packages, but renaming those commands would break +%compatibility with older documents. +% +%In order to address all these issues, a~replacement package is +%necessary. Your old documents that use \styfmt{datetime} should +%still be able to compile, but for your new documents, you may prefer +%the improved \styfmt{datetime2} package instead. +% +%\chapter{Example Usage} +%\label{sec:examples} +% +%\begin{verbatim} +%\documentclass{article} +%\usepackage{datetime2} +%\begin{document} +%This PDF was created on \today. +%\end{document} +%\end{verbatim} +%In the above example, the date is displayed in the form: +%\begin{display} +%\DTMsetstyle{default}\DTMusedate{gmt} +%\end{display} +%This is the \style{default} style. +% +%\begin{verbatim} +%\documentclass{article} +%\usepackage{datetime2} +%\begin{document} +%This PDF was created on \DTMnow. +%\end{document} +%\end{verbatim} +%In the above example, the full date, time and time zone is displayed +%in the form +%\begin{display} +%\DTMsetstyle{default}\DTMuse{gmt} +%\end{display} +%or +%\begin{display} +%\DTMsetstyle{default}\DTMuse{bst} +%\end{display} +%\emph{unless} you are using \XeLaTeX\ in which case the seconds and +%time zone are omitted. (\XeLaTeX\ doesn't provide this information, +%but as from v1.5.2, you can load \sty{texosquery} before +%\sty{datetime2} and enable the shell escape to obtain this +%information.) +%Alternatively you can hide the seconds and zone +%using the package options \pkgopt[false]{showseconds} and +%\pkgopt[false]{showzone}. If you want UTC+0 to be displayed +%numerically instead of using a Z you can use the +%\pkgopt[false]{showisoZ} package option. +% +%\begin{verbatim} +%\documentclass[british]{article} +%\usepackage{babel} +%\usepackage{datetime2} +%\begin{document} +%This PDF was created on \DTMnow. +%\end{document} +%\end{verbatim} +%This has the same default numerical output as the previous example, +%but there are now two additional styles available: \style{en-GB} and +%\style{en-GB-numeric}. The \cs{datebritish} command provided by +%\sty{babel} is redefined to prevent \sty{babel} from overriding your +%preferred date style. The regional style can be enabled with the +%\pkgopt{useregional} option. +% +%\begin{verbatim} +%\documentclass[british]{article} +%\usepackage{babel} +%\usepackage[useregional]{datetime2} +%\begin{document} +%This PDF was created on \DTMnow. +%\end{document} +%\end{verbatim} +%The full date, time and zone are displayed in the form +%\begin{display} +%\DTMsetstyle{en-GB}\DTMuse{gmt} +%\end{display} +%or +%\begin{display} +%\DTMsetstyle{en-GB}\DTMuse{bst} +%\end{display} +% +%\begin{verbatim} +%\documentclass[british]{article} +%\usepackage{babel} +%\usepackage[useregional=numeric]{datetime2} +%\begin{document} +%This PDF was created on \DTMnow. +%\end{document} +%\end{verbatim} +%The full date, time and zone are displayed in the form +%\begin{display} +%\DTMsetstyle{en-GB-numeric}\DTMuse{gmt} +%\end{display} +%or +%\begin{display} +%\DTMsetstyle{en-GB-numeric}\DTMuse{bst} +%\end{display} +% +%\begin{verbatim} +%\documentclass[english]{article} +%\usepackage{babel} +%\usepackage[useregional=numeric]{datetime2} +%\begin{document} +%This PDF was created on \DTMnow. +%\end{document} +%\end{verbatim} +%The full date, time and zone are displayed in the form +%\begin{display} +%\DTMsetstyle{default}\DTMuse{gmt} +%\end{display} +%This is because no \emph{regional dialect} has been specified. The +%language name \texttt{english} is +%ambiguous, so the \style{default} style is used. +% +%\begin{verbatim} +%\documentclass[english]{article} +%\usepackage{babel} +%\usepackage[useregional]{datetime2} +%\begin{document} +%This PDF was created on \today. +%\end{document} +%\end{verbatim} +%The date is now displayed as +%\begin{display} +%\DTMsetstyle{english}\DTMusedate{gmt} +%\end{display} +%since that's \LaTeX's default behaviour for \cs{today}. For other +%languages, you should check the language module documentation to +%find out what happens when the region can't be determined from the +%language name. +% +%\begin{verbatim} +%\documentclass[british]{article} +%\usepackage{babel} +%\usepackage[useregional,showdow]{datetime2} +% +%\DTMlangsetup[en-GB]{abbr} +% +%\begin{document} +%This PDF was created on \today. +%\end{document} +%\end{verbatim} +%The date is now displayed as +%\begin{display} +%\DTMsetstyle{en-GB}\DTMlangsetup[en-GB]{abbr}\DTMsetup{showdow}% +%\DTMusedate{gmt} +%\end{display} +%The options used in \cs{DTMlangsetup} (such as \texttt{abbr}) are +%provided by the language modules and should be described in the +%module's documentation. Different languages may have different +%options so \texttt{abbr} may not be available for some of them. The +%\pkgopt{showdow} (show day of week) option is a package-wide option +%even though it's a language setting. (This is because the +%\styfmt{datetime2-calc} package is also needed if the day of the week +%should be displayed. As a package option, \pkgopt{showdow} can +%automatically load the required package.) +% +%\begin{important} +%You need to check the documentation for the relevant language module +%or package to find out which styles check +%the \pkgopt{showdow} setting as not all of them do. For example, the +%\module[english]{datetime2-english module} documentation indicates +%which of the English date styles support this setting. +%(The \styfmt{datetime} package had a similar limitation with its +%\pkgoptfmt{dayofweek} package option.) +%\end{important} +% +%If for some reason you can't load \sty{babel} before \styfmt{datetime2} +%and can only load it afterwards, then you need to explicitly load +%the module for each \sty{babel} dialect with: +%\begin{definition}[\DescribeMacro\DTMusemodule] +%\cs{DTMusemodule}\marg{language}\marg{module-name} +%\end{definition} +%where \meta{language} is the language (or dialect) name used with +%\sty{babel} (for example, \texttt{british}) and \meta{module-name} +%is the name of the \styfmt{datetime2} module (for example, \texttt{en-GB}). +% +%Example: +%\begin{verbatim} +%\documentclass{article} +% +%\usepackage{datetime2} +% +%\usepackage[british,irish]{babel} +% +%\DTMusemodule{british}{en-GB} +%\DTMusemodule{irish}{ga-IE} +% +%\end{verbatim} +%The \meta{language} argument should match the +%\cs{date\meta{language}} command provided by \sty{babel}. Similarly +%for \sty{polyglossia}: +%\begin{verbatim} +%\documentclass{article} +% +%\usepackage{datetime2} +% +%\usepackage{polyglossia} +%\setmainlanguage[variant=uk]{english} +%\setotherlanguage{irish} +% +%\DTMusemodule{english}{en-GB} +%\DTMusemodule{irish}{ga-IE} +% +%\end{verbatim} +%This ensures that not only is the required \styfmt{datetime2} +%regional module loaded but also the date switching mechanism +%\cs{date\meta{language}} is modified to prevent \sty{babel} or +%\sty{polyglossia} from interfering with \styfmt{datetime2}. +% +%Remember that you need to switch on the regional style, if required: +%\begin{verbatim} +%\DTMsetregional +%\end{verbatim} +%or through the \pkgopt{useregional} package option. +% +%\chapter{Displaying the Date and Time} +%\label{sec:display} +% +%A specific date can be displayed using: +%\begin{definition}[\DescribeMacro\DTMdisplaydate] +%\cs{DTMdisplaydate}\marg{year}\marg{month}\marg{day}\marg{dow} +%\end{definition} +%The format used to display the date is governed by the +%\termdef{display style}. +% +%The arguments are all \emph{numerical}: \meta{year} is the year, +%\meta{month} is the month number (starting from~1 for January), +%\meta{day} is the day of the month and \meta{dow} is the day of the +%week number starting from~0 for Monday. The day of week number may +%be \texttt{-1}, which indicates that the style should ignore it. +%(Some styles always ignore the day of week, regardless of its +%value.) This command is intended for use in expandable contexts +%(such as writing the date to another file or using the date in the +%bookmarks) and is used by \cs{today}. The date styles must ensure +%that any fragile content is protected. (This is why \meta{dow} +%isn't an optional argument otherwise the command wouldn't be +%expandable.) +% +%\begin{important} +%The \meta{dow} argument must always be an integer from $-1$ to $6$. +%It should not be left blank or set to any other value. In some +%cases using an incorrect value may not cause a problem, but in other +%cases it will. So it's best to get into the habit of always setting +%it correctly. +%\end{important} +% +%If you want the \meta{dow} value automatically calculated from the date, +%you can use \cs{DTMdate} (described below) instead with the +%\pkgopt{showdow} package option. Note that \cs{DTMdate} is +%\emph{robust}. If you require an expandable alternative, the +%\meta{dow} value must be calculated first. The simplest way to do +%this is to first save the date and then use it (see +%\sectionref{sec:store}). +% +%Examples (with the \pkgopt{showdow} package option set): +%\begin{itemize} +%\item Ignore day of week: +%\begin{verbatim} +%\section{\DTMdisplaydate{2016}{2}{10}{-1}} +%\end{verbatim} +%This overrides the \pkgopt{showdow} option in this specific +%instance. +% +%\item Save the date first and then use it: +%\begin{verbatim} +%\DTMsavedate{mydate}{2016-02-10} +%\section{\DTMusedate{mydate}} +%\end{verbatim} +%(See \sectionref{sec:store}.) +% +%\item Another expandable alternative (but less convenient and more +%prone to error since the date has to be repeated): +%\begin{verbatim} +%\DTMcomputedayofweekindex{2016-02-10}{\dowindex} +%\section{\DTMdisplaydate{2016}{2}{10}{\dowindex}} +%\end{verbatim} +%(See \sectionref{sec:calc}.) +% +%\item Robust version won't work in PDF bookmarks or case-changing +%contexts (such as page headers): +%\begin{verbatim} +%\section{\DTMdate{2016-02-10}} +%\end{verbatim} +%Note that if there is a table of contents, this will mean that the +%day of week index has to be calculated \emph{twice}. Once in the +%table of contents and once in the actual section title. If the +%section title is also used in the page header, then the day of week +%index will additionally be calculated on every page that has this +%section title in the header. +%\end{itemize} +%(See the accompanying \texttt{datetime2-sample-journal.tex} sample +%file for more examples of using dates in section titles.) +% +%Some styles may start the date with a word (such as the day of the +%week name or the month name). In English, proper nouns are +%capitalised regardless of where they appear in a~sentence but some +%languages use lower case month or day of week names. In this event, +%if the initial letter needs to be capitalised then you can use: +%\begin{definition}[\DescribeMacro\DTMDisplaydate] +%\cs{DTMDisplaydate}\marg{year}\marg{month}\marg{day}\marg{dow} +%\end{definition} +%which is analogous to \cs{DTMdisplaydate}. Styles that are +%unaffected by this issue (for example, numerical or English dates) +%set \cs{DTMDisplaydate} to just \cs{DTMdisplaydate}. As with +%\cs{DTMdisplaydate} the style needs to ensure that any fragile +%content is protected in the event that \cs{DTMDisplaydate} is used +%in an expandable context. (Note that for this reason, I~don't +%recommend the use of the commands provided by the \sty{mfirstuc} +%package as they're not expandable.) +% +%If you want the \meta{dow} value automatically calculated from the date, +%you can use \cs{DTMDate} (described below) instead with the +%\pkgopt{showdow} package option. +% +%The current date is displayed using +%\begin{definition}[\DescribeMacro\today] +%\cs{today} +%\end{definition} +%This uses \cs{DTMdisplaydate} to format the date so it will match +%the currently selected date style. There's also a first letter +%upper case version that uses \cs{DTMDisplaydate}: +%\begin{definition}[\DescribeMacro\Today] +%\cs{Today} +%\end{definition} +% +%Since there are other classes and packages that redefine \cs{today}, +%as from version 1.4, the \styfmt{datetime2} package provides +%\begin{definition}[\DescribeMacro\DTMtoday] +%\cs{DTMtoday} +%\end{definition} +%and +%\begin{definition}[\DescribeMacro\DTMToday] +%\cs{DTMToday} +%\end{definition} +%The package now assigns \cs{today} and \cs{Today} to \cs{DTMtoday} +%and \cs{DTMToday}, respectively. If your document loads another +%package or class that modifies \cs{today} at the beginning of the +%document, you can switch it back to \styfmt{datetime2}'s definition +%using +%\begin{verbatim} +%\let\today\DTMtoday +%\end{verbatim} +%after the start of the document or use the \cs{AtBeginDocument} +%hook: +%\begin{verbatim} +%\AtBeginDocument{\let\today\DTMtoday} +%\end{verbatim} +% +%\begin{important} +%If you use \sty{babel} or \sty{polyglossia} you must make sure +%you have the relevant \styfmt{datetime2} language modules installed. +%(See \sectionref{sec:lang}.) You also need to make sure that +%\styfmt{datetime2} is loaded \emph{after} +%\sty{babel}\slash\sty{polyglossia} otherwise \cs{today} will be +%redefined so that it no longer uses \cs{DTMdisplaydate}. +%\end{important} +% +%As mentioned above, \emph{some styles} allow the day of the week to be +%displayed. This requires the \styfmt{datetime2-calc} package which will +%automatically be loaded if you set \pkgopt{showdow} in the +%\styfmt{datetime2} package option list or if you set +%\pkgopt{showdow} in \ics{DTMsetup} \emph{in the preamble}. The +%package option \pkgopt{calc} will also load \styfmt{datetime2-calc} or +%you can load it explicitly using \cs{usepackage} after +%\styfmt{datetime2} has been loaded. (You may use \pkgopt[true]{showdow} in +%the \env{document} environment if the \styfmt{datetime2-calc} +%package has been loaded in the preamble either explicitly or through +%the \pkgopt{calc} option.) +% +%When \styfmt{datetime2-calc} is loaded, it computes the current day of +%the week (using commands provided by the \sty{pgfcalendar} package) +%which can then be used by \cs{today} or \cs{Today}. If +%\styfmt{datetime2-calc} isn't loaded then neither \cs{today} nor +%\cs{Today} will display the day of the week, regardless of the +%current style. +% +%If you would like a more convenient syntax and don't care about +%expansion, there is also a~robust \emph{non-expandable} command that +%can be used to display a~particular date: +%\begin{definition}[\DescribeMacro\DTMdate] +%\cs{DTMdate}\marg{date} +%\end{definition} +%As before there's also a capitalised version: +%\begin{definition}[\DescribeMacro\DTMDate] +%\cs{DTMDate}\marg{date} +%\end{definition} +%In these cases the date should be provided as +%\meta{YYYY}\texttt{-}\meta{MM}\texttt{-}\meta{DD} in the argument +%\meta{date}. For example: +%\begin{verbatim} +%\DTMdate{2015-03-23} +%\end{verbatim} +% +%Note that hyphens must always be used, regardless of +%the separator options. Take care that the category code of the +%hyphen hasn't changed when you use this syntax. +% +%\begin{important} +%The year \meta{YYYY} can't be negative\footnotemark\ in \cs{DTMdate} or +%\cs{DTMDate}. Use \cs{DTMdisplaydate} or +%\cs{DTMDisplaydate} instead. +%\end{important}\footnotetext{Well, actually it can if you put it in braces +%and don't use \styfmt{datetime2-calc}.} +% +%These commands internally use \cs{DTMdisplaydate} and +%\cs{DTMDisplaydate}, respectively. If the \styfmt{datetime2-calc} +%package has been loaded, the day of the week will be computed, +%otherwise the day of the week will be set to \texttt{-1}. Another +%benefit of the \styfmt{datetime2-calc} package is that it allows +%additional formats permitted by the \sty{pgfcalendar} package: +%\begin{itemize} +%\item \meta{YYYY}\texttt{-}\meta{MM}\texttt{-last} (the last day of +%the given month). +% +%\item +%\meta{YYYY}\texttt{-}\meta{MM}\texttt{-}\meta{DD}\texttt{+-}\meta{n} +%(\meta{n} days before the given date). +% +%\item +%\meta{YYYY}\texttt{-}\meta{MM}\texttt{-}\meta{DD}\texttt{+}\meta{n} +%(\meta{n} days after the given date). +% +%\item \meta{YYYY}\texttt{-}\meta{MM}\texttt{-last+-}\meta{n} +%(\meta{n} days before the last day of +%the given month). +% +%\item \meta{YYYY}\texttt{-}\meta{MM}\texttt{-last+}\meta{n} +%(\meta{n} days after the last day of +%the given month). +% +%\end{itemize} +%See the \sty{pgfcalendar} package for further details. +% +%If you want to be able to use a date in an expandable context that +%can perform these calculations, consider first saving the date using +%one of the commands described in \sectionref{sec:store} and then use +%one of the expandable commands such as \cs{DTMuse} to display the +%date. +% +%An error or unexpected results may occur if you try using one of +%these extended formats without loading the \styfmt{datetime2-calc} +%package. An example that only works with \styfmt{datetime2-calc}: +%\begin{verbatim} +%\DTMdate{2015-03-last} +%\end{verbatim} +%An example that works with or without \styfmt{datetime2-calc}: +%\begin{verbatim} +%\DTMdate{2015-03-31} +%\end{verbatim} +%In this second case, you'll only notice a difference in the output +%if the style should show the day of the week. +% +%The style of the date is the same as for \cs{DTMdisplaydate} and +%\cs{DTMDisplaydate} (which \cs{DTMdate} and \cs{DTMDate} internally +%use, as mentioned above). +% +%A time can be displayed using +%\begin{definition}[\DescribeMacro\DTMdisplaytime] +%\cs{DTMdisplaytime}\marg{hour}\marg{minute}\marg{sec} +%\end{definition} +%where the arguments are all numerical (using 24 hours). The +%\termdef{time style} currently in effect determines how the time is formatted. +%The command is designed to be used in an expandable context so the +%styles should take care to protect any fragile commands. +% +%Note that this command doesn't display the time zone. To display the +%time zone, you need to use +%\begin{definition}[\DescribeMacro\DTMdisplayzone] +%\cs{DTMdisplayzone}\marg{TZh}\marg{TZm} +%\end{definition} +%where \meta{TZh} is the hour offset and \meta{TZm} is the minute +%offset. The display is governed by the \termdef{zone style}. +%Again, the style should protect any fragile commands in case this is +%used in an expandable context. +% +%The current time (as set at the start of the document build) +%can be displayed using +%\begin{definition}[\DescribeMacro\DTMcurrenttime] +%\cs{DTMcurrenttime} +%\end{definition} +%This internally just uses \cs{DTMdisplaytime} and so is designed for +%use in an expandable context. +% +%The current zone can be displayed using +%\begin{definition}[\DescribeMacro\DTMcurrentzone] +%\cs{DTMcurrentzone} +%\end{definition} +%This internally just uses \cs{DTMdisplayzone} and so is designed for +%use in an expandable context. +% +%\begin{important} +%If the PDF\TeX\ primitive \ics{pdfcreationdate} is defined, the +%current time information is obtained from that, which includes the +%seconds and time zone. Lua\TeX\ also defines this command (now +%replaced with \cs{pdffeedback}\verb*| creationdate|) but +%\XeTeX\ doesn't, and in that case the only way to determine the +%current time is from \TeX's \ics{time} primitive which only contains +%the number of minutes since midnight, which means that the seconds +%and time zone are unavailable. Therefore if \XeTeX\ is used, the +%\pkgopt{showseconds} and \pkgopt{showzone} options are automatically +%switched off. +% +%New to v1.5.2: if \sty{texosquery} is loaded before +%\styfmt{datetime2} and the shell escape is enabled, then +%if \cs{pdfcreationdate} and \cs{pdffeedback} are undefined, +%the information will be obtained through \ics{TeXOSQueryNow}. +%See the \sty{texosquery} documentation for further information +%about this command. +%\end{important} +% +%There is also a~non-expandable robust command to display the time: +%\begin{definition}[\DescribeMacro\DTMtime] +%\cs{DTMtime}\marg{tm} +%\end{definition} +%where \meta{tm} must be in the 24 hour format +%\meta{hh}\texttt{:}\meta{mm}\texttt{:}\meta{ss} +%(colon-separated numerical arguments). Take care if you use \sty{babel} +%with a~language setting that makes the colon character active. You +%will have to switch off the shorthands in order to use this command +%correctly. +% +%The full date, time and zone (if available) can be displayed using +%\begin{definition}[\DescribeMacro\DTMdisplay] +%\cs{DTMdisplay}\marg{year}\marg{month}\marg{day}\marg{dow}\marg{hh}\marg{mm}\marg{ss}\marg{TZh}\marg{TZm} +%\end{definition} +%The arguments are all numerical. The way the information is +%displayed in the document is governed by the \termdef{full style} +%(or \termdef{date-time style}). +%Typically the full style will redefine this command to use +%\cs{DTMdisplaydate}, \cs{DTMdisplaytime} and (optionally) +%\cs{DTMdisplayzone}. The \pkgopt{showzone} setting may govern whether +%or not to display the time zone (although a~style may ignore this +%setting). The separators between the date and time and between the time +%and zone are governed by the style. +% +%There is also an analogous version if capitalisation is required: +%\begin{definition}[\DescribeMacro\DTMDisplay] +%\cs{DTMDisplay}\marg{year}\marg{month}\marg{day}\marg{dow}\marg{hh}\marg{mm}\marg{ss}\marg{TZh}\marg{TZm} +%\end{definition} +%Some styles may simply make this equivalent to \cs{DTMdisplay}. +%Other styles may use a~similar format to \cs{DTMdisplay} but replace +%\cs{DTMdisplaydate} with \cs{DTMDisplaydate}. +% +%The full current date, time and (optionally) zone can be displayed +%using: +%\begin{definition}[\DescribeMacro\DTMnow] +%\cs{DTMnow} +%\end{definition} +%which uses \cs{DTMdisplay} or +%\begin{definition}[\DescribeMacro\DTMNow] +%\cs{DTMNow} +%\end{definition} +%which uses \cs{DTMDisplay}. +% +%\chapter{Storing and Using Dates and Times} +%\label{sec:store} +% +%Date, time and zone information can be saved for later use. Note +%that the information is always saved numerically. The style is only +%applied when the information is later used. The commands that save +%the information are robust and not expandable. The commands that use the +%data are typically expandable although there may be some exceptions. +%Take care that the colon (\texttt{:}) and hyphen (\texttt{-}) +%characters haven't had their normal category code changed. (For +%example, through \sty{babel}'s shortcuts.) In the commands below, +%the \meta{name} (no active characters) is a name that uniquely +%identifies the information. +% +%Dates are saved using +%\begin{definition}[\DescribeMacro\DTMsavedate] +%\cs{DTMsavedate}\marg{name}\marg{date} +%\end{definition} +%where \meta{date} is in the same format as for \cs{DTMdate}. +%As with \cs{DTMdate} (and \cs{DTMDate}) the format can be extended +%with the \styfmt{datetime2-calc} package. If you want to access the day +%of week, you must make sure that \styfmt{datetime2-calc} has been +%loaded \emph{before you save the date}. (Remember that the \pkgopt{calc} +%and \pkgopt{showdow} package options will automatically load +%\styfmt{datetime2-calc}.) If \styfmt{datetime2-calc} has been loaded, the +%day of week number will be calculated and saved. Whether or not it +%is displayed in the document when the date is later used depends on +%the settings when the date is displayed not when it's saved. +% +%This command will override any previously defined date saved with +%this \meta{name}. If a time or zone hasn't been defined with this +%\meta{name}, the time and zone elements will all be set to 0 +%otherwise they will remain unchanged. +% +%Note that you can't have a negative year in \meta{date}. There's an +%alternative command you can use instead that doesn't try parsing +%\meta{date}: +%\begin{definition}[\DescribeMacro\DTMsavenoparsedate] +%\cs{DTMsavenoparsedate}\marg{name}\marg{YYYY}\marg{MM}\marg{DD}\marg{dow} +%\end{definition} +%The day of week \meta{dow} may be \texttt{-1} if unknown. This +%command doesn't calculate the day of week, even if +%\styfmt{datetime2-calc} has been loaded. +% +%Times are saved using +%\begin{definition}[\DescribeMacro\DTMsavetime] +%\cs{DTMsavetime}\marg{name}\marg{time} +%\end{definition} +%where the \meta{time} is in the same format as for \cs{DTMtime}. +% +%This command will override any previously defined time saved with +%this \meta{name}. If a date or +%zone hasn't been defined with this \meta{name}, the date and zone +%elements will all be set to 0 (or \texttt{-1} for the day of week) otherwise they will remain unchanged. +% +%Times and zone are saved using +%\begin{definition}[\DescribeMacro\DTMsavetimezn] +%\cs{DTMsavetimezn}\marg{name}\marg{time and zone} +%\end{definition} +%where the \meta{time and zone} is in the form +%\begin{display} +%\meta{hh}:\meta{mm}:\meta{ss} \meta{TZh}:\meta{TZm} +%\end{display} +%(Note the space between the seconds and the hour offset.) +% +%This command will override any previously defined time and zone +%saved with this \meta{name}. If a date hasn't been defined with this +%\meta{name}, the year, month and day will be set to zero and the day +%of the week to \texttt{-1} otherwise they will remain unchanged. +% +%All date, time and zone information can be saved at the same time +%using: +%\begin{definition}[\DescribeMacro\DTMsavetimestamp] +%\cs{DTMsavetimestamp}\marg{name}\marg{data} +%\end{definition} +%where \meta{data} is in the format: +%\begin{display} +%\meta{YYYY}-\meta{MM}-\meta{DD}T\meta{hh}:\meta{mm}:\meta{ss}\meta{zone} +%\end{display} +%The \meta{zone} may either be \texttt{Z} or in the form +%\meta{TZh}\texttt{:}\meta{TZm} (for example, \texttt{-03:00} +%or \texttt{-3:0}). This will override any date, time or zone data +%previously saved with this \meta{name}. +% +%Alternatively, if the date and time is in PDF form, that is +%\begin{display} +%\texttt{D:}\meta{YYYY}\meta{MM}\meta{DD}\meta{hh}\meta{mm}\meta{ss}\meta{zone} +%\end{display} +%where \meta{zone} is either \texttt{Z} or +%\meta{TZh}\texttt{'}\meta{TZm}\texttt{'} then you can use +%\begin{definition}[\DescribeMacro\DTMsavefrompdfdata] +%\cs{DTMsavefrompdfdata}\marg{name}\marg{PDF data} +%\end{definition} +%Note that the category code of the initial \texttt{D} is +%irrelevant (in fact, the initial \texttt{D} is actually +%ignored) but the other characters should have their usual +%category code (so take care if, say, \sty{babel} makes the colon +%an active character). The \meta{PDF data} argument is automatically +%expanded so may be a control sequence that contains the PDF data. +%(Not the case with \cs{DTMsavetimestamp}.) +% +%The current date and time can be saved using: +%\begin{definition}[\DescribeMacro\DTMsavenow] +%\cs{DTMsavenow}\marg{name} +%\end{definition} +% +%There is also a command that can be used to save the modification +%date of a file, but it's not available for some \TeX\ engines: +%\begin{definition}[\DescribeMacro\DTMsavefilemoddate] +%\cs{DTMsavefilemoddate}\marg{name}\marg{file name} +%\end{definition} +%where \meta{file name} is the name of the file (remember to use +%forward slashes \verb|/| for the directory divider). If you build +%your document using PDF\LaTeX, this command will use the PDF\TeX\ +%primitive \cs{pdffilemoddate}. If you use Lua\TeX\ this command will +%attempt to use \texttt{os.date} but it uses \texttt{\%z} for the +%time zone, which may not work on some operating systems. If you use +%\XeLaTeX\ this command will generate a warning and will assume a +%date of 0000-00-00T00:00:00Z unless (from v1.5.2) you have +%loaded \sty{texosquery} before \styfmt{datetime2} and you have the +%shell escape enabled, in which case \cs{DTMsavefilemoddate} will use +%\cs{TeXOSQueryFileDate} to obtain the information. See the +%\sty{texosquery} manual for further details about this command. +% +%The above commands are all localised to the current scope. If the +%data is required after the end of the scope, you can make the +%assignments global using: +%\begin{definition}[\DescribeMacro\DTMmakeglobal] +%\cs{DTMmakeglobal}\marg{name} +%\end{definition} +%For example: +%\begin{verbatim} +%\DTMsavenow{mydate}\DTMmakeglobal{mydate} +%\end{verbatim} +% +%A previously saved date can be displayed using the current style +%with +%\begin{definition}[\DescribeMacro\DTMusedate] +%\cs{DTMusedate}\marg{name} +%\end{definition} +%This just uses \cs{DTMdisplaydate}. An error will occur if +%\meta{name} hasn't been defined. Alternatively for the capitalised +%version: +%\begin{definition}[\DescribeMacro\DTMUsedate] +%\cs{DTMUsedate}\marg{name} +%\end{definition} +%which uses \cs{DTMDisplaydate} instead. +% +%A previously saved time can be displayed using the current style +%with +%\begin{definition}[\DescribeMacro\DTMusetime] +%\cs{DTMusetime}\marg{name} +%\end{definition} +%This just uses \cs{DTMdisplaytime}. An error will occur if +%\meta{name} hasn't been defined. +% +%A previously saved zone can be displayed using the current style +%with +%\begin{definition}[\DescribeMacro\DTMusezone] +%\cs{DTMusezone}\marg{name} +%\end{definition} +%This just uses \cs{DTMdisplayzone}. An error will occur if +%\meta{name} hasn't been defined. +% +%The entire date, time and zone can be displayed in the current style +%with +%\begin{definition}[\DescribeMacro\DTMuse] +%\cs{DTMuse}\marg{name} +%\end{definition} +%This uses \cs{DTMdisplay}. An error will occur if +%\meta{name} hasn't been defined. Alternatively, +%\begin{definition}[\DescribeMacro\DTMUse] +%\cs{DTMUse}\marg{name} +%\end{definition} +%will use \cs{DTMDisplay} instead. +% +%You can determine if a given \meta{name} has been defined +%using +%\begin{definition}[\DescribeMacro\DTMifsaveddate] +%\cs{DTMifsaveddate}\marg{name}\marg{true}\marg{false} +%\end{definition} +% +%The individual numerical elements can be fetched using one of the +%following commands. These don't check if the given data identified +%by \meta{name} has been defined and will expand to \cs{relax} if the +%name isn't recognised. +% +%\begin{definition}[\DescribeMacro\DTMfetchyear] +%\cs{DTMfetchyear}\marg{name} +%\end{definition} +%This expands to the year. +% +%\begin{definition}[\DescribeMacro\DTMfetchmonth] +%\cs{DTMfetchmonth}\marg{name} +%\end{definition} +%This expands to the month number. +% +%\begin{definition}[\DescribeMacro\DTMfetchday] +%\cs{DTMfetchday}\marg{name} +%\end{definition} +%This expands to the day of the month. +% +%\begin{definition}[\DescribeMacro\DTMfetchdow] +%\cs{DTMfetchdow}\marg{name} +%\end{definition} +%This expands to the day of the week number (\texttt{-1} if unknown). +% +%\begin{definition}[\DescribeMacro\DTMfetchhour] +%\cs{DTMfetchhour}\marg{name} +%\end{definition} +%This expands to the hour. +% +%\begin{definition}[\DescribeMacro\DTMfetchminute] +%\cs{DTMfetchminute}\marg{name} +%\end{definition} +%This expands to the minute. +% +%\begin{definition}[\DescribeMacro\DTMfetchsecond] +%\cs{DTMfetchsecond}\marg{name} +%\end{definition} +%This expands to the second. +% +%\begin{definition}[\DescribeMacro\DTMfetchTZhour] +%\cs{DTMfetchTZhour}\marg{name} +%\end{definition} +%This expands to the hour offset. +% +%\begin{definition}[\DescribeMacro\DTMfetchTZminute] +%\cs{DTMfetchTZminute}\marg{name} +%\end{definition} +%This expands to the minute offset. +% +%\chapter{Styles} +%\label{sec:styles} +% +%If you want to just change the \term{date style} use: +%\begin{definition}[\DescribeMacro\DTMsetdatestyle] +%\cs{DTMsetdatestyle}\marg{name} +%\end{definition} +%where \meta{name} identifies the style. For example: +%\begin{verbatim} +%\DTMsetdatestyle{iso} +%\end{verbatim} +%This will just change the date style (\cs{DTMdisplaydate} and +%\cs{DTMDisplaydate}), not the time or zone styles. Note that +%\cs{DTMdisplay} typically uses \cs{DTMdisplaydate} so this will also +%change the date element of \cs{DTMdisplay}. +% +%If you want to just change the \term{time style} use: +%\begin{definition}[\DescribeMacro\DTMsettimestyle] +%\cs{DTMsettimestyle}\marg{name} +%\end{definition} +%where \meta{name} identifies the style. For example: +%\begin{verbatim} +%\DTMsettimestyle{iso} +%\end{verbatim} +%This will just change the time style (\cs{DTMdisplaytime}), not the +%date or zone styles. Note that \cs{DTMdisplay} typically uses +%\cs{DTMdisplaytime} so this will also change the time element of +%\cs{DTMdisplay}. +% +%If you want to just change the \term{zone style} use: +%\begin{definition}[\DescribeMacro\DTMsetzonestyle] +%\cs{DTMsetzonestyle}\marg{name} +%\end{definition} +%where \meta{name} identifies the style. For example: +%\begin{verbatim} +%\DTMsetzonestyle{iso} +%\end{verbatim} +%This will just change the zone style (\cs{DTMdisplayzone}), not the +%date or time styles. Note that \cs{DTMdisplay} typically uses +%\cs{DTMdisplayzone} so this will also change the zone element of +%\cs{DTMdisplay}. +% +%If you want to change the \term{full style} use: +%\begin{definition}[\DescribeMacro\DTMsetstyle] +%\cs{DTMsetstyle}\marg{name} +%\end{definition} +%where \meta{name} identifies the style. For example: +%\begin{verbatim} +%\DTMsetstyle{iso} +%\end{verbatim} +% +%Note that in this case this does more than simply +%\begin{verbatim} +%\DTMsetdatestyle{iso}\DTMsettimestyle{iso}\DTMsetzonestyle{iso} +%\end{verbatim} +%as it also changes \cs{DTMdisplay} and \cs{DTMDisplay}. +%If the style \meta{name} is only a \term{partial style}, a~warning +%will be issued for any partial styles that aren't defined for the +%given name as well as a warning for the undefined full style. +%An error will occur if there are neither partial nor full styles +%with the given \meta{name}. +% +%The predefined styles listed in \sectionref{sec:predefinedfull} are all +%\emph{full styles}. This means that they change the date, time, zone +%and full format, so any of them can be used in \cs{DTMsetdatestyle}, +%\cs{DTMsettimestyle}, \cs{DTMsetzonestyle} or \cs{DTMsetstyle}. +%However it's possible for a style to be only a \emph{partial style}, +%such as those described in \sectionref{sec:predefinedtime}. +% +%For example, if \texttt{foo} is a \term{date style} and +%a \term{time style} but isn't a \term{zone style} or +%a \term{full style} then you can use +%\begin{verbatim} +%\DTMsetdatestyle{foo} +%\end{verbatim} +%and +%\begin{verbatim} +%\DTMsettimestyle{foo} +%\end{verbatim} +%but you can't use \cs{DTMsetzonestyle}. You can use +%\begin{verbatim} +%\DTMsetstyle{foo} +%\end{verbatim} +%but this will now only be equivalent to +%\begin{verbatim} +%\DTMsetdatestyle{foo}\DTMsettimestyle{foo} +%\end{verbatim} +%and while \cs{DTMdisplay} and \cs{DTMDisplay} will typically use these date +%and time settings, the way that the date, time and zone are arranged +%will be governed by the full style setting that was already in +%effect before the date and time style changed. +% +%The style changes are all local and so are affected by the current +%scope. +% +%In addition to the predefined styles, there are also styles provided +%by regional modules. These may or may not be set depending on +%the setting of \pkgopt{useregional}. Those that are provided usually +%follow the naming scheme \meta{lang-name} or \meta{lang +%code}\texttt{-}\meta{county code}, where \meta{lang name} is the +%root language name (for example, \texttt{english}), \meta{lang code} +%is the ISO language code and \meta{country code} is the ISO country +%code (for example, \texttt{en-GB}). If a numeric style is provided, +%it's usually the name of the text style with \texttt{-numeric} +%appended (for example, \texttt{en-GB-numeric}). If you're not sure +%of the exact naming scheme you can use +%\begin{definition}[\DescribeMacro\DTMtryregional] +%\cs{DTMtryregional}\oarg{lang name}\marg{lang code}\marg{country +%code} +%\end{definition} +%This takes into account the \pkgopt{useregional} option, so will do +%nothing if \pkgopt[false]{useregional}. If the optional argument is +%omitted, the root language name will be determined from the supplied ISO +%language code if it's recognised. +% +%\begin{important} +%If there's no match, no change will be made. There will be no +%warnings or error messages. +%\end{important} +% +%For example: +%\begin{verbatim} +%\DTMsetup{useregional=numeric} +%\DTMtryregional{en}{GB} +%\end{verbatim} +%This will set the style \texttt{en-GB-numeric} (assuming the +%\texttt{en-GB} module has been loaded). +% +%In this example: +%\begin{verbatim} +%\DTMsetup{useregional} +%\DTMtryregional{nl}{BE} +%\end{verbatim} +%the style is set to \texttt{dutch} (assuming the \texttt{dutch} +%module has been loaded), since there's no style called +%\texttt{nl-BE}. +% +%If the ISO codes are stored in control sequences which may or may +%not be defined, you can use the starred version which expects +%commands for the last two arguments: +%\begin{definition}[\DescribeMacro\DTMtryregional*] +%\cs{DTMtryregional*}\oarg{lang name}\marg{lang code cs}\marg{country +%code cs} +%\end{definition} +% +%\section{Predefined Styles} +%\label{sec:predefinedstyles} +% +%The base \styfmt{datetime2} package provides a number of predefined +%numerical styles. \sectionref{sec:predefinedfull} lists the full styles, +%which can be used with \cs{DTMsetstyle}, \cs{DTMsetdatestyle}, +%\cs{DTMsettimestyle} and \cs{DTMsetzonestyle}. +%\sectionref{sec:predefinedtime} lists the predefined (partial) times +%styles, which can be used with \cs{DTMsettimestyle} and +%\cs{DTMsetstyle}. +% +%\subsection{Full Styles} +%\label{sec:predefinedfull} +% +%The following are predefined full styles that are provided by the +%base \styfmt{datetime2} package. Additional styles are available +%through the language modules (see \sectionref{sec:lang}). +% +%\begin{description} +%\item[\style{default}] The \style{default} style displays the date in the form +%\begin{display} +%\meta{YYYY}\meta{YMsep}\meta{MM}\meta{MDsep}\meta{DD} +%\end{display} +%where the month \meta{MM} and day of the month \meta{DD} numbers are +%formatted as two digits. The separators \meta{YMsep} and +%\meta{MDsep} default to a hyphen but can be changed using the +%options \pkgopt{yearmonthsep}, \pkgopt{monthdaysep} or +%\pkgopt{datesep} (either through the package options or using +%\ics{DTMsetup}). +% +%The time is displayed in the form: +%\begin{display} +%\meta{hh}\meta{HMsep}\meta{mm}\meta{MSsep}\meta{ss} +%\end{display} +%where the hour, month and seconds are formatted as two digits. The +%final \meta{MSsep}\meta{ss} is omitted if the option +%\pkgopt{showseconds} has been set to \texttt{false}. The separators +%\meta{HMsep} and \meta{MSsep} default to a~colon (\texttt{:}) but +%these may be changed using the options \pkgopt{hourminsep}, +%\pkgopt{minsecsep} or \pkgopt{datetimesep}. +% +%The zone is displayed in form +%\begin{display} +%\meta{TZh}\meta{HMsep}\meta{TZm} +%\end{display} +%or just \texttt{Z} if the option \pkgopt{showisoZ} is set to +%\texttt{true} and both \meta{TZh} and \meta{TZm} are zero. +%The separator \meta{HMsep} is the same as used for the time format. +%The final \meta{HMsep}\meta{TZm} is omitted if the option +%\pkgopt{showzoneminutes} is set to \texttt{false}. The hour offset +%\meta{TZh} is formatted as two digits proceeded by either \texttt{+} +%or \texttt{-} and the minute offset is formatted as two digits. +%Note that since one of the main purposes of this package is to +%provide expandable date commands that can be used to write +%information to external files, no attempt is made to convert the +%hyphen \texttt{-} (for negative offsets) into a minus sign. If you +%want it rendered correctly in your document, consider placing the +%time zone command in math mode and adjust the separators as +%necessary. +% +%The full style is in the form +%\begin{display} +%\meta{date}\meta{DTsep}\meta{time}\meta{TZsep}\meta{zone} +%\end{display} +%The \meta{date}\meta{DTsep} part is omitted if the option +%\pkgopt{showdate} is set to \texttt{false}, and +%the \meta{TZsep}\meta{zone} part is omitted if the option +%\pkgopt{showzone} is set to \texttt{false}. The separator between +%the date and time \meta{DTsep} defaults to \cs{space} but may be +%changed using the \pkgopt{datetimesep} option. The separator between +%the time and zone \meta{TZsep} defaults to nothing but may be +%changed using the \pkgopt{timezonesep} option. +% +%\item[\style{iso}] The \style{iso} style is like the \style{default} +%style but the separators can't be changed. The separators used in +%the date format are fixed as hyphens and the separators used in the +%time and zone formats are fixed as colons. In the full format, the separator between the +%date and time is fixed as \texttt{T} and there's no separator between the +%time and zone. The only options that can change the \style{iso} +%style are \pkgopt{showseconds}, \pkgopt{showdate}, \pkgopt{showzone}, +%\pkgopt{showzoneminutes} and \pkgopt{showisoZ}. +% +%\item[\style{yyyymd}] This is like the \style{default} style +%except that the month and date aren't forced into a two-digit +%format. +% +%\item[\style{ddmmyyyy}] This is like the \style{default} style +%except that the date is formatted in the reverse order +%\begin{display} +%\meta{DD}\meta{MDsep}\meta{MM}\meta{YMsep}\meta{YYYY} +%\end{display} +%The day and month are displayed as two-digits and the separators are +%as for the \style{default} style. The options that modify the +%\style{default} style similarly modify this style. +% +%\item[\style{dmyyyy}] This is like the \style{ddmmyyyy} style except +%that it doesn't force the day and month into a~two-digit format. +%The options that modify the +%\style{default} style similarly modify this style. +% +%\item[\style{dmyy}] This is like the \style{dmyy} style except +%that it only displays the final two digits of the year. +%The options that modify the +%\style{default} style similarly modify this style. +% +%\item[\style{ddmmyy}] This is like the \style{default} style +%except that the date is formatted in the reverse order +%\begin{display} +%\meta{DD}\meta{MDsep}\meta{MM}\meta{YMsep}\meta{YY} +%\end{display} +%The day, month and year are displayed as two-digits and the separators are +%as for the \style{default} style. The options that modify the +%\style{default} style similarly modify this style. +% +%\item[\style{mmddyyyy}] This is like the \style{ddmmyyyy} style +%except the day and month numbers are reversed. The separator between +%the month and day is still given by the \pkgopt{monthdaysep} or +%\pkgopt{datesep} options. The separator between the day and year is given by +%the \pkgopt{dayyearsep} or \pkgopt{datesep} options. +% +%\item[\style{mmddyy}] This is like the \style{ddmmyy} style +%except the day and month numbers are reversed. The separator between +%the month and day is still given by the \pkgopt{monthdaysep} or +%\pkgopt{datesep} options. The separator between the day and year is given by +%the \pkgopt{dayyearsep} or \pkgopt{datesep} options. +% +%\item[\style{mdyyyy}] This is like the \style{mmddyyyy} style except +%that it doesn't force the day and month into a~two-digit format. +% +%\item[\style{mdyy}] This is like the \style{mdyyyy} style except +%that the year only has the final two digits displayed. +% +%\item[\style{pdf}] This formats the date, time and zone so that the +%full style is in the form required by the date settings in +%\ics{pdfinfo}. The date format is +%\begin{display} +%D:\meta{YYYY}\meta{MM}\meta{DD} +%\end{display} +%where the month and day numbers are displayed as two digits. +% +%The time format is +%\begin{display} +%\meta{hh}\meta{mm}\meta{ss} +%\end{display} +%where the numbers are displayed as two digits. +% +%The zone format is +%\begin{display} +%\meta{hh}'\meta{mm}' +%\end{display} +%or Z for zero time offset if the option \pkgopt{showisoZ} is +%used. (The \pkgopt{showisoZ} option is the only option that modifies +%the \style{pdf} style.) The hour and minutes are displayed as two +%digits where the hour has the sign present (either \texttt{+} or +%\texttt{-}). +% +%The full style is a concatenation of the date, time and zone. +%\begin{display} +%D:\meta{YYYY}\meta{MM}\meta{DD}\meta{hh}\meta{mm}\meta{ss}\meta{hh}'\meta{mm}' +%\end{display} +% +%\end{description} +% +%\subsection{Time Styles} +%\label{sec:predefinedtime} +% +%There's only one predefined time (partial) style provided +%by the base \styfmt{datetime2} package. This style can be used to +%override the time format part of full styles. For example, to use +%the \style{default} full style with the \style{hmmss} time style: +%\begin{verbatim} +%\DTMsetstyle{default}\DTMsettimestyle{hmmss} +%\end{verbatim} +% +%\begin{description} +%\item[\style{hmmss}] The \style{hmmss} style is like the time style +%provided by the full \style{default} style except that the hour +%isn't forced into two digits. +% +%\end{description} +% +%\subsection{Zone Styles} +%\label{sec:predefinedzone} +% +%The following are predefined zone (partial) styles that are provided +%by the base \styfmt{datetime2} package. These styles can be used to +%override the zone format part of full styles. For example, to use +%the \style{default} full style with the \style{map} zone style: +%\begin{verbatim} +%\DTMsetstyle{default}\DTMsetzonestyle{map} +%\end{verbatim} +% +%\begin{description} +%\item[\style{map}] The \style{map} style uses +%\cs{DTMusezonemapordefault} to display the mapping, if one exists, +%or use the default style, if a mapping doesn't exist. For example: +%\begin{verbatim} +%\DTMNatoZoneMaps +%\DTMsetzonestyle{map} +%\end{verbatim} +%This first defines the NATO mappings and then switches to the +%\style{map} style. +% +%\item[\style{hhmm}] The \style{hhmm} style displays the time zone in +%the form +%\begin{display} +%\meta{TZh}\meta{HMsep}\meta{TZm} +%\end{display} +%where \meta{HMsep} is given by the \pkgopt{hourminsep} option. +%This style honours the \pkgopt{showzoneminutes} option +%but ignores the \pkgopt{showisoZ} option. The hour is always +%prefixed by the sign. +% +%\end{description} +% +%\section{Defining New Styles} +%\label{sec:newstyle} +% +%A new \term{date style} can be defined using: +%\begin{definition}[\DescribeMacro\DTMnewdatestyle] +%\cs{DTMnewdatestyle}\marg{name}\marg{definition} +%\end{definition} +%This defines a \term{partial style} that should only modify +%\cs{DTMdisplaydate} and \cs{DTMDisplaydate}. The redefinition of +%these commands should be placed in \meta{definition}. +% +%A new \term{time style} can be defined using: +%\begin{definition}[\DescribeMacro\DTMnewtimestyle] +%\cs{DTMnewtimestyle}\marg{name}\marg{definition} +%\end{definition} +%This defines a \term{partial style} that should only modify +%\cs{DTMdisplaytime}. The redefinition should be placed in +%\meta{definition}. +% +%A new \term{zone style} can be defined using: +%\begin{definition}[\DescribeMacro\DTMnewzonestyle] +%\cs{DTMnewzonestyle}\marg{name}\marg{definition} +%\end{definition} +%This defines a \term{partial style} that should only modify +%\cs{DTMdisplayzone}. The redefinition should be placed in +%\meta{definition}. +% +%A new \term{full style} can be defined using: +%\begin{definition}[\DescribeMacro\DTMnewstyle] +%\cs{DTMnewstyle}\marg{name}\marg{date style definition}\marg{time +%style definition}\marg{zone style definition}\marg{full style definition} +%\end{definition} +%This does +%\begin{display} +%\cs{DTMnewdatestyle}\marg{name}\marg{date style definition}\newline +%\cs{DTMnewtimestyle}\marg{name}\marg{time style definition}\newline +%\cs{DTMnewzonestyle}\marg{name}\marg{zone style definition}\newline +%\end{display} +%and finally \meta{full style definition} should redefine +%\cs{DTMdisplay} and \cs{DTMDisplay}. +% +%\begin{important} +%Remember to use a double-hash to reference the parameters (\verb|##1|, +%\verb|##2| etc) within \meta{definition} in all the above. +%In each case \meta{name} is the label identifying the style +%and shouldn't contain active characters. +%\end{important} +% +%As from version 1.2, you can redefine existing styles with the following +%commands. +% +%\begin{definition}[\DescribeMacro\DTMrenewdatestyle] +%\cs{DTMrenewdatestyle}\marg{name}\marg{definition} +%\end{definition} +%This redefines the named date style. The original may be either a +%partial or a full style. +% +%\begin{definition}[\DescribeMacro\DTMrenewtimestyle] +%\cs{DTMrenewtimestyle}\marg{name}\marg{definition} +%\end{definition} +%This redefines the named time style. The original may be either a +%partial or a full style. +% +%\begin{definition}[\DescribeMacro\DTMrenewzonestyle] +%\cs{DTMrenewzonestyle}\marg{name}\marg{definition} +%\end{definition} +%This redefines the named time zone style. The original may be either a +%partial or a full style. +% +%\begin{definition}[\DescribeMacro\DTMrenewstyle] +%\cs{DTMrenewstyle}\marg{name}\marg{definition} +%\end{definition} +%This redefines the named full style. The original style must also +%be a full style. +% +%There are also commands analogous to \cs{providecommand} that will +%define styles that don't already exist. +% +%\begin{definition}[\DescribeMacro\DTMprovidedatestyle] +%\cs{DTMprovidedatestyle}\marg{name}\marg{definition} +%\end{definition} +%This defines the named date style. This won't do anything if either +%a partial date style or a full style with the given name already +%exists. +% +%\begin{definition}[\DescribeMacro\DTMprovidetimestyle] +%\cs{DTMprovidetimestyle}\marg{name}\marg{definition} +%\end{definition} +%This defines the named time style. This won't do anything if either +%a partial time style or a full style with the given name already +%exists. +% +%\begin{definition}[\DescribeMacro\DTMprovidezonestyle] +%\cs{DTMprovidezonestyle}\marg{name}\marg{definition} +%\end{definition} +%This defines the named zone style. This won't do anything if either +%a partial zone style or a full style with the given name already +%exists. +% +%\begin{definition}[\DescribeMacro\DTMprovidestyle] +%\cs{DTMprovidestyle}\marg{name}\marg{definition} +%\end{definition} +%This defines the named full style if the named full style doesn't +%already exist. This internally uses the previous +%three commands for the partial elements of the full style, so it a +%partial style with this name already exists, it won't be changed. +% +%As from v1.5.2, you can determine if a style exists using: +% +%\begin{definition}[\DescribeMacro\DTMifhasstyle] +%\cs{DTMifhasstyle}\marg{name}\marg{true}\marg{false} +%\end{definition} +%If the (full) style given by \meta{name} exists, this +%does \meta{true} otherwise it does \meta{false}. +% +%Similarly for a partial date style +%\begin{definition}[\DescribeMacro\DTMifhasdatestyle] +%\cs{DTMifhasdatestyle}\marg{name}\marg{true}\marg{false} +%\end{definition} +%partial time style +%\begin{definition}[\DescribeMacro\DTMifhastimestyle] +%\cs{DTMifhastimestyle}\marg{name}\marg{true}\marg{false} +%\end{definition} +%and partial time zone style +%\begin{definition}[\DescribeMacro\DTMifhaszonestyle] +%\cs{DTMifhaszonestyle}\marg{name}\marg{true}\marg{false} +%\end{definition} +% +%There are some helper commands provided that you might want to use +%in the style definitions. +% +%\begin{definition}[\DescribeMacro\DTMtwodigits] +%\cs{DTMtwodigits}\marg{number} +%\end{definition} +%This displays \meta{number} so that it has \emph{exactly} two digits. +%Unlike \LaTeX's \cs{two@digits} this will check for a negative +%number and will trim a number whose absolute value is greater than +%or equal to 100. This command is expandable. +% +%\begin{definition}[\DescribeMacro\DTMcentury] +%\cs{DTMcentury}\marg{year} +%\end{definition} +%This converts \meta{year} to the century. If \meta{year} is negative it does: +%\begin{display} +%\texttt{-\cs{DTMcentury}\{-\meta{year}\}} +%\end{display} +%Example: +%\begin{verbatim} +%\DTMcentury{1945} +%\end{verbatim} +%expands to \DTMcentury{1945} (not 19). Note that +%\begin{verbatim} +%\DTMcentury{1900} +%\end{verbatim} +%expands to \DTMcentury{1900}. +% +%\begin{definition}[\DescribeMacro\DTMdivhundred] +%\cs{DTMdivhundred}\marg{number} +%\end{definition} +%This expands to $\lfloor\meta{number}/100\rfloor$ (integer division +%by 100 rounded down). For example: +%\begin{verbatim} +%\DTMdivhundred{1945} +%\end{verbatim} +%expands to \DTMdivhundred{1945} and +%\begin{verbatim} +%\DTMdivhundred{1900} +%\end{verbatim} +%expands to \DTMdivhundred{1900}. +% +%\begin{definition}[\DescribeMacro\DTMtexorpdfstring] +%\cs{DTMtexorpdfstring}\marg{\TeX}\marg{PDF} +%\end{definition} +%If \sty{hyperref} is loaded, this is equivalent to +%\cs{texorpdfstring} otherwise it just does the first argument and +%ignores the second. (The check for \sty{hyperref} is deferred until +%the start of the \env{document} environment, so it doesn't matter if +%\sty{hyperref} is loaded after \styfmt{datetime2}.) This command may +%be used to provide alternative text to use if the date\slash +%time\slash zone is displayed in the PDF bookmarks. +% +%\begin{definition}[\DescribeMacro\DTMsep] +%\cs{DTMsep}\marg{tag} +%\end{definition} +%This accesses the value of the \meta{tag}\texttt{sep} base package +%option. (Not the language module options.) +%For example +%\begin{verbatim} +%\DTMsep{yearmonth} +%\end{verbatim} +%expands to the value supplied by the \pkgopt{yearmonthsep} package option. +% +%\begin{definition}[\DescribeMacro\DTMusezonemap] +%\cs{DTMusezonemap}\marg{TZh}\marg{TZm} +%\end{definition} +%This expands to the time zone abbreviation or \cs{relax} if no +%mapping has been set for the given time zone. +% +%You can define a time zone mapping using +%\begin{definition}[\DescribeMacro\DTMdefzonemap] +%\cs{DTMdefzonemap}\marg{TZh}\marg{TZm}\marg{abbr} +%\end{definition} +%For example +%\begin{verbatim} +%\DTMdefzonemap{00}{00}{GMT} +%\DTMdefzonemap{01}{00}{BST} +%\end{verbatim} +%Note that \styfmt{datetime2} doesn't know anything about daylight +%saving, so this is only really designed for dates and times +%in a~specific location. This overwrites any previous mapping +%for this time zone. +% +%The base \styfmt{datetime2} package provides +%\begin{definition}[\DescribeMacro\DTMNatoZoneMaps] +%\cs{DTMNatoZoneMaps} +%\end{definition} +%This defines the military\slash NATO mappings from A (Alpha time) to +%Z (Zulu time). You can use this command if you want these time zones +%(but remember to set an appropriate time zone style that uses +%the zone mappings). +% +%The language modules may provide mappings that are enabled +%when you switch to that style. For example, the \module[english]{en-GB} +%language module provides the \pkgopt{mapzone} option which, if set +%to \texttt{true}, will map +00:00 to GMT and +01:00 to BST. See the +%documentation for the language module for further details. +% +%\begin{definition}[\DescribeMacro\DTMclearmap] +%\cs{DTMclearmap}\marg{TZh}\marg{TZm} +%\end{definition} +%Clears the time zone mapping. The regional time zone styles should +%use +%\begin{definition}[\DescribeMacro\DTMresetzones] +%\cs{DTMresetzones} +%\end{definition} +%before applying any regional mappings. This defaults to nothing +%which means that any mappings previously defined by other styles +%won't be cleared. You can redefine this command if you want to clear +%any mappings that aren't relevant for other regions. +% +%You can test if a~mapping is defined using +%\begin{definition}[\DescribeMacro\DTMhaszonemap] +%\cs{DTMhaszonemap}\marg{TZh}\marg{TZm}\marg{true}\marg{false} +%\end{definition} +%This will do \meta{true} if there is a mapping defined for that time +%zone or \meta{false} otherwise. +% +%\begin{definition}[\DescribeMacro\DTMusezonemapordefault] +%\cs{DTMusezonemapordefault}\marg{TZh}\marg{TZm} +%\end{definition} +%This will use the mapping if its defined otherwise it +%will expand to the format +%\meta{TZh}\meta{HMsep}\meta{TZm} +%where \meta{HMsep}\meta{TZm} is omitted if the option +%\pkgopt{showzoneminutes} is set to \texttt{false}. The separator +%\meta{HMsep} is as given by the \pkgopt{hourminsep} option. (The +%\pkgopt{showisoZ} option isn't used here so UTC+00:00 will be +%displayed as +00:00 or +00 if there's no mapping.) +% +%Here's an example of a simple date style that just displays the year +%and month as two digits but uses the \pkgopt{yearmonthsep} option: +%\begin{verbatim} +%\newdatestyle +% {mmyy}% label +% {% definitions +% \renewcommand*{\DTMdisplaydate}[4]{% +% \DTMtwodigits{##2}\DTMsep{yearmonth}\DTMtwodigits{##1}}% +% \renewcommand*{\DTMDisplaydate}{\DTMdisplaydate}% +% } +%\end{verbatim} +% +%If you want to distribute your new styles, just put the definitions +%in a package and upload it to CTAN. For example (replace +%\texttt{mystylename} with something more appropriate, and also +%change the date in the \cs{ProvidesPackage} line): +%\begin{verbatim} +% \NeedsTeXFormat{LaTeX2e} +% \ProvidesPackage{mystylename}[2014/03/24 v1.0] +% \RequirePackage{datetime2} +% +% % style definitions here +% +% \endinput +%\end{verbatim} +%Save the file as \texttt{mystylename.sty}, add some documentation +%about the style (or styles) provided and read the instructions at +%\url{http://www.ctan.org/upload} and +%\url{http://www.ctan.org/file/help/ctan/CTAN-upload-addendum}. The upload location +%for additions to the \styfmt{datetime2} package (either for +%packages defining new styles or for language modules) should be +%\texttt{/macros\slash latex\slash contrib\slash datetime2-contrib\slash mystylename} (remember to +%replace \texttt{mystylename} as appropriate). +% +%\chapter{Multi-Lingual Support} +%\label{sec:lang} +% +%If you want to use \styfmt{datetime2} with \sty{babel} or +%\sty{polyglossia}, make sure you load +%\sty{babel}\slash\sty{polyglossia} \emph{before} you load +%\styfmt{datetime2} otherwise their \cs{date}\meta{language} will +%overwrite \cs{datetime}'s definition of \cs{today}. +%\emph{Additionally} you need to make sure you install the relevant +%\styfmt{datetime2} language modules. These modules are automatically +%loaded, if required, by \styfmt{datetime2} but only if they are +%already installed. Remember that if you use \XeLaTeX\ you won't have +%the seconds or time zone available for the current date and time +%(unless you first load \sty{texosquery} and have the shell escape +%enabled). +% +%\begin{important} +%If the required language modules aren't installed or +%\styfmt{datetime2} is loaded before +%\sty{babel}\slash\sty{polyglossia} then \styfmt{datetime2}'s +%definition of \cs{today} will be overridden and may no longer match +%the currently selected date style. +%\end{important} +% +%Each language module defines a textual style (where the month is +%displayed as a word) for that language or region +%which can be used in the argument of \cs{DTMsetstyle}, +%\cs{DTMsetdatestyle}, \cs{DTMsettimestyle} or \cs{DTMsetzonestyle}. +%The language module may also define a numeric style. In the +%ambiguous cases where the language name alone doesn't indicate the +%region (for example, \texttt{english} instead of \texttt{UKenglish} or +%\texttt{USenglish}) the module should use the \style{default} numeric +%style (see \sectionref{sec:predefinedfull}). +% +%The textual style provided by the module will automatically be +%set using \cs{DTMsetstyle} \emph{if the \pkgopt{useregional} +%option is set to \texttt{text}}. By default \pkgopt{useregional} is +%\texttt{false}, unless the language\slash region is passed via the +%\styfmt{datetime2} package option list. (The \pkgopt{useregional} +%option is unaffected if the setting is passed through the document +%class option list.) The numeric style provided by the module will +%automatically be set if the \pkgopt{useregional} option is set to +%\texttt{numeric}. See the descriptions for the \pkgopt{useregional} +%and \pkgopt{style} options in \sectionref{sec:pkgopt}. +% +%\begin{important} +%Be careful not to mix the language\slash region options between the document +%class option list and the \sty{babel}\slash\sty{polyglossia} +%interface. For example, don't do: +%\begin{verbatim} +%\documentclass[en-GB]{article} +%\usepackage[canadien,british]{babel} +%\end{verbatim} +%\end{important} +%The above example will prevent the \sty{tracklang} package from picking up the +%\sty{babel} setting and it will only detect the \texttt{en-GB} +%option. Use only the document class options or only the \sty{babel} +%package option list or duplicate \emph{all} the \sty{babel} package options with +%analogous \sty{tracklang} options in the document class. For example +%\begin{verbatim} +%\documentclass[canadien,british]{article} +%\usepackage{babel} +%\end{verbatim} +%or +%\begin{verbatim} +%\documentclass{article} +%\usepackage[canadien,british]{babel} +%\end{verbatim} +%or +%\begin{verbatim} +%\documentclass[fr-CA,en-GB]{article} +%\usepackage[canadien,british]{babel} +%\end{verbatim} +% +%Language modules may be used without \sty{babel} or \sty{polyglossia}. +%For example: +%\begin{verbatim} +%\documentclass{article} +%\usepackage[en-GB]{datetime2} +%\begin{document} +%\today +%\end{document} +%\end{verbatim} +%If you have more than one language or region you will need to switch +%styles using \cs{DTMsetstyle} etc if you aren't using \sty{babel} or +%\sty{polyglossia}: +%\begin{verbatim} +%\documentclass{article} +%\usepackage[en-GB,en-CA]{datetime2} +%\begin{document} +%\DTMsetstyle{en-GB}\today. +%\DTMsetstyle{en-CA}\today +%\end{document} +%\end{verbatim} +% +%If you want to change the number separators for the \emph{regional} +%numeric styles, you need to use \cs{DTMlangsetup}. If you want to +%change the number separators for the base \styfmt{datetime2} +%predefined numeric styles (see \sectionref{sec:predefinedstyles}) +%then you need to use \cs{DTMsetup} or the package options. You +%therefore need to use \cs{DTMsetup} for the ambiguous regionless +%language numeric settings since they just use the \style{default} +%style. Check the module documentation to find out if the +%\style{default} style is used. +% +%Examples of use: +%\begin{enumerate} +%\item Language option specified through the document class and +%picked up by \sty{tracklang} (which is loaded by \styfmt{datetime2}). +%This setting is also picked up by \sty{babel} which is loaded before +%\styfmt{datetime2}. +%\begin{verbatim} +%\documentclass[british]{article} +% +%\usepackage{babel} +%\usepackage{datetime2} +% +%\begin{document} +%\today +%\end{document} +%\end{verbatim} +%The date is displayed in the default format 2015-03-01. +% +%In this case, the \texttt{en-GB} language module is loaded which +%defines the text style \style{en-GB} and the numeric style +%\style{en-GB-numeric}. Since \pkgopt{useregional} hasn't been set, +%\cs{today} uses \styfmt{datetime2}'s \style{default} numerical format. +%If \sty{babel} was loaded after \styfmt{datetime2}, the +%\sty{babel}'s hook management system would overwrite +%\styfmt{datetime2}'s definition of \cs{today} so that it no longer used +%\ics{DTMdisplaydate}. A similar result is obtained if in the above +%example \sty{babel} is replaced with \sty{polyglossia} (where the +%language is set in the document class option). +% +%You can change the \pkgopt{useregional} setting either through +%\styfmt{datetime2}'s package options or using \ics{DTMsetup} however +%it will only have an effect during the module loading (when the +%value is changed via the package option) and when +%\cs{date}\meta{language} is used. An alternative is to use +%\cs{DTMsetregional} which will also do \cs{date}\meta{language} if +%it is available +%(where \meta{language} is the current value of \cs{languagename}) +%otherwise it will iterate through the list of known +%dialects and try to set each one in turn. +% +%\begin{important} +%This means that using \cs{DTMsetregional} may cause +%the style to change to a different region if you have multiple +%regions defined. +%\end{important} +% +%For example, in the document below, the date is displayed using the +%\style{default} numeric format because \pkgopt{useregional} has been +%changed \emph{after} \sty{babel} uses \cs{datebritish} to set the +%language at the start of the document. +%\begin{verbatim} +%\documentclass[british]{article} +% +%\usepackage{babel} +%\usepackage{datetime2} +% +%\begin{document} +%\DTMsetup{useregional} +%\today +%\end{document} +%\end{verbatim} +%So here \cs{today} again displays the date in the form 2015-03-01. +% +%If the setting is moved to the preamble: +%\begin{verbatim} +%\documentclass[british]{article} +% +%\usepackage{babel} +%\usepackage{datetime2} +% +%\DTMsetup{useregional} +%\begin{document} +%\today +%\end{document} +%\end{verbatim} +%then the \pkgopt{useregional} setting is checked at the beginning of +%the document when \sty{babel} uses \cs{datebritish}. So in this case +%\cs{today} will display the date in the form 1st March 2015. +% +%\item Language setting specified through \sty{babel}'s package +%option list: +%\begin{verbatim} +%\documentclass{article} +% +%\usepackage[british]{babel} +%\usepackage{datetime2} +% +%\begin{document} +%\today +%\end{document} +%\end{verbatim} +%This has the same result as placing \texttt{british} in the document +%class option list, so the date is again displayed in the default +%format 2015-03-01 but, as in the previous example, the \style{en-GB} +%and \style{en-GB-numeric} styles are both defined if required. +% +%However a problem occurs if \sty{babel} is replaced by +%\sty{polyglossia}: +%\begin{verbatim} +%\documentclass{article} +% +%\usepackage{fontspec} +%\usepackage{polyglossia} +%\setdefaultlanguage[variant=uk]{english} +% +%\usepackage{datetime2} +% +%\begin{document} +%\today +%\end{document} +%\end{verbatim} +%In this case \sty{tracklang} is unable to pick up the variant and +%can only detect the root language, so it will load the generic +%\module{english} module instead of the \texttt{en-GB} module. This +%means that the \style{en-GB} and \style{en-GB-numeric} styles are no longer +%available. However, since \pkgopt{useregional} is \texttt{false} the +%date is still displayed using the \texttt{default} numeric style +%in the form 2015-03-01. +% +%\item As mentioned above neither \sty{babel} nor \sty{polyglossia} are required in +%order to use the \styfmt{datetime2} language modules. You can simply +%supply the language setting in the package option list: +%\begin{verbatim} +%\documentclass{article} +% +%\usepackage[british]{datetime2} +% +%\begin{document} +%\today +%\end{document} +%\end{verbatim} +%This additionally sets \pkgopt[true]{useregional} (since the +%language is in the package option list not the document class option +%list) so the date produced by \cs{today} now uses the \texttt{en-GB} +%date style in the form 1st March 2015. +% +%\item The regional numeric format can be used instead if +%\pkgopt{useregional} is set to \texttt{numeric}: +%\begin{verbatim} +%\documentclass{article} +% +%\usepackage[british,useregional=numeric]{datetime2} +% +%\begin{document} +%\today +%\end{document} +%\end{verbatim} +%This now displays the date in the form 1/3/2015. +%\end{enumerate} +% +%Many of the language options have synonyms. In addition to the +%\sty{babel} synonyms (such as \pkgopt{british} or +%\pkgopt{UKenglish}) the \sty{tracklang} package provides options in +%ISO form, such as \pkgopt{en-GB}. Note that the style name provided +%by each language module is independent of the package option used +%to select that style. So regardless of whether you use +%\pkgopt{british}, \pkgopt{UKenglish} or \pkgopt{en-GB}, the text style +%name is \style{en-GB} and the numeric style name is +%\style{en-GB-numeric}. If just \pkgopt{english} is used, the text +%style name is \style{english} but the numeric style is +%\style{default}. +% +%Languages where the region is automatically implied, such +%as \pkgopt{scottish}, provide a text style with the root language +%name (\style{scottish} in this instance) and a numeric style in the +%form \meta{language}\texttt{-numeric} (such as \style{scottish-numeric}). +%Note that the \module{irish} module has regionless styles \texttt{irish} and +%\texttt{irish-numeric} but also has regional styles +%\texttt{ga-IE} and \texttt{ga-IE-numeric} (for the Republic of +%Ireland) and \texttt{ga-GB} and \texttt{ga-GB-numeric} (for Northern +%Ireland). In this case the regionless style has a numeric style +%instead of using the \style{default} style since both +%\texttt{ga-IE-numeric} and \texttt{ga-GB-numeric} are the same so +%there's no ambiguity. The only difference in the three modules +%\texttt{datetime2-irish}, \texttt{datetime2-ga-IE} and +%\texttt{datetime2-ga-GB} is the time zone mappings. +% +%The language or regional modules may provide additional settings that can be +%applied using +%\begin{definition}[\DescribeMacro\DTMlangsetup] +%\cs{DTMlangsetup}\oarg{module-name list}\marg{options} +%\end{definition} +%where \meta{module-name list} is a comma-separated list of +%modules that have previously been loaded (such as \texttt{en-GB,en-US}) +%and \meta{options} is a \meta{key}=\meta{value} list of options. +% +%\begin{important} +%Note that the names in the \meta{module-name list} are +%the identifying names of the module (such as \module[english]{en-GB} or +%\module{english}) +%which aren't necessarily the same as the language name supplied +%to whatever language package you are using (such as \sty{babel} or +%\sty{polyglossia}). The code for each module should be in the file +%\texttt{datetime2-\meta{module-name}.ldf}, which should be in TeX's +%path. +%\end{important} +% +%If \meta{module-name list} is omitted, then the list of all loaded +%modules is assumed. There is also a starred version +%of this command (as from v1.3) which suppresses the warning +%if the given \meta{options} aren't available for any of +%the modules named in \meta{module-name list}. You may prefer +%to use the starred version if you omit \meta{module-name list} +%to skip the warnings from the base modules that don't support the +%given options. +% +%The modules may also provided +%user commands to further customise the style. These settings should +%all be described in the module's documentation, which should be +%accessible via \texttt{texdoc datetime2-\meta{language}} where +%\meta{language} is the root language name in lower case +%(such as \texttt{english}). +% +%Note that although I~maintain the \styfmt{datetime2} English +%language module, I~don't maintain the other modules. If you have an +%issue with one of the other modules, please contact the module +%maintainer. If there is no maintainer, feel free to volunteer to +%take over the maintenance (\href{http://www.dickimaw-books.com/contact.html}{send me a +%message}). If there's no module for your language +%you can create your own module and upload it to CTAN in the +%\texttt{/macros\slash latex\slash contrib\slash datetime2-contrib\slash +%datetime2-\meta{language}} directory. +% +%You can use the English or Irish modules as a template for a +%language with multiple regions. Just download the English source +%files +%\href{http://mirror.ctan.org/macros/latex/contrib/datetime2-contrib/datetime2-english/datetime2-english.dtx}{\texttt{datetime2-english.dtx}} and +%\href{http://mirror.ctan.org/macros/latex/contrib/datetime2-contrib/datetime2-english/datetime2-english.ins}{\texttt{datetime2-english.ins}} or the Irish source files +%\href{http://mirror.ctan.org/macros/latex/contrib/datetime2-contrib/datetime2-irish/datetime2-irish.dtx}{\texttt{datetime2-irish.dtx}} +%and +%\href{http://mirror.ctan.org/macros/latex/contrib/datetime2-contrib/datetime2-irish/datetime2-irish.ins}{\texttt{datetime2-irish.ins}} from +%CTAN and make the appropriate modifications. Alternatively you can +%use the Scottish module as a template for a single-region language. +%Just download the Scottish source files +%\href{http://mirror.ctan.org/macros/latex/contrib/datetime2-contrib/datetime2-scottish/datetime2-scottish.dtx}{\texttt{datetime2-scottish.dtx}} and +%\href{http://mirror.ctan.org/macros/latex/contrib/datetime2-contrib/datetime2-scottish/datetime2-scottish.ins}{\texttt{datetime2-scottish.ins}} from CTAN and make the appropriate +%modifications. (Don't forget to provide a README file.) +% +%Each language module should be in a file named +%\texttt{datetime2-\meta{lang}.ldf} where \meta{lang} is either the language +%name or in the form \meta{language ISO code}\texttt{-}\meta{country ISO code}. (See the +%\sty{tracklang} documentation for further details of the naming +%scheme.) +% +%A regional module may load a base module for the same language using +%\begin{definition}[\DescribeMacro\RequireDateTimeModule] +%\cs{RequireDateTimeModule}\marg{name} +%\end{definition} +%This will input the file \texttt{datetime2-\meta{name}.ldf}. This command +%should not be used outside the \styfmt{datetime2} language module files. +%If you are creating a package that explicitly needs to load one of these files, +%then you can use: +%\begin{definition}[\DescribeMacro\DTMusemodule] +%\cs{DTMusemodule}\marg{language}\marg{name} +%\end{definition} +%where \meta{language} is the \sty{babel} or \sty{polyglossia} language or +%dialect name that identifies the relevant \cs{date\meta{language}} +%macro (for example, \texttt{english}) and \meta{name} is the same as +%above (for example, \texttt{en-GB}). +% +%Note that \cs{RequireDateTimeModule} (which is also internally used +%by \cs{DTMusemodule}) stores a mapping from the language name +%and the module name. You can determine what module was loaded +%for a given dialect name using +%\begin{definition}[\DescribeMacro\DTMdialecttomodulemap] +%\cs{DTMdialecttomodulemap}\marg{dialect} +%\end{definition} +%This expands to the required module name or \cs{relax} if the +%given dialect name wasn't used to load a module. +%For example: +%\begin{verbatim} +%\documentclass{article} +%\usepackage[british]{datetime2} +% +%\begin{document} +% +%british map: \DTMdialecttomodulemap{british}. +%english map: \DTMdialecttomodulemap{english}. +% +%\end{document} +%\end{verbatim} +%This produces: +%\begin{quote} +%british map: en-GB. +%english map: . +%\end{quote} +%In the above, the second instance expands to \cs{relax}. +% +%\begin{important} +%If you want to provide a language module don't assume all users want +%to use the same input encoding or \sty{babel} shorthands as you. Use \LaTeX\ +%commands for non-ASCII characters (and remember to use \cs{protect} +%where necessary). +%\end{important} +% +%As an addendum to the above warning, Lua\TeX\ and \XeTeX\ support +%UTF-8 characters without the need to make them active, so +%I~recommend you provide two files: one with the \LaTeX\ commands, +%such as \cs{c}, for (PDF)\LaTeX\ users, and one with UTF-8 characters +%for Lua\LaTeX\ and \XeLaTeX\ users. For example, the \texttt{fr-FR} module +%could start with: +%\begin{verbatim} +%\ProvidesDateTimeModule{fr-FR} +% +%\RequirePackage{ifxetex,ifluatex} +% +%\ifxetex +% \RequireDateTimeModule{french-utf8} +%\else +% \ifluatex +% \RequireDateTimeModule{french-utf8} +% \else +% \RequireDateTimeModule{french-ascii} +% \fi +%\fi +%\end{verbatim} +% +%This helps provide fully expandable dates for Lua\LaTeX\ and +%\XeLaTeX\ users. (See the Scottish or Irish modules for examples.) +% +%\chapter{Standalone Month or Weekday Names} +%\label{sec:names} +% +%\begin{important} +%If you want the month name or weekday name to appear in a section +%or chapter heading, it's best to use the expandable commands +%provided by the language modules rather than the robust commands +%provided by \styfmt{datetime2-calc}. Remember that you can't use robust +%commands in PDF bookmarks and such commands may prevent case-changing in +%headers for page styles that use \cs{MakeUppercase}. +%\end{important} +% +%The language or regional modules described in +%\sectionref{sec:lang} typically provide an expandable command +%\begin{definition} +%\cs{DTM\meta{root-language}monthname}\marg{n} +%\end{definition} +%which takes a numerical argument that indicates the month number. +%This command is used in the date style which ensures that even if +%the document language has switched but not the date style, then +%the month name will be in the correct language for that style. +%(Otherwise you could end up with a mix of style from one dialect +%using names from another language, which was one of the problems +%with the original \styfmt{datetime} package.) +% +%For example, if the \module{english} module is loaded (which is +%automatically loaded by the English dialect modules, such as +%\module[english]{en-GB}) then the command \cs{DTMenglishmonthname} is +%defined. So if you're writing in English and you want to display +%just the +%month name, then you can do: +%\begin{verbatim} +%\DTMenglishmonthname{1} +%\end{verbatim} +%Some language modules, where month names aren't automatically +%capitalised, may additionally define a version that +%has the first letter in upper case. For example, the \module{french} +%module defines \cs{DTMfrenchMonthname} in addition to +%\cs{DTMfrenchmonthname}. +% +%Some of the modules may have other alternatives. For example, +%the \module{serbian} module provides Cyrillic +%(\cs{DTMserbiancyrmonthname}) and Latin +%(\cs{DTMserbianlatinmonthname}) +%month names. It also provides \cs{DTMserbianmonthname}, which +%defaults to \cs{DTMserbiancyrmonthname} but can be redefined +%using \cs{DTMlangsetup}. +% +%To find out the available commands for the module you are using, +%see that module's documentation. +% +%If you are writing a document that uses multiple languages +%and you simply want to display the month name in the currently +%selected language, then you can use the robust command +%\begin{definition} +%\ics{DTMmonthname}\marg{n} +%\end{definition} +%provided by the \styfmt{datetime2-calc} package, +%described in \sectionref{sec:calc}. Remember that the +%\styfmt{datetime2-calc} package also loads the \sty{pgfcalendar} +%package, which provides the expandable command +%\cs{pgfcalendarmonthname}. (The \sty{pgfcalendar} package provides +%multilingual support via the \sty{translator} package.) +% +%Some of the language modules additionally provide a command +%that displays the first letter in upper case. This isn't provided +%for languages where the month name is always displayed with +%a capital first letter, such as in English. For example, +%the \module{serbian} module also defines +%\cs{DTMserbiancyrMonthname} and \cs{DTMserbianlatinMonthname}, +%with \cs{DTMserbianMonthname} initially defined to use +%the Cyrillic version. +% +%So, if you specifically want to display the Serbian Cyrillic +%month name with the first letter in upper case, you need to +%make sure the \module{serbian} module is loaded +%and then use the provided \cs{DTMserbiancyrMonthname} command. +% +%If you want the month name to vary according to the current language +%setting in the document, you can use the robust command +%\begin{definition} +%\cs{DTMMonthname}\marg{n} +%\end{definition} +%provided by \styfmt{datetime2-calc}, which will first +%attempt \cs{DTM\meta{language}Monthname} and then +%\cs{DTM\meta{language}monthname} before falling back on the +%\cs{pgfcalendarmonthname}, see \sectionref{sec:calc} for further +%details. +% +%Some, but not all, language modules provide a command (or commands) +%for month name abbreviations. It's up to the maintainer of the +%module to add these if they currently aren't provided. You will +%need to check the module documentation to find out if abbreviations +%are supported. If they are supported, they should be in +%the form +%\begin{definition} +%\cs{DTM\meta{root-language}shortmonthname}\marg{n} +%\end{definition} +%Again there may be variations, such as new and old styles or alternative +%alphabets. For example, the \module{english} module +%provides \cs{DTMenglishshortmonthname}. +% +%As with the full form, if you want to display the abbreviation +%in a specific language (or variation), then use the command +%provided by the relevant language module. If you want the +%abbreviation to pick up the current language, then you can +%use the robust command +%\begin{definition} +%\cs{DTMshortmonthname}\marg{n} +%\end{definition} +%provided by the \styfmt{datetime2-calc} package. This will fall back on +%\cs{pgfcalendarmonthshortname} if +%\cs{DTM\meta{language}shortmonthname} isn't defined. See +%\sectionref{sec:calc} for further details. +% +%Modules may additionally provide a version of the abbreviated +%form that starts with a capital letter. This should typically +%be in the form +%\begin{definition} +%\cs{DTM\meta{root-language}shortMonthname}\marg{n} +%\end{definition} +%Check the module documentation to see if this is provided. +%Again, the \styfmt{datetime2-calc} package provides a robust command +%\begin{definition} +%\cs{DTMshortMonthname}\marg{n} +%\end{definition} +%that attempts to determine the relevant +%module command from the language name. +% +%Language modules may or may not provide a command that displays +%the weekday name. As with the month name, there may or may not +%be an abbreviated version or capital first letter version +%or variations such as new\slash old styles. +%Check the module documentation for further details. If +%the module doesn't provide a weekday name macro, then the +%provided styles won't support the \pkgopt{showdow} option. +% +%\emph{If} the module provides weekday name support, then +%the name will typically be provided by a macro in the form +%\begin{definition} +%\cs{DTM\meta{root-language}weekdayname}\marg{n} +%\end{definition} +%where \meta{n} is an integer from 0 (Monday) to 6 (Sunday). +%For example, the \module{english} module provides +%\cs{DTMenglishweekdayname}. +% +%Again, the \styfmt{datetime2-calc} package provides \emph{robust} +%commands that attempt to find the relevant module-provided +%command based on the current language. If not found, +%the fallback commands are those provided by the \sty{pgfcalendar} +%package. See \sectionref{sec:calc} for further details. +% +%\chapter{Package Options} +%\label{sec:pkgopt} +% +%The following package options are provided. Most of these are +%\meta{key}=\meta{value} options, unless stated otherwise. +% +%Settings that govern the predefined numerical styles (not including +%the fixed styles \style{iso} and \style{pdf}): +%\begin{description} +%\item[\pkgopt{yearmonthsep}] This sets the separator between the +%year and month for the big-endian and little-endian styles. +%Default: \texttt{-} (hyphen). +%Note that if you want a space as a separator you need to use \cs{space}. +%If you simply use a space character (for example, \verb|yearmonthsep={ }|) +%then the separator will be discarded. The same applies for the other separators described below. +% +%\item[\pkgopt{monthdaysep}] This sets the separator between the +%month and day. +%Default: \texttt{-} (hyphen). +% +%\item[\pkgopt{dayyearsep}] This sets the separator between the +%day and year for the middle-endian styles. +%Default: \texttt{-} (hyphen). +% +%\item[\pkgopt{datesep}] This sets the separators between the day and +%month, the month and year, and the day and year. Example: +%\begin{verbatim} +%\usepackage[datesep=/]{datetime2} +%\end{verbatim} +%This is equivalent to: +%\begin{verbatim} +%\usepackage[yearmonthsep=/,monthdaysep=/,dayyearsep=/]{datetime2} +%\end{verbatim} +% +%\item[\pkgopt{hourminsep}] This sets the separator between the hour +%and minute. (Both for the time and for the zone.) +%Default: \texttt{:} (colon). +% +%\item[\pkgopt{minsecsep}] This sets the separator between the minute +%and seconds. +%Default: \texttt{:} (colon). +% +%\item[\pkgopt{timesep}] This sets the separators between the hour +%and minute and between the minute and seconds. +%Example: +%\begin{verbatim} +%\usepackage[timesep=:]{datetime2} +%\end{verbatim} +%This is equivalent to: +%\begin{verbatim} +%\usepackage[hourminsep=:,minsecsep=:]{datetime2} +%\end{verbatim} +%\end{description} +% +%The following settings are used by the predefined numerical styles when +%displaying the full date, time and zone (excluding the fixed styles \style{iso} +%and \style{pdf}) with commands that use \cs{DTMdisplay} or +%\cs{DTMDisplay}. +%\begin{description} +%\item[\pkgopt{datetimesep}] Sets the separator between the date and +%time. +%Default: \cs{space}. +% +%\item[\pkgopt{timezonesep}] Sets the separator between the time and +%zone. +%Default: empty. +% +%\end{description} +% +%The following settings are used by the predefined styles and may +%also be used by the language modules. +%\begin{description} +%\item[\pkgopt{showseconds}] Boolean key to determine whether or not +%to show the seconds when the time is displayed. The \style{iso} +%style honours this setting but the \style{pdf} style ignores it. +%Default: \texttt{true} unless \XeTeX\ is used (and \sty{texosquery} +%hasn't first been loaded with shell escape enabled). +% +%\item[\pkgopt{showdate}] Boolean key to determine whether or not to +%show the date with commands that use \cs{DTMdisplay} or +%\cs{DTMDisplay}. (Some styles may ignore this.) The \style{iso} +%style honours this setting but the \style{pdf} style ignores it. +%Default: \texttt{true}. +% +%\item[\pkgopt{showzone}] Boolean key to determine whether or not to +%show the time zone with commands that use +%\cs{DTMdisplay} or \cs{DTMDisplay}. (Some styles may ignore this.) The \style{iso} style honours this setting but the +%\style{pdf} style ignores it. +%Default: \texttt{true} unless \XeTeX\ is used (and \sty{texosquery} +%hasn't first been loaded with shell escape enabled). +% +%\item[\pkgopt{showzoneminutes}] Boolean key to determine whether or +%not to show the zone offset minutes. The \style{iso} style honours +%this setting but the \style{pdf} style ignores it. This setting is +%ignored if \pkgopt{showzone} is \texttt{false}. +%Default: \texttt{true}. +% +%\item[\pkgopt{showisoZ}] Boolean key to determine whether or not to +%show UTC+00:00 as \texttt{Z} instead of numerically. This option +%may be ignored by zone styles that use the zone mappings. If you +%want all the time zones in military form, you can use +%\cs{DTMNatoZoneMaps} to set up the time zone abbreviations and then +%use a zone style that uses the mappings. +%Default: \texttt{true}. +% +%\end{description} +% +%General settings: +%\begin{description} +%\item[\pkgopt{useregional}] Allowed values: \texttt{false}, +%\texttt{text} or \texttt{numeric}. You may also use \texttt{num} as +%an abbreviation for \texttt{numeric}. If no value is supplied +%\texttt{text} is assumed. +% +%\begin{important} +%If you haven't loaded \sty{babel} or \sty{polyglossia}, this +%key only has an effect when used as a package option. Consider +%instead using \cs{DTMsetregional}. +%\end{important} +% +%This key determines whether or not to \emph{use} the loaded regional +%settings and, if the regional setting should be used, it determines +%whether the text style (months as words) or numeric style should be +%used. If you have loaded one of those packages, the change comes +%into effect at module load time and whenever +%\cs{date}\meta{language} is used (which includes at the beginning of +%the \env{document} environment). If you want to switch the style at +%any other time, you need to use \cs{DTMsetstyle} but unless +%\pkgopt[false]{useregional} the next instance of +%\cs{date}\meta{language} will change the style. +% +%Note that setting this option to \texttt{false} doesn't prevent the modules +%from being loaded. It just prevents them from automatically setting the style +%and prevents \cs{date}\meta{language} from changing the style if you +%are using \sty{babel} or \sty{polyglossia}. +% +%The default value is \texttt{false} unless the language or region is +%passed to the \styfmt{datetime2} package option list. However, using \pkgopt{style} +%will set \pkgopt{useregional} to \texttt{false}. +% +%If you want to change this value after the language modules have +%been loaded, instead of using \cs{DTMsetup}, you can use +%\begin{definition}[\DescribeMacro\DTMsetregional] +%\cs{DTMsetregional}\oarg{value} +%\end{definition} +%This will do \texttt{\cs{DTMsetup}\{userregional=\meta{value}\}}. +%Then if \meta{value} is \texttt{false}, it will set the +%\texttt{default} style otherwise it will use \cs{date}\meta{lang} if +%it's defined (where \meta{lang} is given by \cs{languagename}). If +%\cs{date}\meta{lang} isn't defined, it will iterate over the list of +%dialects associated with the document and use \cs{DTMtryregional} +%for each dialect. If \meta{value} is omitted, \texttt{text} is +%assumed. +% +%Examples: +%\begin{verbatim} +%\documentclass[british]{article} +%\usepackage{babel} +%\usepackage{datetime2} +%\end{verbatim} +%In the above \pkgopt{useregional} is \texttt{false}. +% +%\begin{verbatim} +%\documentclass{article} +%\usepackage[british]{datetime2} +%\end{verbatim} +%In the above \pkgopt{useregional} is \texttt{text}. +% +%\begin{verbatim} +%\documentclass{article} +%\usepackage[british,style=iso]{datetime2} +%\end{verbatim} +%In the above \pkgopt{useregional} is \texttt{false}. (The +%\pkgopt{british} option implements \pkgopt[text]{usenumerical} +%but the \pkgopt{style} option then implements +%\pkgopt[false]{usenumerical}.) +% +%\begin{verbatim} +%\documentclass{article} +%\usepackage[style=iso,british]{datetime2} +%\end{verbatim} +%In the above \pkgopt{useregional} is \texttt{text}. (The +%\pkgopt{style} option implements \pkgopt[false]{usenumerical} +%but the \pkgopt{british} option then implements +%\pkgopt[text]{usenumerical}.) +% +%\item[\pkgopt{style}] Sets the current style using \cs{DTMsetstyle} +%when the \styfmt{datetime2} package has finished loading. This also sets +%\pkgopt[false]{useregional} but that setting can be overridden later +%in the option list. +% +%Default value: empty (use the default style or the regional style, +%according to the value of \pkgopt{useregional}). +% +%This key isn't available in \cs{DTMsetup}. Use \cs{DTMsetstyle} instead. +% +%\item[\pkgopt{calc}] Load the \styfmt{datetime2-calc} package. This +%will allow the day of week to be computed and allow you to use the +%\sty{pgfcalendar} offset style date formats in commands like +%\cs{DTMdate} as well as defining the commands described in +%\sectionref{sec:calc}. This option doesn't take a value. It can't be switched +%off. This option can't be used in \cs{DTMsetkeys}. The default is to +%not load \styfmt{datetime2-calc}. +% +%\item[\pkgopt{showdow}] This is a boolean key that determines +%whether or not to show the day of week in styles that support this. +%Note that \pkgopt[true]{showdow} will automatically load +%\styfmt{datetime2-calc} so +%\begin{verbatim} +%\usepackage[showdow]{datetime2} +%\end{verbatim} +%is equivalent to +%\begin{verbatim} +%\usepackage[showdow,calc]{datetime2} +%\end{verbatim} +% +%This option may be used in \cs{DTMsetup}, but if you attempt to +%switch it on in the \env{document} environment you'll get an error +%if the \styfmt{datetime2-calc} package hasn't been loaded. +%\textbf{Not all styles support this setting.} +%Default: \texttt{false}. +% +%This option is actually a language-dependent option and isn't used +%by the base package, but it's implemented as a package option as the +%\styfmt{datetime2-calc} package is also needed if the day of the week +%should be displayed. As a package option, \pkgopt{showdow} can +%automatically load the required package. +% +%\begin{important} +%You need to check the documentation to find out which styles check +%the \pkgopt{showdow} setting as not all of them do. +%\end{important} +% +%\item[\pkgopt{warn}] This is a boolean key. If true (default) +%\styfmt{datetime2} warnings will be displayed. If false, the warnings +%will be suppressed. +%Default: \texttt{true}. +% +%\end{description} +% +%Any additional option passed to the \styfmt{datetime2} package (not +%through \cs{DTMsetup}) will be considered a \sty{tracklang} option +%and will be passed to \cs{TrackPredefinedDialect}. (See the +%\sty{tracklang} documentation for further details of that command.) +% +%Apart from \pkgopt{calc}, \pkgopt{style} and the regional options, all the above +%options can also be set using: +%\begin{definition}[\DescribeMacro\DTMsetup] +%\cs{DTMsetup}\marg{option list} +%\end{definition} +% +%The language modules may additionally provide options which can be +%set using: +%\begin{definition}[\DescribeMacro\DTMlangsetup] +%\cs{DTMlangsetup}\oarg{module-name list}\marg{option list} +%\end{definition} +% +%This will set the \meta{option list} for each module listed in +%\meta{module-name list}. Unknown options will generate a~warning rather +%than an error message. The default value of \meta{module-name list} is +%the list of all loaded modules. +% +%Example: +%\begin{verbatim} +%\documentclass{article} +%\usepackage[british]{datetime2} +%\DTMlangsetup{mapzone} +%\end{verbatim} +%The module list here is \texttt{english-base},\texttt{en-GB} and +%since the \texttt{english-base} doesn't have a \texttt{mapzone} +%option, this will result in a warning: +%\begin{verbatim} +%Package datetime2 Warning: Region `english-base' has ignored +%(datetime2) the following settings: +%(datetime2) mapzone +%\end{verbatim} +%You can either ignore the warning or use the optional argument to +%exclude the \texttt{english-base} module: +%\begin{verbatim} +%\documentclass{article} +%\usepackage[british]{datetime2} +%\DTMlangsetup[en-GB]{mapzone} +%\end{verbatim} +%Alternatively you can use the starred version: +%\begin{verbatim} +%\documentclass{article} +%\usepackage[british]{datetime2} +%\DTMlangsetup*{mapzone} +%\end{verbatim} +% +%Note that some modules may have options with the same name as the +%above listed package options, but the keys are defined in different +%families (see \sty{xkeyval} documentation) so you need to take care +%to use \cs{DTMsetup} for package-wide settings and \cs{DTMlangsetup} +%for the module-specific settings. +% +%For example, the \pkgopt{datesep} package option described above is +%used by the predefined numerical styles but regional modules that +%provide their own numerical styles may use a different date +%separator that matches their region so they may also provide a +%\texttt{datesep} option independent of the base \pkgopt{datesep} +%option. +% +%Examples: +%\begin{verbatim} +%\documentclass[british]{article} +%\usepackage[datesep=.]{datetime2} +%\begin{document} +%\today +%\end{document} +%\end{verbatim} +%The above displays the date in the form +%{\DTMsetup{datesep=.}\DTMsetdatestyle{default}\today} +%since the default style is in use and \pkgopt{datesep} is used as a +%package option. +% +%\begin{verbatim} +%\documentclass[british]{article} +%\usepackage{datetime2} +%\DTMsetup{datesep=.} +%\begin{document} +%\today +%\end{document} +%\end{verbatim} +%The above displays the date in the form +%{\DTMsetup{datesep=.}\DTMsetdatestyle{default}\today} +%since the default style is in use and \pkgopt{datesep} is used in +%\cs{DTMsetup}. +% +%\begin{verbatim} +%\documentclass[british]{article} +%\usepackage{datetime2} +%\DTMlangsetup{datesep=.} +%\begin{document} +%\today +%\end{document} +%\end{verbatim} +%The above displays the date in the form +%{\DTMlangsetup[en-GB]{datesep=.}\DTMsetdatestyle{default}\today} +%since the default style is in use but \pkgopt{datesep} is used in +%\cs{DTMlangsetup}, which only influences the \style{en-GB-numeric} +%style, which isn't the current style. +% +%\begin{verbatim} +%\documentclass[british]{article} +%\usepackage[useregional=numeric]{datetime2} +%\DTMlangsetup{datesep=.} +%\begin{document} +%\today +%\end{document} +%\end{verbatim} +%The above displays the date in the form +%{\DTMlangsetup[en-GB]{datesep=.}\DTMsetdatestyle{en-GB-numeric}\today} +%since the \style{en-GB-numeric} style is in use and \pkgopt{datesep} +%is used in \cs{DTMlangsetup}. +% +%\begin{verbatim} +%\documentclass[british]{article} +%\usepackage[useregional]{datetime2} +%\DTMlangsetup{datesep=.} +%\begin{document} +%\today +%\end{document} +%\end{verbatim} +%The above displays the date in the form +%{\DTMlangsetup[en-GB]{datesep=.}\DTMsetdatestyle{en-GB}\today} +%since the \style{en-GB} style is in use and \pkgopt{datesep} is used +%in \cs{DTMlangsetup}, which only influences the +%\style{en-GB-numeric} style. +% +%\begin{verbatim} +%\documentclass[british]{article} +%\usepackage[useregional=numeric]{datetime2} +%\DTMsetup{datesep=.} +%\begin{document} +%\today +%\end{document} +%\end{verbatim} +%The above displays the date in the form +%{\DTMsetup{datesep=.}\DTMsetdatestyle{en-GB-numeric}\today} +%since the \style{en-GB-numeric} style is in use but \pkgopt{datesep} +%is used in \cs{DTMsetup} which influences the base predefined +%numeric styles not the regional styles. +% +%\chapter{The \styfmt{datetime2-calc} Package} +%\label{sec:calc} +% +%The \styfmt{datetime2-calc} package can be loaded after \styfmt{datetime2} in the +%usual way: +%\begin{verbatim} +%\usepackage{datetime2} +%\usepackage{datetime2-calc} +%\end{verbatim} +%or using the \pkgopt{calc} package option to \styfmt{datetime2}: +%\begin{verbatim} +%\usepackage[calc]{datetime2} +%\end{verbatim} +%or by using \pkgopt[true]{showdow}: +%\begin{verbatim} +%\usepackage[showdow]{datetime2} +%\end{verbatim} +% +%This package loads the \sty{pgfcalendar} package which provides a +%way of computing the day of week from a given date. Once +%\styfmt{datetime2-calc} has been loaded, you can enable or disable the +%weekday in dates where the style supports this, but note that \emph{not +%all styles support this}, even if the \styfmt{datetime2-calc} package +%has been loaded. +% +%As with the commands in \sectionref{sec:store}, the commands +%described below that save date\slash time information will +%\emph{overwrite} any previously defined date\slash time data with +%the same identifying \meta{name}. However, they may only overwrite +%specific elements of the data (for example, just the year, month, +%day and day of week elements) and leave the other elements +%unchanged. Where the remaining elements are undefined they'll be set to +%zero, except for the day of week element, which will be set to +%\texttt{-1}. +% +%In addition to enabling the weekday calculations, the \styfmt{datetime2-calc} +%package also provides the following commands: +%\begin{definition}[\DescribeMacro\DTMsavejulianday] +%\cs{DTMsavejulianday}\marg{name}\marg{number} +%\end{definition} +%This uses \cs{pgfcalendarjuliantodate} to obtain the year, month and +%day from the given Julian day number and uses +%\cs{pgfcalendarjuliantoweekday} to obtain the day of week and then +%saves it. The date can later be used with commands such as +%\cs{DTMuse}\marg{name} described in \sectionref{sec:store}. +%Example: +%\begin{verbatim} +%\DTMsavejulianday{mydate}{2457023} +%\end{verbatim} +% +%\begin{definition}[\DescribeMacro\DTMsaveddatetojuliandate] +%\cs{DTMsaveddatetojulianday}\marg{name}\marg{register} +%\end{definition} +%This uses \cs{pgfcalendardatetojulian} to convert a previously saved +%date (identified by \meta{name}) to a Julian day. The result is +%stored in \meta{register} which should be a count register (not a +%\LaTeX\ counter name). +%Example: +%\begin{verbatim} +%\newcount\myct +%\DTMsaveddatetojulianday{mydate}{\myct} +%\end{verbatim} +% +%\begin{definition}[\DescribeMacro\DTMsaveddateoffsettojulianday] +%\cs{DTMsaveddateoffsettojulianday}\marg{name}\marg{offset}\marg{register} +%\end{definition} +%This is like the previous command but converts the date obtained by +%incrementing the saved date with \meta{offset}. The result is stored +%in \meta{register}. This is equivalent to +%\begin{quote}\ttfamily +%\cs{pgfcalendardatetojulian}\{\meta{y}-\meta{m}-\meta{d}+\meta{offset}\}\marg{register} +%\end{quote} +%where \meta{y}, \meta{m} and \meta{d} are the year, month and day +%fetched from the saved date. A negative \meta{offset} indicates an earlier +%date. +%Example: +%\begin{verbatim} +%\DTMsaveddateoffsettojulianday{mydate}{2}{\myct} +%\end{verbatim} +%or +%\begin{verbatim} +%\DTMsaveddateoffsettojulianday{mydate}{-7}{\myct} +%\end{verbatim} +% +%\begin{definition}[\DescribeMacro\DTMifdate] +%\cs{DTMifdate}\marg{name}\marg{test}\marg{true}\marg{false} +%\end{definition} +%This is just a convenient interface to \cs{pgfcalendarifdate} +%for a saved date (identified by \meta{name}). The remaining +%arguments are the same as the final three arguments of +%\cs{pgfcalendarifdate}. Note that the +%\texttt{equals}, \texttt{at least}, \texttt{at most} and +%\texttt{between} keywords available in \meta{test} need to be in the +%format specified by the \styfmt{pgf} manual, but remember that you can +%use commands like \cs{DTMfetchyear}. +%Example: +%\begin{verbatim} +%Is \texttt{mydate2} (\DTMusedate{mydate2}) before +%\texttt{mydate} (\DTMusedate{mydate})? +%\DTMifdate +% {mydate2} +% {at most= +% \DTMfetchyear{mydate}-\DTMfetchmonth{mydate}-\DTMfetchday{mydate}} +% {yes}{no}. +%\end{verbatim} +% +%\begin{definition}[\DescribeMacro\DTMsaveddatediff] +%\cs{DTMsavedatediff}\marg{name1}\marg{name2}\marg{register} +%\end{definition} +%Computes the difference (in days) between two saved dates and stores +%the result in the given count register. The first date is identified +%by \meta{name1} and the second date is identified by \meta{name2}. +%The dates are converted to their respective Julian day numbers +%\meta{J1} and \meta{J2} and the result is given by +%\meta{J1}$-$\meta{J2}. +% +%\begin{important} +%Note that the time and zone are not taken into account, even if they +%were provided when the dates were stored. +%\end{important} +%Example: +%\begin{verbatim} +%\DTMsaveddatediff{mydate}{mydate2}{\myct} +% +%\DTMusedate{mydate} is +%\ifnum\myct=0 +% the same day as +%\else +% \ifnum\myct<0 +% \number-\myct\space day\ifnum\myct<-1s\fi\space before +% \else +% \number\myct\space day\ifnum\myct>1s\fi\space after +% \fi +%\fi +%\DTMusedate{mydate2}. +%\end{verbatim} +% +%The \styfmt{datetime2-calc} package also provides commands that convert +%a datetime instance into Zulu\footnote{That's Zulu as in the NATO +%alphabet representation of the letter Z.}\ time (UTC+00:00). +% +%\begin{definition}[\DescribeMacro\DTMsaveaszulutime] +%\cs{DTMsaveaszulutime}\marg{name}\marg{YYYY}\marg{MM}\marg{DD}\marg{hh}\marg{mm}\newline\marg{ss}\marg{TZh}\marg{TZm} +%\end{definition} +%This converts the given datetime instance into UTC+00:00 and saves +%the result. You can then use the date with commands like \cs{DTMuse} +%described in \sectionref{sec:store}. The \meta{name} argument is the +%label identifying the saved data. The other arguments are all +%numbers. +%Example: +%\begin{verbatim} +%\DTMsaveaszulutime{mydate}{2014}{6}{3}{20}{45}{0}{6}{0} +%\end{verbatim} +% +%\begin{definition}[\DescribeMacro\DTMtozulu] +%\cs{DTMtozulu}\marg{name1}\marg{name2} +%\end{definition} +%Uses \cs{DTMsaveaszulutime} to convert the datetime stored in +%\meta{name1} and saves it to \meta{name2}. +%Example: +%\begin{verbatim} +%\DTMsavetimestamp{mydate}{2014-05-01T03:55:00 -06:00} +%Original date: \DTMuse{mydate}. +% +%\DTMtozulu{mydate}{mydate2} +%UTC+00:00: \DTMuse{mydate2}. +%\end{verbatim} +%The above produces (using the \style{default} format): +%\DTMsetstyle{default}% +%\begin{quote} +%\DTMsavetimestamp{mydate}{2014-05-01T03:55:00 -06:00} +%Original date: \DTMuse{mydate}. +% +%\DTMtozulu{mydate}{mydate2} +%UTC+00:00: \DTMuse{mydate2}. +%\end{quote} +% +%The \sty{pgfcalendar} package also provides a variety of useful +%date-related commands. See the documentation (part of the +%\styfmt{pgf} manual) for further details. Note that the language +%modules don't use \sty{pgfcalendar} month and weekday names as the +%\sty{pgfcalendar} package isn't loaded by default and the styles +%need to match the language with the syntax. However, since the +%\styfmt{datetime2-calc} package automatically loads the +%\sty{pgfcalendar} package, as from v1.3 the \styfmt{datetime2-calc} +%provides robust month name and weekday name commands that may be +%used outside of date styles, which fallback on the commands provided +%by \sty{pgfcalendar}. +% +%\begin{important} +%The following commands, which are all robust, should not be used in date +%styles, since each language style must use the name macro for that specific +%language to match the style. Make sure you have the relevant +%language module installed and loaded to allow these commands to work +%correctly. See also \sectionref{sec:names}. Remember that instead of +%these robust commands, you can simply just use the commands provided +%by the \sty{pgfcalendar} package. (See the \styfmt{pgf} manual for +%further details.) +%\end{important} +% +%\begin{definition}[\DescribeMacro\DTMmonthname] +%\cs{DTMmonthname}\marg{n} +%\end{definition} +%This checks if \cs{DTM\meta{lang}monthname} exists where \meta{lang} +%is given by \cs{languagename}. If so, that macro is used. For example: +%\begin{verbatim} +%\documentclass{article} +%\usepackage[english]{babel} +%\usepackage[calc]{datetime2} +%\begin{document} +%\DTMmonthname{12} +%\end{document} +%\end{verbatim} +%Here \cs{languagename} is \texttt{english}, so this +%uses \cs{DTMenglishmonthname} which is defined by the +%\module{english} module. +% +%If the test with \cs{languagename} didn't work, \cs{DTMmonthname} +%then tries with \meta{lang} set to +%\begin{verbatim} +%\TrackedLanguageFromDialect{\languagename} +%\end{verbatim} +%(\cs{TrackedLanguageFromDialect} is provided by the \sty{tracklang} +%package.) If \cs{DTM\meta{lang}monthname} exists, then this command is used. +%For example: +%\begin{verbatim} +%\documentclass{article} +%\usepackage[british]{babel} +%\usepackage[calc]{datetime2} +%\begin{document} +%\DTMmonthname{12} +%\end{document} +%\end{verbatim} +%Here \cs{languagename} is \texttt{british}, so this again uses +%\cs{DTMenglishmonthname} as the root language is obtained from the +%dialect to language mapping. +% +%\begin{important} +%Note that this won't work if you confuse \sty{tracklang} by using an +%alternative dialect name in the class option or by directly loading +%\sty{tracklang} with different dialect labels. +%\end{important} +% +%In the event that neither of those commands exist, +%\cs{DTMmonthname} will fallback on \cs{pgfcalendarmonthname} +%(provided by the \sty{pgfcalendar} package). This will also issue a +%warning. For example: +%\begin{verbatim} +%\documentclass{article} +%\usepackage[calc]{datetime2} +%\begin{document} +%\DTMmonthname{12} +%\end{document} +%\end{verbatim} +%This produces the warning message: +%\begin{verbatim} +%Can't find underlying language macro for +%\DTMmonthname (language: english); +%using pgfcalendar macro instead +%\end{verbatim} +%and uses \cs{pgfcalendarmonthname} instead of +%\cs{DTMenglishmonthname} (which hasn't been defined because the +%\module{english} module \emph{hasn't been loaded}). +% +%You can switch off the warning by setting the \pkgopt{warn} option +%to false or by redefining \cs{dtmnamewarning} to ignore its +%argument. +% +%\begin{definition}[\DescribeMacro\DTMMonthname] +%\cs{DTMMonthname}\marg{n} +%\end{definition} +%This checks if \cs{DTM\meta{lang}Monthname} exists. First where +%\meta{lang} is given by \cs{languagename} and then where \meta{lang} +%is given by +%\begin{verbatim} +%\TrackedLanguageFromDialect{\languagename} +%\end{verbatim} +%If neither of those values of \meta{lang} match a defined command, +%\cs{DTMMonthname} then tests for non-case-changing versions +%\cs{DTM\meta{lang}monthname}. +%This is because not all language modules provide a macro for use at the +%start of a sentence since some languages always start month names +%with a capital letter. For example, the +%\module{english} module provides \cs{DTMenglishmonthname} but +%doesn't provide an upper case alternative, since English month names +%always start with a capital. Therefore: +%\begin{verbatim} +%\documentclass{article} +%\usepackage[english]{babel} +%\usepackage[calc]{datetime2} +%\begin{document} +%\DTMMonthname{12} +%\end{document} +%\end{verbatim} +%just uses \cs{DTMenglishmonthname}. +% +%As before, if the relevant command can't be detected for any case +%of \meta{lang} for either \cs{DTM\meta{lang}Monthname} or +%\cs{DTM\meta{lang}monthname} (for example, the required language module hasn't +%been loaded) then \cs{DTMMonthname} will use +%\cs{pgfcalendarmonthname} and attempt to convert the first letter to +%upper case. +% +%Since some \emph{but not all} language modules also provide month +%name abbreviations, the \styfmt{datetime2-calc} package also provides: +%\begin{definition}[\DescribeMacro\DTMshortmonthname] +%\cs{DTMshortmonthname}\marg{n} +%\end{definition} +%This behaves in a similar way to \cs{DTMmonthname} but tries to +%determine if \cs{DTM\meta{lang}shortmonthname} exists (where +%\meta{lang} is either \cs{languagename} or obtained from +%\cs{languagename} using \sty{tracklang}'s dialect to language +%mapping). If no command can be found, the fallback uses +%\cs{pgfcalendarmonthshortname} provided by the \sty{pgfcalendar} +%package. For example, if the language module hasn't been loaded or +%if the language module doesn't provide an abbreviated version. +% +%Similarly there is a version for the start of a sentence for +%languages that normally use lower case month names: +%\begin{definition}[\DescribeMacro\DTMshortMonthname] +%\cs{DTMshortMonthname}\marg{n} +%\end{definition} +% +%There are also analogous commands for the weekday names, where +%\meta{n} is an integer from 0 (Monday) to 6 (Sunday). This index can +%be computed using: +%\begin{definition}[\DescribeMacro\DTMcomputedayofweekindex] +%\cs{DTMcomputedayofweekindex}\marg{date}\marg{cs} +%\end{definition} +%where \meta{date} is in the form \meta{YYYY}-\meta{MM}-\meta{DD} and +%\meta{cs} is a control sequence in which to store the result. +%Remember that date styles automatically access the day of week index +%from the fourth argument of \cs{DTMdisplaydate}, so this command +%shouldn't be used within a date style. +% +%\begin{definition}[\DescribeMacro\DTMweekdayname] +%\cs{DTMweekdayname}\marg{n} +%\end{definition} +%This checks if \cs{DTM\meta{lang}weekdayname} exists where +%\meta{lang} is given by \cs{languagename}. +%If it does, that macro is used. For example: +%\begin{verbatim} +%\documentclass{article} +%\usepackage[english]{babel} +%\usepackage[calc]{datetime2} +%\begin{document} +%\DTMweekdayname{6} +%\end{document} +%\end{verbatim} +%This uses \cs{DTMenglishweekdayname}, which is provided by the +%\module{english} module. +% +%If \cs{DTM\meta{lang}weekdayname} doesn't exist with \meta{lang} set +%to \cs{languagename}, \cs{DTMweekdayname} then tests with +%\meta{lang} set to: +%\begin{verbatim} +%\TrackedLanguageFromDialect{\languagename} +%\end{verbatim} +%If the command \cs{DTM\meta{lang}weekdayname} exists in this case, that +%command is used. For example: +%\begin{verbatim} +%\documentclass{article} +%\usepackage[british]{babel} +%\usepackage[calc]{datetime2} +%\begin{document} +%\DTMweekdayname{6} +%\end{document} +%\end{verbatim} +%This uses \cs{DTMenglishweekdayname} as it can determine (through +%\sty{tracklang}) that \texttt{british} has been defined as a dialect +%of \texttt{english}. +% +%If this second test fails, then \cs{DTMweekdayname} will issue a +%warning and fallback on \cs{pgfcalendarweekdayname}, provided by the +%\sty{pgfcalendar} package. For example: +%\begin{verbatim} +%\documentclass{article} +%\usepackage[calc]{datetime2} +%\begin{document} +%\DTMweekdayname{6} +%\end{document} +%\end{verbatim} +%This produces the warning message: +%\begin{verbatim} +%Can't find underlying language macro for +%\DTMweekdayname (language: english); +%using pgfcalendar macro instead +%\end{verbatim} +%As before, this warning is produced with \cs{dtmnamewarning}. +% +%The first letter upper case version is: +%\begin{definition}[\DescribeMacro\DTMWeekdayname] +%\cs{DTMWeekdayname}\marg{n} +%\end{definition} +%As with \cs{DTMMonthname}, if no upper case version can be found in +%the relevant language module this will use the non-case-changing +%version. The fallback \sty{pgfcalendar} macro is again +%\cs{pgfcalendarweekdayname} with an attempt to convert the first +%letter to upper case. +% +%Again, abbreviations may or may not be supported by language +%modules. If they're not supported, the fallback is +%\cs{pgfcalendarweekdayshortname}. +% +%\begin{definition}[\DescribeMacro\DTMshortweekdayname] +%\cs{DTMshortweekdayname}\marg{n} +%\end{definition} +%which will attempt to use \cs{DTM\meta{lang}shortweekdayname} and +%\begin{definition}[\DescribeMacro\DTMshortWeekdayname] +%\cs{DTMshortWeekdayname}\marg{n} +%\end{definition} +%which will attempt to use \cs{DTM\meta{lang}shortWeekdayname} or +%\cs{DTM\meta{lang}shortweekdayname}. +% +%For completeness, there's also a language-sensitive date ordinal command: +%\begin{definition}[\DescribeMacro\DTMordinal] +%\cs{DTMordinal}\marg{n} +%\end{definition} +%where \meta{n} is a number from 1 to 31. Again, this shouldn't be +%used in date styles, but only if a standalone date ordinal is required. +%For most languages, this only has a suffix for the first day of the +%month (that is where \meta{n} is 1) or the suffix may simply be a +%full stop (period). It should not be confused with \sty{fmtcount}'s +%\cs{ordinalnum} command, which is for general ordinals rather than +%date-specific ordinals. +% +%\chapter{Migrating from \styfmt{datetime}} +%\label{sec:migrate} +% +%This section is for users who want to switch over from the old +%\styfmt{datetime} package. +% +%Note that \styfmt{datetime2} is modularised for improved efficiency both in +%terms of package overheads and spreading the maintenance load. This +%means that you only need to install \styfmt{datetime2} if you only want +%the base numeric styles, but it you want multilingual or regional +%support, you need to additionally load the required language module +%or modules. +% +%For example, consider the following document that uses +%\styfmt{datetime}: +%\begin{verbatim} +%\documentclass{article} +%\usepackage[T1]{fontenc} +%\usepackage[utf8]{inputenc} +%\usepackage[french]{babel} +%\usepackage{datetime} +%\begin{document} +%\today. +%\end{document} +%\end{verbatim} +%This just needs to have the \styfmt{datetime} package installed, which +%includes the necessary file \texttt{dt-french.def}. +% +%This example can be adjusted for \styfmt{datetime2}: +%\begin{verbatim} +%\documentclass{article} +%\usepackage[T1]{fontenc} +%\usepackage[utf8]{inputenc} +%\usepackage[french]{babel} +%\usepackage[useregional]{datetime2} +%\begin{document} +%\today. +%\end{document} +%\end{verbatim} +%This requires both \styfmt{datetime2} and the \module{french} module, +%so you need to ensure that both have been installed. +% +%The above example also draws attention to another change from +%\styfmt{datetime} and that concerns the default package behaviour. The +%\styfmt{datetime} package defaults to a British date style, unless +%\sty{babel} has been loaded first, whereas the \styfmt{datetime2} +%package defaults to an ISO numeric style, unless language or +%regional settings are provided in the class option. As illustrated +%in the above, you need the \pkgopt{useregional} option if you want +%\cs{datefrench} (or equivalent) to switch the date style. +% +%\section{\styfmt{datetime} package options} +% +%The \styfmt{datetime} package provides the following options, which can +%be emulated with \styfmt{datetime2} or through one of its dependent +%modules or packages: +% +%\begin{description} +%\item[\pkgoptfmt{long}] This option was designed for full British +%dates, and is the default if \sty{babel} isn't loaded. Example: +%\begin{verbatim} +%\documentclass{article} +%\usepackage[long]{datetime} +%\begin{document} +%\today +%\end{document} +%\end{verbatim} +%This produces the date in the form: +%Wednesday 20\textsuperscript{th} January, 2016. +% +%This can be achieved with \styfmt{datetime2} and the \module{english} +%module as follows: +%\begin{verbatim} +%\documentclass{article} +%\usepackage[en-GB,showdow]{datetime2} +%\DTMlangsetup[en-GB]{ord=raise,monthyearsep={,\space}} +%\begin{document} +%\today +%\end{document} +%\end{verbatim} +% +%\item[\pkgoptfmt{short}] This option was designed for abbreviated +%British dates. For example: +%\begin{verbatim} +%\documentclass{article} +%\usepackage[short]{datetime} +%\begin{document} +%\today +%\end{document} +%\end{verbatim} +%This produces the date in the form: +%Wed 20\textsuperscript{th} Jan, 2016 +% +%This can be achieved with \styfmt{datetime2} and the \module{english} +%module as follows: +%\begin{verbatim} +%\documentclass{article} +%\usepackage[en-GB,showdow]{datetime2} +%\DTMlangsetup[en-GB]{abbr,ord=raise,monthyearsep={,\space}} +%\begin{document} +%\today +%\end{document} +%\end{verbatim} +% +%\item[\pkgoptfmt{iso}] This option was designed for +%\meta{YYYY}-\meta{MM}-\meta{DD} dates. For example: +%\begin{verbatim} +%\documentclass{article} +%\usepackage[iso]{datetime} +%\begin{document} +%\today +%\end{document} +%\end{verbatim} +%This produces the date in the form: 2016-01-20. This is default for +%\styfmt{datetime2}: +%\begin{verbatim} +%\documentclass{article} +%\usepackage{datetime2} +%\begin{document} +%\today +%\end{document} +%\end{verbatim} +%If you don't want the style to depend on the separator settings, you +%can use the \style{iso} style: +%\begin{verbatim} +%\documentclass{article} +%\usepackage[style=iso]{datetime2} +%\begin{document} +%\today +%\end{document} +%\end{verbatim} +% +%\item[\pkgoptfmt{yyyymmdd}] This option was designed for +%\meta{YYYY}\slash\meta{MM}\slash\meta{DD} dates. For example: +%\begin{verbatim} +%\documentclass{article} +%\usepackage[yyyymmdd]{datetime} +%\begin{document} +%\today +%\end{document} +%\end{verbatim} +%This produces the date in the form: 2016/01/20. This is very nearly +%in the same form as the default \styfmt{datetime2} style. All that +%needs changing are the separators between the year, month and day: +%\begin{verbatim} +%\documentclass{article} +%\usepackage[datesep=/]{datetime2} +%\begin{document} +%\today +%\end{document} +%\end{verbatim} +% +%\item[\pkgoptfmt{ddmmyyyy}] This option was designed for +%\meta{DD}\slash\meta{MM}\slash\meta{YYYY} dates. For example: +%\begin{verbatim} +%\documentclass{article} +%\usepackage[ddmmyyyy]{datetime} +%\begin{document} +%\today +%\end{document} +%\end{verbatim} +%This produces the date in the form: 20/01/2016. This can be changed +%to \styfmt{datetime2} with a couple of package options: +%\begin{verbatim} +%\documentclass{article} +%\usepackage[datesep=/,style=ddmmyyyy]{datetime} +%\begin{document} +%\today +%\end{document} +%\end{verbatim} +% +%\item[\pkgoptfmt{dmyyyy}] This option was designed for +%\meta{D}\slash\meta{M}\slash\meta{YYYY} dates. For example: +%\begin{verbatim} +%\documentclass{article} +%\usepackage[ddmmyyyy]{datetime} +%\begin{document} +%\today +%\end{document} +%\end{verbatim} +%This produces the date in the form: 20/1/2016. This can be changed +%to \styfmt{datetime2} with a couple of package options: +%\begin{verbatim} +%\documentclass{article} +%\usepackage[datesep=/,style=dmyyyy]{datetime} +%\begin{document} +%\today +%\end{document} +%\end{verbatim} +% +%\item[\pkgoptfmt{ddmmyy}] This option was designed for +%\meta{DD}\slash\meta{MM}\slash\meta{YY} dates. For example: +%\begin{verbatim} +%\documentclass{article} +%\usepackage[ddmmyy]{datetime} +%\begin{document} +%\today +%\end{document} +%\end{verbatim} +%This produces the date in the form: 20/01/16. This can be changed +%to \styfmt{datetime2} with a couple of package options: +%\begin{verbatim} +%\documentclass{article} +%\usepackage[datesep=/,style=ddmmyy]{datetime} +%\begin{document} +%\today +%\end{document} +%\end{verbatim} +% +%\item[\pkgoptfmt{dmyy}] This option was designed for +%\meta{D}\slash\meta{M}\slash\meta{YY} dates. For example: +%\begin{verbatim} +%\documentclass{article} +%\usepackage[dmyy]{datetime} +%\begin{document} +%\today +%\end{document} +%\end{verbatim} +%This produces the date in the form: 20/1/16. This can be changed +%to \styfmt{datetime2} with a couple of package options: +%\begin{verbatim} +%\documentclass{article} +%\usepackage[datesep=/,style=dmyy]{datetime} +%\begin{document} +%\today +%\end{document} +%\end{verbatim} +% +%\item[\pkgoptfmt{text}] This option was designed for a full UK textual +%date. For example: +%\begin{verbatim} +%\documentclass{article} +%\usepackage[text]{datetime} +%\begin{document} +%\today +%\end{document} +%\end{verbatim} +%This produces the date in the form: +%Wednesday the Twentieth of January, Two Thousand and Sixteen +% +%This document can be changed to \styfmt{datetime2} through the +%\sty{datetime2-en-fulltext} package, which needs to be installed +%separately: +%\begin{verbatim} +%\documentclass{article} +%\usepackage{datetime2-en-fulltext} +%\DTMsetdatestyle{en-FullText} +%\begin{document} +%\today +%\end{document} +%\end{verbatim} +% +%\item[\pkgoptfmt{us}] This option was designed for the standard US +%date. For example: +%\begin{verbatim} +%\documentclass{article} +%\usepackage[us]{datetime} +%\begin{document} +%\today +%\end{document} +%\end{verbatim} +%This produces the date in the form: +%January 20, 2016 +% +%This can be achieved with \styfmt{datetime2} and the \module{english} +%module as follows: +%\begin{verbatim} +%\documentclass{article} +%\usepackage[en-US]{datetime2} +%\begin{document} +%\today +%\end{document} +%\end{verbatim} +% +%\item[\pkgoptfmt{mmddyyyy}] This option was designed for +%\meta{MM}\slash\meta{DD}\slash\meta{YYYY} dates. For example: +%\begin{verbatim} +%\documentclass{article} +%\usepackage[mmddyyyy]{datetime} +%\begin{document} +%\today +%\end{document} +%\end{verbatim} +%This produces the date in the form: 01/20/2016. This can be changed +%to \styfmt{datetime2} with a couple of package options: +%\begin{verbatim} +%\documentclass{article} +%\usepackage[datesep=/,style=mmddyyyy]{datetime} +%\begin{document} +%\today +%\end{document} +%\end{verbatim} +% +%\item[\pkgoptfmt{mdyyyy}] This option was designed for +%\meta{M}\slash\meta{D}\slash\meta{YYYY} dates. For example: +%\begin{verbatim} +%\documentclass{article} +%\usepackage[mmddyyyy]{datetime} +%\begin{document} +%\today +%\end{document} +%\end{verbatim} +%This produces the date in the form: 1/20/2016. This can be changed +%to \styfmt{datetime2} with a couple of package options: +%\begin{verbatim} +%\documentclass{article} +%\usepackage[datesep=/,style=mdyyyy]{datetime} +%\begin{document} +%\today +%\end{document} +%\end{verbatim} +% +%\item[\pkgoptfmt{mmddyy}] This option was designed for +%\meta{MM}\slash\meta{DD}\slash\meta{YY} dates. For example: +%\begin{verbatim} +%\documentclass{article} +%\usepackage[mmddyy]{datetime} +%\begin{document} +%\today +%\end{document} +%\end{verbatim} +%This produces the date in the form: 01/20/16. This can be changed +%to \styfmt{datetime2} with a couple of package options: +%\begin{verbatim} +%\documentclass{article} +%\usepackage[datesep=/,style=mmddyy]{datetime} +%\begin{document} +%\today +%\end{document} +%\end{verbatim} +% +%\item[\pkgoptfmt{mdyy}] This option was designed for +%\meta{M}\slash\meta{D}\slash\meta{YY} dates. For example: +%\begin{verbatim} +%\documentclass{article} +%\usepackage[mdyy]{datetime} +%\begin{document} +%\today +%\end{document} +%\end{verbatim} +%This produces the date in the form: 1/20/16. This can be changed +%to \styfmt{datetime2} with a couple of package options: +%\begin{verbatim} +%\documentclass{article} +%\usepackage[datesep=/,style=mdyy]{datetime} +%\begin{document} +%\today +%\end{document} +%\end{verbatim} +% +%\item[\pkgoptfmt{raise}] This option was designed to make the ordinal +%st,nd,rd,th appear as a subscript. It was originally just intended for British +%dates. This is one of the default settings for \styfmt{datetime}. For example: +%\begin{verbatim} +%\documentclass{article} +%\usepackage[raise]{datetime} +% +%\begin{document} +%\today +%\end{document} +%\end{verbatim} +%This produces the date in the form: +%Wednesday 20\textsuperscript{th} January, 2016 +% +%With \styfmt{datetime2}, this setting \emph{may} be provided by a language +%module, where appropriate. For example: +%\begin{verbatim} +%\documentclass{article} +%\usepackage[en-GB,showdow]{datetime2} +%\DTMlangsetup[en-GB]{ord=raise} +% +%\begin{document} +%\today +%\end{document} +%\end{verbatim} +% +%\item[\pkgoptfmt{level}] This option was designed to make the ordinal +%st,nd,rd,th appear level with the rest of the text (to counteract +%the previous option). For example: +%\begin{verbatim} +%\documentclass{article} +%\usepackage[level]{datetime} +% +%\begin{document} +%\today +%\end{document} +%\end{verbatim} +%This produces the date in the form: Wednesday 20th January, 2016 +% +%With \styfmt{datetime2} this setting may be provided by a language +%module, where appropriate. This is, in fact, the default setting for +%the \style{en-GB} style: +%\begin{verbatim} +%\documentclass{article} +%\usepackage[en-GB,showdow]{datetime2} +% +%\begin{document} +%\today +%\end{document} +%\end{verbatim} +%but can be explicitly set using: +%\begin{verbatim} +%\DTMlangsetup[en-GB]{ord=level} +%\end{verbatim} +% +%\item[\pkgoptfmt{dayofweek}] This option was designed to show the +%weekday name for those styles that supported it. This is one of the +%default \styfmt{datetime} settings. For example: +%\begin{verbatim} +%\documentclass{article} +%\usepackage[dayofweek]{datetime} +% +%\begin{document} +%\today +%\end{document} +%\end{verbatim} +%This produces the date in the form: +%Wednesday 20\textsuperscript{th} January, 2016 +% +%With \styfmt{datetime2} this setting \emph{may} be provided by a language +%module, where supported. For example: +%\begin{verbatim} +%\documentclass{article} +%\usepackage[en-GB,showdow]{datetime2} +% +%\begin{document} +%\today +%\end{document} +%\end{verbatim} +%Some language modules don't support this option (just as some +%language settings with \styfmt{datetime} also don't support the +%\pkgoptfmt{dayofweek} option.) +% +%\item[\pkgoptfmt{nodayofweek}] This option was designed to hide the +%weekday name for those styles that supported it (to counteract the +%previous option). For example: +%\begin{verbatim} +%\documentclass{article} +%\usepackage[nodayofweek]{datetime} +% +%\begin{document} +%\today +%\end{document} +%\end{verbatim} +%This produces the date in the form: +%20\textsuperscript{th} January, 2016 +% +%This setting is the default for \styfmt{datetime2}. +%However, if it \pkgopt{showdow} has been switched on, it can later +%be switched off using +%\begin{verbatim} +%\DTMsetup{showdow=false} +%\end{verbatim} +% +%\item[\pkgoptfmt{hhmmss}] This option was designed for time formats in +%the style \meta{HH}:\meta{MM}:\meta{SS}. For example: +%\begin{verbatim} +%\documentclass{article} +%\usepackage[hhmmss]{datetime} +% +%\begin{document} +%\currenttime +%\end{document} +%\end{verbatim} +%This produces the time in the form: 17:28:52. +% +%This is the default for \styfmt{datetime2}: +%\begin{verbatim} +%\documentclass{article} +%\usepackage{datetime2} +% +%\begin{document} +%\DTMcurrenttime +%\end{document} +%\end{verbatim} +% +%\item[\pkgoptfmt{24hr}] This option was designed for 24 hour time formats in +%the style \meta{HH}:\meta{MM}. For example: +%\begin{verbatim} +%\documentclass{article} +%\usepackage[24hr]{datetime} +% +%\begin{document} +%\currenttime +%\end{document} +%\end{verbatim} +%This produces the time in the form: 17:28. +% +%This can be achieved using the default \styfmt{datetime2} time style +%with the seconds suppressed: +%\begin{verbatim} +%\documentclass{article} +%\usepackage[showseconds=false]{datetime2} +% +%\begin{document} +%\DTMcurrenttime +%\end{document} +%\end{verbatim} +% +%\item[\pkgoptfmt{12hr}] This option was designed for 12 hour time +%formats with \qt{am} or \qt{pm} suffixes. For example: +%\begin{verbatim} +%\documentclass{article} +%\usepackage[12hr]{datetime} +% +%\begin{document} +%\currenttime +%\end{document} +%\end{verbatim} +%This produces the time in the form: 5:28pm. +% +%This can be achieved through a \styfmt{datetime2} language module that +%supports this format. For example, the \module{english} module: +%\begin{verbatim} +%\documentclass{article} +%\usepackage[en-GB]{datetime2} +% +%\begin{document} +%\DTMcurrenttime +%\end{document} +%\end{verbatim} +% +%\item[\pkgoptfmt{oclock}] This option was designed for a UK-style full text +%time. For example: +%\begin{verbatim} +%\documentclass{article} +%\usepackage[oclock]{datetime} +% +%\begin{document} +%\currenttime +%\end{document} +%\end{verbatim} +%This produces the time in the form: +%Twenty minutes past Six in the afternoon +% +%This can be changed to \styfmt{datetime2} through the +%\sty{datetime2-en-fulltext} package, which needs to be installed +%separately: +%\begin{verbatim} +%\documentclass{article} +%\usepackage{datetime2-en-fulltext} +%\DTMsettimestyle{en-FullText} +%\begin{document} +%\DTMcurrenttime +%\end{document} +%\end{verbatim} +% +%\end{description} +% +%The \styfmt{datetime} package option \pkgoptfmt{nodate} was provided +%before multilingual support was added to allow \sty{babel} users to +%use the time commands without causing a conflict with the date. Once +%support for the \sty{babel} package was added, this option became +%superfluous. +% +%\section{Time and Date Commands} +% +%\begin{definition} +%\ics{today} +%\end{definition} +%This is a robust command in later versions of \styfmt{datetime}. In +%earlier versions is was fragile and had to be protected when used in +%moving arguments. With \styfmt{datetime2}, this command is designed to +%be expandable and so therefore is not robust and shouldn't need +%protecting. (The date styles should take care of any fragile +%commands, such as \cs{textsuperscript}, where necessary.) +% +%The current time is displayed with \styfmt{datetime} using +%\begin{definition}[\inpkg{datetime}] +%\oldcs{currenttime} +%\end{definition} +%The \styfmt{datetime2} equivalent is: +%\begin{definition}[\inpkg{datetime2}] +%\ics{DTMcurrenttime} +%\end{definition} +%Again, the command provided by \styfmt{datetime} is robust and the +%equivalent command provided by \styfmt{datetime2} is designed to be +%expandable. +% +%A specific date is display by \styfmt{datetime}'s +%\begin{definition}[\inpkg{datetime}] +%\oldcs{formatdate}\marg{DD}\marg{MM}\marg{YYYY} +%\end{definition} +%command. The arguments are in little-endian (UK) order with the day, +%month and year. With \styfmt{datetime2} you can use either: +%\begin{definition}[\inpkg{datetime2}] +%\ics{DTMdisplay}\marg{YYYY}\marg{MM}\marg{DD}\marg{dow} +%\end{definition} +%(expandable) or +%\begin{definition}[\inpkg{datetime2}] +%\ics{DTMdate}\{\meta{YYYY}-\meta{MM}-\meta{DD}\} +%\end{definition} +%(robust) where \meta{YYYY} is the year, \meta{MM} is the month +%number, \meta{DD} is the day of month number and \meta{dow} is the +%day of week number (starting from 0 for Monday) or \texttt{-1} to +%disregard it. +% +%A specific time is displayed by \styfmt{datetime}'s +%\begin{definition}[\inpkg{datetime}] +%\oldcs{formattime}\marg{hh}\marg{mm}\marg{ss} +%\end{definition} +%command, which has three arguments: the hour (24) the minutes past +%the hour and the seconds past the minute. With \styfmt{datetime2} you +%can use either: +%\begin{definition}[\inpkg{datetime2}] +%\ics{DTMdisplaytime}\marg{hh}\marg{mm}\marg{ss} +%\end{definition} +%(expandable) or +%\begin{definition}[\inpkg{datetime2}] +%\ics{DTMtime}\{\meta{hh}:\meta{mm}:\meta{ss}\} +%\end{definition} +%(robust) where \meta{hh} is the hour, \meta{mm} is the minutes and +%\meta{ss} is the seconds. +% +%The date separator used by the predefined \styfmt{datetime} styles is +%given by +%\begin{definition}[\inpkg{datetime}] +%\oldcs{dateseparator} +%\end{definition} +%which needs to be redefined if +%required. With \styfmt{datetime2}, the date separator for the base +%numeric styles (except the fixed \style{iso} style) can be changed +%through the \pkgopt{datesep} package option. For example: +%\begin{verbatim} +%\usepackage[datesep={.}]{datetime2} +%\end{verbatim} +%or +%\begin{verbatim} +%\DTMsetup{datesep={.}} +%\end{verbatim} +%Some of the language modules may also provide a similar option. For +%example: +%\begin{verbatim} +%\usepackage[en-GB]{datetime2} +%\DTMlangsetup[en-GB]{datesep={.}} +%\end{verbatim} +% +%The time separator for \styfmt{datetime} is given by +%\begin{definition}[\inpkg{datetime}] +%\oldcs{timeseparator} +%\end{definition} +%With \styfmt{datetime2}, the time separator for the +%basic numeric styles (not including the fixed \style{iso} style) can be +%changed through the \pkgopt{timesep} package option. For example: +%\begin{verbatim} +%\usepackage[timesep={.}]{datetime2} +%\end{verbatim} +%or +%\begin{verbatim} +%\usepackage{datetime2} +%\DTMsetup{timesep={.}} +%\end{verbatim} +%Some of the language modules may also provide a similar option. For +%example: +%\begin{verbatim} +%\usepackage[en-GB]{datetime2} +%\DTMlangsetup[en-GB]{timesep={.}} +%\end{verbatim} +% +%\begin{definition}[\inpkg{datetime}] +%\oldcs{pdfdate} +%\end{definition} +%The \cs{pdfdate} command provided by \styfmt{datetime} for use within +%\ics{pdfinfo} became redundant with the introduction of +%\ics{pdfcreationdate} to PDF\TeX\ version 1.30.0. +% +%Old style (using \styfmt{datetime}): +%\begin{verbatim} +%\pdfinfo{ +% /Author (Me) +% /Title (A Sample Document) +% /CreationDate (D:20040501215500) +% /ModDate (D:\pdfdate) +%} +%\end{verbatim} +%New style (simply using PDF\TeX): +%\begin{verbatim} +%\pdfinfo{ +% /Author (Me) +% /Title (A Sample Document) +% /CreationDate (D:20040501215500) +% /ModDate (\pdfcreationdate) +%} +%\end{verbatim} +%Alternatively you can use the \style{pdf} style: +%\begin{verbatim} +%\DTMsetstyle{pdf} +%\pdfinfo{ +% /Author (Me) +% /Title (A Sample Document) +% /CreationDate (\DTMdisplay{2004}{05}{01}{-1}{21}{55}{00}{00}{00}) +% /ModDate (\DTMnow) +%} +%\end{verbatim} +% +%The \styfmt{datetime} command to display the month name is +%\begin{definition}[\inpkg{datetime}] +%\oldcs{monthname}\oarg{n} +%\end{definition} +%which can't be expanded. With +%\styfmt{datetime2}, the month name for a specific language can be +%obtained from a command provided by the relevant module. For +%example, the \module{english} module provides +%\begin{definition}[\inpkg{datetime2-english}] +%\ics{DTMenglishmonthname}\marg{n} +%\end{definition} +%which is expandable. These types of commands are designed for use +%within language-dependent date styles. This ensures that the name +%matches the style. (One of the failings of \styfmt{datetime} was that +%the original date styles provided when the package was originally +%only intended for British dates produced weird hybrid styles when +%multilingual support was later added and styles such as \pkgoptfmt{long} +%were used with another language.) These types of commands provided +%by the \styfmt{datetime2} language modules are analogous to the +%\cs{monthname\meta{language}} commands provided by \styfmt{datetime}'s +%supporting language files (for example, +%\begin{definition}[\inpkg{datetime-defaults}] +%\oldcs{monthnameenglish}\oarg{n} +%\end{definition} +%in \styfmt{datetime-defaults} or +%\begin{definition}[\inpkg{dt-french.def}] +%\oldcs{monthnamefrench}\oarg{n} +%\end{definition} +%defined in \styfmt{dt-french.def}) except that the \styfmt{datetime} commands have +%an optional argument which means they're not expandable. +% +%If you load the \styfmt{datetime2-calc} package, +%either explicitly or through the \pkgopt{calc} or \pkgopt{showdow} +%\styfmt{datetime2} package options, then \sty{pgfcalendar} will also be +%loaded. In which case you can use +%\begin{definition}[\inpkg{pgfcalendar}] +%\ics{pgfcalendarmonthname}\marg{n} +%\end{definition} +%even if none of the \styfmt{datetime2} language modules have been +%loaded. This command requires the \sty{translator} package to +%provide multilingual support. See the \styfmt{pgf} manual for further +%details. +% +%Another possibility if you want the month name alone using the +%current language is to use the robust command +%\begin{definition}[\inpkg{datetime2-calc}] +%\ics{DTMmonthname}\marg{n} +%\end{definition} +%defined by \styfmt{datetime2-calc}. This is the closest match to +%\styfmt{datetime}'s \oldcs{monthname} command but note that the argument +%isn't optional. Remember that you can use \ics{month} for the current +%month number, which is the value of \meta{n} when omitted in +%\oldcs{monthname}. +% +%Old style (\styfmt{datetime}): +%\begin{verbatim} +%\documentclass{article} +% +%\usepackage[T1]{fontenc} +%\usepackage[utf8]{inputenc} +%\usepackage[french,english]{babel} +% +%\usepackage{datetime} +% +%\begin{document} +%\selectlanguage{french} +%\monthname +% +%\selectlanguage{english} +%\monthname +%\end{document} +%\end{verbatim} +%New style (\styfmt{datetime2} with the \module{french} and +%\module{english} modules): +%\begin{verbatim} +%\documentclass{article} +% +%\usepackage[T1]{fontenc} +%\usepackage[utf8]{inputenc} +%\usepackage[french,english]{babel} +% +%\usepackage[calc]{datetime2} +% +%\begin{document} +%\selectlanguage{french} +%\DTMmonthname{\month} +% +%\selectlanguage{english} +%\DTMmonthname{\month} +%\end{document} +%\end{verbatim} +% +%The abbreviated month name is given by +%\begin{definition}[\inpkg{datetime}] +%\oldcs{shortmonthname}\oarg{n} +%\end{definition} +%in +%\styfmt{datetime}. Similar to above, language modules may provide an +%expandable command to produce the abbreviated name in that specific +%language. For example, the \module{english} module provides +%\begin{definition}[\inpkg{datetime2-english}] +%\ics{DTMenglishshortmonthname}\marg{n} +%\end{definition} +%As with \cs{DTMenglishmonthname}, this is designed for use in +%English date styles. +% +%Again, if \styfmt{datetime2-calc} is loaded, the \sty{pgfcalendar} +%command is also available: +%\begin{definition}[\inpkg{pgfcalendar}] +%\ics{pgfcalendarmonthshortname}\marg{n} +%\end{definition} +%Alternative you can use the robust command defined by +%\styfmt{datetime2-calc}: +%\begin{definition}[\inpkg{datetime2-calc}] +%\ics{DTMshortmonthname}\marg{n} +%\end{definition} +% +%Old style (\styfmt{datetime}): +%\begin{verbatim} +%\documentclass{article} +% +%\usepackage[T1]{fontenc} +%\usepackage[utf8]{inputenc} +%\usepackage[french,english]{babel} +% +%\usepackage{datetime} +% +%\begin{document} +%\selectlanguage{french} +%\shortmonthname +% +%\selectlanguage{english} +%\shortmonthname +%\end{document} +%\end{verbatim} +%New style (\styfmt{datetime2} with the \module{french} and +%\module{english} modules): +%\begin{verbatim} +%\documentclass{article} +% +%\usepackage[T1]{fontenc} +%\usepackage[utf8]{inputenc} +%\usepackage[french,english]{babel} +% +%\usepackage[calc]{datetime2} +% +%\begin{document} +%\selectlanguage{french} +%\DTMshortmonthname{\month} +% +%\selectlanguage{english} +%\DTMshortmonthname{\month} +%\end{document} +%\end{verbatim} +% +%See \sectionref{sec:calc} and \sectionref{sec:names} for further +%details. +% +%The weekday names in \styfmt{datetime} are more complicated +%and not all the \texttt{dt-\meta{lang}.def} files provide translations. The ones +%that do support the weekday provide +%\begin{definition}[\inpkg{dt-\meta{lang}.def}] +%\oldcs{dayofweeknameid\meta{lang}}\marg{n} +%\end{definition} +%which takes a single argument that's an integer from 1 (Sunday) to 7 (Saturday). +%For example, +%\begin{definition}[\inpkg{datetime-defaults}] +%\oldcs{dayofweeknameidenglish}\marg{n} +%\end{definition} +%or +%\begin{definition}[\inpkg{dt-french.def}] +%\oldcs{dayofweeknameidfrench}\marg{n} +%\end{definition} +% +%The \styfmt{datetime2} language modules that support the weekday name +%provide +%\begin{definition}[\inpkg{datetime2-\meta{lang}}] +%\cs{DTM\meta{lang}weekdayname}\marg{dow} +%\end{definition} +%which takes a single argument that's an integer from 0 (Monday) to 6 +%(Sunday). As with \styfmt{datetime}, not all of the \styfmt{datetime2} +%language modules support the weekday. +% +%Old style (\styfmt{datetime}): +%\begin{verbatim} +%\documentclass{article} +%\usepackage[T1]{fontenc} +%\usepackage[utf8]{inputenc} +%\usepackage[french,english]{babel} +%\usepackage{datetime} +% +%\begin{document} +%\dayofweeknameidfrench{1} +% +%\dayofweeknameidenglish{1} +%\end{document} +%\end{verbatim} +%New style (\styfmt{datetime2} with the \module{english} and +%\module{french} modules): +%\begin{verbatim} +%\documentclass{article} +%\usepackage[T1]{fontenc} +%\usepackage[utf8]{inputenc} +%\usepackage[french,english]{babel} +%\usepackage{datetime2} +% +%\begin{document} +%\DTMfrenchweekdayname{6} +% +%\DTMenglishweekdayname{6} +%\end{document} +%\end{verbatim} +% +%As with the month name, date styles should explicitly use the +%weekday macro (if provided) for the specific language to display +%the weekday name rather than using a macro that varies according to +%the current language. +% +%The \styfmt{datetime} package provides +%\begin{definition}[\inpkg{datetime}] +%\oldcs{dayofweeknameid}\marg{n} +%\end{definition} +%to provide the weekday name for the current language. If the current language +%doesn't provide a translation for the weekday names, then the +%English names are used. This command basically attempts to use +%\cs{dayofweeknameid\meta{lang}} (where \meta{lang} is given +%by \cs{languagename}) if it exists otherwise it uses +%\oldcs{dayofweeknameidenglish}. This language-sensitive macro is a fragile +%command that requires protection in moving arguments. +% +%As before, if the \styfmt{datetime2-calc} package is loaded, the +%\sty{pgfcalendar} package's commands are also available including +%\begin{definition}[\inpkg{pgfcalendar}] +%\ics{pgfcalendarweekdayname}\marg{dow} +%\end{definition} +%where the argument \meta{dow} is an integer from 0 (Monday) to 6 +%(Sunday). Multilingual support is provided through the +%\sty{translator} package. +% +%The \styfmt{datetime2-calc} package also provides a robust +%language-sensitive command: +%\begin{definition}[\inpkg{datetime2-calc}] +%\ics{DTMweekdayname}\marg{dow} +%\end{definition} +%This attempts to use \cs{DTM\meta{lang}weekdayname} if it exists, +%where \meta{lang} is either \cs{languagename} or obtained from the +%dialect-to-language mapping provided by \sty{tracklang}. If both +%attempts fail, \cs{DTMweekdayname} will fallback on +%\cs{pgfcalendarweekdayname} (with a warning through +%\ics{dtmnamewarning}). +% +%Old style (\styfmt{datetime}): +%\begin{verbatim} +%\documentclass{article} +%\usepackage[T1]{fontenc} +%\usepackage[utf8]{inputenc} +%\usepackage[french,english]{babel} +% +%\usepackage{datetime} +% +%\begin{document} +% +%\selectlanguage{french} +%\dayofweeknameid{1} +% +%\selectlanguage{english} +%\dayofweeknameid{1} +%\end{document} +%\end{verbatim} +%New style (\styfmt{datetime2} with the \module{english} and +%\module{french} modules): +%\begin{verbatim} +%\documentclass{article} +%\usepackage[T1]{fontenc} +%\usepackage[utf8]{inputenc} +%\usepackage[french,english]{babel} +% +%\usepackage[calc]{datetime2} +% +%\begin{document} +% +%\selectlanguage{french} +%\DTMweekdayname{6} +% +%\selectlanguage{english} +%\DTMweekdayname{6} +%\end{document} +%\end{verbatim} +% +%The \styfmt{datetime} package also provides the command +%\begin{definition}[\inpkg{datetime}] +%\oldcs{dayofweekname}\marg{DD}\marg{MM}\marg{YYYY} +%\end{definition} +%that has three arguments: the day of the month, +%the month number and the year. This calculates the day of week +%index \meta{n}, an integer from 1 (Sunday) to 7 (Saturday), and then uses the +%result in the argument of \oldcs{dayofweeknameid}\marg{n}. The +%\cs{dayofweekname} command was provided by \styfmt{datetime} as a +%convenient shortcut for use in date styles. (Similarly for +%\oldcs{shortdayofweekname}.) With the \styfmt{datetime2} date styles, the +%day-of-week index is automatically available through the fourth +%argument of \ics{DTMdisplaydate} (and \ics{DTMDisplaydate}), so there +%is little use for an equivalent command. Additionally, if a date has +%already been saved with \styfmt{datetime2}, the weekday can be +%extracted from the saved data through \ics{DTMfetchdow}, which can be +%used in the argument of commands like \ics{DTMweekdayname} or +%\ics{DTMenglishweekdayname}. +% +%However, if a calculation is required for some reason, it can be +%obtained using the \sty{pgfcalendar} commands +%\ics{pgfcalendardatetojulian} and \ics{pgfcalendarjuliantoweekday}, +%which are described in the \styfmt{pgf} manual. +% +%The \styfmt{datetime} package provides the conditional +%\begin{definition}[\inpkg{datetime}] +%\oldcs{ifshowdow} +%\end{definition} +%which can be used to determine whether or not styles should display +%the weekday name (if supported). The \styfmt{datetime2} package has the +%analogous conditional +%\begin{definition}[\inpkg{datetime2}] +%\ics{ifDTMshowdow} +%\end{definition} +% +%The \styfmt{datetime} package provides the command +%\begin{definition}[\inpkg{datetime}] +%\oldcs{ordinaldate}\marg{n} +%\end{definition} +%as a date-type ordinal where the argument should be an integer from 1 +%to 31. For English, this just uses \sty{fmtcount}'s +%non-expandable \cs{ordinalnum} command. For Breton, Welsh and French +%a suffix is only added when the argument is 1. For all other +%languages, this command just displays the number. +% +%With \styfmt{datetime2}, the language modules may or may not provide a +%command to display the ordinal but most of them do. For example, the +%\module{english} module provides +%\begin{definition}[\inpkg{datetime2-english}] +%\ics{DTMenglishordinal}\marg{n} +%\end{definition} +%This displays the suffix using +%\begin{definition}[\inpkg{datetime2-english}] +%\ics{DTMenglishfmtordsuffix}\marg{suffix} +%\end{definition} +%The definition of this command is changed by the styles provided by +%the English regional modules. For example, the \style{en-US} style +%redefines \cs{DTMenglishfmtordsuffix} to ignore its argument. +%See the documentation for the \module{english} module for further +%details. +% +%The \module{french} module provides: +%\begin{definition}[\inpkg{datetime2-french}] +%\ics{DTMfrenchordinal}\marg{n} +%\end{definition} +%This displays \meta{n} and if \meta{n} is 1, a suffix is appended. +%See the \module{french} module documentation for further details. +% +%The \module{breton} module provides: +%\begin{definition}[\inpkg{datetime2-breton}] +%\ics{DTMbretonordinal}\marg{n} +%\end{definition} +%which similarly appends a suffix if \meta{n} is 1 but not for other +%values. In this case, the suffix for the first day is formatted using +%\begin{definition}[\inpkg{datetime2-breton}] +%\ics{DTMbretonfmtordinal}\marg{suffix} +%\end{definition} +%which is redefined by the \csopt{DTMlangsetup}{ord} option. +%See the \module{breton} module documentation for further details. +% +%The \module{welsh} module similarly provides: +%\begin{definition}[\inpkg{datetime2-welsh}] +%\ics{DTMwelshordinal}\marg{n} +%\end{definition} +%and +%\begin{definition}[\inpkg{datetime2-welsh}] +%\ics{DTMwelshfmtordinal}\marg{suffix} +%\end{definition} +%See the \module{welsh} module documentation for further details. +% +%Other modules may simply define \cs{DTM\meta{lang}ordinal} to just +%display its argument. For example, the \module{german} module +%provides +%\begin{definition}[\inpkg{datetime2-german}] +%\ics{DTMgermanordinal}\marg{n} +%\end{definition} +%which just displays \meta{n} (the day of month number). +% +%Alternatively, modules may define \cs{DTM\meta{lang}ordinal} to +%display its argument followed by a full stop (period). For example, +%the \module{norsk} module provides +%\begin{definition}[\inpkg{datetime2-norsk}] +%\ics{DTMnorskordinal}\marg{n} +%\end{definition} +%which displays \meta{n} followed by a full stop. +% +%As before, the date styles should explicitly use the ordinal macro +%that matches the style. However, if you have some need to display +%the day of month independent of any of the styles, you can use +%\begin{definition}[\inpkg{datetime2-calc}] +%\ics{DTMordinal}\marg{n} +%\end{definition} +%which is provided by \styfmt{datetime2-calc}. This attempts to use +%\cs{DTM\meta{lang}ordinal} if it exists, otherwise it just displays +%\meta{n}. +% +%Old style (\styfmt{datetime}): +%\begin{verbatim} +%\documentclass{article} +%\usepackage[T1]{fontenc} +%\usepackage[utf8]{inputenc} +%\usepackage[french,english]{babel} +% +%\usepackage{datetime} +% +%\begin{document} +% +%\selectlanguage{french} +%\ordinaldate{1} +% +%\selectlanguage{english} +%\ordinaldate{1} +%\end{document} +%\end{verbatim} +%This displays 1\textsuperscript{er} in the first case (through +%\cs{ordinaldatefrench}) and +%1\textsuperscript{st} in the second case (through \sty{fmtcount}'s +%\cs{ordinalnum}). +% +%New style (\styfmt{datetime2} with the \module{english} and +%\module{french} modules): +%\begin{verbatim} +%\documentclass{article} +%\usepackage[T1]{fontenc} +%\usepackage[utf8]{inputenc} +%\usepackage[french,english]{babel} +% +%\usepackage[calc]{datetime2} +% +%\begin{document} +% +%\selectlanguage{french} +%\DTMordinal{1} +% +%\selectlanguage{english} +%\DTMordinal{1} +%\end{document} +%\end{verbatim} +%This displays 1\textsuperscript{er} in the first case and +%just 1 in the second case, because the regionless \module{english} +%module doesn't use a suffix. +% +%To achieve the same result as the \styfmt{datetime} example, a few +%modifications are needed: +%\begin{verbatim} +%\documentclass{article} +%\usepackage[T1]{fontenc} +%\usepackage[utf8]{inputenc} +%\usepackage[french,british]{babel} +% +%\usepackage[calc,useregional]{datetime2} +%\DTMlangsetup[en-GB]{ord=raise} +% +%\begin{document} +% +%\selectlanguage{french} +%\DTMordinal{1} +% +%\selectlanguage{british} +%\DTMordinal{1} +%\end{document} +%\end{verbatim} +% +%The \styfmt{datetime} package provides the command +%\begin{definition}[\inpkg{datetime}] +%\oldcs{twodigit}\marg{n} +%\end{definition} +%for use in date styles that require two-digit +%numbers. The \styfmt{datetime2} package provides +%\begin{definition}[\inpkg{datetime2}] +%\ics{DTMtwodigits}\marg{n} +%\end{definition} +% +%\section{Saving Dates} +% +%The \styfmt{datetime} package provides some commands for saving a date +%for later use. (There are no equivalent commands for saving a time +%in \styfmt{datetime}.) +%With \styfmt{datetime}, a date is saved using +%\begin{definition}[\inpkg{datetime}] +%\oldcs{newdate}\marg{name}\marg{DD}\marg{MM}\marg{YYYY} +%\end{definition} +%With \styfmt{datetime2}, a date can be saved using +%\begin{definition}[\inpkg{datetime2}] +%\ics{DTMsavedate}\marg{name}\marg{date} +%\end{definition} +%where \meta{date} is in the form +%\texttt{\meta{YYYY}-\meta{MM}-\meta{DD}}. +% +%A previously saved date can be displayed with \styfmt{datetime} using: +%\begin{definition}[\inpkg{datetime}] +%\oldcs{displaydate}\marg{name} +%\end{definition} +%With \styfmt{datetime2}, the saved date can be displayed using: +%\begin{definition}[\inpkg{datetime2}] +%\ics{DTMusedate}\marg{name} +%\end{definition} +% +%Old style (\styfmt{datetime}): +%\begin{verbatim} +%\documentclass{article} +%\usepackage{datetime} +% +%\begin{document} +% +%\newdate{mydate}{20}{1}{2016} +%\displaydate{mydate} +% +%\end{document} +%\end{verbatim} +%New style (\styfmt{datetime2}): +%\begin{verbatim} +%\documentclass{article} +%\usepackage[en-GB,showdow]{datetime2} +% +%\begin{document} +% +%\DTMsavedate{mydate}{2016-01-20} +%\DTMusedate{mydate} +% +%\end{document} +%\end{verbatim} +% +%Individual elements of the date can be extracted with the +%\styfmt{datetime} commands: +%\begin{definition}[\inpkg{datetime}] +%\oldcs{getdateday}\marg{name} +%\end{definition} +%for the day of the month, +%\begin{definition}[\inpkg{datetime}] +%\oldcs{getdatemonth}\marg{name} +%\end{definition} +%for the month number, and +%\begin{definition}[\inpkg{datetime}] +%\oldcs{getdateyear}\marg{name} +%\end{definition} +%for the year. +% +%These elements can be fetched in \styfmt{datetime2} using: +%\begin{definition}[\inpkg{datetime2}] +%\ics{DTMfetchday}\marg{name} +%\end{definition} +%for the day of the month, +%\begin{definition}[\inpkg{datetime2}] +%\ics{DTMfetchmonth}\marg{name} +%\end{definition} +%for the month number, and +%\begin{definition}[\inpkg{datetime2}] +%\ics{DTMfetchyear}\marg{name} +%\end{definition} +%for the year. Additionally you can fetch the day of week index if it +%has been computed: +%\begin{definition}[\inpkg{datetime2}] +%\ics{DTMfetchdow}\marg{name} +%\end{definition} +% +%Old style (\styfmt{datetime}): +%\begin{verbatim} +%\documentclass{article} +% +%\usepackage{datetime} +% +%\begin{document} +% +%\newdate{mydate}{20}{1}{2016} +% +%Year: \getdateyear{mydate}. +%Month: \getdatemonth{mydate}. +%Day: \getdateday{mydate}. +% +%\end{document} +%\end{verbatim} +%New style (\styfmt{datetime2}): +%\begin{verbatim} +%\documentclass{article} +% +%\usepackage{datetime2} +% +%\begin{document} +% +%\DTMsavedate{mydate}{2016-01-20} +% +%Year: \DTMfetchyear{mydate}. +%Month: \DTMfetchmonth{mydate}. +%Day: \DTMfetchday{mydate}. +% +%\end{document} +%\end{verbatim} +% +%With \styfmt{datetime2}, you can also save the current time (as in the +%time of the document build) with +%\begin{definition}[\inpkg{datetime2}] +%\ics{DTMsavenow}\marg{name} +%\end{definition} +%and then access each field of the date, time and zone. +% +%Old style (\styfmt{datetime}): +%\begin{verbatim} +%\documentclass{article} +% +%\usepackage{datetime} +% +%\begin{document} +% +%Year: \number\year. +%Month: \number\month. +%Day: \number\day. +%DOW: \computedayofweek{\day}{\month}{\year}\number\dayofweek. +% +%Hour: \number\currenthour. +%Minute: \number\currentminute. +%Second: \number\currentsecond. +% +%\end{document} +%\end{verbatim} +%New style (\styfmt{datetime2}): +%\begin{verbatim} +%\documentclass{article} +% +%\usepackage[calc]{datetime2} +% +%\begin{document} +%\DTMsavenow{now} +% +%Year: \DTMfetchyear{now}. +%Month: \DTMfetchmonth{now}. +%Day: \DTMfetchday{now}. +%DOW: \DTMfetchdow{now}. +% +%Hour: \DTMfetchhour{now}. +%Minute: \DTMfetchminute{now}. +%Second: \DTMfetchsecond{now}. +% +%Time Zone Hour: \DTMfetchTZhour{now}. +%Time Zone Minute: \DTMfetchTZminute{now}. +% +%\end{document} +%\end{verbatim} +%(Note that the day of week index is different as \styfmt{datetime2} +%uses the same indexing system as \sty{pgfcalendar}.) +% +%\section{Multilingual Support} +% +%The \styfmt{datetime} package comes with the following files (in +%addition to \texttt{datetime.sty} and +%\texttt{datetime-defaults.sty}): +% +%\begin{center} +%\begin{tabular}{llll} +%\texttt{dt-american.def} & \texttt{dt-dutch.def} & \texttt{dt-lsorbian.def} & \texttt{dt-slovak.def}\\ +%\texttt{dt-australian.def} & \texttt{dt-esperanto.def} & \texttt{dt-magyar.def} & \texttt{dt-slovene.def}\\ +%\texttt{dt-austrian.def} & \texttt{dt-estonian.def} & \texttt{dt-naustrian.def} & \texttt{dt-spanish.def}\\ +%\texttt{dt-bahasa.def} & \texttt{dt-finnish.def} & \texttt{dt-newzealand.def} & \texttt{dt-swedish.def}\\ +%\texttt{dt-basque.def} & \texttt{dt-french.def} & \texttt{dt-ngerman.def} & \texttt{dt-turkish.def}\\ +%\texttt{dt-breton.def} & \texttt{dt-galician.def} & \texttt{dt-norsk.def} & \texttt{dt-UKenglish.def}\\ +%\texttt{dt-british.def} & \texttt{dt-german.def} & \texttt{dt-polish.def} & \texttt{dt-ukraineb.def}\\ +%\texttt{dt-bulgarian.def} & \texttt{dt-greek.def} & \texttt{dt-portuges.def} & \texttt{dt-USenglish.def}\\ +%\texttt{dt-canadian.def} & \texttt{dt-hebrew.def} & \texttt{dt-romanian.def} & \texttt{dt-usorbian.def}\\ +%\texttt{dt-catalan.def} & \texttt{dt-icelandic.def} & \texttt{dt-russian.def} & \texttt{dt-welsh.def}\\ +%\texttt{dt-croatian.def} & \texttt{dt-irish.def} & \texttt{dt-samin.def}\\ +%\texttt{dt-czech.def} & \texttt{dt-italian.def} & \texttt{dt-scottish.def}\\ +%\texttt{dt-danish.def} & \texttt{dt-latin.def} & \texttt{dt-serbian.def} +%\end{tabular} +%\end{center} +% +%These \texttt{dt-\meta{lang}.def} files provide the code to integrate +%\styfmt{datetime} with \sty{babel} for each language given by \meta{lang}. +%This means that if you have \styfmt{datetime} installed and there's a +%\texttt{.def} file that matches the language you are using with +%\sty{babel}, then all you need to do is load \sty{babel} before +%\styfmt{datetime}. +% +%With \styfmt{datetime2}, language support is provided in separate +%independently-maintained modules. The actual \styfmt{datetime2} package +%itself just comes with two files: \texttt{datetime2.sty} and +%\texttt{datetime2-calc.sty}. This means that if you only want to use +%the basic numeric styles and aren't using \sty{babel} or +%\sty{polyglossia}, then that's all you need. (Although you'll +%obviously need to install dependent packages, such as \styfmt{pgf} +%which provides the \sty{pgfcalendar} package used by +%\styfmt{datetime2-calc}. However \sty{fmtcount}, which is required by +%\styfmt{datetime}, isn't required by \styfmt{datetime2}.) +% +%If you want to use \styfmt{datetime2} with language support, then you +%only need to install the modules for the required language. For +%example, if you only use English, you can just install the +%\module{english} module and if you only use French, you can just +%install the \module{french} module. +% +%At the time of writing, the following modules are available on CTAN: +%\begin{center} +%\begin{tabular}{lll} +%\module[bahasai]{datetime2-bahasai} & \module[galician]{datetime2-galician} & \module[russian]{datetime2-russian} \\ +%\module[basque]{datetime2-basque} & \module[german]{datetime2-german} & \module[samin]{datetime2-samin} \\ +%\module[breton]{datetime2-breton} & \module[greek]{datetime2-greek} & \module[scottish]{datetime2-scottish} \\ +%\module[bulgarian]{datetime2-bulgarian} & \module[hebrew]{datetime2-hebrew} & \module[serbian]{datetime2-serbian} \\ +%\module[catalan]{datetime2-catalan} & \module[icelandic]{datetime2-icelandic} & \module[slovak]{datetime2-slovak} \\ +%\module[croatian]{datetime2-croatian} & \module[irish]{datetime2-irish} & \module[slovene]{datetime2-slovene} \\ +%\module[czech]{datetime2-czech} & \module[italian]{datetime2-italian} & \module[spanish]{datetime2-spanish} \\ +%\module[danish]{datetime2-danish} & \module[latin]{datetime2-latin} & \module[swedish]{datetime2-swedish} \\ +%\module[dutch]{datetime2-dutch} & \module[lsorbian]{datetime2-lsorbian} & \module[turkish]{datetime2-turkish} \\ +%\module[english]{datetime2-english} & \module[magyar]{datetime2-magyar} & \module[ukrainian]{datetime2-ukrainian} \\ +%\module[esperanto]{datetime2-esperanto} & \module[norsk]{datetime2-norsk} & \module[usorbian]{datetime2-usorbian} \\ +%\module[estonian]{datetime2-estonian} & \module[polish]{datetime2-polish} & \module[welsh]{datetime2-welsh} \\ +%\module[finnish]{datetime2-finnish} & \module[portuges]{datetime2-portuges} \\ +%\module[french]{datetime2-french} & \module[romanian]{datetime2-romanian} +%\end{tabular} +%\end{center} +%Some of these only support the root language but some, such as +%\module{english}, provide support for different regions. There is +%also a supplementary package \sty{datetime2-en-fulltext} that +%replicates \styfmt{datetime}'s \texttt{text} and \texttt{oclock} +%styles (and requires \sty{fmtcount}). +% +%Old style (\styfmt{datetime}): +%\begin{verbatim} +%\documentclass{article} +%\usepackage[T1]{fontenc} +%\usepackage[utf8]{inputenc} +%\usepackage[french,british]{babel} +% +%\usepackage{datetime} +% +%\begin{document} +%\selectlanguage{french} +%\today +% +%\selectlanguage{british} +%\today +% +%\end{document} +%\end{verbatim} +%This produces: +%\begin{quote} +%21 janvier 2016\par +%Thursday 21\textsuperscript{st} January, 2016 +%\end{quote} +% +%New style (\styfmt{datetime2}, \sty{datetime2-english} and \sty{datetime2-french}): +%\begin{verbatim} +%\documentclass{article} +%\usepackage[T1]{fontenc} +%\usepackage[utf8]{inputenc} +%\usepackage[french,british]{babel} +% +%\usepackage[showdow,useregional]{datetime2} +% +%\begin{document} +%\selectlanguage{french} +%\today +% +%\selectlanguage{british} +%\today +% +%\end{document} +%\end{verbatim} +%This produces: +%\begin{quote} +%21 janvier 2016\par +%Thursday 21st January 2016 +%\end{quote} +%There's a slight difference in the appearance of the British date. +%An exact reproduction of the \styfmt{datetime} format can be achieved +%by modifying the \style{en-GB} options: +%\begin{verbatim} +%\documentclass{article} +%\usepackage[T1]{fontenc} +%\usepackage[utf8]{inputenc} +%\usepackage[french,british]{babel} +% +%\usepackage[showdow,useregional]{datetime2} +%\DTMlangsetup[en-GB]{ord=raise,monthyearsep={,\space}} +% +%\begin{document} +%\selectlanguage{french} +%\today +% +%\selectlanguage{british} +%\today +% +%\end{document} +%\end{verbatim} +%Note that neither \styfmt{dt-french.def} from \styfmt{datetime} nor +%\sty{datetime2-french} support +%the show day of week option. +% +%The \styfmt{datetime} package provides: +%\begin{definition}[\inpkg{datetime}] +%\oldcs{setdefaultdate}\marg{date declaration} +%\end{definition} +%to always use the date style given by \meta{date declaration} +%instead of letting \sty{babel} switch the date format every time the +%language changes. +% +%In \styfmt{datetime2}, the default is the reverse: the style won't +%change when the language changes unless the languages (or regions) +%have been listed in the \styfmt{datetime2} package options. If the +%regional styles have been enabled, allowing \sty{babel} to change +%the date style whenever the language changes, then you can switch +%this behaviour off by setting the \pkgopt{useregional} option to +%\pkgoptfmt{false}. +% +%Old style (\styfmt{datetime}): +%\begin{verbatim} +%\documentclass{article} +%\usepackage[T1]{fontenc} +%\usepackage[utf8]{inputenc} +%\usepackage[french,british]{babel} +% +%\usepackage{datetime} +% +%\yyyymmdddate +% +%\begin{document} +%\selectlanguage{french} +%\today +% +%\selectlanguage{british} +%\today +% +%\end{document} +%\end{verbatim} +%This produces: +%\begin{quote} +%21 janvier 2016\par +%Thursday 21\textsuperscript{st} January, 2016 +%\end{quote} +%(The numeric date style has been overridden.) +%\begin{verbatim} +%\documentclass{article} +%\usepackage[T1]{fontenc} +%\usepackage[utf8]{inputenc} +%\usepackage[french,british]{babel} +% +%\usepackage{datetime2} +% +%\DTMsetdatestyle{iso} +% +%\begin{document} +%\selectlanguage{french} +%\today +% +%\selectlanguage{british} +%\today +% +%\end{document} +%\end{verbatim} +%This produces: +%\begin{quote} +%2016-01-21\par +%2016-01-21 +%\end{quote} +%(The ISO date style overrides the language setting.) +% +%Compare this to: +%\begin{verbatim} +%\documentclass{article} +%\usepackage[T1]{fontenc} +%\usepackage[utf8]{inputenc} +%\usepackage[french,british]{babel} +% +%\usepackage[en-GB,fr-FR]{datetime2} +% +%\DTMsetdatestyle{iso} +% +%\begin{document} +%\selectlanguage{french} +%\today +% +%\selectlanguage{british} +%\today +% +%\end{document} +%\end{verbatim} +%This produces: +%\begin{quote} +%21 janvier 2016\par +%21st January 2016 +%\end{quote} +% +%Examples that explicitly suppress the language-sensitive dates +%follow. First with \styfmt{datetime}: +%\begin{verbatim} +%\documentclass{article} +%\usepackage[T1]{fontenc} +%\usepackage[utf8]{inputenc} +%\usepackage[french,british]{babel} +% +%\usepackage{datetime} +% +%\setdefaultdate{\yyyymmdddate} +% +%\begin{document} +%\selectlanguage{french} +%\today +% +%\selectlanguage{british} +%\today +% +%\end{document} +%\end{verbatim} +%This produces: +%\begin{quote} +%2016/01/21\par +%2016/01/21 +%\end{quote} +% +%Now with \styfmt{datetime2}: +%\begin{verbatim} +%\documentclass{article} +%\usepackage[T1]{fontenc} +%\usepackage[utf8]{inputenc} +%\usepackage[french,british]{babel} +% +%\usepackage[en-GB,fr-FR,useregional=false]{datetime2} +% +%\DTMsetdatestyle{iso} +% +%\begin{document} +%\selectlanguage{french} +%\today +% +%\selectlanguage{british} +%\today +% +%\end{document} +%\end{verbatim} +%This produces: +%\begin{quote} +%2016-01-21\par +%2016-01-21 +%\end{quote} +% +%\section{Predefined Date Formats} +% +%The \styfmt{datetime} date styles were set with declarations such as +%\cs{longdate} (or package options that used the associated +%declaration, such as \pkgoptfmt{long}). +%With \styfmt{datetime2}, date styles are set using +%\begin{definition}[\inpkg{datetime2}] +%\ics{DTMsetdatestyle}\marg{style name} +%\end{definition} +%(which just changes the date style without changing the time style) or +%\begin{definition}[\inpkg{datetime2}] +%\ics{DTMsetstyle}\marg{style name} +%\end{definition} +%which sets the full date-time style. +% +%This section lists the \styfmt{datetime} declarations and how the +%same style can be set through \styfmt{datetime2}. +% +%\begin{definition}[\inpkg{datetime}] +%\oldcs{yyyymmdddate} +%\end{definition} +%By default this style produces a date in the form 2016/01/20. (The +%separator is governed by \oldcs{dateseparator}.) This is the default +%style for \styfmt{datetime2} with the exception of the separator, +%which defaults to a hyphen. To reproduce the \styfmt{datetime} +%format, you can set the date style to \style{default} (if it has +%been previous changed from the default) and change the separator +%with the \pkgopt{datesep} option: +%\begin{verbatim} +%\DTMsetdatestyle{default} +%\DTMsetup{datesep={/}} +%\end{verbatim} +% +%\begin{definition}[\inpkg{datetime}] +%\oldcs{longdate} +%\end{definition} +%This is the default date format for \styfmt{datetime} and this style produces +%the date in the form: Wednesday 8\textsuperscript{th} March, 2000. +%This is actually a regional style for some of the English dialects, +%so with \styfmt{datetime2} this additionally needs the +%\module{english} module installed. To exactly replicate this date +%format, including the day of week name, the superscript ordinal +%suffix and the comma after the month name, you need the +%\pkgopt{showdow} and \pkgopt{en-GB} package options and +%the \csopt{DTMlangsetup}{ord} and \csopt{DTMlangsetup}{monthyearsep} +%options for the \style{en-GB} style. For example: +%\begin{verbatim} +%\usepackage[showdow,en-GB]{datetime2} +%\DTMlangsetup[en-GB]{ord=raise,monthyearsep={,\space}} +%\end{verbatim} +%Another possibility is: +%\begin{verbatim} +%\usepackage[british]{babel} +%\usepackage[showdow]{datetime2} +%\DTMlangsetup[en-GB]{ord=raise,monthyearsep={,\space}} +%\DTMsetdatestyle{en-GB} +%\end{verbatim} +%There are other regional styles in the \module{english} module that +%produce the same format, such as \style{en-GG}. +% +%\begin{definition}[\inpkg{datetime}] +%\oldcs{shortdate} +%\end{definition} +%This is similar to \cs{longdate} but uses abbreviated names to +%produce a date in the form: Wed 8\textsuperscript{th} Mar, 2000. +%With \styfmt{datetime2}, this is like the above but additionally +%needs the \csopt{DTMlangsetup}{abbr} option for the \style{en-GB} +%style: +%\begin{verbatim} +%\usepackage[showdow,en-GB]{datetime2} +%\DTMlangsetup[en-GB]{ord=raise,monthyearsep={,\space},abbr} +%\end{verbatim} +%or +%\begin{verbatim} +%\usepackage[british]{babel} +%\usepackage[showdow]{datetime2} +%\DTMlangsetup[en-GB]{ord=raise,monthyearsep={,\space},abbr} +%\DTMsetdatestyle{en-GB} +%\end{verbatim} +% +%\begin{definition}[\inpkg{datetime}] +%\oldcs{ddmmyyyydate} +%\end{definition} +%This produces a date in the form 08/03/2000. This can be reproduced +%with just \styfmt{datetime2} using the \style{ddmmyyyy} style with +%the date separator set to a slash: +%\begin{verbatim} +%\DTMsetdatestyle{ddmmyyyy} +%\DTMsetup{datesep=/} +%\end{verbatim} +% +%\begin{definition}[\inpkg{datetime}] +%\oldcs{dmyyyydate} +%\end{definition} +%This produces a date in the form 8/3/2000. This can be reproduced +%with just \styfmt{datetime2} using the \style{dmyyyy} style with +%the date separator set to a slash: +%\begin{verbatim} +%\DTMsetdatestyle{dmyyyy} +%\DTMsetup{datesep=/} +%\end{verbatim} +%This format is also the style of some of the regional numeric date +%styles. For example, with the \module{english} module: +%\begin{verbatim} +%\usepackage[british]{babel} +%\usepackage{datetime2} +%\DTMsetdatestyle{en-GB-numeric} +%\end{verbatim} +% +%\begin{definition}[\inpkg{datetime}] +%\oldcs{ddmmyydate} +%\end{definition} +%This produces a date in the form 08/03/00. This can be reproduced +%with just \styfmt{datetime2} using the \style{ddmmyy} style with +%the date separator set to a slash: +%\begin{verbatim} +%\DTMsetdatestyle{ddmmyy} +%\DTMsetup{datesep=/} +%\end{verbatim} +% +%\begin{definition}[\inpkg{datetime}] +%\oldcs{dmyydate} +%\end{definition} +%This produces a date in the form 8/3/00. This can be reproduced +%with just \styfmt{datetime2} using the \style{dmyy} style with +%the date separator set to a slash: +%\begin{verbatim} +%\DTMsetdatestyle{dmyy} +%\DTMsetup{datesep=/} +%\end{verbatim} +% +%\begin{definition}[\inpkg{datetime}] +%\oldcs{textdate} +%\end{definition} +%This style is designed to produce a full text British date in the +%form: Wednesday the Eighth of March, Two Thousand. The +%\sty{datetime2-en-fulltext} package is required to reproduce this +%style: +%\begin{verbatim} +%\usepackage[showdow]{datetime2-en-fulltext} +%\DTMsetdatestyle{en-FullText} +%\end{verbatim} +%Note that with both \styfmt{datetime} and +%\styfmt{datetime2-en-fulltext} this style should not be used if the +%current language isn't English. +% +%\begin{definition}[\inpkg{datetime}] +%\oldcs{usdate} +%\end{definition} +%This style is designed to produce \TeX's default US date format in +%the form March 8, 2000. This style can be reproduced with +%\styfmt{datetime2} and the \module{english} module: +%\begin{verbatim} +%\usepackage[en-US]{datetime2} +%\end{verbatim} +%or +%\begin{verbatim} +%\usepackage[USenglish]{babel} +%\usepackage[useregional]{datetime2} +%\DTMsetdatestyle{en-US} +%\end{verbatim} +% +%\begin{definition}[\inpkg{datetime}] +%\oldcs{mmddyyyydate} +%\end{definition} +%This style produces a date in a middle-endian format in the form: +%03/08/2000. This style can be reproduced with \styfmt{datetime2} using +%the \style{mmddyyyy} style with the date separator set to a slash: +%\begin{verbatim} +%\DTMsetup{datesep=/} +%\DTMsetdatestyle{mmddyyyy} +%\end{verbatim} +% +%\begin{definition}[\inpkg{datetime}] +%\oldcs{mdyyyydate} +%\end{definition} +%This style produces a date in a middle-endian format in the form: +%3/8/2000. This style can be reproduced with \styfmt{datetime2} using +%the \style{mdyyyy} style with the date separator set to a slash: +%\begin{verbatim} +%\DTMsetup{datesep=/} +%\DTMsetdatestyle{mdyyyy} +%\end{verbatim} +%This format is also the style of some of the regional numeric date +%styles. For example, with the \module{english} module: +%\begin{verbatim} +%\usepackage[USenglish]{babel} +%\usepackage{datetime2} +%\DTMsetdatestyle{en-US-numeric} +%\end{verbatim} +% +%\begin{definition}[\inpkg{datetime}] +%\oldcs{mmddyydate} +%\end{definition} +%This style produces a date in a middle-endian format in the form: +%03/08/00. This style can be reproduced with \styfmt{datetime2} using +%the \style{mmddyy} style with the date separator set to a slash: +%\begin{verbatim} +%\DTMsetup{datesep=/} +%\DTMsetdatestyle{mmddyy} +%\end{verbatim} +% +%\begin{definition}[\inpkg{datetime}] +%\oldcs{mdyydate} +%\end{definition} +%This style produces a date in a middle-endian format in the form: +%3/8/00. This style can be reproduced with \styfmt{datetime2} using +%the \style{mdyy} style with the date separator set to a slash: +%\begin{verbatim} +%\DTMsetup{datesep=/} +%\DTMsetdatestyle{mdyy} +%\end{verbatim} +% +%\section{Predefined Time Formats} +% +%The time formats are set in \styfmt{datetime} using +%\begin{definition}[\inpkg{datetime}] +%\oldcs{settimeformat}\marg{style-name} +%\end{definition} +%With \styfmt{datetime2}, the time styles are set using +%\begin{definition}[\inpkg{datetime2}] +%\ics{DTMsettimestyle}\marg{style-name} +%\end{definition} +%(which just changes the time style without changing the date style) or +%\begin{definition}[\inpkg{datetime2}] +%\ics{DTMsetstyle}\marg{style name} +%\end{definition} +%which sets the full date-time style. +% +%The \styfmt{datetime} package provides the following time styles: +%\begin{description} +%\item[xxivtime] This style produces the time in twenty-four hour +%format in the form 09:28. (The default time style for +%\styfmt{datetime}.) Note that this style has no seconds. The format +%can be reproduced in \styfmt{datetime2} with the \style{default} +%style and the \pkgopt{showseconds} option set to \pkgoptfmt{false}: +%\begin{verbatim} +%\DTMsettimestyle{default} +%\DTMsetup{showseconds=false} +%\end{verbatim} +% +%\item[hhmmsstime] This is like the previous style but includes the +%seconds. This is the default time style for \styfmt{datetime2}: +%\begin{verbatim} +%\DTMsettimestyle{default} +%\end{verbatim} +% +%\item[ampmtime] This style produces the time in twelve hour format +%in the form 9:28am or 7:54pm. This style is available in some of the +%regional modules for \styfmt{datetime2}. For example, using the +%\style{en-GB} style in the \module{english} module: +%\begin{verbatim} +%\usepackage[en-GB]{datetime2} +%\end{verbatim} +%or +%\begin{verbatim} +%\usepackage[british]{babel} +%\usepackage{datetime2} +%\DTMsettimestyle{en-GB} +%\end{verbatim} +% +%\item[oclock] This style is designed for a full text English time +%format in the form: Twenty-Eight minutes past Ten in the afternoon. +%This style can be reproduced with the \style{en-FullText} style +%provided by the \sty{datetime2-en-fulltext} package: +%\begin{verbatim} +%\usepackage{datetime2-en-fulltext} +%\DTMsettimestyle{en-FullText} +%\end{verbatim} +% +%\end{description} +% +%\section{Defining a New Date Format} +% +%The \styfmt{datetime} package provides: +%\begin{definition}[\inpkg{datetime}] +%\oldcs{newdateformat}\marg{name}\marg{format} +%\end{definition} +%to define a new date style. Within \meta{format}, the placeholder +%commands \oldcs{THEDAY}, \oldcs{THEMONTH} and \oldcs{THEYEAR} are +%used to represent the relevant day, month and year values. There are +%also counter placeholders \texttt{DAY}, \texttt{MONTH} and +%\texttt{YEAR}, which may be used instead. +% +%A necessary consequence of allowing placeholder commands in +%\meta{format} means that these commands must be set as appropriate +%before the date can be formatted. This means that the formatted date +%can't be expanded and the date commands must be made robust to +%protect them in moving arguments. This is an inherent problem with the +%\styfmt{datetime} package that can't be fixed without breaking +%backwards compatibility and is one of the main reasons for +%introducing the replacement \styfmt{datetime2} package. +% +%The \styfmt{datetime2} package provides a better way of providing +%date styles, which are defined using: +%\begin{definition}[\inpkg{datetime2}] +%\ics{DTMnewdatestyle}\marg{name}\marg{definition} +%\end{definition} +%Instead of using placeholder commands, the date styles +%simply redefine the date formatting macros within \meta{definition}. +%There are two principle date formatting commands that the date style +%must define although styles may redefine additional helper commands +%if necessary. +% +%The two main date formatting commands are: +%\begin{definition}[\inpkg{datetime2}] +%\ics{DTMdisplaydate}\marg{YYYY}\marg{MM}\marg{DD}\marg{dow} +%\end{definition} +%for use where no case-changing is required and +%\begin{definition}[\inpkg{datetime2}] +%\ics{DTMDisplaydate}\marg{YYYY}\marg{MM}\marg{DD}\marg{dow} +%\end{definition} +%for use where the date must begin with an upper case letter, for +%example if the date occurs at the start of a sentence. For styles +%where the case-change is irrelevant (for example, numeric styles or +%styles that always start with an upper case letter), the +%\cs{DTMDisplaydate} command may simply be set to +%\cs{DTMdisplaydate}. +% +%The \styfmt{datetime} manual provides some examples of new date +%styles. The first is simply a numeric little-endian style with a hyphen +%separating each number: +%\begin{verbatim} +%\newdateformat{mydate}{\THEDAY-\THEMONTH-\THEYEAR} +%\end{verbatim} +% +%To convert this into a \styfmt{datetime2} format, the new style +%simply needs to redefine \cs{DTMdisplaydate} so that it has the +%following definition: +%\begin{verbatim} +%\renewcommand{\DTMdisplaydate}[4]{#3-#2-#1} +%\end{verbatim} +%Note that this command must always have four arguments, even if one +%or more of them are ignored. So here \cs{THEYEAR} is just the first +%argument \verb|#1|, \cs{THEMONTH} is the second argument \verb|#2| +%and \cs{THEDAY} is the third argument \verb|#3|. One other thing to note is +%that the arguments may be supplied with a leading zero. If you want +%to trim this off, you can use \TeX's \ics{number} primitive. For +%example: +%\begin{verbatim} +%\renewcommand{\DTMdisplaydate}[4]{\number#3-\number#2-\number#1 } +%\end{verbatim} +%This is the better method to allow for, say, registers used in any +%of the arguments. +% +%Therefore this new date style can be defined for \styfmt{datetime2} +%as follows: +%\begin{verbatim} +%\DTMnewdatestyle{mydate}{% +% \renewcommand{\DTMdisplaydate}[4]{\number##3-\number##2-\number##1 }% +% \renewcommand{\DTMDisplaydate}{\DTMdisplaydate}% +%} +%\end{verbatim} +%(Note the need to double the \verb|#| in the parameters, as is usual +%when redefining a command within another command in this manner.) +% +%For example, using \styfmt{datetime}: +%\begin{verbatim} +%\documentclass{article} +%\usepackage{datetime} +% +%\newdateformat{mydate}{\THEDAY-\THEMONTH-\THEYEAR} +%\mydate +% +%\begin{document} +%\today. +%\end{document} +%\end{verbatim} +%Now using \styfmt{datetime2}: +%\begin{verbatim} +%\documentclass{article} +%\usepackage{datetime2} +% +%\DTMnewdatestyle{mydate}{% +% \renewcommand{\DTMdisplaydate}[4]{\number##3-\number##2-\number##1 }% +% \renewcommand{\DTMDisplaydate}{\DTMdisplaydate}% +%} +%\DTMsetdatestyle{mydate} +% +%\begin{document} +%\today. +%\end{document} +%\end{verbatim} +% +%Another example provided in the \styfmt{datetime} manual ensures two +%digits for the month and day of month: +%\begin{verbatim} +%\newdateformat{dashdate}{\twodigit{\THEDAY}-\twodigit{\THEMONTH}-\THEYEAR} +%\end{verbatim} +% +%This is a minor modification to the previous example. The two digit +%number format can be obtained through \styfmt{datetime2}'s +%\ics{DTMtwodigits} command: +%\begin{verbatim} +%\DTMnewdatestyle{dashdate}{% +% \renewcommand{\DTMdisplaydate}[4]{% +% \DTMtwodigits{##3}-\DTMtwodigits{##2}-\number##1 }% +% \renewcommand{\DTMDisplaydate}{\DTMdisplaydate}% +%} +%\end{verbatim} +% +%A complete example follows for \styfmt{datetime}: +%\begin{verbatim} +%\documentclass{article} +%\usepackage{datetime} +% +%\newdateformat{dashdate}{\twodigit{\THEDAY}-\twodigit{\THEMONTH}-\THEYEAR} +%\dashdate +% +%\begin{document} +%\today. +%\end{document} +%\end{verbatim} +%And for \styfmt{datetime2}: +%\begin{verbatim} +%\documentclass{article} +%\usepackage{datetime2} +% +%\DTMnewdatestyle{dashdate}{% +% \renewcommand{\DTMdisplaydate}[4]{% +% \DTMtwodigits{##3}-\DTMtwodigits{##2}-\number##1 }% +% \renewcommand{\DTMDisplaydate}{\DTMdisplaydate}% +%} +%\DTMsetdatestyle{dashdate} +% +%\begin{document} +%\today. +%\end{document} +%\end{verbatim} +% +%You may have noticed that there's no equivalent of +%\styfmt{datetime}'s counter placeholders, but there's no real need +%for them and any attempt at implementing them would return to the +%original problem of preventing an expandable date format. \LaTeX\ +%counters all internally use \TeX\ count registers and counter +%formatting commands have to access those registers to determine the +%counter value. +% +%To illustrate this, the \styfmt{datetime} manual provides the +%example: +%\begin{verbatim} +%\newdateformat{usvardate}{\monthname[\THEMONTH] \ordinal{DAY}, \THEYEAR} +%\end{verbatim} +%This uses the \texttt{DAY} counter placeholder since \cs{ordinal} +%(provided by the \sty{fmtcount} package) requires a counter name as +%the argument. However, \cs{ordinal} internally uses \cs{ordinalnum} +%with the internal count register as the argument, so the format +%could just as easily be defined as: +%\begin{verbatim} +%\newdateformat{usvardate}{\monthname[\THEMONTH] \ordinalnum{\THEDAY}, \THEYEAR} +%\end{verbatim} +% +%So how can this style be reproduced with \styfmt{datetime2}? A +%na\"ive approach is: +%\begin{verbatim} +%\DTMnewdatestyle{usvardate}{% +% \renewcommand{\DTMdisplaydate}[4]{% +% \DTMmonthname{##2} \ordinalnum{##2}, \number##1 }% +% \renewcommand{\DTMDisplaydate}{\DTMdisplaydate}% +%} +%\end{verbatim} +%This requires both \styfmt{datetime2-calc} (for \ics{DTMmonthname}) +%and \sty{fmtcount} (for \cs{ordinalnum}). +% +%A complete example that uses it: +%\begin{verbatim} +%\documentclass{article} +% +%\usepackage{fmtcount} +%\usepackage[calc]{datetime2} +% +%\DTMnewdatestyle{usvardate}{% +% \renewcommand{\DTMdisplaydate}[4]{% +% \DTMmonthname{##2} \ordinalnum{##2}, \number##1 }% +% \renewcommand{\DTMDisplaydate}{\DTMdisplaydate}% +%} +%\DTMsetdatestyle{usvardate} +% +%\begin{document} +%\today. +%\end{document} +%\end{verbatim} +%This produces a warning from \cs{DTMmonthname} because +%\cs{DTMenglishmonthname} hasn't been defined, so it uses +%\cs{pgfcalendarmonthname} instead. The document displays the text: +%\begin{quote} +%January 1\textsuperscript{st}, 2016. +%\end{quote} +%This seems to produce the correct output, but let's see what happens +%if we make a minor modification to the example: +%\begin{verbatim} +%\documentclass{article} +% +%\usepackage[english,french]{babel} +%\usepackage{fmtcount} +%\usepackage[calc]{datetime2} +% +%\DTMnewdatestyle{usvardate}{% +% \renewcommand{\DTMdisplaydate}[4]{% +% \DTMmonthname{##2} \ordinalnum{##2}, \number##1 }% +% \renewcommand{\DTMDisplaydate}{\DTMdisplaydate}% +%} +%\DTMsetdatestyle{usvardate} +% +%\begin{document} +%\today. +%\end{document} +%\end{verbatim} +%This now produces: +%\begin{quote} +%janvier 1\textsuperscript{er}, 2016. +%\end{quote} +%which doesn't match the rationale of the style being a variation of +%the standard US date style nor does it match the little-endian +%syntax of French dates. +% +%Now let's make another minor change to the example: +%\begin{verbatim} +%\documentclass{article} +% +%\usepackage{fmtcount} +%\usepackage[calc]{datetime2} +% +%\DTMnewdatestyle{usvardate}{% +% \renewcommand{\DTMdisplaydate}[4]{% +% \DTMmonthname{##2} \ordinalnum{##2}, \number##1 }% +% \renewcommand{\DTMDisplaydate}{\DTMdisplaydate}% +%} +%\DTMsetdatestyle{usvardate} +% +%\begin{document} +%\section{\today: an example} +% +%\today. +%\end{document} +%\end{verbatim} +%This document can't compile properly and causes the error: +%\begin{verbatim} +%! Argument of \@sect has an extra }. +% +% \par +%\end{verbatim} +%This is because the style definition has made \cs{today} fragile +%because it uses an unprotected fragile command. This can be fixed by +%protecting \cs{ordinalnum} in the style definition. +% +%Let's make another modification: +%\begin{verbatim} +%\documentclass{article} +% +%\usepackage{fmtcount} +%\usepackage[calc]{datetime2} +% +%\DTMnewdatestyle{usvardate}{% +% \renewcommand{\DTMdisplaydate}[4]{% +% \DTMmonthname{##2} \protect\ordinalnum{##2}, \number##1 }% +% \renewcommand{\DTMDisplaydate}{\DTMdisplaydate}% +%} +%\DTMsetdatestyle{usvardate} +% +%\pagestyle{headings} +% +%\begin{document} +%\section{\today: an example} +% +%\today. +%\end{document} +%\end{verbatim} +%This compiles without error now that \cs{ordinalnum} has been +%protected, but the page header appears as: +%\begin{quote} +%\emph{1\quad January 1\textsuperscript{st}, 2016: AN EXAMPLE}\hfill 1 +%\end{quote} +%The date hasn't been rendered in upper case so the header doesn't +%look right. +% +%If \sty{hyperref} is added, another problem becomes evident: +%\begin{verbatim} +%\documentclass{article} +% +%\usepackage{fmtcount} +%\usepackage[calc]{datetime2} +%\usepackage[colorlinks]{hyperref} +% +%\DTMnewdatestyle{usvardate}{% +% \renewcommand{\DTMdisplaydate}[4]{% +% \DTMmonthname{##2} \protect\ordinalnum{##2}, \number##1 }% +% \renewcommand{\DTMDisplaydate}{\DTMdisplaydate}% +%} +%\DTMsetdatestyle{usvardate} +% +%\pagestyle{headings} +% +%\begin{document} +%\section{\today: an example} +% +%\today. +%\end{document} +%\end{verbatim} +%The PDF bookmarks for this document show the section title as: +%\begin{quote} +%01 , 2016: an example +%\end{quote} +% +%Both the header and the bookmark problem are caused by +%non-expandable elements of the date style. \emph{The same problems +%occur with \styfmt{datetime}}, and is one of the main reasons for +%developing a replacement package since these problems can't be fixed +%by \styfmt{datetime}. In fact, the \styfmt{datetime} version of this +%example looks even worse in the bookmarks: +%\begin{verbatim} +%\documentclass{article} +% +%\usepackage{datetime} +%\usepackage[colorlinks]{hyperref} +% +%\newdateformat{usvardate}{\monthname[\THEMONTH] \ordinalnum{\THEDAY}, \THEYEAR} +%\usvardate +% +%\pagestyle{headings} +% +%\begin{document} +%\section{\today: an example} +% +%\today. +%\end{document} +%\end{verbatim} +%The bookmark now looks like: +%\begin{quote} +%===[0], 0: an example +%\end{quote} +%(The page header is the same as for the \styfmt{datetime2} example +%above, with the date not matching the rest of the heading case.) +% +%A more appropriate way of defining this style with +%\styfmt{datetime2} package is to use the \emph{expandable} commands +%provided by the \module{english} module: +%\begin{verbatim} +%\documentclass{article} +% +%\usepackage[calc,en-GB]{datetime2} +%\usepackage[colorlinks]{hyperref} +% +%\DTMnewdatestyle{usvardate}{% +% \renewcommand*{\DTMenglishfmtordsuffix}{\DTMenGBfmtordsuffix}% +% \renewcommand{\DTMdisplaydate}[4]{% +% \DTMenglishmonthname{##2} \DTMenglishordinal{##2}, \number##1 }% +% \renewcommand{\DTMDisplaydate}{\DTMdisplaydate}% +%} +%\DTMsetdatestyle{usvardate} +% +%\pagestyle{headings} +% +%\begin{document} +%\section{\today: an example} +% +%\today. +%\end{document} +%\end{verbatim} +%This fixes both the header and the bookmarks. +% +%If you don't want to rely on remembering to use the \pkgopt{en-GB} +%option to load the \style{en-GB} style (which defines +%\cs{DTMenGBfmtordsuffix}) you can use this alternative: +%\begin{verbatim} +%\documentclass{article} +% +%\usepackage[calc]{datetime2} +%\usepackage[colorlinks]{hyperref} +% +%\DTMusemodule{english}{en-GB} +% +%\DTMnewdatestyle{usvardate}{% +% \renewcommand*{\DTMenglishfmtordsuffix}{\DTMenGBfmtordsuffix}% +% \renewcommand{\DTMdisplaydate}[4]{% +% \DTMenglishmonthname{##2} \DTMenglishordinal{##2}, \number##1 }% +% \renewcommand{\DTMDisplaydate}{\DTMdisplaydate}% +%} +%\DTMsetdatestyle{usvardate} +% +%\pagestyle{headings} +% +%\begin{document} +%\section{\today: an example} +% +%\today. +%\end{document} +%\end{verbatim} +%This is a useful method to employ if you want to define the new +%style in a package without forcing the package options used to load +%\styfmt{datetime2}. +% +%Note that this new style definition is unaffected by language +%changes, so the other problem with the \styfmt{datetime} version of +%this style is also eliminated. +% +%\section{Defining a New Time Format} +% +%The \styfmt{datetime} package provides: +%\begin{definition}[\inpkg{datetime}] +%\oldcs{newtimeformat}\marg{name}\marg{format} +%\end{definition} +%to define a new time style. Within \meta{format}, the placeholder +%commands \oldcs{THEHOUR}, \oldcs{THEMINUTE}, \oldcs{THESECOND}, +%\oldcs{THEHOURXII}, \oldcs{THETOHOUR}, \oldcs{THETOMINUTE} may be +%used. There are also corresponding placeholder counters: +%\texttt{HOUR}, \texttt{MINUTE}, \texttt{SECOND}, \texttt{HOURXII}, +%\texttt{TOHOUR} and \texttt{TOMINUTE}. +% +%This placeholder style of format for the time has the same problems +%as that for the date styles described in the previous section. +% +%Time styles are defined in \styfmt{datetime2} using: +%\begin{definition}[\inpkg{datetime2}] +%\ics{DTMnewtimestyle}\marg{name}\marg{definition} +%\end{definition} +% +%As with the date styles, the \styfmt{datetime2} package provides +%styles that redefine a formatting macro. In this case, the time +%(without the zone) is simply formatted with +%\begin{definition}[\inpkg{datetime2}] +%\ics{DTMdisplaytime}\marg{hh}\marg{mm}\marg{ss} +%\end{definition} +%so the \meta{definition} part of \cs{DTMnewtimestyle} needs to +%redefine this command. +% +%The placeholder commands \cs{THEHOUR}, \cs{THEMINUTE} +%and \cs{THESECOND} from \styfmt{datetime} can now be represented by +%the first, second and third arguments of \cs{DTMdisplaytime}. The +%other placeholders are more complicated as they need to be +%calculated which may prevent the style from being an expandable +%format. +% +%The \styfmt{datetime} manual provides a simple example of defining a +%new time style: +%\begin{verbatim} +%\newtimeformat{dottime}{\twodigit{\THEHOUR}.\twodigit{\THEMINUTE}} +%\end{verbatim} +%This style is then set using: +%\begin{verbatim} +%\settimeformat{dottime} +%\end{verbatim} +% +%An equivalent time style can be defined with \styfmt{datetime2}: +%\begin{verbatim} +%\DTMnewtimestyle{dottime}{% +% \renewcommand*\DTMdisplaytime[3]{\DTMtwodigits{##1}.\DTMtwodigits{##2}}} +%\end{verbatim} +% +%A complete example using \styfmt{datetime}: +%\begin{verbatim} +%\documentclass{article} +% +%\usepackage{datetime} +% +%\newtimeformat{dottime}{\twodigit{\THEHOUR}.\twodigit{\THEMINUTE}} +%\settimeformat{dottime} +% +%\begin{document} +%\currenttime. +%\end{document} +%\end{verbatim} +%A complete example using \styfmt{datetime2}: +%\begin{verbatim} +%\documentclass{article} +% +%\usepackage{datetime2} +% +%\DTMnewtimestyle{dottime}{% +% \renewcommand*\DTMdisplaytime[3]{\DTMtwodigits{##1}.\DTMtwodigits{##2}}} +%\DTMsettimestyle{dottime} +% +%\begin{document} +%\DTMcurrenttime. +%\end{document} +%\end{verbatim} +% +%Note that the \styfmt{datetime} example has a problem with PDF +%bookmarks if the time is used in a sectioning command, for the same +%reasons as those discussed above in the previous section. This can +%be seen with a slight modification to the example: +%\begin{verbatim} +%\documentclass{article} +% +%\usepackage{datetime} +%\usepackage[colorlinks]{hyperref} +% +%\newtimeformat{dottime}{\twodigit{\THEHOUR}.\twodigit{\THEMINUTE}} +%\settimeformat{dottime} +% +%\begin{document} +%\section{\currenttime: an example} +% +%\currenttime. +%\end{document} +%\end{verbatim} +%The bookmark appears as: +%\begin{quote} +%====by 1=by 12by 12 by -=by -60by -1=0.00: an example +%\end{quote} +% +%The \styfmt{datetime2} example works fine with a similar +%modification: +%\begin{verbatim} +%\documentclass{article} +% +%\usepackage{datetime2} +%\usepackage[colorlinks]{hyperref} +% +%\DTMnewtimestyle{dottime}{% +% \renewcommand*\DTMdisplaytime[3]{\DTMtwodigits{##1}.\DTMtwodigits{##2}}} +%\DTMsettimestyle{dottime} +% +%\begin{document} +%\section{\DTMcurrenttime: an example} +% +%\DTMcurrenttime. +%\end{document} +%\end{verbatim} +% +%There is one slight drawback with this example that's irrelevant to the choice +%of package. The bookmark (and table of contents, if present) will always show +%the time from the previous \LaTeX\ run. This is only a problem when using the +%current time, especially if seconds are required or the document build takes +%longer than a minute. If the example has a specific time instead of one that +%changes for every \LaTeX\ run, then this issue is eliminated. +% +%If you want a time style that requires the other placeholder +%commands provided by \styfmt{datetime}, then it's more complicated +%to convert to \styfmt{datetime2} as the values that +%\styfmt{datetime} conveniently computes and stores in the +%placeholder commands \oldcs{THEHOURXII}, \oldcs{THETOHOUR} and +%\oldcs{THETOMINUTE} now need to be calculated, preferably in an +%expandable way. +% +%An expandable twelve hour time format can be illustrated with the +%\style{englishampm} style provided by the \module{english} +%module:\footnote{Bug fix from \styfmt{datetime2-english} v1.03 +%included} +%\begin{verbatim} +%\DTMnewtimestyle +% {englishampm}% label +% {% +% \renewcommand*\DTMdisplaytime[3]{% +% \ifnum##2=0 +% \ifnum##1=12 +% \DTMtexorpdfstring +% {\DTMenglishampmfmt{\DTMenglishnoon}}% +% {\DTMenglishnoon}% +% \else +% \ifnum##1=0 +% \DTMtexorpdfstring +% {\DTMenglishampmfmt{\DTMenglishmidnight}}% +% {\DTMenglishmidnight}% +% \else +% \ifnum##1=24 +% \DTMtexorpdfstring +% {\DTMenglishampmfmt{\DTMenglishmidnight}}% +% {\DTMenglishmidnight}% +% \else +% \ifnum##1<12 +% \number##1 +% \DTMtexorpdfstring +% {\DTMenglishampmfmt{\DTMenglisham}}% +% {\DTMenglisham}% +% \else +% \number\numexpr##1-12\relax +% \DTMtexorpdfstring +% {\DTMenglishampmfmt{\DTMenglishpm}}% +% {\DTMenglishpm}% +% \fi +% \fi +% \fi +% \fi +% \fi +% \else +% \ifnum##1<13 +% \ifnum##1=0 +% 12% +% \else +% \number##1 +% \fi +% \DTMenglishtimesep\DTMtwodigits{##2}% +% \ifnum##1=12 +% \DTMtexorpdfstring +% {\DTMenglishampmfmt{\DTMenglishpm}}% +% {\DTMenglishpm}% +% \else +% \DTMtexorpdfstring +% {\DTMenglishampmfmt{\DTMenglisham}}% +% {\DTMenglisham}% +% \fi +% \else +% \number\numexpr##1-12\relax +% \DTMenglishtimesep\DTMtwodigits{##2}% +% \ifnum##1=24 +% \DTMtexorpdfstring +% {\DTMenglishampmfmt{\DTMenglisham}}% +% {\DTMenglisham}% +% \else +% \DTMtexorpdfstring +% {\DTMenglishampmfmt{\DTMenglishpm}}% +% {\DTMenglishpm}% +% \fi +% \fi +% \fi +% }% +% }% +%\end{verbatim} +% +%This is certainly more complicated than the +%\texttt{ampmtime} format provided by \styfmt{datetime}, which is +%defined as: +%\begin{verbatim} +%\newtimeformat{ampmtime}% +%{% +% \ifthenelse{\value{HOUR}=0}{12}{\THEHOURXII}% +% \timeseparator +% \twodigit{\THEMINUTE}% +% \ifthenelse{\value{HOUR}<12}{\amname}% +% {% +% \ifthenelse{\value{HOUR}=12}{ \noon}{\pmname}% +% }% +%} +%\end{verbatim} +%However the \styfmt{datetime2} version produces better results, +%especially where expansion is required (for example, in bookmarks or +%writing a time stamp to an external file). The \styfmt{datetime2} +%version also performs extra checks for midnight where the +%\styfmt{datetime} version produces ambiguous text. So the +%\texttt{ampmtime} definition is simple but buggy. +% +%The basic algorithm for \style{englishampm} is: +%\begin{description} +%\item If the minute value is 0 (\verb|\ifnum##2=0|): +% \begin{description} +% \item If the hour value is 12 (\verb|\ifnum##1=12|): +% \begin{description} +% \item Print \qt{noon} +% \end{description} +% +% \item Otherwise (not noon but on the hour) +% +% \begin{description} +% \item If the hour value is 0 (\verb|\ifnum##1=0|) +% \begin{description} +% \item Print \qt{midnight} +% \end{description} +% +% \item Otherwise (not 12:00 or 00:00 but on the hour) +% +% \begin{description} +% \item If the hour value is 24 (\verb|\ifnum##1=24|) +% \begin{description} +% \item Print \qt{midnight} +% \end{description} +% +% \item Otherwise (not 12:00 or 00:00 or 24:00 but on the hour) +% \begin{description} +% \item If the hour value is less than 12 (\verb|\ifnum##1<12|) +% \begin{description} +% \item Print the hour value (\verb|\number##1|) +% \item Print \qt{am} +% \end{description} +% \item Otherwise +% \begin{description} +% \item Print the hour value less 12 +% (\verb|\number\numexpr##1-12|) +% \item Print \qt{pm} +% \end{description} +% \end{description} +% \end{description} +% \end{description} +% \end{description} +% +% \item Otherwise (minute value isn't zero) +% +% \begin{description} +% \item If the hour value is less than 13 (\verb|\ifnum##1<13|) +% +% \begin{description} +% \item If the hour value is 0 (\verb|\ifnum##1=0|) +% \begin{description} +% \item Print \qt{12} +% \end{description} +% \item Otherwise +% \begin{description} +% \item Print the hour (\verb|\number##1|) +% \end{description} +% +% \item Print the separator between the hour and minute +% (\verb|\DTMenglishtimesep|) +% +% \item Print minute value (\verb|\DTMtwodigits{##2}|) +% +% \item If the hour value is 12 (\verb|\ifnum##=12|) +% \begin{description} +% \item Print \qt{pm} +% \end{description} +% \item Otherwise (hour value less than 12) +% \begin{description} +% \item Print \qt{am} +% \end{description} +% \end{description} +% +% \item Otherwise (hour value $\ge13$) +% +% \begin{description} +% \item Print the hour value less 12 +% (\verb|\number\numexpr##1-12|) +% \item Print the time separator +% +% \item Print minute value (\verb|\DTMtwodigits{##2}|) +% +% \item If the hour value is 24 (\verb|\ifnum##1=24|) +% \begin{description} +% \item Print \qt{am} +% \end{description} +% \item Otherwise +% \begin{description} +% \item Print \qt{pm} +% \end{description} +% \end{description} +% \end{description} +%\end{description} +%Most of the complication in this style isn't trying to determine the +%equivalent value of \cs{THEHOURXII} (\verb|\number\numexpr##1-12| +%if \verb|##1>12|) but in improving the algorithm to catch special +%cases that the \styfmt{datetime} style misses. Additionally, +%\ics{DTMtexorpdfstring} is used to prevent any font formatting +%commands from being added to the bookmarks. +% +%The \sty{datetime2-en-fulltext} package provides an example of a +%time style that requires calculating the minutes to the hour and the +%next hour. Note that fragile commands are protected in this style. +%Since it contains fragile commands that require protection, it can't +%be used in an expandable context. +% +%Remember that most of the styles provided by \styfmt{datetime2} and its +%associated modules and dependent packages are configurable, so if +%your preferred style is only marginally different to a predefined +%style, you may be able to tweak that style to fit your requirements. +%For example, the dot time format can be obtained using the +%\style{default} style with the seconds suppressed and the separator +%change to a dot: +%\begin{verbatim} +%\DTMsettimestyle{default} +%\DTMsetup{timesep={.},showseconds=false} +%\end{verbatim} +% +%The twelve hour format provided by the \module{english} module can also be +%adjusted. This style honours the package-wide time-related option +%\pkgopt{hourminsep} and the \qt{am}, \qt{pm}, \qt{midnight} or +%\qt{noon} part is formatted according to: +%\begin{definition}[\inpkg{datetime2-english}] +%\ics{DTMenglishampmfmt}\marg{text} +%\end{definition} +% +%So a twelve hour format that uses a dot instead of a colon and has +%the text part in small caps can be obtained using: +%\begin{verbatim} +%\usepackage[english,hourminsep={.}]{datetime2} +%\renewcommand*{\DTMenglishampmfmt}[1]{\textsc{#1}} +%\end{verbatim} +% +%\StopEventually{\PrintChanges\PrintIndex} +% +% +%\chapter{The Code} +%\iffalse +% \begin{macrocode} +%<*datetime2.sty> +% \end{macrocode} +%\fi +%\section{datetime2.sty code} +%\changes{1.0}{2015-03-24}{Initial release} +% \begin{macrocode} +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{datetime2}[2018/07/20 v1.5.3 (NLCT) date and time formats] +% \end{macrocode} +% Use \sty{tracklang} to find out what languages have been loaded. +% \begin{macrocode} +\RequirePackage{tracklang} +% \end{macrocode} +% Also require \sty{etoolbox}. +% \begin{macrocode} +\RequirePackage{etoolbox} +% \end{macrocode} +% Need \sty{xkeyval} for \meta{key}=\meta{value} interface. +% \begin{macrocode} +\RequirePackage{xkeyval}[2006/11/18] +% \end{macrocode} +% +%\begin{macro}{\dtm@pdfcreationdate} +%\changes{1.5}{2016-06-04}{new} +%The \sty{luatex85} package defines \ics{pdfcreationdate} in terms of +%\cs{pdffeedback}, but the parsing commands need a command whose +%replacement text is directly in the PDF date time format, so define a command +%with the full replacement text that can be used instead. This will allow +%for any possible future changes of \cs{pdfcreationdate} that +%require deeper levels of expansion. +% \begin{macrocode} +\ifdef\pdfcreationdate +{% + \edef\dtm@pdfcreationdate{\pdfcreationdate}% +}% +{% +% \end{macrocode} +%\changes{1.5.1}{2016-06-05}{added check for \cs{pdffeedback}} +% Check if newer version of Lua\TeX\ is being used but +% \sty{luatex85} hasn't been loaded. +% \begin{macrocode} + \ifdef\pdffeedback + {% + \edef\dtm@pdfcreationdate{\pdffeedback creationdate}% + }% + {% +% \end{macrocode} +%Neither \cs{pdfcreationdate} nor \cs{pdffeedback} are defined. +%(The \TeX\ format is most probably \XeLaTeX.) +%If the \sty{locale} package has been loaded, \cs{LocaleNowStamp} +%should be available. +% \begin{macrocode} + \ifdef\LocaleNowStamp + {% + \ifx\LocaleNowStamp\empty +% \end{macrocode} +%OS query failed, so there's no point trying directly with +%\sty{texosquery}. +% \begin{macrocode} + \else + \let\dtm@pdfcreationdate\LocaleNowStamp + \fi + }% +% \end{macrocode} +% If \sty{texosquery} +%has been loaded, then the current date and time can be fetched +%using \ics{TeXOSQueryNow} provided the shell escape has been +%enabled. (It might not be, so don't automatically load +%\sty{texosquery}.) Since it might have been loaded using \cs{input} +%rather than \cs{usepackage}, just test if \cs{TeXOSQueryNow} has +%been defined. +%\changes{1.5.2}{2016-07-12}{added check for \cs{TeXOSQueryNow}} +% \begin{macrocode} + {% + \ifdef\TeXOSQueryNow + {% + \TeXOSQueryNow{\dtm@pdfcreationdate}% + \ifdefempty\dtm@pdfcreationdate + {% +% \end{macrocode} +%Failed (maybe shell escape has been disabled). +% \begin{macrocode} + \undef\dtm@pdfcreationdate + }% + {}% + }% + {}% + }% + }% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\dtm@yearmonthsep} +% Separator between year and month for numeric dates. +% \begin{macrocode} +\newcommand*{\dtm@yearmonthsep}{-} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\dtm@monthdaysep} +% Separator between month and day for numeric dates. +% \begin{macrocode} +\newcommand*{\dtm@monthdaysep}{-} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\dtm@dayyearsep} +% Separator between day and year for numeric middle-endian dates. +% \begin{macrocode} +\newcommand*{\dtm@dayyearsep}{-} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\dtm@hourminsep} +% Separator between the hour and minute for times. +% \begin{macrocode} +\newcommand*{\dtm@hourminsep}{:} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\dtm@minsecsep} +% Separator between the minute and second for times. +% \begin{macrocode} +\newcommand*{\dtm@minsecsep}{:} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\dtm@timezonesep} +% Separator between the date and time. +% \begin{macrocode} +\newcommand*{\dtm@datetimesep}{\space}% +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\dtm@timezonesep} +% Separator between the time and time zone. +% \begin{macrocode} +\newcommand*{\dtm@timezonesep}{} +% \end{macrocode} +%\end{macro} +% +%\begin{option}{datesep} +% Set year/month and month/day separator. +% \begin{macrocode} +\define@key{datetime2.sty}{datesep}{% + \renewcommand*{\dtm@yearmonthsep}{#1}% + \renewcommand*{\dtm@monthdaysep}{#1}% + \renewcommand*{\dtm@dayyearsep}{#1}% +} +% \end{macrocode} +%\end{option} +% +%\begin{option}{yearmonthsep} +% Set year/month separator. +% \begin{macrocode} +\define@key{datetime2.sty}{yearmonthsep}{% + \renewcommand*{\dtm@yearmonthsep}{#1}% +} +% \end{macrocode} +%\end{option} +% +%\begin{option}{monthdaysep} +% Set month/day separator. +% \begin{macrocode} +\define@key{datetime2.sty}{monthdaysep}{% + \renewcommand*{\dtm@monthdaysep}{#1}% +} +% \end{macrocode} +%\end{option} +% +%\begin{option}{dayyearsep} +% Set day/year separator for middle-endian dates. +% \begin{macrocode} +\define@key{datetime2.sty}{dayyearsep}{% + \renewcommand*{\dtm@dayyearsep}{#1}% +} +% \end{macrocode} +%\end{option} +% +%\begin{option}{timesep} +% Set hour/minute and minute/second separator. +% \begin{macrocode} +\define@key{datetime2.sty}{timesep}{% + \renewcommand*{\dtm@hourminsep}{#1}% + \renewcommand*{\dtm@minsecsep}{#1}% +} +% \end{macrocode} +%\end{option} +% +%\begin{option}{hourminsep} +% Set hour/minute separator. +% \begin{macrocode} +\define@key{datetime2.sty}{hourminsep}{% + \renewcommand*{\dtm@hourminsep}{#1}% +} +% \end{macrocode} +%\end{option} +% +%\begin{option}{minsecsep} +% Set minute/second separator. +% \begin{macrocode} +\define@key{datetime2.sty}{minsecsep}{% + \renewcommand*{\dtm@minsecsep}{#1}% +} +% \end{macrocode} +%\end{option} +% +%\begin{option}{timezonesep} +% Set separator between the time and the time zone (used in +% \cs{DTMnow}). +% \begin{macrocode} +\define@key{datetime2.sty}{timezonesep}{% + \renewcommand*{\dtm@timezonesep}{#1}% +} +% \end{macrocode} +%\end{option} +% +%\begin{option}{datetimesep} +% Set separator between the date and the time (used in +% \cs{DTMnow}). +% \begin{macrocode} +\define@key{datetime2.sty}{datetimesep}{% + \renewcommand*{\dtm@datetimesep}{#1}% +} +% \end{macrocode} +%\end{option} +% +%\begin{option}{showseconds} +% Boolean key to determine whether or not to show the seconds. +% \begin{macrocode} +\define@boolkey{datetime2.sty}[DTM]{showseconds}[true]{} +% \end{macrocode} +%\end{option} +% +%\begin{option}{showdate} +% Boolean key to determine whether or not to show the date in +% \cs{DTMdisplay} and \cs{DTMDisplay}. +% \begin{macrocode} +\define@boolkey{datetime2.sty}[DTM]{showdate}[true]{} +\DTMshowdatetrue +% \end{macrocode} +%\end{option} +% +%\begin{option}{showzone} +% Boolean key to determine whether or not to show the time zone in +% \cs{DTMdisplay} and \cs{DTMDisplay}. +% \begin{macrocode} +\define@boolkey{datetime2.sty}[DTM]{showzone}[true]{} +% \end{macrocode} +%\end{option} +% +%\begin{option}{showisoZ} +% Boolean key to determine whether or not to use \texttt{Z} instead +% of \texttt{+00:00} for UTC in the \style{default}, \style{iso} or +% \style{pdf} styles. (Other styles may also use this.) +% \begin{macrocode} +\define@boolkey{datetime2.sty}[DTM]{showisoZ}[true]{} +\DTMshowisoZtrue +% \end{macrocode} +%\end{option} +% +% Switch off seconds and time zone if \cs{dtm@pdfcreationdate} +% isn't defined, otherwise switch on. +% \begin{macrocode} +\ifdef\dtm@pdfcreationdate +{% + \DTMshowsecondstrue + \DTMshowzonetrue +}% +{% + \DTMshowsecondsfalse + \DTMshowzonefalse +}% +% \end{macrocode} +% +%\begin{option}{showzoneminutes} +% Boolean key to determine whether or not to show the time zone +% minutes. (If \cs{DTMshowzonefalse} then this option is irrelevant.) +% \begin{macrocode} +\define@boolkey{datetime2.sty}[DTM]{showzoneminutes}[true]{} +\DTMshowzoneminutestrue +% \end{macrocode} +%\end{option} +% +%\begin{macro}{\DTMifcaseregional} +%\begin{definition} +%\cs{DTMifcaseregional}\marg{false}\marg{text}\marg{numeric} +%\end{definition} +% Determines if the user wants the language modules to set the +% regional format. The first argument \meta{false} indicates that +% they don't want the regional format set, the second argument +% \meta{text} indicates they want the textual format (e.g. 1st +% March, 2015 or March 1, 2005) and the third argument \meta{numeric} +% indicates they want the numeric format (e.g. 1/3/2015 or +% 3/1/2015). A change in the setting will only have an affect when +% the module is loaded and when \cs{date}\meta{language} is used to +% set the style. The default is false. +% \begin{macrocode} +\newcommand*{\DTMifcaseregional}[3]{#1} +% \end{macrocode} +%\end{macro} +% +%\begin{option}{useregional} +% Setting to determine whether or not to use the regional +% settings (if any are loaded). +% \begin{macrocode} +\define@choicekey{datetime2.sty}{useregional}[\val\nr]% + {false,text,numeric,num}[text]% + {% + \ifcase\nr\relax + \renewcommand*{\DTMifcaseregional}[3]{##1}% + \or + \renewcommand*{\DTMifcaseregional}[3]{##2}% + \or + \renewcommand*{\DTMifcaseregional}[3]{##3}% + \or + \renewcommand*{\DTMifcaseregional}[3]{##3}% + \fi + } +% \end{macrocode} +%\end{option} +% +%\begin{macro}{\@dtm@setusecalc} +% \begin{macrocode} +\newcommand*{\@dtm@setusecalc}{% + \renewcommand*{\@dtm@usecalc}{\RequirePackage{datetime2-calc}}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@dtm@usecalc} +% \begin{macrocode} +\newcommand*{\@dtm@usecalc}{} +% \end{macrocode} +%\end{macro} +% Disable attempt to load \sty{datetime2-calc} in the document. +% \begin{macrocode} +\AtBeginDocument{% + \@ifpackageloaded{datetime2-calc}% + {% + \renewcommand*{\@dtm@setusecalc}{}% + }% + {% + \renewcommand*{\@dtm@setusecalc}{% + \PackageError{datetime2}{You must load `datetime2-calc' + package to use option `showdow'}{Try one of the following:^^J + pass `calc' option to `datetime2' package when you load it^^J + or move `showdow' option to `datetime2' package option list^^J + or move \string\DTLsetup\space to the preamble.}% + }% + }% +} +% \end{macrocode} +% +%\begin{option}{calc} +% This option will load the \sty{datetime2-calc} which uses the +% \sty{pgfcalendar} package to compute the day of week and offsets. +% The package is loaded at the end of this one. +% \begin{macrocode} +\DeclareOptionX{calc}{\@dtm@setusecalc} +% \end{macrocode} +%\end{option} +% +%\begin{option}{showdow} +% Boolean key to determine whether or not to show the day of week +% for the styles that can show the day of week. If this is switched +% on, then \sty{datetime2-calc} is required. If this key is set later +% in the document with \cs{DTMsetup}, then the \sty{datetime2-calc} +% package must previously be loaded for it to have an effect. +% \begin{macrocode} +\define@boolkey{datetime2.sty}[DTM]{showdow}[true]{% + \ifDTMshowdow \@dtm@setusecalc \fi +} +\DTMshowdowfalse +% \end{macrocode} +%\end{option} +% +%\begin{macro}{\@dtm@warning} +% Warning messages. +% \begin{macrocode} +\newcommand*{\@dtm@warning}[1]{% + \if@dtm@warn + \PackageWarning{datetime2}{#1}% + \fi +} +% \end{macrocode} +%\end{macro} +% +%\begin{option}{warn} +% Allow user to suppress package warnings. +% \begin{macrocode} +\define@boolkey{datetime2.sty}[@dtm@]{warn}[true]{} +\@dtm@warntrue +% \end{macrocode} +%\end{option} +% +%\begin{macro}{\@dtm@initialstyle} +% \begin{macrocode} +\newcommand*{\@dtm@initialstyle}{} +% \end{macrocode} +%\end{macro} +%\begin{option}{style} +% Set the style. This automatically sets +% \pkgopt[false]{useregional}. +% \begin{macrocode} +\define@key{datetime2.sty}{style}{% + \renewcommand*{\@dtm@initialstyle}{#1}% + \ifstrempty{#1}% + {}% + {% + \renewcommand*{\DTMifcaseregional}[3]{##1}% + }% +} +% \end{macrocode} +%\end{option} +% +% Pass any unknown options to \sty{tracklang}. +% This will automatically switch the "useregional" setting to +% \texttt{text}. +%\changes{1.3}{2016-01-22}{added predefined dialect test} +% \begin{macrocode} +\DeclareOptionX*{% + \ifcsundef{@tracklang@add@\CurrentOption}% + {% + \PackageError{datetime2}{`\CurrentOption' is not a recognised dialect. + \MessageBreak Perhaps you have misspelt it or the + \MessageBreak named dialect may be unsupported or + \MessageBreak perhaps you forgot to use the `style' key}% + {Any options that aren't described in the manual are assumed + \MessageBreak to be language or dialect names.}% + }% + {% + \TrackPredefinedDialect{\CurrentOption}% + \renewcommand*{\DTMifcaseregional}[3]{#2}% + }% +} +% \end{macrocode} +% +%Process options passed to this package: +% \begin{macrocode} +\ProcessOptionsX +% \end{macrocode} +% +% Disable \texttt{calc} option. If it's required, just load +% \sty{datetime2-calc} with \cs{usepackage}. +% \begin{macrocode} +\disable@keys{datetime2.sty}{calc} +% \end{macrocode} +% Disable \texttt{style} option. If it's required, just +% use \cs{DTMsetup}. +% \begin{macrocode} +\disable@keys{datetime2.sty}{style} +% \end{macrocode} +% +% Provide a way to set options after package has been loaded. +%\begin{macro}{\DTMsetup} +% \begin{macrocode} +\newcommand*{\DTMsetup}[1]{% + \def\@dtm@usecalc{}% + \setkeys{datetime2.sty}{#1}% + \@dtm@usecalc +} +% \end{macrocode} +%\end{macro} +% +%\subsection{Defaults} +% This section sets up the defaults. +% +%\begin{macro}{\@dtm@parsedate} +% Parse date in the format \meta{year}-\meta{month}-\meta{day}. +% The arguments are expanded. (This is redefined by +% \sty{datetime2-calc}.) +% \begin{macrocode} +\def\@dtm@parsedate#1-#2-#3\@dtm@endparsedate{% + \edef\@dtm@year{\number#1}% + \edef\@dtm@month{\number#2}% + \edef\@dtm@day{\number#3}% + \def\@dtm@dow{-1}% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\@dtm@parsetime} +% Define command to parse time in the format +% \meta{h}:\meta{m}:\meta{s}. The results are stored in +% \cs{@dtm@hour}, \cs{@dtm@minute} and \cs{@dtm@second}. +% The arguments are expanded. +% \begin{macrocode} +\def\@dtm@parsetime#1:#2:#3\@dtm@endparsetime{% + \edef\@dtm@hour{\number#1}% + \edef\@dtm@minute{\number#2}% + \edef\@dtm@second{\number#3}% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\@dtm@parsetimezn} +% Define command to parse time in the format +% \meta{h}:\meta{m}:\meta{s} \meta{znh}:\meta{znm}. The results are stored in +% \cs{@dtm@hour}, \cs{@dtm@minute}, \cs{@dtm@second}, +% \cs{@dtm@timezonehour} and \cs{@dtm@timezoneminute}. +% The arguments are expanded. +% \begin{macrocode} +\def\@dtm@parsetimezn#1:#2:#3 #4\@dtm@endparsetimezn{% + \@dtm@parsetime#1:#2:#3\@dtm@endparsetime + \@dtm@parsezone{#4}% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\@dtm@parsezone} +% Define command to parse time zone in the format +% \texttt{Z} or \meta{znh}:\meta{znm}. The results are stored in +% \cs{@dtm@timezonehour} and \cs{@dtm@timezoneminute}. +% The arguments are expanded in the event that registers are used. +% \begin{macrocode} +\newcommand*{\@dtm@parsezone}[1]{% + \ifstrequal{#1}{Z}% + {% + \def\@dtm@timezonehour{+00}% + \def\@dtm@timezoneminute{00}% + }% + {% + \@dtm@parse@zone#1\@dtm@endparse@zone + }% +} +\def\@dtm@parse@zone#1:#2\@dtm@endparse@zone{% + \edef\@dtm@timezonehour{\number#1}% + \edef\@dtm@timezoneminute{\number#2}% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\@dtm@parsetimestamp} +% Parse date and time in ISO format +%\meta{YYYY}-\meta{MM}-\meta{DD}T\meta{hh}:\meta{mm}:\meta{sec}\meta{time +%zone} +% where \meta{time zone} may be \texttt{Z} or in the form +% \meta{hh}:\meta{mm} (where \meta{hh} includes the sign). +% \begin{macrocode} +\def\@dtm@parsetimestamp#1-#2-#3T#4:#5:#6#7#8\@dtm@endparsetimestamp{% + \@dtm@parsedate#1-#2-#3\@dtm@endparsedate + \@dtm@parsetime#4:#5:#6#7\@dtm@endparsetime + \@dtm@parsezone{#8}% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMsavefilemoddate} +% Not available for some engines. +% \begin{macrocode} +\newcommand*{\DTMsavefilemoddate}[2]{% + \@dtm@warning{Your TeX engine doesn't support accessing + file modification dates}% + \cslet{@dtm@#1@year}{0}% + \cslet{@dtm@#1@month}{0}% + \cslet{@dtm@#1@day}{0}% + \cslet{@dtm@#1@dow}{-1}% + \cslet{@dtm@#1@hour}{0}% + \cslet{@dtm@#1@minute}{0}% + \cslet{@dtm@#1@second}{0}% + \cslet{@dtm@#1@TZhour}{0}% + \cslet{@dtm@#1@TZminute}{0}% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMsavefrompdfdata} +%\changes{1.5.2}{2016-07-12}{new} +%Save a date-time stamp that's specified in PDF format. +% \begin{macrocode} +\newcommand*{\DTMsavefrompdfdata}[2]{% + \edef\@dtm@tmp{#2}% + \expandafter\@dtm@parsepdfdatetime\@dtm@tmp\@dtm@endparsepdfdatetime + \cslet{@dtm@#1@year}{\@dtm@year}% + \cslet{@dtm@#1@month}{\@dtm@month}% + \cslet{@dtm@#1@day}{\@dtm@day}% + \cslet{@dtm@#1@dow}{\@dtm@dow}% + \cslet{@dtm@#1@hour}{\@dtm@hour}% + \cslet{@dtm@#1@minute}{\@dtm@minute}% + \cslet{@dtm@#1@second}{\@dtm@second}% + \cslet{@dtm@#1@TZhour}{\@dtm@timezonehour}% + \cslet{@dtm@#1@TZminute}{\@dtm@timezoneminute}% +} +% \end{macrocode} +%\end{macro} +% +% Find out the current time. If \cs{dtm@pdfcreationdate} is defined, +% it can be fetched from that. +% \begin{macrocode} +\ifdef\dtm@pdfcreationdate +{% +% \end{macrocode} +% Define commands to parse \cs{dtm@pdfcreationdate} +% \begin{macrocode} + \def\@dtm@parsepdfdatetime#1:#2#3#4#5#6#7#8#9{% + \def\@dtm@year{#2#3#4#5}% + \def\@dtm@month{#6#7}% + \def\@dtm@day{#8#9}% + \@dtm@parsepdftime + } + \def\@dtm@parsepdftime#1#2#3#4#5#6#7\@dtm@endparsepdfdatetime{% + \def\@dtm@hour{#1#2}% + \def\@dtm@minute{#3#4}% + \def\@dtm@second{#5#6}% + \ifstrequal{#7}{Z}% + {% + \def\@dtm@timezonehour{00}% + \def\@dtm@timezoneminute{00}% + }% + {% + \@dtm@parsepdftimezone#7% + }% + } + \def\@dtm@parsepdftimezone#1'#2'{% + \def\@dtm@timezonehour{#1}% + \def\@dtm@timezoneminute{#2}% + }% +% \end{macrocode} +% Now parse \cs{dtm@pdfcreationdate} +% \begin{macrocode} + \expandafter\@dtm@parsepdfdatetime\dtm@pdfcreationdate\@dtm@endparsepdfdatetime +% \end{macrocode} +% Save the values. +% \begin{macrocode} + \let\@dtm@currentyear\@dtm@year + \let\@dtm@currentmonth\@dtm@month + \let\@dtm@currentday\@dtm@day + \let\@dtm@currenthour\@dtm@hour + \let\@dtm@currentminute\@dtm@minute + \let\@dtm@currentsecond\@dtm@second + \let\@dtm@currenttimezonehour\@dtm@timezonehour + \let\@dtm@currenttimezoneminute\@dtm@timezoneminute +% +% \end{macrocode} +% Lua\TeX\ doesn't provide \cs{pdffilemoddate}. +% \begin{macrocode} + \ifdef\pdffilemoddate + {% + \renewcommand*{\DTMsavefilemoddate}[2]{% + \expandafter\@dtm@parsepdfdatetime\pdffilemoddate{#2}\@dtm@endparsepdfdatetime + \cslet{@dtm@#1@year}{\@dtm@year}% + \cslet{@dtm@#1@month}{\@dtm@month}% + \cslet{@dtm@#1@day}{\@dtm@day}% + \cslet{@dtm@#1@dow}{\@dtm@dow}% + \cslet{@dtm@#1@hour}{\@dtm@hour}% + \cslet{@dtm@#1@minute}{\@dtm@minute}% + \cslet{@dtm@#1@second}{\@dtm@second}% + \cslet{@dtm@#1@TZhour}{\@dtm@timezonehour}% + \cslet{@dtm@#1@TZminute}{\@dtm@timezoneminute}% + } + }% + {% + \ifdef\directlua + { +% \end{macrocode} +% Lua time zone information provided by \verb|%z| is OS dependent, +% so this might not work. +% \begin{macrocode} + \renewcommand*{\DTMsavefilemoddate}[2]{% + \expandafter\@dtm@parseluadatetime + \directlua{tex.print(os.date( + "\expandafter\@gobble\string\%Y-% + \expandafter\@gobble\string\%m-% + \expandafter\@gobble\string\%d-% + \expandafter\@gobble\string\%w + \expandafter\@gobble\string\%H:% + \expandafter\@gobble\string\%M:% + \expandafter\@gobble\string\%S + \expandafter\@gobble\string\%z", + lfs.attributes("#2").modification))}% + \@dtm@endparseluadatetime + \cslet{@dtm@#1@year}{\@dtm@year}% + \cslet{@dtm@#1@month}{\@dtm@month}% + \cslet{@dtm@#1@day}{\@dtm@day}% + \cslet{@dtm@#1@dow}{\@dtm@dow}% + \cslet{@dtm@#1@hour}{\@dtm@hour}% + \cslet{@dtm@#1@minute}{\@dtm@minute}% + \cslet{@dtm@#1@second}{\@dtm@second}% + \cslet{@dtm@#1@TZhour}{\@dtm@TZhour}% + \cslet{@dtm@#1@TZminute}{\@dtm@TZminute}% + } + \def\@dtm@parseluadatetime#1-#2-#3-#4 #5:#6:#7 #8\@dtm@endparseluadatetime{% + \edef\@dtm@year{\number#1}% + \edef\@dtm@month{\number#2}% + \edef\@dtm@day{\number#3}% + \edef\@dtm@dow{\number#4}% + \edef\@dtm@hour{\number#5}% + \edef\@dtm@minute{\number#6}% + \edef\@dtm@second{\number#7}% + \@dtm@parseluatimezone#8000000\@dtm@endparseluatimezone + } + \def\@dtm@parseluatimezone#1#2#3#4#5#6{% + \ifstrequal{#1}{+}% + {% + \def\@dtm@TZhour{#1#2#3}% + \ifstrequal{#4}{:}% + {% + \def\@dtm@TZminute{#5#6}% + }% + {% + \def\@dtm@TZminute{#4#5}% + }% + }% + {% + \ifstrequal{#1}{-}% + {% + \def\@dtm@TZhour{#1#2#3}% + \ifstrequal{#4}{:}% + {% + \def\@dtm@TZminute{#5#6}% + }% + {% + \def\@dtm@TZminute{#4#5}% + }% + }% + {% + \ifstrequal{#1}{Z}% + {% + \def\@dtm@TZhour{0}% + \def\@dtm@TZminute{0}% + }% + {% + \def\@dtm@TZhour{#1#2}% + \ifstrequal{#3}{:}% + {% + \def\@dtm@TZminute{#4#5}% + }% + {% + \def\@dtm@TZminute{#3#4}% + }% + }% + }% + }% + \@@dtm@parseluatimezone + } + \def\@@dtm@parseluatimezone#1\@dtm@endparseluatimezone{% + } + } + {% +% \end{macrocode} +%If \ics{directlua} isn't defined but \sty{texosquery} has been +%loaded, we can use \cs{TeXOSQueryFileDate} if the shell escape is +%enabled. +% \begin{macrocode} + \ifdef\TeXOSQueryFileDate + { + \renewcommand*{\DTMsavefilemoddate}[2]{% + \TeXOSQueryFileDate{\@dtm@tmp}{#2}% + \ifdefempty\@dtm@tmp + {% +% \end{macrocode} +% OS query failed. +% \begin{macrocode} + \@dtm@warning{Your TeX engine doesn't support accessing + file modification dates and the attempt to use texosquery + failed}% + \cslet{@dtm@#1@year}{0}% + \cslet{@dtm@#1@month}{0}% + \cslet{@dtm@#1@day}{0}% + \cslet{@dtm@#1@dow}{-1}% + \cslet{@dtm@#1@hour}{0}% + \cslet{@dtm@#1@minute}{0}% + \cslet{@dtm@#1@second}{0}% + \cslet{@dtm@#1@TZhour}{0}% + \cslet{@dtm@#1@TZminute}{0}% + }% + {% + \expandafter\@dtm@parsepdfdatetime\@dtm@tmp\@dtm@endparsepdfdatetime + \cslet{@dtm@#1@year}{\@dtm@year}% + \cslet{@dtm@#1@month}{\@dtm@month}% + \cslet{@dtm@#1@day}{\@dtm@day}% + \cslet{@dtm@#1@dow}{\@dtm@dow}% + \cslet{@dtm@#1@hour}{\@dtm@hour}% + \cslet{@dtm@#1@minute}{\@dtm@minute}% + \cslet{@dtm@#1@second}{\@dtm@second}% + \cslet{@dtm@#1@TZhour}{\@dtm@timezonehour}% + \cslet{@dtm@#1@TZminute}{\@dtm@timezoneminute}% + }% + }% + } + {} + } + }% +}% +{% +% \end{macrocode} +% \cs{pdfcreationdate} not defined. By a process of elimination, the +% \TeX\ engine is either \XeTeX\ or it's very old. (Or it may be a +% new version of Lua\TeX\ without \sty{luatex85}.) In this case, the +% seconds and time zone can't be obtained. The hour and minute need +% to be calculated from \TeX's \cs{time} primitive. +% \begin{macrocode} + \count@=\time\relax + \divide\count@ by 60\relax + \edef\@dtm@currenthour{\number\count@}% + \multiply\count@ by -60\relax + \advance\count@ by \time\relax + \edef\@dtm@currentminute{\number\count@}% + \newcommand*{\@dtm@currentsecond}{00}% + \newcommand\@dtm@currenttimezonehour{00}% + \newcommand\@dtm@currenttimezoneminute{00}% +% \end{macrocode} +% Get the day, month and year from \TeX's primitives. +% \begin{macrocode} + \edef\@dtm@currentyear{\number\year}% + \edef\@dtm@currentmonth{\number\month}% + \edef\@dtm@currentday{\number\day}% +} +% \end{macrocode} +% Make \cs{DTMsavefilemoddate} robust. +% \begin{macrocode} +\robustify\DTMsavefilemoddate +% \end{macrocode} +% +% Current day of week defaults to \texttt{-1} (that is, ignore it). +%\begin{macro}{\@dtm@currentdow} +% \begin{macrocode} +\newcommand*{\@dtm@currentdow}{-1} +% \end{macrocode} +%\end{macro} +% +% Allow \XeLaTeX\ users a way of manually setting the current time zone. +%\begin{macro}{\DTMsetcurrentzone} +% \begin{macrocode} +\newcommand*{\DTMsetcurrentzone}[2]{% + \renewcommand\@dtm@currenttimezonehour{#1}% + \renewcommand\@dtm@currenttimezoneminute{#2}% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMtoday} +%\changes{2016-02-11}{1.4}{new} +% Provided in case of conflict to obtain \styfmt{datetime2}'s +% version of \cs{today}. +% \begin{macrocode} +\newcommand*{\DTMtoday}{% + \DTMdisplaydate + {\@dtm@currentyear}% + {\@dtm@currentmonth}% + {\@dtm@currentday}% + {\@dtm@currentdow}% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\today} +%\changes{2016-02-11}{1.4}{no longer using \cs{renewcommand}} +% Version 1.4 dropped \cs{renewcommand} in case +% \cs{today} hasn't already been defined. +% \begin{macrocode} +\let\today\DTMtoday +% \end{macrocode} +%\end{macro} +% +% The \cls{scrlttr2} class redefines \cs{today} at the start of the +% document, so check for this. +% \begin{macrocode} +\@ifclassloaded{scrlttr2}{\AtBeginDocument{\let\today\DTMtoday}}{} +% \end{macrocode} +% +%\begin{macro}{\DTMToday} +% First letter upper case version. +%\changes{2016-02-11}{1.4}{new} +% Added to v1.4 to provide \sty{datetime2}'s version in case of +% conflict. +% \begin{macrocode} +\newcommand*{\DTMToday}{% + \DTMDisplaydate + {\@dtm@currentyear}% + {\@dtm@currentmonth}% + {\@dtm@currentday}% + {\@dtm@currentdow}% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\Today} +% \begin{macrocode} +\let\Today\DTMToday +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMdisplaydate} +%\begin{definition} +%\cs{DTMdisplaydate}\marg{year}\marg{month}\marg{day}\marg{day of +%week} +%\end{definition} +% Display the given date. If the day of week is negative, ignore it. +% The default style ignores it regardless. +% \begin{macrocode} +\newcommand*\DTMdisplaydate[4]{% + \number#1\dtm@yearmonthsep\DTMtwodigits{#2}\dtm@monthdaysep\DTMtwodigits{#3}% +}% +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMDisplaydate} +% First letter upper case version. Defaults to \cs{DTMdisplaydate}. +% \begin{macrocode} +\newcommand*{\DTMDisplaydate}{\DTMdisplaydate} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMdate} +% Display date where date is specified in the format +%\meta{yyyy}-\meta{mm}-\meta{dd}. Use \cs{expandafter} in case +%argument is a control sequence containing the date. +% This command isn't expandable +% \begin{macrocode} +\newrobustcmd*{\DTMdate}[1]{% + \expandafter\@dtm@parsedate#1\@dtm@endparsedate + \DTMdisplaydate{\@dtm@year}{\@dtm@month}{\@dtm@day}{\@dtm@dow}% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMDate} +% Upper case version. +% \begin{macrocode} +\newrobustcmd*{\DTMDate}[1]{% + \expandafter\@dtm@parsedate#1\@dtm@endparsedate + \DTMDisplaydate{\@dtm@year}{\@dtm@month}{\@dtm@day}{\@dtm@dow}% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMcurrenttime} +% Display the current time. +% \begin{macrocode} +\newcommand*{\DTMcurrenttime}{% + \DTMdisplaytime + {\@dtm@currenthour}% + {\@dtm@currentminute}% + {\@dtm@currentsecond}% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMdisplaytime} +%\begin{definition} +%\cs{DTMdisplaytime}\marg{hour}\marg{minute}\marg{sec} +%\end{definition} +% Display the given time. +% \begin{macrocode} +\newcommand*\DTMdisplaytime[3]{% + \DTMtwodigits{#1}\dtm@hourminsep\DTMtwodigits{#2}% + \ifDTMshowseconds\dtm@minsecsep\DTMtwodigits{#3}\fi +}% +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMtime} +% Display date where time is specified in the format +%\meta{hour}:\meta{minute}:\meta{seconds}. This uses \cs{expandafter} in case +%argument is a control sequence containing the time. Not expandable. +% \begin{macrocode} +\newrobustcmd*{\DTMtime}[1]{% + \@dtm@parsetime#1\@dtm@endparsetime + \DTMdisplaytime{\@dtm@hour}{\@dtm@minute}{\@dtm@second}% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMcurrentzone} +% Display the current time zone. +% \begin{macrocode} +\newcommand*{\DTMcurrentzone}{% + \DTMdisplayzone + {\@dtm@currenttimezonehour}% + {\@dtm@currenttimezoneminute}% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMdisplayzone} +% Display time zone. +% \begin{macrocode} +\newcommand*{\DTMdisplayzone}[2]{% + \ifboolexpe + { bool{DTMshowisoZ} + and test{\ifnumequal{#1}{0}} + and test{\ifnumequal{#2}{0}} + }% + {% + Z% + }% + {% + \ifnum#1<0\else+\fi\DTMtwodigits{#1}% + \ifDTMshowzoneminutes\dtm@hourminsep\DTMtwodigits{#2}\fi + }% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMnow} +% Current date, time and time zone. +% \begin{macrocode} +\newcommand*{\DTMnow}{% + \DTMdisplay + {\@dtm@currentyear} + {\@dtm@currentmonth} + {\@dtm@currentday} + {\@dtm@currentdow} + {\@dtm@currenthour}% + {\@dtm@currentminute}% + {\@dtm@currentsecond}% + {\@dtm@currenttimezonehour}% + {\@dtm@currenttimezoneminute}% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMNow} +% Current date, time and time zone. +% \begin{macrocode} +\newcommand*{\DTMNow}{% + \DTMDisplay + {\@dtm@currentyear} + {\@dtm@currentmonth} + {\@dtm@currentday} + {\@dtm@currentdow} + {\@dtm@currenthour}% + {\@dtm@currentminute}% + {\@dtm@currentsecond}% + {\@dtm@currenttimezonehour}% + {\@dtm@currenttimezoneminute}% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMdisplay} +%\begin{definition} +%\cs{DTMdisplay}\marg{YYYY}\marg{MM}\marg{DD}\marg{DOW}\marg{hh}\marg{mm}\marg{ss}\newline\marg{TZh}\marg{TZm} +%\end{definition} +% Display the date and time. +% \begin{macrocode} +\newcommand*{\DTMdisplay}[9]{% + \ifDTMshowdate + \DTMdisplaydate{#1}{#2}{#3}{#4}% + \dtm@datetimesep + \fi + \DTMdisplaytime + {#5}% + {#6}% + {#7}% + \ifDTMshowzone + \dtm@timezonesep + \DTMdisplayzone + {#8}% + {#9}% + \fi +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMDisplay} +%\begin{definition} +%\cs{DTMDisplay}\marg{YYYY}\marg{MM}\marg{DD}\marg{DOW}\marg{hh}\marg{mm}\marg{ss}\newline\marg{TZh}\marg{TZm} +%\end{definition} +% First letter upper case version. Defaults to \cs{DTMdisplay}. +% \begin{macrocode} +\newcommand*{\DTMDisplay}{\DTMdisplay} +% \end{macrocode} +%\end{macro} +% +%\subsection{Styles} +% +% Provide user level commands for displaying number as two digits. +% (Truncate if over 99, to allow for converting year to two digits). +%\begin{macro}{\DTMtwodigits} +% \begin{macrocode} +\newcommand*{\DTMtwodigits}[1]{% + \ifnum#1<0 + -\DTMtwodigits{-#1}% + \else + \ifnum#1<100 + \ifnum#1<10 + 0\number#1 + \else + \number#1 + \fi + \else +% \end{macrocode} +% \cs{numexpr} rounds rather than truncates integer division, which +% is a little awkward to get around in an expandable context. +% \begin{macrocode} + \ifnum\numexpr#1-(#1/100)*100<0 + \number\numexpr#1-((#1/100)-1)*100\relax + \else + \number\numexpr#1-(#1/100)*100\relax + \fi + \fi + \fi +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMcentury} +% Expands to the given number divided by 100 rounded upwards (in +% absolute terms). +% Provided in case the user just wants the century. +% \begin{macrocode} +\newcommand*{\DTMcentury}[1]{% + \ifnum#1<0 + -\DTMcentury{-#1}% + \else + \ifnum\numexpr#1-(#1/100)*100<1 + \number\numexpr#1/100\relax + \else + \number\numexpr(#1/100)+1\relax + \fi + \fi +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMdivhundred} +% Expands to the given number divided by 100. +% \begin{macrocode} +\newcommand*{\DTMdivhundred}[1]{% + \ifnum#1<0 + -\DTMdivhundred{-#1}% + \else + \ifnum\numexpr#1-(#1/100)*100<0 + \number\numexpr(#1)/100-1\relax + \else + \number\numexpr((#1)/100)\relax + \fi + \fi +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMtexorpdfstring} +%Provide user with a command that will use \sty{hyperref}'s +%\cs{texorpdfstring} if \sty{hyperref} has been loaded. If +%\sty{hyperref} isn't loaded it just does the first argument. +% \begin{macrocode} +\newcommand*{\DTMtexorpdfstring}[2]{#1} +\AtBeginDocument{% + \@ifpackageloaded{hyperref}% + {% + \renewcommand*{\DTMtexorpdfstring}{\texorpdfstring}% + }% + {}% +} +% \end{macrocode} +%\end{macro} +% +% Access separator: +%\begin{macro}{\DTMsep} +% \begin{macrocode} +\newcommand*{\DTMsep}[1]{\csname dtm@#1sep\endcsname} +% \end{macrocode} +%\end{macro} +% +% Date-only styles are stored internally as +% \cs{@dtm@datestyle@}\meta{label}, time-only styles are stored +% internally as \cs{@dtm@timestyle@}\meta{label}, zone-only styles +% are stored internally as \cs{@dtm@zonestyle@}\meta{label}. +% +%\begin{macro}{\DTMnewdatestyle} +% Define a new date-only style. This should only redefine +% \cs{DTMdisplaydate} and \cs{DTMDisplaydate}, which may or may not +% use the separators \cs{dtm@yearmonthsep} and \cs{dtm@monthdaysep}. +% \begin{macrocode} +\newcommand*{\DTMnewdatestyle}[2]{% + \ifcsdef{@dtm@datestyle@#1}% + {% + \PackageError{datetime2}{Date style `#1' already exists}{}% + }% + {% + \csdef{@dtm@datestyle@#1}{#2}% + }% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMrenewdatestyle} +% Redefine a date style. This should only redefine +% \cs{DTMdisplaydate} and \cs{DTMDisplaydate}, which may or may not +% use the separators \cs{dtm@yearmonthsep} and \cs{dtm@monthdaysep}. +% This may also be used to modify the date part of a full style. +%\changes{1.2}{2015-11-10}{new} +% \begin{macrocode} +\newcommand*{\DTMrenewdatestyle}[2]{% + \ifcsundef{@dtm@datestyle@#1}% + {% + \PackageError{datetime2}{Date style `#1' doesn't exist}{}% + }% + {% + \csdef{@dtm@datestyle@#1}{#2}% + }% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMprovidedatestyle} +% Define a date style if it doesn't already exist. +%\changes{1.2}{2015-11-10}{new} +% \begin{macrocode} +\newcommand*{\DTMprovidedatestyle}[2]{% + \ifcsdef{@dtm@datestyle@#1}% + {% + }% + {% + \csdef{@dtm@datestyle@#1}{#2}% + }% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMnewtimestyle} +% Define a new time-only style. This should only redefine +% \cs{DTMdisplaytime}, which may or may not use the separators +% \cs{dtm@hourminsep} and \cs{dtm@minsecsep}. +% \begin{macrocode} +\newcommand*{\DTMnewtimestyle}[2]{% + \ifcsdef{@dtm@timestyle@#1}% + {% + \PackageError{datetime2}{Time style `#1' already exists}{}% + }% + {% + \csdef{@dtm@timestyle@#1}{#2}% + }% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMrenewtimestyle} +% Redefine a time style. This should only redefine +% \cs{DTMdisplaytime}, which may or may not use the separators +% \cs{dtm@hourminsep} and \cs{dtm@minsecsep}. +% This may also be used to modify the time part of a full style. +%\changes{1.2}{2015-11-10}{new} +% \begin{macrocode} +\newcommand*{\DTMrenewtimestyle}[2]{% + \ifcsundef{@dtm@timestyle@#1}% + {% + \PackageError{datetime2}{Time style `#1' doesn't exist}{}% + }% + {% + \csdef{@dtm@timestyle@#1}{#2}% + }% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMprovidetimestyle} +% Define a time style if it doesn't already exist. +%\changes{1.2}{2015-11-10}{new} +% \begin{macrocode} +\newcommand*{\DTMprovidetimestyle}[2]{% + \ifcsdef{@dtm@timestyle@#1}% + {% + }% + {% + \csdef{@dtm@timestyle@#1}{#2}% + }% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMnewzonestyle} +% Define a new zone-only style. This should only redefine +% \cs{DTMdisplayzone}, which may or may not use the separator +% \cs{dtm@hourminsep}. +% \begin{macrocode} +\newcommand*{\DTMnewzonestyle}[2]{% + \ifcsdef{@dtm@zonestyle@#1}% + {% + \PackageError{datetime2}{Zone style `#1' already exists}{}% + }% + {% + \csdef{@dtm@zonestyle@#1}{#2}% + }% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMrenewzonestyle} +% Redefine a new zone style. This should only redefine +% \cs{DTMdisplayzone}, which may or may not use the separator +% \cs{dtm@hourminsep}. +% This may also be used to modify the zone part of a full style. +%\changes{1.2}{2015-11-10}{new} +% \begin{macrocode} +\newcommand*{\DTMrenewzonestyle}[2]{% + \ifcsundef{@dtm@zonestyle@#1}% + {% + \PackageError{datetime2}{Zone style `#1' doesn't exist}{}% + }% + {% + \csdef{@dtm@zonestyle@#1}{#2}% + }% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMprovidezonestyle} +% Defines a new zone style if it doesn't already exist. +%\changes{1.2}{2015-11-10}{new} +% \begin{macrocode} +\newcommand*{\DTMprovidezonestyle}[2]{% + \ifcsdef{@dtm@zonestyle@#1}% + {% + }% + {% + \csdef{@dtm@zonestyle@#1}{#2}% + }% +} +% \end{macrocode} +%\end{macro} +% +% Zone styles may use mappings to use a~regional time zone (such as +% GMT or BST). It's up to the language modules to define these +% mappings. A~mapping for time zone \meta{TZh}:\meta{TZm} is stored in +% \cs{@dtm@zonemap@}\meta{TZh}\texttt{:}\meta{TZm}. +%\begin{macro}{\DTMdefzonemap} +%\begin{definition} +%\cs{DTMdefzonemap}\marg{TZh}\marg{TZm}\marg{map} +%\end{definition} +% This will override any previous mapping for the given time zone. +% \begin{macrocode} +\newcommand*{\DTMdefzonemap}[3]{% + \csdef{@dtm@zonemap@\DTMtwodigits{#1}:\DTMtwodigits{#2}}{#3}% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMusezonemapordefault} +% Expands to the mapping or the default if not defined. +% \begin{macrocode} +\newcommand*{\DTMusezonemapordefault}[2]{% + \ifcsundef{@dtm@zonemap@\DTMtwodigits{#1}:\DTMtwodigits{#2}}% + {% + \ifnum#1<0\else+\fi + \DTMtwodigits{#1}% + \ifDTMshowzoneminutes\DTMsep{hourmin}\DTMtwodigits{#2}\fi + }% + {\csname @dtm@zonemap@\DTMtwodigits{#1}:\DTMtwodigits{#2}\endcsname}% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMusezonemap} +% Expands to the mapping. (No check if defined.) +% \begin{macrocode} +\newcommand*{\DTMusezonemap}[2]{% + \csname @dtm@zonemap@\DTMtwodigits{#1}:\DTMtwodigits{#2}\endcsname +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMhaszonemap} +% \begin{macrocode} +\newcommand*{\DTMhaszonemap}[4]{% + \ifcsundef{@dtm@zonemap@\DTMtwodigits{#1}:\DTMtwodigits{#2}}{#4}{#3}% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMclearmap} +% Undefines the given zone mapping. No check is made to determine if +% the map exists. +% \begin{macrocode} +\newcommand*{\DTMclearmap}[2]{% + \csundef{@dtm@zonemap@\DTMtwodigits{#1}:\DTMtwodigits{#2}}% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMshowmap} +%Debugging command. +% \begin{macrocode} +\newcommand*{\DTMshowmap}[2]{% + \csshow{@dtm@zonemap@\DTMtwodigits{#1}:\DTMtwodigits{#2}}% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMresetzones} +% Regional modules should use this before setting their local zones, +% so that users can unset previously defined zones that are outside +% the region if they require. By default this does nothing, so no +% modifications are made. +% \begin{macrocode} +\newcommand*{\DTMresetzones}{} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMNatoZoneMaps} +% Provide a command to set the time zone abbreviations to the +% military\slash NATO style. +% \begin{macrocode} +\newcommand*{\DTMNatoZoneMaps}{% + \defzonemap{01}{00}{A}% Alpha time zone + \defzonemap{02}{00}{B}% Bravo time zone + \defzonemap{03}{00}{C}% Charlie time zone + \defzonemap{04}{00}{D}% Delta time zone + \defzonemap{05}{00}{E}% Echo time zone + \defzonemap{06}{00}{F}% Foxtrot time zone + \defzonemap{07}{00}{G}% Golf time zone + \defzonemap{08}{00}{H}% Hotel time zone + \defzonemap{09}{00}{I}% India time zone + \defzonemap{10}{00}{K}% Kilo time zone + \defzonemap{11}{00}{L}% Lima time zone + \defzonemap{12}{00}{M}% Mike time zone + \defzonemap{-01}{00}{N}% November time zone + \defzonemap{-02}{00}{O}% Oscar time zone + \defzonemap{-03}{00}{P}% Papa time zone + \defzonemap{-04}{00}{Q}% Quebec time zone + \defzonemap{-05}{00}{R}% Romeo time zone + \defzonemap{-06}{00}{S}% Sierra time zone + \defzonemap{-07}{00}{T}% Tango time zone + \defzonemap{-08}{00}{U}% Uniform time zone + \defzonemap{-09}{00}{V}% Victor time zone + \defzonemap{-10}{00}{W}% Whiskey time zone + \defzonemap{-11}{00}{X}% X-ray time zone + \defzonemap{-12}{00}{Y}% Yankee time zone + \defzonemap{00}{00}{Z}% Zulu time zone +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMifhasstyle} +%\begin{definition} +%\cs{DTMifhasstyle}\marg{label}\marg{true}\marg{false} +%\end{definition} +%\changes{1.5.2}{2016-07-12}{new} +%Test to determine if style exists. +% \begin{macrocode} +\newcommand*{\DTMifhasstyle}[3]{% + \ifcsdef{@dtm@style@#1}{#2}{#3}% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMifhasdatestyle} +%\begin{definition} +%\cs{DTMifhasdatestyle}\marg{label}\marg{true}\marg{false} +%\end{definition} +%\changes{1.5.2}{2016-07-12}{new} +%Test to determine if partial date style exists. +% \begin{macrocode} +\newcommand*{\DTMifhasdatestyle}[3]{% + \ifcsdef{@dtm@datestyle@#1}{#2}{#3}% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMifhastimestyle} +%\begin{definition} +%\cs{DTMifhastimestyle}\marg{label}\marg{true}\marg{false} +%\end{definition} +%\changes{1.5.2}{2016-07-12}{new} +%Test to determine if time style exists. +% \begin{macrocode} +\newcommand*{\DTMifhastimestyle}[3]{% + \ifcsdef{@dtm@timestyle@#1}{#2}{#3}% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMifhaszonestyle} +%\begin{definition} +%\cs{DTMifhaszonestyle}\marg{label}\marg{true}\marg{false} +%\end{definition} +%\changes{1.5.2}{2016-07-12}{new} +%Test to determine if time zone style exists. +% \begin{macrocode} +\newcommand*{\DTMifhaszonestyle}[3]{% + \ifcsdef{@dtm@zonestyle@#1}{#2}{#3}% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMnewstyle} +%\begin{definition} +%\cs{DTMnewstyle}\marg{label}\marg{date style definition}\marg{time +%style definition}\marg{zone style definition}\marg{full format +%definition} +%\end{definition} +% Define a new style. The full format redefines \cs{DTMdisplay} +% and \cs{DTMDisplay}. +% \begin{macrocode} +\newcommand*{\DTMnewstyle}[5]{% + \DTMifhasstyle{#1}% + {% + \PackageError{datetime2}{Style `#1' already exists}{}% + }% + {% + \DTMnewdatestyle{#1}{#2}% + \DTMnewtimestyle{#1}{#3}% + \DTMnewzonestyle{#1}{#4}% + \csdef{@dtm@style@#1}{% + \csuse{@dtm@datestyle@#1}% + \csuse{@dtm@timestyle@#1}% + \csuse{@dtm@zonestyle@#1}% + #5% + }% + }% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMrenewstyle} +%\begin{definition} +%\cs{DTMrenewstyle}\marg{label}\marg{date style definition}\marg{time +%style definition}\marg{zone style definition}\marg{full format +%definition} +%\end{definition} +% Redefine a style. The full format redefines \cs{DTMdisplay} +% and \cs{DTMDisplay}. +%\changes{1.2}{2015-11-10}{new} +% \begin{macrocode} +\newcommand*{\DTMrenewstyle}[5]{% + \DTMifhasstyle{#1}% + {% + \DTMrenewdatestyle{#1}{#2}% + \DTMrenewtimestyle{#1}{#3}% + \DTMrenewzonestyle{#1}{#4}% + \csdef{@dtm@style@#1}{% + \csuse{@dtm@datestyle@#1}% + \csuse{@dtm@timestyle@#1}% + \csuse{@dtm@zonestyle@#1}% + #5% + }% + }% + {% + \PackageError{datetime2}{Style `#1' doesn't exist}{}% + }% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMprovidestyle} +%\begin{definition} +%\cs{DTMprovidestyle}\marg{label}\marg{date style definition}\marg{time +%style definition}\marg{zone style definition}\marg{full format +%definition} +%\end{definition} +% Defines a full style if it doesn't already exist. +%\changes{1.2}{2015-11-10}{new} +% \begin{macrocode} +\newcommand*{\DTMprovidestyle}[5]{% + \DTMifhasstyle{#1}% + {% + }% + {% + \DTMprovidedatestyle{#1}{#2}% + \DTMprovidetimestyle{#1}{#3}% + \DTMprovidezonestyle{#1}{#4}% + \csdef{@dtm@style@#1}{% + \csuse{@dtm@datestyle@#1}% + \csuse{@dtm@timestyle@#1}% + \csuse{@dtm@zonestyle@#1}% + #5% + }% + }% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMsetdatestyle} +% \begin{macrocode} +\newrobustcmd*{\DTMsetdatestyle}[1]{% + \ifcsdef{@dtm@datestyle@#1}% + {\csuse{@dtm@datestyle@#1}}% + {% + \PackageError{datetime2}{Date style `#1' not defined}{}% + }% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMsettimestyle} +% \begin{macrocode} +\newrobustcmd*{\DTMsettimestyle}[1]{% + \ifcsdef{@dtm@timestyle@#1}% + {\csuse{@dtm@timestyle@#1}}% + {% + \PackageError{datetime2}{Time style `#1' not defined}{}% + }% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMsetzonestyle} +% \begin{macrocode} +\newrobustcmd*{\DTMsetzonestyle}[1]{% + \ifcsdef{@dtm@zonestyle@#1}% + {\csuse{@dtm@zonestyle@#1}}% + {% + \PackageError{datetime2}{Zone style `#1' not defined}{}% + }% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMtryregional} +%\begin{definition} +%\cs{DTMtryregional}\oarg{lang}\marg{lang code cs}\marg{country code cs} +%\end{definition} +%Tries to see if the regional style can be set. Takes into account +%the \pkgopt{useregional} setting. The starred version expects the arguments to be +%control sequences. If both are blank or undefined nothing +%happens. The optional argument may be the root language label, +%which is used if no style exists for the ISO codes. +%\changes{1.5.2}{2016-07-12}{new} +% \begin{macrocode} +\newcommand*{\DTMtryregional}{% + \@ifstar\s@dtm@tryregional\@dtm@tryregional +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\@dtm@tryregional} +% \begin{macrocode} +\newcommand*{\@dtm@tryregional}[3][]{% + \edef\@dtm@langcode{#2}% + \edef\@dtm@countrycode{#3}% + \s@dtm@tryregional[#1]{\@dtm@langcode}{\@dtm@countrycode}% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\s@dtm@tryregional} +% \begin{macrocode} +\newcommand*{\s@dtm@tryregional}[3][]{% + \def\@dtm@thisstyle{}% + \edef\@dtm@root{#1}% + \ifdefempty{#2}{}% + {% + \let\@dtm@thisstyle#2% +% \end{macrocode} +% Determine the root language name if not already provided in the +% optional argument. +% \begin{macrocode} + \ifdefempty\@dtm@root + {% + \edef\@dtm@root{\TrackedLanguageFromIsoCode{639-1}{#2}}% + \ifdefempty\@dtm@root + {% + \edef\@dtm@root{\TrackedLanguageFromIsoCode{639-2}{#2}}% + }% + {}% + }% + {}% + }% + \ifdefempty{#3}{}% + {% + \ifdefempty\@dtm@thisstyle + {\let\@dtm@thisstyle#3}% + {\eappto\@dtm@thisstyle{-#3}}% + }% + \ifdefempty\@dtm@thisstyle + {}% + {% + \DTMifcaseregional + {}% + {% + \DTMifhasstyle{\@dtm@thisstyle}% + {% + \csuse{@dtm@style@\@dtm@thisstyle}% + }% + {% + \ifdefempty\@dtm@root + {}% + {% + \DTMifhasstyle{\@dtm@root}% + {% + \csuse{@dtm@style@\@dtm@root}% + }% + {}% + }% + }% + }% + {% + \DTMifhasstyle{\@dtm@thisstyle-numeric}% + {% + \csuse{@dtm@style@\@dtm@thisstyle-numeric}% + }% + {% + \ifdefempty\@dtm@root + {}% + {% + \DTMifhasstyle{\@dtm@root-numeric}% + {% + \csuse{@dtm@style@\@dtm@root-numeric}% + }% + {}% + }% + }% + }% + }% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMsetregional} +%\changes{1.5.2}{2016-07-12}{new} +% \begin{macrocode} +\newcommand*{\DTMsetregional}[1][text]{% + \DTMsetup{useregional=#1}% + \ifstrequal{#1}{false}% + {% + \DTMsetstyle{default}% + }% + {% + \ifcsdef{date\languagename} + {% + \csuse{date\languagename} + }% + {% +% \end{macrocode} +% Iterate through dialect list. +% \begin{macrocode} + \ForEachTrackedDialect{\@dtm@thisdialect}% + {% + \edef\@dtm@lang{\TrackedLanguageFromDialect\@dtm@thisdialect}% + \edef\@dtm@langcode{\TrackedIsoCodeFromLanguage{639-1}{\@dtm@lang}}% + \ifdefempty\@dtm@langcode + {% + \edef\@dtm@langcode{\TrackedIsoCodeFromLanguage{639-2}{\@dtm@lang}}% + }% + {}% + \edef\@dtm@countrycode{% + \TrackedIsoCodeFromLanguage{3166-1}{\@dtm@thisdialect}}% + \s@dtm@tryregional[\@dtm@lang]{\@dtm@langcode}{\@dtm@countrycode}% + }% + }% + }% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMsetstyle} +% \begin{macrocode} +\newrobustcmd*{\DTMsetstyle}[1]{% + \DTMifhasstyle{#1}% + {\csuse{@dtm@style@#1}}% + {% + \let\dtm@unknownstyle\@dtm@unknownstyle + \ifcsdef{@dtm@datestyle#1}% + {\csuse{@dtm@datestyle@#1}\let\dtm@unknownstyle\@dtm@unknown@style}% + {\@dtm@warning{No date style `#1' defined}}% + \ifcsdef{@dtm@timestyle#1}% + {\csuse{@dtm@timestyle@#1}\let\dtm@unknownstyle\@dtm@unknown@style}% + {\@dtm@warning{No time style `#1' defined}}% + \ifcsdef{@dtm@zonestyle#1}% + {\csuse{@dtm@zonestyle@#1}\let\dtm@unknownstyle\@dtm@unknown@style}% + {\@dtm@warning{No zone style `#1' defined}}% + \dtm@unknownstyle{#1}% + }% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\@dtm@unknownstyle} +% \begin{macrocode} +\newcommand*{\@dtm@unknownstyle}[1]{% + \PackageError{datetime2}{Unknown style `#1'}{}% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\@dtm@unknown@style} +% \begin{macrocode} +\newcommand*{\@dtm@unknown@style}[1]{% + \@dtm@warning{No full style `#1' defined}{}% +} +% \end{macrocode} +%\end{macro} +% +% Define \style{default} style: +% \begin{macrocode} +\DTMnewstyle + {default}%label + {% date style + \renewcommand*\DTMdisplaydate[4]{% + \number##1\DTMsep{yearmonth}\DTMtwodigits{##2}% + \DTMsep{monthday}\DTMtwodigits{##3}% + }% + \renewcommand*{\DTMDisplaydate}{\DTMdisplaydate}% + }% + {% time style + \renewcommand*\DTMdisplaytime[3]{% + \DTMtwodigits{##1}\DTMsep{hourmin}\DTMtwodigits{##2}% + \ifDTMshowseconds\DTMsep{minsec}\DTMtwodigits{##3}\fi + }% + }% + {% zone style + \renewcommand*{\DTMdisplayzone}[2]{% + \ifboolexpe + { bool{DTMshowisoZ} + and test{\ifnumequal{##1}{0}} + and test{\ifnumequal{##2}{0}} + }% + {% + Z% + }% + {% +% \end{macrocode} +%\changes{1.5.3}{2018-07-20}{added space after test} +%A space is needed after the conditional to prevent an unwanted +%\cs{relax} from being inserted if the time zone is negative. +% \begin{macrocode} + \ifnum##1<0 \else+\fi\DTMtwodigits{##1}% + \ifDTMshowzoneminutes\DTMsep{hourmin}\DTMtwodigits{##2}\fi + }% + }% + }% + {% full style + \renewcommand*{\DTMdisplay}[9]{% + \ifDTMshowdate + \DTMdisplaydate{##1}{##2}{##3}{##4}% + \DTMsep{datetime}% + \fi + \DTMdisplaytime + {##5}% + {##6}% + {##7}% + \ifDTMshowzone + \DTMsep{timezone}% + \DTMdisplayzone + {##8}% + {##9}% + \fi + }% + \renewcommand*{\DTMDisplay}{\DTMdisplay}% + } +% \end{macrocode} +% +% Define \style{iso} style which ignores the separator settings: +% \begin{macrocode} +\DTMnewstyle + {iso}%label + {% date style + \renewcommand*\DTMdisplaydate[4]{% + \number##1-\DTMtwodigits{##2}-\DTMtwodigits{##3}% + }% + \renewcommand*{\DTMDisplaydate}{\DTMdisplaydate}% + }% + {% time style + \renewcommand*\DTMdisplaytime[3]{% + \DTMtwodigits{##1}:\DTMtwodigits{##2}% + \ifDTMshowseconds:\DTMtwodigits{##3}\fi + }% + }% + {% zone style + \renewcommand*{\DTMdisplayzone}[2]{% + \ifboolexpe + { bool{DTMshowisoZ} + and test{\ifnumequal{##1}{0}} + and test{\ifnumequal{##2}{0}} + }% + {% + Z% + }% + {% +% \end{macrocode} +%\changes{1.5.3}{2018-07-20}{added space after test} +%A space is needed after the conditional to prevent an unwanted +%\cs{relax} from being inserted if the time zone is negative. +% \begin{macrocode} + \ifnum##1<0 \else+\fi\DTMtwodigits{##1}% + \ifDTMshowzoneminutes:\DTMtwodigits{##2}\fi + }% + }% + }% + {% full style + \renewcommand*{\DTMdisplay}[9]{% + \ifDTMshowdate + \DTMdisplaydate{##1}{##2}{##3}{##4}% + T% + \fi + \DTMdisplaytime + {##5}% + {##6}% + {##7}% + \ifDTMshowzone + \DTMdisplayzone + {##8}% + {##9}% + \fi + }% + \renewcommand*{\DTMDisplay}{\DTMdisplay}% + } +% \end{macrocode} +% +% Define \style{pdf} style which converts into a format that can be +% used in \cs{pdfinfo}: +% \begin{macrocode} +\DTMnewstyle + {pdf}%label + {% date style + \renewcommand*\DTMdisplaydate[4]{% + D:\number##1 % space intended + \DTMtwodigits{##2}\DTMtwodigits{##3}% + }% + \renewcommand*{\DTMDisplaydate}{\DTMdisplaydate}% + }% + {% time style + \renewcommand*\DTMdisplaytime[3]{% + \DTMtwodigits{##1}\DTMtwodigits{##2}\DTMtwodigits{##3}% + }% + }% + {% zone style + \renewcommand*{\DTMdisplayzone}[2]{% + \ifboolexpe + { bool{DTMshowisoZ} + and test{\ifnumequal{##1}{0}} + and test{\ifnumequal{##2}{0}} + }% + {% + Z% + }% + {% +% \end{macrocode} +%\changes{1.5.3}{2018-07-20}{added space after test} +%A space is needed after the conditional to prevent an unwanted +%\cs{relax} from being inserted if the time zone is negative. +% \begin{macrocode} + \ifnum##1<0 \else+\fi\DTMtwodigits{##1}'\DTMtwodigits{##2}'% + }% + }% + }% + {% full style + \renewcommand*{\DTMdisplay}[9]{% + \DTMdisplaydate{##1}{##2}{##3}{##4}% + \DTMdisplaytime{##5}{##6}{##7}% + \DTMdisplayzone{##8}{##9}% + }% + \renewcommand*{\DTMDisplay}{\DTMdisplay}% + } +% \end{macrocode} +% +% Define \style{yyyymd} style: +% \begin{macrocode} +\DTMnewstyle + {yyyymd}%label + {% date style + \renewcommand*\DTMdisplaydate[4]{% + \number##1 + \DTMsep{yearmonth}% + \number##2 + \DTMsep{monthday}% + \number##3 + }% + \renewcommand*{\DTMDisplaydate}{\DTMdisplaydate}% + }% + {% time style + \renewcommand*\DTMdisplaytime[3]{% + \DTMtwodigits{##1}\DTMsep{hourmin}\DTMtwodigits{##2}% + \ifDTMshowseconds\DTMsep{minsec}\DTMtwodigits{##3}\fi + }% + }% + {% zone style + \renewcommand*{\DTMdisplayzone}[2]{% + \ifboolexpe + { bool{DTMshowisoZ} + and test{\ifnumequal{##1}{0}} + and test{\ifnumequal{##2}{0}} + }% + {% + Z% + }% + {% +% \end{macrocode} +%\changes{1.5.3}{2018-07-20}{added space after test} +%A space is needed after the conditional to prevent an unwanted +%\cs{relax} from being inserted if the time zone is negative. +% \begin{macrocode} + \ifnum##1<0 \else+\fi\DTMtwodigits{##1}% + \ifDTMshowzoneminutes\DTMsep{hourmin}\DTMtwodigits{##2}\fi + }% + }% + }% + {% full style + \renewcommand*{\DTMdisplay}[9]{% + \ifDTMshowdate + \DTMdisplaydate{##1}{##2}{##3}{##4}% + \DTMsep{datetime}% + \fi + \DTMdisplaytime + {##5}% + {##6}% + {##7}% + \ifDTMshowzone + \DTMsep{timezone}% + \DTMdisplayzone + {##8}% + {##9}% + \fi + }% + \renewcommand*{\DTMDisplay}{\DTMdisplay}% + } +% \end{macrocode} +% +% Define \style{ddmmyyyy} style: +% \begin{macrocode} +\DTMnewstyle + {ddmmyyyy}%label + {% date style + \renewcommand*\DTMdisplaydate[4]{% + \DTMtwodigits{##3}\DTMsep{monthday}% + \DTMtwodigits{##2}\DTMsep{yearmonth}% + \number##1 + }% + \renewcommand*{\DTMDisplaydate}{\DTMdisplaydate}% + }% + {% time style + \renewcommand*\DTMdisplaytime[3]{% + \DTMtwodigits{##1}\DTMsep{hourmin}\DTMtwodigits{##2}% + \ifDTMshowseconds\DTMsep{minsec}\DTMtwodigits{##3}\fi + }% + }% + {% zone style + \renewcommand*{\DTMdisplayzone}[2]{% + \ifboolexpe + { bool{DTMshowisoZ} + and test{\ifnumequal{##1}{0}} + and test{\ifnumequal{##2}{0}} + }% + {% + Z% + }% + {% +% \end{macrocode} +%\changes{1.5.3}{2018-07-20}{added space after test} +%A space is needed after the conditional to prevent an unwanted +%\cs{relax} from being inserted if the time zone is negative. +% \begin{macrocode} + \ifnum##1<0 \else+\fi\DTMtwodigits{##1}% + \ifDTMshowzoneminutes\DTMsep{hourmin}\DTMtwodigits{##2}\fi + }% + }% + }% + {% full style + \renewcommand*{\DTMdisplay}[9]{% + \ifDTMshowdate + \DTMdisplaydate{##1}{##2}{##3}{##4}% + \DTMsep{datetime}% + \fi + \DTMdisplaytime + {##5}% + {##6}% + {##7}% + \ifDTMshowzone + \DTMsep{timezone}% + \DTMdisplayzone + {##8}% + {##9}% + \fi + }% + \renewcommand*{\DTMDisplay}{\DTMdisplay}% + } +% \end{macrocode} +% +% Define \style{dmyyyy} style: +% \begin{macrocode} +\DTMnewstyle + {dmyyyy}%label + {% date style + \renewcommand*\DTMdisplaydate[4]{% + \number##3 + \DTMsep{monthday}% + \number##2 + \DTMsep{yearmonth}% + \number##1 + }% + \renewcommand*{\DTMDisplaydate}{\DTMdisplaydate}% + }% + {% time style + \renewcommand*\DTMdisplaytime[3]{% + \DTMtwodigits{##1}\DTMsep{hourmin}\DTMtwodigits{##2}% + \ifDTMshowseconds\DTMsep{minsec}\DTMtwodigits{##3}\fi + }% + }% + {% zone style + \renewcommand*{\DTMdisplayzone}[2]{% + \ifboolexpe + { bool{DTMshowisoZ} + and test{\ifnumequal{##1}{0}} + and test{\ifnumequal{##2}{0}} + }% + {% + Z% + }% + {% +% \end{macrocode} +%\changes{1.5.3}{2018-07-20}{added space after test} +%A space is needed after the conditional to prevent an unwanted +%\cs{relax} from being inserted if the time zone is negative. +% \begin{macrocode} + \ifnum##1<0 \else+\fi\DTMtwodigits{##1}% + \ifDTMshowzoneminutes\DTMsep{hourmin}\DTMtwodigits{##2}\fi + }% + }% + }% + {% full style + \renewcommand*{\DTMdisplay}[9]{% + \ifDTMshowdate + \DTMdisplaydate{##1}{##2}{##3}{##4}% + \DTMsep{datetime}% + \fi + \DTMdisplaytime + {##5}% + {##6}% + {##7}% + \ifDTMshowzone + \DTMsep{timezone}% + \DTMdisplayzone + {##8}% + {##9}% + \fi + }% + \renewcommand*{\DTMDisplay}{\DTMdisplay}% + } +% \end{macrocode} +% +% Define \style{dmyy} style: +% \begin{macrocode} +\DTMnewstyle + {dmyy}%label + {% date style + \renewcommand*\DTMdisplaydate[4]{% + \number##3 % space intended + \DTMsep{monthday}% + \number##2 % space intended + \DTMsep{yearmonth}% + \DTMtwodigits{##1}% + }% + \renewcommand*{\DTMDisplaydate}{\DTMdisplaydate}% + }% + {% time style + \renewcommand*\DTMdisplaytime[3]{% + \DTMtwodigits{##1}\DTMsep{hourmin}\DTMtwodigits{##2}% + \ifDTMshowseconds\DTMsep{minsec}\DTMtwodigits{##3}\fi + }% + }% + {% zone style + \renewcommand*{\DTMdisplayzone}[2]{% + \ifboolexpe + { bool{DTMshowisoZ} + and test{\ifnumequal{##1}{0}} + and test{\ifnumequal{##2}{0}} + }% + {% + Z% + }% + {% +% \end{macrocode} +%\changes{1.5.3}{2018-07-20}{added space after test} +%A space is needed after the conditional to prevent an unwanted +%\cs{relax} from being inserted if the time zone is negative. +% \begin{macrocode} + \ifnum##1<0 \else+\fi\DTMtwodigits{##1}% + \ifDTMshowzoneminutes\DTMsep{hourmin}\DTMtwodigits{##2}\fi + }% + }% + }% + {% full style + \renewcommand*{\DTMdisplay}[9]{% + \ifDTMshowdate + \DTMdisplaydate{##1}{##2}{##3}{##4}% + \DTMsep{datetime}% + \fi + \DTMdisplaytime + {##5}% + {##6}% + {##7}% + \ifDTMshowzone + \DTMsep{timezone}% + \DTMdisplayzone + {##8}% + {##9}% + \fi + }% + \renewcommand*{\DTMDisplay}{\DTMdisplay}% + } +% \end{macrocode} +% +% Define \style{ddmmyy} style: +%\changes{1.3}{2016-01-22}{added ddmmyy style} +% \begin{macrocode} +\DTMnewstyle + {ddmmyy}%label + {% date style + \renewcommand*\DTMdisplaydate[4]{% + \DTMtwodigits{##3}\DTMsep{monthday}% + \DTMtwodigits{##2}\DTMsep{yearmonth}% + \DTMtwodigits{##1}% + }% + \renewcommand*{\DTMDisplaydate}{\DTMdisplaydate}% + }% + {% time style + \renewcommand*\DTMdisplaytime[3]{% + \DTMtwodigits{##1}\DTMsep{hourmin}\DTMtwodigits{##2}% + \ifDTMshowseconds\DTMsep{minsec}\DTMtwodigits{##3}\fi + }% + }% + {% zone style + \renewcommand*{\DTMdisplayzone}[2]{% + \ifboolexpe + { bool{DTMshowisoZ} + and test{\ifnumequal{##1}{0}} + and test{\ifnumequal{##2}{0}} + }% + {% + Z% + }% + {% +% \end{macrocode} +%\changes{1.5.3}{2018-07-20}{added space after test} +%A space is needed after the conditional to prevent an unwanted +%\cs{relax} from being inserted if the time zone is negative. +% \begin{macrocode} + \ifnum##1<0 \else+\fi\DTMtwodigits{##1}% + \ifDTMshowzoneminutes\DTMsep{hourmin}\DTMtwodigits{##2}\fi + }% + }% + }% + {% full style + \renewcommand*{\DTMdisplay}[9]{% + \ifDTMshowdate + \DTMdisplaydate{##1}{##2}{##3}{##4}% + \DTMsep{datetime}% + \fi + \DTMdisplaytime + {##5}% + {##6}% + {##7}% + \ifDTMshowzone + \DTMsep{timezone}% + \DTMdisplayzone + {##8}% + {##9}% + \fi + }% + \renewcommand*{\DTMDisplay}{\DTMdisplay}% + } +% \end{macrocode} +% +% Define \style{mmddyyyy} style: +% \begin{macrocode} +\DTMnewstyle + {mmddyyyy}%label + {% date style + \renewcommand*\DTMdisplaydate[4]{% + \DTMtwodigits{##2}\DTMsep{monthday}% + \DTMtwodigits{##3}\DTMsep{dayyear}% + \number##1 + }% + \renewcommand*{\DTMDisplaydate}{\DTMdisplaydate}% + }% + {% time style + \renewcommand*\DTMdisplaytime[3]{% + \DTMtwodigits{##1}\DTMsep{hourmin}\DTMtwodigits{##2}% + \ifDTMshowseconds\DTMsep{minsec}\DTMtwodigits{##3}\fi + }% + }% + {% zone style + \renewcommand*{\DTMdisplayzone}[2]{% + \ifboolexpe + { bool{DTMshowisoZ} + and test{\ifnumequal{##1}{0}} + and test{\ifnumequal{##2}{0}} + }% + {% + Z% + }% + {% +% \end{macrocode} +%\changes{1.5.3}{2018-07-20}{added space after test} +%A space is needed after the conditional to prevent an unwanted +%\cs{relax} from being inserted if the time zone is negative. +% \begin{macrocode} + \ifnum##1<0 \else+\fi\DTMtwodigits{##1}% + \ifDTMshowzoneminutes\DTMsep{hourmin}\DTMtwodigits{##2}\fi + }% + }% + }% + {% full style + \renewcommand*{\DTMdisplay}[9]{% + \ifDTMshowdate + \DTMdisplaydate{##1}{##2}{##3}{##4}% + \DTMsep{datetime}% + \fi + \DTMdisplaytime + {##5}% + {##6}% + {##7}% + \ifDTMshowzone + \DTMsep{timezone}% + \DTMdisplayzone + {##8}% + {##9}% + \fi + }% + \renewcommand*{\DTMDisplay}{\DTMdisplay}% + } +% \end{macrocode} +% +% Define \style{mdyyyy} style: +% \begin{macrocode} +\DTMnewstyle + {mdyyyy}%label + {% date style + \renewcommand*\DTMdisplaydate[4]{% + \number##2 % space intended + \DTMsep{monthday}% + \number##3 % space intended + \DTMsep{dayyear}% + \number##1 % space intended + }% + \renewcommand*{\DTMDisplaydate}{\DTMdisplaydate}% + }% + {% time style + \renewcommand*\DTMdisplaytime[3]{% + \DTMtwodigits{##1}\DTMsep{hourmin}\DTMtwodigits{##2}% + \ifDTMshowseconds\DTMsep{minsec}\DTMtwodigits{##3}\fi + }% + }% + {% zone style + \renewcommand*{\DTMdisplayzone}[2]{% + \ifboolexpe + { bool{DTMshowisoZ} + and test{\ifnumequal{##1}{0}} + and test{\ifnumequal{##2}{0}} + }% + {% + Z% + }% + {% +% \end{macrocode} +%\changes{1.5.3}{2018-07-20}{added space after test} +%A space is needed after the conditional to prevent an unwanted +%\cs{relax} from being inserted if the time zone is negative. +% \begin{macrocode} + \ifnum##1<0 \else+\fi\DTMtwodigits{##1}% + \ifDTMshowzoneminutes\DTMsep{hourmin}\DTMtwodigits{##2}\fi + }% + }% + }% + {% full style + \renewcommand*{\DTMdisplay}[9]{% + \ifDTMshowdate + \DTMdisplaydate{##1}{##2}{##3}{##4}% + \DTMsep{datetime}% + \fi + \DTMdisplaytime + {##5}% + {##6}% + {##7}% + \ifDTMshowzone + \DTMsep{timezone}% + \DTMdisplayzone + {##8}% + {##9}% + \fi + }% + \renewcommand*{\DTMDisplay}{\DTMdisplay}% + } +% \end{macrocode} +% +% Define \style{mdyy} style: +% \begin{macrocode} +\DTMnewstyle + {mdyy}%label + {% date style + \renewcommand*\DTMdisplaydate[4]{% + \number##2 % space intended + \DTMsep{monthday}% + \number##3 % space intended + \DTMsep{dayyear}% + \DTMtwodigits{##1}% + }% + \renewcommand*{\DTMDisplaydate}{\DTMdisplaydate}% + }% + {% time style + \renewcommand*\DTMdisplaytime[3]{% + \DTMtwodigits{##1}\DTMsep{hourmin}\DTMtwodigits{##2}% + \ifDTMshowseconds\DTMsep{minsec}\DTMtwodigits{##3}\fi + }% + }% + {% zone style + \renewcommand*{\DTMdisplayzone}[2]{% + \ifboolexpe + { bool{DTMshowisoZ} + and test{\ifnumequal{##1}{0}} + and test{\ifnumequal{##2}{0}} + }% + {% + Z% + }% + {% +% \end{macrocode} +%\changes{1.5.3}{2018-07-20}{added space after test} +%A space is needed after the conditional to prevent an unwanted +%\cs{relax} from being inserted if the time zone is negative. +% \begin{macrocode} + \ifnum##1<0 \else+\fi\DTMtwodigits{##1}% + \ifDTMshowzoneminutes\DTMsep{hourmin}\DTMtwodigits{##2}\fi + }% + }% + }% + {% full style + \renewcommand*{\DTMdisplay}[9]{% + \ifDTMshowdate + \DTMdisplaydate{##1}{##2}{##3}{##4}% + \DTMsep{datetime}% + \fi + \DTMdisplaytime + {##5}% + {##6}% + {##7}% + \ifDTMshowzone + \DTMsep{timezone}% + \DTMdisplayzone + {##8}% + {##9}% + \fi + }% + \renewcommand*{\DTMDisplay}{\DTMdisplay}% + } +% \end{macrocode} +% +% Define \style{mmddyy} style: +%\changes{1.3}{2016-01-22}{added mmddyy style} +% \begin{macrocode} +\DTMnewstyle + {mmddyy}%label + {% date style + \renewcommand*\DTMdisplaydate[4]{% + \DTMtwodigits{##2}\DTMsep{monthday}% + \DTMtwodigits{##3}\DTMsep{dayyear}% + \DTMtwodigits{##1}% + }% + \renewcommand*{\DTMDisplaydate}{\DTMdisplaydate}% + }% + {% time style + \renewcommand*\DTMdisplaytime[3]{% + \DTMtwodigits{##1}\DTMsep{hourmin}\DTMtwodigits{##2}% + \ifDTMshowseconds\DTMsep{minsec}\DTMtwodigits{##3}\fi + }% + }% + {% zone style + \renewcommand*{\DTMdisplayzone}[2]{% + \ifboolexpe + { bool{DTMshowisoZ} + and test{\ifnumequal{##1}{0}} + and test{\ifnumequal{##2}{0}} + }% + {% + Z% + }% + {% +% \end{macrocode} +%\changes{1.5.3}{2018-07-20}{added space after test} +%A space is needed after the conditional to prevent an unwanted +%\cs{relax} from being inserted if the time zone is negative. +% \begin{macrocode} + \ifnum##1<0 \else+\fi\DTMtwodigits{##1}% + \ifDTMshowzoneminutes\DTMsep{hourmin}\DTMtwodigits{##2}\fi + }% + }% + }% + {% full style + \renewcommand*{\DTMdisplay}[9]{% + \ifDTMshowdate + \DTMdisplaydate{##1}{##2}{##3}{##4}% + \DTMsep{datetime}% + \fi + \DTMdisplaytime + {##5}% + {##6}% + {##7}% + \ifDTMshowzone + \DTMsep{timezone}% + \DTMdisplayzone + {##8}% + {##9}% + \fi + }% + \renewcommand*{\DTMDisplay}{\DTMdisplay}% + } +% \end{macrocode} +% +% Define \style{hmmss} time style +% \begin{macrocode} +\DTMnewtimestyle + {hmmss}% label + {% + \renewcommand*\DTMdisplaytime[3]{% + \number##1 + \DTMsep{hourmin}\DTMtwodigits{##2}% + \ifDTMshowseconds\DTMsep{minsec}\DTMtwodigits{##3}\fi + }% + }% +% \end{macrocode} +% +% Define \style{map} zone style +% \begin{macrocode} +\DTMnewzonestyle + {map}% label + {% + \renewcommand*\DTMdisplaytime[3]{% + \DTMusezonemapordefault{##1}{##2}% + }% + }% +% \end{macrocode} +% +% Define \style{hhmm} zone style +% \begin{macrocode} +\DTMnewzonestyle + {hhmm}% label + {% + \renewcommand*\DTMdisplaytime[3]{% +% \end{macrocode} +%\changes{1.5.3}{2018-07-20}{added space after test} +%A space is needed after the conditional to prevent an unwanted +%\cs{relax} from being inserted if the time zone is negative. +% \begin{macrocode} + \ifnum##1<0 \else+\fi\DTMtwodigits{##1}% + \ifDTMshowzoneminutes\DTMsep{hourmin}\DTMtwodigits{##2}\fi + }% + } +% \end{macrocode} +% +%\subsection{Saving and Using Dates} +% Date and time information is stored in control sequences in the +% form \cs{@dtm@}\meta{label}\texttt{@}\meta{tag}, where +% \meta{label} is the label uniquely identifying the information and +% \meta{tag} is the element (\texttt{year}, \texttt{month}, +% \texttt{day}, \texttt{dow}, \texttt{hour}, \texttt{minute}, +% \texttt{second}, \texttt{TZhour} and \texttt{TZminute}). Missing +% information is stored as \texttt{0} (except for the day of week, which is +% stored as \texttt{-1}). +% +%\begin{macro}{\DTMsavedate} +% Save the date specified in the format +% \meta{yyyy}-\meta{mm}-\meta{dd}. \cs{expandafter} is used in case +% the argument is a control sequence storing the date. This will +% redefine an existing saved date with the same label. The first +% argument is the label. +% \begin{macrocode} +\newrobustcmd*{\DTMsavedate}[2]{% + \expandafter\@dtm@parsedate#2\@dtm@endparsedate + \cslet{@dtm@#1@year}{\@dtm@year}% + \cslet{@dtm@#1@month}{\@dtm@month}% + \cslet{@dtm@#1@day}{\@dtm@day}% + \cslet{@dtm@#1@dow}{\@dtm@dow}% + \ifcsundef{@dtm@#1@hour}{\csdef{@dtm@#1@hour}{0}}{}% + \ifcsundef{@dtm@#1@minute}{\csdef{@dtm@#1@minute}{0}}{}% + \ifcsundef{@dtm@#1@second}{\csdef{@dtm@#1@second}{0}}{}% + \ifcsundef{@dtm@#1@TZhour}{\csdef{@dtm@#1@TZhour}{0}}{}% + \ifcsundef{@dtm@#1@TZminute}{\csdef{@dtm@#1@TZminute}{0}}{}% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMsavenoparsedate} +% Save the date without parsing the +% \meta{YYYY}-\meta{MM}-\meta{DD} format. +% \begin{macrocode} +\newrobustcmd*{\DTMsavenoparsedate}[5]{% + \csedef{@dtm@#1@year}{\number#2}% + \csedef{@dtm@#1@month}{\number#3}% + \csedef{@dtm@#1@day}{\number#4}% + \csedef{@dtm@#1@dow}{\number#5}% + \ifcsundef{@dtm@#1@hour}{\csdef{@dtm@#1@hour}{0}}{}% + \ifcsundef{@dtm@#1@minute}{\csdef{@dtm@#1@minute}{0}}{}% + \ifcsundef{@dtm@#1@second}{\csdef{@dtm@#1@second}{0}}{}% + \ifcsundef{@dtm@#1@TZhour}{\csdef{@dtm@#1@TZhour}{0}}{}% + \ifcsundef{@dtm@#1@TZminute}{\csdef{@dtm@#1@TZminute}{0}}{}% +} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\DTMsavetime} +% Save the time specified in the format +% \meta{hh}:\meta{mm}:\meta{ss}. \cs{expandafter} is used in case +% the argument is a control sequence storing the date. This will +% redefine an existing saved date with the same label. The first +% argument is the label. +% \begin{macrocode} +\newrobustcmd*{\DTMsavetime}[2]{% + \expandafter\@dtm@parsetime#2\@dtm@endparsetime + \cslet{@dtm@#1@hour}{\@dtm@hour}% + \cslet{@dtm@#1@minute}{\@dtm@minute}% + \cslet{@dtm@#1@second}{\@dtm@second}% + \ifcsundef{@dtm@#1@year}{\csdef{@dtm@#1@year}{0}}{}% + \ifcsundef{@dtm@#1@month}{\csdef{@dtm@#1@month}{0}}{}% + \ifcsundef{@dtm@#1@day}{\csdef{@dtm@#1@day}{0}}{}% + \ifcsundef{@dtm@#1@dow}{\csdef{@dtm@#1@dow}{-1}}{}% + \ifcsundef{@dtm@#1@TZhour}{\csdef{@dtm@#1@TZhour}{0}}{}% + \ifcsundef{@dtm@#1@TZminute}{\csdef{@dtm@#1@TZminute}{0}}{}% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMsavetimezn} +% Save the time (including zone) specified in the format +% \meta{hh}:\meta{mm}:\meta{ss} \meta{tzh}:\meta{tzm}. +% \cs{expandafter} is used in case +% the argument is a control sequence storing the date. This will +% redefine an existing saved date with the same label. The first +% argument is the label. +% \begin{macrocode} +\newrobustcmd*{\DTMsavetimezn}[2]{% + \expandafter\@dtm@parsetimezn#2\@dtm@endparsetimezn + \cslet{@dtm@#1@hour}{\@dtm@hour}% + \cslet{@dtm@#1@minute}{\@dtm@minute}% + \cslet{@dtm@#1@second}{\@dtm@second}% + \cslet{@dtm@#1@TZhour}{\@dtm@timezonehour}% + \cslet{@dtm@#1@TZminute}{\@dtm@timezoneminute}% + \ifcsundef{@dtm@#1@year}{\csdef{@dtm@#1@year}{0}}{}% + \ifcsundef{@dtm@#1@month}{\csdef{@dtm@#1@month}{0}}{}% + \ifcsundef{@dtm@#1@day}{\csdef{@dtm@#1@day}{0}}{}% + \ifcsundef{@dtm@#1@dow}{\csdef{@dtm@#1@dow}{-1}}{}% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMsavetimestamp} +% Save the time (including zone) specified in the format +%\meta{YYYY}-\meta{MM}-\meta{DD}T\meta{hh}:\meta{mm}:\meta{ss}\meta{time +%zone} +% +%The first argument is the label. +% \begin{macrocode} +\newrobustcmd*{\DTMsavetimestamp}[2]{% + \expandafter\@dtm@parsetimestamp#2\@dtm@endparsetimestamp + \cslet{@dtm@#1@year}{\@dtm@year}% + \cslet{@dtm@#1@month}{\@dtm@month}% + \cslet{@dtm@#1@day}{\@dtm@day}% + \cslet{@dtm@#1@dow}{\@dtm@dow}% + \cslet{@dtm@#1@hour}{\@dtm@hour}% + \cslet{@dtm@#1@minute}{\@dtm@minute}% + \cslet{@dtm@#1@second}{\@dtm@second}% + \cslet{@dtm@#1@TZhour}{\@dtm@timezonehour}% + \cslet{@dtm@#1@TZminute}{\@dtm@timezoneminute}% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMsavenow} +%\changes{1.5.3}{??}{new} +%Save the date-time stamp in PDF format. +% \begin{macrocode} +\newrobustcmd*{\DTMsavepdftimestamp}[2]{% + \edef\@dtm@tmp{#2}% + \ifx\@dtm@tmp\empty + \cslet{@dtm@#1@year}{0}% + \cslet{@dtm@#1@month}{0}% + \cslet{@dtm@#1@day}{0}% + \cslet{@dtm@#1@dow}{0}% + \cslet{@dtm@#1@hour}{0}% + \cslet{@dtm@#1@minute}{0}% + \cslet{@dtm@#1@second}{0}% + \cslet{@dtm@#1@TZhour}{0}% + \cslet{@dtm@#1@TZminute}{0}% + \else + \expandafter\@dtm@parsepdfdatetime\@dtm@tmp\@dtm@endparsepdfdatetime + \cslet{@dtm@#1@year}{\@dtm@year}% + \cslet{@dtm@#1@month}{\@dtm@month}% + \cslet{@dtm@#1@day}{\@dtm@day}% + \cslet{@dtm@#1@dow}{\@dtm@dow}% + \cslet{@dtm@#1@hour}{\@dtm@hour}% + \cslet{@dtm@#1@minute}{\@dtm@minute}% + \cslet{@dtm@#1@second}{\@dtm@second}% + \cslet{@dtm@#1@TZhour}{\@dtm@timezonehour}% + \cslet{@dtm@#1@TZminute}{\@dtm@timezoneminute}% + \fi +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMsavenow} +%Save the current time. +% \begin{macrocode} +\newrobustcmd{\DTMsavenow}[1]{% + \cslet{@dtm@#1@year}{\@dtm@currentyear}% + \cslet{@dtm@#1@month}{\@dtm@currentmonth}% + \cslet{@dtm@#1@day}{\@dtm@currentday}% + \cslet{@dtm@#1@dow}{\@dtm@currentdow}% + \cslet{@dtm@#1@hour}{\@dtm@currenthour}% + \cslet{@dtm@#1@minute}{\@dtm@currentminute}% + \cslet{@dtm@#1@second}{\@dtm@currentsecond}% + \cslet{@dtm@#1@TZhour}{\@dtm@currenttimezonehour}% + \cslet{@dtm@#1@TZminute}{\@dtm@currenttimezoneminute}% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMmakeglobal} +%Globally set the stored information. +% \begin{macrocode} +\newrobustcmd{\DTMmakeglobal}[1]{% + \global\csletcs{@dtm@#1@year}{@dtm@#1@year}% + \global\csletcs{@dtm@#1@month}{@dtm@#1@month}% + \global\csletcs{@dtm@#1@day}{@dtm@#1@day}% + \global\csletcs{@dtm@#1@dow}{@dtm@#1@dow}% + \global\csletcs{@dtm@#1@hour}{@dtm@#1@hour}% + \global\csletcs{@dtm@#1@minute}{@dtm@#1@minute}% + \global\csletcs{@dtm@#1@second}{@dtm@#1@second}% + \global\csletcs{@dtm@#1@TZhour}{@dtm@#1@TZhour}% + \global\csletcs{@dtm@#1@TZminute}{@dtm@#1@TZminute}% +} +% \end{macrocode} +%\end{macro} +% +% Expandable ways of fetching saved data. (No check for existence +% performed.) The argument is the label. +%\begin{macro}{\DTMfetchyear} +% \begin{macrocode} +\newcommand*{\DTMfetchyear}[1]{\csname @dtm@#1@year\endcsname} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\DTMfetchmonth} +% \begin{macrocode} +\newcommand*{\DTMfetchmonth}[1]{\csname @dtm@#1@month\endcsname} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\DTMfetchday} +% \begin{macrocode} +\newcommand*{\DTMfetchday}[1]{\csname @dtm@#1@day\endcsname} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\DTMfetchdow} +% \begin{macrocode} +\newcommand*{\DTMfetchdow}[1]{\csname @dtm@#1@dow\endcsname} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\DTMfetchhour} +% \begin{macrocode} +\newcommand*{\DTMfetchhour}[1]{\csname @dtm@#1@hour\endcsname} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\DTMfetchminute} +% \begin{macrocode} +\newcommand*{\DTMfetchminute}[1]{\csname @dtm@#1@minute\endcsname} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\DTMfetchsecond} +% \begin{macrocode} +\newcommand*{\DTMfetchsecond}[1]{\csname @dtm@#1@second\endcsname} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\DTMfetchTZhour} +% \begin{macrocode} +\newcommand*{\DTMfetchTZhour}[1]{\csname @dtm@#1@TZhour\endcsname} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\DTMfetchTZminute} +% \begin{macrocode} +\newcommand*{\DTMfetchTZminute}[1]{\csname @dtm@#1@TZminute\endcsname} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMusedate} +%\begin{definition} +%\cs{DTMusedate}\marg{label} +%\end{definition} +% Displays the previously saved date using \cs{DTMdisplaydate}. +% \begin{macrocode} +\newcommand*\DTMusedate[1]{% + \ifcsundef{@dtm@#1@year}% + {% + \PackageError{datetime2}{Undefined date `#1'}{}% + }% + {% + \DTMdisplaydate + {\csname @dtm@#1@year\endcsname}% + {\csname @dtm@#1@month\endcsname}% + {\csname @dtm@#1@day\endcsname}% + {\csname @dtm@#1@dow\endcsname}% + }% +}% +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMUsedate} +%\begin{definition} +%\cs{DTMUsedate}\marg{label} +%\end{definition} +% Displays the previously saved date using \cs{DTMDisplaydate}. +% \begin{macrocode} +\newcommand*\DTMUsedate[1]{% + \ifcsundef{@dtm@#1@year}% + {% + \PackageError{datetime2}{Undefined date `#1'}{}% + }% + {% + \DTMDisplaydate + {\csname @dtm@#1@year\endcsname}% + {\csname @dtm@#1@month\endcsname}% + {\csname @dtm@#1@day\endcsname}% + {\csname @dtm@#1@dow\endcsname}% + }% +}% +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMusetime} +%\begin{definition} +%\cs{DTMusetime}\marg{label} +%\end{definition} +% Displays the previously saved time using \cs{DTMdisplaytime}. +% \begin{macrocode} +\newcommand*\DTMusetime[1]{% + \ifcsundef{@dtm@#1@hour}% + {% + \PackageError{datetime2}{Undefined time `#1'}{}% + }% + {% + \DTMdisplaytime + {\csname @dtm@#1@hour\endcsname}% + {\csname @dtm@#1@minute\endcsname}% + {\csname @dtm@#1@second\endcsname}% + }% +}% +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMusezone} +%\begin{definition} +%\cs{DTMusezone}\marg{label} +%\end{definition} +% Displays the previously saved date using \cs{DTMdisplayzone}. +% \begin{macrocode} +\newcommand*\DTMusezone[1]{% + \ifcsundef{@dtm@#1@TZhour}% + {% + \PackageError{datetime2}{Undefined time `#1'}{}% + }% + {% + \DTMdisplayzone + {\csname @dtm@#1@TZhour\endcsname}% + {\csname @dtm@#1@TZminute\endcsname}% + }% +}% +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMuse} +%\begin{definition} +%\cs{DTMuse}\marg{label} +%\end{definition} +% Displays the previously saved date and time. +% \begin{macrocode} +\newcommand*\DTMuse[1]{% + \ifcsundef{@dtm@#1@year}% + {% + \PackageError{datetime2}{Undefined date-time `#1'}{}% + }% + {% + \DTMdisplay + {\csname @dtm@#1@year\endcsname}% + {\csname @dtm@#1@month\endcsname}% + {\csname @dtm@#1@day\endcsname}% + {\csname @dtm@#1@dow\endcsname}% + {\csname @dtm@#1@hour\endcsname}% + {\csname @dtm@#1@minute\endcsname}% + {\csname @dtm@#1@second\endcsname}% + {\csname @dtm@#1@TZhour\endcsname}% + {\csname @dtm@#1@TZminute\endcsname}% + }% +}% +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMUse} +%\begin{definition} +%\cs{DTMUse}\marg{label} +%\end{definition} +% Displays the previously saved date and time. +% \begin{macrocode} +\newcommand*\DTMUse[1]{% + \ifcsundef{@dtm@#1@year}% + {% + \PackageError{datetime2}{Undefined date-time `#1'}{}% + }% + {% + \DTMDisplay + {\csname @dtm@#1@year\endcsname}% + {\csname @dtm@#1@month\endcsname}% + {\csname @dtm@#1@day\endcsname}% + {\csname @dtm@#1@dow\endcsname}% + {\csname @dtm@#1@hour\endcsname}% + {\csname @dtm@#1@minute\endcsname}% + {\csname @dtm@#1@second\endcsname}% + {\csname @dtm@#1@TZhour\endcsname}% + {\csname @dtm@#1@TZminute\endcsname}% + }% +}% +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMifsaveddate} +% Determine if the given label has been assigned to a date, time and +% zone. +% \begin{macrocode} +\newcommand{\DTMifsaveddate}[3]{% + \ifcsundef{@dtm@#1@year}{#3}{#2}% +} +% \end{macrocode} +%\end{macro} +% +%\subsection{Language Module Loading} +% +% Define commands to load regional settings. +% +%\begin{macro}{\@dtm@requiremodule} +% Use \sty{tracklang} interface to find the associated file for the +% given dialect. +% \begin{macrocode} +\newcommand*{\@dtm@requiremodule}[1]{% + \IfTrackedLanguageFileExists{#1}% + {datetime2-}% prefix + {.ldf}% suffix + {% + \RequireDateTimeModule{\CurrentTrackedTag}% + }% + {% + \@dtm@warning{Date-Time Language Module `#1' not installed}% + }% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\@dtm@loadedregions} +% List of loaded \styfmt{datetime2} language modules. +% \begin{macrocode} +\newcommand*{\@dtm@loadedregions}{} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\RequireDateTimeModule} +% Input the language file, if not already loaded. +% Should only be used with \cs{@dtm@requiremodule} +% which sets commands like \cs{CurrentTrackedDialect}. +% Since the language modules are loaded within +% \cs{@dtm@requiremodule} they may use this command to load +% dependent modules. +% \begin{macrocode} +\newcommand*{\RequireDateTimeModule}[1]{% + \ifundef\CurrentTrackedDialect + {% + \PackageError{datetime2}% + {\string\RequireDateTimeModule\space not permitted here}% + {This command is only permitted inside datetime2 language + modules.}% + }% + {% + \ifcsundef{ver@datetime2-#1.ldf}% + {% + \input{datetime2-#1.ldf}% + \ifdefempty\@dtm@loadedregions + {% + \edef\@dtm@loadedregions{#1}% + }% + {% + \edef\@dtm@loadedregions{\@dtm@loadedregions,#1}% + }% +% \end{macrocode} +% In case a synonym is also used, add a mapping from the module name +% to the current tracked dialect. +%\changes{1.3}{2016-01-22}{added module to dialect map} +% \begin{macrocode} + \csedef{@dtm@moddialectmap@#1}{\CurrentTrackedDialect}% + }% + {% +% \end{macrocode} +% The module has already been loaded, but the current tracked +% dialect might be a synonym for a different language label that +% might've already loaded the module. If \cs{date\meta{dialect}} +% exists, this needs to be set. +% \begin{macrocode} + \ifcsdef{date\CurrentTrackedDialect} + {% + \letcs{\@dtm@otherdialect}{@dtm@moddialectmap@#1}% + \edef\@dtm@thisdialect{\CurrentTrackedDialect}% + \ifdefequal\@dtm@thisdialect\@dtm@otherdialect + {}% + {% + \ifcsdef{date\@dtm@otherdialect}% + {% + \csletcs{date\@dtm@thisdialect}{date\@dtm@otherdialect}% + }% + {}% + }% + }% + {}% + }% +% \end{macrocode} +% In case it's needed, create a mapping between the dialect name and +% the module name. +%\changes{1.3}{2016-01-22}{added dialect to module map} +% \begin{macrocode} + \csedef{@dtm@dialectmodmap@\CurrentTrackedDialect}{#1}% + }% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMdialecttomodulemap} +%\changes{1.3}{2016-01-22}{new} +%\begin{definition} +%\cs{DTMdialecttomodulemap}\marg{dialect} +%\end{definition} +% Expands to name of the module loaded with the given dialect name +% or \cs{relax} if no module has been loaded for the given dialect. +% \begin{macrocode} +\newcommand*{\DTMdialecttomodulemap}[1]{% + \ifcsdef{ver@datetime2-#1.ldf}% + {#1}% + {\csname @dtm@dialectmodmap@#1\endcsname}% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\ProvidesDateTimeModule} +% For use in language module to identify itself. +% \begin{macrocode} +\newcommand*{\ProvidesDateTimeModule}[1]{% + \ProvidesFile{datetime2-#1.ldf}% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMusemodule} +%\changes{1.03}{2016-01-20}{new} +% Provided for packages or documents that need to load a module. +% This shouldn't be used inside the \texttt{.ldf} files. +% \begin{macrocode} +\newcommand*{\DTMusemodule}[2]{% + \ifcsdef{@tracklang@add@#1}% + {% + \TrackPredefinedDialect{#1}% + }% + {}% + \let\@dtm@org@dialect\CurrentTrackedDialect + \def\CurrentTrackedDialect{#1}% + \RequireDateTimeModule{#2}% + \let\CurrentTrackedDialect\@dtm@org@dialect +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMdefkey} +%\begin{definition} +%\cs{DTMdefkey}\marg{region}\marg{key}\oarg{default}\marg{func} +%\end{definition} +% Used by language modules to define a key. +% \begin{macrocode} +\newcommand*{\DTMdefkey}[1]{\define@key[dtm]{#1}} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMdefchoicekey} +%\begin{definition} +%\cs{DTMdefchoicekey}\marg{region}\marg{key}\oarg{bin}\marg{choice +%list}\marg{default}\marg{func} +%\end{definition} +% Used by language modules to define a choice key. +% \begin{macrocode} +\newcommand*{\DTMdefchoicekey}[1]{\define@choicekey[dtm]{#1}} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMdefboolkey} +%\begin{definition} +%\cs{DTMdefboolkey}\marg{region}\oarg{mp}\marg{key}\oarg{default}\marg{func} +%\end{definition} +% Used by language modules to define a boolean key. +% \begin{macrocode} +\newcommand*{\DTMdefboolkey}[1]{\define@boolkey[dtm]{#1}} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMifbool} +%\begin{definition} +%\cs{DTMifbool}\marg{region}\marg{key}\marg{true}\marg{false} +%\end{definition} +% Test boolean key that was defined using \cs{DTMdefboolkey} +% \begin{macrocode} +\newcommand*{\DTMifbool}[4]{\ifbool{dtm@#1@#2}{#3}{#4}} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMsetbool} +%\begin{definition} +%\cs{DTMsetbool}\marg{region}\marg{key}\marg{value} +%\end{definition} +% Set boolean key that was defined using \cs{DTMdefboolkey} +% \begin{macrocode} +\newcommand*{\DTMsetbool}[3]{\setbool{dtm@#1@#2}{#3}} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMlangsetup} +% Set up options for language modules. The optional argument is a +% list of language/regions. If omitted all loaded regions are +% iterated over. (I'm not sure why \cs{setkeys} doesn't work +% if the same key is present in multiple families, so this iterates +% over the families instead.) +% The starred version doesn't warn on unknown keys. +%\changes{1.3}{2016-01-22}{added starred version} +% \begin{macrocode} +\newcommand*{\DTMlangsetup}{% + \@ifstar\s@DTMlangsetup\@DTMlangsetup} +% \end{macrocode} +% Unstarred version: +% \begin{macrocode} +\newcommand*{\@DTMlangsetup}[2][\@dtm@loadedregions]{% + \@for\@dtm@region:=#1\do{% + \setkeys*+[dtm]{\@dtm@region}{#2}% + \ifdefempty\XKV@rm{}% + {% + \@dtm@warning{Region `\@dtm@region' has ignored + \MessageBreak the following settings:\MessageBreak + \XKV@rm + ^^J}% + }% + }% +} +% \end{macrocode} +% +% Starred version: +% \begin{macrocode} +\newcommand*{\s@DTMlangsetup}[2][\@dtm@loadedregions]{% + \@for\@dtm@region:=#1\do{% + \setkeys*+[dtm]{\@dtm@region}{#2}% + }% +} +% \end{macrocode} +%\end{macro} +% +% Now load all the required modules (if installed) using the +% \sty{tracklang} interface. (Language packages, such as \sty{babel} +% or \sty{polyglossia} must be loaded before this.) +% \begin{macrocode} +\AnyTrackedLanguages +{% + \ForEachTrackedDialect{\this@dialect}% + {% + \@dtm@requiremodule\this@dialect + }% +} +{% +% \end{macrocode} +% No tracked languages. The default is already set up, so nothing to +% do here. +% \begin{macrocode} +} +% \end{macrocode} +% +% Load \sty{datetime2-calc} if required. +% \begin{macrocode} +\@dtm@usecalc +% \end{macrocode} +% +% Use the \pkgopt{style} package option, if set. +% \begin{macrocode} +\ifdefempty\@dtm@initialstyle{}{\DTMsetstyle{\@dtm@initialstyle}} +% \end{macrocode} +%\iffalse +% \begin{macrocode} +% +% \end{macrocode} +%\fi +%\iffalse +% \begin{macrocode} +%<*datetime2-calc.sty> +% \end{macrocode} +%\fi +%\section{datetime2-calc.sty code} +% \begin{macrocode} +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{datetime2-calc}[2018/07/20 v1.5.3 (NLCT)] +% \end{macrocode} +% Load other required packages +% \begin{macrocode} +\RequirePackage{pgfkeys} +\RequirePackage{pgfcalendar} +% \end{macrocode} +% +%\subsection{Conversions and Calculations} +%\begin{macro}{\@dtm@julianday} +% Register for storing Julian day number. +% \begin{macrocode} +\newcount\@dtm@julianday +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\@dtm@parsedate} +% Redefine \cs{@dtm@parsedate} so that it uses \sty{pgfcalendar} to +% compute the required information. This allows for offsets, the use +% of \texttt{last} and also determine the day of week. +% \begin{macrocode} +\def\@dtm@parsedate#1-#2-#3\@dtm@endparsedate{% + \pgfcalendardatetojulian{#1-#2-#3}{\@dtm@julianday}% + \pgfcalendarjuliantodate{\@dtm@julianday}{\@dtm@year}{\@dtm@month}{\@dtm@day}% + \pgfcalendarjuliantoweekday{\@dtm@julianday}{\count@}% + \edef\@dtm@dow{\number\count@}% +} +% \end{macrocode} +%\end{macro} +% +% Set the current day of week +%\begin{macro}{\@dtm@currentdow} +% \begin{macrocode} +\pgfcalendardatetojulian + {\@dtm@currentyear-\@dtm@currentmonth-\@dtm@currentday}% + {\@dtm@julianday}% +\pgfcalendarjuliantoweekday{\@dtm@julianday}{\count@}% +\edef\@dtm@currentdow{\number\count@}% +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMsavejulianday} +% Save the date obtained from the Julian day number. +% \begin{macrocode} +\newrobustcmd*{\DTMsavejulianday}[2]{% + \pgfcalendarjuliantodate{#2}{\@dtm@year}{\@dtm@month}{\@dtm@day}% + \pgfcalendarjuliantoweekday{#2}{\count@}% + \csedef{@dtm@#1@dow}{\number\count@}% + \cslet{@dtm@#1@year}{\@dtm@year}% + \cslet{@dtm@#1@month}{\@dtm@month}% + \cslet{@dtm@#1@day}{\@dtm@day}% + \ifcsundef{@dtm@#1@hour}{\csdef{@dtm@#1@hour}{0}}{}% + \ifcsundef{@dtm@#1@minute}{\csdef{@dtm@#1@minute}{0}}{}% + \ifcsundef{@dtm@#1@second}{\csdef{@dtm@#1@second}{0}}{}% + \ifcsundef{@dtm@#1@TZhour}{\csdef{@dtm@#1@TZhour}{0}}{}% + \ifcsundef{@dtm@#1@TZminute}{\csdef{@dtm@#1@TZminute}{0}}{}% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMsaveddatetojulianday} +% Converts a saved date to a Julian day number. The first argument +% is the name referencing the saved date, the second is a count +% register in which to store the result. +% \begin{macrocode} +\newrobustcmd*{\DTMsaveddatetojulianday}[2]{% + \ifcsundef{@dtm@#1@year}% + {% + \PackageError{datetime2-calc}{Unknown date `#1'}{}% + }% + {% + \pgfcalendardatetojulian + {\csname @dtm@#1@year\endcsname + -\csname @dtm@#1@month\endcsname + -\csname @dtm@#1@day\endcsname} + {#2}% + }% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMsaveddateoffsettojulianday} +% Converts an offset from the saved date to a Julian day number. +% The first argument is the name referencing the saved date, +% the second is the offset increment and the third is a count register +% in which to store the result. +% \begin{macrocode} +\newrobustcmd*{\DTMsaveddateoffsettojulianday}[3]{% + \ifcsundef{@dtm@#1@year}% + {% + \PackageError{datetime2-calc}{Unknown date `#1'}{}% + }% + {% + \pgfcalendardatetojulian + {\csname @dtm@#1@year\endcsname + -\csname @dtm@#1@month\endcsname + -\csname @dtm@#1@day\endcsname + +#2} + {#3}% + }% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMifdate} +% Test a saved date using \cs{pgfcalendarifdate} +% \begin{macrocode} +\newrobustcmd*{\DTMifdate}[4]{% + \ifcsundef{@dtm@#1@year}% + {% + \PackageError{datetime2-calc}{Unknown date `#1'}{}% + }% + {% + \pgfcalendarifdate + {\csname @dtm@#1@year\endcsname + -\csname @dtm@#1@month\endcsname + -\csname @dtm@#1@day\endcsname} + {#2}{#3}{#4}% + }% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMsaveddatediff} +% Computes the difference between two saved dates. The result is +% stored in the third argument, which should be a count register. +% \begin{macrocode} +\newrobustcmd*{\DTMsaveddatediff}[3]{% + \ifcsundef{@dtm@#1@year}% + {% + \PackageError{datetime2-calc}{Unknown date `#1'}{}% + }% + {% + \ifcsundef{@dtm@#2@year}% + {% + \PackageError{datetime2-calc}{Unknown date `#1'}{}% + }% + {% + \pgfcalendardatetojulian + {\csname @dtm@#1@year\endcsname + -\csname @dtm@#1@month\endcsname + -\csname @dtm@#1@day\endcsname} + {#3}% + \pgfcalendardatetojulian + {\csname @dtm@#2@year\endcsname + -\csname @dtm@#2@month\endcsname + -\csname @dtm@#2@day\endcsname} + {\@dtm@julianday}% + \advance#3 by -\@dtm@julianday\relax + } + }% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMtozulu} +% Converts the datetime data referenced by the first argument into +% Zulu time and saves it to data referenced by the second argument. +% \begin{macrocode} +\newrobustcmd*{\DTMtozulu}[2]{% + \ifcsundef{@dtm@#1@year}% + {% + \PackageError{datetime2-calc}{Unknown date `#1'}{}% + }% + {% + \DTMsaveaszulutime{#2}% + {\DTMfetchyear{#1}}% + {\DTMfetchmonth{#1}}% + {\DTMfetchday{#1}}% + {\DTMfetchhour{#1}}% + {\DTMfetchminute{#1}}% + {\DTMfetchsecond{#1}}% + {\DTMfetchTZhour{#1}}% + {\DTMfetchTZminute{#1}}% + }% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMsaveaszulutime} +% Converts the given datetime into Zulu (+00:00) and saves +% the result. +%\changes{1.1}{2015-09-15}{fixed bug in incorrect conversion} +%\begin{definition} +%\cs{DTMsavetozulutime}\marg{name}\marg{year}\marg{month}\marg{day}\marg{hour}\newline\marg{minute}\marg{second}\marg{tzh}\marg{tzm} +%\end{definition} +% \begin{macrocode} +\newrobustcmd*{\DTMsaveaszulutime}[9]{% + \edef\@dtm@year{\number#2}% + \edef\@dtm@month{\number#3}% + \edef\@dtm@day{\number#4}% + \edef\@dtm@hour{\number#5}% + \edef\@dtm@minute{\number#6}% + \edef\@dtm@second{\number#7}% + \edef\@dtm@TZhour{\number#8}% + \edef\@dtm@TZminute{\number#9}% + \pgfcalendardatetojulian{\@dtm@year-\@dtm@month-\@dtm@day}{\@dtm@julianday}% +% \end{macrocode} +% First adjust the minute offset if non-zero +% \begin{macrocode} + \ifnum\@dtm@TZminute=0\relax + \else + \count@=\@dtm@minute\relax +% \end{macrocode} +% Add or subtract the offset minute +% \begin{macrocode} + \ifnum\@dtm@TZhour<0\relax + \advance\count@ by \@dtm@TZminute\relax + \else + \advance\count@ by -\@dtm@TZminute\relax + \fi + \edef\@dtm@minute{\number\count@}% +% \end{macrocode} +% Does the hour need adjusting? +% \begin{macrocode} + \ifnum\count@<0\relax + \advance\count@ by 60\relax + \edef\@dtm@minute{\number\count@}% +% \end{macrocode} +% Need to subtract 1 from the hour +% but does the day need adjusting? +% \begin{macrocode} + \ifnum\@dtm@hour=0\relax + \def\@dtm@hour{23}% +% \end{macrocode} +% Day needs adjusting. +% \begin{macrocode} + \advance\@dtm@julianday by -1\relax + \else +% \end{macrocode} +% Subtract 1 from the hour +% \begin{macrocode} + \count@ = \@dtm@hour\relax + \advance\count@ by -1\relax + \edef\@dtm@hour{\number\count@}% + \fi + \else +% \end{macrocode} +% Minute isn't negative. Is it $\ge 60$? +% \begin{macrocode} + \ifnum\count@>59\relax + \advance\count@ by -60\relax + \edef\@dtm@minute{\number\count@}% +% \end{macrocode} +% Add 1 to the hour +% \begin{macrocode} + \count@ = \@dtm@hour\relax + \advance\count@ by 1\relax + \edef\@dtm@hour{\number\count@}% +% \end{macrocode} +% Does the day need adjusting? +%\changes{1.1}{2015-09-15}{fixed bug in misnamed \cs{@dtm@hour}} +% \begin{macrocode} + \ifnum\@dtm@hour=24\relax + \def\@dtm@hour{00}% + \advance\@dtm@julianday by 1\relax + \fi + \fi + \fi + \fi +% \end{macrocode} +% Now adjust the hour offset if non-zero +% \begin{macrocode} + \ifnum\@dtm@TZhour=0\relax + \else + \count@=\@dtm@hour\relax + \advance\count@ by -\@dtm@TZhour\relax +% \end{macrocode} +% Does the day need adjusting? +% \begin{macrocode} + \ifnum\count@<0\relax + \advance\count@ by 24\relax + \edef\@dtm@hour{\number\count@}% + \advance\@dtm@julianday by -1\relax + \else + \ifnum\count@>23\relax + \advance\count@ by -24\relax + \edef\@dtm@hour{\number\count@}% + \advance\@dtm@julianday by 1\relax + \else + \edef\@dtm@hour{\number\count@}% + \fi + \fi + \fi + \pgfcalendarjuliantodate{\@dtm@julianday}{\@dtm@year}{\@dtm@month}{\@dtm@day}% + \pgfcalendarjuliantoweekday{\@dtm@julianday}{\count@}% +% \end{macrocode} +% Save the results. +% \begin{macrocode} + \csedef{@dtm@#1@dow}{\number\count@}% + \cslet{@dtm@#1@year}{\@dtm@year}% + \cslet{@dtm@#1@month}{\@dtm@month}% + \cslet{@dtm@#1@day}{\@dtm@day}% + \cslet{@dtm@#1@hour}{\@dtm@hour}% + \cslet{@dtm@#1@minute}{\@dtm@minute}% + \cslet{@dtm@#1@second}{\@dtm@second}% + \csdef{@dtm@#1@TZhour}{0}% + \csdef{@dtm@#1@TZminute}{0}% +} +% \end{macrocode} +%\end{macro} +% +%\subsection{Month and Weekday Names} +%These commands \emph{should not} be used in date styles. One of the +%reasons for replacing \sty{datetime} with \sty{datetime2} was +%caused by styles using language-variable names in language-specific +%syntax resulting in a mismatch with the syntax of one language (or +%region) with a translation of the month (and possibly weekday) name. +%These commands are provided for standalone use outside of styles. +%(Additionally, they're not expandable, which also makes them +%inappropriate for the styles that are expected to provide +%expandable dates.) +% +%\begin{macro}{\dtm@ifdianameexists} +%\changes{1.3}{2016-01-22}{new} +% \begin{macrocode} +\newcommand*{\dtm@ifdianameexists}[3]{% + \IfTrackedDialect{\languagename}% + {% + \ifcsdef{DTM\TrackedLanguageFromDialect{\languagename}#1}% + {#2}% + {#3}% + }% + {#3}% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMmonthname} +%\changes{1.3}{2016-01-22}{new} +% \begin{macrocode} +\newrobustcmd{\DTMmonthname}[1]{% +% \end{macrocode} +% First check if \cs{DTM\meta{language}monthname} exists. +% \begin{macrocode} + \ifcsdef{DTM\languagename monthname}% + {% +% \end{macrocode} +% It exists, so use it. +% \begin{macrocode} + \csuse{DTM\languagename monthname}{#1}% + }% + {% +% \end{macrocode} +% Try obtaining the language name from the dialect using +% \sty{tracklang}'s interface. +% \begin{macrocode} + \dtm@ifdianameexists{monthname}% + {% +% \end{macrocode} +% It exists, so use it. +% \begin{macrocode} + \csuse{DTM\TrackedLanguageFromDialect{\languagename}monthname}{#1}% + }% + {% +% \end{macrocode} +% Can't determine the language name macro. This may be because the +% actual name can't be determined or it could be because the +% relevant language module can't be loaded so use \sty{pgf}'s +% command instead, which also has limited language support. +% \begin{macrocode} + \dtmnamewarning{\DTMmonthname}% + \pgfcalendarmonthname{#1}% + }% + }% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMMonthname} +%\changes{1.3}{2016-01-22}{new} +% \begin{macrocode} +\newrobustcmd{\DTMMonthname}[1]{% +% \end{macrocode} +% First check if \cs{DTM\meta{language}Monthname} exists. +% \begin{macrocode} + \ifcsdef{DTM\languagename Monthname}% + {% +% \end{macrocode} +% It exists, so use it. +% \begin{macrocode} + \csuse{DTM\languagename Monthname}{#1}% + }% + {% +% \end{macrocode} +% Try obtaining the language name from the dialect using +% \sty{tracklang}'s interface. +% \begin{macrocode} + \dtm@ifdianameexists{Monthname}% + {% +% \end{macrocode} +% It exists, so use it. +% \begin{macrocode} + \csuse{DTM\TrackedLanguageFromDialect{\languagename}Monthname}{#1}% + }% + {% +% \end{macrocode} +% Can't determine the language name macro. This could be because +% there's no upper case macro as the names always start with a +% capital (like English). +% \begin{macrocode} + \ifcsdef{DTM\languagename monthname}% + {% + \csuse{DTM\languagename monthname}{#1}% + }% + {% + \dtm@ifdianameexists{monthname}% + {% + \csuse{DTM\TrackedLanguageFromDialect{\languagename}monthname}{#1}% + }% + {% +% \end{macrocode} +% Can't find no-case change version either, so use \sty{pgfcalendar} +% command instead (which will need a case-change applied). +% \begin{macrocode} + \dtmnamewarning{\DTMMonthname}% +% \end{macrocode} +% If \sty{mfirstuc} has been loaded, use it. +% \begin{macrocode} + \ifdef\emakefirstuc + {% + \emakefirstuc{\pgfcalendarmonthname{#1}}% + }% + {% +% \end{macrocode} +% Hasn't been loaded, so just expand and apply \cs{MakeUppercase}: +% \begin{macrocode} + \protected@edef\dtm@tmp@monthname{\pgfcalendarmonthname{#1}}% + \expandafter\MakeUppercase\dtm@tmp@monthname + }% + }% + }% + }% + }% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMshortmonthname} +%\changes{1.3}{2016-01-22}{new} +% \begin{macrocode} +\newrobustcmd{\DTMshortmonthname}[1]{% +% \end{macrocode} +% First check if \cs{DTM\meta{language}shortmonthname} exists. +% \begin{macrocode} + \ifcsdef{DTM\languagename shortmonthname}% + {% +% \end{macrocode} +% It exists, so use it. +% \begin{macrocode} + \csuse{DTM\languagename shortmonthname}{#1}% + }% + {% +% \end{macrocode} +% Try obtaining the language name from the dialect using +% \sty{tracklang}'s interface. +% \begin{macrocode} + \dtm@ifdianameexists{shortmonthname}% + {% +% \end{macrocode} +% It exists, so use it. +% \begin{macrocode} + \csuse{DTM\TrackedLanguageFromDialect{\languagename}shortmonthname}{#1}% + }% + {% +% \end{macrocode} +% Can't determine the language name macro. This may be because the +% actual name can't be determined or it could be because the +% relevant language module can't be loaded so use \sty{pgf}'s +% command instead, which also has limited language support. +% \begin{macrocode} + \dtmnamewarning{\DTMshortmonthname}% + \pgfcalendarmonthshortname{#1}% + }% + }% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMshortMonthname} +%\changes{1.3}{2016-01-22}{new} +% \begin{macrocode} +\newrobustcmd{\DTMshortMonthname}[1]{% +% \end{macrocode} +% First check if \cs{DTM\meta{language}shortMonthname} exists. +% \begin{macrocode} + \ifcsdef{DTM\languagename shortMonthname}% + {% +% \end{macrocode} +% It exists, so use it. +% \begin{macrocode} + \csuse{DTM\languagename shortMonthname}{#1}% + }% + {% +% \end{macrocode} +% Try obtaining the language name from the dialect using +% \sty{tracklang}'s interface. +% \begin{macrocode} + \dtm@ifdianameexists{shortMonthname}% + {% +% \end{macrocode} +% It exists, so use it. +% \begin{macrocode} + \csuse{DTM\TrackedLanguageFromDialect{\languagename}shortMonthname}{#1}% + }% + {% +% \end{macrocode} +% Can't determine the language name macro. This could be because +% there's no upper case macro as the names always start with a +% capital (like English). +% \begin{macrocode} + \ifcsdef{DTM\languagename shortmonthname}% + {% + \csuse{DTM\languagename shortmonthname}{#1}% + }% + {% + \dtm@ifdianameexists{shortmonthname}% + {% + \csuse{DTM\TrackedLanguageFromDialect{\languagename}shortmonthname}% + {#1}% + }% + {% +% \end{macrocode} +% Can't find no-case change version either, so use \sty{pgfcalendar} +% command instead (which will need a case-change applied). +% \begin{macrocode} + \dtmnamewarning{\DTMshortMonthname}% +% \end{macrocode} +% If \sty{mfirstuc} has been loaded, use it. +% \begin{macrocode} + \ifdef\emakefirstuc + {% + \emakefirstuc{\pgfcalendarmonthshortname{#1}}% + }% + {% +% \end{macrocode} +% Hasn't been loaded, so just expand and apply \cs{MakeUppercase}: +% \begin{macrocode} + \protected@edef\dtm@tmp@monthname{\pgfcalendarmonthshortname{#1}}% + \expandafter\MakeUppercase\dtm@tmp@monthname + }% + }% + }% + }% + }% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMcomputedayofweekindex} +%\begin{definition} +%\cs{DTMcomputedayofweekindex}\marg{date}\marg{cs} +%\end{definition} +% This is for standalone use and shouldn't be used in any date +% styles (since the day of week index is already supplied). +% The result is stored in the supplied control sequence. +%\changes{2016-02-11}{1.4}{new} +% \begin{macrocode} +\newrobustcmd*{\DTMcomputedayofweekindex}[2]{% + \pgfcalendardatetojulian{#1}{\@dtm@julianday}% + \pgfcalendarjuliantoweekday{\@dtm@julianday}{\count@}% + \edef#2{\number\count@}% +} +% \end{macrocode} +%\end{macro} +% +%These are shared with the \sty{locale} package, so they may already +%be defined. +%\begin{macro}{\dtmMondayIndex} +%\changes{1.5.3}{??}{new} +% \begin{macrocode} +\def\dtmMondayIndex{0} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\dtmTuesdayIndex} +%\changes{1.5.3}{??}{new} +% \begin{macrocode} +\def\dtmTuesdayIndex{1} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\dtmWednesdayIndex} +%\changes{1.5.3}{??}{new} +% \begin{macrocode} +\def\dtmWednesdayIndex{2} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\dtmThursdayIndex} +%\changes{1.5.3}{??}{new} +% \begin{macrocode} +\def\dtmThursdayIndex{3} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\dtmFridayIndex} +%\changes{1.5.3}{??}{new} +% \begin{macrocode} +\def\dtmFridayIndex{4} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\dtmSaturdayIndex} +%\changes{1.5.3}{??}{new} +% \begin{macrocode} +\def\dtmSaturdayIndex{5} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\dtmSundayIndex} +%\changes{1.5.3}{??}{new} +% \begin{macrocode} +\def\dtmSundayIndex{6} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMweekdayname} +%\changes{1.3}{2016-01-22}{new} +% \begin{macrocode} +\newrobustcmd{\DTMweekdayname}[1]{% +% \end{macrocode} +% First check if \cs{DTM\meta{language}weekdayname} exists. +% \begin{macrocode} + \ifcsdef{DTM\languagename weekdayname}% + {% +% \end{macrocode} +% It exists, so use it. +% \begin{macrocode} + \csuse{DTM\languagename weekdayname}{#1}% + }% + {% +% \end{macrocode} +% Try obtaining the language name from the dialect using +% \sty{tracklang}'s interface. +% \begin{macrocode} + \dtm@ifdianameexists{weekdayname}% + {% +% \end{macrocode} +% It exists, so use it. +% \begin{macrocode} + \csuse{DTM\TrackedLanguageFromDialect{\languagename}weekdayname}{#1}% + }% + {% +% \end{macrocode} +% Can't determine the language name macro. This may be because the +% actual name can't be determined or it could be because the +% relevant language module can't be loaded so use \sty{pgf}'s +% command instead, which also has limited language support. +% \begin{macrocode} + \dtmnamewarning{\DTMweekdayname}% + \pgfcalendarweekdayname{#1}% + }% + }% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMWeekdayname} +%\changes{1.3}{2016-01-22}{new} +% \begin{macrocode} +\newrobustcmd{\DTMWeekdayname}[1]{% +% \end{macrocode} +% First check if \cs{DTM\meta{language}Weekdayname} exists. +% \begin{macrocode} + \ifcsdef{DTM\languagename Weekdayname}% + {% +% \end{macrocode} +% It exists, so use it. +% \begin{macrocode} + \csuse{DTM\languagename Weekdayname}{#1}% + }% + {% +% \end{macrocode} +% Try obtaining the language name from the dialect using +% \sty{tracklang}'s interface. +% \begin{macrocode} + \dtm@ifdianameexists{Weekdayname}% + {% +% \end{macrocode} +% It exists, so use it. +% \begin{macrocode} + \csuse{DTM\TrackedLanguageFromDialect{\languagename}Weekdayname}{#1}% + }% + {% +% \end{macrocode} +% Can't determine the language name macro. This could be because +% there's no upper case macro as the names always start with a +% capital (like English). +% \begin{macrocode} + \ifcsdef{DTM\languagename weekdayname}% + {% + \csuse{DTM\languagename weekdayname}{#1}% + }% + {% + \dtm@ifdianameexists{weekdayname}% + {% + \csuse{DTM\TrackedLanguageFromDialect{\languagename}weekdayname}{#1}% + }% + {% +% \end{macrocode} +% Can't find no-case change version either, so use \sty{pgfcalendar} +% command instead (which will need a case-change applied). +% \begin{macrocode} + \dtmnamewarning{\DTMWeekdayname}% +% \end{macrocode} +% If \sty{mfirstuc} has been loaded, use it. +% \begin{macrocode} + \ifdef\emakefirstuc + {% + \emakefirstuc{\pgfcalendarweekdayname{#1}}% + }% + {% +% \end{macrocode} +% Hasn't been loaded, so just expand and apply \cs{MakeUppercase}: +% \begin{macrocode} + \protected@edef\dtm@tmp@weekdayname{\pgfcalendarweekdayname{#1}}% + \expandafter\MakeUppercase\dtm@tmp@weekdayname + }% + }% + }% + }% + }% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMshortweekdayname} +%\changes{1.3}{2016-01-22}{new} +% \begin{macrocode} +\newrobustcmd{\DTMshortweekdayname}[1]{% +% \end{macrocode} +% First check if \cs{DTM\meta{language}shortweekdayname} exists. +% \begin{macrocode} + \ifcsdef{DTM\languagename shortweekdayname}% + {% +% \end{macrocode} +% It exists, so use it. +% \begin{macrocode} + \csuse{DTM\languagename shortweekdayname}{#1}% + }% + {% +% \end{macrocode} +% Try obtaining the language name from the dialect using +% \sty{tracklang}'s interface. +% \begin{macrocode} + \dtm@ifdianameexists{shortweekdayname}% + {% +% \end{macrocode} +% It exists, so use it. +% \begin{macrocode} + \csuse{DTM\TrackedLanguageFromDialect{\languagename}shortweekdayname}{#1}% + }% + {% +% \end{macrocode} +% Can't determine the language name macro. This may be because the +% actual name can't be determined or it could be because the +% relevant language module can't be loaded so use \sty{pgf}'s +% command instead, which also has limited language support. +% \begin{macrocode} + \dtmnamewarning{\DTMshortweekdayname}% + \pgfcalendarweekdayshortname{#1}% + }% + }% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMshortWeekdayname} +%\changes{1.3}{2016-01-22}{new} +% \begin{macrocode} +\newrobustcmd{\DTMshortWeekdayname}[1]{% +% \end{macrocode} +% First check if \cs{DTM\meta{language}shortWeekdayname} exists. +% \begin{macrocode} + \ifcsdef{DTM\languagename shortWeekdayname}% + {% +% \end{macrocode} +% It exists, so use it. +% \begin{macrocode} + \csuse{DTM\languagename shortWeekdayname}{#1}% + }% + {% +% \end{macrocode} +% Try obtaining the language name from the dialect using +% \sty{tracklang}'s interface. +% \begin{macrocode} + \dtm@ifdianameexists{shortWeekdayname}% + {% +% \end{macrocode} +% It exists, so use it. +% \begin{macrocode} + \csuse{DTM\TrackedLanguageFromDialect{\languagename}shortWeekdayname}{#1}% + }% + {% +% \end{macrocode} +% Can't determine the language name macro. This could be because +% there's no upper case macro as the names always start with a +% capital (like English). +% \begin{macrocode} + \ifcsdef{DTM\languagename shortweekdayname}% + {% + \csuse{DTM\languagename shortweekdayname}{#1}% + }% + {% + \dtm@ifdianameexists{shortweekdayname}% + {% + \csuse{DTM\TrackedLanguageFromDialect{\languagename}shortweekdayname}% + {#1}% + }% + {% +% \end{macrocode} +% Can't find no-case change version either, so use \sty{pgfcalendar} +% command instead (which will need a case-change applied). +% \begin{macrocode} + \dtmnamewarning{\DTMshortWeekdayname}% +% \end{macrocode} +% If \sty{mfirstuc} has been loaded, use it. +% \begin{macrocode} + \ifdef\emakefirstuc + {% + \emakefirstuc{\pgfcalendarweekdayshortname{#1}}% + }% + {% +% \end{macrocode} +% Hasn't been loaded, so just expand and apply \cs{MakeUppercase}: +% \begin{macrocode} + \protected@edef\dtm@tmp@weekdayname{% + \pgfcalendarweekdayshortname{#1}}% + \expandafter\MakeUppercase\dtm@tmp@weekdayname + }% + }% + }% + }% + }% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\DTMordinal} +%\changes{1.3}{2016-01-22}{new} +% \begin{macrocode} +\newrobustcmd{\DTMordinal}[1]{% +% \end{macrocode} +% First check if \cs{DTM\meta{language}ordinal} exists. +% \begin{macrocode} + \ifcsdef{DTM\languagename ordinal}% + {% +% \end{macrocode} +% It exists, so use it. +% \begin{macrocode} + \csuse{DTM\languagename ordinal}{#1}% + }% + {% +% \end{macrocode} +% Try obtaining the language name from the dialect using +% \sty{tracklang}'s interface. +% \begin{macrocode} + \dtm@ifdianameexists{ordinal}% + {% +% \end{macrocode} +% It exists, so use it. +% \begin{macrocode} + \csuse{DTM\TrackedLanguageFromDialect{\languagename}ordinal}{#1}% + }% + {% +% \end{macrocode} +% Can't determine the language name macro. This may be because the +% actual name can't be determined or it could be because the +% relevant language module can't be loaded so just display the +% number. +% \begin{macrocode} + \number#1 + }% + }% +} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\dtmnamewarning} +%\changes{1.3}{2016-01-22}{new} +% Issue warning unless warnings have been suppressed. +% \begin{macrocode} +\newcommand*{\dtmnamewarning}[1]{% + \if@dtm@warn + \PackageWarning{datetime2-calc}% + {Can't find underlying language macro for \MessageBreak + \string#1\space(language: \languagename); \MessageBreak + using pgfcalendar macro instead}% + \fi +} +% \end{macrocode} +%\end{macro} +%\iffalse +% \begin{macrocode} +% +% \end{macrocode} +%\fi +%\Finale +\endinput diff --git a/macros/latex/contrib/datetime2/datetime2.ins b/macros/latex/contrib/datetime2/datetime2.ins new file mode 100644 index 0000000000..91a29acb33 --- /dev/null +++ b/macros/latex/contrib/datetime2/datetime2.ins @@ -0,0 +1,33 @@ +% datetime2.ins generated using makedtx version 1.2 2018/7/20 12:36 +\input docstrip + +\preamble + + datetime2.dtx + Copyright 2018 Nicola Talbot + + This work may be distributed and/or modified under the + conditions of the LaTeX Project Public License, either version 1.3 + 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.3 or later is part of all distributions of LaTeX + version 2005/12/01 or later. + + This work has the LPPL maintenance status `maintained'. + + The Current Maintainer of this work is Nicola Talbot. + + This work consists of the files datetime2.dtx and datetime2.ins and the derived files datetime2.sty, datetime2-calc.sty. + +\endpreamble + +\askforoverwritefalse + +\generate{\file{datetime2.sty}{\usepreamble\defaultpreamble +\usepostamble\defaultpostamble\from{datetime2.dtx}{datetime2.sty,package}} +\file{datetime2-calc.sty}{\usepreamble\defaultpreamble +\usepostamble\defaultpostamble\from{datetime2.dtx}{datetime2-calc.sty,package}} +} + +\endbatchfile diff --git a/macros/latex/contrib/datetime2/datetime2.pdf b/macros/latex/contrib/datetime2/datetime2.pdf new file mode 100644 index 0000000000..a15e11feb4 Binary files /dev/null and b/macros/latex/contrib/datetime2/datetime2.pdf differ diff --git a/macros/latex/contrib/datetime2/samples/datetime2-sample-babel.pdf b/macros/latex/contrib/datetime2/samples/datetime2-sample-babel.pdf new file mode 100644 index 0000000000..578625e683 Binary files /dev/null and b/macros/latex/contrib/datetime2/samples/datetime2-sample-babel.pdf differ diff --git a/macros/latex/contrib/datetime2/samples/datetime2-sample-babel.tex b/macros/latex/contrib/datetime2/samples/datetime2-sample-babel.tex new file mode 100644 index 0000000000..85c7dfadd4 --- /dev/null +++ b/macros/latex/contrib/datetime2/samples/datetime2-sample-babel.tex @@ -0,0 +1,84 @@ +% This file is public domain. + +% This document requires the datetime2-english module to be +% installed (in addition to the datetime2 package). +% arara: pdflatex +\documentclass[british,american,australian,canadian,newzealand,en-GG,en-JE,en-IM,en-MT,en-IE]{article} + +\usepackage{babel} +\usepackage[datesep=/,showzoneminutes=false,useregional]{datetime2} +\usepackage[colorlinks]{hyperref} + +%\DTMlangsetup{mapzone=false} + +\DTMsavetimestamp{mydate}{2014-06-03T12:45:02+01:00} +\DTMsavetimestamp{mydate2}{2015-03-20T08:05:09+00:00} +\DTMsavetimestamp{mydate3}{2014-12-15T23:55:49-06:00} +\DTMsavetimestamp{mydate4}{2014-01-27T12:05:00+09:00} +\DTMsavetimestamp{mydate5}{2013-11-28T02:05:00+12:00} + +% This will clear the BST mapping when the regional styles are set. +% The en-GB (british) style will then set it to BST. +\renewcommand*{\DTMresetzones}{\DTMclearmap{01}{00}} + +\begin{document} +\tableofcontents + +% Define command to test each region +\newcommand{\testregion}[1]{% + \ifcsdef{date#1}{\selectlanguage{#1}}{\DTMsetstyle{#1}}% + + \section{#1} + + Today: \today. + + Now: \DTMnow. + + \subsection{\DTMuse{mydate}} + Saved Date (\texttt{mydate}): \DTMusedate{mydate} + Saved time (\texttt{mydate}): \DTMusetime{mydate}. + \typeout{Date (#1): \DTMusedate{mydate}} + + \subsection{\DTMuse{mydate2}} + Saved Date (\texttt{mydate2}): \DTMusedate{mydate2} + Saved time (\texttt{mydate2}): \DTMusetime{mydate2}. + \typeout{Date (#1): \DTMusedate{mydate2}} + + \subsection{\DTMuse{mydate3}} + Saved Date (\texttt{mydate3}): \DTMusedate{mydate3} + Saved time (\texttt{mydate3}): \DTMusetime{mydate3}. + \typeout{Date (#1): \DTMusedate{mydate3}} + + \subsection{\DTMuse{mydate4}} + Saved Date (\texttt{mydate4}): \DTMusedate{mydate4} + Saved time (\texttt{mydate4}): \DTMusetime{mydate4}. + \typeout{Date (#1): \DTMusedate{mydate4}} + + \subsection{\DTMuse{mydate5}} + Saved Date (\texttt{mydate5}): \DTMusedate{mydate5} + Saved time (\texttt{mydate5}): \DTMusetime{mydate5}. + \typeout{Date (#1): \DTMusedate{mydate5}} +} + +\testregion{british} + +\testregion{american} + +\testregion{australian} + +\testregion{canadian} + +\testregion{newzealand} + +% no official babel language for these regions as far as I can tell: +\testregion{en-GG} + +\testregion{en-JE} + +\testregion{en-IM} + +\testregion{en-MT} + +\testregion{en-IE} + +\end{document} diff --git a/macros/latex/contrib/datetime2/samples/datetime2-sample-calc.pdf b/macros/latex/contrib/datetime2/samples/datetime2-sample-calc.pdf new file mode 100644 index 0000000000..02e2ba10da Binary files /dev/null and b/macros/latex/contrib/datetime2/samples/datetime2-sample-calc.pdf differ diff --git a/macros/latex/contrib/datetime2/samples/datetime2-sample-calc.tex b/macros/latex/contrib/datetime2/samples/datetime2-sample-calc.tex new file mode 100644 index 0000000000..decea34b1d --- /dev/null +++ b/macros/latex/contrib/datetime2/samples/datetime2-sample-calc.tex @@ -0,0 +1,76 @@ +% This file is public domain. + +% arara: pdflatex +\documentclass{article} + +\usepackage[calc]{datetime2} + +\begin{document} + +\DTMsavejulianday{mydate}{2457023} +\DTMsavedate{mydate2}{2014-06-20} + +Date: \DTMusedate{mydate}. + +\newcount\myct +\DTMsaveddatetojulianday{mydate}{\myct} + +Julian day number: \number\myct. + +\DTMsaveddateoffsettojulianday{mydate}{2}{\myct} + +Julian day number (offset+2): \number\myct. + +Is \texttt{mydate2} (\DTMusedate{mydate2}) before +\texttt{mydate} (\DTMusedate{mydate})? +\DTMifdate + {mydate2} + {at most= + \DTMfetchyear{mydate}-\DTMfetchmonth{mydate}-\DTMfetchday{mydate}} + {yes}{no}. + +Is \texttt{mydate2} (\DTMusedate{mydate2}) after +\texttt{mydate} (\DTMusedate{mydate})? +\DTMifdate + {mydate2} + {at least= + \DTMfetchyear{mydate}-\DTMfetchmonth{mydate}-\DTMfetchday{mydate}} + {yes}{no}. + +\DTMsaveddatediff{mydate}{mydate2}{\myct} + +\DTMusedate{mydate} is +\ifnum\myct=0 + the same day as +\else + \ifnum\myct<0 + \number-\myct\space day\ifnum\myct<-1s\fi\space before + \else + \number\myct\space day\ifnum\myct>1s\fi\space after + \fi +\fi +\DTMusedate{mydate2}. + +Original date: 2014-06-3 20:45:00 +06:00 + +\DTMsaveaszulutime{mydate}{2014}{6}{3}{20}{45}{0}{6}{0} +UTC+00:00 date: \DTMuse{mydate}. + +\DTMsavetimestamp{mydate}{2014-05-01T03:55:00 -06:00} +Original date: \DTMuse{mydate}. + +\DTMtozulu{mydate}{mydate2} +UTC+00:00: \DTMuse{mydate2}. + +Offset: \DTMdate{2015-03-30+4}. + +Last: \DTMdate{2015-02-last}. + +Last with offset: \DTMdate{2015-02-last+-2}. + +Saved date with offset +\DTMsavedate{offset}{2015-02-last+-2} + +Use date: \DTMusedate{offset}. + +\end{document} diff --git a/macros/latex/contrib/datetime2/samples/datetime2-sample-filedate.pdf b/macros/latex/contrib/datetime2/samples/datetime2-sample-filedate.pdf new file mode 100644 index 0000000000..3e2c3e54d2 Binary files /dev/null and b/macros/latex/contrib/datetime2/samples/datetime2-sample-filedate.pdf differ diff --git a/macros/latex/contrib/datetime2/samples/datetime2-sample-filedate.tex b/macros/latex/contrib/datetime2/samples/datetime2-sample-filedate.tex new file mode 100644 index 0000000000..bf9df37ce8 --- /dev/null +++ b/macros/latex/contrib/datetime2/samples/datetime2-sample-filedate.tex @@ -0,0 +1,23 @@ +% This file is public domain. + +% arara: pdflatex +% May also work with lualatex on some platforms (such as Linux) +% but the file mod date is not supported with xelatex. +% (The time zone %z format with Lua may not work on some platforms.) +% arara: pdflatex +\documentclass{article} + +\usepackage{datetime2} + +\begin{document} +Current date and time: \DTMnow. + +\DTMsavefilemoddate{filemod}{\jobname.tex} + +File modification date: \DTMuse{filemod}. + +Save current date and time. +\DTMsavenow{mydate} + +Now use it: \DTMuse{mydate}. +\end{document} diff --git a/macros/latex/contrib/datetime2/samples/datetime2-sample-hyperref.pdf b/macros/latex/contrib/datetime2/samples/datetime2-sample-hyperref.pdf new file mode 100644 index 0000000000..b26477e0e4 Binary files /dev/null and b/macros/latex/contrib/datetime2/samples/datetime2-sample-hyperref.pdf differ diff --git a/macros/latex/contrib/datetime2/samples/datetime2-sample-hyperref.tex b/macros/latex/contrib/datetime2/samples/datetime2-sample-hyperref.tex new file mode 100644 index 0000000000..ed881d5e02 --- /dev/null +++ b/macros/latex/contrib/datetime2/samples/datetime2-sample-hyperref.tex @@ -0,0 +1,81 @@ +% This file is public domain. +% This document additionally requires the datetime2-english module +% to be installed. + +% arara: pdflatex +% arara: pdflatex +\documentclass[en-GB,en-US,en-AU]{article} + +\usepackage[datesep=/,showzoneminutes=false]{datetime2} +\usepackage[colorlinks]{hyperref} + +\DTMsetup{showdow} + +\DTMsavetimestamp{mydate}{2014-06-03T12:45:02+01:00} + +\begin{document} +\tableofcontents + +The use of \verb|\typeout| is to test the expansion in the event +that the date/time needs to be written to an external file. +Use +\texttt{\href{http://www.dickimaw-books.com/latex/novices/html/texdoc.html}{texdoc} datetime2} to read the main user manual for +the \texttt{datetime2} package and use \texttt{texdoc +datetime2-english} for the English module documentation. + +\section{Default date: \today} + +Today: \today. Time: \DTMcurrenttime. Zone: \DTMcurrentzone. + +Now: \DTMnow. + +TWO DIGITS: \DTMtwodigits{2014}. \DTMtwodigits{2999}. +\DTMtwodigits{-2}. + +\typeout{Date Stamp (Default): \DTMnow} + +Saved date: \DTMusedate{mydate}. +Saved time: \DTMusetime{mydate}. + +Saved date-time: \DTMuse{mydate}. + +\typeout{Date Stamp (Default): \DTMuse{mydate}} + +\section{Default time: \DTMusetime{mydate}} + +\DTMsetstyle{iso} + +ISO: \DTMnow. +\typeout{Date Stamp (ISO): \DTMnow} + +Saved date: \DTMuse{mydate}. +\typeout{Date Stamp (ISO): \DTMuse{mydate}} + +\DTMsetstyle{en-GB} +\section{(GB) \DTMusedate{mydate}} + +en-GB: \DTMnow. +\typeout{Date Stamp (GB): \DTMnow} + +Saved date: \DTMuse{mydate}. +\typeout{Date Stamp (GB): \DTMuse{mydate}} + +\DTMsetstyle{en-US} +\section{(US) \DTMusedate{mydate}} + +en-US: \DTMnow. +\typeout{Date Stamp (US): \DTMnow} + +Saved date: \DTMuse{mydate}. +\typeout{Date Stamp (US): \DTMuse{mydate}} + +\DTMsetstyle{en-AU} +\section{(AU) \DTMusedate{mydate}} + +en-AU: \DTMnow. +\typeout{Date Stamp (AU): \DTMnow} + +Saved date: \DTMuse{mydate}. +\typeout{Date Stamp (AU): \DTMuse{mydate}} + +\end{document} diff --git a/macros/latex/contrib/datetime2/samples/datetime2-sample-journal.pdf b/macros/latex/contrib/datetime2/samples/datetime2-sample-journal.pdf new file mode 100644 index 0000000000..5fd3663335 Binary files /dev/null and b/macros/latex/contrib/datetime2/samples/datetime2-sample-journal.pdf differ diff --git a/macros/latex/contrib/datetime2/samples/datetime2-sample-journal.tex b/macros/latex/contrib/datetime2/samples/datetime2-sample-journal.tex new file mode 100644 index 0000000000..26aa64535e --- /dev/null +++ b/macros/latex/contrib/datetime2/samples/datetime2-sample-journal.tex @@ -0,0 +1,127 @@ +% arara: pdflatex +% arara: pdflatex +\documentclass{memoir} + +\usepackage[en-GB,showdow]{datetime2} + +\usepackage{lipsum}% dummy text +\usepackage[hidelinks]{hyperref} + +\newcommand*{\numdash}{\texorpdfstring{\,--\,}{--}} + +% \DTMmonthname is robust and can't be used in the bookmarks +% or headings so use \DTMenglishmonthname since this +% document is in English. +\newcommand*{\entrymonth}[2]{\DTMenglishmonthname{#2} #1} + +% A range of dates. +% Syntax: \daterange{yyyy1}{mm1}{dd1}{yyyy2}{mm2}{dd2} +\newcommand*{\daterange}[6]{% + \ifnum#1=#4 +% Same year + \ifnum#2=#5 +% Same month + \ifnum#3=#6 +% Same day - not a range! + \DTMdisplaydate{#1}{#2}{#3}% + \else +% Range within the same month. +% This needs to be done explicitly but match the separators +% with the en-GB style. + \DTMenglishordinal{#3}\numdash\DTMenglishordinal{#6}% + \DTMenGBdaymonthsep + \DTMenglishmonthname{#2}% + \DTMenGBmonthyearsep\number#1 + \fi + \else +% Not the same month + \DTMdisplaydate{#1}{#2}{#3}{-1}\numdash\DTMdisplaydate{#4}{#5}{#6}{-1}% + \fi + \else +% Not same year + \DTMdisplaydate{#1}{#2}{#3}{-1}\numdash\DTMdisplaydate{#4}{#5}{#6}{-1}% + \fi +} + +% range of months +% Syntax: \monthspan{yyyy1}{mm1}{yyyy2}{mm2} +\newcommand*{\monthspan}[4]{% + \ifnum#1=#3 +% Same year + \DTMenglishmonthname{#2}\numdash\DTMenglishmonthname{#4}% + \DTMenGBmonthyearsep\number#1 + \else +% Not the same year + \DTMenglishmonthname{#2}% + \DTMenGBmonthyearsep\number#1 + \numdash\DTMenglishmonthname{#4}% + \DTMenGBmonthyearsep\number#3 + \fi +} + +\newcommand*{\entrydate}[3]{\DTMdisplaydate{#1}{#2}{#3}{-1}} +\newcommand*{\titleentrydate}[3]{\DTMdate{#1-#2-#3}} + +\renewcommand*{\printchaptertitle}[1]{% + {% + \let\entrydate\titleentrydate + \chaptitlefont{#1}% + }% +} + +\setsecheadstyle{\let\entrydate\titleentrydate + \Large\bfseries\memRTLraggedright} + +\begin{document} + +\frontmatter +\tableofcontents + +\mainmatter +\chapter{Introduction} + +This is a test document that illustrates the use of dates within +chapter titles. + +\section{Sample} + +An example section. + +\chapter{\entrymonth{2016}{01}} + +\lipsum + +\section{\entrydate{2016}{01}{01}} + +\lipsum[1-10] + +\section{\entrydate{2016}{01}{02}} + +\lipsum + +\section{\daterange{2016}{01}{04}{2016}{01}{12}} + +\lipsum[1-3] + +\chapter{\entrydate{2016}{02}{03}} + +\lipsum + +\chapter{\monthspan{2016}{02}{2016}{03}} + +\lipsum + +\section{\daterange{2016}{02}{04}{2016}{03}{01}} + +\lipsum + +\chapter{\monthspan{2015}{12}{2016}{01}} + +\lipsum + +\section{\daterange{2015}{12}{20}{2016}{01}{01}} + +\lipsum + + +\end{document} diff --git a/macros/latex/contrib/datetime2/samples/datetime2-sample-styles.pdf b/macros/latex/contrib/datetime2/samples/datetime2-sample-styles.pdf new file mode 100644 index 0000000000..76dbfd1e82 Binary files /dev/null and b/macros/latex/contrib/datetime2/samples/datetime2-sample-styles.pdf differ diff --git a/macros/latex/contrib/datetime2/samples/datetime2-sample-styles.tex b/macros/latex/contrib/datetime2/samples/datetime2-sample-styles.tex new file mode 100644 index 0000000000..28d042f729 --- /dev/null +++ b/macros/latex/contrib/datetime2/samples/datetime2-sample-styles.tex @@ -0,0 +1,102 @@ +% This file is public domain. +% This document additionally requires the datetime2-english module +% to be installed. + +% arara: pdflatex +\documentclass[english]{report} + +\usepackage{datetime2} + +%\DTMsetup{showseconds=false,datesep=/,timesep=.} + +\newcommand{\testdate}[1]{% + \DTMsetstyle{#1}\section{Style `#1'}\par + \begin{tabular}{ll} + Now: & \DTMnow.\\ + Positive Time Zone: & \DTMuse{mydate+}\\ + Negative Time Zone: & \DTMuse{mydate-}\\ + Zero Time Zone: & \DTMuse{mydate0} + \end{tabular}\par + \typeout{Date-Time (#1): \DTMnow.}% +} + +\newcommand{\testtime}[1]{% + \DTMsettimestyle{#1}% + \section{#1}\par + \begin{tabular}{ll} + Now: & \DTMcurrenttime.\\ + 0 milliseconds: & \DTMusetime{mydate+}.\\ + 45 milliseconds: & \DTMusetime{mydate2}.\\ + Noon: & \DTMusetime{noon}.\\ + Midnight (0hrs): & \DTMusetime{midnight1}.\\ + Midnight (24hrs): & \DTMusetime{midnight2}.\\ + Morning: & \DTMusetime{8am}.\\ + Evening: & \DTMusetime{8pm}.\\ + Post-Midday: & \DTMusetime{1203}.\\ + Post-Midnight (24hr): & \DTMusetime{2401}.\\ + Post-Midnight (0hr): & \DTMusetime{0001}. + \end{tabular}\par + \typeout{Time (#1): \DTMcurrenttime. + \DTMusetime{mydate}. + \DTMusetime{mydate2}. + \DTMusetime{noon}. + \DTMusetime{midnight1}. + \DTMusetime{midnight2}. + \DTMusetime{8am}. + \DTMusetime{8pm}. + \DTMusetime{1203}. + \DTMusetime{2401}. + \DTMusetime{0001}. + }% +} + +\begin{document} +\chapter{Date-Time Styles} +\DTMsavetimestamp{mydate+}{2015-04-01T08:05:00+01:00} +\DTMsavetimestamp{mydate-}{2015-04-01T08:05:00-01:00} +\DTMsavetimestamp{mydate0}{2015-04-01T08:05:00+00:00} + +\testdate{default} + +\testdate{iso} + +\testdate{pdf} + +\testdate{ddmmyyyy} + +\testdate{dmyyyy} + +\testdate{dmyy} + +\testdate{mmddyyyy} + +\testdate{mdyyyy} + +\testdate{mdyy} + +\testdate{yyyymd} + +\chapter{Time Styles} + +\DTMsavetimestamp{mydate2}{2015-04-01T08:13:45+01:00} +\DTMsavetime{noon}{12:00:00} +\DTMsavetime{midnight1}{00:00:00} +\DTMsavetime{midnight2}{24:00:00} +\DTMsavetime{8am}{08:00:00} +\DTMsavetime{8pm}{20:00:00} +\DTMsavetime{1203}{12:03:00} +\DTMsavetime{2401}{24:01:00} +\DTMsavetime{0001}{00:01:00} + +\testtime{hmmss} + +\testtime{englishampm} + +\renewcommand*{\DTMenglishampmfmt}[1]{\protect\textsc{#1}} + +\bigskip + +(Redefining \verb|\DTMenglishampmfmt| for following test.) +\testtime{englishampm} + +\end{document} diff --git a/macros/latex/contrib/datetime2/samples/datetime2-sample-xe.pdf b/macros/latex/contrib/datetime2/samples/datetime2-sample-xe.pdf new file mode 100644 index 0000000000..bcf2d0b7ea Binary files /dev/null and b/macros/latex/contrib/datetime2/samples/datetime2-sample-xe.pdf differ diff --git a/macros/latex/contrib/datetime2/samples/datetime2-sample-xe.tex b/macros/latex/contrib/datetime2/samples/datetime2-sample-xe.tex new file mode 100644 index 0000000000..09c2a33298 --- /dev/null +++ b/macros/latex/contrib/datetime2/samples/datetime2-sample-xe.tex @@ -0,0 +1,20 @@ +% arara: xelatex: {shell: on} +\documentclass{article} + +\usepackage{texosquery} +% Disable texosquery: +%\TeXOSQueryDryRuntrue +\usepackage{datetime2} + +% If you get an error that looks like: +% ! I can't find file `"|texosquery -n"'. +% Then the shell escape has been restricted and texosquery +% wasn't allowed to run. + +\begin{document} +\DTMnow. + +\DTMsavefilemoddate{moddate}{\jobname.tex} +File \texttt{\jobname.tex} last modified: \DTMuse{moddate}. + +\end{document} -- cgit v1.2.3