我正在构建一个 LaTeX 文档,该文档已从其他文件中获取了日期。日期显示为23 November 2015
示例(由\today
)。然后我需要输出与此原始日期相关的另一个日期。结果日期应始终是下个月或本月的第 15 天,具体取决于原始日期。
例如,如果原始日期为23 November 2015
,即当月 15 日之后,则结果日期应为15 December 2015
。如果原始日期为12 November 2015
,则结果日期应为15 November 2015
。
是否有任何方法可以使用文件中的日期输出进行此类计算?
答案1
针对当前日期设置一些条件,advdate
可用于检索您要查找的日期:
\documentclass{article}
\usepackage{advdate}
\newcommand{\nextfifteenth}[1][\relax]{{%
\ifx\relax#1\relax\else\SetDate[#1]\fi% If a date was specified
\today---%
\ifnum\day<15\else% \day >= 15
\AdvMonth{1}% Move to next month
\fi
\ThisDay{15}% Day will always be 15th
\today
}}
\begin{document}
\today
\nextfifteenth
\nextfifteenth[15/12/2015]
\nextfifteenth[12/12/2012]
\today
\end{document}
12 December 2012
您还可以使用以下命令以文本格式提供日期(例如):
\documentclass{article}
\usepackage{advdate,xparse}
\ExplSyntaxOn
\DeclareExpandableDocumentCommand{\StrMonthToNum}{ m }
{
\str_case:nnF { #1 } {
{ January } { 1 }
{ February } { 2 }
{ March } { 3 }
{ April } { 4 }
{ May } { 5 }
{ June } { 6 }
{ July } { 7 }
{ August } { 8 }
{ September } { 9 }
{ October } { 10 }
{ November } { 11 }
{ December } { 12 }
} { 12 } % Wrong month, defaults to December/12
}
\ExplSyntaxOff
\def\formattextdate#1 #2 #3\relax{%
\ThisDay{#1}% Set day
\expandafter\ThisMonth\expandafter{\StrMonthToNum{#2}}% Set month
\ThisYear{#3}% Set year
}
\newcommand{\nextfifteenth}[1][\relax]{{%
\ifx\relax#1\relax\else
\expandafter\formattextdate #1\relax%
\fi% If a date was specified
\today---%
\ifnum\day<15\else% \day >= 15
\AdvMonth{1}% Move to next month
\fi
\ThisDay{15}% Day will always be 15th
\today
}}
\begin{document}
\today
\nextfifteenth
\nextfifteenth[15 December 2015]
\nextfifteenth[12 December 2012]
\today
\end{document}
答案2
\documentclass{article}
\def\zz#1{#1 --- \nextXV{#1}}
\def\nextXV#1{\nextXVx#1\relax}
\def\nextXVx#1 #2 #3\relax{%
\ifnum#2<16
#1 15 #3%
\else
\csname nextXV#1\endcsname
\space 15
\expandafter\ifx\csname nextXV#1\endcsname\nextXVDec
\the\numexpr#3+1\relax
\else
#3%
\fi
\fi}
\def\nextXVJan{Feb}
\def\nextXVFeb{Mar}
\def\nextXVMar{Apr}
\def\nextXVApr{May}
\def\nextXVmay{Jun}
\def\nextXVJun{Jul}
\def\nextXVJul{Aug}
\def\nextXVAug{Sep}
\def\nextXVSep{Oct}
\def\nextXVOct{Nov}
\def\nextXVNov{Dec}
\def\nextXVDec{Jan}
\begin{document}
\zz{Nov 12 2015}
\zz{Nov 23 2015}
\zz{Dec 23 2015}
\end{document}