为什么当 \today 使用“isodate”作为参数传递时,它会在 Tufte-LaTeX 中崩溃?

为什么当 \today 使用“isodate”作为参数传递时,它会在 Tufte-LaTeX 中崩溃?

我正在尝试使用isodateTufte-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-ddmm.dd.yyyydd/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 格式。

相关内容