Automatische geschützte Leerzeichen in den Initialen von Eigennamen

Automatische geschützte Leerzeichen in den Initialen von Eigennamen

Ich muss geschützte Leerzeichen in den Initialen von Eigennamen verwenden, z. B.

J.~W.~Bush

Gibt es eine Möglichkeit, LaTeX in solchen Fällen dazu zu bringen, normale Leerzeichen durch geschützte zu ersetzen? Oder sollte ich meine Tex-Dateien besser mit einem regulären Ausdruck/Skript vorverarbeiten?

Antwort1

Ich habe meinem Paket Unterstützung für Initialen hinzugefügtAbonnieren. Dieses Paket verwendet luatexKnotenverarbeitungs-Rückrufe zum sprachabhängigen Einfügen geschützter Leerzeichen nach einstelligen Wörtern und Initialen.

Beispiel:

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

Bildbeschreibung hier eingeben

Sie können sehen, dass es Chim Tschechischen als ein Buchstabe verwendet wird. Wenn Sie keine sprachabhängige Verarbeitung wünschen, legen Sie die Standardsprache fest \preventsinglelang{languagename}und die Regeln für die angegebene Sprache werden im gesamten Dokument verwendet.

Sie können die Verarbeitung mit beenden \preventsingleoffund später mit fortsetzen.\preventsingleon

luavlnaist noch nicht auf CTAN, ich muss die Spracherkennung robuster machen, also können Sie es von GitHub herunterladen und in Ihrem lokalen TEXMFHOMEVerzeichnis installieren, wenn Sie es verwenden möchten.

Antwort2

BEARBEITET, um mehr Fälle zu erfassen (und Fehlermodi zu untersuchen)

Ich stimme Davids Empfehlung zu, das Leerzeichen nicht zu aktivieren. Daher verfolge ich hier den Ansatz, den Punkt zu aktivieren, mit der Möglichkeit, die Funktion nach Bedarf ein- ( \initialsON) und auszuschalten ( \initialsOFF), wenn festgestellt wird, dass sie mit etwas anderem in Konflikt gerät.

Die Wahl eines aktiven Punktes bringt eine starke Einschränkung mit sich, denn ein aktiver Punkt tritt aufnachder Buchstabe mit Initiale, und so ist es unmöglich, definitiv zu wissen, ob dem aktiven Punkt eine Initiale voranging. Aber wir können dennoch interessante Fortschritte in Richtung dieses Ziels machen.

Bei meiner ursprünglichen Lösung (der Pfad folgt \specdothelper) wurde das Erkennungsschema nur bei Initialen ausgelöst, die ohne Leerzeichen eingegeben wurden, wie beispielsweise J.W.Bush, sodass es eine Sequenz .Xin konvertierte, wenn zwischen dem und dem .~Xkein Leerzeichen stand , wobei ein beliebiger Großbuchstabe steht. Diese komprimierte Syntax ist für viele Benutzer möglicherweise etwas gewöhnungsbedürftig oder sogar völlig inakzeptabel. .XX

Mit dieser neuesten Überarbeitung (und meiner ersten erfolgreichen Verwendung von \futurelet,Hurra), kann ich jetzt auch nach der Syntax suchen . X., bei der nach dem ersten Punkt ein Leerzeichen folgt, dann ein Großbuchstabe, gefolgt von einem Punkt. Wenn diese Sequenz gefunden wird, wird sie in umgewandelt. .~X. Und genau dann, wenn kürzlich Initialen gefunden wurden, . Xxgeht die Sequenz davon aus, dass der Nachname gefunden wurde, und wandelt ihn in um .~Xx. In einer Sequenz wie werden also J. Z. A. Bushalle drei Leerzeichen erfasst und in harte Leerzeichen umgewandelt.

Wenn ich den Punkt als aktives Zeichen verwende, weiß ich jedoch nicht, ob das Zeichen vor dem Punkt ein Anfangsbuchstabe war, und kann es nur herausfinden, indem ich im Eingabestrom nach vorne schaue. Im von angegebenen Beispiel G. Washingtonbesteht das Problem mit dem ersten Punkt darin, dass ohne ein bereits festgelegtes Muster von Anfangsbuchstaben die nach vorne blickende . WaZeichenfolge der Anfang eines Satzes sein könnte und nicht ein Name, der dem Anfangsbuchstaben folgt. Daher wird dieser wichtige Fall übersehen.

In diesem EDIT habe ich die folgende Diskussion auf das Wesentliche der Logik reduziert. Ich fasse nur zusammen und sage, dass die Problembereiche Leerzeichen, \pars und wiederholte Punkte waren ..(da Punkte aktive Zeichen sind), die eine besondere Behandlung erforderten. Außerdem folgt die neue Logik mit dieser Revision dem \foundspaceMakro.

Stellen, an denen die komprimierte Syntax (ohne Leerzeichen) fehlschlägt, werden in meinem MWE angezeigt. Ein Beispiel hierfür ist ein Nachname, der nicht mit einem Großbuchstaben beginnt, z. B. C.deLune. Wenn eine URL einen Punkt gefolgt von einem Großbuchstaben enthält, führt dies außerdem dazu, dass ein Leerzeichen eingefügt wird (dies \initialsOFFsollte jedoch verwendet werden, bevor so unkonventioneller Text wie URLs festgelegt wird).

Bei der Verwendung der überarbeiteten Syntax, bei der in Ihrer LaTeX-Datei Leerzeichen zwischen den Initialen verbleiben, gibt es drei bekannte Fehlermodi (einer davon ist entscheidend). Der erste, der oben ausführlich besprochen wurde, ist der Fall eines einzelnen Initials, gefolgt von einem Nachnamen. Der zweite Fehler liegt vor, wenn ein Satz mit einem Initial beginnt (obwohl dies eine schlechte Grammatik ist). Der dritte Fehlerfall liegt vor, wenn ein Satz mit etwas endet, das wie Initialen aussieht, wie z. B.: U. S. A. In diesem Fall wird das erste Wort des nächsten Satzes als Nachname wahrgenommen und ein hartes Leerzeichen eingefügt.

Bei Verwendung der komprimierten Syntax ist die Anforderung, Initialen ohne Leerzeichen in Ihr Dokument einzugeben, für viele Benutzer möglicherweise völlig inakzeptabel. Und in der normalen erweiterten Syntax schränkt die Unfähigkeit, einzelne Initialen in einer Sequenz zu erkennen, die Nützlichkeit dieses Ansatzes erheblich ein.

Im folgenden MWE habe ich meinen Hard Space absichtlich \HSals definiert \rule, um ihn sichtbar zu machen. Um diesen Code wie vorgesehen zu verwenden, sollte diese Definition durch diejenige ersetzt werden, die ihn als Hard Space (oder Skinny Space) definiert.

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

Bildbeschreibung hier eingeben

verwandte Informationen