고유명칭 이니셜에서 자동으로 잘리지 않는 공백

고유명칭 이니셜에서 자동으로 잘리지 않는 공백

고유명칭 이니셜에는 줄바꿈되지 않는 공백을 사용해야 합니다. 예:

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

더 많은 사례를 포착하고 실패 모드를 조사하도록 편집되었습니다.

나는 공간을 활성화하지 말라는 David의 권고에 동의합니다. 따라서 여기서 제가 취하는 접근 방식은 점이 다른 것을 방해하는 것으로 확인되면 필요에 따라 기능을 켜 \initialsON거나( ) 끄는( ) 기능을 사용하여 점을 활성화하는 것입니다 .\initialsOFF

활성 도트의 선택은 심각한 제한을 가져올 것이며, 활성 도트가 발생한다는 점을 알게 될 것입니다.~ 후에따라서 이니셜이 활성 점 앞에 있는지 확실하게 아는 것이 불가능해집니다. 그러나 그럼에도 불구하고 우리는 그 목표를 향해 흥미로운 진전을 이룰 수 있습니다.

내 원래 솔루션(다음 경로 \specdothelper)을 사용하면 감지 체계가 공백 없이 입력된 이니셜에서만 트리거되었습니다. 즉 , 와 사이에 공백이 없는 경우 J.W.Bush시퀀스를 변환했습니다 .X. 여기서는 대문자를 나타냅니다. 이 압축된 구문은 익숙해지는 데 약간의 시간이 걸리거나 심지어 많은 사용자가 완전히 받아들이지 못할 수도 있습니다. .~X.XX

이 최신 REVISION을 통해(그리고 처음으로 를 성공적으로 사용했습니다 \futurelet.만세. X.), 이제 첫 번째 점 뒤에 공백이 있고 그 뒤에 대문자가 있는 구문을 검색할 수도 있습니다 . 이 시퀀스가 ​​발견되면 로 변환됩니다. .~X. 그리고 최근에 이니셜이 발견된 경우에만 시퀀스는 . Xx성을 찾았다고 가정하고 로 변환합니다 .~Xx. 따라서 와 같은 시퀀스에서는 J. Z. A. Bush세 개의 공백을 모두 포착하여 하드 공간으로 변환합니다.

그러나 점을 활성 문자로 사용하면 점 앞의 문자가 초기 문자인지 여부를 알 수 없으며 입력 스트림에서 앞을 바라봄으로써만 식별할 수 있습니다. 에서 제시한 예에서 G. Washington첫 번째 점의 문제점은 이미 설정된 이니셜 패턴이 없으면 미래 지향적 . Wa문자 세트가 이니셜 뒤의 이름이 아니라 문장의 시작일 수 있다는 것입니다. 그래서 이 중요한 사건을 놓쳤습니다.

이 편집에서는 이후 논리의 본질에 대한 논의를 줄였습니다. 챌린지 영역은 공백, \pars, 반복되는 점 ..(점은 활성 문자이므로) 으로 특별한 처리가 필요한 부분만 요약해서 말씀드리겠습니다 . 또한 이번 개정판의 새로운 로직은 매크로 를 따릅니다 \foundspace.

압축된(공백 없음) 구문이 실패하는 위치가 내 MWE에 표시됩니다. 성이 대문자로 시작하지 않는 경우는 C.deLune과 같은 경우입니다. 또한 URL에 점이 있고 뒤에 대문자가 있으면 공백이 삽입됩니다(단, \initialsOFFURL과 같은 색다른 텍스트를 설정하기 전에 사용해야 함).

LaTeX 파일의 이니셜 사이에 공백이 남아 있는 수정된 구문을 사용할 때 세 가지 알려진 실패 모드가 있습니다(그 중 하나가 중요함). 위에서 어느 정도 자세히 설명한 첫 번째 경우는 이니셜이 하나이고 뒤에 성이 오는 경우입니다. 두 번째 실패는 문장이 이니셜로 시작하는 경우입니다(문법이 좋지는 않지만). 세 번째 실패 사례는 다음과 같이 문장이 이니셜처럼 보이는 것으로 끝나는 경우입니다. U. S. A. 이 경우 다음 문장의 첫 번째 단어가 성으로 인식되어 하드 공백이 삽입됩니다.

압축된 구문을 사용할 때 문서에 공백 없이 이니셜을 입력해야 한다는 요구 사항은 많은 사용자가 전혀 받아들이지 못할 수 있습니다. 그리고 일반 확장 구문에서는 시퀀스에서 단일 이니셜을 감지할 수 없기 때문에 이 접근 방식의 유용성이 크게 제한됩니다.

다음 MWE에서는 하드 공간을 표시하기 위해 의도적 \HS으로 정의했습니다. \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}

여기에 이미지 설명을 입력하세요

관련 정보