내 문서에 다음과 같은 사용자 정의 매크로가 있습니다.
\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}