使用数字创建自定义日期命令

使用数字创建自定义日期命令

babel有没有办法创建一个自定义命令,从给定的 ISO 8601 格式的日期打印日期(使用指定的语言)?

我希望的是

\today
\customdate{160130} % or \customdate{20160130}

均打印

在此处输入图片描述

答案1

datetime2软件包旨在与语言包(例如babel和 )配合使用polyglossia,但您需要另外安装相关的语言模块。例如,datetime2-english或者datetime2-french。数字样式是默认的,但您可以使用包选项useregional允许语言更改自动更改日期样式。

例子:

\documentclass{article}

\usepackage[T1]{fontenc}
\usepackage[french,british]{babel}
\usepackage[useregional]{datetime2}

\begin{document}
\selectlanguage{british}

\DTMdate{2016-01-30}.

\selectlanguage{french}

\DTMdate{2016-01-30}.

\end{document}

生成:

2016 年 1 月 30 日。2016 年 1 月 30 日

编辑:

日期样式设计为可扩展的,因此\today可以在将信息写入外部文件(如目录或书签)的上下文中使用诸如 之类的命令。\DTMdate是强大的,这意味着它不能扩展,但不需要保护(使用\protect)。 有一个可扩展的替代方案\DTMdisplaydate,但它的语法不同,不符合您的要求。 这些差异可以通过以下示例说明:

\DTMdate

\documentclass{article}

\usepackage[T1]{fontenc}
\usepackage[french,british]{babel}
\usepackage[useregional]{datetime2}
\usepackage[hidelinks]{hyperref}

\pagestyle{headings}

\begin{document}
\tableofcontents
\newpage

\selectlanguage{british}

\section{\DTMdate{2016-01-30} example section}

\selectlanguage{french}

\section{\DTMdate{2016-01-30} example section}

\end{document}

目录看起来不错:

目录图像

页眉无法将日期转换为大写(因为它很强大)并且还使用了错误的语言:

第 2 页图片

PDF 书签无法处理强大的命令,因此书签使用参数中给出的数字形式\DTMdate

2016-01-30 示例部分 2016-01-30 示例部分

现在修改示例以使用\today

\documentclass{article}

\usepackage[T1]{fontenc}
\usepackage[french,british]{babel}
\usepackage[useregional]{datetime2}
\usepackage[hidelinks]{hyperref}

\pagestyle{headings}

\begin{document}
\tableofcontents
\newpage

\selectlanguage{british}

\section{\today\ example section}

\selectlanguage{french}

\section{\today\ example section}

\end{document}

目录页与以前相同,但下一页的页眉现在是正确的(语言和大小写):

第 2 页图片

PDF 书签现在很好:

书签图片

的可扩展版本\DTMdate{2016-01-30}\DTMdisplaydate{2016}{01}{30}{-1}(或\DTMdisplaydate{2016}{01}{30}{5}),其工作方式与 相同\today

另一种方法是先用 存储日期\DTMsavedate,然后用 使用它\DTMusedate,这也是可扩展的:

\documentclass{article}

\usepackage[T1]{fontenc}
\usepackage[french,british]{babel}
\usepackage[useregional]{datetime2}
\usepackage[hidelinks]{hyperref}

\DTMsavedate{mydate}{2016-01-30}

\pagestyle{headings}

\begin{document}
\tableofcontents
\newpage

\selectlanguage{british}

\section{\DTMusedate{mydate} example section}

\selectlanguage{french}

\section{\DTMusedate{mydate} example section}

\end{document}

这会产生与前面的示例相同的结果\today。页眉和 PDF 书签是正确的。

答案2

使用isodate,但以所需的格式提供参数:

\documentclass{article}
\usepackage{xparse}
\usepackage[english]{isodate}

\ExplSyntaxOn
\cs_set_eq:NN \alfredo_date_printdate:n \printdate

\NewDocumentCommand{\customdate}{m}
 {
  \alfredo_date_customdate:n { #1 }
 }

\cs_new_protected:Nn \alfredo_date_customdate:n
 {
  \int_case:nnF { \tl_count:n { #1 } }
   {
    { 6 } { \alfredo_date_customdate_short:n { #1 } }
    { 8 } { \alfredo_date_customdate_long:n { #1 } }
   }
   {BAD~DATE~FORMAT~(#1)}
 }

\cs_new_protected:Nn \alfredo_date_customdate_short:n
 {
  \__alfredo_date_customdate:nnnnnnnn 20#1
 }
\cs_new_protected:Nn \alfredo_date_customdate_long:n
 {
  \__alfredo_date_customdate:nnnnnnnn #1
 }

\cs_new_protected:Nn \__alfredo_date_customdate:nnnnnnnn
 {
  \alfredo_date_printdate:n { #1#2#3#4-#5#6-#7#8 }
 }

\ExplSyntaxOff

\begin{document}

\today

\customdate{160130}

\customdate{20160130}

\customdate{16130}

\end{document}

在此处输入图片描述

答案3

这是我从头开始构建的自定义版本,尽管这会重新发明轮子,因为已经有专用于它的软件包。

输出

在此处输入图片描述

代码

\documentclass{article}
\usepackage{xstring} % for extracting substrings
\usepackage[super]{nth} % for adding cardinal numbers
\usepackage{pgfmath} % for the array

\def\monthlist{{"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"}} 

\newcommand\printmonth[1]{%
    \pgfmathparse{\monthlist[\mmmm-1]}\pgfmathresult\
}

\newcommand\customdate[1]{%
    \StrMid{#1}{5}{6}[\dayx]
    \StrMid{#1}{3}{4}[\monthx]
    \pgfmathsetmacro\mmmm{int(abs(\monthx))}%
    \nth{\dayx}\ \printmonth \protected20\StrMid{#1}{1}{2}
}

\begin{document}  

\customdate{160130}

\customdate{110521}

\customdate{130702}

\customdate{161124}

\end{document} 

相关内容