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 \DTMsavedate
funçã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 termcal
pacote 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 datetime2
pacote, 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 \DTMusedate
está 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 calendar
ambiente, mesmo que você tenha um estilo de data diferente no restante do documento. (A mudança de estilo é automaticamente definida pelo mycalendar
ambiente.)