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

Mike の回答に続いて、 を本当に使用する必要がある場合は、引数として渡される前に が完全に展開されている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。)

関連情報