我正在尝试使用isodate
Tufte-LaTeX 软件包,但
! Illegal parameter number in definition of \reserved@a.
当我用作\today
某些函数的参数(例如\printdate
或\allcaps
)时:
\documentclass[]{tufte-handout}
\usepackage[iso,american]{isodate}
\begin{document}
\allcaps{\today}
\end{document}
如果\date
设置了,我会收到不同的错误
! Argument of \reserved@a has extra }.
使用\protect\today
上述修复程序,但是当我尝试按需要使用日期时仍然会出现错误:
\documentclass[]{tufte-handout}
\usepackage[iso,american]{isodate}
\date{\protect\today}
%\date{5/16/1961} % Works fine if a date is provided
\begin{document}
\makeatletter
\printdate{\@date}
\end{document}
答案1
\@date
和的默认定义\date
是
\def\@date{\today}
\def\date#1{\gdef\@date{#1}}
这不会被改变isodate
,但会重新定义\today
。您可以检查用户是否已经\date{...}
说过
\def\kernel@date{\today}
\ifx\@date\kernel@date
<what to do if no \date command has been given>
\else
<what to do if \date has been given>
\fi
当然,如果有人说\date{21 marzo 2012}
,\printdate
很难用正确的形式产生日期
\printdate{\csname @date\endcsname}
(这与 相同\makeatletter\printdate{\@date}\makeatother
,但更经济)。
答案2
布鲁诺 (Bruno) 的答案是使用\protect\today
作品进行\allcaps
治疗(尽管我不确定为什么你要用这种间距打印 ISO 格式的日期)。
不能用作\today
的参数\printdate
。其格式必须为yyyy-mm-dd
、mm.dd.yyyy
或dd/mm/yyyy
。
\documentclass{tufte-handout}
\usepackage[iso,american]{isodate}
\begin{document}
\allcaps{\protect\today}% <-- added \protect
\printdate{2012/03/20}
\printdate{20.03.2012}
\printdate{20/03/2012}
\end{document}
根据以下评论,这里有一个更完整的解决方案:
\documentclass{article}
\usepackage[iso,american]{isodate}
\makeatletter
% Set default date to today's date (in ISO format)
\xdef\@date{\the\year-\the\month-\the\day}
% Helper macro to avoid @s in macro name
\newcommand{\thedate}{\@date}
% Helper macro to avoid more typing
\newcommand{\printthedate}{\printdate{\@date}}
\makeatother
% Optionally change the date
%\date{2010-01-31}% must be in ISO format
\begin{document}
% Prints the date set by \date or today's date by default
\printdate{\thedate}
% Same as above
\printthedate
\end{document}
首先,我们将其重新定义\@date
为今天的日期(使用 ISO 格式)。这意味着,如果\date
没有指定,我们将默认为今天的日期。
接下来,我们编写了一个\thedate
辅助宏。这可以节省我们在文档中输入的内容。如果没有这个宏,我们就必须写\makeatletter\printdate{\@date}\makeatother
而不是\printdate{\thedate}
。此外,我们还创建了一个\printthedate
相当于 的宏\printdate{\thedate}
。(是的,我是个懒惰的打字员!)
如果您想使用今天日期以外的日期,则必须使用 ISO 格式\date{yyyy-mm-dd}
(或宏支持的其他格式之一\printdate
)指定它。
最后,文档演示了辅助宏。
答案3
我想精确地Tufte classes
重新定义一些宏
第一的 \newcommand{\thedate}{\today}
和
\renewcommand*{\date}[1]{%
\gdef\@date{#1}%
\begingroup%
% TODO store contents of \thanks command
\renewcommand{\thanks}[1]{}% swallow \thanks contents
\protected@xdef\thedate{#1}%
\endgroup%
}
我认为您需要注意这些修改,并且您可以在没有“sodate”包的情况下定义 iso 格式。