如何在 datetime2 中提取月份名称?

如何在 datetime2 中提取月份名称?

在 中datetime,有一个宏提供了月份的长名称,因此,如果我将日期保存为 ,gitdate则可以通过以下方式提取月份名称:

\monthname{\getdatemonth{gitdate}}

有没有类似的东西datetime2?我在手册中找不到任何东西,所以我尝试了

\DTMfetchmonthname{gitdate}

但这有点乐观。

当然,我很欣赏这datetime2给故事带来了更多的严谨性,而国际月份名称可能会有点令人紧张,但我满怀希望。


到目前为止的两个答案(@cfr 和 @egreg,按字母顺序排列)都很棒(+1),但并没有完全解决我的问题。babel(或者我更喜欢polyglossia)对于一个简单的单语文档来说,似乎要背负很多负担。如果没有这些包,如果有一个“合理的默认值”,那就“更好”了。


我可以确认@cfr 的解决方案可以babel正确使用。

不幸的是,替代polyglossia似乎babel失败了。

答案1

如果相关模块支持,您可以使用该模块提供的命令针对特定语言或变体执行此操作。如果没有完整的示例,我无法判断这是否适合您的情况,因为我不知道您的前言是什么。

例如,对于英式英语,我可以这样做:

\documentclass[british]{article}
\usepackage{babel}
\usepackage[utf8]{inputenc}
\usepackage{datetime2}
\DTMsetup{useregional}

\begin{document}
\DTMsavenow{thisone}
\DTMenglishmonthname{\DTMfetchmonth{thisone}}
\end{document}

排版当前月份的奇特方法

\DTMenglishmonthname显然是针对所支持的各种英语变体的datetime2-english。另一种语言模块可能不提供类似的功能 - 它只是取决于特定的模块。

威尔士语也有类似的功能,尽管具体命令明显不同:

\documentclass[welsh]{article}
\usepackage{babel}
\usepackage[utf8]{inputenc}
\usepackage{datetime2}
\DTMsetup{useregional}

\begin{document}
\DTMsavenow{thisone}
\DTMwelshmonthname{\DTMfetchmonth{thisone}}
\end{document}

奥斯特

不过,似乎没有与语言无关的用户级宏来检索月份名称。但也许有,只是我没有看到——正如我所说,我在过渡到的尝试中失败了,datetime2因此仍在使用datetime

答案2

我在 v1.3 发布后更新了这个答案datetime2

  1. 每个语言模块都提供一个命令,形式为\DTMmonthname在哪里是根语言名称(例如\DTMfrenchmonthnameprovided bydatetime2-french\DTMenglishmonthnameprovided by datetime2-english)。此命令具有必需参数,可在可扩展上下文中使用。它类似于datetime\monthname语言命令(例如\monthnamefrenchprovided bydt-french.def\monthnameenglishprovided by datetime-defaults.sty)。datetime版本不能在可扩展上下文中使用,并且具有可选参数。

    一些语言模块可能还提供替代命令。例如,datetime2-usorbian模块提供\DTMusorbiannewmonthname\DTMusorbianoldmonthnamedatetime2-serbian模块提供\DTMserbiancyrmonthname\DTMserbianlatinmonthname。在这些情况下,\DTMmonthname设置为默认命令。这可以通过语言模块选项(例如模块style的键usorbian或模块alphabet的键serbian)进行更改。

例子:

\documentclass{article}

\usepackage[french,british]{babel}
\usepackage{datetime2}
\usepackage[colorlinks]{hyperref}

\pagestyle{headings}

\begin{document}

\tableofcontents

\clearpage

\section{\DTMenglishmonthname{1} (English)}

\section{\DTMfrenchmonthname{1} (French)}

\end{document}

这产生了

目录图像

在第一页,

第二页的图片

在第二页。PDF 书签正确显示:

书签图片

为了比较,类似的datetime代码是:

\documentclass{article}

\usepackage[french,british]{babel}
\usepackage{datetime}
\usepackage[colorlinks]{hyperref}

\pagestyle{headings}

\begin{document}

\tableofcontents

\clearpage

\section{\monthnameenglish[1] (English)}

\section{\monthnamefrench[1] (French)}

\end{document}

第一页看起来与datetime2示例相同,但第二页不正确,因为标题中的月份名称尚未转换为大写:

第二页的图片

PDF 书签也不正确:

PDF 书签图像

  1. 由于datetime2-calc自动加载pgfcalendar包,您可以使用该包提供的月份名称命令,因此与的命令\pgfcalendarmonthname最接近,但它需要该包。datetime\monthnametranslator

修改上面的例子:

\documentclass[french,british]{article}

\usepackage{babel}
\usepackage{translator}
\usepackage[calc]{datetime2}
\usepackage[colorlinks]{hyperref}

\pagestyle{headings}

\begin{document}

\tableofcontents

\clearpage

\selectlanguage{british}
\section{\pgfcalendarmonthname{1} (English)}

\selectlanguage{french}
\section{\pgfcalendarmonthname{1} (French)}

\end{document}

这产生了

目录图像

在第一页

第二页的图片

在第二页,但 PDF 书签不正确:

PDF 书签图像

hyperref由于无法处理,因此会产生警告\translate

datetime此示例的等效版本是

\documentclass[french,british]{article}

\usepackage{babel}
\usepackage{datetime}
\usepackage[colorlinks]{hyperref}

\pagestyle{headings}

\begin{document}

\tableofcontents

\clearpage

\selectlanguage{british}
\section{\monthname[1] (English)}

\selectlanguage{french}
\section{\monthname[1] (French)}

\end{document}

这产生了

目录图像

在第一页

第二页的图片

在第二页。页眉再次不正确,因为\monthname无法转换为大写。PDF 书签也不正确:

PDF 书签图像

  1. 从 1.3 版开始,该datetime2-calc软件包现在提供\DTMmonthname,这是最接近 的datetime命令\monthname。这个新命令非常强大,其工作原理如下:它会尝试确定\DTMmonthname存在,首先设置为\languagename,如果失败,则使用设置为\TrackedLanguageFromDialect{\languagename}。如果命令\DTMmonthname命令存在,则使用它。如果不存在,则\pgfcalendarmonthname使用该命令并发出警告。(如果出现这种情况,很可能意味着datetime2尚未安装或加载相应的语言模块。)

将前面的示例从 调整datetimedatetime2

\documentclass[french,british]{article}

\usepackage{babel}
\usepackage[calc]{datetime2}
\usepackage[colorlinks]{hyperref}

\pagestyle{headings}

\begin{document}

\tableofcontents

\clearpage

\selectlanguage{british}
\section{\DTMmonthname{1} (English)}

\selectlanguage{french}
\section{\DTMmonthname{1} (French)}

\end{document}

这几乎产生了与上一个datetime示例相同的结果。唯一的区别在于 PDF 书签,这又是错误的,但错误的方式略有不同:

PDF 书签图像

因此最接近的匹配\monthname[n]\DTMmonthname{n},它具有与原始命令相同的缺点datetime


原始答案

我故意避免使用通用月份名称宏,datetime2因为datetime当用户使用一种语言语法的样式(覆盖babel的日期切换机制)但月份名称来自当前使用的语言(因为样式使用\monthname)时,它会导致问题。基础datetime2包只处理数字样式,我的目的是确保所有语言/区域设置都由语言模块处理。(选项showdow是例外,请参阅showdow 在 datetime2 中如何工作?)我特别想谈的要点有三个:

  1. 防止意外混淆语法和翻译的固定名称。
  2. 在实现月份名称时允许语言模块具有灵活性,因为某些语言有替代的月份名称(就像最近的一个问题一样) 或其他样式。也许语言模块可能会提供“新样式”和“旧样式”日期格式。这种变化使简单的\monthname映射变得更加复杂和不直观。
  3. 确保日期样式完全可扩展(尽可能),以允许在 PDF 书签中使用。如果语言模块尚未加载并且您尝试使用,会发生什么\csname DTM\languagename monthname?默默忽略它(并使用户感到困惑)或发出警告或错误(在这种情况下,这可能会在某些情况下导致更模糊的错误)。

但是,由于语言模块提供了设置showdayofmonthshowyear,因此您可以通过将两者都设置为来仅获取月份名称false。例如:

\documentclass[french]{article}

\usepackage[T1]{fontenc}
\usepackage{babel}
\usepackage[warn=false,useregional]{datetime2}

\DTMlangsetup{showdayofmonth=false,showyear=false}

\begin{document}

\edef\thismonth{\today}
\show\thismonth

\end{document}

这也适用于polyglossia

\documentclass[french]{article}

\usepackage{polyglossia}
\usepackage[warn=false,useregional]{datetime2}

\DTMlangsetup{showdayofmonth=false,showyear=false}

\begin{document}

\edef\thismonth{\today}
\show\thismonth

\end{document}

编辑:

还有另一种可能的解决方案:

\documentclass[french]{article}

\usepackage[T1]{fontenc}
\usepackage{babel}
\usepackage{translator}
\usepackage[calc]{datetime2}

\begin{document}

\pgfcalendarmonthname{\month}

\end{document}

这是因为datetime2-calc负载pgfcalendar,但我不知道它是否支持polyglossia

答案3

我认为,该datetime2包应该为宏添加一个接口\DTM<language>monthname(以及星期几宏)。以下是一次尝试:

\documentclass{article}
\usepackage[ngerman,english]{babel}
\usepackage[ngerman,english]{datetime2}

\addto\extrasenglish{\def\DTMlanguagename{english}}
\addto\extrasngerman{\def\DTMlanguagename{german}}
\newcommand{\DTMmonthname}{\csname DTM\DTMlanguagename monthname\endcsname}

\DTMsavedate{bach}{1685-3-21}

\begin{document}

J. S. Bach was born in \DTMmonthname{\DTMfetchmonth{bach}}.

\selectlanguage{ngerman}

J. S. Bach wurde im \DTMmonthname{\DTMfetchmonth{bach}} geboren.

\end{document}

在此处输入图片描述

相关内容