可能導致句子末尾出現雙句點的宏

可能導致句子末尾出現雙句點的宏

假設文件大量使用其中一個縮寫博士,博士,哲學博士D.菲爾.,為了保持一致性,作者決定定義一個\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第一個定義後面的句點仍將被視為句子結尾。

在此輸入影像描述

相關內容