Suponha que um documento faça uso intenso de uma das abreviaturasDoutorado,Ph.D.,DPhileD.Phil., e por uma questão de consistência o autor decide definir uma \PhD
macro e utilizá-la sempre que precisar da abreviatura. Então, eles pegam estas definições:
\def\PhD{PhD}%
\def\PhD{Ph.D.}%
\def\PhD{DPhil}%
\def\PhD{D.Phil.}%
Agora, o problema é que uma frase como
Um "estudante de pós-graduação" é um aluno que busca educação além do bacharelado, como um mestrado ou um diploma de graduação \PhD
.
pode ser composto com dois pontos no final, dependendo da definição de \PhD
. Como podemos evitar esse problema sem desistir da ideia de usar uma \PhD
macro? (Suponha que possamos alterar as definições de macro.)
Responder1
Não sei se essa era sua intenção ao tentar:
\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
Responder2
Os períodos são uma fera estranha, porque o fator espaço deve ser definido corretamente (é claro, se você usar \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
A configuração de \xspaceskip
é apenas para mostrar que o fator de espaço foi calculado corretamente.
No caso de “sem ponto final na abreviação”, a macro \@
emprestada do LaTeX define o fator de espaço para 1000, portanto, um ponto final após \PhD
a primeira definição ainda será considerado final de frase.