주변 공백을 제거하는 패치 명령

주변 공백을 제거하는 패치 명령

나는 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}

관련 정보