сохранить дату с помощью datetime2 и использовать ее с termcal

сохранить дату с помощью datetime2 и использовать ее с termcal

Я создаю программу занятий с использованием пакета "termcal" и хотел бы сохранить дату начала первого занятия, чтобы использовать ее для различных элементов программы. В настоящее время я пытаюсь сохранить дату с использованием функции \DTMsavedateиз пакета "datetime2".

Дата будет отображаться нормально, если вы используете, например, \DTMusedate{startDate}внутри абзаца. Но если я попытаюсь передать ее в параметр даты для \begin{calender}, я получу сообщение об ошибке "Параграф закончился до завершения \setdate@". Есть ли способ заставить это работать? 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}

Я был бы очень признателен за любую помощь в этом вопросе, спасибо!

решение1

Во-первых, добро пожаловать в TeX.SX. Приятно видеть нового пользователя, который знает, как задавать и делать MWE.

Пакет termcalпринимает только даты в формате <month>/<day>/<year>. И аргумент даты \begin{calendar}не раскрывается перед разбором, т.е. макросы использовать нельзя. Последнее можно изменить, но это не работает с `\DTMusedate'.

Если вы не настаиваете на использовании пакета datetime2, то вот решение без него.

Для сохранения даты \startDateопределена простая команда, содержащая только дату в правильном формате. А для того, чтобы макросы работали как аргумент, \begin{calendar} \setdateпереопределено так, чтобы он расширял аргумент перед его разбором.

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

решение2

Продолжая ответ Майка, если вам действительно нужно использовать datetime2, вы можете просто убедиться, что \DTMusedateон полностью развернут, прежде чем передаваться в качестве аргумента:

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

Вот небольшая модификацияПредложение Майка:

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

Это гарантирует, что дата всегда будет иметь стиль, требуемый средой calendar, даже если в остальной части документа используется другой стиль даты. (Изменение стиля автоматически регулируется средой mycalendar.)

Связанный контент