我想创建一个命令\ifafter{year}{month}{day}{yes}{no}
,以便如果当前日期在year
//month
之后day
,该命令将生成yes
,否则生成no
。
我想出了一个解决方案,我想记录下来并查看其他解决方案hour
。自然的概括,例如将当前时间与::进行比较minute
的版本、检查/ /是否比未来(或过去)几天更远的second
版本等,也将受到欢迎。year
month
day
x
答案1
无需任何包就可以获得相同的结果:
\makeatletter
\newcommand\ifafter[3]{%
\ifnum\the\year\two@digits\month\two@digits\day >
\numexpr#1\two@digits{#2}\two@digits{#3}\relax
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi}
\makeatother
我们还可以将日期编码为“年*10000+月*100+日”,因此测试可以是
\makeatletter
\newcommand\ifafter[3]{%
\ifnum\numexpr\year*10000+\month*100+\day\relax
>\numexpr#1*10000+#2*100+#3\relax
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi}
\makeatother
或者,有etoolbox
和datetime
没有辅助计数器:
\newcommand{\ifafter}[5]{%
\ifnumgreater
{\the\year\twodigit{\the\month}\twodigit{\the\day}}
{#1\twodigit{#2}\twodigit{#3}}
{#4}
{#5}%
}
这里相关的事情是,TeX 在寻找数字时会继续扩展标记。我的定义也允许
\ifafter{2012}{1}{16}{Yes, it is after Jan. 16, 2012.}{No, it is not after Jan. 16, 2012.}
您的宏将在 2012 年 1 月 17 日失败,原因是
\ifafter{2012}{2}{1}{after}{not after}
因为比较的是 20120117 和 201221。使用\twodigit
今天的日期和用户输入可以保证正确的结果,即使用户很懒。
LaTeX3 版本:
\usepackage{xparse}
\ExplSyntaxOn
\DeclareExpandableDocumentCommand{\ifafter}{ m m m }
{
\int_compare:nTF
{ \year*10000+\month*100+\day > #1*10000+#2*100+#3 }
}
\ExplSyntaxOff
答案2
您可以使用日期寄存器\year
和\month
,\day
它们将当前年、月、日保存为整数。如果您将\the
它们放在前面,它们将扩展为数字,如果您想连接这些数字,这一点很重要。
您可以使用原语来比较两个整数。但是,如果月份或日期小于 10,则\ifnum
需要添加:0
\documentclass{article}
\makeatletter
\newcommand{\ifafter}[3]{%
\ifnum#1#2#3<\the\year\ifnum\month<10 0\fi\the\month\ifnum\day<10 0\fi\the\day\space
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
}
\makeatother
\begin{document}
\ifafter{2012}{01}{16}{After 16th Jan 2012.}{Before 16th Jan 2012.}
\ifafter{2012}{01}{17}{After 17th Jan 2012.}{Before 17th Jan 2012.}
\ifafter{2012}{01}{18}{After 18th Jan 2012.}{Before 18th Jan 2012.}
\end{document}
这不需要任何包或 e-TeX。
对于更复杂的事情,我推荐datenumber
可以计算两个日期之间天数差的包。请参阅\daydifftoday
包手册背面的示例。
答案3
以下是我想到的解决方案。今天(2012 年 1 月 17 日)编译以下代码,
\documentclass{article}
\usepackage{etoolbox,datetime}
\newcommand{\twodigitday}{\twodigit{\the\day}}
\newcommand{\twodigitmonth}{\twodigit{\the\month}}
\newcounter{mydatenum}
\setcounter{mydatenum}{\the\year\twodigitmonth\twodigitday}
\newcommand{\ifafter}[5]{\ifnumgreater{\arabic{mydatenum}}{#1#2#3}{#4}{#5}}
\begin{document}
\ifafter{2012}{01}{16}{Yes, it is after Jan. 16, 2012.}{No, it is not after Jan. 16, 2012.}
\ifafter{2012}{01}{17}{Yes, it is after Jan. 17, 2012.}{No, it is not after Jan. 17, 2012.}
\end{document}
生产