文末に二重ピリオドを付けるマクロ

文末に二重ピリオドを付けるマクロ

ある文書で、以下の略語が頻繁に使用されているとします。博士号博士号博士号そして哲学博士一貫性を保つために、著者は\PhDマクロを定義し、略語が必要なときにいつでもそれを使用することに決めました。そこで、次の定義のいずれかを採用しました。

\def\PhD{PhD}%
\def\PhD{Ph.D.}%
\def\PhD{DPhil}%
\def\PhD{D.Phil.}%

さて、問題は次のような文です

「大学院生」とは、修士号や博士号など、学士号以上の学位を取得するための教育を受けている学生です\PhD

の定義によっては、末尾に 2 つのピリオドを付けてタイプセットされる可能性があります\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最初の定義の後のピリオドは依然として文の終わりとみなされます。

ここに画像の説明を入力してください

関連情報