周囲の空白を削除するパッチコマンド

周囲の空白を削除するパッチコマンド

私は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}

関連情報