答案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}
生成:
编辑:
日期样式设计为可扩展的,因此\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}
目录看起来不错:
页眉无法将日期转换为大写(因为它很强大)并且还使用了错误的语言:
PDF 书签无法处理强大的命令,因此书签使用参数中给出的数字形式\DTMdate
:
现在修改示例以使用\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}
目录页与以前相同,但下一页的页眉现在是正确的(语言和大小写):
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}