Parchear comandos para eliminar los espacios en blanco circundantes

Parchear comandos para eliminar los espacios en blanco circundantes

Estoy usando el todonotespaquete para agregar pequeñas notas al margen de mi texto, sin embargo, al escribir

Hello\todo{test} World!

elimina el espacio entre palabras como ya se señala enesta pregunta. Así que lo intenté

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

y esto agrega el espacio entre palabras pero simplemente genera todos los parámetros en lugar de pasarlos a \todo.

MWE completo:

\documentclass{article}

\usepackage{etoolbox}
\usepackage{todonotes}

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

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

Respuesta1

Dado que \todose define con \newcommandtener un argumento opcional, la macro a parchear es realmente

\\todo

(con una barra invertida en su nombre), por lo que es difícil especificarlo: puedes parchearlo usando \csnameo hacerlo con el xpatchpaquete:

\documentclass{article}

\usepackage{todonotes}
\usepackage{xpatch}

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

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

Con etoolboxtendrías que escribir

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

Respuesta2

Puedes lograr esto más fácilmente. Dado que la definición de \todosimplemente es

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

simplemente puede redefinirlo (de una manera un poco más segura que la definición original, consulte el comentario de Bruno Le Floch a esta respuesta (¡gracias!)):

\documentclass{article}
\usepackage{todonotes}

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

Hello\todo{test} World!

\end{document}

información relacionada