一个比较奇怪的问题:带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 回答1

2
<p>datetime2-calc.sty 里重定义了\@dtm@parsedate,所以你输入的2008-8-8在这个过程中会被转换到ISO格式。而在我的机上 \today 也一样强制为两位,即 Year: 2019 Month: 08 Day: 22.</p><p>即使不载入datetime2-calc 或启用 calc 选项,以下代码也一样会让月/日显示为2位数字:</p><p><br></p><p style="margin-top: 0px; margin-bottom: 0px;"><!--StartFragment--></p><pre class="brush:plain;toolbar:false">\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}</pre><p style="margin-top: 0px; margin-bottom: 0px;"></p><p><br></p><p>那么要如何确保1–9月、1–9日是以1位数显示?我看了一下datetime2宏包里的范例,提到了\number:</p><p><img src="/data/ueditor/php/upload/image/20190822/1566441528300932.png" title="1566441528300932.png" alt="Screenshot 2019-08-22 at 10.37.28 AM.png"></p><p><br></p><p>因此把你的代码稍作修改,给##2和##3加上\number,就成了。</p><pre class="brush:plain;toolbar:false">\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}% }</pre><p><br></p>

你的回答

请登录后回答

你的回答将会帮助更多人,请务必认真回答问题。