Correção de comandos para remover espaços em branco ao redor

Correção de comandos para remover espaços em branco ao redor

Estou usando o todonotespacote para adicionar pequenas notas de margem ao meu texto, porém escrevendo

Hello\todo{test} World!

remove o espaço entre palavras como já foi apontado emessa questão. Então eu tentei

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

e isso adiciona o espaço entre palavras, mas simplesmente gera todos os parâmetros em vez de passá-los para \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}

Responder1

Como \todoé definido para \newcommandter um argumento opcional, a macro a ser corrigida é realmente

\\todo

(com uma barra invertida no nome), por isso é difícil especificá-lo: você pode corrigi-lo usando \csnameou com o xpatchpacote:

\documentclass{article}

\usepackage{todonotes}
\usepackage{xpatch}

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

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

Com etoolboxvocê teria que escrever

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

Responder2

Você pode conseguir isso mais facilmente. Como a definição de \todosimplesmente é

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

você pode simplesmente redefini-lo (de uma forma um pouco mais segura que a definição original, veja o comentário de Bruno Le Floch a esta resposta (obrigado!)):

\documentclass{article}
\usepackage{todonotes}

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

Hello\todo{test} World!

\end{document}

informação relacionada