修补命令以删除周围的空格

修补命令以删除周围的空格

我正在使用该todonotes软件包为我的文本添加一些小的边注,但是写作

Hello\todo{test} World!

删除单词之间的空格,正如已经指出的那样这个问题所以我尝试了

\pretocmd{\todo}{\@bsphack}{}{}
\apptocmd{\todo}{\@esphack}{}{}

这会增加单词间距,但只是输出所有参数,而不是将它们传递给\todo

完整 MWE:

\documentclass{article}

\usepackage{etoolbox}
\usepackage{todonotes}

\makeatletter
\pretocmd{\todo}{\@bsphack}{}{}
\apptocmd{\todo}{\@esphack}{}{}
\makeatother

\begin{document}
Hello\todo{test} World!
\end{document}

答案1

由于\todo定义为\newcommand具有可选参数,因此要修补的宏实际上是

\\todo

(名称中带有反斜杠),因此很难指定它:您可以使用它来修补它\csname或使用xpatch包来执行此操作:

\documentclass{article}

\usepackage{todonotes}
\usepackage{xpatch}

\makeatletter
\xpretocmd{\todo}{\@bsphack}{}{}
\xapptocmd{\todo}{\@esphack}{}{}
\makeatother

\begin{document}
Hello\todo{test} World!
\end{document}

etoolbox必须写

\expandafter\pretocmd\csname\string\todo\endcsname{\@bsphack}{}{}
\expandafter\apptocmd\csname\string\todo\endcsname{\@esphack}{}{}

答案2

你可以更轻松地实现这一点。因为 simply 的定义\todo

\newcommand{\todo}[2][]{\@todo[#1]{#2}}%

您可以重新定义它(以比原始定义稍微安全的方式,请参阅 Bruno Le Floch 对这个答案的评论(感谢!)):

\documentclass{article}
\usepackage{todonotes}

\makeatletter
\renewcommand{\todo}[2][]{\@bsphack\@todo[{#1}]{#2}\@esphack}%
\makeatother
\begin{document}

Hello\todo{test} World!

\end{document}

相关内容