可能重复:
我该如何分割约会?
有人知道如何从自己的宏的参数中的日期中提取年份吗?
即,
\themacro#1{...}
其中#1
包含已经采用格式yyyy
或采用格式的日期dd.mm.yyyy
,\themacro
将转换为纯文本yyyy
...
我希望我已经说清楚了,好吧,简单地说,我只需要从日期中提取年份(如果需要提取的话)。
答案1
user1189687 已经提出了一个我认为更好的解决方案,但是由于我已经开始写这篇文章,如果您想要一个简单的 tex 解决方案,那么这里是:
这里的重点是要认识到您是处于第一种情况还是另一种情况。如果您知道输入的格式,那么做到这一点就很简单。但在这里,显然您不知道。
所以我会这样做:
\makeatletter
\def\@themacro #1.#2\end@themacro{%
\def\@tempyr{#1}%
\def\@temprem{#2}%
}%
%
\def\themacro #1 {%
\let\day\relax%
\let\month\relax%
\let\year\relax%
\let\@tempyr\relax%
\let\@temprem\relax%
\@themacro#1.\relax\end@themacro% get day or year
\if\relax\@temprem\relax%
\if\relax\@tempyr\relax%
\GenericError{}{Wrong date format}{}{}% Manage the error
\else%
\edef\year{\expandafter\noexpand\@tempyr}%
\fi%
\else%
\edef\day{\expandafter\noexpand\@tempyr}%
\expandafter\@themacro\@temprem\end@themacro% get month
\if\relax\@temprem\relax%
\GenericError{}{Wrong date format}{}{}% Manage the Error
\else%
\edef\month{\expandafter\noexpand\@tempyr}%
\expandafter\@themacro\@temprem\end@themacro% get year
\if\relax\@temprem\relax%
\edef\year{\expandafter\noexpand\@tempyr}%
\else%
\GenericError{}{Wrong date format}{}{}% Manage the Error
\fi%
\fi%
\fi%
}%
\makeatother%
此解决方案的优点是,您可以根据需要检测错误的语法并进行回退或抛出错误。
哦,我差点忘了......您当然会得到年份作为替换文本\year
。
如果它们存在,您还可以获得\day
和\month
。
答案2
\StrRight
在包装内试用xstring
:
\documentclass{article}
\usepackage{xstring}
\def\getYear#1{\StrRight{#1}{4}}
\begin{document}
\noindent\getYear{12.12.2012}\\
\getYear{2012}
\end{document}
结果: