我有一个宏,它将读取日期格式的参数,例如{2012-11-08}
\usepackage{datetime}
\def\customdate#1#2#3#4-#5-#6\relax{%
\shortmonthname[#5] '#3#4%
}
但是,在某些情况下,我希望输出打印其他内容来代替日期,可能是“Present”、“ongoing”或其他字符串。我曾希望使用某种 if 语句或使用错误发生时输入命令,但我找不到任何合适的内容。
我怎样才能编写另一个宏,或者向上述宏添加某种条件语句,以便它输出按要求格式化的日期,但如果没有格式,则返回不变的参数"####-##-##"
?
干杯
答案1
您没有使用参数#6,因此以下内容足以区分有效/无效参数:
\documentclass{article}
\usepackage{datetime}
\def\customdate#1#2#3#4-#5-#6\relax{%
\if?#5?
#1#2#3#4
\else
\shortmonthname[#5] '#3#4%
\fi
}
\newcommand{\mydate}[1]{\expandafter\customdate#1--\relax}
\begin{document}
\mydate{2014-11-04}
\mydate{today}
\mydate{now}
\mydate{2014-11}
\end{document}
--
在处理参数之前,我们将作为附加分隔符传递\mydate
。这样,您将保证\customdate
至少传递两个-
。检查 #5 是否为空,以适应特殊格式。
当然,如果遵守格式,但传递了无效参数(如),则可能会发生各种不良情况\mydate{2014-a}
。此处不对这些进行测试。
答案2
\documentclass{article}
\def\shortdate#1{\ifcase#1\relax\or
Jan\or Feb\or Mar\or Apr\or May\or Jun\or
Jul\or Aug\or Sep\or Oct\or Nov\or Dec\fi}
\def\mydate#1{\xmydate#1\relax????-?-?\relax\def{#1}}
\def\xmydate#1#2#3#4-#5-#6\relax#7\def#8{%
\ifx?#5%
#8%
\else
\shortdate{#5} '#3#4%
\fi}
\begin{document}
\mydate{2014-11-04}
\mydate{today}
\mydate{now}
\end{document}
答案3
以下是使用该包的版本xstring
:
进一步增强:
- 检查年份确实为四位数字,并且在有效范围内。
- 检查月份是否为 1-12。
- 检查该月份的日期对于给定的年份和月份是否有效。
代码:
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{textcomp}
\usepackage{datetime}
\usepackage{xstring}
\usepackage{etoolbox}
%% http://tex.stackexchange.com/questions/50111/how-to-check-if-the-value-of-a-parameter-is-a-number/50113#50113
\newcommand*{\IsInteger}[3]{%
\IfStrEq{#1}{ }{%
#3% is a blank string
}{%
\IfInteger{#1}{#2}{#3}%
}%
}%
\newcommand*{\ExtractedYear}{}
\newcommand*{\ExtractedTwoDigitYear}{}
\newcommand*{\ExtractedMonth}{}
\newcommand*{\ExtractedDay}{}
\newtoggle{IfProperlyFormattedDate}
\newcommand*{\mydate}[1]{%
\StrBefore{#1}{-}[\ExtractedYear]%
\toggletrue{IfProperlyFormattedDate}%
\IsInteger{\ExtractedYear}{%
\StrGobbleLeft{\ExtractedYear}{2}[\ExtractedTwoDigitYear]%
\StrBetween[1,2]{#1}{-}{-}[\ExtractedMonth]%
\IsInteger{\ExtractedMonth}{%
\StrBehind[2]{#1}{-}[\ExtractedDay]%
\IsInteger{\ExtractedDay}{}{\togglefalse{IfProperlyFormattedDate}}%
}{%
\togglefalse{IfProperlyFormattedDate}%
}%
}{%
\togglefalse{IfProperlyFormattedDate}%
}%
\makebox[2.0cm][r]{#1:}~% For debuggging
\iftoggle{IfProperlyFormattedDate}{%
\shortmonthname[\ExtractedMonth] \textquotesingle\ExtractedTwoDigitYear%
}{%
#1%
}%
}
\begin{document}
\mydate{2014-11-04}\par
\mydate{ABCD-Nov-04}\par
\mydate{220x-Nov-04}\par
\mydate{2001-xxx-04}\par
\mydate{2001-12-x}\par
\mydate{today}\par
\mydate{now}\par
\end{document}