Espacios automáticos sin separación en las iniciales del nombre propio

Espacios automáticos sin separación en las iniciales del nombre propio

Necesito usar espacios que no se separen en las iniciales de los nombres propios, por ejemplo

J.~W.~Bush

¿Alguna forma de hacer que LaTeX reemplace los espacios regulares por espacios que no se rompan en tales casos? ¿O sería mejor preprocesar mis archivos tex con alguna expresión regular/script?

Respuesta1

Agregué soporte para iniciales a mi paquete.luavlna. Este paquete utiliza luatexdevoluciones de llamada de procesamiento de nodos para la inserción dependiente del idioma de espacios sin separación después de palabras e iniciales de una letra.

Ejemplo:

\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}

ingrese la descripción de la imagen aquí

Puedes ver que Chse usa como una letra en checo. Si no desea un procesamiento sensible al idioma, establezca el idioma predeterminado \preventsinglelang{languagename}y las reglas para el idioma determinado se utilizarán en todo el documento.

Puede desactivar el procesamiento con \preventsingleoffy reanudarlo más tarde con\preventsingleon

luavlnaaún no está en CTAN, tengo que hacer que la detección de idioma sea más sólida, para que puedas descargarlo desde github e instalarlo en tu TEXMFHOMEdirectorio local si quieres usarlo.

Respuesta2

EDITADO para detectar más casos (y examinar modos de falla)

Estoy de acuerdo con la recomendación de David de no activar el espacio. Entonces, el enfoque que tomo aquí es activar el punto, con la capacidad de activar ( \initialsON) y desactivar ( \initialsOFF) la función según sea necesario, si se descubre que interfiere con algo más.

La elección de un punto activo traerá consigo una grave limitación, como veremos, en el sentido de que se produce un punto activo.despuésla letra rubricada, por lo que resulta imposible saber definitivamente si una inicial precedió al punto activo. Pero, aun así, podemos lograr avances interesantes hacia ese objetivo.

Con mi solución original (la ruta que sigue \specdothelper), el esquema de detección solo se activó en las iniciales escritas sin espacios, como J.W.Bush, de modo que convirtió una secuencia .Xen .~Xsi no había espacio entre .y X, donde Xrepresenta cualquier letra mayúscula. Esta sintaxis comprimida puede tomar un poco de tiempo para acostumbrarse o incluso ser completamente inaceptable para muchos usuarios.

Con esta última REVISIÓN (y mi primer uso exitoso de \futurelet,yippee), ahora también puedo buscar la sintaxis . X., donde hay un espacio después del primer punto, luego una letra mayúscula seguida de un punto. Si se encuentra esta secuencia, se convierte en .~X. Y si y sólo si se han encontrado recientemente las iniciales, la secuencia . Xxasumirá que se ha localizado el apellido y lo convertirá a .~Xx. Por lo tanto, en una secuencia como J. Z. A. Bush, capturará los tres espacios, convirtiéndolos en espacios duros.

Sin embargo, al utilizar el punto como carácter activo, no puedo saber si el carácter anterior al punto era una inicial y solo puedo intentar discernirlo mirando hacia adelante en el flujo de entrada. En el ejemplo dado por G. Washington, el problema con el primer punto es que, sin que ya se haya establecido un patrón de iniciales, el conjunto de caracteres que miran hacia adelante . Wapodría ser el comienzo de una oración en lugar de un nombre que sigue a la inicial. Y por eso se pasa por alto este importante caso.

En esta EDICIÓN, he reducido la discusión a continuación sobre el núcleo de la lógica. Solo resumiré y diré que las áreas de desafío fueron espacios, \pars y puntos repetidos ..(ya que los puntos son caracteres activos), que requirieron un tratamiento especial. Además, la nueva lógica de esta revisión sigue la \foundspacemacro.

Los lugares donde fallará la sintaxis comprimida (sin espacios) se muestran en mi MWE. Si un apellido no comienza con mayúscula es un caso, como por ejemplo C.deLune. Además, si una URL tiene un punto seguido de una letra mayúscula, esto provocará que se inserte un espacio (aunque \initialsOFFdebe usarse antes de configurar texto tan poco convencional como el de una URL).

Cuando se emplea la sintaxis revisada donde quedan espacios entre las iniciales en su archivo LaTeX, existen tres modos de falla conocidos (uno de ellos crucial). El primero, analizado anteriormente con cierta extensión, es el caso de una única inicial seguida de un apellido. El segundo fracaso es cuando una oración comienza con una inicial (aunque esto es mala gramática). El tercer caso de error es cuando una oración termina en lo que parecen iniciales, como U. S. A. En este caso, la primera palabra de la siguiente oración se percibe como el apellido y se inserta un espacio.

Cuando se utiliza la sintaxis comprimida, el requisito de ingresar iniciales sin espacios en el documento puede resultar totalmente inaceptable para muchos usuarios. Y en la sintaxis expandida normal, la incapacidad de detectar una inicial solitaria en una secuencia limita en gran medida la utilidad de este enfoque.

En el MWE que sigue, he definido deliberadamente mi espacio físico \HSpara \rulehacerlo visible. Para utilizar este código en la forma prevista, esa definición debe reemplazarse por la que lo define como un espacio rígido (o un espacio reducido).

\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}

ingrese la descripción de la imagen aquí

información relacionada