Предположим, что в документе широко используется одно из сокращений.кандидат наук,Кандидат наук.,доктор философиииДоктор философии., и ради единообразия автор решает определить \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
первого определения все равно будет считаться окончанием предложения.