我无法理解如何指定日期06-09-2012
(或任何其他数字等价物)以便用立陶宛语打印?有一个包叫做[lithuanian]{babel}
,例如\today
可以正常工作。但我不需要今天的日期,我需要特定的日期,该日期将转换为\longdate
格式并翻译成立陶宛语。我尝试了各种变体,有时它说立陶宛语没有定义星期几和月份。但为什么\today
有效?如果这是真的,那么我如何在文档中手动添加这些星期几,而不破解库本身?
答案1
但是为什么 \today 有效?
在内核和类似babel
或 的软件包中polyglossia
,使用(当前日期) (当前月份数) 和(年份)\today
进行硬编码。例如,默认定义为\day
\month
\year
\ifcase \month \or January\or February\or March\or April\or May\or
June\or July\or August\or September\or October\or November\or
December\fi \space \number \day , \number \year
如果您想要一个具体的日期\day
,一种简单的方法是暂时重新定义。例如:\month
\year
\documentclass{article}
\usepackage{polyglossia}
\setmainlanguage{lithuanian}
\newcommand*{\anotherday}[3]{%
{% scope
\def\year{#1}%
\def\month{#2}%
\def\day{#3}%
\today
}%
}
\begin{document}
\anotherday{1999}{12}{31}
\today
\end{document}
在需要扩展日期的情况下,这种方法不起作用。例如,在 PDF 书签中(如果您使用hyperref
)或者如果您想要将日期戳写入外部文件。在移动参数中,它也需要保护。
理想情况下,最好\today
使用以日、月和年为参数的日期格式化命令。然后可以将此格式化命令用于特定日期。该datetime
包通过如下方式实现此目的\today
:
\formatdate{\day}{\month}{\year}
而datetime2
通过非稳健地重新定义\today
为:
\DTMdisplaydate{\@dtm@currentyear}{\@dtm@currentmonth}{\@dtm@currentday}{\@dtm@currentdow}
这不使用\year
、\month
和\day
,而是使用它自己的内部存储命令,包括星期几索引(默认为-1
,但datetime2-calc
包将使用提供的命令来计算它pgfcalendar
)。
在这种情况下datetime
,格式化命令\formatdate
由日期样式重新定义。语言样式在文件中提供dt-
语言.def
。提供的.def
文件为:
dt-american.def dt-croatian.def dt-greek.def dt-ngerman.def dt-slovene.def
dt-australian.def dt-czech.def dt-hebrew.def dt-norsk.def dt-spanish.def
dt-austrian.def dt-danish.def dt-icelandic.def dt-polish.def dt-swedish.def
dt-bahasa.def dt-dutch.def dt-irish.def dt-portuges.def dt-turkish.def
dt-basque.def dt-esperanto.def dt-italian.def dt-romanian.def dt-UKenglish.def
dt-breton.def dt-estonian.def dt-latin.def dt-russian.def dt-ukraineb.def
dt-british.def dt-finnish.def dt-lsorbian.def dt-samin.def dt-USenglish.def
dt-bulgarian.def dt-french.def dt-magyar.def dt-scottish.def dt-usorbian.def
dt-canadian.def dt-galician.def dt-naustrian.def dt-serbian.def dt-welsh.def
dt-catalan.def dt-german.def dt-newzealand.def dt-slovak.def
这不包括立陶宛语的文件。添加新的支持语言不仅需要新.def
文件,还需要修改datetime.sty
。
该datetime2
软件包取代了datetime
,还使用样式重新定义了\DTMdisplaydate
。基础代码中有一些数字样式可用datetime2.sty
,但语言和区域样式是在独立维护的.ldf
文件中提供的。与 不同datetime
,.ldf
可以在不修改基础datetime2.sty
代码的情况下添加文件。这使用户可以更轻松地添加对自己语言或地区的支持。CTAN 搜索将列出所有支持的语言。
如果您的语言不受支持,这里有一些关于如何添加它的说明。
有两种基本类型的datetime2
.ldf
文件:
- 不受地区限制的仅限语言的支持。例如,
datetime2-scottish
,仅提供日期样式scottish
和scottish-numeric
。 支持特定的语言和区域组合。例如,
datetime2-english
,它提供了无区域english
样式(与的内核定义相匹配\today
),但也提供了多种区域样式。在撰写本文时,这些是:en-GB
(英语 - 大不列颠及北爱尔兰联合王国)en-US
(英语 - 美国)en-CA
(英语 - 加拿大)en-AU
(英语 - 澳大利亚联邦)en-NZ
(英语 - 新西兰)en-GG
(英语 - 根西岛辖区)en-JE
(英语 - 泽西岛辖区)en-IM
(英语 - 马恩岛)en-MT
(英语 - 马耳他共和国)en-IE
(英语 - 爱尔兰共和国)
这些不仅会改变
\DTMdisplaydate
行为方式,还会设置时区映射。例如,样式en-GB
显示 UTC+1,BST
而样式则在时区映射打开时en-IE
显示为。IST
为具有扩展拉丁字符或非拉丁字符的语言提供的日期样式有两个版本:语言-ascii.ldf
和语言-utf8.ldf
。该ascii
版本使用 LaTeX 命令(例如\'
)来生成非 ASCII 字符。该utf8
版本使用 UTF-8 字符。这意味着 XeLaTeX 或 LuaLaTeX 用户可以方便地将日期以易于阅读的格式写入外部非 TeX 文件。
有些样式还可能提供不同的字母。例如,datetime2-serbian
具有西里尔文和拉丁文选项,并提供\DTMserbiancyrmonthname
西里尔文月份名称和\DTMserbianlatinmonthname
拉丁文月份名称。默认月份名称由 提供,\DTMserbianmonthname
其初始化为\DTMserbiancyrmonthname
。该alphabet
设置重新定义\DTMserbianmonthname
。
如果要提供对新语言的支持,最简单的方法是找到现有的风格并进行适当的修改。
例如,我将基于该german
样式(因为它支持 UTF-8)进行一些修改。因此下载datetime2-german.dtx
并另存为datetime2-lithuanian.dtx
,下载datetime2-german.ins
并将其另存为datetime2-lithuanian.ins
并下载README
。
在这三个文件中的每一个中,执行以下区分大小写的全局搜索和替换(确保您的编辑器设置为 UTF-8):
german
->lithuanian
German
->Lithuanian
(如果你想上传到加拿大运输安全局,这将对其他人有所帮助,然后根据需要更改版本号和日期,以及维护者的姓名和文档。请确保设置行尾改为 LF。
在文件中datetime2-lithuanian.dtx
,搜索<*datetime2-lithuanian-utf8.ldf>
。这是 UTF-8 支持的开始。第一个命令是
\newcommand*{\DTMlithuanianordinal}[1]{%
\number#1
}
这是月份中日期数字的显示方式。我不懂立陶宛语,但我从polyglossia
日期的显示方式猜测应该是这样\number#1~d.
的,所以在这里做了适当的更改。
是m.
月份名称的一部分还是年份后缀?如果是年份后缀,请添加
%\begin{macro}{\DTMlithuanianyear}
% \begin{macrocode}
\newcommand*{\DTMlithuanianyear}[1]{%
\number#1 m.%
}
% \end{macrocode}
%\end{macro}
否则,它会进入下一个命令,即\DTMlithuanianmonthname
。使用 UTF-8 字符根据需要替换月份名称。还有一个版本\DTMlithuanianMonthname
,其中第一个字母是大写的。这是因为月份需要在句子开头显示。根据需要替换月份名称。
如果要支持星期几名称,还需要\DTMlithuanianweekdayname
。其格式应为(将英文名称替换为适当的翻译):
%\begin{macro}{\DTMlithuanianweekdayname}
% Day of week names.
% \begin{macrocode}
\newcommand*{\DTMlithuanianweekdayname}[1]{%
\ifcase#1
Monday%
\or
Tuesday%
\or
Wednesday%
\or
Thursday%
\or
Friday%
\or
Saturday%
\or
Sunday%
\fi
}
% \end{macrocode}
%\end{macro}
同样地,提供\DTMlithuanianWeekdayname
首字母大写变体。
如果要提供对缩写的支持,同样定义\DTMlithuanianshortmonthname
、\DTMlithuanianshortMonthname
和。\DTMlithuanianshortweekdayname
\DTMlithuanianshortWeekdayname
该文件的下一部分.dtx
是<*datetime2-lithuanian-ascii.ldf>
。执行与上述相同的操作,但使用 LaTeX 命令而不是 UTF-8 字符。
下一节<*datetime2-lithuanian.ldf>
将提供新的日期样式。有两种样式:一种是文本样式,称为lithuanian
,另一种是数字样式,称为lithuanian-numeric
。首先,它提供了一些命令,允许在 中配置样式\DTMlangsetup
。这些命令需要更改以匹配您的语言样式。例如,文本样式中月份和日期之间的分隔符可以定义为:
\newcommand*{\DTMlithuanianmonthdaysep}{%
\DTMtexorpdfstring{\protect~}{\space}%
}
并且相应的键\DTMlangsetup
定义为:
\DTMdefkey{lithuanian}{monthdaysep}{\renewcommand*{\DTMlithuanianmonthdaysep}{#1}}
布尔设置使用 定义\DTMdefboolkey
。例如:
\DTMdefboolkey{lithuanian}{showdayofmonth}[true]{}
并且可以使用 来设置\DTMsetbool
。例如:
\DTMsetbool{lithuanian}{showdayofmonth}{true}
实际样式是使用 定义的\DTMnewstyle
。这些需要重新定义\DTMdisplaydate
和(用于句子的开头)\DTMDisplaydate
。它们都有四个参数:年份(##1
)、月份数(##2
)、月份中的日期数(##3
)和星期几索引(##4
)。
如果您已定义,\DTMlithuanianyear
则需要将其应用于年份。例如:
\DTMlithuanianyear{##1}%
否则,只需使用\number
:
\number##1 % space intended
可以使用 访问布尔键\DTMifbool
。例如,要确定是否应显示月份中的日期:
\DTMifbool{lithuanian}{showdayofmonth}
{\DTMlithuanianmonthdaysep\DTMlithuanianordinal{##3}}%
{}%
showdow
如果要提供星期名称支持,可以使用查询全局设置\ifDTMshowdow
。请注意,如果星期几索引设置为-1
,则无论设置如何,都应省略星期名称showdow
。例如,en-GB
中的样式datetime2-english.dtx
具有:
\ifDTMshowdow
\ifnum##4>-1
\DTMifbool{en-GB}{abbr}%
{\DTMenglishshortweekdayname{##4}}%
{\DTMenglishweekdayname{##4}}%
\DTMenGBdowdaysep
\fi
\fi
这将查询showdow
设置 ( \ifDTMshowdow
),然后检查星期几索引是否为非负数 ( \ifnum##4>-1
)。这包括对缩写名称的支持。布尔abbr
键可以定义为:
\DTMdefboolkey{lithuanian}{abbr}[true]{}
\DTMsetbool{lithuanian}{abbr}{false}
以及星期名称和月份数字之间的分隔符:
\newcommand*{\DTMlithuaniandowdaysep}{\space}
因此立陶宛法典将包括
\ifDTMshowdow
\ifnum##4>-1
\DTMifbool{lithuanian}{abbr}%
{\DTMlithuanianshortweekdayname{##4}}%
{\DTMlithuanianweekdayname{##4}}%
\DTMlithuaniandowdaysep
\fi
\fi
(当然,如果星期几名称应该位于月份数字之后,则需要对其进行修改。)
完成所有相关更改后,.ldf
可以使用以下命令提取文件:
latex datetime2-lithuanian.ins
对于记录的代码使用:
pdflatex datetime2-lithuanian.dtx
答案2
使用这样的代码。
\documentclass{article}
\usepackage[lithuanian]{babel}
\usepackage{datetime}
\begin{document}
Date in long format so that language variations are prominent.
Today's date: \today.
Now, let us set a new date.
\newdate{ld}{6}{9}{2012}
And display it.
\displaydate{ld}
\end{document}