%\iffalse % datetime2.dtx generated using makedtx version 1.2 (c) Nicola Talbot % Command line args: % -section "chapter" % -src "datetime2.sty\Z=>datetime2.sty" % -src "datetime2-calc.sty\Z=>datetime2-calc.sty" % -author "Nicola Talbot" % -doc "datetime2-manual.tex" % datetime2 % Created on 2021/3/21 11:13 %\fi %\iffalse %<*package> %% \CharacterTable %% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z %% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z %% Digits \0\1\2\3\4\5\6\7\8\9 %% Exclamation \! Double quote \" Hash (number) \# %% Dollar \$ Percent \% Ampersand \& %% Acute accent \' Left paren \( Right paren \) %% Asterisk \* Plus \+ Comma \, %% Minus \- Point \. Solidus \/ %% Colon \: Semicolon \; Less than \< %% Equals \= Greater than \> Question mark \? %% Commercial at \@ Left bracket \[ Backslash \\ %% Right bracket \] Circumflex \^ Underscore \_ %% Grave accent \` Left brace \{ Vertical bar \| %% Right brace \} Tilde \~} % %\fi % \iffalse % Doc-Source file to use with LaTeX2e % Copyright (C) 2021 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{2658} \RecordChanges \DisableCrossrefs \renewcommand*{\usage}[1]{\hyperpage{#1}} \renewcommand*{\main}[1]{\hyperpage{#1}} \IndexPrologue{\chapter*{\indexname}\markboth{\indexname}{\indexname}% \addcontentsline{toc}{chapter}{Index}} \setcounter{IndexColumns}{2} \newcommand{\style}[1]{\texttt{#1}% \index{#1=\texttt{#1} style|main}% \index{styles:>#1=\texttt{#1}|main}} \newcommand*{\module}[2][]{% \ifblank{#1}% {% \href{http://ctan.org/pkg/datetime2-#2}{\texttt{#2}}% }% {% \href{http://ctan.org/pkg/datetime2-#1}{\texttt{#2}}% }% } \doxitem{Option}{option}{options (definitions)} \DTMsavetimestamp{gmt}{2015-03-01T15:35:09+00:00} \DTMsavetimestamp{bst}{2015-04-01T08:55:39+01:00} \newcommand*{\inpkg}[1]{\llap{\styfmt{#1}}} \newcommand*{\oldcs}[1]{\cs{#1}% \index{datetime commands:=\styfmt{datetime} package commands>#1=\cs{#1}|main}% } \setlength\marginparwidth{70pt} \begin{document} \DocInput{datetime2.dtx} \end{document} % %\fi % %\MakeShortVerb{"} % %\title{datetime2 v1.5.7: %date and time formats} %\author{Nicola L. C. Talbot\\\url{http://www.dickimaw-books.com/}} % %\date{2021-03-21} %\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}). % %Some regional styles may end the date with a period (full stop). %This can cause a problem if the date occurs at the end of a %sentence. If the style has used \cs{DTMfinaldot} then you can use %\cs{DTMdate*} to suppress the terminating period if required. (See %below.) % %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} %As from v1.5.5 there are also starred versions of these commands: %\begin{definition}[\DescribeMacro{\DTMdate*}] %\cs{DTMdate*}\marg{date} %\end{definition} %which essentially behaves like: %\begin{display} %\string{\cs{let}\cs{DTMfinaldot}\cs{empty}\cs{DTMdate}\marg{date}\string} %\end{display} %and %\begin{definition}[\DescribeMacro{\DTMDate*}] %\cs{DTMDate*}\marg{date} %\end{definition} %which essentially behaves like: %\begin{display} %\string{\cs{let}\cs{DTMfinaldot}\cs{empty}\cs{DTMDate}\marg{date}\string} %\end{display} %These commands are provided for date styles that use %\cs{DTMfinaldot} to produce a period (full stop) at the end of the date. These %two star-commands may be used at the end of a sentence to prevent %a double period. Note that there is no equivalent starred form of %\cs{DTMdisplaydate} or \cs{DTMDisplaydate}. (It would break their %ability to fully expand, which was their principle design feature.) % %In these cases (starred and unstarred) 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}. If the date %should end with a period (full stop) use: %\begin{definition}[\DescribeMacro\DTMfinaldot] %\cs{DTMfinaldot} %\end{definition} %at the end of the definitions of \cs{DTMdisplaydate} and %\cs{DTMDisplaydate}. % %This command is simply defined as ``\texttt{.}'' but it's locally %redefined to do nothing by the starred versions of \cs{DTMdate} and %\cs{DTMDate} allowing the dot to be discarded. % %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} % %The document languages are detected using \sty{tracklang}'s %interface. This has limitations. In particular, it can't detect the %region with \sty{polyglossia} nor can it detect languages specified %after \sty{tracklang} has been loaded, and it can't pick up \sty{babel}'s new %\cs{babelprovide} command. See the \sty{tracklang} documentation for %further details. Please check that you have an up-to-date version of %\sty{tracklang}. % %Each language module defines a textual style (where the month is %displayed as a word) for that language or region %which can be used in the argument of \cs{DTMsetstyle}, %\cs{DTMsetdatestyle}, \cs{DTMsettimestyle} or \cs{DTMsetzonestyle}. %The language module may also define a numeric style. In the %ambiguous cases where the language name alone doesn't indicate the %region (for example, \texttt{english} instead of \texttt{UKenglish} or %\texttt{USenglish}) the module should use the \style{default} numeric %style (see \sectionref{sec:predefinedfull}). % %The textual style provided by the module will automatically be %set using \cs{DTMsetstyle} \emph{if the \pkgopt{useregional} %option is set to \texttt{text}}. By default \pkgopt{useregional} is %\texttt{false}, unless the language\slash region is passed via the %\styfmt{datetime2} package option list. (The \pkgopt{useregional} %option is unaffected if the setting is passed through the document %class option list.) The numeric style provided by the module will %automatically be set if the \pkgopt{useregional} option is set to %\texttt{numeric}. See the descriptions for the \pkgopt{useregional} %and \pkgopt{style} options in \sectionref{sec:pkgopt}. % %\begin{important} %Be careful not to mix the language\slash region options between the document %class option list and the \sty{babel}\slash\sty{polyglossia} %interface. For example, don't do: %\begin{verbatim} %\documentclass[en-GB]{article} %\usepackage[canadien,british]{babel} %\end{verbatim} %\end{important} %The above example will prevent the \sty{tracklang} package from picking up the %\sty{babel} setting and it will only detect the \texttt{en-GB} %option. Use only the document class options or only the \sty{babel} %package option list or duplicate \emph{all} the \sty{babel} package options with %analogous \sty{tracklang} options in the document class. For example %\begin{verbatim} %\documentclass[canadien,british]{article} %\usepackage{babel} %\end{verbatim} %or %\begin{verbatim} %\documentclass{article} %\usepackage[canadien,british]{babel} %\end{verbatim} %or %\begin{verbatim} %\documentclass[fr-CA,en-GB]{article} %\usepackage[canadien,british]{babel} %\end{verbatim} % %Language modules may be used without \sty{babel} or \sty{polyglossia}. %For example: %\begin{verbatim} %\documentclass{article} %\usepackage[en-GB]{datetime2} %\begin{document} %\today %\end{document} %\end{verbatim} %If you have more than one language or region you will need to switch %styles using \cs{DTMsetstyle} etc if you aren't using \sty{babel} or %\sty{polyglossia}: %\begin{verbatim} %\documentclass{article} %\usepackage[en-GB,en-CA]{datetime2} %\begin{document} %\DTMsetstyle{en-GB}\today. %\DTMsetstyle{en-CA}\today. %\end{document} %\end{verbatim} % %If you want to change the number separators for the \emph{regional} %numeric styles, you need to use \cs{DTMlangsetup}. If you want to %change the number separators for the base \styfmt{datetime2} %predefined numeric styles (see \sectionref{sec:predefinedstyles}) %then you need to use \cs{DTMsetup} or the package options. You %therefore need to use \cs{DTMsetup} for the ambiguous regionless %language numeric settings since they just use the \style{default} %style. Check the module documentation to find out if the %\style{default} style is used. % %Examples of use: %\begin{enumerate} %\item Language option specified through the document class and %picked up by \sty{tracklang} (which is loaded by \styfmt{datetime2}). %This setting is also picked up by \sty{babel} which is loaded before %\styfmt{datetime2}. %\begin{verbatim} %\documentclass[british]{article} % %\usepackage{babel} %\usepackage{datetime2} % %\begin{document} %\today %\end{document} %\end{verbatim} %The date is displayed in the default format 2015-03-01. % %In this case, the \texttt{en-GB} language module is loaded which %defines the text style \style{en-GB} and the numeric style %\style{en-GB-numeric}. Since \pkgopt{useregional} hasn't been set, %\cs{today} uses \styfmt{datetime2}'s \style{default} numerical format. %If \sty{babel} was loaded after \styfmt{datetime2}, the %\sty{babel}'s hook management system would overwrite %\styfmt{datetime2}'s definition of \cs{today} so that it no longer used %\ics{DTMdisplaydate}. A similar result is obtained if in the above %example \sty{babel} is replaced with \sty{polyglossia} (where the %language is set in the document class option). % %You can change the \pkgopt{useregional} setting either through %\styfmt{datetime2}'s package options or using \ics{DTMsetup} however %it will only have an effect during the module loading (when the %value is changed via the package option) and when %\cs{date}\meta{language} is used. An alternative is to use %\cs{DTMsetregional} which will also do \cs{date}\meta{language} if %it is available %(where \meta{language} is the current value of \cs{languagename}) %otherwise it will iterate through the list of known %dialects and try to set each one in turn. % %\begin{important} %This means that using \cs{DTMsetregional} may cause %the style to change to a different region if you have multiple %regions defined. %\end{important} % %For example, in the document below, the date is displayed using the %\style{default} numeric format because \pkgopt{useregional} has been %changed \emph{after} \sty{babel} uses \cs{datebritish} to set the %language at the start of the document. %\begin{verbatim} %\documentclass[british]{article} % %\usepackage{babel} %\usepackage{datetime2} % %\begin{document} %\DTMsetup{useregional} %\today %\end{document} %\end{verbatim} %So here \cs{today} again displays the date in the form 2015-03-01. % %If the setting is moved to the preamble: %\begin{verbatim} %\documentclass[british]{article} % %\usepackage{babel} %\usepackage{datetime2} % %\DTMsetup{useregional} %\begin{document} %\today %\end{document} %\end{verbatim} %then the \pkgopt{useregional} setting is checked at the beginning of %the document when \sty{babel} uses \cs{datebritish}. So in this case %\cs{today} will display the date in the form 1st March 2015. % %\item Language setting specified through \sty{babel}'s package %option list: %\begin{verbatim} %\documentclass{article} % %\usepackage[british]{babel} %\usepackage{datetime2} % %\begin{document} %\today %\end{document} %\end{verbatim} %This has the same result as placing \texttt{british} in the document %class option list, so the date is again displayed in the default %format 2015-03-01 but, as in the previous example, the \style{en-GB} %and \style{en-GB-numeric} styles are both defined if required. % %However a problem occurs if \sty{babel} is replaced by %\sty{polyglossia}: %\begin{verbatim} %\documentclass{article} % %\usepackage{fontspec} %\usepackage{polyglossia} %\setdefaultlanguage[variant=uk]{english} % %\usepackage{datetime2} % %\begin{document} %\today %\end{document} %\end{verbatim} %In this case \sty{tracklang} is unable to pick up the variant and %can only detect the root language, so it will load the generic %\module{english} module instead of the \texttt{en-GB} module. This %means that the \style{en-GB} and \style{en-GB-numeric} styles are no longer %available. However, since \pkgopt{useregional} is \texttt{false} the %date is still displayed using the \texttt{default} numeric style %in the form 2015-03-01. % %\item As mentioned above neither \sty{babel} nor \sty{polyglossia} are required in %order to use the \styfmt{datetime2} language modules. You can simply %supply the language setting in the package option list: %\begin{verbatim} %\documentclass{article} % %\usepackage[british]{datetime2} % %\begin{document} %\today %\end{document} %\end{verbatim} %This additionally sets \pkgopt[true]{useregional} (since the %language is in the package option list not the document class option %list) so the date produced by \cs{today} now uses the \texttt{en-GB} %date style in the form 1st March 2015. % %\item The regional numeric format can be used instead if %\pkgopt{useregional} is set to \texttt{numeric}: %\begin{verbatim} %\documentclass{article} % %\usepackage[british,useregional=numeric]{datetime2} % %\begin{document} %\today %\end{document} %\end{verbatim} %This now displays the date in the form 1/3/2015. %\end{enumerate} % %Many of the language options have synonyms. In addition to the %\sty{babel} synonyms (such as \pkgopt{british} or %\pkgopt{UKenglish}) the \sty{tracklang} package provides options in %ISO form, such as \pkgopt{en-GB}. Note that the style name provided %by each language module is independent of the package option used %to select that style. So regardless of whether you use %\pkgopt{british}, \pkgopt{UKenglish} or \pkgopt{en-GB}, the text style %name is \style{en-GB} and the numeric style name is %\style{en-GB-numeric}. If just \pkgopt{english} is used, the text %style name is \style{english} but the numeric style is %\style{default}. % %Languages where the region is automatically implied, such %as \pkgopt{scottish}, provide a text style with the root language %name (\style{scottish} in this instance) and a numeric style in the %form \meta{language}\texttt{-numeric} (such as \style{scottish-numeric}). %Note that the \module{irish} module has regionless styles \texttt{irish} and %\texttt{irish-numeric} but also has regional styles %\texttt{ga-IE} and \texttt{ga-IE-numeric} (for the Republic of %Ireland) and \texttt{ga-GB} and \texttt{ga-GB-numeric} (for Northern %Ireland). In this case the regionless style has a numeric style %instead of using the \style{default} style since both %\texttt{ga-IE-numeric} and \texttt{ga-GB-numeric} are the same so %there's no ambiguity. The only difference in the three modules %\texttt{datetime2-irish}, \texttt{datetime2-ga-IE} and %\texttt{datetime2-ga-GB} is the time zone mappings. % %The language or regional modules may provide additional settings that can be %applied using %\begin{definition}[\DescribeMacro\DTMlangsetup] %\cs{DTMlangsetup}\oarg{module-name list}\marg{options} %\end{definition} %where \meta{module-name list} is a comma-separated list of %modules that have previously been loaded (such as \texttt{en-GB,en-US}) %and \meta{options} is a \meta{key}=\meta{value} list of options. % %\begin{important} %Note that the names in the \meta{module-name list} are %the identifying names of the module (such as \module[english]{en-GB} or %\module{english}) %which aren't necessarily the same as the language name supplied %to whatever language package you are using (such as \sty{babel} or %\sty{polyglossia}). The code for each module should be in the file %\texttt{datetime2-\meta{module-name}.ldf}, which should be in TeX's %path. %\end{important} % %If \meta{module-name list} is omitted, then the list of all loaded %modules is assumed. There is also a starred version %of this command (as from v1.3) which suppresses the warning %if the given \meta{options} aren't available for any of %the modules named in \meta{module-name list}. You may prefer %to use the starred version if you omit \meta{module-name list} %to skip the warnings from the base modules that don't support the %given options. % %The modules may also provided %user commands to further customise the style. These settings should %all be described in the module's documentation, which should be %accessible via \texttt{texdoc datetime2-\meta{language}} where %\meta{language} is the root language name in lower case %(such as \texttt{english}). % %Note that although I~maintain the \styfmt{datetime2} English %language module, I~don't maintain the other modules. If you have an %issue with one of the other modules, please contact the module %maintainer. If there is no maintainer, feel free to volunteer to %take over the maintenance (\href{http://www.dickimaw-books.com/contact.html}{send me a %message}). If there's no module for your language %you can create your own module and upload it to CTAN in the %\texttt{/macros\slash latex\slash contrib\slash datetime2-contrib\slash %datetime2-\meta{language}} directory. % %You can use the English or Irish modules as a template for a %language with multiple regions. Just download the English source %files %\href{http://mirror.ctan.org/macros/latex/contrib/datetime2-contrib/datetime2-english/datetime2-english.dtx}{\texttt{datetime2-english.dtx}} and %\href{http://mirror.ctan.org/macros/latex/contrib/datetime2-contrib/datetime2-english/datetime2-english.ins}{\texttt{datetime2-english.ins}} or the Irish source files %\href{http://mirror.ctan.org/macros/latex/contrib/datetime2-contrib/datetime2-irish/datetime2-irish.dtx}{\texttt{datetime2-irish.dtx}} %and %\href{http://mirror.ctan.org/macros/latex/contrib/datetime2-contrib/datetime2-irish/datetime2-irish.ins}{\texttt{datetime2-irish.ins}} from %CTAN and make the appropriate modifications. Alternatively you can %use the Scottish module as a template for a single-region language. %Just download the Scottish source files %\href{http://mirror.ctan.org/macros/latex/contrib/datetime2-contrib/datetime2-scottish/datetime2-scottish.dtx}{\texttt{datetime2-scottish.dtx}} and %\href{http://mirror.ctan.org/macros/latex/contrib/datetime2-contrib/datetime2-scottish/datetime2-scottish.ins}{\texttt{datetime2-scottish.ins}} from CTAN and make the appropriate %modifications. (Don't forget to provide a README file.) % %Each language module should be in a file named %\texttt{datetime2-\meta{lang}.ldf} where \meta{lang} is either the language %name or in the form \meta{language ISO code}\texttt{-}\meta{country ISO code}. (See the %\sty{tracklang} documentation for further details of the naming %scheme.) % %A regional module may load a base module for the same language using %\begin{definition}[\DescribeMacro\RequireDateTimeModule] %\cs{RequireDateTimeModule}\marg{name} %\end{definition} %This will input the file \texttt{datetime2-\meta{name}.ldf}. This command %should not be used outside the \styfmt{datetime2} language module files. %If you are creating a package that explicitly needs to load one of these files, %then you can use: %\begin{definition}[\DescribeMacro\DTMusemodule] %\cs{DTMusemodule}\marg{language}\marg{name} %\end{definition} %where \meta{language} is the \sty{babel} or \sty{polyglossia} language or %dialect name that identifies the relevant \cs{date\meta{language}} %macro (for example, \texttt{english}) and \meta{name} is the same as %above (for example, \texttt{en-GB}). % %Note that \cs{RequireDateTimeModule} (which is also internally used %by \cs{DTMusemodule}) stores a mapping from the language name %and the module name. You can determine what module was loaded %for a given dialect name using %\begin{definition}[\DescribeMacro\DTMdialecttomodulemap] %\cs{DTMdialecttomodulemap}\marg{dialect} %\end{definition} %This expands to the required module name or \cs{relax} if the %given dialect name wasn't used to load a module. %For example: %\begin{verbatim} %\documentclass{article} %\usepackage[british]{datetime2} % %\begin{document} % %british map: \DTMdialecttomodulemap{british}. %english map: \DTMdialecttomodulemap{english}. % %\end{document} %\end{verbatim} %This produces: %\begin{quote} %british map: en-GB. %english map: . %\end{quote} %In the above, the second instance expands to \cs{relax}. % %\begin{important} %If you want to provide a language module don't assume all users want %to use the same input encoding or \sty{babel} shorthands as you. Use \LaTeX\ %commands for non-ASCII characters (and remember to use \cs{protect} %where necessary). %\end{important} % %As an addendum to the above warning, Lua\TeX\ and \XeTeX\ support %UTF-8 characters without the need to make them active, so %I~recommend you provide two files: one with the \LaTeX\ commands, %such as \cs{c}, for (PDF)\LaTeX\ users, and one with UTF-8 characters %for Lua\LaTeX\ and \XeLaTeX\ users. For example, the \texttt{fr-FR} module %could start with: %\begin{verbatim} %\ProvidesDateTimeModule{fr-FR} % %\RequirePackage{ifxetex,ifluatex} % %\ifxetex % \RequireDateTimeModule{french-utf8} %\else % \ifluatex % \RequireDateTimeModule{french-utf8} % \else % \RequireDateTimeModule{french-ascii} % \fi %\fi %\end{verbatim} % %This helps provide fully expandable dates for Lua\LaTeX\ and %\XeLaTeX\ users. (See the Scottish or Irish modules for examples.) % %\chapter{Standalone Month or Weekday Names} %\label{sec:names} % %\begin{important} %If you want the month name or weekday name to appear in a section %or chapter heading, it's best to use the expandable commands %provided by the language modules rather than the robust commands %provided by \styfmt{datetime2-calc}. Remember that you can't use robust %commands in PDF bookmarks and such commands may prevent case-changing in %headers for page styles that use \cs{MakeUppercase}. %\end{important} % %The language or regional modules described in %\sectionref{sec:lang} typically provide an expandable command %\begin{definition} %\cs{DTM\meta{root-language}monthname}\marg{n} %\end{definition} %which takes a numerical argument that indicates the month number. %This command is used in the date style which ensures that even if %the document language has switched but not the date style, then %the month name will be in the correct language for that style. %(Otherwise you could end up with a mix of style from one dialect %using names from another language, which was one of the problems %with the original \styfmt{datetime} package.) % %For example, if the \module{english} module is loaded (which is %automatically loaded by the English dialect modules, such as %\module[english]{en-GB}) then the command \cs{DTMenglishmonthname} is %defined. So if you're writing in English and you want to display %just the %month name, then you can do: %\begin{verbatim} %\DTMenglishmonthname{1} %\end{verbatim} %Some language modules, where month names aren't automatically %capitalised, may additionally define a version that %has the first letter in upper case. For example, the \module{french} %module defines \cs{DTMfrenchMonthname} in addition to %\cs{DTMfrenchmonthname}. % %Some of the modules may have other alternatives. For example, %the \module{serbian} module provides Cyrillic %(\cs{DTMserbiancyrmonthname}) and Latin %(\cs{DTMserbianlatinmonthname}) %month names. It also provides \cs{DTMserbianmonthname}, which %defaults to \cs{DTMserbiancyrmonthname} but can be redefined %using \cs{DTMlangsetup}. % %To find out the available commands for the module you are using, %see that module's documentation. % %If you are writing a document that uses multiple languages %and you simply want to display the month name in the currently %selected language, then you can use the robust command %\begin{definition} %\ics{DTMmonthname}\marg{n} %\end{definition} %provided by the \styfmt{datetime2-calc} package, %described in \sectionref{sec:calc}. Remember that the %\styfmt{datetime2-calc} package also loads the \sty{pgfcalendar} %package, which provides the expandable command %\cs{pgfcalendarmonthname}. (The \sty{pgfcalendar} package provides %multilingual support via the \sty{translator} package.) % %Some of the language modules additionally provide a command %that displays the first letter in upper case. This isn't provided %for languages where the month name is always displayed with %a capital first letter, such as in English. For example, %the \module{serbian} module also defines %\cs{DTMserbiancyrMonthname} and \cs{DTMserbianlatinMonthname}, %with \cs{DTMserbianMonthname} initially defined to use %the Cyrillic version. % %So, if you specifically want to display the Serbian Cyrillic %month name with the first letter in upper case, you need to %make sure the \module{serbian} module is loaded %and then use the provided \cs{DTMserbiancyrMonthname} command. % %If you want the month name to vary according to the current language %setting in the document, you can use the robust command %\begin{definition} %\cs{DTMMonthname}\marg{n} %\end{definition} %provided by \styfmt{datetime2-calc}, which will first %attempt \cs{DTM\meta{language}Monthname} and then %\cs{DTM\meta{language}monthname} before falling back on the %\cs{pgfcalendarmonthname}, see \sectionref{sec:calc} for further %details. % %Some, but not all, language modules provide a command (or commands) %for month name abbreviations. It's up to the maintainer of the %module to add these if they currently aren't provided. You will %need to check the module documentation to find out if abbreviations %are supported. If they are supported, they should be in %the form %\begin{definition} %\cs{DTM\meta{root-language}shortmonthname}\marg{n} %\end{definition} %Again there may be variations, such as new and old styles or alternative %alphabets. For example, the \module{english} module %provides \cs{DTMenglishshortmonthname}. % %As with the full form, if you want to display the abbreviation %in a specific language (or variation), then use the command %provided by the relevant language module. If you want the %abbreviation to pick up the current language, then you can %use the robust command %\begin{definition} %\cs{DTMshortmonthname}\marg{n} %\end{definition} %provided by the \styfmt{datetime2-calc} package. This will fall back on %\cs{pgfcalendarmonthshortname} if %\cs{DTM\meta{language}shortmonthname} isn't defined. See %\sectionref{sec:calc} for further details. % %Modules may additionally provide a version of the abbreviated %form that starts with a capital letter. This should typically %be in the form %\begin{definition} %\cs{DTM\meta{root-language}shortMonthname}\marg{n} %\end{definition} %Check the module documentation to see if this is provided. %Again, the \styfmt{datetime2-calc} package provides a robust command %\begin{definition} %\cs{DTMshortMonthname}\marg{n} %\end{definition} %that attempts to determine the relevant %module command from the language name. % %Language modules may or may not provide a command that displays %the weekday name. As with the month name, there may or may not %be an abbreviated version or capital first letter version %or variations such as new\slash old styles. %Check the module documentation for further details. If %the module doesn't provide a weekday name macro, then the %provided styles won't support the \pkgopt{showdow} option. % %\emph{If} the module provides weekday name support, then %the name will typically be provided by a macro in the form %\begin{definition} %\cs{DTM\meta{root-language}weekdayname}\marg{n} %\end{definition} %where \meta{n} is an integer from 0 (Monday) to 6 (Sunday). %For example, the \module{english} module provides %\cs{DTMenglishweekdayname}. % %Again, the \styfmt{datetime2-calc} package provides \emph{robust} %commands that attempt to find the relevant module-provided %command based on the current language. If not found, %the fallback commands are those provided by the \sty{pgfcalendar} %package. See \sectionref{sec:calc} for further details. % %\chapter{Package Options} %\label{sec:pkgopt} % %The following package options are provided. Most of these are %\meta{key}=\meta{value} options, unless stated otherwise. % %Settings that govern the predefined numerical styles (not including %the fixed styles \style{iso} and \style{pdf}): %\begin{description} %\item[\pkgopt{yearmonthsep}] This sets the separator between the %year and month for the big-endian and little-endian styles. %Default: \texttt{-} (hyphen). %Note that if you want a space as a separator you need to use \cs{space}. %If you simply use a space character (for example, \verb|yearmonthsep={ }|) %then the separator will be discarded. The same applies for the other separators described below. % %\item[\pkgopt{monthdaysep}] This sets the separator between the %month and day. %Default: \texttt{-} (hyphen). % %\item[\pkgopt{dayyearsep}] This sets the separator between the %day and year for the middle-endian styles. %Default: \texttt{-} (hyphen). % %\item[\pkgopt{datesep}] This sets the separators between the day and %month, the month and year, and the day and year. Example: %\begin{verbatim} %\usepackage[datesep=/]{datetime2} %\end{verbatim} %This is equivalent to: %\begin{verbatim} %\usepackage[yearmonthsep=/,monthdaysep=/,dayyearsep=/]{datetime2} %\end{verbatim} % %\item[\pkgopt{hourminsep}] This sets the separator between the hour %and minute. (Both for the time and for the zone.) %Default: \texttt{:} (colon). % %\item[\pkgopt{minsecsep}] This sets the separator between the minute %and seconds. %Default: \texttt{:} (colon). % %\item[\pkgopt{timesep}] This sets the separators between the hour %and minute and between the minute and seconds. %Example: %\begin{verbatim} %\usepackage[timesep=:]{datetime2} %\end{verbatim} %This is equivalent to: %\begin{verbatim} %\usepackage[hourminsep=:,minsecsep=:]{datetime2} %\end{verbatim} %\end{description} % %The following settings are used by the predefined numerical styles when %displaying the full date, time and zone (excluding the fixed styles \style{iso} %and \style{pdf}) with commands that use \cs{DTMdisplay} or %\cs{DTMDisplay}. %\begin{description} %\item[\pkgopt{datetimesep}] Sets the separator between the date and %time. %Default: \cs{space}. % %\item[\pkgopt{timezonesep}] Sets the separator between the time and %zone. %Default: empty. % %\end{description} % %The following settings are used by the predefined styles and may %also be used by the language modules. %\begin{description} %\item[\pkgopt{showseconds}] Boolean key to determine whether or not %to show the seconds when the time is displayed. The \style{iso} %style honours this setting but the \style{pdf} style ignores it. %Default: \texttt{true} unless \XeTeX\ is used (and \sty{texosquery} %hasn't first been loaded with shell escape enabled). % %\item[\pkgopt{showdate}] Boolean key to determine whether or not to %show the date with commands that use \cs{DTMdisplay} or %\cs{DTMDisplay}. (Some styles may ignore this.) The \style{iso} %style honours this setting but the \style{pdf} style ignores it. %Default: \texttt{true}. % %\item[\pkgopt{showzone}] Boolean key to determine whether or not to %show the time zone with commands that use %\cs{DTMdisplay} or \cs{DTMDisplay}. (Some styles may ignore this.) The \style{iso} style honours this setting but the %\style{pdf} style ignores it. %Default: \texttt{true} unless \XeTeX\ is used (and \sty{texosquery} %hasn't first been loaded with shell escape enabled). % %\item[\pkgopt{showzoneminutes}] Boolean key to determine whether or %not to show the zone offset minutes. The \style{iso} style honours %this setting but the \style{pdf} style ignores it. This setting is %ignored if \pkgopt{showzone} is \texttt{false}. %Default: \texttt{true}. % %\item[\pkgopt{showisoZ}] Boolean key to determine whether or not to %show UTC+00:00 as \texttt{Z} instead of numerically. This option %may be ignored by zone styles that use the zone mappings. If you %want all the time zones in military form, you can use %\cs{DTMNatoZoneMaps} to set up the time zone abbreviations and then %use a zone style that uses the mappings. %Default: \texttt{true}. % %\end{description} % %General settings: %\begin{description} %\item[\pkgopt{useregional}] Allowed values: \texttt{false}, %\texttt{text} or \texttt{numeric}. You may also use \texttt{num} as %an abbreviation for \texttt{numeric}. If no value is supplied %\texttt{text} is assumed. % %\begin{important} %If you haven't loaded \sty{babel} or \sty{polyglossia}, this %key only has an effect when used as a package option. Consider %instead using \cs{DTMsetregional}. %\end{important} % %This key determines whether or not to \emph{use} the loaded regional %settings and, if the regional setting should be used, it determines %whether the text style (months as words) or numeric style should be %used. If you have loaded one of those packages, the change comes %into effect at module load time and whenever %\cs{date}\meta{language} is used (which includes at the beginning of %the \env{document} environment). If you want to switch the style at %any other time, you need to use \cs{DTMsetstyle} but unless %\pkgopt[false]{useregional} the next instance of %\cs{date}\meta{language} will change the style. % %Note that setting this option to \texttt{false} doesn't prevent the modules %from being loaded. It just prevents them from automatically setting the style %and prevents \cs{date}\meta{language} from changing the style if you %are using \sty{babel} or \sty{polyglossia}. % %The default value is \texttt{false} unless the language or region is %passed to the \styfmt{datetime2} package option list. However, using \pkgopt{style} %will set \pkgopt{useregional} to \texttt{false}. % %If you want to change this value after the language modules have %been loaded, instead of using \cs{DTMsetup}, you can use %\begin{definition}[\DescribeMacro\DTMsetregional] %\cs{DTMsetregional}\oarg{value} %\end{definition} %This will do \texttt{\cs{DTMsetup}\{userregional=\meta{value}\}}. %Then if \meta{value} is \texttt{false}, it will set the %\texttt{default} style otherwise it will use \cs{date}\meta{lang} if %it's defined (where \meta{lang} is given by \cs{languagename}). If %\cs{date}\meta{lang} isn't defined, it will iterate over the list of %dialects associated with the document and use \cs{DTMtryregional} %for each dialect. If \meta{value} is omitted, \texttt{text} is %assumed. % %Examples: %\begin{verbatim} %\documentclass[british]{article} %\usepackage{babel} %\usepackage{datetime2} %\end{verbatim} %In the above \pkgopt{useregional} is \texttt{false}. % %\begin{verbatim} %\documentclass{article} %\usepackage[british]{datetime2} %\end{verbatim} %In the above \pkgopt{useregional} is \texttt{text}. % %\begin{verbatim} %\documentclass{article} %\usepackage[british,style=iso]{datetime2} %\end{verbatim} %In the above \pkgopt{useregional} is \texttt{false}. (The %\pkgopt{british} option implements \pkgopt[text]{usenumerical} %but the \pkgopt{style} option then implements %\pkgopt[false]{usenumerical}.) % %\begin{verbatim} %\documentclass{article} %\usepackage[style=iso,british]{datetime2} %\end{verbatim} %In the above \pkgopt{useregional} is \texttt{text}. (The %\pkgopt{style} option implements \pkgopt[false]{usenumerical} %but the \pkgopt{british} option then implements %\pkgopt[text]{usenumerical}.) % %\item[\pkgopt{style}] Sets the current style using \cs{DTMsetstyle} %when the \styfmt{datetime2} package has finished loading. This also sets %\pkgopt[false]{useregional} but that setting can be overridden later %in the option list. % %Default value: empty (use the default style or the regional style, %according to the value of \pkgopt{useregional}). % %This key isn't available in \cs{DTMsetup}. Use \cs{DTMsetstyle} instead. % %\item[\pkgopt{calc}] Load the \styfmt{datetime2-calc} package. This %will allow the day of week to be computed and allow you to use the %\sty{pgfcalendar} offset style date formats in commands like %\cs{DTMdate} as well as defining the commands described in %\sectionref{sec:calc}. This option doesn't take a value. It can't be switched %off. This option can't be used in \cs{DTMsetkeys}. The default is to %not load \styfmt{datetime2-calc}. % %\item[\pkgopt{showdow}] This is a boolean key that determines %whether or not to show the day of week in styles that support this. %Note that \pkgopt[true]{showdow} will automatically load %\styfmt{datetime2-calc} so %\begin{verbatim} %\usepackage[showdow]{datetime2} %\end{verbatim} %is equivalent to %\begin{verbatim} %\usepackage[showdow,calc]{datetime2} %\end{verbatim} % %This option may be used in \cs{DTMsetup}, but if you attempt to %switch it on in the \env{document} environment you'll get an error %if the \styfmt{datetime2-calc} package hasn't been loaded. %\textbf{Not all styles support this setting.} %Default: \texttt{false}. % %This option is actually a language-dependent option and isn't used %by the base package, but it's implemented as a package option as the %\styfmt{datetime2-calc} package is also needed if the day of the week %should be displayed. As a package option, \pkgopt{showdow} can %automatically load the required package. % %\begin{important} %You need to check the documentation to find out which styles check %the \pkgopt{showdow} setting as not all of them do. %\end{important} % %\item[\pkgopt{warn}] This is a boolean key. If true (default) %\styfmt{datetime2} warnings will be displayed. If false, the warnings %will be suppressed. %Default: \texttt{true}. % %\end{description} % %Any additional option passed to the \styfmt{datetime2} package (not %through \cs{DTMsetup}) will be considered a \sty{tracklang} option %and will be passed to \cs{TrackPredefinedDialect}. (See the %\sty{tracklang} documentation for further details of that command.) % %Apart from \pkgopt{calc}, \pkgopt{style} and the regional options, all the above %options can also be set using: %\begin{definition}[\DescribeMacro\DTMsetup] %\cs{DTMsetup}\marg{option list} %\end{definition} % %The language modules may additionally provide options which can be %set using: %\begin{definition}[\DescribeMacro\DTMlangsetup] %\cs{DTMlangsetup}\oarg{module-name list}\marg{option list} %\end{definition} % %This will set the \meta{option list} for each module listed in %\meta{module-name list}. Unknown options will generate a~warning rather %than an error message. The default value of \meta{module-name list} is %the list of all loaded modules. % %Example: %\begin{verbatim} %\documentclass{article} %\usepackage[british]{datetime2} %\DTMlangsetup{mapzone} %\end{verbatim} %The module list here is \texttt{english-base},\texttt{en-GB} and %since the \texttt{english-base} doesn't have a \texttt{mapzone} %option, this will result in a warning: %\begin{verbatim} %Package datetime2 Warning: Region `english-base' has ignored %(datetime2) the following settings: %(datetime2) mapzone %\end{verbatim} %You can either ignore the warning or use the optional argument to %exclude the \texttt{english-base} module: %\begin{verbatim} %\documentclass{article} %\usepackage[british]{datetime2} %\DTMlangsetup[en-GB]{mapzone} %\end{verbatim} %Alternatively you can use the starred version: %\begin{verbatim} %\documentclass{article} %\usepackage[british]{datetime2} %\DTMlangsetup*{mapzone} %\end{verbatim} % %Note that some modules may have options with the same name as the %above listed package options, but the keys are defined in different %families (see \sty{xkeyval} documentation) so you need to take care %to use \cs{DTMsetup} for package-wide settings and \cs{DTMlangsetup} %for the module-specific settings. % %For example, the \pkgopt{datesep} package option described above is %used by the predefined numerical styles but regional modules that %provide their own numerical styles may use a different date %separator that matches their region so they may also provide a %\texttt{datesep} option independent of the base \pkgopt{datesep} %option. % %Examples: %\begin{verbatim} %\documentclass[british]{article} %\usepackage[datesep=.]{datetime2} %\begin{document} %\today %\end{document} %\end{verbatim} %The above displays the date in the form %{\DTMsetup{datesep=.}\DTMsetdatestyle{default}\today} %since the default style is in use and \pkgopt{datesep} is used as a %package option. % %\begin{verbatim} %\documentclass[british]{article} %\usepackage{datetime2} %\DTMsetup{datesep=.} %\begin{document} %\today %\end{document} %\end{verbatim} %The above displays the date in the form %{\DTMsetup{datesep=.}\DTMsetdatestyle{default}\today} %since the default style is in use and \pkgopt{datesep} is used in %\cs{DTMsetup}. % %\begin{verbatim} %\documentclass[british]{article} %\usepackage{datetime2} %\DTMlangsetup{datesep=.} %\begin{document} %\today %\end{document} %\end{verbatim} %The above displays the date in the form %{\DTMlangsetup[en-GB]{datesep=.}\DTMsetdatestyle{default}\today} %since the default style is in use but \pkgopt{datesep} is used in %\cs{DTMlangsetup}, which only influences the \style{en-GB-numeric} %style, which isn't the current style. % %\begin{verbatim} %\documentclass[british]{article} %\usepackage[useregional=numeric]{datetime2} %\DTMlangsetup{datesep=.} %\begin{document} %\today %\end{document} %\end{verbatim} %The above displays the date in the form %{\DTMlangsetup[en-GB]{datesep=.}\DTMsetdatestyle{en-GB-numeric}\today} %since the \style{en-GB-numeric} style is in use and \pkgopt{datesep} %is used in \cs{DTMlangsetup}. % %\begin{verbatim} %\documentclass[british]{article} %\usepackage[useregional]{datetime2} %\DTMlangsetup{datesep=.} %\begin{document} %\today %\end{document} %\end{verbatim} %The above displays the date in the form %{\DTMlangsetup[en-GB]{datesep=.}\DTMsetdatestyle{en-GB}\today} %since the \style{en-GB} style is in use and \pkgopt{datesep} is used %in \cs{DTMlangsetup}, which only influences the %\style{en-GB-numeric} style. % %\begin{verbatim} %\documentclass[british]{article} %\usepackage[useregional=numeric]{datetime2} %\DTMsetup{datesep=.} %\begin{document} %\today %\end{document} %\end{verbatim} %The above displays the date in the form %{\DTMsetup{datesep=.}\DTMsetdatestyle{en-GB-numeric}\today} %since the \style{en-GB-numeric} style is in use but \pkgopt{datesep} %is used in \cs{DTMsetup} which influences the base predefined %numeric styles not the regional styles. % %\chapter{The \styfmt{datetime2-calc} Package} %\label{sec:calc} % %The \styfmt{datetime2-calc} package can be loaded after \styfmt{datetime2} in the %usual way: %\begin{verbatim} %\usepackage{datetime2} %\usepackage{datetime2-calc} %\end{verbatim} %or using the \pkgopt{calc} package option to \styfmt{datetime2}: %\begin{verbatim} %\usepackage[calc]{datetime2} %\end{verbatim} %or by using \pkgopt[true]{showdow}: %\begin{verbatim} %\usepackage[showdow]{datetime2} %\end{verbatim} % %This package loads the \sty{pgfcalendar} package which provides a %way of computing the day of week from a given date. Once %\styfmt{datetime2-calc} has been loaded, you can enable or disable the %weekday in dates where the style supports this, but note that \emph{not %all styles support this}, even if the \styfmt{datetime2-calc} package %has been loaded. % %As with the commands in \sectionref{sec:store}, the commands %described below that save date\slash time information will %\emph{overwrite} any previously defined date\slash time data with %the same identifying \meta{name}. However, they may only overwrite %specific elements of the data (for example, just the year, month, %day and day of week elements) and leave the other elements %unchanged. Where the remaining elements are undefined they'll be set to %zero, except for the day of week element, which will be set to %\texttt{-1}. % %In addition to enabling the weekday calculations, the \styfmt{datetime2-calc} %package also provides the following commands: %\begin{definition}[\DescribeMacro\DTMsavejulianday] %\cs{DTMsavejulianday}\marg{name}\marg{number} %\end{definition} %This uses \cs{pgfcalendarjuliantodate} to obtain the year, month and %day from the given Julian day number and uses %\cs{pgfcalendarjuliantoweekday} to obtain the day of week and then %saves it. The date can later be used with commands such as %\cs{DTMuse}\marg{name} described in \sectionref{sec:store}. %Example: %\begin{verbatim} %\DTMsavejulianday{mydate}{2457023} %\end{verbatim} % %\begin{definition}[\DescribeMacro\DTMsaveddatetojuliandate] %\cs{DTMsaveddatetojulianday}\marg{name}\marg{register} %\end{definition} %This uses \cs{pgfcalendardatetojulian} to convert a previously saved %date (identified by \meta{name}) to a Julian day. The result is %stored in \meta{register} which should be a count register (not a %\LaTeX\ counter name). %Example: %\begin{verbatim} %\newcount\myct %\DTMsaveddatetojulianday{mydate}{\myct} %\end{verbatim} % %\begin{definition}[\DescribeMacro\DTMsaveddateoffsettojulianday] %\cs{DTMsaveddateoffsettojulianday}\marg{name}\marg{offset}\marg{register} %\end{definition} %This is like the previous command but converts the date obtained by %incrementing the saved date with \meta{offset}. The result is stored %in \meta{register}. This is equivalent to %\begin{quote}\ttfamily %\cs{pgfcalendardatetojulian}\{\meta{y}-\meta{m}-\meta{d}+\meta{offset}\}\marg{register} %\end{quote} %where \meta{y}, \meta{m} and \meta{d} are the year, month and day %fetched from the saved date. A negative \meta{offset} indicates an earlier %date. %Example: %\begin{verbatim} %\DTMsaveddateoffsettojulianday{mydate}{2}{\myct} %\end{verbatim} %or %\begin{verbatim} %\DTMsaveddateoffsettojulianday{mydate}{-7}{\myct} %\end{verbatim} % %\begin{definition}[\DescribeMacro\DTMifdate] %\cs{DTMifdate}\marg{name}\marg{test}\marg{true}\marg{false} %\end{definition} %This is just a convenient interface to \cs{pgfcalendarifdate} %for a saved date (identified by \meta{name}). The remaining %arguments are the same as the final three arguments of %\cs{pgfcalendarifdate}. Note that the %\texttt{equals}, \texttt{at least}, \texttt{at most} and %\texttt{between} keywords available in \meta{test} need to be in the %format specified by the \styfmt{pgf} manual, but remember that you can %use commands like \cs{DTMfetchyear}. %Example: %\begin{verbatim} %Is \texttt{mydate2} (\DTMusedate{mydate2}) before %\texttt{mydate} (\DTMusedate{mydate})? %\DTMifdate % {mydate2} % {at most= % \DTMfetchyear{mydate}-\DTMfetchmonth{mydate}-\DTMfetchday{mydate}} % {yes}{no}. %\end{verbatim} % %\begin{definition}[\DescribeMacro\DTMsaveddatediff] %\cs{DTMsavedatediff}\marg{name1}\marg{name2}\marg{register} %\end{definition} %Computes the difference (in days) between two saved dates and stores %the result in the given count register. The first date is identified %by \meta{name1} and the second date is identified by \meta{name2}. %The dates are converted to their respective Julian day numbers %\meta{J1} and \meta{J2} and the result is given by %\meta{J1}$-$\meta{J2}. % %\begin{important} %Note that the time and zone are not taken into account, even if they %were provided when the dates were stored. %\end{important} %Example: %\begin{verbatim} %\DTMsaveddatediff{mydate}{mydate2}{\myct} % %\DTMusedate{mydate} is %\ifnum\myct=0 % the same day as %\else % \ifnum\myct<0 % \number-\myct\space day\ifnum\myct<-1s\fi\space before % \else % \number\myct\space day\ifnum\myct>1s\fi\space after % \fi %\fi %\DTMusedate{mydate2}. %\end{verbatim} % %The \styfmt{datetime2-calc} package also provides commands that convert %a datetime instance into Zulu\footnote{That's Zulu as in the NATO %alphabet representation of the letter Z.}\ time (UTC+00:00). % %\begin{definition}[\DescribeMacro\DTMsaveaszulutime] %\cs{DTMsaveaszulutime}\marg{name}\marg{YYYY}\marg{MM}\marg{DD}\marg{hh}\marg{mm}\newline\marg{ss}\marg{TZh}\marg{TZm} %\end{definition} %This converts the given datetime instance into UTC+00:00 and saves %the result. You can then use the date with commands like \cs{DTMuse} %described in \sectionref{sec:store}. The \meta{name} argument is the %label identifying the saved data. The other arguments are all %numbers. %Example: %\begin{verbatim} %\DTMsaveaszulutime{mydate}{2014}{6}{3}{20}{45}{0}{6}{0} %\end{verbatim} % %\begin{definition}[\DescribeMacro\DTMtozulu] %\cs{DTMtozulu}\marg{name1}\marg{name2} %\end{definition} %Uses \cs{DTMsaveaszulutime} to convert the datetime stored in %\meta{name1} and saves it to \meta{name2}. %Example: %\begin{verbatim} %\DTMsavetimestamp{mydate}{2014-05-01T03:55:00 -06:00} %Original date: \DTMuse{mydate}. % %\DTMtozulu{mydate}{mydate2} %UTC+00:00: \DTMuse{mydate2}. %\end{verbatim} %The above produces (using the \style{default} format): %\DTMsetstyle{default}% %\begin{quote} %\DTMsavetimestamp{mydate}{2014-05-01T03:55:00 -06:00} %Original date: \DTMuse{mydate}. % %\DTMtozulu{mydate}{mydate2} %UTC+00:00: \DTMuse{mydate2}. %\end{quote} % %The \sty{pgfcalendar} package also provides a variety of useful %date-related commands. See the documentation (part of the %\styfmt{pgf} manual) for further details. Note that the language %modules don't use \sty{pgfcalendar} month and weekday names as the %\sty{pgfcalendar} package isn't loaded by default and the styles %need to match the language with the syntax. However, since the %\styfmt{datetime2-calc} package automatically loads the %\sty{pgfcalendar} package, as from v1.3 the \styfmt{datetime2-calc} %provides robust month name and weekday name commands that may be %used outside of date styles, which fallback on the commands provided %by \sty{pgfcalendar}. % %\begin{important} %The following commands, which are all robust, should not be used in date %styles, since each language style must use the name macro for that specific %language to match the style. Make sure you have the relevant %language module installed and loaded to allow these commands to work %correctly. See also \sectionref{sec:names}. Remember that instead of %these robust commands, you can simply just use the commands provided %by the \sty{pgfcalendar} package. (See the \styfmt{pgf} manual for %further details.) %\end{important} % %\begin{definition}[\DescribeMacro\DTMmonthname] %\cs{DTMmonthname}\marg{n} %\end{definition} %This checks if \cs{DTM\meta{lang}monthname} exists where \meta{lang} %is given by \cs{languagename}. If so, that macro is used. For example: %\begin{verbatim} %\documentclass{article} %\usepackage[english]{babel} %\usepackage[calc]{datetime2} %\begin{document} %\DTMmonthname{12} %\end{document} %\end{verbatim} %Here \cs{languagename} is \texttt{english}, so this %uses \cs{DTMenglishmonthname} which is defined by the %\module{english} module. % %If the test with \cs{languagename} didn't work, \cs{DTMmonthname} %then tries with \meta{lang} set to %\begin{verbatim} %\TrackedLanguageFromDialect{\languagename} %\end{verbatim} %(\cs{TrackedLanguageFromDialect} is provided by the \sty{tracklang} %package.) If \cs{DTM\meta{lang}monthname} exists, then this command is used. %For example: %\begin{verbatim} %\documentclass{article} %\usepackage[british]{babel} %\usepackage[calc]{datetime2} %\begin{document} %\DTMmonthname{12} %\end{document} %\end{verbatim} %Here \cs{languagename} is \texttt{british}, so this again uses %\cs{DTMenglishmonthname} as the root language is obtained from the %dialect to language mapping. % %\begin{important} %Note that this won't work if you confuse \sty{tracklang} by using an %alternative dialect name in the class option or by directly loading %\sty{tracklang} with different dialect labels. %\end{important} % %In the event that neither of those commands exist, %\cs{DTMmonthname} will fallback on \cs{pgfcalendarmonthname} %(provided by the \sty{pgfcalendar} package). This will also issue a %warning. For example: %\begin{verbatim} %\documentclass{article} %\usepackage[calc]{datetime2} %\begin{document} %\DTMmonthname{12} %\end{document} %\end{verbatim} %This produces the warning message: %\begin{verbatim} %Can't find underlying language macro for %\DTMmonthname (language: english); %using pgfcalendar macro instead %\end{verbatim} %and uses \cs{pgfcalendarmonthname} instead of %\cs{DTMenglishmonthname} (which hasn't been defined because the %\module{english} module \emph{hasn't been loaded}). % %You can switch off the warning by setting the \pkgopt{warn} option %to false or by redefining \cs{dtmnamewarning} to ignore its %argument. % %\begin{definition}[\DescribeMacro\DTMMonthname] %\cs{DTMMonthname}\marg{n} %\end{definition} %This checks if \cs{DTM\meta{lang}Monthname} exists. First where %\meta{lang} is given by \cs{languagename} and then where \meta{lang} %is given by %\begin{verbatim} %\TrackedLanguageFromDialect{\languagename} %\end{verbatim} %If neither of those values of \meta{lang} match a defined command, %\cs{DTMMonthname} then tests for non-case-changing versions %\cs{DTM\meta{lang}monthname}. %This is because not all language modules provide a macro for use at the %start of a sentence since some languages always start month names %with a capital letter. For example, the %\module{english} module provides \cs{DTMenglishmonthname} but %doesn't provide an upper case alternative, since English month names %always start with a capital. Therefore: %\begin{verbatim} %\documentclass{article} %\usepackage[english]{babel} %\usepackage[calc]{datetime2} %\begin{document} %\DTMMonthname{12} %\end{document} %\end{verbatim} %just uses \cs{DTMenglishmonthname}. % %As before, if the relevant command can't be detected for any case %of \meta{lang} for either \cs{DTM\meta{lang}Monthname} or %\cs{DTM\meta{lang}monthname} (for example, the required language module hasn't %been loaded) then \cs{DTMMonthname} will use %\cs{pgfcalendarmonthname} and attempt to convert the first letter to %upper case. % %Since some \emph{but not all} language modules also provide month %name abbreviations, the \styfmt{datetime2-calc} package also provides: %\begin{definition}[\DescribeMacro\DTMshortmonthname] %\cs{DTMshortmonthname}\marg{n} %\end{definition} %This behaves in a similar way to \cs{DTMmonthname} but tries to %determine if \cs{DTM\meta{lang}shortmonthname} exists (where %\meta{lang} is either \cs{languagename} or obtained from %\cs{languagename} using \sty{tracklang}'s dialect to language %mapping). If no command can be found, the fallback uses %\cs{pgfcalendarmonthshortname} provided by the \sty{pgfcalendar} %package. For example, if the language module hasn't been loaded or %if the language module doesn't provide an abbreviated version. % %Similarly there is a version for the start of a sentence for %languages that normally use lower case month names: %\begin{definition}[\DescribeMacro\DTMshortMonthname] %\cs{DTMshortMonthname}\marg{n} %\end{definition} % %There are also analogous commands for the weekday names, where %\meta{n} is an integer from 0 (Monday) to 6 (Sunday). This index can %be computed using: %\begin{definition}[\DescribeMacro\DTMcomputedayofweekindex] %\cs{DTMcomputedayofweekindex}\marg{date}\marg{cs} %\end{definition} %where \meta{date} is in the form \meta{YYYY}-\meta{MM}-\meta{DD} and %\meta{cs} is a control sequence in which to store the result. %Remember that date styles automatically access the day of week index %from the fourth argument of \cs{DTMdisplaydate}, so this command %shouldn't be used within a date style. % %\begin{definition}[\DescribeMacro\DTMweekdayname] %\cs{DTMweekdayname}\marg{n} %\end{definition} %This checks if \cs{DTM\meta{lang}weekdayname} exists where %\meta{lang} is given by \cs{languagename}. %If it does, that macro is used. For example: %\begin{verbatim} %\documentclass{article} %\usepackage[english]{babel} %\usepackage[calc]{datetime2} %\begin{document} %\DTMweekdayname{6} %\end{document} %\end{verbatim} %This uses \cs{DTMenglishweekdayname}, which is provided by the %\module{english} module. % %If \cs{DTM\meta{lang}weekdayname} doesn't exist with \meta{lang} set %to \cs{languagename}, \cs{DTMweekdayname} then tests with %\meta{lang} set to: %\begin{verbatim} %\TrackedLanguageFromDialect{\languagename} %\end{verbatim} %If the command \cs{DTM\meta{lang}weekdayname} exists in this case, that %command is used. For example: %\begin{verbatim} %\documentclass{article} %\usepackage[british]{babel} %\usepackage[calc]{datetime2} %\begin{document} %\DTMweekdayname{6} %\end{document} %\end{verbatim} %This uses \cs{DTMenglishweekdayname} as it can determine (through %\sty{tracklang}) that \texttt{british} has been defined as a dialect %of \texttt{english}. % %If this second test fails, then \cs{DTMweekdayname} will issue a %warning and fallback on \cs{pgfcalendarweekdayname}, provided by the %\sty{pgfcalendar} package. For example: %\begin{verbatim} %\documentclass{article} %\usepackage[calc]{datetime2} %\begin{document} %\DTMweekdayname{6} %\end{document} %\end{verbatim} %This produces the warning message: %\begin{verbatim} %Can't find underlying language macro for %\DTMweekdayname (language: english); %using pgfcalendar macro instead %\end{verbatim} %As before, this warning is produced with \cs{dtmnamewarning}. % %The first letter upper case version is: %\begin{definition}[\DescribeMacro\DTMWeekdayname] %\cs{DTMWeekdayname}\marg{n} %\end{definition} %As with \cs{DTMMonthname}, if no upper case version can be found in %the relevant language module this will use the non-case-changing %version. The fallback \sty{pgfcalendar} macro is again %\cs{pgfcalendarweekdayname} with an attempt to convert the first %letter to upper case. % %Again, abbreviations may or may not be supported by language %modules. If they're not supported, the fallback is %\cs{pgfcalendarweekdayshortname}. % %\begin{definition}[\DescribeMacro\DTMshortweekdayname] %\cs{DTMshortweekdayname}\marg{n} %\end{definition} %which will attempt to use \cs{DTM\meta{lang}shortweekdayname} and %\begin{definition}[\DescribeMacro\DTMshortWeekdayname] %\cs{DTMshortWeekdayname}\marg{n} %\end{definition} %which will attempt to use \cs{DTM\meta{lang}shortWeekdayname} or %\cs{DTM\meta{lang}shortweekdayname}. % %For completeness, there's also a language-sensitive date ordinal command: %\begin{definition}[\DescribeMacro\DTMordinal] %\cs{DTMordinal}\marg{n} %\end{definition} %where \meta{n} is a number from 1 to 31. Again, this shouldn't be %used in date styles, but only if a standalone date ordinal is required. %For most languages, this only has a suffix for the first day of the %month (that is where \meta{n} is 1) or the suffix may simply be a %full stop (period). It should not be confused with \sty{fmtcount}'s %\cs{ordinalnum} command, which is for general ordinals rather than %date-specific ordinals. % %\chapter{Migrating from \styfmt{datetime}} %\label{sec:migrate} % %This section is for users who want to switch over from the old %\styfmt{datetime} package. % %Note that \styfmt{datetime2} is modularised for improved efficiency both in %terms of package overheads and spreading the maintenance load. This %means that you only need to install \styfmt{datetime2} if you only want %the base numeric styles, but it you want multilingual or regional %support, you need to additionally load the required language module %or modules. % %For example, consider the following document that uses %\styfmt{datetime}: %\begin{verbatim} %\documentclass{article} %\usepackage[T1]{fontenc} %\usepackage[utf8]{inputenc} %\usepackage[french]{babel} %\usepackage{datetime} %\begin{document} %\today. %\end{document} %\end{verbatim} %This just needs to have the \styfmt{datetime} package installed, which %includes the necessary file \texttt{dt-french.def}. % %This example can be adjusted for \styfmt{datetime2}: %\begin{verbatim} %\documentclass{article} %\usepackage[T1]{fontenc} %\usepackage[utf8]{inputenc} %\usepackage[french]{babel} %\usepackage[useregional]{datetime2} %\begin{document} %\today. %\end{document} %\end{verbatim} %This requires both \styfmt{datetime2} and the \module{french} module, %so you need to ensure that both have been installed. % %The above example also draws attention to another change from %\styfmt{datetime} and that concerns the default package behaviour. The %\styfmt{datetime} package defaults to a British date style, unless %\sty{babel} has been loaded first, whereas the \styfmt{datetime2} %package defaults to an ISO numeric style, unless language or %regional settings are provided in the class option. As illustrated %in the above, you need the \pkgopt{useregional} option if you want %\cs{datefrench} (or equivalent) to switch the date style. % %\section{\styfmt{datetime} package options} % %The \styfmt{datetime} package provides the following options, which can %be emulated with \styfmt{datetime2} or through one of its dependent %modules or packages: % %\begin{description} %\item[\pkgoptfmt{long}] This option was designed for full British %dates, and is the default if \sty{babel} isn't loaded. Example: %\begin{verbatim} %\documentclass{article} %\usepackage[long]{datetime} %\begin{document} %\today %\end{document} %\end{verbatim} %This produces the date in the form: %Wednesday 20\textsuperscript{th} January, 2016. % %This can be achieved with \styfmt{datetime2} and the \module{english} %module as follows: %\begin{verbatim} %\documentclass{article} %\usepackage[en-GB,showdow]{datetime2} %\DTMlangsetup[en-GB]{ord=raise,monthyearsep={,\space}} %\begin{document} %\today %\end{document} %\end{verbatim} % %\item[\pkgoptfmt{short}] This option was designed for abbreviated %British dates. For example: %\begin{verbatim} %\documentclass{article} %\usepackage[short]{datetime} %\begin{document} %\today %\end{document} %\end{verbatim} %This produces the date in the form: %Wed 20\textsuperscript{th} Jan, 2016 % %This can be achieved with \styfmt{datetime2} and the \module{english} %module as follows: %\begin{verbatim} %\documentclass{article} %\usepackage[en-GB,showdow]{datetime2} %\DTMlangsetup[en-GB]{abbr,ord=raise,monthyearsep={,\space}} %\begin{document} %\today %\end{document} %\end{verbatim} % %\item[\pkgoptfmt{iso}] This option was designed for %\meta{YYYY}-\meta{MM}-\meta{DD} dates. For example: %\begin{verbatim} %\documentclass{article} %\usepackage[iso]{datetime} %\begin{document} %\today %\end{document} %\end{verbatim} %This produces the date in the form: 2016-01-20. This is default for %\styfmt{datetime2}: %\begin{verbatim} %\documentclass{article} %\usepackage{datetime2} %\begin{document} %\today %\end{document} %\end{verbatim} %If you don't want the style to depend on the separator settings, you %can use the \style{iso} style: %\begin{verbatim} %\documentclass{article} %\usepackage[style=iso]{datetime2} %\begin{document} %\today %\end{document} %\end{verbatim} % %\item[\pkgoptfmt{yyyymmdd}] This option was designed for %\meta{YYYY}\slash\meta{MM}\slash\meta{DD} dates. For example: %\begin{verbatim} %\documentclass{article} %\usepackage[yyyymmdd]{datetime} %\begin{document} %\today %\end{document} %\end{verbatim} %This produces the date in the form: 2016/01/20. This is very nearly %in the same form as the default \styfmt{datetime2} style. All that %needs changing are the separators between the year, month and day: %\begin{verbatim} %\documentclass{article} %\usepackage[datesep=/]{datetime2} %\begin{document} %\today %\end{document} %\end{verbatim} % %\item[\pkgoptfmt{ddmmyyyy}] This option was designed for %\meta{DD}\slash\meta{MM}\slash\meta{YYYY} dates. For example: %\begin{verbatim} %\documentclass{article} %\usepackage[ddmmyyyy]{datetime} %\begin{document} %\today %\end{document} %\end{verbatim} %This produces the date in the form: 20/01/2016. This can be changed %to \styfmt{datetime2} with a couple of package options: %\begin{verbatim} %\documentclass{article} %\usepackage[datesep=/,style=ddmmyyyy]{datetime} %\begin{document} %\today %\end{document} %\end{verbatim} % %\item[\pkgoptfmt{dmyyyy}] This option was designed for %\meta{D}\slash\meta{M}\slash\meta{YYYY} dates. For example: %\begin{verbatim} %\documentclass{article} %\usepackage[ddmmyyyy]{datetime} %\begin{document} %\today %\end{document} %\end{verbatim} %This produces the date in the form: 20/1/2016. This can be changed %to \styfmt{datetime2} with a couple of package options: %\begin{verbatim} %\documentclass{article} %\usepackage[datesep=/,style=dmyyyy]{datetime} %\begin{document} %\today %\end{document} %\end{verbatim} % %\item[\pkgoptfmt{ddmmyy}] This option was designed for %\meta{DD}\slash\meta{MM}\slash\meta{YY} dates. For example: %\begin{verbatim} %\documentclass{article} %\usepackage[ddmmyy]{datetime} %\begin{document} %\today %\end{document} %\end{verbatim} %This produces the date in the form: 20/01/16. This can be changed %to \styfmt{datetime2} with a couple of package options: %\begin{verbatim} %\documentclass{article} %\usepackage[datesep=/,style=ddmmyy]{datetime} %\begin{document} %\today %\end{document} %\end{verbatim} % %\item[\pkgoptfmt{dmyy}] This option was designed for %\meta{D}\slash\meta{M}\slash\meta{YY} dates. For example: %\begin{verbatim} %\documentclass{article} %\usepackage[dmyy]{datetime} %\begin{document} %\today %\end{document} %\end{verbatim} %This produces the date in the form: 20/1/16. This can be changed %to \styfmt{datetime2} with a couple of package options: %\begin{verbatim} %\documentclass{article} %\usepackage[datesep=/,style=dmyy]{datetime} %\begin{document} %\today %\end{document} %\end{verbatim} % %\item[\pkgoptfmt{text}] This option was designed for a full UK textual %date. For example: %\begin{verbatim} %\documentclass{article} %\usepackage[text]{datetime} %\begin{document} %\today %\end{document} %\end{verbatim} %This produces the date in the form: %Wednesday the Twentieth of January, Two Thousand and Sixteen % %This document can be changed to \styfmt{datetime2} through the %\sty{datetime2-en-fulltext} package, which needs to be installed %separately: %\begin{verbatim} %\documentclass{article} %\usepackage{datetime2-en-fulltext} %\DTMsetdatestyle{en-FullText} %\begin{document} %\today %\end{document} %\end{verbatim} % %\item[\pkgoptfmt{us}] This option was designed for the standard US %date. For example: %\begin{verbatim} %\documentclass{article} %\usepackage[us]{datetime} %\begin{document} %\today %\end{document} %\end{verbatim} %This produces the date in the form: %January 20, 2016 % %This can be achieved with \styfmt{datetime2} and the \module{english} %module as follows: %\begin{verbatim} %\documentclass{article} %\usepackage[en-US]{datetime2} %\begin{document} %\today %\end{document} %\end{verbatim} % %\item[\pkgoptfmt{mmddyyyy}] This option was designed for %\meta{MM}\slash\meta{DD}\slash\meta{YYYY} dates. For example: %\begin{verbatim} %\documentclass{article} %\usepackage[mmddyyyy]{datetime} %\begin{document} %\today %\end{document} %\end{verbatim} %This produces the date in the form: 01/20/2016. This can be changed %to \styfmt{datetime2} with a couple of package options: %\begin{verbatim} %\documentclass{article} %\usepackage[datesep=/,style=mmddyyyy]{datetime} %\begin{document} %\today %\end{document} %\end{verbatim} % %\item[\pkgoptfmt{mdyyyy}] This option was designed for %\meta{M}\slash\meta{D}\slash\meta{YYYY} dates. For example: %\begin{verbatim} %\documentclass{article} %\usepackage[mmddyyyy]{datetime} %\begin{document} %\today %\end{document} %\end{verbatim} %This produces the date in the form: 1/20/2016. This can be changed %to \styfmt{datetime2} with a couple of package options: %\begin{verbatim} %\documentclass{article} %\usepackage[datesep=/,style=mdyyyy]{datetime} %\begin{document} %\today %\end{document} %\end{verbatim} % %\item[\pkgoptfmt{mmddyy}] This option was designed for %\meta{MM}\slash\meta{DD}\slash\meta{YY} dates. For example: %\begin{verbatim} %\documentclass{article} %\usepackage[mmddyy]{datetime} %\begin{document} %\today %\end{document} %\end{verbatim} %This produces the date in the form: 01/20/16. This can be changed %to \styfmt{datetime2} with a couple of package options: %\begin{verbatim} %\documentclass{article} %\usepackage[datesep=/,style=mmddyy]{datetime} %\begin{document} %\today %\end{document} %\end{verbatim} % %\item[\pkgoptfmt{mdyy}] This option was designed for %\meta{M}\slash\meta{D}\slash\meta{YY} dates. For example: %\begin{verbatim} %\documentclass{article} %\usepackage[mdyy]{datetime} %\begin{document} %\today %\end{document} %\end{verbatim} %This produces the date in the form: 1/20/16. This can be changed %to \styfmt{datetime2} with a couple of package options: %\begin{verbatim} %\documentclass{article} %\usepackage[datesep=/,style=mdyy]{datetime} %\begin{document} %\today %\end{document} %\end{verbatim} % %\item[\pkgoptfmt{raise}] This option was designed to make the ordinal %st,nd,rd,th appear as a subscript. It was originally just intended for British %dates. This is one of the default settings for \styfmt{datetime}. For example: %\begin{verbatim} %\documentclass{article} %\usepackage[raise]{datetime} % %\begin{document} %\today %\end{document} %\end{verbatim} %This produces the date in the form: %Wednesday 20\textsuperscript{th} January, 2016 % %With \styfmt{datetime2}, this setting \emph{may} be provided by a language %module, where appropriate. For example: %\begin{verbatim} %\documentclass{article} %\usepackage[en-GB,showdow]{datetime2} %\DTMlangsetup[en-GB]{ord=raise} % %\begin{document} %\today %\end{document} %\end{verbatim} % %\item[\pkgoptfmt{level}] This option was designed to make the ordinal %st,nd,rd,th appear level with the rest of the text (to counteract %the previous option). For example: %\begin{verbatim} %\documentclass{article} %\usepackage[level]{datetime} % %\begin{document} %\today %\end{document} %\end{verbatim} %This produces the date in the form: Wednesday 20th January, 2016 % %With \styfmt{datetime2} this setting may be provided by a language %module, where appropriate. This is, in fact, the default setting for %the \style{en-GB} style: %\begin{verbatim} %\documentclass{article} %\usepackage[en-GB,showdow]{datetime2} % %\begin{document} %\today %\end{document} %\end{verbatim} %but can be explicitly set using: %\begin{verbatim} %\DTMlangsetup[en-GB]{ord=level} %\end{verbatim} % %\item[\pkgoptfmt{dayofweek}] This option was designed to show the %weekday name for those styles that supported it. This is one of the %default \styfmt{datetime} settings. For example: %\begin{verbatim} %\documentclass{article} %\usepackage[dayofweek]{datetime} % %\begin{document} %\today %\end{document} %\end{verbatim} %This produces the date in the form: %Wednesday 20\textsuperscript{th} January, 2016 % %With \styfmt{datetime2} this setting \emph{may} be provided by a language %module, where supported. For example: %\begin{verbatim} %\documentclass{article} %\usepackage[en-GB,showdow]{datetime2} % %\begin{document} %\today %\end{document} %\end{verbatim} %Some language modules don't support this option (just as some %language settings with \styfmt{datetime} also don't support the %\pkgoptfmt{dayofweek} option.) % %\item[\pkgoptfmt{nodayofweek}] This option was designed to hide the %weekday name for those styles that supported it (to counteract the %previous option). For example: %\begin{verbatim} %\documentclass{article} %\usepackage[nodayofweek]{datetime} % %\begin{document} %\today %\end{document} %\end{verbatim} %This produces the date in the form: %20\textsuperscript{th} January, 2016 % %This setting is the default for \styfmt{datetime2}. %However, if it \pkgopt{showdow} has been switched on, it can later %be switched off using %\begin{verbatim} %\DTMsetup{showdow=false} %\end{verbatim} % %\item[\pkgoptfmt{hhmmss}] This option was designed for time formats in %the style \meta{HH}:\meta{MM}:\meta{SS}. For example: %\begin{verbatim} %\documentclass{article} %\usepackage[hhmmss]{datetime} % %\begin{document} %\currenttime %\end{document} %\end{verbatim} %This produces the time in the form: 17:28:52. % %This is the default for \styfmt{datetime2}: %\begin{verbatim} %\documentclass{article} %\usepackage{datetime2} % %\begin{document} %\DTMcurrenttime %\end{document} %\end{verbatim} % %\item[\pkgoptfmt{24hr}] This option was designed for 24 hour time formats in %the style \meta{HH}:\meta{MM}. For example: %\begin{verbatim} %\documentclass{article} %\usepackage[24hr]{datetime} % %\begin{document} %\currenttime %\end{document} %\end{verbatim} %This produces the time in the form: 17:28. % %This can be achieved using the default \styfmt{datetime2} time style %with the seconds suppressed: %\begin{verbatim} %\documentclass{article} %\usepackage[showseconds=false]{datetime2} % %\begin{document} %\DTMcurrenttime %\end{document} %\end{verbatim} % %\item[\pkgoptfmt{12hr}] This option was designed for 12 hour time %formats with \qt{am} or \qt{pm} suffixes. For example: %\begin{verbatim} %\documentclass{article} %\usepackage[12hr]{datetime} % %\begin{document} %\currenttime %\end{document} %\end{verbatim} %This produces the time in the form: 5:28pm. % %This can be achieved through a \styfmt{datetime2} language module that %supports this format. For example, the \module{english} module: %\begin{verbatim} %\documentclass{article} %\usepackage[en-GB]{datetime2} % %\begin{document} %\DTMcurrenttime %\end{document} %\end{verbatim} % %\item[\pkgoptfmt{oclock}] This option was designed for a UK-style full text %time. For example: %\begin{verbatim} %\documentclass{article} %\usepackage[oclock]{datetime} % %\begin{document} %\currenttime %\end{document} %\end{verbatim} %This produces the time in the form: %Twenty minutes past Six in the afternoon % %This can be changed to \styfmt{datetime2} through the %\sty{datetime2-en-fulltext} package, which needs to be installed %separately: %\begin{verbatim} %\documentclass{article} %\usepackage{datetime2-en-fulltext} %\DTMsettimestyle{en-FullText} %\begin{document} %\DTMcurrenttime %\end{document} %\end{verbatim} % %\end{description} % %The \styfmt{datetime} package option \pkgoptfmt{nodate} was provided %before multilingual support was added to allow \sty{babel} users to %use the time commands without causing a conflict with the date. Once %support for the \sty{babel} package was added, this option became %superfluous. % %\section{Time and Date Commands} % %\begin{definition} %\ics{today} %\end{definition} %This is a robust command in later versions of \styfmt{datetime}. In %earlier versions is was fragile and had to be protected when used in %moving arguments. With \styfmt{datetime2}, this command is designed to %be expandable and so therefore is not robust and shouldn't need %protecting. (The date styles should take care of any fragile %commands, such as \cs{textsuperscript}, where necessary.) % %The current time is displayed with \styfmt{datetime} using %\begin{definition}[\inpkg{datetime}] %\oldcs{currenttime} %\end{definition} %The \styfmt{datetime2} equivalent is: %\begin{definition}[\inpkg{datetime2}] %\ics{DTMcurrenttime} %\end{definition} %Again, the command provided by \styfmt{datetime} is robust and the %equivalent command provided by \styfmt{datetime2} is designed to be %expandable. % %A specific date is display by \styfmt{datetime}'s %\begin{definition}[\inpkg{datetime}] %\oldcs{formatdate}\marg{DD}\marg{MM}\marg{YYYY} %\end{definition} %command. The arguments are in little-endian (UK) order with the day, %month and year. With \styfmt{datetime2} you can use either: %\begin{definition}[\inpkg{datetime2}] %\ics{DTMdisplay}\marg{YYYY}\marg{MM}\marg{DD}\marg{dow} %\end{definition} %(expandable) or %\begin{definition}[\inpkg{datetime2}] %\ics{DTMdate}\{\meta{YYYY}-\meta{MM}-\meta{DD}\} %\end{definition} %(robust) where \meta{YYYY} is the year, \meta{MM} is the month %number, \meta{DD} is the day of month number and \meta{dow} is the %day of week number (starting from 0 for Monday) or \texttt{-1} to %disregard it. % %A specific time is displayed by \styfmt{datetime}'s %\begin{definition}[\inpkg{datetime}] %\oldcs{formattime}\marg{hh}\marg{mm}\marg{ss} %\end{definition} %command, which has three arguments: the hour (24) the minutes past %the hour and the seconds past the minute. With \styfmt{datetime2} you %can use either: %\begin{definition}[\inpkg{datetime2}] %\ics{DTMdisplaytime}\marg{hh}\marg{mm}\marg{ss} %\end{definition} %(expandable) or %\begin{definition}[\inpkg{datetime2}] %\ics{DTMtime}\{\meta{hh}:\meta{mm}:\meta{ss}\} %\end{definition} %(robust) where \meta{hh} is the hour, \meta{mm} is the minutes and %\meta{ss} is the seconds. % %The date separator used by the predefined \styfmt{datetime} styles is %given by %\begin{definition}[\inpkg{datetime}] %\oldcs{dateseparator} %\end{definition} %which needs to be redefined if %required. With \styfmt{datetime2}, the date separator for the base %numeric styles (except the fixed \style{iso} style) can be changed %through the \pkgopt{datesep} package option. For example: %\begin{verbatim} %\usepackage[datesep={.}]{datetime2} %\end{verbatim} %or %\begin{verbatim} %\DTMsetup{datesep={.}} %\end{verbatim} %Some of the language modules may also provide a similar option. For %example: %\begin{verbatim} %\usepackage[en-GB]{datetime2} %\DTMlangsetup[en-GB]{datesep={.}} %\end{verbatim} % %The time separator for \styfmt{datetime} is given by %\begin{definition}[\inpkg{datetime}] %\oldcs{timeseparator} %\end{definition} %With \styfmt{datetime2}, the time separator for the %basic numeric styles (not including the fixed \style{iso} style) can be %changed through the \pkgopt{timesep} package option. For example: %\begin{verbatim} %\usepackage[timesep={.}]{datetime2} %\end{verbatim} %or %\begin{verbatim} %\usepackage{datetime2} %\DTMsetup{timesep={.}} %\end{verbatim} %Some of the language modules may also provide a similar option. For %example: %\begin{verbatim} %\usepackage[en-GB]{datetime2} %\DTMlangsetup[en-GB]{timesep={.}} %\end{verbatim} % %\begin{definition}[\inpkg{datetime}] %\oldcs{pdfdate} %\end{definition} %The \cs{pdfdate} command provided by \styfmt{datetime} for use within %\ics{pdfinfo} became redundant with the introduction of %\ics{pdfcreationdate} to PDF\TeX\ version 1.30.0. % %Old style (using \styfmt{datetime}): %\begin{verbatim} %\pdfinfo{ % /Author (Me) % /Title (A Sample Document) % /CreationDate (D:20040501215500) % /ModDate (D:\pdfdate) %} %\end{verbatim} %New style (simply using PDF\TeX): %\begin{verbatim} %\pdfinfo{ % /Author (Me) % /Title (A Sample Document) % /CreationDate (D:20040501215500) % /ModDate (\pdfcreationdate) %} %\end{verbatim} %Alternatively you can use the \style{pdf} style: %\begin{verbatim} %\DTMsetstyle{pdf} %\pdfinfo{ % /Author (Me) % /Title (A Sample Document) % /CreationDate (\DTMdisplay{2004}{05}{01}{-1}{21}{55}{00}{00}{00}) % /ModDate (\DTMnow) %} %\end{verbatim} % %The \styfmt{datetime} command to display the month name is %\begin{definition}[\inpkg{datetime}] %\oldcs{monthname}\oarg{n} %\end{definition} %which can't be expanded. With %\styfmt{datetime2}, the month name for a specific language can be %obtained from a command provided by the relevant module. For %example, the \module{english} module provides %\begin{definition}[\inpkg{datetime2-english}] %\ics{DTMenglishmonthname}\marg{n} %\end{definition} %which is expandable. These types of commands are designed for use %within language-dependent date styles. This ensures that the name %matches the style. (One of the failings of \styfmt{datetime} was that %the original date styles provided when the package was originally %only intended for British dates produced weird hybrid styles when %multilingual support was later added and styles such as \pkgoptfmt{long} %were used with another language.) These types of commands provided %by the \styfmt{datetime2} language modules are analogous to the %\cs{monthname\meta{language}} commands provided by \styfmt{datetime}'s %supporting language files (for example, %\begin{definition}[\inpkg{datetime-defaults}] %\oldcs{monthnameenglish}\oarg{n} %\end{definition} %in \styfmt{datetime-defaults} or %\begin{definition}[\inpkg{dt-french.def}] %\oldcs{monthnamefrench}\oarg{n} %\end{definition} %defined in \styfmt{dt-french.def}) except that the \styfmt{datetime} commands have %an optional argument which means they're not expandable. % %If you load the \styfmt{datetime2-calc} package, %either explicitly or through the \pkgopt{calc} or \pkgopt{showdow} %\styfmt{datetime2} package options, then \sty{pgfcalendar} will also be %loaded. In which case you can use %\begin{definition}[\inpkg{pgfcalendar}] %\ics{pgfcalendarmonthname}\marg{n} %\end{definition} %even if none of the \styfmt{datetime2} language modules have been %loaded. This command requires the \sty{translator} package to %provide multilingual support. See the \styfmt{pgf} manual for further %details. % %Another possibility if you want the month name alone using the %current language is to use the robust command %\begin{definition}[\inpkg{datetime2-calc}] %\ics{DTMmonthname}\marg{n} %\end{definition} %defined by \styfmt{datetime2-calc}. This is the closest match to %\styfmt{datetime}'s \oldcs{monthname} command but note that the argument %isn't optional. Remember that you can use \ics{month} for the current %month number, which is the value of \meta{n} when omitted in %\oldcs{monthname}. % %Old style (\styfmt{datetime}): %\begin{verbatim} %\documentclass{article} % %\usepackage[T1]{fontenc} %\usepackage[utf8]{inputenc} %\usepackage[french,english]{babel} % %\usepackage{datetime} % %\begin{document} %\selectlanguage{french} %\monthname % %\selectlanguage{english} %\monthname %\end{document} %\end{verbatim} %New style (\styfmt{datetime2} with the \module{french} and %\module{english} modules): %\begin{verbatim} %\documentclass{article} % %\usepackage[T1]{fontenc} %\usepackage[utf8]{inputenc} %\usepackage[french,english]{babel} % %\usepackage[calc]{datetime2} % %\begin{document} %\selectlanguage{french} %\DTMmonthname{\month} % %\selectlanguage{english} %\DTMmonthname{\month} %\end{document} %\end{verbatim} % %The abbreviated month name is given by %\begin{definition}[\inpkg{datetime}] %\oldcs{shortmonthname}\oarg{n} %\end{definition} %in %\styfmt{datetime}. Similar to above, language modules may provide an %expandable command to produce the abbreviated name in that specific %language. For example, the \module{english} module provides %\begin{definition}[\inpkg{datetime2-english}] %\ics{DTMenglishshortmonthname}\marg{n} %\end{definition} %As with \cs{DTMenglishmonthname}, this is designed for use in %English date styles. % %Again, if \styfmt{datetime2-calc} is loaded, the \sty{pgfcalendar} %command is also available: %\begin{definition}[\inpkg{pgfcalendar}] %\ics{pgfcalendarmonthshortname}\marg{n} %\end{definition} %Alternative you can use the robust command defined by %\styfmt{datetime2-calc}: %\begin{definition}[\inpkg{datetime2-calc}] %\ics{DTMshortmonthname}\marg{n} %\end{definition} % %Old style (\styfmt{datetime}): %\begin{verbatim} %\documentclass{article} % %\usepackage[T1]{fontenc} %\usepackage[utf8]{inputenc} %\usepackage[french,english]{babel} % %\usepackage{datetime} % %\begin{document} %\selectlanguage{french} %\shortmonthname % %\selectlanguage{english} %\shortmonthname %\end{document} %\end{verbatim} %New style (\styfmt{datetime2} with the \module{french} and %\module{english} modules): %\begin{verbatim} %\documentclass{article} % %\usepackage[T1]{fontenc} %\usepackage[utf8]{inputenc} %\usepackage[french,english]{babel} % %\usepackage[calc]{datetime2} % %\begin{document} %\selectlanguage{french} %\DTMshortmonthname{\month} % %\selectlanguage{english} %\DTMshortmonthname{\month} %\end{document} %\end{verbatim} % %See \sectionref{sec:calc} and \sectionref{sec:names} for further %details. % %The weekday names in \styfmt{datetime} are more complicated %and not all the \texttt{dt-\meta{lang}.def} files provide translations. The ones %that do support the weekday provide %\begin{definition}[\inpkg{dt-\meta{lang}.def}] %\oldcs{dayofweeknameid\meta{lang}}\marg{n} %\end{definition} %which takes a single argument that's an integer from 1 (Sunday) to 7 (Saturday). %For example, %\begin{definition}[\inpkg{datetime-defaults}] %\oldcs{dayofweeknameidenglish}\marg{n} %\end{definition} %or %\begin{definition}[\inpkg{dt-french.def}] %\oldcs{dayofweeknameidfrench}\marg{n} %\end{definition} % %The \styfmt{datetime2} language modules that support the weekday name %provide %\begin{definition}[\inpkg{datetime2-\meta{lang}}] %\cs{DTM\meta{lang}weekdayname}\marg{dow} %\end{definition} %which takes a single argument that's an integer from 0 (Monday) to 6 %(Sunday). As with \styfmt{datetime}, not all of the \styfmt{datetime2} %language modules support the weekday. % %Old style (\styfmt{datetime}): %\begin{verbatim} %\documentclass{article} %\usepackage[T1]{fontenc} %\usepackage[utf8]{inputenc} %\usepackage[french,english]{babel} %\usepackage{datetime} % %\begin{document} %\dayofweeknameidfrench{1} % %\dayofweeknameidenglish{1} %\end{document} %\end{verbatim} %New style (\styfmt{datetime2} with the \module{english} and %\module{french} modules): %\begin{verbatim} %\documentclass{article} %\usepackage[T1]{fontenc} %\usepackage[utf8]{inputenc} %\usepackage[french,english]{babel} %\usepackage{datetime2} % %\begin{document} %\DTMfrenchweekdayname{6} % %\DTMenglishweekdayname{6} %\end{document} %\end{verbatim} % %As with the month name, date styles should explicitly use the %weekday macro (if provided) for the specific language to display %the weekday name rather than using a macro that varies according to %the current language. % %The \styfmt{datetime} package provides %\begin{definition}[\inpkg{datetime}] %\oldcs{dayofweeknameid}\marg{n} %\end{definition} %to provide the weekday name for the current language. If the current language %doesn't provide a translation for the weekday names, then the %English names are used. This command basically attempts to use %\cs{dayofweeknameid\meta{lang}} (where \meta{lang} is given %by \cs{languagename}) if it exists otherwise it uses %\oldcs{dayofweeknameidenglish}. This language-sensitive macro is a fragile %command that requires protection in moving arguments. % %As before, if the \styfmt{datetime2-calc} package is loaded, the %\sty{pgfcalendar} package's commands are also available including %\begin{definition}[\inpkg{pgfcalendar}] %\ics{pgfcalendarweekdayname}\marg{dow} %\end{definition} %where the argument \meta{dow} is an integer from 0 (Monday) to 6 %(Sunday). Multilingual support is provided through the %\sty{translator} package. % %The \styfmt{datetime2-calc} package also provides a robust %language-sensitive command: %\begin{definition}[\inpkg{datetime2-calc}] %\ics{DTMweekdayname}\marg{dow} %\end{definition} %This attempts to use \cs{DTM\meta{lang}weekdayname} if it exists, %where \meta{lang} is either \cs{languagename} or obtained from the %dialect-to-language mapping provided by \sty{tracklang}. If both %attempts fail, \cs{DTMweekdayname} will fallback on %\cs{pgfcalendarweekdayname} (with a warning through %\ics{dtmnamewarning}). % %Old style (\styfmt{datetime}): %\begin{verbatim} %\documentclass{article} %\usepackage[T1]{fontenc} %\usepackage[utf8]{inputenc} %\usepackage[french,english]{babel} % %\usepackage{datetime} % %\begin{document} % %\selectlanguage{french} %\dayofweeknameid{1} % %\selectlanguage{english} %\dayofweeknameid{1} %\end{document} %\end{verbatim} %New style (\styfmt{datetime2} with the \module{english} and %\module{french} modules): %\begin{verbatim} %\documentclass{article} %\usepackage[T1]{fontenc} %\usepackage[utf8]{inputenc} %\usepackage[french,english]{babel} % %\usepackage[calc]{datetime2} % %\begin{document} % %\selectlanguage{french} %\DTMweekdayname{6} % %\selectlanguage{english} %\DTMweekdayname{6} %\end{document} %\end{verbatim} % %The \styfmt{datetime} package also provides the command %\begin{definition}[\inpkg{datetime}] %\oldcs{dayofweekname}\marg{DD}\marg{MM}\marg{YYYY} %\end{definition} %that has three arguments: the day of the month, %the month number and the year. This calculates the day of week %index \meta{n}, an integer from 1 (Sunday) to 7 (Saturday), and then uses the %result in the argument of \oldcs{dayofweeknameid}\marg{n}. The %\cs{dayofweekname} command was provided by \styfmt{datetime} as a %convenient shortcut for use in date styles. (Similarly for %\oldcs{shortdayofweekname}.) With the \styfmt{datetime2} date styles, the %day-of-week index is automatically available through the fourth %argument of \ics{DTMdisplaydate} (and \ics{DTMDisplaydate}), so there %is little use for an equivalent command. Additionally, if a date has %already been saved with \styfmt{datetime2}, the weekday can be %extracted from the saved data through \ics{DTMfetchdow}, which can be %used in the argument of commands like \ics{DTMweekdayname} or %\ics{DTMenglishweekdayname}. % %However, if a calculation is required for some reason, it can be %obtained using the \sty{pgfcalendar} commands %\ics{pgfcalendardatetojulian} and \ics{pgfcalendarjuliantoweekday}, %which are described in the \styfmt{pgf} manual. % %The \styfmt{datetime} package provides the conditional %\begin{definition}[\inpkg{datetime}] %\oldcs{ifshowdow} %\end{definition} %which can be used to determine whether or not styles should display %the weekday name (if supported). The \styfmt{datetime2} package has the %analogous conditional %\begin{definition}[\inpkg{datetime2}] %\ics{ifDTMshowdow} %\end{definition} % %The \styfmt{datetime} package provides the command %\begin{definition}[\inpkg{datetime}] %\oldcs{ordinaldate}\marg{n} %\end{definition} %as a date-type ordinal where the argument should be an integer from 1 %to 31. For English, this just uses \sty{fmtcount}'s %non-expandable \cs{ordinalnum} command. For Breton, Welsh and French %a suffix is only added when the argument is 1. For all other %languages, this command just displays the number. % %With \styfmt{datetime2}, the language modules may or may not provide a %command to display the ordinal but most of them do. For example, the %\module{english} module provides %\begin{definition}[\inpkg{datetime2-english}] %\ics{DTMenglishordinal}\marg{n} %\end{definition} %This displays the suffix using %\begin{definition}[\inpkg{datetime2-english}] %\ics{DTMenglishfmtordsuffix}\marg{suffix} %\end{definition} %The definition of this command is changed by the styles provided by %the English regional modules. For example, the \style{en-US} style %redefines \cs{DTMenglishfmtordsuffix} to ignore its argument. %See the documentation for the \module{english} module for further %details. % %The \module{french} module provides: %\begin{definition}[\inpkg{datetime2-french}] %\ics{DTMfrenchordinal}\marg{n} %\end{definition} %This displays \meta{n} and if \meta{n} is 1, a suffix is appended. %See the \module{french} module documentation for further details. % %The \module{breton} module provides: %\begin{definition}[\inpkg{datetime2-breton}] %\ics{DTMbretonordinal}\marg{n} %\end{definition} %which similarly appends a suffix if \meta{n} is 1 but not for other %values. In this case, the suffix for the first day is formatted using %\begin{definition}[\inpkg{datetime2-breton}] %\ics{DTMbretonfmtordinal}\marg{suffix} %\end{definition} %which is redefined by the \csopt{DTMlangsetup}{ord} option. %See the \module{breton} module documentation for further details. % %The \module{welsh} module similarly provides: %\begin{definition}[\inpkg{datetime2-welsh}] %\ics{DTMwelshordinal}\marg{n} %\end{definition} %and %\begin{definition}[\inpkg{datetime2-welsh}] %\ics{DTMwelshfmtordinal}\marg{suffix} %\end{definition} %See the \module{welsh} module documentation for further details. % %Other modules may simply define \cs{DTM\meta{lang}ordinal} to just %display its argument. For example, the \module{german} module %provides %\begin{definition}[\inpkg{datetime2-german}] %\ics{DTMgermanordinal}\marg{n} %\end{definition} %which just displays \meta{n} (the day of month number). % %Alternatively, modules may define \cs{DTM\meta{lang}ordinal} to %display its argument followed by a full stop (period). For example, %the \module{norsk} module provides %\begin{definition}[\inpkg{datetime2-norsk}] %\ics{DTMnorskordinal}\marg{n} %\end{definition} %which displays \meta{n} followed by a full stop. % %As before, the date styles should explicitly use the ordinal macro %that matches the style. However, if you have some need to display %the day of month independent of any of the styles, you can use %\begin{definition}[\inpkg{datetime2-calc}] %\ics{DTMordinal}\marg{n} %\end{definition} %which is provided by \styfmt{datetime2-calc}. This attempts to use %\cs{DTM\meta{lang}ordinal} if it exists, otherwise it just displays %\meta{n}. % %Old style (\styfmt{datetime}): %\begin{verbatim} %\documentclass{article} %\usepackage[T1]{fontenc} %\usepackage[utf8]{inputenc} %\usepackage[french,english]{babel} % %\usepackage{datetime} % %\begin{document} % %\selectlanguage{french} %\ordinaldate{1} % %\selectlanguage{english} %\ordinaldate{1} %\end{document} %\end{verbatim} %This displays 1\textsuperscript{er} in the first case (through %\cs{ordinaldatefrench}) and %1\textsuperscript{st} in the second case (through \sty{fmtcount}'s %\cs{ordinalnum}). % %New style (\styfmt{datetime2} with the \module{english} and %\module{french} modules): %\begin{verbatim} %\documentclass{article} %\usepackage[T1]{fontenc} %\usepackage[utf8]{inputenc} %\usepackage[french,english]{babel} % %\usepackage[calc]{datetime2} % %\begin{document} % %\selectlanguage{french} %\DTMordinal{1} % %\selectlanguage{english} %\DTMordinal{1} %\end{document} %\end{verbatim} %This displays 1\textsuperscript{er} in the first case and %just 1 in the second case, because the regionless \module{english} %module doesn't use a suffix. % %To achieve the same result as the \styfmt{datetime} example, a few %modifications are needed: %\begin{verbatim} %\documentclass{article} %\usepackage[T1]{fontenc} %\usepackage[utf8]{inputenc} %\usepackage[french,british]{babel} % %\usepackage[calc,useregional]{datetime2} %\DTMlangsetup[en-GB]{ord=raise} % %\begin{document} % %\selectlanguage{french} %\DTMordinal{1} % %\selectlanguage{british} %\DTMordinal{1} %\end{document} %\end{verbatim} % %The \styfmt{datetime} package provides the command %\begin{definition}[\inpkg{datetime}] %\oldcs{twodigit}\marg{n} %\end{definition} %for use in date styles that require two-digit %numbers. The \styfmt{datetime2} package provides %\begin{definition}[\inpkg{datetime2}] %\ics{DTMtwodigits}\marg{n} %\end{definition} % %\section{Saving Dates} % %The \styfmt{datetime} package provides some commands for saving a date %for later use. (There are no equivalent commands for saving a time %in \styfmt{datetime}.) %With \styfmt{datetime}, a date is saved using %\begin{definition}[\inpkg{datetime}] %\oldcs{newdate}\marg{name}\marg{DD}\marg{MM}\marg{YYYY} %\end{definition} %With \styfmt{datetime2}, a date can be saved using %\begin{definition}[\inpkg{datetime2}] %\ics{DTMsavedate}\marg{name}\marg{date} %\end{definition} %where \meta{date} is in the form %\texttt{\meta{YYYY}-\meta{MM}-\meta{DD}}. % %A previously saved date can be displayed with \styfmt{datetime} using: %\begin{definition}[\inpkg{datetime}] %\oldcs{displaydate}\marg{name} %\end{definition} %With \styfmt{datetime2}, the saved date can be displayed using: %\begin{definition}[\inpkg{datetime2}] %\ics{DTMusedate}\marg{name} %\end{definition} % %Old style (\styfmt{datetime}): %\begin{verbatim} %\documentclass{article} %\usepackage{datetime} % %\begin{document} % %\newdate{mydate}{20}{1}{2016} %\displaydate{mydate} % %\end{document} %\end{verbatim} %New style (\styfmt{datetime2}): %\begin{verbatim} %\documentclass{article} %\usepackage[en-GB,showdow]{datetime2} % %\begin{document} % %\DTMsavedate{mydate}{2016-01-20} %\DTMusedate{mydate} % %\end{document} %\end{verbatim} % %Individual elements of the date can be extracted with the %\styfmt{datetime} commands: %\begin{definition}[\inpkg{datetime}] %\oldcs{getdateday}\marg{name} %\end{definition} %for the day of the month, %\begin{definition}[\inpkg{datetime}] %\oldcs{getdatemonth}\marg{name} %\end{definition} %for the month number, and %\begin{definition}[\inpkg{datetime}] %\oldcs{getdateyear}\marg{name} %\end{definition} %for the year. % %These elements can be fetched in \styfmt{datetime2} using: %\begin{definition}[\inpkg{datetime2}] %\ics{DTMfetchday}\marg{name} %\end{definition} %for the day of the month, %\begin{definition}[\inpkg{datetime2}] %\ics{DTMfetchmonth}\marg{name} %\end{definition} %for the month number, and %\begin{definition}[\inpkg{datetime2}] %\ics{DTMfetchyear}\marg{name} %\end{definition} %for the year. Additionally you can fetch the day of week index if it %has been computed: %\begin{definition}[\inpkg{datetime2}] %\ics{DTMfetchdow}\marg{name} %\end{definition} % %Old style (\styfmt{datetime}): %\begin{verbatim} %\documentclass{article} % %\usepackage{datetime} % %\begin{document} % %\newdate{mydate}{20}{1}{2016} % %Year: \getdateyear{mydate}. %Month: \getdatemonth{mydate}. %Day: \getdateday{mydate}. % %\end{document} %\end{verbatim} %New style (\styfmt{datetime2}): %\begin{verbatim} %\documentclass{article} % %\usepackage{datetime2} % %\begin{document} % %\DTMsavedate{mydate}{2016-01-20} % %Year: \DTMfetchyear{mydate}. %Month: \DTMfetchmonth{mydate}. %Day: \DTMfetchday{mydate}. % %\end{document} %\end{verbatim} % %With \styfmt{datetime2}, you can also save the current time (as in the %time of the document build) with %\begin{definition}[\inpkg{datetime2}] %\ics{DTMsavenow}\marg{name} %\end{definition} %and then access each field of the date, time and zone. % %Old style (\styfmt{datetime}): %\begin{verbatim} %\documentclass{article} % %\usepackage{datetime} % %\begin{document} % %Year: \number\year. %Month: \number\month. %Day: \number\day. %DOW: \computedayofweek{\day}{\month}{\year}\number\dayofweek. % %Hour: \number\currenthour. %Minute: \number\currentminute. %Second: \number\currentsecond. % %\end{document} %\end{verbatim} %New style (\styfmt{datetime2}): %\begin{verbatim} %\documentclass{article} % %\usepackage[calc]{datetime2} % %\begin{document} %\DTMsavenow{now} % %Year: \DTMfetchyear{now}. %Month: \DTMfetchmonth{now}. %Day: \DTMfetchday{now}. %DOW: \DTMfetchdow{now}. % %Hour: \DTMfetchhour{now}. %Minute: \DTMfetchminute{now}. %Second: \DTMfetchsecond{now}. % %Time Zone Hour: \DTMfetchTZhour{now}. %Time Zone Minute: \DTMfetchTZminute{now}. % %\end{document} %\end{verbatim} %(Note that the day of week index is different as \styfmt{datetime2} %uses the same indexing system as \sty{pgfcalendar}.) % %\section{Multilingual Support} % %The \styfmt{datetime} package comes with the following files (in %addition to \texttt{datetime.sty} and %\texttt{datetime-defaults.sty}): % %\begin{center} %\begin{tabular}{llll} %\texttt{dt-american.def} & \texttt{dt-dutch.def} & \texttt{dt-lsorbian.def} & \texttt{dt-slovak.def}\\ %\texttt{dt-australian.def} & \texttt{dt-esperanto.def} & \texttt{dt-magyar.def} & \texttt{dt-slovene.def}\\ %\texttt{dt-austrian.def} & \texttt{dt-estonian.def} & \texttt{dt-naustrian.def} & \texttt{dt-spanish.def}\\ %\texttt{dt-bahasa.def} & \texttt{dt-finnish.def} & \texttt{dt-newzealand.def} & \texttt{dt-swedish.def}\\ %\texttt{dt-basque.def} & \texttt{dt-french.def} & \texttt{dt-ngerman.def} & \texttt{dt-turkish.def}\\ %\texttt{dt-breton.def} & \texttt{dt-galician.def} & \texttt{dt-norsk.def} & \texttt{dt-UKenglish.def}\\ %\texttt{dt-british.def} & \texttt{dt-german.def} & \texttt{dt-polish.def} & \texttt{dt-ukraineb.def}\\ %\texttt{dt-bulgarian.def} & \texttt{dt-greek.def} & \texttt{dt-portuges.def} & \texttt{dt-USenglish.def}\\ %\texttt{dt-canadian.def} & \texttt{dt-hebrew.def} & \texttt{dt-romanian.def} & \texttt{dt-usorbian.def}\\ %\texttt{dt-catalan.def} & \texttt{dt-icelandic.def} & \texttt{dt-russian.def} & \texttt{dt-welsh.def}\\ %\texttt{dt-croatian.def} & \texttt{dt-irish.def} & \texttt{dt-samin.def}\\ %\texttt{dt-czech.def} & \texttt{dt-italian.def} & \texttt{dt-scottish.def}\\ %\texttt{dt-danish.def} & \texttt{dt-latin.def} & \texttt{dt-serbian.def} %\end{tabular} %\end{center} % %These \texttt{dt-\meta{lang}.def} files provide the code to integrate %\styfmt{datetime} with \sty{babel} for each language given by \meta{lang}. %This means that if you have \styfmt{datetime} installed and there's a %\texttt{.def} file that matches the language you are using with %\sty{babel}, then all you need to do is load \sty{babel} before %\styfmt{datetime}. % %With \styfmt{datetime2}, language support is provided in separate %independently-maintained modules. The actual \styfmt{datetime2} package %itself just comes with two files: \texttt{datetime2.sty} and %\texttt{datetime2-calc.sty}. This means that if you only want to use %the basic numeric styles and aren't using \sty{babel} or %\sty{polyglossia}, then that's all you need. (Although you'll %obviously need to install dependent packages, such as \styfmt{pgf} %which provides the \sty{pgfcalendar} package used by %\styfmt{datetime2-calc}. However \sty{fmtcount}, which is required by %\styfmt{datetime}, isn't required by \styfmt{datetime2}.) % %If you want to use \styfmt{datetime2} with language support, then you %only need to install the modules for the required language. For %example, if you only use English, you can just install the %\module{english} module and if you only use French, you can just %install the \module{french} module. % %At the time of writing, the following modules are available on CTAN: %\begin{center} %\begin{tabular}{lll} %\module[bahasai]{datetime2-bahasai} & \module[galician]{datetime2-galician} & \module[russian]{datetime2-russian} \\ %\module[basque]{datetime2-basque} & \module[german]{datetime2-german} & \module[samin]{datetime2-samin} \\ %\module[breton]{datetime2-breton} & \module[greek]{datetime2-greek} & \module[scottish]{datetime2-scottish} \\ %\module[bulgarian]{datetime2-bulgarian} & \module[hebrew]{datetime2-hebrew} & \module[serbian]{datetime2-serbian} \\ %\module[catalan]{datetime2-catalan} & \module[icelandic]{datetime2-icelandic} & \module[slovak]{datetime2-slovak} \\ %\module[croatian]{datetime2-croatian} & \module[irish]{datetime2-irish} & \module[slovene]{datetime2-slovene} \\ %\module[czech]{datetime2-czech} & \module[italian]{datetime2-italian} & \module[spanish]{datetime2-spanish} \\ %\module[danish]{datetime2-danish} & \module[latin]{datetime2-latin} & \module[swedish]{datetime2-swedish} \\ %\module[dutch]{datetime2-dutch} & \module[lsorbian]{datetime2-lsorbian} & \module[turkish]{datetime2-turkish} \\ %\module[english]{datetime2-english} & \module[magyar]{datetime2-magyar} & \module[ukrainian]{datetime2-ukrainian} \\ %\module[esperanto]{datetime2-esperanto} & \module[norsk]{datetime2-norsk} & \module[usorbian]{datetime2-usorbian} \\ %\module[estonian]{datetime2-estonian} & \module[polish]{datetime2-polish} & \module[welsh]{datetime2-welsh} \\ %\module[finnish]{datetime2-finnish} & \module[portuges]{datetime2-portuges} \\ %\module[french]{datetime2-french} & \module[romanian]{datetime2-romanian} %\end{tabular} %\end{center} %Some of these only support the root language but some, such as %\module{english}, provide support for different regions. There is %also a supplementary package \sty{datetime2-en-fulltext} that %replicates \styfmt{datetime}'s \texttt{text} and \texttt{oclock} %styles (and requires \sty{fmtcount}). % %Old style (\styfmt{datetime}): %\begin{verbatim} %\documentclass{article} %\usepackage[T1]{fontenc} %\usepackage[utf8]{inputenc} %\usepackage[french,british]{babel} % %\usepackage{datetime} % %\begin{document} %\selectlanguage{french} %\today % %\selectlanguage{british} %\today % %\end{document} %\end{verbatim} %This produces: %\begin{quote} %21 janvier 2016\par %Thursday 21\textsuperscript{st} January, 2016 %\end{quote} % %New style (\styfmt{datetime2}, \sty{datetime2-english} and \sty{datetime2-french}): %\begin{verbatim} %\documentclass{article} %\usepackage[T1]{fontenc} %\usepackage[utf8]{inputenc} %\usepackage[french,british]{babel} % %\usepackage[showdow,useregional]{datetime2} % %\begin{document} %\selectlanguage{french} %\today % %\selectlanguage{british} %\today % %\end{document} %\end{verbatim} %This produces: %\begin{quote} %21 janvier 2016\par %Thursday 21st January 2016 %\end{quote} %There's a slight difference in the appearance of the British date. %An exact reproduction of the \styfmt{datetime} format can be achieved %by modifying the \style{en-GB} options: %\begin{verbatim} %\documentclass{article} %\usepackage[T1]{fontenc} %\usepackage[utf8]{inputenc} %\usepackage[french,british]{babel} % %\usepackage[showdow,useregional]{datetime2} %\DTMlangsetup[en-GB]{ord=raise,monthyearsep={,\space}} % %\begin{document} %\selectlanguage{french} %\today % %\selectlanguage{british} %\today % %\end{document} %\end{verbatim} %Note that neither \styfmt{dt-french.def} from \styfmt{datetime} nor %\sty{datetime2-french} support %the show day of week option. % %The \styfmt{datetime} package provides: %\begin{definition}[\inpkg{datetime}] %\oldcs{setdefaultdate}\marg{date declaration} %\end{definition} %to always use the date style given by \meta{date declaration} %instead of letting \sty{babel} switch the date format every time the %language changes. % %In \styfmt{datetime2}, the default is the reverse: the style won't %change when the language changes unless the languages (or regions) %have been listed in the \styfmt{datetime2} package options. If the %regional styles have been enabled, allowing \sty{babel} to change %the date style whenever the language changes, then you can switch %this behaviour off by setting the \pkgopt{useregional} option to %\pkgoptfmt{false}. % %Old style (\styfmt{datetime}): %\begin{verbatim} %\documentclass{article} %\usepackage[T1]{fontenc} %\usepackage[utf8]{inputenc} %\usepackage[french,british]{babel} % %\usepackage{datetime} % %\yyyymmdddate % %\begin{document} %\selectlanguage{french} %\today % %\selectlanguage{british} %\today % %\end{document} %\end{verbatim} %This produces: %\begin{quote} %21 janvier 2016\par %Thursday 21\textsuperscript{st} January, 2016 %\end{quote} %(The numeric date style has been overridden.) %\begin{verbatim} %\documentclass{article} %\usepackage[T1]{fontenc} %\usepackage[utf8]{inputenc} %\usepackage[french,british]{babel} % %\usepackage{datetime2} % %\DTMsetdatestyle{iso} % %\begin{document} %\selectlanguage{french} %\today % %\selectlanguage{british} %\today % %\end{document} %\end{verbatim} %This produces: %\begin{quote} %2016-01-21\par %2016-01-21 %\end{quote} %(The ISO date style overrides the language setting.) % %Compare this to: %\begin{verbatim} %\documentclass{article} %\usepackage[T1]{fontenc} %\usepackage[utf8]{inputenc} %\usepackage[french,british]{babel} % %\usepackage[en-GB,fr-FR]{datetime2} % %\DTMsetdatestyle{iso} % %\begin{document} %\selectlanguage{french} %\today % %\selectlanguage{british} %\today % %\end{document} %\end{verbatim} %This produces: %\begin{quote} %21 janvier 2016\par %21st January 2016 %\end{quote} % %Examples that explicitly suppress the language-sensitive dates %follow. First with \styfmt{datetime}: %\begin{verbatim} %\documentclass{article} %\usepackage[T1]{fontenc} %\usepackage[utf8]{inputenc} %\usepackage[french,british]{babel} % %\usepackage{datetime} % %\setdefaultdate{\yyyymmdddate} % %\begin{document} %\selectlanguage{french} %\today % %\selectlanguage{british} %\today % %\end{document} %\end{verbatim} %This produces: %\begin{quote} %2016/01/21\par %2016/01/21 %\end{quote} % %Now with \styfmt{datetime2}: %\begin{verbatim} %\documentclass{article} %\usepackage[T1]{fontenc} %\usepackage[utf8]{inputenc} %\usepackage[french,british]{babel} % %\usepackage[en-GB,fr-FR,useregional=false]{datetime2} % %\DTMsetdatestyle{iso} % %\begin{document} %\selectlanguage{french} %\today % %\selectlanguage{british} %\today % %\end{document} %\end{verbatim} %This produces: %\begin{quote} %2016-01-21\par %2016-01-21 %\end{quote} % %\section{Predefined Date Formats} % %The \styfmt{datetime} date styles were set with declarations such as %\cs{longdate} (or package options that used the associated %declaration, such as \pkgoptfmt{long}). %With \styfmt{datetime2}, date styles are set using %\begin{definition}[\inpkg{datetime2}] %\ics{DTMsetdatestyle}\marg{style name} %\end{definition} %(which just changes the date style without changing the time style) or %\begin{definition}[\inpkg{datetime2}] %\ics{DTMsetstyle}\marg{style name} %\end{definition} %which sets the full date-time style. % %This section lists the \styfmt{datetime} declarations and how the %same style can be set through \styfmt{datetime2}. % %\begin{definition}[\inpkg{datetime}] %\oldcs{yyyymmdddate} %\end{definition} %By default this style produces a date in the form 2016/01/20. (The %separator is governed by \oldcs{dateseparator}.) This is the default %style for \styfmt{datetime2} with the exception of the separator, %which defaults to a hyphen. To reproduce the \styfmt{datetime} %format, you can set the date style to \style{default} (if it has %been previous changed from the default) and change the separator %with the \pkgopt{datesep} option: %\begin{verbatim} %\DTMsetdatestyle{default} %\DTMsetup{datesep={/}} %\end{verbatim} % %\begin{definition}[\inpkg{datetime}] %\oldcs{longdate} %\end{definition} %This is the default date format for \styfmt{datetime} and this style produces %the date in the form: Wednesday 8\textsuperscript{th} March, 2000. %This is actually a regional style for some of the English dialects, %so with \styfmt{datetime2} this additionally needs the %\module{english} module installed. To exactly replicate this date %format, including the day of week name, the superscript ordinal %suffix and the comma after the month name, you need the %\pkgopt{showdow} and \pkgopt{en-GB} package options and %the \csopt{DTMlangsetup}{ord} and \csopt{DTMlangsetup}{monthyearsep} %options for the \style{en-GB} style. For example: %\begin{verbatim} %\usepackage[showdow,en-GB]{datetime2} %\DTMlangsetup[en-GB]{ord=raise,monthyearsep={,\space}} %\end{verbatim} %Another possibility is: %\begin{verbatim} %\usepackage[british]{babel} %\usepackage[showdow]{datetime2} %\DTMlangsetup[en-GB]{ord=raise,monthyearsep={,\space}} %\DTMsetdatestyle{en-GB} %\end{verbatim} %There are other regional styles in the \module{english} module that %produce the same format, such as \style{en-GG}. % %\begin{definition}[\inpkg{datetime}] %\oldcs{shortdate} %\end{definition} %This is similar to \cs{longdate} but uses abbreviated names to %produce a date in the form: Wed 8\textsuperscript{th} Mar, 2000. %With \styfmt{datetime2}, this is like the above but additionally %needs the \csopt{DTMlangsetup}{abbr} option for the \style{en-GB} %style: %\begin{verbatim} %\usepackage[showdow,en-GB]{datetime2} %\DTMlangsetup[en-GB]{ord=raise,monthyearsep={,\space},abbr} %\end{verbatim} %or %\begin{verbatim} %\usepackage[british]{babel} %\usepackage[showdow]{datetime2} %\DTMlangsetup[en-GB]{ord=raise,monthyearsep={,\space},abbr} %\DTMsetdatestyle{en-GB} %\end{verbatim} % %\begin{definition}[\inpkg{datetime}] %\oldcs{ddmmyyyydate} %\end{definition} %This produces a date in the form 08/03/2000. This can be reproduced %with just \styfmt{datetime2} using the \style{ddmmyyyy} style with %the date separator set to a slash: %\begin{verbatim} %\DTMsetdatestyle{ddmmyyyy} %\DTMsetup{datesep=/} %\end{verbatim} % %\begin{definition}[\inpkg{datetime}] %\oldcs{dmyyyydate} %\end{definition} %This produces a date in the form 8/3/2000. This can be reproduced %with just \styfmt{datetime2} using the \style{dmyyyy} style with %the date separator set to a slash: %\begin{verbatim} %\DTMsetdatestyle{dmyyyy} %\DTMsetup{datesep=/} %\end{verbatim} %This format is also the style of some of the regional numeric date %styles. For example, with the \module{english} module: %\begin{verbatim} %\usepackage[british]{babel} %\usepackage{datetime2} %\DTMsetdatestyle{en-GB-numeric} %\end{verbatim} % %\begin{definition}[\inpkg{datetime}] %\oldcs{ddmmyydate} %\end{definition} %This produces a date in the form 08/03/00. This can be reproduced %with just \styfmt{datetime2} using the \style{ddmmyy} style with %the date separator set to a slash: %\begin{verbatim} %\DTMsetdatestyle{ddmmyy} %\DTMsetup{datesep=/} %\end{verbatim} % %\begin{definition}[\inpkg{datetime}] %\oldcs{dmyydate} %\end{definition} %This produces a date in the form 8/3/00. This can be reproduced %with just \styfmt{datetime2} using the \style{dmyy} style with %the date separator set to a slash: %\begin{verbatim} %\DTMsetdatestyle{dmyy} %\DTMsetup{datesep=/} %\end{verbatim} % %\begin{definition}[\inpkg{datetime}] %\oldcs{textdate} %\end{definition} %This style is designed to produce a full text British date in the %form: Wednesday the Eighth of March, Two Thousand. The %\sty{datetime2-en-fulltext} package is required to reproduce this %style: %\begin{verbatim} %\usepackage[showdow]{datetime2-en-fulltext} %\DTMsetdatestyle{en-FullText} %\end{verbatim} %Note that with both \styfmt{datetime} and %\styfmt{datetime2-en-fulltext} this style should not be used if the %current language isn't English. % %\begin{definition}[\inpkg{datetime}] %\oldcs{usdate} %\end{definition} %This style is designed to produce \TeX's default US date format in %the form March 8, 2000. This style can be reproduced with %\styfmt{datetime2} and the \module{english} module: %\begin{verbatim} %\usepackage[en-US]{datetime2} %\end{verbatim} %or %\begin{verbatim} %\usepackage[USenglish]{babel} %\usepackage[useregional]{datetime2} %\DTMsetdatestyle{en-US} %\end{verbatim} % %\begin{definition}[\inpkg{datetime}] %\oldcs{mmddyyyydate} %\end{definition} %This style produces a date in a middle-endian format in the form: %03/08/2000. This style can be reproduced with \styfmt{datetime2} using %the \style{mmddyyyy} style with the date separator set to a slash: %\begin{verbatim} %\DTMsetup{datesep=/} %\DTMsetdatestyle{mmddyyyy} %\end{verbatim} % %\begin{definition}[\inpkg{datetime}] %\oldcs{mdyyyydate} %\end{definition} %This style produces a date in a middle-endian format in the form: %3/8/2000. This style can be reproduced with \styfmt{datetime2} using %the \style{mdyyyy} style with the date separator set to a slash: %\begin{verbatim} %\DTMsetup{datesep=/} %\DTMsetdatestyle{mdyyyy} %\end{verbatim} %This format is also the style of some of the regional numeric date %styles. For example, with the \module{english} module: %\begin{verbatim} %\usepackage[USenglish]{babel} %\usepackage{datetime2} %\DTMsetdatestyle{en-US-numeric} %\end{verbatim} % %\begin{definition}[\inpkg{datetime}] %\oldcs{mmddyydate} %\end{definition} %This style produces a date in a middle-endian format in the form: %03/08/00. This style can be reproduced with \styfmt{datetime2} using %the \style{mmddyy} style with the date separator set to a slash: %\begin{verbatim} %\DTMsetup{datesep=/} %\DTMsetdatestyle{mmddyy} %\end{verbatim} % %\begin{definition}[\inpkg{datetime}] %\oldcs{mdyydate} %\end{definition} %This style produces a date in a middle-endian format in the form: %3/8/00. This style can be reproduced with \styfmt{datetime2} using %the \style{mdyy} style with the date separator set to a slash: %\begin{verbatim} %\DTMsetup{datesep=/} %\DTMsetdatestyle{mdyy} %\end{verbatim} % %\section{Predefined Time Formats} % %The time formats are set in \styfmt{datetime} using %\begin{definition}[\inpkg{datetime}] %\oldcs{settimeformat}\marg{style-name} %\end{definition} %With \styfmt{datetime2}, the time styles are set using %\begin{definition}[\inpkg{datetime2}] %\ics{DTMsettimestyle}\marg{style-name} %\end{definition} %(which just changes the time style without changing the date style) or %\begin{definition}[\inpkg{datetime2}] %\ics{DTMsetstyle}\marg{style name} %\end{definition} %which sets the full date-time style. % %The \styfmt{datetime} package provides the following time styles: %\begin{description} %\item[xxivtime] This style produces the time in twenty-four hour %format in the form 09:28. (The default time style for %\styfmt{datetime}.) Note that this style has no seconds. The format %can be reproduced in \styfmt{datetime2} with the \style{default} %style and the \pkgopt{showseconds} option set to \pkgoptfmt{false}: %\begin{verbatim} %\DTMsettimestyle{default} %\DTMsetup{showseconds=false} %\end{verbatim} % %\item[hhmmsstime] This is like the previous style but includes the %seconds. This is the default time style for \styfmt{datetime2}: %\begin{verbatim} %\DTMsettimestyle{default} %\end{verbatim} % %\item[ampmtime] This style produces the time in twelve hour format %in the form 9:28am or 7:54pm. This style is available in some of the %regional modules for \styfmt{datetime2}. For example, using the %\style{en-GB} style in the \module{english} module: %\begin{verbatim} %\usepackage[en-GB]{datetime2} %\end{verbatim} %or %\begin{verbatim} %\usepackage[british]{babel} %\usepackage{datetime2} %\DTMsettimestyle{en-GB} %\end{verbatim} % %\item[oclock] This style is designed for a full text English time %format in the form: Twenty-Eight minutes past Ten in the afternoon. %This style can be reproduced with the \style{en-FullText} style %provided by the \sty{datetime2-en-fulltext} package: %\begin{verbatim} %\usepackage{datetime2-en-fulltext} %\DTMsettimestyle{en-FullText} %\end{verbatim} % %\end{description} % %\section{Defining a New Date Format} % %The \styfmt{datetime} package provides: %\begin{definition}[\inpkg{datetime}] %\oldcs{newdateformat}\marg{name}\marg{format} %\end{definition} %to define a new date style. Within \meta{format}, the placeholder %commands \oldcs{THEDAY}, \oldcs{THEMONTH} and \oldcs{THEYEAR} are %used to represent the relevant day, month and year values. There are %also counter placeholders \texttt{DAY}, \texttt{MONTH} and %\texttt{YEAR}, which may be used instead. % %A necessary consequence of allowing placeholder commands in %\meta{format} means that these commands must be set as appropriate %before the date can be formatted. This means that the formatted date %can't be expanded and the date commands must be made robust to %protect them in moving arguments. This is an inherent problem with the %\styfmt{datetime} package that can't be fixed without breaking %backwards compatibility and is one of the main reasons for %introducing the replacement \styfmt{datetime2} package. % %The \styfmt{datetime2} package provides a better way of providing %date styles, which are defined using: %\begin{definition}[\inpkg{datetime2}] %\ics{DTMnewdatestyle}\marg{name}\marg{definition} %\end{definition} %Instead of using placeholder commands, the date styles %simply redefine the date formatting macros within \meta{definition}. %There are two principle date formatting commands that the date style %must define although styles may redefine additional helper commands %if necessary. % %The two main date formatting commands are: %\begin{definition}[\inpkg{datetime2}] %\ics{DTMdisplaydate}\marg{YYYY}\marg{MM}\marg{DD}\marg{dow} %\end{definition} %for use where no case-changing is required and %\begin{definition}[\inpkg{datetime2}] %\ics{DTMDisplaydate}\marg{YYYY}\marg{MM}\marg{DD}\marg{dow} %\end{definition} %for use where the date must begin with an upper case letter, for %example if the date occurs at the start of a sentence. For styles %where the case-change is irrelevant (for example, numeric styles or %styles that always start with an upper case letter), the %\cs{DTMDisplaydate} command may simply be set to %\cs{DTMdisplaydate}. % %The \styfmt{datetime} manual provides some examples of new date %styles. The first is simply a numeric little-endian style with a hyphen %separating each number: %\begin{verbatim} %\newdateformat{mydate}{\THEDAY-\THEMONTH-\THEYEAR} %\end{verbatim} % %To convert this into a \styfmt{datetime2} format, the new style %simply needs to redefine \cs{DTMdisplaydate} so that it has the %following definition: %\begin{verbatim} %\renewcommand{\DTMdisplaydate}[4]{#3-#2-#1} %\end{verbatim} %Note that this command must always have four arguments, even if one %or more of them are ignored. So here \cs{THEYEAR} is just the first %argument \verb|#1|, \cs{THEMONTH} is the second argument \verb|#2| %and \cs{THEDAY} is the third argument \verb|#3|. One other thing to note is %that the arguments may be supplied with a leading zero. If you want %to trim this off, you can use \TeX's \ics{number} primitive. For %example: %\begin{verbatim} %\renewcommand{\DTMdisplaydate}[4]{\number#3-\number#2-\number#1 } %\end{verbatim} %This is the better method to allow for, say, registers used in any %of the arguments. % %Therefore this new date style can be defined for \styfmt{datetime2} %as follows: %\begin{verbatim} %\DTMnewdatestyle{mydate}{% % \renewcommand{\DTMdisplaydate}[4]{\number##3-\number##2-\number##1 }% % \renewcommand{\DTMDisplaydate}{\DTMdisplaydate}% %} %\end{verbatim} %(Note the need to double the \verb|#| in the parameters, as is usual %when redefining a command within another command in this manner.) % %For example, using \styfmt{datetime}: %\begin{verbatim} %\documentclass{article} %\usepackage{datetime} % %\newdateformat{mydate}{\THEDAY-\THEMONTH-\THEYEAR} %\mydate % %\begin{document} %\today. %\end{document} %\end{verbatim} %Now using \styfmt{datetime2}: %\begin{verbatim} %\documentclass{article} %\usepackage{datetime2} % %\DTMnewdatestyle{mydate}{% % \renewcommand{\DTMdisplaydate}[4]{\number##3-\number##2-\number##1 }% % \renewcommand{\DTMDisplaydate}{\DTMdisplaydate}% %} %\DTMsetdatestyle{mydate} % %\begin{document} %\today. %\end{document} %\end{verbatim} % %Another example provided in the \styfmt{datetime} manual ensures two %digits for the month and day of month: %\begin{verbatim} %\newdateformat{dashdate}{\twodigit{\THEDAY}-\twodigit{\THEMONTH}-\THEYEAR} %\end{verbatim} % %This is a minor modification to the previous example. The two digit %number format can be obtained through \styfmt{datetime2}'s %\ics{DTMtwodigits} command: %\begin{verbatim} %\DTMnewdatestyle{dashdate}{% % \renewcommand{\DTMdisplaydate}[4]{% % \DTMtwodigits{##3}-\DTMtwodigits{##2}-\number##1 }% % \renewcommand{\DTMDisplaydate}{\DTMdisplaydate}% %} %\end{verbatim} % %A complete example follows for \styfmt{datetime}: %\begin{verbatim} %\documentclass{article} %\usepackage{datetime} % %\newdateformat{dashdate}{\twodigit{\THEDAY}-\twodigit{\THEMONTH}-\THEYEAR} %\dashdate % %\begin{document} %\today. %\end{document} %\end{verbatim} %And for \styfmt{datetime2}: %\begin{verbatim} %\documentclass{article} %\usepackage{datetime2} % %\DTMnewdatestyle{dashdate}{% % \renewcommand{\DTMdisplaydate}[4]{% % \DTMtwodigits{##3}-\DTMtwodigits{##2}-\number##1 }% % \renewcommand{\DTMDisplaydate}{\DTMdisplaydate}% %} %\DTMsetdatestyle{dashdate} % %\begin{document} %\today. %\end{document} %\end{verbatim} % %You may have noticed that there's no equivalent of %\styfmt{datetime}'s counter placeholders, but there's no real need %for them and any attempt at implementing them would return to the %original problem of preventing an expandable date format. \LaTeX\ %counters all internally use \TeX\ count registers and counter %formatting commands have to access those registers to determine the %counter value. % %To illustrate this, the \styfmt{datetime} manual provides the %example: %\begin{verbatim} %\newdateformat{usvardate}{\monthname[\THEMONTH] \ordinal{DAY}, \THEYEAR} %\end{verbatim} %This uses the \texttt{DAY} counter placeholder since \cs{ordinal} %(provided by the \sty{fmtcount} package) requires a counter name as %the argument. However, \cs{ordinal} internally uses \cs{ordinalnum} %with the internal count register as the argument, so the format %could just as easily be defined as: %\begin{verbatim} %\newdateformat{usvardate}{\monthname[\THEMONTH] \ordinalnum{\THEDAY}, \THEYEAR} %\end{verbatim} % %So how can this style be reproduced with \styfmt{datetime2}? A %na\"ive approach is: %\begin{verbatim} %\DTMnewdatestyle{usvardate}{% % \renewcommand{\DTMdisplaydate}[4]{% % \DTMmonthname{##2} \ordinalnum{##2}, \number##1 }% % \renewcommand{\DTMDisplaydate}{\DTMdisplaydate}% %} %\end{verbatim} %This requires both \styfmt{datetime2-calc} (for \ics{DTMmonthname}) %and \sty{fmtcount} (for \cs{ordinalnum}). % %A complete example that uses it: %\begin{verbatim} %\documentclass{article} % %\usepackage{fmtcount} %\usepackage[calc]{datetime2} % %\DTMnewdatestyle{usvardate}{% % \renewcommand{\DTMdisplaydate}[4]{% % \DTMmonthname{##2} \ordinalnum{##2}, \number##1 }% % \renewcommand{\DTMDisplaydate}{\DTMdisplaydate}% %} %\DTMsetdatestyle{usvardate} % %\begin{document} %\today. %\end{document} %\end{verbatim} %This produces a warning from \cs{DTMmonthname} because %\cs{DTMenglishmonthname} hasn't been defined, so it uses %\cs{pgfcalendarmonthname} instead. The document displays the text: %\begin{quote} %January 1\textsuperscript{st}, 2016. %\end{quote} %This seems to produce the correct output, but let's see what happens %if we make a minor modification to the example: %\begin{verbatim} %\documentclass{article} % %\usepackage[english,french]{babel} %\usepackage{fmtcount} %\usepackage[calc]{datetime2} % %\DTMnewdatestyle{usvardate}{% % \renewcommand{\DTMdisplaydate}[4]{% % \DTMmonthname{##2} \ordinalnum{##2}, \number##1 }% % \renewcommand{\DTMDisplaydate}{\DTMdisplaydate}% %} %\DTMsetdatestyle{usvardate} % %\begin{document} %\today. %\end{document} %\end{verbatim} %This now produces: %\begin{quote} %janvier 1\textsuperscript{er}, 2016. %\end{quote} %which doesn't match the rationale of the style being a variation of %the standard US date style nor does it match the little-endian %syntax of French dates. % %Now let's make another minor change to the example: %\begin{verbatim} %\documentclass{article} % %\usepackage{fmtcount} %\usepackage[calc]{datetime2} % %\DTMnewdatestyle{usvardate}{% % \renewcommand{\DTMdisplaydate}[4]{% % \DTMmonthname{##2} \ordinalnum{##2}, \number##1 }% % \renewcommand{\DTMDisplaydate}{\DTMdisplaydate}% %} %\DTMsetdatestyle{usvardate} % %\begin{document} %\section{\today: an example} % %\today. %\end{document} %\end{verbatim} %This document can't compile properly and causes the error: %\begin{verbatim} %! Argument of \@sect has an extra }. % % \par %\end{verbatim} %This is because the style definition has made \cs{today} fragile %because it uses an unprotected fragile command. This can be fixed by %protecting \cs{ordinalnum} in the style definition. % %Let's make another modification: %\begin{verbatim} %\documentclass{article} % %\usepackage{fmtcount} %\usepackage[calc]{datetime2} % %\DTMnewdatestyle{usvardate}{% % \renewcommand{\DTMdisplaydate}[4]{% % \DTMmonthname{##2} \protect\ordinalnum{##2}, \number##1 }% % \renewcommand{\DTMDisplaydate}{\DTMdisplaydate}% %} %\DTMsetdatestyle{usvardate} % %\pagestyle{headings} % %\begin{document} %\section{\today: an example} % %\today. %\end{document} %\end{verbatim} %This compiles without error now that \cs{ordinalnum} has been %protected, but the page header appears as: %\begin{quote} %\emph{1\quad January 1\textsuperscript{st}, 2016: AN EXAMPLE}\hfill 1 %\end{quote} %The date hasn't been rendered in upper case so the header doesn't %look right. % %If \sty{hyperref} is added, another problem becomes evident: %\begin{verbatim} %\documentclass{article} % %\usepackage{fmtcount} %\usepackage[calc]{datetime2} %\usepackage[colorlinks]{hyperref} % %\DTMnewdatestyle{usvardate}{% % \renewcommand{\DTMdisplaydate}[4]{% % \DTMmonthname{##2} \protect\ordinalnum{##2}, \number##1 }% % \renewcommand{\DTMDisplaydate}{\DTMdisplaydate}% %} %\DTMsetdatestyle{usvardate} % %\pagestyle{headings} % %\begin{document} %\section{\today: an example} % %\today. %\end{document} %\end{verbatim} %The PDF bookmarks for this document show the section title as: %\begin{quote} %01 , 2016: an example %\end{quote} % %Both the header and the bookmark problem are caused by %non-expandable elements of the date style. \emph{The same problems %occur with \styfmt{datetime}}, and is one of the main reasons for %developing a replacement package since these problems can't be fixed %by \styfmt{datetime}. In fact, the \styfmt{datetime} version of this %example looks even worse in the bookmarks: %\begin{verbatim} %\documentclass{article} % %\usepackage{datetime} %\usepackage[colorlinks]{hyperref} % %\newdateformat{usvardate}{\monthname[\THEMONTH] \ordinalnum{\THEDAY}, \THEYEAR} %\usvardate % %\pagestyle{headings} % %\begin{document} %\section{\today: an example} % %\today. %\end{document} %\end{verbatim} %The bookmark now looks like: %\begin{quote} %===[0], 0: an example %\end{quote} %(The page header is the same as for the \styfmt{datetime2} example %above, with the date not matching the rest of the heading case.) % %A more appropriate way of defining this style with %\styfmt{datetime2} package is to use the \emph{expandable} commands %provided by the \module{english} module: %\begin{verbatim} %\documentclass{article} % %\usepackage[calc,en-GB]{datetime2} %\usepackage[colorlinks]{hyperref} % %\DTMnewdatestyle{usvardate}{% % \renewcommand*{\DTMenglishfmtordsuffix}{\DTMenGBfmtordsuffix}% % \renewcommand{\DTMdisplaydate}[4]{% % \DTMenglishmonthname{##2} \DTMenglishordinal{##2}, \number##1 }% % \renewcommand{\DTMDisplaydate}{\DTMdisplaydate}% %} %\DTMsetdatestyle{usvardate} % %\pagestyle{headings} % %\begin{document} %\section{\today: an example} % %\today. %\end{document} %\end{verbatim} %This fixes both the header and the bookmarks. % %If you don't want to rely on remembering to use the \pkgopt{en-GB} %option to load the \style{en-GB} style (which defines %\cs{DTMenGBfmtordsuffix}) you can use this alternative: %\begin{verbatim} %\documentclass{article} % %\usepackage[calc]{datetime2} %\usepackage[colorlinks]{hyperref} % %\DTMusemodule{english}{en-GB} % %\DTMnewdatestyle{usvardate}{% % \renewcommand*{\DTMenglishfmtordsuffix}{\DTMenGBfmtordsuffix}% % \renewcommand{\DTMdisplaydate}[4]{% % \DTMenglishmonthname{##2} \DTMenglishordinal{##2}, \number##1 }% % \renewcommand{\DTMDisplaydate}{\DTMdisplaydate}% %} %\DTMsetdatestyle{usvardate} % %\pagestyle{headings} % %\begin{document} %\section{\today: an example} % %\today. %\end{document} %\end{verbatim} %This is a useful method to employ if you want to define the new %style in a package without forcing the package options used to load %\styfmt{datetime2}. % %Note that this new style definition is unaffected by language %changes, so the other problem with the \styfmt{datetime} version of %this style is also eliminated. % %\section{Defining a New Time Format} % %The \styfmt{datetime} package provides: %\begin{definition}[\inpkg{datetime}] %\oldcs{newtimeformat}\marg{name}\marg{format} %\end{definition} %to define a new time style. Within \meta{format}, the placeholder %commands \oldcs{THEHOUR}, \oldcs{THEMINUTE}, \oldcs{THESECOND}, %\oldcs{THEHOURXII}, \oldcs{THETOHOUR}, \oldcs{THETOMINUTE} may be %used. There are also corresponding placeholder counters: %\texttt{HOUR}, \texttt{MINUTE}, \texttt{SECOND}, \texttt{HOURXII}, %\texttt{TOHOUR} and \texttt{TOMINUTE}. % %This placeholder style of format for the time has the same problems %as that for the date styles described in the previous section. % %Time styles are defined in \styfmt{datetime2} using: %\begin{definition}[\inpkg{datetime2}] %\ics{DTMnewtimestyle}\marg{name}\marg{definition} %\end{definition} % %As with the date styles, the \styfmt{datetime2} package provides %styles that redefine a formatting macro. In this case, the time %(without the zone) is simply formatted with %\begin{definition}[\inpkg{datetime2}] %\ics{DTMdisplaytime}\marg{hh}\marg{mm}\marg{ss} %\end{definition} %so the \meta{definition} part of \cs{DTMnewtimestyle} needs to %redefine this command. % %The placeholder commands \cs{THEHOUR}, \cs{THEMINUTE} %and \cs{THESECOND} from \styfmt{datetime} can now be represented by %the first, second and third arguments of \cs{DTMdisplaytime}. The %other placeholders are more complicated as they need to be %calculated which may prevent the style from being an expandable %format. % %The \styfmt{datetime} manual provides a simple example of defining a %new time style: %\begin{verbatim} %\newtimeformat{dottime}{\twodigit{\THEHOUR}.\twodigit{\THEMINUTE}} %\end{verbatim} %This style is then set using: %\begin{verbatim} %\settimeformat{dottime} %\end{verbatim} % %An equivalent time style can be defined with \styfmt{datetime2}: %\begin{verbatim} %\DTMnewtimestyle{dottime}{% % \renewcommand*\DTMdisplaytime[3]{\DTMtwodigits{##1}.\DTMtwodigits{##2}}} %\end{verbatim} % %A complete example using \styfmt{datetime}: %\begin{verbatim} %\documentclass{article} % %\usepackage{datetime} % %\newtimeformat{dottime}{\twodigit{\THEHOUR}.\twodigit{\THEMINUTE}} %\settimeformat{dottime} % %\begin{document} %\currenttime. %\end{document} %\end{verbatim} %A complete example using \styfmt{datetime2}: %\begin{verbatim} %\documentclass{article} % %\usepackage{datetime2} % %\DTMnewtimestyle{dottime}{% % \renewcommand*\DTMdisplaytime[3]{\DTMtwodigits{##1}.\DTMtwodigits{##2}}} %\DTMsettimestyle{dottime} % %\begin{document} %\DTMcurrenttime. %\end{document} %\end{verbatim} % %Note that the \styfmt{datetime} example has a problem with PDF %bookmarks if the time is used in a sectioning command, for the same %reasons as those discussed above in the previous section. This can %be seen with a slight modification to the example: %\begin{verbatim} %\documentclass{article} % %\usepackage{datetime} %\usepackage[colorlinks]{hyperref} % %\newtimeformat{dottime}{\twodigit{\THEHOUR}.\twodigit{\THEMINUTE}} %\settimeformat{dottime} % %\begin{document} %\section{\currenttime: an example} % %\currenttime. %\end{document} %\end{verbatim} %The bookmark appears as: %\begin{quote} %====by 1=by 12by 12 by -=by -60by -1=0.00: an example %\end{quote} % %The \styfmt{datetime2} example works fine with a similar %modification: %\begin{verbatim} %\documentclass{article} % %\usepackage{datetime2} %\usepackage[colorlinks]{hyperref} % %\DTMnewtimestyle{dottime}{% % \renewcommand*\DTMdisplaytime[3]{\DTMtwodigits{##1}.\DTMtwodigits{##2}}} %\DTMsettimestyle{dottime} % %\begin{document} %\section{\DTMcurrenttime: an example} % %\DTMcurrenttime. %\end{document} %\end{verbatim} % %There is one slight drawback with this example that's irrelevant to the choice %of package. The bookmark (and table of contents, if present) will always show %the time from the previous \LaTeX\ run. This is only a problem when using the %current time, especially if seconds are required or the document build takes %longer than a minute. If the example has a specific time instead of one that %changes for every \LaTeX\ run, then this issue is eliminated. % %If you want a time style that requires the other placeholder %commands provided by \styfmt{datetime}, then it's more complicated %to convert to \styfmt{datetime2} as the values that %\styfmt{datetime} conveniently computes and stores in the %placeholder commands \oldcs{THEHOURXII}, \oldcs{THETOHOUR} and %\oldcs{THETOMINUTE} now need to be calculated, preferably in an %expandable way. % %An expandable twelve hour time format can be illustrated with the %\style{englishampm} style provided by the \module{english} %module:\footnote{Bug fix from \styfmt{datetime2-english} v1.03 %included} %\begin{verbatim} %\DTMnewtimestyle % {englishampm}% label % {% % \renewcommand*\DTMdisplaytime[3]{% % \ifnum##2=0 % \ifnum##1=12 % \DTMtexorpdfstring % {\DTMenglishampmfmt{\DTMenglishnoon}}% % {\DTMenglishnoon}% % \else % \ifnum##1=0 % \DTMtexorpdfstring % {\DTMenglishampmfmt{\DTMenglishmidnight}}% % {\DTMenglishmidnight}% % \else % \ifnum##1=24 % \DTMtexorpdfstring % {\DTMenglishampmfmt{\DTMenglishmidnight}}% % {\DTMenglishmidnight}% % \else % \ifnum##1<12 % \number##1 % \DTMtexorpdfstring % {\DTMenglishampmfmt{\DTMenglisham}}% % {\DTMenglisham}% % \else % \number\numexpr##1-12\relax % \DTMtexorpdfstring % {\DTMenglishampmfmt{\DTMenglishpm}}% % {\DTMenglishpm}% % \fi % \fi % \fi % \fi % \fi % \else % \ifnum##1<13 % \ifnum##1=0 % 12% % \else % \number##1 % \fi % \DTMenglishtimesep\DTMtwodigits{##2}% % \ifnum##1=12 % \DTMtexorpdfstring % {\DTMenglishampmfmt{\DTMenglishpm}}% % {\DTMenglishpm}% % \else % \DTMtexorpdfstring % {\DTMenglishampmfmt{\DTMenglisham}}% % {\DTMenglisham}% % \fi % \else % \number\numexpr##1-12\relax % \DTMenglishtimesep\DTMtwodigits{##2}% % \ifnum##1=24 % \DTMtexorpdfstring % {\DTMenglishampmfmt{\DTMenglisham}}% % {\DTMenglisham}% % \else % \DTMtexorpdfstring % {\DTMenglishampmfmt{\DTMenglishpm}}% % {\DTMenglishpm}% % \fi % \fi % \fi % }% % }% %\end{verbatim} % %This is certainly more complicated than the %\texttt{ampmtime} format provided by \styfmt{datetime}, which is %defined as: %\begin{verbatim} %\newtimeformat{ampmtime}% %{% % \ifthenelse{\value{HOUR}=0}{12}{\THEHOURXII}% % \timeseparator % \twodigit{\THEMINUTE}% % \ifthenelse{\value{HOUR}<12}{\amname}% % {% % \ifthenelse{\value{HOUR}=12}{ \noon}{\pmname}% % }% %} %\end{verbatim} %However the \styfmt{datetime2} version produces better results, %especially where expansion is required (for example, in bookmarks or %writing a time stamp to an external file). The \styfmt{datetime2} %version also performs extra checks for midnight where the %\styfmt{datetime} version produces ambiguous text. So the %\texttt{ampmtime} definition is simple but buggy. % %The basic algorithm for \style{englishampm} is: %\begin{description} %\item If the minute value is 0 (\verb|\ifnum##2=0|): % \begin{description} % \item If the hour value is 12 (\verb|\ifnum##1=12|): % \begin{description} % \item Print \qt{noon} % \end{description} % % \item Otherwise (not noon but on the hour) % % \begin{description} % \item If the hour value is 0 (\verb|\ifnum##1=0|) % \begin{description} % \item Print \qt{midnight} % \end{description} % % \item Otherwise (not 12:00 or 00:00 but on the hour) % % \begin{description} % \item If the hour value is 24 (\verb|\ifnum##1=24|) % \begin{description} % \item Print \qt{midnight} % \end{description} % % \item Otherwise (not 12:00 or 00:00 or 24:00 but on the hour) % \begin{description} % \item If the hour value is less than 12 (\verb|\ifnum##1<12|) % \begin{description} % \item Print the hour value (\verb|\number##1|) % \item Print \qt{am} % \end{description} % \item Otherwise % \begin{description} % \item Print the hour value less 12 % (\verb|\number\numexpr##1-12|) % \item Print \qt{pm} % \end{description} % \end{description} % \end{description} % \end{description} % \end{description} % % \item Otherwise (minute value isn't zero) % % \begin{description} % \item If the hour value is less than 13 (\verb|\ifnum##1<13|) % % \begin{description} % \item If the hour value is 0 (\verb|\ifnum##1=0|) % \begin{description} % \item Print \qt{12} % \end{description} % \item Otherwise % \begin{description} % \item Print the hour (\verb|\number##1|) % \end{description} % % \item Print the separator between the hour and minute % (\verb|\DTMenglishtimesep|) % % \item Print minute value (\verb|\DTMtwodigits{##2}|) % % \item If the hour value is 12 (\verb|\ifnum##=12|) % \begin{description} % \item Print \qt{pm} % \end{description} % \item Otherwise (hour value less than 12) % \begin{description} % \item Print \qt{am} % \end{description} % \end{description} % % \item Otherwise (hour value $\ge13$) % % \begin{description} % \item Print the hour value less 12 % (\verb|\number\numexpr##1-12|) % \item Print the time separator % % \item Print minute value (\verb|\DTMtwodigits{##2}|) % % \item If the hour value is 24 (\verb|\ifnum##1=24|) % \begin{description} % \item Print \qt{am} % \end{description} % \item Otherwise % \begin{description} % \item Print \qt{pm} % \end{description} % \end{description} % \end{description} %\end{description} %Most of the complication in this style isn't trying to determine the %equivalent value of \cs{THEHOURXII} (\verb|\number\numexpr##1-12| %if \verb|##1>12|) but in improving the algorithm to catch special %cases that the \styfmt{datetime} style misses. Additionally, %\ics{DTMtexorpdfstring} is used to prevent any font formatting %commands from being added to the bookmarks. % %The \sty{datetime2-en-fulltext} package provides an example of a %time style that requires calculating the minutes to the hour and the %next hour. Note that fragile commands are protected in this style. %Since it contains fragile commands that require protection, it can't %be used in an expandable context. % %Remember that most of the styles provided by \styfmt{datetime2} and its %associated modules and dependent packages are configurable, so if %your preferred style is only marginally different to a predefined %style, you may be able to tweak that style to fit your requirements. %For example, the dot time format can be obtained using the %\style{default} style with the seconds suppressed and the separator %change to a dot: %\begin{verbatim} %\DTMsettimestyle{default} %\DTMsetup{timesep={.},showseconds=false} %\end{verbatim} % %The twelve hour format provided by the \module{english} module can also be %adjusted. This style honours the package-wide time-related option %\pkgopt{hourminsep} and the \qt{am}, \qt{pm}, \qt{midnight} or %\qt{noon} part is formatted according to: %\begin{definition}[\inpkg{datetime2-english}] %\ics{DTMenglishampmfmt}\marg{text} %\end{definition} % %So a twelve hour format that uses a dot instead of a colon and has %the text part in small caps can be obtained using: %\begin{verbatim} %\usepackage[english,hourminsep={.}]{datetime2} %\renewcommand*{\DTMenglishampmfmt}[1]{\textsc{#1}} %\end{verbatim} % %\StopEventually{\PrintChanges\PrintIndex} % % %\chapter{The Code} %\iffalse % \begin{macrocode} %<*datetime2.sty> % \end{macrocode} %\fi %\section{datetime2.sty code} %\changes{1.0}{2015-03-24}{Initial release} % \begin{macrocode} \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{datetime2}[2021/03/21 v1.5.7 (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). %\changes{1.5.4}{2019-10-21}{renamed scratch variables} % \begin{macrocode} \define@choicekey{datetime2.sty}{useregional}[\@dtm@useregional@val\@dtm@useregional@nr]% {false,text,numeric,num}[text]% {% \ifcase\@dtm@useregional@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} %\changes{1.5.5}{2019-11-11}{add check for \cs{TrackIfKnownLanguage}} % \begin{macrocode} \DeclareOptionX*{% \ifcsundef{@tracklang@add@\CurrentOption}% {% \ifundef\TrackIfKnownLanguage {% \PackageError{datetime2}{Unrecognised dialect `\CurrentOption'. If you are using a valid ISO language code please update tracklang.sty to at least v1.3.9}% {Any options that aren't described in the manual are assumed \MessageBreak to be language or dialect names.}% }% {% \TrackIfKnownLanguage{\CurrentOption}% {\renewcommand*{\DTMifcaseregional}[3]{#2}}% {% \PackageError{datetime2}{`\CurrentOption' is not a recognised dialect \MessageBreak and doesn't contain a known language code. \MessageBreak Perhaps you have misspelt it or the \MessageBreak named dialect may be unsupported or \MessageBreak perhaps you forgot the `=' part \MessageBreak for example, `style=\CurrentOption'}% {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{1.4}{2016-02-11}{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{1.4}{2016-02-11}{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{1.4}{2016-02-11}{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}{\DTMfinaldot} %\changes{1.5.5}{2019-11-11}{new} %Some date styles require the date to end with a period (full stop). %These styles should use \cs{DTLfinaldot} for the terminating %period. This allows the starred version of \cs{DTMdate} to %locally redefine this command to do nothing when the date is %required at the end of a sentence. % \begin{macrocode} \newcommand*{\DTMfinaldot}{.} % \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. This now has a starred version that %locally redefines \cs{DTMfinaldot} to do nothing. %\changes{1.5.5}{2019-11-11}{added starred version} % \begin{macrocode} \newrobustcmd*{\DTMdate}{\@ifstar\@sDTMdate\@DTMdate} % \end{macrocode} %\end{macro} % %\begin{macro}{\@DTMdate} %\changes{1.5.5}{2019-11-11}{new} % \begin{macrocode} \newcommand*{\@DTMdate}[1]{% \expandafter\@dtm@parsedate#1\@dtm@endparsedate \DTMdisplaydate{\@dtm@year}{\@dtm@month}{\@dtm@day}{\@dtm@dow}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\@sDTMdate} %\changes{1.5.5}{2019-11-11}{new} % \begin{macrocode} \newcommand*{\@sDTMdate}[1]{% {% \let\DTMfinaldot\empty \@DTMdate{#1}% }% } % \end{macrocode} %\end{macro} % %\begin{macro}{\DTMDate} % Upper case version. This now has a starred version that %locally redefines \cs{DTMfinaldot} to do nothing. %\changes{1.5.5}{2019-11-11}{added starred version} % \begin{macrocode} \newrobustcmd*{\DTMDate}{\@ifstar\@sDTMDate\@DTMDate} % \end{macrocode} %\end{macro} % %\begin{macro}{\@sDTMDate} %\changes{1.5.5}{2019-11-11}{new} % \begin{macrocode} \newcommand*{\@DTMDate}[1]{% \expandafter\@dtm@parsedate#1\@dtm@endparsedate \DTMDisplaydate{\@dtm@year}{\@dtm@month}{\@dtm@day}{\@dtm@dow}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\@sDTMDate} %\changes{1.5.5}{2019-11-11}{new} % \begin{macrocode} \newcommand*{\@sDTMDate}[1]{% {% \let\DTMfinaldot\empty \@DTMDate{#1}% }% } % \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} %\changes{1.5.6}{2020-03-02}{removed spurious space} % \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}{2018-07-20}{new} %Save the date-time stamp in PDF format. % \begin{macrocode} \newrobustcmd*{\DTMsavepdftimestamp}[2]{% \edef\@dtm@tmp{#2}% \ifx\@dtm@tmp\empty \cslet{@dtm@#1@year}{0}% \cslet{@dtm@#1@month}{0}% \cslet{@dtm@#1@day}{0}% \cslet{@dtm@#1@dow}{0}% \cslet{@dtm@#1@hour}{0}% \cslet{@dtm@#1@minute}{0}% \cslet{@dtm@#1@second}{0}% \cslet{@dtm@#1@TZhour}{0}% \cslet{@dtm@#1@TZminute}{0}% \else \expandafter\@dtm@parsepdfdatetime\@dtm@tmp\@dtm@endparsepdfdatetime \cslet{@dtm@#1@year}{\@dtm@year}% \cslet{@dtm@#1@month}{\@dtm@month}% \cslet{@dtm@#1@day}{\@dtm@day}% \cslet{@dtm@#1@dow}{\@dtm@dow}% \cslet{@dtm@#1@hour}{\@dtm@hour}% \cslet{@dtm@#1@minute}{\@dtm@minute}% \cslet{@dtm@#1@second}{\@dtm@second}% \cslet{@dtm@#1@TZhour}{\@dtm@timezonehour}% \cslet{@dtm@#1@TZminute}{\@dtm@timezoneminute}% \fi } % \end{macrocode} %\end{macro} % %\begin{macro}{\DTMsavenow} %Save the current time. % \begin{macrocode} \newrobustcmd{\DTMsavenow}[1]{% \cslet{@dtm@#1@year}{\@dtm@currentyear}% \cslet{@dtm@#1@month}{\@dtm@currentmonth}% \cslet{@dtm@#1@day}{\@dtm@currentday}% \cslet{@dtm@#1@dow}{\@dtm@currentdow}% \cslet{@dtm@#1@hour}{\@dtm@currenthour}% \cslet{@dtm@#1@minute}{\@dtm@currentminute}% \cslet{@dtm@#1@second}{\@dtm@currentsecond}% \cslet{@dtm@#1@TZhour}{\@dtm@currenttimezonehour}% \cslet{@dtm@#1@TZminute}{\@dtm@currenttimezoneminute}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\DTMmakeglobal} %Globally set the stored information. % \begin{macrocode} \newrobustcmd{\DTMmakeglobal}[1]{% \global\csletcs{@dtm@#1@year}{@dtm@#1@year}% \global\csletcs{@dtm@#1@month}{@dtm@#1@month}% \global\csletcs{@dtm@#1@day}{@dtm@#1@day}% \global\csletcs{@dtm@#1@dow}{@dtm@#1@dow}% \global\csletcs{@dtm@#1@hour}{@dtm@#1@hour}% \global\csletcs{@dtm@#1@minute}{@dtm@#1@minute}% \global\csletcs{@dtm@#1@second}{@dtm@#1@second}% \global\csletcs{@dtm@#1@TZhour}{@dtm@#1@TZhour}% \global\csletcs{@dtm@#1@TZminute}{@dtm@#1@TZminute}% } % \end{macrocode} %\end{macro} % % Expandable ways of fetching saved data. (No check for existence % performed.) The argument is the label. %\begin{macro}{\DTMfetchyear} % \begin{macrocode} \newcommand*{\DTMfetchyear}[1]{\csname @dtm@#1@year\endcsname} % \end{macrocode} %\end{macro} %\begin{macro}{\DTMfetchmonth} % \begin{macrocode} \newcommand*{\DTMfetchmonth}[1]{\csname @dtm@#1@month\endcsname} % \end{macrocode} %\end{macro} %\begin{macro}{\DTMfetchday} % \begin{macrocode} \newcommand*{\DTMfetchday}[1]{\csname @dtm@#1@day\endcsname} % \end{macrocode} %\end{macro} %\begin{macro}{\DTMfetchdow} % \begin{macrocode} \newcommand*{\DTMfetchdow}[1]{\csname @dtm@#1@dow\endcsname} % \end{macrocode} %\end{macro} %\begin{macro}{\DTMfetchhour} % \begin{macrocode} \newcommand*{\DTMfetchhour}[1]{\csname @dtm@#1@hour\endcsname} % \end{macrocode} %\end{macro} %\begin{macro}{\DTMfetchminute} % \begin{macrocode} \newcommand*{\DTMfetchminute}[1]{\csname @dtm@#1@minute\endcsname} % \end{macrocode} %\end{macro} %\begin{macro}{\DTMfetchsecond} % \begin{macrocode} \newcommand*{\DTMfetchsecond}[1]{\csname @dtm@#1@second\endcsname} % \end{macrocode} %\end{macro} %\begin{macro}{\DTMfetchTZhour} % \begin{macrocode} \newcommand*{\DTMfetchTZhour}[1]{\csname @dtm@#1@TZhour\endcsname} % \end{macrocode} %\end{macro} %\begin{macro}{\DTMfetchTZminute} % \begin{macrocode} \newcommand*{\DTMfetchTZminute}[1]{\csname @dtm@#1@TZminute\endcsname} % \end{macrocode} %\end{macro} % %\begin{macro}{\DTMusedate} %\begin{definition} %\cs{DTMusedate}\marg{label} %\end{definition} % Displays the previously saved date using \cs{DTMdisplaydate}. % \begin{macrocode} \newcommand*\DTMusedate[1]{% \ifcsundef{@dtm@#1@year}% {% \PackageError{datetime2}{Undefined date `#1'}{}% }% {% \DTMdisplaydate {\csname @dtm@#1@year\endcsname}% {\csname @dtm@#1@month\endcsname}% {\csname @dtm@#1@day\endcsname}% {\csname @dtm@#1@dow\endcsname}% }% }% % \end{macrocode} %\end{macro} % %\begin{macro}{\DTMUsedate} %\begin{definition} %\cs{DTMUsedate}\marg{label} %\end{definition} % Displays the previously saved date using \cs{DTMDisplaydate}. % \begin{macrocode} \newcommand*\DTMUsedate[1]{% \ifcsundef{@dtm@#1@year}% {% \PackageError{datetime2}{Undefined date `#1'}{}% }% {% \DTMDisplaydate {\csname @dtm@#1@year\endcsname}% {\csname @dtm@#1@month\endcsname}% {\csname @dtm@#1@day\endcsname}% {\csname @dtm@#1@dow\endcsname}% }% }% % \end{macrocode} %\end{macro} % %\begin{macro}{\DTMusetime} %\begin{definition} %\cs{DTMusetime}\marg{label} %\end{definition} % Displays the previously saved time using \cs{DTMdisplaytime}. % \begin{macrocode} \newcommand*\DTMusetime[1]{% \ifcsundef{@dtm@#1@hour}% {% \PackageError{datetime2}{Undefined time `#1'}{}% }% {% \DTMdisplaytime {\csname @dtm@#1@hour\endcsname}% {\csname @dtm@#1@minute\endcsname}% {\csname @dtm@#1@second\endcsname}% }% }% % \end{macrocode} %\end{macro} % %\begin{macro}{\DTMusezone} %\begin{definition} %\cs{DTMusezone}\marg{label} %\end{definition} % Displays the previously saved date using \cs{DTMdisplayzone}. % \begin{macrocode} \newcommand*\DTMusezone[1]{% \ifcsundef{@dtm@#1@TZhour}% {% \PackageError{datetime2}{Undefined time `#1'}{}% }% {% \DTMdisplayzone {\csname @dtm@#1@TZhour\endcsname}% {\csname @dtm@#1@TZminute\endcsname}% }% }% % \end{macrocode} %\end{macro} % %\begin{macro}{\DTMuse} %\begin{definition} %\cs{DTMuse}\marg{label} %\end{definition} % Displays the previously saved date and time. % \begin{macrocode} \newcommand*\DTMuse[1]{% \ifcsundef{@dtm@#1@year}% {% \PackageError{datetime2}{Undefined date-time `#1'}{}% }% {% \DTMdisplay {\csname @dtm@#1@year\endcsname}% {\csname @dtm@#1@month\endcsname}% {\csname @dtm@#1@day\endcsname}% {\csname @dtm@#1@dow\endcsname}% {\csname @dtm@#1@hour\endcsname}% {\csname @dtm@#1@minute\endcsname}% {\csname @dtm@#1@second\endcsname}% {\csname @dtm@#1@TZhour\endcsname}% {\csname @dtm@#1@TZminute\endcsname}% }% }% % \end{macrocode} %\end{macro} % %\begin{macro}{\DTMUse} %\begin{definition} %\cs{DTMUse}\marg{label} %\end{definition} % Displays the previously saved date and time. % \begin{macrocode} \newcommand*\DTMUse[1]{% \ifcsundef{@dtm@#1@year}% {% \PackageError{datetime2}{Undefined date-time `#1'}{}% }% {% \DTMDisplay {\csname @dtm@#1@year\endcsname}% {\csname @dtm@#1@month\endcsname}% {\csname @dtm@#1@day\endcsname}% {\csname @dtm@#1@dow\endcsname}% {\csname @dtm@#1@hour\endcsname}% {\csname @dtm@#1@minute\endcsname}% {\csname @dtm@#1@second\endcsname}% {\csname @dtm@#1@TZhour\endcsname}% {\csname @dtm@#1@TZminute\endcsname}% }% }% % \end{macrocode} %\end{macro} % %\begin{macro}{\DTMifsaveddate} % Determine if the given label has been assigned to a date, time and % zone. % \begin{macrocode} \newcommand{\DTMifsaveddate}[3]{% \ifcsundef{@dtm@#1@year}{#3}{#2}% } % \end{macrocode} %\end{macro} % %\subsection{Language Module Loading} % % Define commands to load regional settings. % %\begin{macro}{\@dtm@requiremodule} % Use \sty{tracklang} interface to find the associated file for the % given dialect. % \begin{macrocode} \newcommand*{\@dtm@requiremodule}[1]{% \IfTrackedLanguageFileExists{#1}% {datetime2-}% prefix {.ldf}% suffix {% \RequireDateTimeModule{\CurrentTrackedTag}% }% {% \@dtm@warning{Date-Time Language Module `#1' not installed}% }% } % \end{macrocode} %\end{macro} % %\begin{macro}{\@dtm@loadedregions} % List of loaded \styfmt{datetime2} language modules. % \begin{macrocode} \newcommand*{\@dtm@loadedregions}{} % \end{macrocode} %\end{macro} % %\begin{macro}{\RequireDateTimeModule} % Input the language file, if not already loaded. % Should only be used with \cs{@dtm@requiremodule} % which sets commands like \cs{CurrentTrackedDialect}. % Since the language modules are loaded within % \cs{@dtm@requiremodule} they may use this command to load % dependent modules. % \begin{macrocode} \newcommand*{\RequireDateTimeModule}[1]{% \ifundef\CurrentTrackedDialect {% \PackageError{datetime2}% {\string\RequireDateTimeModule\space not permitted here}% {This command is only permitted inside datetime2 language modules.}% }% {% \ifcsundef{ver@datetime2-#1.ldf}% {% \input{datetime2-#1.ldf}% \ifdefempty\@dtm@loadedregions {% \edef\@dtm@loadedregions{#1}% }% {% \edef\@dtm@loadedregions{\@dtm@loadedregions,#1}% }% % \end{macrocode} % In case a synonym is also used, add a mapping from the module name % to the current tracked dialect. %\changes{1.3}{2016-01-22}{added module to dialect map} % \begin{macrocode} \csedef{@dtm@moddialectmap@#1}{\CurrentTrackedDialect}% }% {% % \end{macrocode} % The module has already been loaded, but the current tracked % dialect might be a synonym for a different language label that % might've already loaded the module. If \cs{date\meta{dialect}} % exists, this needs to be set. % \begin{macrocode} \ifcsdef{date\CurrentTrackedDialect} {% \letcs{\@dtm@otherdialect}{@dtm@moddialectmap@#1}% \edef\@dtm@thisdialect{\CurrentTrackedDialect}% \ifdefequal\@dtm@thisdialect\@dtm@otherdialect {}% {% \ifcsdef{date\@dtm@otherdialect}% {% \csletcs{date\@dtm@thisdialect}{date\@dtm@otherdialect}% }% {}% }% }% {}% }% % \end{macrocode} % In case it's needed, create a mapping between the dialect name and % the module name. %\changes{1.3}{2016-01-22}{added dialect to module map} % \begin{macrocode} \csedef{@dtm@dialectmodmap@\CurrentTrackedDialect}{#1}% }% } % \end{macrocode} %\end{macro} % %\begin{macro}{\DTMdialecttomodulemap} %\changes{1.3}{2016-01-22}{new} %\begin{definition} %\cs{DTMdialecttomodulemap}\marg{dialect} %\end{definition} % Expands to name of the module loaded with the given dialect name % or \cs{relax} if no module has been loaded for the given dialect. % \begin{macrocode} \newcommand*{\DTMdialecttomodulemap}[1]{% \ifcsdef{ver@datetime2-#1.ldf}% {#1}% {\csname @dtm@dialectmodmap@#1\endcsname}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\ProvidesDateTimeModule} % For use in language module to identify itself. % \begin{macrocode} \newcommand*{\ProvidesDateTimeModule}[1]{% \ProvidesFile{datetime2-#1.ldf}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\DTMusemodule} %\changes{1.03}{2016-01-20}{new} % Provided for packages or documents that need to load a module. % This shouldn't be used inside the \texttt{.ldf} files. % \begin{macrocode} \newcommand*{\DTMusemodule}[2]{% \ifcsdef{@tracklang@add@#1}% {% \TrackPredefinedDialect{#1}% }% {}% \let\@dtm@org@dialect\CurrentTrackedDialect \def\CurrentTrackedDialect{#1}% \RequireDateTimeModule{#2}% \let\CurrentTrackedDialect\@dtm@org@dialect } % \end{macrocode} %\end{macro} % %\begin{macro}{\DTMdefkey} %\begin{definition} %\cs{DTMdefkey}\marg{region}\marg{key}\oarg{default}\marg{func} %\end{definition} % Used by language modules to define a key. % \begin{macrocode} \newcommand*{\DTMdefkey}[1]{\define@key[dtm]{#1}} % \end{macrocode} %\end{macro} % %\begin{macro}{\DTMdefchoicekey} %\begin{definition} %\cs{DTMdefchoicekey}\marg{region}\marg{key}\oarg{bin}\marg{choice %list}\marg{default}\marg{func} %\end{definition} % Used by language modules to define a choice key. % \begin{macrocode} \newcommand*{\DTMdefchoicekey}[1]{\define@choicekey[dtm]{#1}} % \end{macrocode} %\end{macro} % %\begin{macro}{\DTMdefboolkey} %\begin{definition} %\cs{DTMdefboolkey}\marg{region}\oarg{mp}\marg{key}\oarg{default}\marg{func} %\end{definition} % Used by language modules to define a boolean key. % \begin{macrocode} \newcommand*{\DTMdefboolkey}[1]{\define@boolkey[dtm]{#1}} % \end{macrocode} %\end{macro} % %\begin{macro}{\DTMifbool} %\begin{definition} %\cs{DTMifbool}\marg{region}\marg{key}\marg{true}\marg{false} %\end{definition} % Test boolean key that was defined using \cs{DTMdefboolkey} % \begin{macrocode} \newcommand*{\DTMifbool}[4]{\ifbool{dtm@#1@#2}{#3}{#4}} % \end{macrocode} %\end{macro} % %\begin{macro}{\DTMsetbool} %\begin{definition} %\cs{DTMsetbool}\marg{region}\marg{key}\marg{value} %\end{definition} % Set boolean key that was defined using \cs{DTMdefboolkey} % \begin{macrocode} \newcommand*{\DTMsetbool}[3]{\setbool{dtm@#1@#2}{#3}} % \end{macrocode} %\end{macro} % %\begin{macro}{\DTMlangsetup} % Set up options for language modules. The optional argument is a % list of language/regions. If omitted all loaded regions are % iterated over. (I'm not sure why \cs{setkeys} doesn't work % if the same key is present in multiple families, so this iterates % over the families instead.) % The starred version doesn't warn on unknown keys. %\changes{1.3}{2016-01-22}{added starred version} % \begin{macrocode} \newcommand*{\DTMlangsetup}{% \@ifstar\s@DTMlangsetup\@DTMlangsetup} % \end{macrocode} % Unstarred version: % \begin{macrocode} \newcommand*{\@DTMlangsetup}[2][\@dtm@loadedregions]{% \@for\@dtm@region:=#1\do{% \setkeys*+[dtm]{\@dtm@region}{#2}% \ifdefempty\XKV@rm{}% {% \@dtm@warning{Region `\@dtm@region' has ignored \MessageBreak the following settings:\MessageBreak \XKV@rm ^^J}% }% }% } % \end{macrocode} % % Starred version: % \begin{macrocode} \newcommand*{\s@DTMlangsetup}[2][\@dtm@loadedregions]{% \@for\@dtm@region:=#1\do{% \setkeys*+[dtm]{\@dtm@region}{#2}% }% } % \end{macrocode} %\end{macro} % % Now load all the required modules (if installed) using the % \sty{tracklang} interface. (Language packages, such as \sty{babel} % or \sty{polyglossia} must be loaded before this.) % \begin{macrocode} \AnyTrackedLanguages {% \ForEachTrackedDialect{\this@dialect}% {% \@dtm@requiremodule\this@dialect }% } {% % \end{macrocode} % No tracked languages. The default is already set up, so nothing to % do here. % \begin{macrocode} } % \end{macrocode} % % Load \sty{datetime2-calc} if required. % \begin{macrocode} \@dtm@usecalc % \end{macrocode} % % Use the \pkgopt{style} package option, if set. % \begin{macrocode} \ifdefempty\@dtm@initialstyle{}{\DTMsetstyle{\@dtm@initialstyle}} % \end{macrocode} %\iffalse % \begin{macrocode} % % \end{macrocode} %\fi %\iffalse % \begin{macrocode} %<*datetime2-calc.sty> % \end{macrocode} %\fi %\section{datetime2-calc.sty code} % \begin{macrocode} \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{datetime2-calc}[2021/03/21 v1.5.7 (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. %\changes{1.5.7}{2021-03-21}{removed spurious space} % \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{1.4}{2016-02-11}{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}{2018-07-20}{new} % \begin{macrocode} \def\dtmMondayIndex{0} % \end{macrocode} %\end{macro} % %\begin{macro}{\dtmTuesdayIndex} %\changes{1.5.3}{2018-07-20}{new} % \begin{macrocode} \def\dtmTuesdayIndex{1} % \end{macrocode} %\end{macro} % %\begin{macro}{\dtmWednesdayIndex} %\changes{1.5.3}{2018-07-20}{new} % \begin{macrocode} \def\dtmWednesdayIndex{2} % \end{macrocode} %\end{macro} % %\begin{macro}{\dtmThursdayIndex} %\changes{1.5.3}{2018-07-20}{new} % \begin{macrocode} \def\dtmThursdayIndex{3} % \end{macrocode} %\end{macro} % %\begin{macro}{\dtmFridayIndex} %\changes{1.5.3}{2018-07-20}{new} % \begin{macrocode} \def\dtmFridayIndex{4} % \end{macrocode} %\end{macro} % %\begin{macro}{\dtmSaturdayIndex} %\changes{1.5.3}{2018-07-20}{new} % \begin{macrocode} \def\dtmSaturdayIndex{5} % \end{macrocode} %\end{macro} % %\begin{macro}{\dtmSundayIndex} %\changes{1.5.3}{2018-07-20}{new} % \begin{macrocode} \def\dtmSundayIndex{6} % \end{macrocode} %\end{macro} % %\begin{macro}{\DTMweekdayname} %\changes{1.3}{2016-01-22}{new} % \begin{macrocode} \newrobustcmd{\DTMweekdayname}[1]{% % \end{macrocode} % First check if \cs{DTM\meta{language}weekdayname} exists. % \begin{macrocode} \ifcsdef{DTM\languagename weekdayname}% {% % \end{macrocode} % It exists, so use it. % \begin{macrocode} \csuse{DTM\languagename weekdayname}{#1}% }% {% % \end{macrocode} % Try obtaining the language name from the dialect using % \sty{tracklang}'s interface. % \begin{macrocode} \dtm@ifdianameexists{weekdayname}% {% % \end{macrocode} % It exists, so use it. % \begin{macrocode} \csuse{DTM\TrackedLanguageFromDialect{\languagename}weekdayname}{#1}% }% {% % \end{macrocode} % Can't determine the language name macro. This may be because the % actual name can't be determined or it could be because the % relevant language module can't be loaded so use \sty{pgf}'s % command instead, which also has limited language support. % \begin{macrocode} \dtmnamewarning{\DTMweekdayname}% \pgfcalendarweekdayname{#1}% }% }% } % \end{macrocode} %\end{macro} % %\begin{macro}{\DTMWeekdayname} %\changes{1.3}{2016-01-22}{new} % \begin{macrocode} \newrobustcmd{\DTMWeekdayname}[1]{% % \end{macrocode} % First check if \cs{DTM\meta{language}Weekdayname} exists. % \begin{macrocode} \ifcsdef{DTM\languagename Weekdayname}% {% % \end{macrocode} % It exists, so use it. % \begin{macrocode} \csuse{DTM\languagename Weekdayname}{#1}% }% {% % \end{macrocode} % Try obtaining the language name from the dialect using % \sty{tracklang}'s interface. % \begin{macrocode} \dtm@ifdianameexists{Weekdayname}% {% % \end{macrocode} % It exists, so use it. % \begin{macrocode} \csuse{DTM\TrackedLanguageFromDialect{\languagename}Weekdayname}{#1}% }% {% % \end{macrocode} % Can't determine the language name macro. This could be because % there's no upper case macro as the names always start with a % capital (like English). % \begin{macrocode} \ifcsdef{DTM\languagename weekdayname}% {% \csuse{DTM\languagename weekdayname}{#1}% }% {% \dtm@ifdianameexists{weekdayname}% {% \csuse{DTM\TrackedLanguageFromDialect{\languagename}weekdayname}{#1}% }% {% % \end{macrocode} % Can't find no-case change version either, so use \sty{pgfcalendar} % command instead (which will need a case-change applied). % \begin{macrocode} \dtmnamewarning{\DTMWeekdayname}% % \end{macrocode} % If \sty{mfirstuc} has been loaded, use it. % \begin{macrocode} \ifdef\emakefirstuc {% \emakefirstuc{\pgfcalendarweekdayname{#1}}% }% {% % \end{macrocode} % Hasn't been loaded, so just expand and apply \cs{MakeUppercase}: % \begin{macrocode} \protected@edef\dtm@tmp@weekdayname{\pgfcalendarweekdayname{#1}}% \expandafter\MakeUppercase\dtm@tmp@weekdayname }% }% }% }% }% } % \end{macrocode} %\end{macro} % %\begin{macro}{\DTMshortweekdayname} %\changes{1.3}{2016-01-22}{new} % \begin{macrocode} \newrobustcmd{\DTMshortweekdayname}[1]{% % \end{macrocode} % First check if \cs{DTM\meta{language}shortweekdayname} exists. % \begin{macrocode} \ifcsdef{DTM\languagename shortweekdayname}% {% % \end{macrocode} % It exists, so use it. % \begin{macrocode} \csuse{DTM\languagename shortweekdayname}{#1}% }% {% % \end{macrocode} % Try obtaining the language name from the dialect using % \sty{tracklang}'s interface. % \begin{macrocode} \dtm@ifdianameexists{shortweekdayname}% {% % \end{macrocode} % It exists, so use it. % \begin{macrocode} \csuse{DTM\TrackedLanguageFromDialect{\languagename}shortweekdayname}{#1}% }% {% % \end{macrocode} % Can't determine the language name macro. This may be because the % actual name can't be determined or it could be because the % relevant language module can't be loaded so use \sty{pgf}'s % command instead, which also has limited language support. % \begin{macrocode} \dtmnamewarning{\DTMshortweekdayname}% \pgfcalendarweekdayshortname{#1}% }% }% } % \end{macrocode} %\end{macro} % %\begin{macro}{\DTMshortWeekdayname} %\changes{1.3}{2016-01-22}{new} % \begin{macrocode} \newrobustcmd{\DTMshortWeekdayname}[1]{% % \end{macrocode} % First check if \cs{DTM\meta{language}shortWeekdayname} exists. % \begin{macrocode} \ifcsdef{DTM\languagename shortWeekdayname}% {% % \end{macrocode} % It exists, so use it. % \begin{macrocode} \csuse{DTM\languagename shortWeekdayname}{#1}% }% {% % \end{macrocode} % Try obtaining the language name from the dialect using % \sty{tracklang}'s interface. % \begin{macrocode} \dtm@ifdianameexists{shortWeekdayname}% {% % \end{macrocode} % It exists, so use it. % \begin{macrocode} \csuse{DTM\TrackedLanguageFromDialect{\languagename}shortWeekdayname}{#1}% }% {% % \end{macrocode} % Can't determine the language name macro. This could be because % there's no upper case macro as the names always start with a % capital (like English). % \begin{macrocode} \ifcsdef{DTM\languagename shortweekdayname}% {% \csuse{DTM\languagename shortweekdayname}{#1}% }% {% \dtm@ifdianameexists{shortweekdayname}% {% \csuse{DTM\TrackedLanguageFromDialect{\languagename}shortweekdayname}% {#1}% }% {% % \end{macrocode} % Can't find no-case change version either, so use \sty{pgfcalendar} % command instead (which will need a case-change applied). % \begin{macrocode} \dtmnamewarning{\DTMshortWeekdayname}% % \end{macrocode} % If \sty{mfirstuc} has been loaded, use it. % \begin{macrocode} \ifdef\emakefirstuc {% \emakefirstuc{\pgfcalendarweekdayshortname{#1}}% }% {% % \end{macrocode} % Hasn't been loaded, so just expand and apply \cs{MakeUppercase}: % \begin{macrocode} \protected@edef\dtm@tmp@weekdayname{% \pgfcalendarweekdayshortname{#1}}% \expandafter\MakeUppercase\dtm@tmp@weekdayname }% }% }% }% }% } % \end{macrocode} %\end{macro} % %\begin{macro}{\DTMordinal} %\changes{1.3}{2016-01-22}{new} % \begin{macrocode} \newrobustcmd{\DTMordinal}[1]{% % \end{macrocode} % First check if \cs{DTM\meta{language}ordinal} exists. % \begin{macrocode} \ifcsdef{DTM\languagename ordinal}% {% % \end{macrocode} % It exists, so use it. % \begin{macrocode} \csuse{DTM\languagename ordinal}{#1}% }% {% % \end{macrocode} % Try obtaining the language name from the dialect using % \sty{tracklang}'s interface. % \begin{macrocode} \dtm@ifdianameexists{ordinal}% {% % \end{macrocode} % It exists, so use it. % \begin{macrocode} \csuse{DTM\TrackedLanguageFromDialect{\languagename}ordinal}{#1}% }% {% % \end{macrocode} % Can't determine the language name macro. This may be because the % actual name can't be determined or it could be because the % relevant language module can't be loaded so just display the % number. % \begin{macrocode} \number#1 }% }% } % \end{macrocode} %\end{macro} % %\begin{macro}{\dtmnamewarning} %\changes{1.3}{2016-01-22}{new} % Issue warning unless warnings have been suppressed. % \begin{macrocode} \newcommand*{\dtmnamewarning}[1]{% \if@dtm@warn \PackageWarning{datetime2-calc}% {Can't find underlying language macro for \MessageBreak \string#1\space(language: \languagename); \MessageBreak using pgfcalendar macro instead}% \fi } % \end{macrocode} %\end{macro} %\iffalse % \begin{macrocode} % % \end{macrocode} %\fi %\Finale \endinput