同时使用datetime
和 并在 之后加载,日期格式错误。datenumber
datenumber
datetime
可以使用以下 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 的预期一致;当
datenumber
和datetime
按此顺序加载时,会出现错误:! You can't use `the character 2' after \advance. <argument> 2 015 l.9 \item \setdate{2015}{1}{21}
当按此顺序加载 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}