如果日期数字在日期时间之后加载,则日期格式错误

如果日期数字在日期时间之后加载,则日期格式错误

同时使用datetime和 并在 之后加载,日期格式错误。datenumberdatenumberdatetime

可以使用以下 MWE 进行测试:

\documentclass{article}
\usepackage{datetime}
\usepackage[english]{datenumber}
\begin{document}
\section{Package datenumber}
\begin{itemize}
  \item \setdate{2015}{1}{21}
    \datedate
  \item \setdate{2015}{1}{22}
    \datedate
  \item \setdate{2015}{1}{23}
    \datedate
  \item \setdate{2015}{1}{31}
    \datedate
\end{itemize}

\section{Package datetime}
\begin{itemize}
\item \newdate{21}{21}{1}{2015}
  \displaydate{21}
\item \newdate{22}{22}{1}{2015}
  \displaydate{22}
\item \newdate{23}{23}{1}{2015}
  \displaydate{23}
\item \newdate{31}{31}{1}{2015}
  \displaydate{31}
\end{itemize}
\end{document}
  • datenumber未加载时,datetime将 21、22、23 和 31 的序数显示为 21 st、 22 nd、 23 rd和 31 st,与 UKenglish 的预期一致;

  • datetime未加载时,datenumber将 21、22、23 和 31 的序数显示为 21st、22nd、23rd 和 31st,与 UKenglish 的预期一致;

  • datenumberdatetime按此顺序加载时,会出现错误:

     ! You can't use `the character 2' after \advance.
     <argument> 2
                 015
     l.9 \item \setdate{2015}{1}{21}
    

    已报告datetime 和 datenumber 包冲突吗?出现;

  • 当按此顺序加载 datetime 和 datenumber 时,21、22、23 和 31 的序数显示为:

    • 按日期编号排列为 21、22、23 和 31,与 UKenglish 的预期一致;
    • 按日期时间排列为21、22、23和 31,这是错误的。

答案1

两个包都定义了一个\@modulo宏。更准确地说,datetime需要包fmtcount并从那里获取它,而同时datenumber给出了自己的定义。

$ latexdef -p datetime @modulo

\@modulo:
macro:#1#2->\@DT@modctr =#1\relax \divide \@DT@modctr by #2\relax \multiply \@DT@modctr by #2\relax \advance #1 by -\@DT@modctr 

$ latexdef -p datenumber @modulo

\@modulo:
macro:#1#2->\@nom =#1\relax \@den =#2\relax \divide \@nom by \@den \multiply \@nom by \@den \@den =#1\advance \@den by -\@nom 

这大概就是不兼容的根源。

将加载包装为datenumber

\makeatletter
\let\@modulo@SAVED\@modulo
\usepackage[english]{datenumber}
\let\DATENUMBER@modulo\@modulo
\def\setdaynamebynumber#1{%
  \@tempcnta=#1\relax
  \ifnum\the@startyear=1800\advance \@tempcnta by 1\fi
  \ifnum\the@startyear=1900\advance \@tempcnta by 6\fi
  \ifnum\the@startyear=2000\advance \@tempcnta by 4\fi
  \DATENUMBER@modulo{\the\@tempcnta}{7}%
  \setcounter{datedayname}{\the\@den}%
  \addtocounter{datedayname}{1}%
  \setdayname{\thedatedayname}%
}
\def\ifleapyear#1{%#1 year
  \ifnum#1>1500
    \DATENUMBER@modulo{#1}{100}%
    \ifnum\@den=0
      \DATENUMBER@modulo{#1}{400}%
    \else
      \DATENUMBER@modulo{#1}{4}%
    \fi
  \else
    \DATENUMBER@modulo{#1}{4}%
  \fi
  \ifnum\@den=0
}
\let\@modulo\@modulo@SAVED
\makeatother

那么在 之前或 之后加载它都没关系datetime

答案2

定义自己的模函数:

\documentclass{article}
\usepackage[english]{datenumber}
\makeatletter 
\let\dn@modulo\@modulo
\makeatother
\usepackage{datetime}
\makeatletter 
\let\dt@modulo\@modulo
\makeatother

\begin{document}
\section{Package datenumber}
\makeatletter 
\let\@modulo\dn@modulo
\makeatother
\begin{itemize}
  \item \setdate{2015}{1}{21}
    \datedate
  \item \setdate{2015}{1}{22}
    \datedate
  \item \setdate{2015}{1}{23}
    \datedate
  \item \setdate{2015}{1}{31}
    \datedate
\end{itemize}

\makeatletter 
\let\@modulo\dt@modulo
\makeatother
\section{Package datetime}
\begin{itemize}
\item \newdate{21}{21}{1}{2015}
  \displaydate{21}
\item \newdate{22}{22}{1}{2015}
  \displaydate{22}
\item \newdate{23}{23}{1}{2015}
  \displaydate{23}
\item \newdate{31}{31}{1}{2015}
  \displaydate{31}
\end{itemize}
\end{document}

相关内容