本地化日期范围

本地化日期范围

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。首先,我必须检查要使用三个不同分支中的哪一个:

  1. 同月同年(\dayrange

  2. 同年(\monthrange

  3. 跨越一年的界限 ( \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 中,我展示了三个分支,分别代表britishfrenchportuges语言风格。

\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}

在此处输入图片描述

相关内容