我想在使用 \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}