Команды исправления для удаления окружающих пробелов

Команды исправления для удаления окружающих пробелов

Я использую этот todonotesпакет для добавления небольших заметок на полях моего текста, однако написание

Hello\todo{test} World!

удаляет межсловный пробел, как уже указывалось вэтот вопрос. Поэтому я попробовал

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

и это добавляет межсловный пробел, но просто выводит все параметры вместо того, чтобы передавать их в \todo.

Полная МВЭ:

\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

Вы можете достичь этого проще. Поскольку определение \todoпросто таково:

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

вы можете просто переопределить его (немного более безопасным способом, чем исходное определение, см. комментарий Бруно Ле Флоха к этому ответу (спасибо!)):

\documentclass{article}
\usepackage{todonotes}

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

Hello\todo{test} World!

\end{document}

Связанный контент