매크로 전후에 공백이 있는지 감지

매크로 전후에 공백이 있는지 감지

내 문서에 다음과 같은 사용자 정의 매크로가 있습니다.

\newcommand{\myparenthetical}[1]{[#1]}

그러나 문서에서 매크로 앞과 뒤에 항상 하나의 공백이 있는지 확인하고 싶습니다.

나는 원한다

This\myparenthetical{9}is a\myparenthetical{10} test.

로 나타나다

이 [9]는 [10] 테스트입니다.

~ 아니다~처럼

이것은[9][10] 테스트입니다.

매크로로 이 작업을 어떻게 수행합니까?

답변1

\unskip이전 공백을 제거합니다. 모드에 따라 이는 수평 또는 수직 공간입니다. 명령 뒤의 공백은 에서 무시할 수 있습니다 \ignorespaces. 구두점 문자가 뒤에 오는 경우 공백 설정을 피하기 위해 공백 토큰을 설정하고 \space다음 토큰을 테스트할 수 있습니다. \@ifnextchar부작용으로 다음 공백도 제거됩니다.

전체 예:

\documentclass{article}

\makeatletter
\newcommand*{\myparenthetical}[1]{%
  \ifhmode
    \unskip
    \space
  \fi
  [#1]%
  \@ifnextchar{.}{}{%
  \@ifnextchar{,}{}{%
  \@ifnextchar{;}{}{%
  \@ifnextchar{!}{}{%
  \@ifnextchar{?}{}{%
  \@ifnextchar{)}{}{%
  \@ifnextchar\par{}{%
    \space
    \ignorespaces
  }}}}}}}%
}

\begin{document}
\myparenthetical{1} starts a sencents and ends it \myparenthetical{2}.
\myparenthetical{3}Lorem ipsum\myparenthetical{4} ,\myparenthetical{5}.

This\myparenthetical{6}is \myparenthetical{7} a\myparenthetical{8} test.
\end{document}

결과

단순화

Barbara에게 감사를 표하며 package 를 사용하여 예제를 단순화할 수 있습니다 xspace. 그러나 \xspace인수가 없는 매크로용이므로 직접 사용할 수 없습니다. 그런 다음 매크로 이름을 검색하면 다음 공백이 차지하게 됩니다. 그러나 \xspace구두점 감지에는 괜찮습니다. 따라서 다음 공간은 다음 \romannumeral트릭으로 채워질 수 있습니다. 여기서 공간은 문자 상수에 의해 소비되고 결과 음수는 다음에 의해 제거됩니다 \romannumeral.

\documentclass{article}

\usepackage{xspace}

\makeatletter
\newcommand*{\myparenthetical}[1]{%
  \ifhmode
    \unskip
    \space
  \fi
  [#1]%
  \expandafter\xspace\romannumeral-`\x
}

\begin{document}
\myparenthetical{1} starts a sencents and ends it \myparenthetical{2}.
\myparenthetical{3}Lorem ipsum\myparenthetical{4} ,\myparenthetical{5}.

This\myparenthetical{6}is \myparenthetical{7} a\myparenthetical{8} test.
\end{document}

관련 정보