在 中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
。
每个语言模块都提供一个命令,形式为
\DTM
朗monthname
在哪里朗是根语言名称(例如\DTMfrenchmonthname
provided bydatetime2-french
或\DTMenglishmonthname
provided bydatetime2-english
)。此命令具有必需参数,可在可扩展上下文中使用。它类似于datetime
的\monthname
语言命令(例如\monthnamefrench
provided bydt-french.def
或\monthnameenglish
provided bydatetime-defaults.sty
)。datetime
版本不能在可扩展上下文中使用,并且具有可选参数。一些语言模块可能还提供替代命令。例如,
datetime2-usorbian
模块提供\DTMusorbiannewmonthname
和\DTMusorbianoldmonthname
,datetime2-serbian
模块提供\DTMserbiancyrmonthname
和\DTMserbianlatinmonthname
。在这些情况下,\DTM
朗monthname
设置为默认命令。这可以通过语言模块选项(例如模块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 书签也不正确:
- 由于
datetime2-calc
自动加载pgfcalendar
包,您可以使用该包提供的月份名称命令,因此与的命令\pgfcalendarmonthname
最接近,但它需要该包。datetime
\monthname
translator
修改上面的例子:
\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 书签不正确:
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 书签也不正确:
- 从 1.3 版开始,该
datetime2-calc
软件包现在提供\DTMmonthname
,这是最接近 的datetime
命令\monthname
。这个新命令非常强大,其工作原理如下:它会尝试确定\DTM
朗monthname
存在,首先朗设置为\languagename
,如果失败,则使用朗设置为\TrackedLanguageFromDialect{\languagename}
。如果命令\DTM
朗monthname
命令存在,则使用它。如果不存在,则\pgfcalendarmonthname
使用该命令并发出警告。(如果出现这种情况,很可能意味着datetime2
尚未安装或加载相应的语言模块。)
将前面的示例从 调整datetime
为datetime2
:
\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 书签,这又是错误的,但错误的方式略有不同:
因此最接近的匹配\monthname[
n]
是\DTMmonthname{
n}
,它具有与原始命令相同的缺点datetime
。
原始答案
我故意避免使用通用月份名称宏,datetime2
因为datetime
当用户使用一种语言语法的样式(覆盖babel
的日期切换机制)但月份名称来自当前使用的语言(因为样式使用\monthname
)时,它会导致问题。基础datetime2
包只处理数字样式,我的目的是确保所有语言/区域设置都由语言模块处理。(选项showdow
是例外,请参阅showdow 在 datetime2 中如何工作?)我特别想谈的要点有三个:
- 防止意外混淆语法和翻译的固定名称。
- 在实现月份名称时允许语言模块具有灵活性,因为某些语言有替代的月份名称(就像最近的一个问题一样) 或其他样式。也许语言模块可能会提供“新样式”和“旧样式”日期格式。这种变化使简单的
\monthname
映射变得更加复杂和不直观。 - 确保日期样式完全可扩展(尽可能),以允许在 PDF 书签中使用。如果语言模块尚未加载并且您尝试使用,会发生什么
\csname DTM\languagename monthname
?默默忽略它(并使用户感到困惑)或发出警告或错误(在这种情况下,这可能会在某些情况下导致更模糊的错误)。
但是,由于语言模块提供了设置showdayofmonth
和showyear
,因此您可以通过将两者都设置为来仅获取月份名称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}