
Я использую этот 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}