Patching-Befehle zum Entfernen umgebender Leerzeichen

Patching-Befehle zum Entfernen umgebender Leerzeichen

Ich benutze das todonotesPaket, um kleine Randnotizen zu meinem Text hinzuzufügen, aber das Schreiben

Hello\todo{test} World!

entfernt den Zwischenwortraum, wie bereits erwähnt indiese Frage. Also habe ich versucht

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

und dies fügt den Zwischenwortraum hinzu, gibt aber einfach alle Parameter aus, anstatt sie an zu übergeben \todo.

Vollständiges MWE:

\documentclass{article}

\usepackage{etoolbox}
\usepackage{todonotes}

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

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

Antwort1

Da \todomit definiert ist, \newcommandum ein optionales Argument zu haben, ist das zu patchende Makro wirklich

\\todo

(mit einem Backslash im Namen), daher ist es schwierig, es anzugeben: Sie können es patchen oder dies mit dem Paket \csnametun :xpatch

\documentclass{article}

\usepackage{todonotes}
\usepackage{xpatch}

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

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

Mit etoolboxmüsstest du schreiben

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

Antwort2

Das kann man einfacher erreichen. Denn die Definition von \todoeinfach ist

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

Sie können es einfach neu definieren (auf eine etwas sicherere Weise als die ursprüngliche Definition, siehe Bruno Le Flochs Kommentar zu dieser Antwort (danke!)):

\documentclass{article}
\usepackage{todonotes}

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

Hello\todo{test} World!

\end{document}

verwandte Informationen