带calc选项的datetime2宏包会修改已定义的日期格式

2019-08-21 17:25发布

一个比较奇怪的问题:带calc选项的datetime2宏包(或者先后加载datetime2 和datetime2-calc)会修改已定义的日期格式。原本以1位数字表示的月与日会被强制改成2位数字,但是...

一个比较奇怪的问题:带calc选项的datetime2宏包(或者先后加载datetime2 和datetime2-calc)会修改已定义的日期格式。原本以1位数字表示的月与日会被强制改成2位数字,但是,\today 的日期样式却是正常的。我试图去看源代码,但是能力有限,不知道有谁能解释一下原因。mwe 如下:

\documentclass{article}
\usepackage[calc]{datetime2}
%\usepackage{datetime2}       
\DTMnewdatestyle{myyyymd}{%
\renewcommand*{\DTMdisplaydate}[4]{%
Year:\makebox[3.2em][c]{##1}Month:\makebox[1.6em]{##2}Day:\makebox[1.6em]{##3}}
\renewcommand*{\DTMDisplaydate}{\DTMdisplaydate}%
}

\DTMsavedate{mydate}{2008-8-8}
\DTMsavedate{anniversary}{2018-8-8}

\begin{document}
\DTMsetdatestyle{myyyymd}
\DTMusedate{mydate}

\DTMusedate{anniversary}

\today
\end{document}


1条回答
E降调
2019-08-22 10:40 .采纳回答

datetime2-calc.sty 里重定义了\@dtm@parsedate,所以你输入的2008-8-8在这个过程中会被转换到ISO格式。而在我的机上 \today 也一样强制为两位,即 Year: 2019 Month: 08 Day: 22.

即使不载入datetime2-calc 或启用 calc 选项,以下代码也一样会让月/日显示为2位数字:


\documentclass{article}
\usepackage{datetime2}

%% 这个必须有因为要用到 \pgfcalendarjulianblahblahblah
\usepackage{pgfcalendar}

%% datetime2-calc.sty 里对\@dtm@parsedate的重定义
\makeatletter
\newcount\@dtm@julianday
\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@}%
}
\makeatother

%% 你的新日期格式
\DTMnewdatestyle{myyyymd}{%
\renewcommand*{\DTMdisplaydate}[4]{%
Year:\makebox[3.2em][c]{##1}
Month:\makebox[1.6em]{##2}
Day:\makebox[1.6em]{##3}}
\renewcommand*{\DTMDisplaydate}{\DTMdisplaydate}%
}

\DTMsavedate{mydate}{2008-8-8}
\begin{document}
\DTMusedate{mydate}
\today
\end{document}


那么要如何确保1–9月、1–9日是以1位数显示?我看了一下datetime2宏包里的范例,提到了\number:

Screenshot 2019-08-22 at 10.37.28 AM.png


因此把你的代码稍作修改,给##2和##3加上\number,就成了。

\DTMnewdatestyle{myyyymd}{%
\renewcommand*{\DTMdisplaydate}[4]{%
Year:\makebox[3.2em][c]{##1}
Month:\makebox[1.6em]{\number##2}     %% 这里
Day:\makebox[1.6em]{\number##3}}      %% 和这里
\renewcommand*{\DTMDisplaydate}{\DTMdisplaydate}%
}


一周热门 更多>