检查宏参数的格式是否正确

检查宏参数的格式是否正确

我有一个宏,它将读取日期格式的参数,例如{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}

相关内容