armazene uma data com datetime2 e use-a com termcal

armazene uma data com datetime2 e use-a com termcal

Estou fazendo um programa de aula usando o pacote "termcal" e gostaria de armazenar a data de início da primeira aula para poder usá-la em diferentes elementos do programa. Atualmente estou tentando armazenar a data usando a \DTMsavedatefunção do pacote "datetime2".

A data ficará correta se você usar, por exemplo, \DTMusedate{startDate}dentro de um parágrafo. Mas se eu tentar passá-lo para a opção de data \begin{calender}, recebo a mensagem de erro "O parágrafo terminou antes de \setdate@ ser concluído". Existe uma maneira de fazer isso funcionar? O 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}

Eu realmente apreciaria qualquer ajuda com isso, obrigado!

Responder1

Primeiro, seja bem-vindo ao TeX.SX. É bom ver um novo usuário, que sabe pedir e fazer um MWE.

O termcalpacote só aceita datas no formato <month>/<day>/<year>. E o argumento de data \begin{calendar}não é expandido antes da análise, ou seja, macros não podem ser usadas. Este último pode ser alterado, mas isto não funciona com `\DTMusedate'.

Se você não insiste em usar o datetime2pacote, aqui está uma solução sem ele.

Para salvar a data, \startDateé definido um comando simples, contendo apenas a data no formato correto. E para fazer as macros funcionarem como argumento, \begin{calendar} \setdateé redefinido para expandir o argumento antes de ser analisado.

\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}

Responder2

Seguindo a resposta de Mike, se você realmente precisar usar datetime2, basta ter certeza de que \DTMusedateestá totalmente expandido antes de ser passado 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}

Aqui está uma pequena modificaçãoSugestão 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}

Isso garante que a data esteja sempre no estilo exigido pelo calendarambiente, mesmo que você tenha um estilo de data diferente no restante do documento. (A mudança de estilo é automaticamente definida pelo mycalendarambiente.)

informação relacionada