summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/datetime2
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/datetime2
Initial commit
Diffstat (limited to 'macros/latex/contrib/datetime2')
-rw-r--r--macros/latex/contrib/datetime2/CHANGES67
-rw-r--r--macros/latex/contrib/datetime2/README18
-rw-r--r--macros/latex/contrib/datetime2/datetime2.dtx9763
-rw-r--r--macros/latex/contrib/datetime2/datetime2.ins33
-rw-r--r--macros/latex/contrib/datetime2/datetime2.pdfbin0 -> 685060 bytes
-rw-r--r--macros/latex/contrib/datetime2/samples/datetime2-sample-babel.pdfbin0 -> 72937 bytes
-rw-r--r--macros/latex/contrib/datetime2/samples/datetime2-sample-babel.tex84
-rw-r--r--macros/latex/contrib/datetime2/samples/datetime2-sample-calc.pdfbin0 -> 28801 bytes
-rw-r--r--macros/latex/contrib/datetime2/samples/datetime2-sample-calc.tex76
-rw-r--r--macros/latex/contrib/datetime2/samples/datetime2-sample-filedate.pdfbin0 -> 17006 bytes
-rw-r--r--macros/latex/contrib/datetime2/samples/datetime2-sample-filedate.tex23
-rw-r--r--macros/latex/contrib/datetime2/samples/datetime2-sample-hyperref.pdfbin0 -> 62797 bytes
-rw-r--r--macros/latex/contrib/datetime2/samples/datetime2-sample-hyperref.tex81
-rw-r--r--macros/latex/contrib/datetime2/samples/datetime2-sample-journal.pdfbin0 -> 100517 bytes
-rw-r--r--macros/latex/contrib/datetime2/samples/datetime2-sample-journal.tex127
-rw-r--r--macros/latex/contrib/datetime2/samples/datetime2-sample-styles.pdfbin0 -> 53846 bytes
-rw-r--r--macros/latex/contrib/datetime2/samples/datetime2-sample-styles.tex102
-rw-r--r--macros/latex/contrib/datetime2/samples/datetime2-sample-xe.pdfbin0 -> 7343 bytes
-rw-r--r--macros/latex/contrib/datetime2/samples/datetime2-sample-xe.tex20
19 files changed, 10394 insertions, 0 deletions
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 \~}
+%</package>
+%\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}
+%</driver>
+%\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 }.
+%<inserted text>
+% \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}
+%</datetime2.sty>
+% \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}
+%</datetime2-calc.sty>
+% \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
--- /dev/null
+++ b/macros/latex/contrib/datetime2/datetime2.pdf
Binary files 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
--- /dev/null
+++ b/macros/latex/contrib/datetime2/samples/datetime2-sample-babel.pdf
Binary files 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
--- /dev/null
+++ b/macros/latex/contrib/datetime2/samples/datetime2-sample-calc.pdf
Binary files 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
--- /dev/null
+++ b/macros/latex/contrib/datetime2/samples/datetime2-sample-filedate.pdf
Binary files 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
--- /dev/null
+++ b/macros/latex/contrib/datetime2/samples/datetime2-sample-hyperref.pdf
Binary files 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
--- /dev/null
+++ b/macros/latex/contrib/datetime2/samples/datetime2-sample-journal.pdf
Binary files 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
--- /dev/null
+++ b/macros/latex/contrib/datetime2/samples/datetime2-sample-styles.pdf
Binary files 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
--- /dev/null
+++ b/macros/latex/contrib/datetime2/samples/datetime2-sample-xe.pdf
Binary files 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}