renewcommand 使用默认参数时导致内存错误

renewcommand 使用默认参数时导致内存错误

我想在使用 \todo 命令时在日志中添加警告。为此,我做了以下操作:

\documentclass{book}

\usepackage[colorinlistoftodos,prependcaption,textsize=tiny]{todonotes}

\let\oldtodo\todo
\renewcommand{\todo}[2]{\oldtodo[#1]{#2} \message{Warning: TODO: #2.^^J}}

\begin{document}

\todo{}{Maybe write something meaningful}
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

\end{document}

一切都很好。但是,如果我将续订行更改为:

\renewcommand{\todo}[2][inline]{\oldtodo[#1]{#2} \message{Warning: TODO: #2.^^J}}

我收到错误

! TeX capacity exceeded, sorry [input stack size=5000].

答案1

添加\usepackage{letltxmacro}到您的序言中。

而不是\let使用\LetLtxMacro

说明:该命令有一个可选参数。

因此:

\documentclass{book}

\usepackage[colorinlistoftodos,prependcaption,textsize=tiny]{todonotes}
\usepackage{letltxmacro}

\LetLtxMacro\oldtodo\todo
%\renewcommand{\todo}[2]{\oldtodo[#1]{#2} \message{Warning: TODO: #2.^^J}}

\renewcommand{\todo}[2][inline]{\oldtodo[#1]{#2} \message{Warning: TODO: #2.^^J}}

\begin{document}

\todo{}{Maybe write something meaningful}
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

\end{document}

答案2

问题是,todo 包在内部也重新定义了 \todo 命令,而当您也定义它时,您会陷入无限循环。因此,最好定义一个新命令,例如\Todo,然后保留该\todo命令。

您也没有正确处理 的可选参数\todo。下面的代码修复了这两个问题,它写道

警告:TODO:也许写一些有意义的东西

进入日志文件。代码如下:

\documentclass{book}

\usepackage[colorinlistoftodos,prependcaption,textsize=tiny]{todonotes}

\newcommand{\Todo}[2][inline]{%
  \if\relax\detokenize{#1}\relax\todo{#2}%
  \else\todo[#1]{#2}%
  \fi%
  \message{Warning: TODO: #2.^^J}%
}

\begin{document}

\Todo{Maybe write something meaningful}
Lorem ipsum dolor sit amet, consectetur adipiscing elit, 
sed do eiusmod tempor incididunt ut labore et dolore magna 
aliqua.

\end{document}

相关内容