문장 끝에 마침표가 이중으로 표시될 수 있는 매크로

문장 끝에 마침표가 이중으로 표시될 수 있는 매크로

문서에서 약어 중 하나를 많이 사용한다고 가정해 보겠습니다.박사,박사.,DPhil그리고D.Phil., 일관성을 위해 작성자는 \PhD매크로를 정의하고 약어가 필요할 때마다 사용하기로 결정했습니다. 그래서 그들은 다음과 같은 정의를 선택합니다.

\def\PhD{PhD}%
\def\PhD{Ph.D.}%
\def\PhD{DPhil}%
\def\PhD{D.Phil.}%

이제 문제는 다음과 같은 문장이

"대학원생"은 석사 학위나 \PhD.

의 정의에 따라 끝에 두 개의 마침표를 사용하여 조판될 수 있습니다 \PhD. 매크로 사용 아이디어를 포기하지 않고 어떻게 이 문제를 피할 수 있습니까 \PhD? (매크로 정의를 변경할 수 있다고 가정합니다.)

답변1

나는 그것을 시도하여 이것이 당신의 의도인지 모르겠습니다.

\long\def\isnextchar#1#2#3{\def\tmpa{#2}\def\tmpb{#3}%
   \let\tmp=#1\futurelet\next\isnextcharA
}
\def\isnextcharA{\ifx\tmp\next\expandafter\tmpa\else\expandafter\tmpb\fi}

\def\PhD{\isnextchar.{PhD}{Ph.D.}}
\def\PhD{\isnextchar.{PhD}{Ph.D.}}

The \PhD\ inside the sentence is different than \PhD.
gives:
The Ph.D. inside the sentence is different than PhD.

\bye

답변2

마침표는 공간 요소를 올바르게 설정해야 하기 때문에(물론 을 사용하는 경우 \nonfrenchspacing) 이상한 짐승입니다.

\catcode`@=11
\def\checkperiod{\futurelet\next\check@period}
\def\check@period{%
  \if\noexpand\next.%
    \spacefactor\sfcode`.
    \expandafter\@gobble
  \fi}
\long\def\@gobble#1{}
\def\@{\spacefactor\@m}
\catcode`@=12

\xspaceskip=4em % just to verify

\def\PhD{PhD\@}

A \PhD{} and another \PhD. End.

\def\PhD{Ph.D.\checkperiod}

A \PhD{} and another \PhD. End.

\def\PhD{DPhil}

A \PhD{} and another \PhD. End.

\def\PhD{D.Phil.\@\checkperiod}

A \PhD{} and another \PhD. End.

\bye

의 설정은 \xspaceskip단지 공간 인자가 올바르게 계산되었음을 보여주기 위한 것입니다.

"약어에 마침표 없음"의 경우 \@LaTeX에서 빌린 매크로는 공백 인수를 1000으로 설정하므로 \PhD첫 번째 정의 이후의 마침표는 여전히 문장 끝으로 간주됩니다.

여기에 이미지 설명을 입력하세요

관련 정보