私は「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
。)