문서에서 약어 중 하나를 많이 사용한다고 가정해 보겠습니다.박사,박사.,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
첫 번째 정의 이후의 마침표는 여전히 문장 끝으로 간주됩니다.