可能导致句末出现双句号的宏

可能导致句末出现双句号的宏

假设一份文件大量使用其中一个缩写博士博士学位哲学博士哲学博士,为了保持一致性,作者决定定义一个\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第一个定义后面的句号仍将被视为句子结尾。

在此处输入图片描述

相关内容