Angenommen, in einem Dokument wird häufig eine der Abkürzungen verwendetDoktorarbeit,Ph.D.,DPhilUndD.Phil., und der Konsistenz halber beschließt der Autor, ein \PhD
Makro zu definieren und es zu verwenden, wann immer er die Abkürzung braucht. Also greift er eine dieser Definitionen auf:
\def\PhD{PhD}%
\def\PhD{Ph.D.}%
\def\PhD{DPhil}%
\def\PhD{D.Phil.}%
Das Problem ist nun, dass ein Satz wie
Ein „Graduiertenstudent“ ist ein Student, der eine Ausbildung über den Bachelor-Abschluss hinaus anstrebt, beispielsweise einen Master-Abschluss oder einen \PhD
.
könnte mit zwei Punkten am Ende gesetzt werden, je nach Definition von \PhD
. Wie können wir dieses Problem vermeiden, ohne die Idee aufzugeben, ein \PhD
Makro zu verwenden? (Nehmen wir an, dass wir die Makrodefinitionen ändern können.)
Antwort1
Ich weiß nicht, ob das Ihre Absicht war, aber ich versuche es:
\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
Antwort2
Punkte sind ein seltsames Biest, da der Leerzeichenfaktor richtig eingestellt sein muss (natürlich, wenn Sie verwenden \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
Die Einstellung \xspaceskip
dient lediglich dazu, anzuzeigen, dass der Platzfaktor korrekt berechnet wird.
Im Fall „kein Punkt in der Abkürzung“ \@
setzt das von LaTeX übernommene Makro den Leerzeichenfaktor auf 1000, so dass ein Punkt nach \PhD
der ersten Definition immer noch als Satzende gilt.