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 \DTMsavedate
Funktion 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 termcal
Paket 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 datetime2
Paket zu verwenden, gibt es hier eine Lösung ohne es.
Um das Datum zu speichern, wird ein einfacher Befehl \startDate
definiert, der nur das Datum im richtigen Format enthält. Und damit Makros als Argument funktionieren, \begin{calendar}
\setdate
wird 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 \DTMusedate
vollstä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 mycalendar
Umgebung übernommen.)