假設文件大量使用其中一個縮寫博士,博士,哲學博士和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
第一個定義後面的句點仍將被視為句子結尾。