[Tex/LaTex] Expanding macro arguments in newcommand

expansionmacros

I'd like to use datetime's \monthname as part of a command; consider this snippet of command line pdflatex use:

$ pdflatex
This is pdfTeX, Version 3.1415926-1.40.11 (TeX Live 2010)
 restricted \write18 enabled.
**\documentclass{article}
entering extended mode
LaTeX2e <2009/09/24>
Babel <v3.8l> and hyphenation patterns for english, dumylang, nohyphenation, lo
aded.

*\usepackage{datetime}
(/PATH/TO/texlive/texmf-dist/tex/latex/base/article.cls
Document Class: article 2007/10/19 v1.4h Standard LaTeX document class
(/PATH/TO/texlive/texmf-dist/tex/latex/base/size10.clo))

*\newdate{someDate}{30}{05}{2011}
(/PATH/TO/texlive/texmf-dist/tex/latex/datetime/datetime.sty
(/PATH/TO/texlive/texmf-dist/tex/latex/fmtcount/fmtcount.sty
(/PATH/TO/texlive/texmf-dist/tex/latex/base/ifthen.sty)
(/PATH/TO/texlive/texmf-dist/tex/latex/graphics/keyval.sty)
(/PATH/TO/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty)
(/PATH/TO/texlive/texmf-dist/tex/latex/fmtcount/fc-english.def)
(/PATH/TO/texlive/texmf-dist/tex/latex/fmtcount/fc-USenglish.def)
No configuration file fmtcount.cfg found.
))

*\newcommand\someDateStr{\getdateday{someDate} \monthname[\getdatemonth{someDate}] \getdateyear{someDate}}

*\typeout{\someDateStr}
30 \monthname[05] 2011

*\typeout{\monthname[\getdatemonth{someDate}]}
\monthname[05]

So, it looks like in the construct \monthname[\getdatemonth{someDate}], Latex will expand only \getdatemonth{someDate}, but not the \monthname part; I'm suspecting it has something to do with the square brackets as arguments, because if I try to use edef instead, I get an error:

*\edef\someDateStr{\getdateday{someDate} \monthname[\getdatemonth{someDate}] \getdateyear{someDate}}
! Argument of \reserved@a has an extra }.
<inserted text> 
                \par 
<*> ...atemonth{someDate}] \getdateyear{someDate}}

? 

So, the question is: how can I use \monthname[\getdatemonth{someDate}] as a part of a newcommand, such that it results with (in this case) "May"?

Thanks in advance for any responses,
Cheers!

Best Answer

The main problem with datetime is that it is oriented towards printing dates rather than manipulating them.

A "completely expandable" version would be

\makeatletter
\newcommand{\xnewdate}[4]{\@namedef{date@#1}{/#2/#3/#4/}}
\def\xgetdateday#1{\expandafter\expandafter\expandafter\xget@I\csname date@#1\endcsname}
\def\xgetdatemonth#1{\expandafter\expandafter\expandafter\xget@II\csname date@#1\endcsname}
\def\xgetdateyear#1{\expandafter\expandafter\expandafter\xget@III\csname date@#1\endcsname}
\def\xget@I/#1/#2/#3/{#1}
\def\xget@II/#1/#2/#3/{#2}
\def\xget@III/#1/#2/#3/{#3}
\def\xgetdatemonthname#1{%
\ifcase\number\xgetdatemonth{#1}\relax
\or January%
\or February%
\or March%
\or April%
\or May%
\or June%
\or July%
\or August%
\or September%
\or October%
\or November%
\or December%
\fi}
\makeatother

\typeout{\xgetdateday{somedate} \xgetdatemonthname{somedate} \xgetdateyear{somedate}}