termcal 能与日期时间一起工作吗?

termcal 能与日期时间一起工作吗?

我在一个文档中同时使用了datetimetermcal,但这似乎会导致错误。

\documentclass[12pt,letterpaper]{article}
\usepackage{datetime,termcal}
\begin{document}
\begin{calendar}{6/1/15}{2}
\renewcommand{\calprintdate}{\monthname. \thedate}
\calday[Monday]{\classday}% Monday
\skipday% Tuesday
\calday[Wednesday]{\classday}%Wednesday
\skipday% Thursday
\skipday % Friday
\skipday\skipday% Weekend
\end{calendar}
\end{document}

这是来自控制台的错误消息:

/usr/local/texlive/2014/texmf-dist/tex/latex/termcal/termcal.sty:135: LaTeX Error: Command \monthname already defined.
           Or name \end... illegal, see p.192 of the manual.

See the LaTeX manual or LaTeX Companion for explanation.
Type  H <return>  for immediate help.
...                                              

l.135         \or Nov\or Dec\fi}

答案1

datetime软件包现已被替换为datetime2。用新包替换旧包(而不是简单地修改旧包)的原因之一是确保大多数命令都有前缀,从而避免此类冲突。(如果我只是更新了datetime所有旧命令,例如\monthname,则必须保留这些命令以实现向后兼容性,但问题仍然存在。)

基础datetime2包仅具有数字日期样式,因此您可以执行以下操作:

\documentclass[12pt,letterpaper]{article}
\usepackage{datetime2,termcal}
\begin{document}
\begin{calendar}{6/1/15}{2}
\renewcommand{\calprintdate}{\monthname. \thedate}
\calday[Monday]{\classday}% Monday
\skipday% Tuesday
\calday[Wednesday]{\classday}%Wednesday
\skipday% Thursday
\skipday % Friday
\skipday\skipday% Weekend
\end{calendar}
\end{document}

这将仅termcal使用\monthname。语言相关的日期在datetime2 语言模块。例如,对于英语,您还需要安装datetime2-english。如果检测到语言,它将被加载datetime2。每个语言模块都有自己的月份名称命令。对于英语语言模块,该命令称为\DTMenglishmonthname。这需要一个强制参数,即月份数。因此,如果您更喜欢使用它而不是termcal's,\monthname您可以执行以下操作:

\documentclass[12pt,letterpaper,english]{article}
\usepackage{datetime2,termcal}
\begin{document}
\begin{calendar}{6/1/15}{2}
\renewcommand{\calprintdate}{\DTMenglishmonthname{\value{month}}. \thedate}
\calday[Monday]{\classday}% Monday
\skipday% Tuesday
\calday[Wednesday]{\classday}%Wednesday
\skipday% Thursday
\skipday % Friday
\skipday\skipday% Weekend
\end{calendar}
\end{document}

如果您得到未定义的控制序列\DTMenglishmonthname,则可能意味着未安装语言模块。(日志文件中应该有关于此问题的警告。

答案2

首先,我要说的是,这个说法datetime已经过时了,可能不该再使用。作者说它正在被 取代datetime2。我不确定后者是否有同样的冲突。

正如评论中提到的,这两个包(datetimetermcal)确实存在冲突。Jon 在他的评论中建议的解决方案解决了冲突,但没有产生正确的结果(除非您运行 LaTeX 时实际上是六月,否则您不会看到六月的日历)。原因是这两个宏在语义上不兼容:

  1. \monthname中的定义采用datetime可选参数,即月份数(1-12)。其值默认为当前月份。

  2. \monthname中的定义不termcal带参数。它扩展为变量中包含的月份名称\c@month

我假设所需的行为是按照 中的定义进行termcal使用。以下是我提出的建议:\monthnamedatetime

\documentclass[12pt,letterpaper]{article}

\usepackage{termcal}
%% forget about termcal's version
\let\monthname\relax

\usepackage{datetime}
%% rename datetime's version
\let\dtmonthname\monthname

%% and make a new version that behaves as termcal's but uses datetime's...
\makeatletter
\renewcommand\monthname{\dtmonthname[\c@month]}
\makeatother

\begin{document}
\begin{calendar}{6/1/15}{2}
\renewcommand{\calprintdate}{\monthname. \thedate}
\calday[Monday]{\classday}% Monday
\skipday% Tuesday
\calday[Wednesday]{\classday}%Wednesday
\skipday% Thursday
\skipday % Friday
\skipday\skipday% Weekend
\end{calendar}
\end{document}

结果如下:

结果

相关内容