\today 的重新定义——与 babel 的冲突

\today 的重新定义——与 babel 的冲突

我希望日历日期的格式为 DD.MM.YYYY

因为我来自德国,所以我使用\usepackage[ngerman]{babel}babel这会破坏我对 的重新定义\today以使用前导零,我不知道为什么我无法重新定义它。如果babel被注释掉,它就可以正常工作。但可以定义一个产生所需格式的新命令,请参阅下面的 MWE。有人能解释一下为什么不能重新定义吗\today?重新定义它是否安全,或者我是否可以分解一些依赖于 的东西,\today这样会更明智\todayx

平均能量损失

\documentclass{scrbook}
\usepackage[ngerman]{babel}
\newcommand{\leadingzero}[1]{\ifnum #1<10 0\the#1\else\the#1\fi}
\renewcommand{\today}{\leadingzero{\day}.\leadingzero{\month}.\the\year}
\newcommand{\todayx}{\leadingzero{\day}.\leadingzero{\month}.\the\year}
\begin{document}
\today \\
\todayx
\end{document}

答案1

babel在开始时就进行定义\begin{document},因此即使\today重新定义 \usepackage{babel}这还不够,但将其放在\AtBeginDocument- 钩子中就可以了。这不需要额外的软件包(尽管有很好的软件包,例如datetimedatetime2!)

\documentclass{scrbook}
\usepackage[ngerman]{babel}

\newcommand{\leadingzero}[1]{\ifnum #1<10 0\the#1\else\the#1\fi}
\AtBeginDocument{%
\renewcommand{\today}{\leadingzero{\day}.\leadingzero{\month}.\the\year}
\newcommand{\todayx}{\leadingzero{\day}.\leadingzero{\month}.\the\year}
}
\begin{document}
\parindent=0em
\today 

\todayx
\end{document}

在此处输入图片描述

答案2

您可以datetime使用ddmmyyyy选项和\renewcommand{\dateseparator}{.}分隔符来加载包。

输出

在此处输入图片描述

代码

\documentclass{scrbook}
\usepackage[ngerman]{babel}
\usepackage[ddmmyyyy]{datetime}
\renewcommand{\dateseparator}{.}

\setlength{\parindent}{0cm}

\newcommand{\leadingzero}[1]{\ifnum #1<10 0\the#1\else\the#1\fi}
%\renewcommand{\today}{\leadingzero{\day}.\leadingzero{\month}.\the\year}
\newcommand{\todayx}{\leadingzero{\day}.\leadingzero{\month}.\the\year}

\begin{document}
Today: \today

Todayx: \todayx
\end{document}

答案3

为了完整起见,下面是datetime2解决方案,但请注意,虽然它使用了一种基本数字样式,但它也需要datetime2-german(隐式加载)以防止干扰babel

\documentclass{scrbook}

\usepackage[ngerman]{babel}
\usepackage[style=ddmmyyyy,datesep=.]{datetime2}

\begin{document}
\today
\end{document}

生成:

2016 年 8 月 24 日

相关内容