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