biblatex
(使用biber
)支持所有类型的日期信息,包括范围。日期遵循 ISO 8601,这很棒,而且它们已本地化(与 配合良好babel
)。
我想获取文本中的本地化日期范围,而不是与bib
条目相关的日期范围。基本上,这biblatex
是处理日期的方式,但不在使用参考书目时。我想做类似的事情\datecommand{2012-10-01/2012-10-12)
并获取
2012年10月1日至12日
然后切换到portuges
并获取
1–12出局。 2012年
以此类推,其他语言也是如此。我尝试了两种方法,但都无济于事:
datetime2
:已本地化,但没有日期范围(我已经看到了如何创建日期范围的代码,但我认为需要为每种语言重写它)isodate
:日期范围,但除了几种英语变体和几种(但不多)语言之外没有本地化;它没有涵盖我需要的所有语言。
有什么明显的方法可以实现我想要的效果吗?
答案1
那么你可以使用 biblatex + biber:
\documentclass{article}
\usepackage{biblatex}
\addbibresource{autogenerated-dates.bib}
\newwrite\mydates
\newcounter{datecnt}
\NewDocumentCommand\datecommand {m}
{%
\stepcounter{datecnt}%
\immediate\write\mydates{@misc{date\thedatecnt,date={#1}}}%
\citedate{date\thedatecnt}%
}
\AtBeginDocument{\immediate\openout\mydates=autogenerated-dates.bib}
\AtEndDocument{\immediate\closeout\mydates}
\begin{document}
\datecommand{2012-10-01/2012-10-12}
\datecommand{2018/2020}
\end{document}
答案2
按照 OP 的要求,这里的策略有几个组成部分需要开发\datecommand
。首先,我必须检查要使用三个不同分支中的哪一个:
同月同年(
\dayrange
)同年(
\monthrange
)跨越一年的界限 (
\yearrange
}
然后,对于分支 1 和 2,我必须开发特殊例程来覆盖 所采用的检查和行为datetime2
。最后,我发现一个\DTMifbool
带有四个参数的例程用于排版各个部分。因此,我必须在需要时有选择地用替代方案替换此宏。
在案例 1 中,我必须将参数#2
与字符串进行比较showdayofmonth
。如果找到匹配项,我会将其替换\DTMifbool
为\altADTMifbool
,这样就不会检查日期的格式,因此我可以用类似这样的范围替换日期1--12
。替换还阻止打印日期的后缀st
,例如nd
和。rd
在案例 2 中,我必须将参数#2
与字符串进行比较showyear
。如果找到匹配项,我会将其替换DTMifbool
为\altBDTMifbool
,这基本上会完全关闭调用,因此不会打印分隔符或年份(示例de 2012
)。然后我恢复\DTMifbool
并最终使用-- <closing date>
/
对于情况 3,我简单排版一下<opening date> -- <closing date>
。
在 MWE 中,我展示了三个分支,分别代表british
、french
和portuges
语言风格。
\documentclass{article}
\usepackage[french,british,portuges]{babel}
\usepackage[useregional,calc]{datetime2}
%%%%%%%%%%%%% WORKS FOR LUA + XELATEX + PDFLATEX ENGINES
%\usepackage{pdftexcmds}
%\makeatletter
%\let\strcmp\pdf@strcmp
%\makeatother
%%%%%%%%%%%%% WORKS ONLY FOR PDFLATEX AND XELATEX ENGINES
\let\strcmp\pdfstrcmp
%%%%%%%%%%%%% END
\DTMusemodule{british}{en-GB}
\DTMusemodule{french}{french}
\DTMusemodule{portuges}{portuges}
\newcommand\datecommand[1]{\dcaux(#1)}
\def\dcaux(#1-#2-#3/#4-#5-#6){%
\ifnum\strcmp{#1}{#4}=0\relax
\ifnum\strcmp{#2}{#5}=0\relax
\dayrange{#1}{#2}{#3}{#6}%
\else
\monthrange{#1}{#2}{#3}{#5}{#6}%
\fi
\else
\yearrange{#1}{#2}{#3}{#4}{#5}{#6}%
\fi
}
\let\svDTMifbool\DTMifbool
\newcommand\altADTMifbool[4]{%
\ifnum\strcmp{#2}{showdayofmonth}=0\relax
\expandafter\noparsedayofmonth
\else
\svDTMifbool{#1}{#2}{#3}{#4}%
\fi
}
\newcommand\altBDTMifbool[4]{%
\ifnum\strcmp{#2}{showyear}=0\relax
\else
\svDTMifbool{#1}{#2}{#3}{#4}%
\fi
}
\newcommand\dayrange[4]{%
\begingroup
\let\DTMifbool\altADTMifbool
\def\noparsedayofmonth{\number#3--\number#4\ }%
\DTMdate{#1-#2-1}
\endgroup
}
\newcommand\monthrange[5]{%
\begingroup
\let\DTMifbool\altBDTMifbool
\DTMdate{#1-#2-#3}
\endgroup
-- \DTMdate{#1-#4-#5}%
}
\newcommand\yearrange[6]{%
\DTMdate{#1-#2-#3} -- \DTMdate{#4-#5-#6}%
}
\begin{document}
\newcommand\branchtests{%
\par\datecommand{2012-10-01/2012-10-12}
\par\datecommand{2012-10-01/2012-11-3}
\par\datecommand{2012-10-01/2013-1-4}\par}
\selectlanguage{british}\branchtests
\hrulefill\selectlanguage{french}\branchtests
\hrulefill\selectlanguage{portuges}\branchtests
\end{document}