專有名詞首字母中的自動不間斷空格

專有名詞首字母中的自動不間斷空格

我需要在正確名稱首字母中使用不間斷空格,例如

J.~W.~Bush

在這種情況下,有什麼方法可以讓 LaTeX 用不間斷的空格替換常規空格嗎?或者我會更好地用一些正規表示式/腳本預處理我的 tex 檔案嗎?

答案1

我在我的包中添加了對縮寫的支持盧阿夫納。該套件使用luatex節點處理回調來根據語言在一個字母單字和首字母後面插入不間斷空格。

例子:

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

在此輸入影像描述

您可以看到,它Ch在捷克語中被用作一個字母。如果您不想進行語言敏感處理,請設定預設語言,\preventsinglelang{languagename}並且給定語言的規則將在整個文件中使用。

您可以使用 關閉處理\preventsingleoff並稍後使用\preventsingleon

luavlna尚未在 CTAN 上,我必須使語言檢測更加強大,因此TEXMFHOME如果您想使用它,您可以從 github 下載它並安裝到您的本地目錄中。

答案2

編輯以捕獲更多案例(並檢查故障模式)

我同意大衛的建議,不要讓這個空間活躍起來。因此,我在這裡採取的方法是使點處於活動狀態,如果發現該功能幹擾其他內容,則可以根據需要開啟 ( \initialsON) 和關閉 ( ) 該功能。\initialsOFF

我們會發現,活性點的選擇會帶來嚴重的限制,因為活性點的出現首字母縮寫,因此不可能明確知道首字母是否位於活動點之前。但我們仍然可以朝著這個目標取得有趣的進展。

使用我的原始解決方案(遵循以下路徑\specdothelper),檢測方案僅在鍵入不帶空格的首字母時觸發,例如J.W.Bush,這樣它將序列轉換.X為如果和.~X之間沒有空格,其中表示任何大寫字母。這種壓縮語法可能需要一些時間來適應,甚至對許多使用者來說是完全無法接受的。 .XX

透過最新的修訂版(以及我第一次成功使用\futurelet耶皮),我現在還可以搜尋文法. X.,其中第一個點後面有一個空格,然後是一個大寫字母,後面跟著一個點。如果找到此序列,則將其轉換為.~X. 並且當且僅當最近找到了首字母縮寫時,該序列. Xx才會假定已找到姓氏並將其轉換為.~Xx。因此,在像 之類的序列中J. Z. A. Bush,它將捕獲所有三個空格,將它們轉換為硬空格。

然而,透過使用點作為活動字符,我無法知道點之前的字符是否是首字母,並且只能通過在輸入流中向前查找來嘗試辨別它。在 給出的範例中G. Washington,第一個點的問題在於,如果沒有建立首字母縮寫模式,則前瞻性. Wa字元集可能是句子的開頭,而不是首字母後面的名稱。所以這個重要的案例就被錯過了。

在這篇編輯中,我減少了此後對邏輯核心的討論。我只是總結一下,挑戰區域是空格、\pars 和重複的點..(因為點是活動字元),需要特殊處理。此外,此修訂版的新邏輯遵循\foundspace巨集。

我的 MWE 中顯示了壓縮(無空格)語法失敗的地方。如果姓氏不以大寫字母開頭就是一種情況,例如 C.deLune。另外,如果 url 後面有一個點,後面有一個大寫字母,這將導致插入一個空格(儘管\initialsOFF應該在設定像 url 這樣的非常規文字之前使用)。

當使用修訂後的語法(其中 LaTeX 檔案中的首字母之間保留空格)時,存在三種已知的故障模式(其中之一至關重要)。第一種情況是上面詳細討論的,是單首字母後面跟著姓氏的情況。第二個失敗是句子以聲母開頭(儘管這是錯誤的語法)。第三種失敗的情況是當一個句子以看起來像首字母的形式結尾時,例如U. S. A. 在這種情況下,下一個句子的第一個單字被感知為姓氏,並插入一個硬空格。

使用壓縮語法時,許多使用者可能完全無法接受在文件中輸入不含空格的縮寫的要求。在正常的擴展語法中,無法檢測序列中的單個首字母極大地限制了這種方法的實用性。

在接下來的 MWE 中,我特意將我的硬空間定義\HS為 a\rule以使其可見。若要按其預期方式使用此程式碼,應將此定義替換為將其定義為硬空間(或瘦空間)的定義。

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

在此輸入影像描述

相關內容