Espaços automáticos inseparáveis ​​nas iniciais dos nomes próprios

Espaços automáticos inseparáveis ​​nas iniciais dos nomes próprios

Preciso usar espaços ininterruptos nas iniciais dos nomes próprios, por exemplo

J.~W.~Bush

Existe alguma maneira de fazer o LaTeX substituir espaços regulares por espaços ininterruptos para esses casos? Ou seria melhor pré-processar meus arquivos tex com algum regexp/script?

Responder1

Adicionei suporte para iniciais ao meu pacoteluavlna. Este pacote usa luatexretornos de chamada de processamento de nó para inserção dependente do idioma de espaços inseparáveis ​​​​após palavras e iniciais de uma letra.

Exemplo:

\documentclass{article}
\usepackage{fontspec}
\usepackage[czech, english]{babel}
\usepackage{luavlna}
\preventsinglelang{czech}
\begin{document}
  \preventsingledebugon
D. E. Knuth, Ch. Somebody. \selectlanguage{czech} A. Dvořák, 
name in horizontal box \hbox{Č. Zíbrt}, Ř. Jelen \preventsingleoff C. Někdo, 
\preventsingleon Ř. Jelen, Ch. Josef, CH. Thisworkstoo

\end{document}

insira a descrição da imagem aqui

Você pode ver que isso Ché usado como uma letra em tcheco. Se você não quiser o processamento sensível ao idioma, defina o idioma padrão \preventsinglelang{languagename}e as regras para determinado idioma serão usadas em todo o documento.

Você pode desligar o processamento \preventsingleoffe retomá-lo posteriormente com\preventsingleon

luavlnaainda não está no CTAN, preciso tornar a detecção de idioma mais robusta, para que você possa baixá-lo do github e instalá-lo em seu TEXMFHOMEdiretório local se quiser usá-lo.

Responder2

EDITADO para capturar mais casos (e examinar modos de falha)

Concordo com a recomendação de David de não tornar o espaço ativo. Portanto, a abordagem que adoto aqui é tornar o ponto ativo, com a capacidade de ativar o recurso ( \initialsON) e desativar ( \initialsOFF) conforme necessário, caso ele interfira em outra coisa.

A escolha de um ponto ativo trará consigo uma limitação severa, descobriremos, na medida em que um ponto ativo ocorredepoisa letra rubricada, tornando-se impossível saber com certeza se uma inicial precedeu o ponto ativo. Mas ainda assim podemos fazer progressos interessantes rumo a esse objectivo.

Com minha solução original (o caminho a seguir \specdothelper), o esquema de detecção só foi acionado em iniciais digitadas sem espaços, como J.W.Bush, de modo que convertesse uma sequência .Xem .~Xse não houvesse espaço entre o .e o X, onde Xrepresenta qualquer letra maiúscula. Essa sintaxe compactada pode demorar um pouco para se acostumar ou até mesmo ser totalmente inaceitável para muitos usuários.

Com esta última REVISÃO (e meu primeiro uso bem-sucedido do \futurelet,Yippee), agora também posso procurar a sintaxe . X., onde há um espaço após o primeiro ponto, depois uma letra maiúscula seguida de um ponto. Se esta sequência for encontrada, ela será convertida em .~X. E se e somente se as iniciais tiverem sido encontradas recentemente, a sequência . Xxassumirá que o sobrenome foi localizado e o converterá em .~Xx. Assim, numa sequência como J. Z. A. Bush, irá capturar todos os três espaços, convertendo-os em espaços rígidos.

Ao usar o ponto como caractere ativo, no entanto, sou impedido de saber se o caractere anterior ao ponto era inicial e só posso tentar discerni-lo olhando para frente no fluxo de entrada. No exemplo dado por G. Washington, o problema com o primeiro ponto é que, sem um padrão de iniciais já estabelecido, o conjunto de caracteres prospectivo . Wapoderia ser o início de uma frase em vez de um nome após a inicial. E assim este importante caso é esquecido.

Nesta edição, reduzi a discussão a seguir sobre as entranhas da lógica. Vou apenas resumir e dizer que as áreas de desafio eram espaços, \pars e pontos repetidos ..(já que os pontos são caracteres ativos), o que exigia tratamento especial. Além disso, a nova lógica com esta revisão segue a \foundspacemacro.

Locais onde a sintaxe compactada (sem espaço) falhará são mostrados no meu MWE. Se um sobrenome não começar com letra maiúscula é um caso, como C.deLune. Além disso, se um URL tiver um ponto seguido por uma letra maiúscula, isso fará com que um espaço seja inserido (embora \initialsOFFdeva ser usado antes de definir um texto não convencional como URL).

Ao empregar a sintaxe revisada onde permanecem espaços entre as iniciais em seu arquivo LaTeX, existem três modos de falha conhecidos (um deles crucial). O primeiro, discutido acima com certa profundidade, é o caso de uma única inicial seguida por um sobrenome. A segunda falha ocorre quando uma frase começa com uma inicial (embora isso seja uma gramática incorreta). O terceiro caso de falha é quando uma frase termina com o que parecem ser iniciais, como U. S. A. Neste caso, a primeira palavra da frase seguinte é percebida como o sobrenome e um espaço rígido é inserido.

Ao usar a sintaxe compactada, a exigência de inserir iniciais sem espaços no documento pode ser totalmente inaceitável para muitos usuários. E na sintaxe expandida normal, a incapacidade de detectar uma inicial solitária em uma sequência limita enormemente a utilidade desta abordagem.

No MWE a seguir, defini propositalmente meu espaço físico \HScomo um espaço \rulepara torná-lo visível. Para usar este código da maneira pretendida, essa definição deve ser substituída por aquela que o define como um espaço rígido (ou um espaço estreito).

\documentclass{article}
\usepackage{ifnextok}
\def\HS{\rule{.66ex}{1ex}}% TO DEMONSTRATE WHERE ACTIVE
%\def\HS{\,}% FOR NARROW SPACE
%\def\HS{~}% FOR NORMAL HARD SPACE
\let\svdot.
\def\knowninit{F}
\makeatletter
\def\specdot{\svdot\IfNextToken\@sptoken{\foundspace}%
  {\gdef\knowninit{F}\specdothelper}}
\long\def\foundspace#1{\IfNextToken\@sptoken{ #1\gdef\knowninit{F}}%
  {\def\savefirst{#1}\lookatsecond}}
\def\lookatsecond{\futurelet\secondchar\processsecond}

\long\def\specdothelper#1{%
  \if\svdot#1%
    \svdot%
  \else%
    \ifx#1\par%
      \par%
    \else%
      \ifnum`#1>`@\ifnum`#1<`[\HS\fi\fi#1%
    \fi%
  \fi%
}
\makeatother

\catcode`.=\active
\def\processsecond{%
  \ifx\secondchar.%
    \HS\gdef\knowninit{T}%
  \else%
    \if T\knowninit%
      \ifnum\expandafter`\savefirst>`@\ifnum\expandafter`\savefirst<`[\HS\else%
        { }\fi\else{ }\fi%
    \else%
      { }%
    \fi%
    \gdef\knowninit{F}%
  \fi%
  \savefirst%
}
\def\initialsON{\catcode`.=\active\def.{\specdot}}
\def\initialsOFF{\catcode`.=12\let.\svdot}
\catcode`.=12
\parskip 1ex
\begin{document}
\footnotesize
\noindent ON\initialsON

Fully spaced initials J. Z. A. Bush being tested, and here we check double and single initials: 
J. Q. Adams and G. Washington.  A single initial cannot be discerned because the dot after 
the G cannot know if the prior letter is an initial and no other initials follow the dot.

U. S. A. is OK, since ``is'' is not capitalized.

We can be fooled by U. S. Olympic Team, in that it considers ``Olympic'' to be the last name.
Can also be fooled if sentence ends in the U. S. A. The new sentence starts with a hard-space, 
with ``The'' as the last name.  Leaving out the spaces will fix U.S.A.  If no spaces are wanted,
\initialsOFF U.S.A. \initialsON 
can be gotten by temporarily turning initials OFF.

Compressed or uncompressed C.deLune and  C. de Lune fail to insert a hard space, because 
``d'' is not a capital letter.

Unspaced combinations: 3.2, a.b, J.Z.A.Bush, and G.Washington being successfully tested
 here, with non-capital letters screened out.

Testing.. successive... dots is OK... Unless the sentence ends with odd number of dots, then 
a space immediately followed by a dotted initial... S. Segletes would never start a sentence 
with an initial.  It is poor grammar in the first place. 

\noindent\hrulefill\\
OFF\initialsOFF (This was the raw text being processed)

Fully spaced initials J. Z. A. Bush being tested, and here we check double and single initials: 
J. Q. Adams and G. Washington.  A single initial cannot be discerned because the dot after 
the G cannot know if the prior letter is an initial and no other initials follow the dot.

U. S. A. is OK, since ``is'' is not capitalized.

We can be fooled by U. S. Olympic Team, in that it considers ``Olympic'' to be the last name.
Can also be fooled if sentence ends in the U. S. A. The new sentence starts with a hard-space, 
with ``The'' as the last name.  Leaving out the spaces will fix U.S.A.  If no spaces are wanted,
U.S.A. 
can be gotten by temporarily turning initials OFF.

Compressed or uncompressed C.deLune and  C. de Lune fail to insert a hard space, because 
``d'' is not a capital letter.

Unspaced combinations: 3.2, a.b, J.Z.A.Bush, and G.Washington being successfully tested
 here, with non-capital letters screened out.

Testing.. successive... dots is OK... Unless the sentence ends with odd number of dots, then 
a space immediately followed by a dotted initial... S. Segletes would never start a sentence 
with an initial.  It is poor grammar in the first place. 
\end{document}

insira a descrição da imagem aqui

informação relacionada