Speichern Sie ein Datum mit datetime2 und verwenden Sie es mit termcal

Speichern Sie ein Datum mit datetime2 und verwenden Sie es mit termcal

Ich erstelle einen Lehrplan mit dem Paket „termcal“ und möchte das Startdatum der ersten Unterrichtsstunde speichern, damit ich es für verschiedene Elemente des Lehrplans verwenden kann. Ich versuche derzeit, das Datum mit der \DTMsavedateFunktion aus dem Paket „datetime2“ zu speichern.

Das Datum wird einwandfrei angezeigt, wenn Sie es beispielsweise \DTMusedate{startDate}innerhalb eines Absatzes verwenden. Aber wenn ich versuche, es an die Datumsoption für zu übergeben \begin{calender}, erhalte ich die Fehlermeldung „Absatz endete, bevor \setdate@ abgeschlossen war“. Gibt es eine Möglichkeit, dies zum Laufen zu bringen? Das 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}

Ich wäre für jede Hilfe sehr dankbar, danke!

Antwort1

Zunächst einmal herzlich willkommen bei TeX.SX. Es ist schön, einen neuen Benutzer zu sehen, der weiß, wie man eine MWE stellt und durchführt.

Das termcalPaket akzeptiert nur Daten im Format <month>/<day>/<year>. Und das Datumsargument von \begin{calendar}wird vor dem Parsen nicht erweitert, d. h. Makros können nicht verwendet werden. Letzteres kann geändert werden, aber das funktioniert nicht mit `\DTMusedate'.

Wenn Sie nicht darauf bestehen, das datetime2Paket zu verwenden, gibt es hier eine Lösung ohne es.

Um das Datum zu speichern, wird ein einfacher Befehl \startDatedefiniert, der nur das Datum im richtigen Format enthält. Und damit Makros als Argument funktionieren, \begin{calendar} \setdatewird for neu definiert, sodass es das Argument erweitert, bevor es analysiert wird.

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

Antwort2

Um Mikes Antwort weiter zu verfolgen: Wenn Sie wirklich verwenden müssen datetime2, können Sie einfach sicherstellen, dass \DTMusedatevollständig erweitert ist, bevor es als Argument übergeben wird:

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

Hier ist eine kleine Änderung anMikes Vorschlag:

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

Dadurch wird sichergestellt, dass das Datum immer im von der Umgebung geforderten Stil dargestellt wird calendar, selbst wenn Sie im Rest des Dokuments einen anderen Datumsstil verwenden. (Die Stiländerung wird automatisch von der mycalendarUmgebung übernommen.)

verwandte Informationen