Макросы, которые могут привести к появлению двойной точки в конце предложения

Макросы, которые могут привести к появлению двойной точки в конце предложения

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

введите описание изображения здесь

Связанный контент