almacenar una fecha con datetime2 y usarla con termcal

almacenar una fecha con datetime2 y usarla con termcal

Estoy creando un programa de estudios de clase usando el paquete "termcal" y me gustaría almacenar la fecha de inicio de la primera clase para poder usarla para diferentes elementos del programa de estudios. Actualmente estoy intentando almacenar la fecha usando la \DTMsavedatefunción del paquete "datetime2".

La fecha se mostrará bien si la usa, por ejemplo, \DTMusedate{startDate}dentro de un párrafo. Pero si intento pasarlo a la opción de fecha para \begin{calender}, aparece el mensaje de error "El párrafo finalizó antes de que se completara \setdate@". ¿Hay alguna manera de hacer que esto funcione? El MWE:

\documentclass[12pt]{article}
\usepackage{termcal}
\usepackage[american,useregional=numeric]{datetime2}
\DTMsavedate{startDate}{2017-8-29}

\begin{document}

\begin{calendar}{\DTMusedate{startDate}}{16} 

\setlength{\calboxdepth}{.3in}
\setlength{\calwidth}{0.8\textwidth} 

% Description of the Week.
\calday[Tuesday]{\classday} 
\skipday
\calday[Thursday]{\classday}
\skipday
\skipday
\skipday
\skipday

\end{calendar}

\end{document}

Realmente agradecería cualquier ayuda con esto, ¡gracias!

Respuesta1

Primero, bienvenido a TeX.SX. Es bueno ver un nuevo usuario que sabe cómo preguntar y hacer un MWE.

El termcalpaquete sólo acepta fechas en formato <month>/<day>/<year>. Y el argumento de fecha de \begin{calendar}no se expande antes del análisis, es decir, no se pueden usar macros. Esto último se puede cambiar, pero esto no funciona con `\DTMusedate'.

Si no insiste en utilizar el datetime2paquete, aquí tiene una solución sin él.

Para guardar la fecha, \startDatese define un comando simple, que solo contiene la fecha en el formato correcto. Y para hacer que las macros funcionen como argumento, \begin{calendar} \setdatese redefine de modo que expanda el argumento antes de analizarlo.

\documentclass[12pt]{article}
\usepackage{termcal}
\newcommand*{\startDate}{08/29/2017}

\makeatletter
\renewcommand{\setdate}[1]{\expandafter\setdate@#1!}
\makeatother

\begin{document}

\begin{calendar}{\startDate}{16} 

\setlength{\calboxdepth}{.3in}
\setlength{\calwidth}{0.8\textwidth} 

% Description of the Week.
\calday[Tuesday]{\classday} 
\skipday
\calday[Thursday]{\classday}
\skipday
\skipday
\skipday
\skipday

\end{calendar}

\end{document}

Respuesta2

Siguiendo con la respuesta de Mike, si realmente necesita usarlo datetime2, puede asegurarse de que \DTMusedateesté completamente expandido antes de pasarlo como argumento:

\documentclass[12pt]{article}
\usepackage{termcal}
\usepackage[american,useregional=numeric]{datetime2}
\DTMsavedate{startDate}{2017-8-29}

\begin{document}

\edef\startCalendar{\noexpand\begin{calendar}{\DTMusedate{startDate}}{16}}
\startCalendar

\setlength{\calboxdepth}{.3in}
\setlength{\calwidth}{0.8\textwidth} 

% Description of the Week.
\calday[Tuesday]{\classday} 
\skipday
\calday[Thursday]{\classday}
\skipday
\skipday
\skipday
\skipday

\end{calendar}

\end{document}

Aquí hay una modificación menor ala sugerencia de mike:

\documentclass[12pt]{article}
\usepackage{termcal}
\usepackage{datetime2}
\DTMsavedate{startDate}{2017-8-29}

\newenvironment{mycalendar}[2]{%
 \DTMsetup{monthdaysep=/,dayyearsep=/}%
 \DTMsetstyle{mmddyyyy}%
 \edef\startCalendar{\noexpand\begin{calendar}{#1}{#2}}%
 \startCalendar
}
{\end{calendar}}

\begin{document}

\begin{mycalendar}{\DTMusedate{startDate}}{16}

\setlength{\calboxdepth}{.3in}
\setlength{\calwidth}{0.8\textwidth} 

% Description of the Week.
\calday[Tuesday]{\classday} 
\skipday
\calday[Thursday]{\classday}
\skipday
\skipday
\skipday
\skipday

\end{mycalendar}

\end{document}

Esto garantiza que la fecha siempre tenga el estilo requerido por el calendarentorno, incluso si tiene un estilo de fecha diferente en el resto del documento. (El cambio de estilo lo determina automáticamente el mycalendarentorno).

información relacionada