修補指令以刪除周圍的空格

修補指令以刪除周圍的空格

我正在使用該todonotes包在我的文本中添加一些邊注,但是編寫

Hello\todo{test} World!

刪除詞間空格,正如已經指出的那樣這個問題。所以我嘗試了

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

這會添加字間空間,但只是輸出所有參數而不是將它們傳遞給\todo.

完整的 MWE:

\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}}%

你可以重新定義它(以比原始定義稍微安全的方式,請參閱 Bruno Le Floch 對此答案的評論(謝謝!)):

\documentclass{article}
\usepackage{todonotes}

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

Hello\todo{test} World!

\end{document}

相關內容