考虑以下代码:
\documentclass[british]{article}
\usepackage{babel}
\usepackage[utf8]{inputenc}
\usepackage{datetime2}
\DTMsetup{useregional}
\DTMlangsetup[en-GB]{ord=raise}
\begin{document}
\today
\end{document}
正如预期,结果如下:
也许有些天真,我希望以下代码产生相同的结果:
\documentclass[british]{article}
\usepackage{babel}
\usepackage[utf8]{inputenc}
\usepackage{datetime2}
\DTMsetup{useregional}
\DTMlangsetup[british]{ord=raise}
\begin{document}
\today
\end{document}
但它没有:
的文档datetime2
确实表明语言别名可能并不完全相同。我不明白的是如何从概念上区分它们。例如,该包在和之间做出了什么原则性区分british
,en-GB
这可以解释表面上的差异吗?
答案1
简短回答:
如果要调整特定datetime2
模块的样式,则需要使用该模块的名称。因此,对于模块en-GB
(由 定义datetime2-en-GB.ldf
),您需要使用en-GB
作为标识符。请注意,您也可以这样做:
\documentclass{article}
\usepackage[british]{babel}
\usepackage[useregional,warn=false]{datetime2}
\DTMlangsetup{ord=raise}
\begin{document}
\today
\end{document}
语言别名由其tracklang
内部使用来datetime2
确定所需的语言/区域模块,因此它是一个babel
别名而不是datetime2
别名。
长答案:
尽管我很喜欢 LaTeX,但它的国际化支持却很混乱。这可能是由于它的年代久远以及在它刚开发出来时计算机普遍缺乏一致的本地化支持¹(在 TeX 开发时更是如此)。这导致了国际化分支的碎片化和不兼容。因此,有具有babel
自己一组别名的软件包(例如british
和UKenglish
),polyglossia
具有不同界面和一些不同别名的软件包(例如variant=british
或variant=uk
),translator
有另一组别名(BritishEnglish
),然后有针对特定语言的软件包,例如ngerman
。还有一些我听说过但从未使用过的与语言相关的软件包,我怀疑还有一些我不仅从未使用过而且从未听说过的软件包。
除此之外,还有一些类和包提供具有不同语法的自己的语言支持。例如,isodoc
类具有语法language=en-GB
(或language=enGB
)。
这对于想要添加国际支持而又不强迫用户使用特定语言包(例如)的包开发人员来说简直是一场噩梦。最终babel
会得到一堆复杂的\@ifpackageloaded{polyglossia}
...... (我错过了哪些!)\@ifpackageloaded{babel}
\@ifpackageloaded{translator}
简单的解决方案是告诉用户为每个提供本地化的包提供所需的语言变体:
\documentclass{article}
\usepackage[UKenglish]{babel}
\usepackage[british]{some-package}
\usepackage[language=en-GB]{some-other-package}
或者:
\documentclass{article}
\usepackage{polyglossia}
\setdefaultlanguage[variant=uk]{english}
\usepackage[british]{some-package}
\usepackage[language=en-GB]{some-other-package}
这使得 LaTeX 远远落后于现代替代品。文档语言和地区最好在全球范围内设置,这样所有提供区域支持的软件包就不必费尽心思去找出这些信息,也不必要求用户重复这些信息。
正是出于这个原因,我写了tracklang
帮助软件包开发人员追踪用户请求的语言和区域选项,而无需用大量嵌套条件来增加代码负担。不幸的是,有些语言软件包没有提供方便的方式来tracklang
获取用户提供的区域变体,因此它受到限制。
例如,polyglossia
有一个条件,当和时\if@british@locale
,该条件设置为真,否则为假。如果此条件为真,它不会告诉我用户是否使用了或。如果条件为假,它不会告诉我用户是否使用了、、等。variant=uk
variant=british
uk
british
australian
newzealand
us
所以british
/UKenglish
是巴别塔别名,british
/uk
是多语别名,BritishEnglish
是翻译british
设置等。因此,尽管我可以提供从到的映射或从到的en-GB
映射,但我还需要为其他每个可能的语言包添加别名,否则用户会感到困惑为什么某些别名有效而其他则无效,而这实际上是不可行的,因为我必须不断监视所有语言包的开发。UKenglish
en-GB
对于 来说,还有一个更复杂的问题datetime2
,即 等提供的区域变体babel
并不polyglossia
总是足够具体。
假设我在英国用英语写一份文件,我想显示包括时区在内的时间。(为简单起见,下面的示例仅使用\DTMdisplayzone
但在实际文档中,这更可能使用类似这样的命令\DTMnow
。)
\documentclass{article}
\usepackage[british]{babel}
\usepackage[useregional]{datetime2}
\begin{document}
UTC+0: \DTMdisplayzone{00}{00}.
UTC+1: \DTMdisplayzone{01}{00}.
\end{document}
得出的结果为:
UTC+0:GMT。 UTC+1:BST。
但是,假设我在爱尔兰共和国,正在用英语撰写文档。UTC+1 的时区映射现在不正确,因为它应该是 IST(爱尔兰夏令时)而不是 BST(英国夏令时),因此在这种情况下,除了政治敏感性之外,这british
是一个合适的选择,而且它确实需要:
\documentclass{article}
\usepackage[english]{babel}
\usepackage[en-IE]{datetime2}
\begin{document}
UTC+0: \DTMdisplayzone{00}{00}.
UTC+1: \DTMdisplayzone{01}{00}.
\end{document}
现在产生:
UTC+0:GMT。 UTC+1: IST。
该文件datetime2-en-GB.ldf
不再被加载,而是datetime2-en-IE.ldf
被加载,并且的可选参数中使用的样式设置\DTMlangsetup
现在应该是en-IE
。
类似地,如果我在马耳他,我需要使用en-MT
将 UTC+1 时区显示为 CET.²
因此british
别名可能会产生歧义,我认为更好的做法是了解区域模块的实际名称或只是省略可选参数\DTMlangsetup
,因为这使得代码在使用不同别名的文档中重复使用时更具可移植性。
¹如果我没记错的话,LaTeX2.09 甚至没有这样的命令\contentsname
。它们当然没有列在 1986 年 2.09 用户手册的索引中。
datetime2
²由于我的世界知识有限,所以并非所有语言模块都具有带有 ISO 代码的区域变体,但我希望这些模块的维护者能够填补因我的无知而造成的空白。