使用 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}

以下是对Mike 的建议

\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。)

相关内容