ConTeXt에서 줄이 가득 차는 것을 절대적으로 방지하는 방법은 무엇입니까?

ConTeXt에서 줄이 가득 차는 것을 절대적으로 방지하는 방법은 무엇입니까?

나는 몇 년 동안 ConTeXt를 사용해 왔으며 줄 바꿈을 결정하는 알고리즘이 각 줄을 개별적으로 살펴보는 것이 아니라 기본적으로 전체 단락에 대한 "불량"을 최소화하려고 노력한다는 것을 잘 알고 있습니다. 따라서 때때로 줄이 너무 많은 경우는 단지 "게임의 일부" 일 뿐이므로 hz또는 fullhz, 또는 등을 hanging사용 하여 최소화해야 합니다 .tolerantverytolerantstretch

그러나 나는 지금 내가 해야 할 상황에 직면해 있다.정말하고 싶다절대적으로, 완전히, 궁극적으로 그리고 항상섹션 헤드의 라인이 너무 많이 채워지는 것을 방지합니다. 즉, TeX의 알고리즘에 따라 라인이 아무리 "나쁜" 것이 되더라도,절대라인을 너무 많이 채워서 사용하세요. 내 문제를 설명하는 MWE를 만들었습니다.

\definefontsize[e]
\definefontsize[f]

\definebodyfontenvironment[default][
  a=1.200,
  b=1.400,
  c=1.728,
  d=2.0,
  e=4.0,
  f=24.0,
  x=0.9,
  xx=0.8,
  big=1.2,
  small=0.8]

\setuphead[section][
  style=\tfe\em,
  align={flushleft, nothyphenated, fullhz, hanging, verytolerant, stretch},
  number=no,
  alternative=margin,
  after={\blank[4*line]},
  ]


\starttext

\section{Test overfull headings}

\input{knuth}

\input{knuth}

\stoptext

이는 다음과 같습니다:

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

알고리즘에 어떻게 지시할 수 있나요?부서지다가득 찬 상자에 의지하는 대신 "제목"이라는 단어 앞의 줄. 여기 에는 어떤 옵션도 align아무런 영향을 미치지 않는 것 같습니다.

모든 도움을 주시면 감사하겠습니다.

답변1

하이픈 넣기를 비활성화할 때 나타날 수 있는 불규칙한 텍스트로 인해 줄이 너무 꽉 차는 것을 방지하려면 옵션 broad에 키워드를 추가하여 align줄 바꿈을 개선할 수 있습니다.

\definefont [SectionFont] [Italic sa 4]

\setuphead
  [section]
  [ style=SectionFont,
    align={flushleft,broad,nothyphenated},
   number=no]

\starttext

\section{Test overfull headings}

\samplefile{knuth}

\stoptext

답변2

그러나 나는 이제 섹션 헤드의 과잉 라인을 절대적으로, 전체적으로, 궁극적으로 항상 방지하고 싶은 상황에 직면했습니다. 즉, TeX의 알고리즘에 따라 라인이 아무리 "나쁘게" 되더라도 라인을 너무 많이 채워서는 안 됩니다.

이 문제에 대해 ConTeXt에서 사용할 수 있는 옵션을 거의 다 써버렸습니다. 이 문제를 해결하는 훨씬 더 나은 방법은 아래 Wolfgang의 의견을 참조하십시오. 아래의 원래 답변:

다행히 아직 사용할 수 있는 몇 가지 Plain TeX 옵션이 있습니다. 여기서는 4가지 옵션을 생각할 수 있습니다.

\tolerance=10000

이것은 TeXbook에서 제안됩니다:

아아, 상자가 너무 가득 차서 돌아옵니다. 그러니 입력해 보세요

\tolerance=10000
\input story

무슨 일이 일어나는지 보기 위해서요. TeX는 10000을 "무한" 허용 오차인 것처럼 처리하여 임의로 넓은 공간을 허용합니다. 따라서 허용오차는 10000입니다.절대열 자체보다 더 넓은 하이픈을 넣을 수 없는 단어와 같이 이상한 일이 발생하지 않는 한 가득 찬 상자를 생성합니다.

\emergencystretch=\maxdimen

다시 TeXbook에서:

수동으로 수정하지 않고 상자가 너무 꽉 차는 것을 방지하려면 \tolerance=10000; 이를 통해 어려운 상황에서 임의로 잘못된 라인을 허용할 수 있습니다. 그러나 무한한 관용은 나쁜 생각입니다. 왜냐하면 TeX은 매우 나쁜 라인과 터무니없을 정도로 끔찍한 라인을 구별하지 않기 때문입니다. 실제로 10000의 허용 오차는 TeX가 모든 나쁜 점을 한 곳에 집중하도록 장려하여 규칙에 따라 단일 "상쇄"가 가장 적은 총 단점을 생성하기 때문에 중간 정도 나쁜 두 줄 대신 정말 보기 흉한 줄을 만듭니다. 원하는 효과를 얻는 훨씬 더 좋은 방법이 있습니다. TeX에는 \emergencystretch상자가 너무 가득 차는 것을 피할 수 없는 경우 나쁜 점과 단점을 계산할 때 모든 줄의 가정된 신축성에 추가되는 매개변수가 있습니다. 가 \emergencystretch양수이면 TeX는 줄바꿈을 선택하기 전에 단락에 대해 세 번째 패스를 수행합니다. 첫 번째 패스가 and 를 만족하는 방법을 찾지 못한 경우 \pretolerance입니다 \tolerance. 의 효과는 \emergencystretch큰 무한대가 더 작은 무한대와 구별될 수 있도록 나쁜 점을 축소하는 것입니다. 을 \emergencystretch기준으로 충분히 높게 설정하면 가 절대 초과되지 않도록 \hsize할 수 있습니다 \tolerance. 따라서 줄 바꿈 작업이 실제로 불가능하지 않는 한 상자가 가득 찬 일은 결코 발생하지 않습니다.

\rightskip=0pt plus 1fil

TeXbook에서 다시 한번:

예를 들어, 사람이 설정할 수 \rightskip=0pt plus1fil있으며 모든 줄은 오른쪽에 공백으로 채워집니다. 그러나 이는 불규칙한 오른쪽 여백을 만드는 데 특별히 좋은 방법은 아닙니다. 왜냐하면 무한한 신축성은 매우 짧은 선에 나쁜 점을 전혀 할당하지 않기 때문입니다.

여기서는 매우 짧은 줄도 괜찮으므로 하지 말라고 하는 일을 행복하게 할 수 있습니다.

\spaceskip=\fontdimen2\font plus \maxdimen minus \fontdimen4\font

이는 단어 공간을 무한히 확장할 수 있는 효과가 있으며 다른 옵션과 매우 다른 효과를 생성합니다.


이 예에서 처음 세 가지 옵션은 모두 동일한 효과를 생성합니다.

(이미지가 업로드되지 않아 나중에 수정하겠습니다)

마지막 옵션은 상당히 다른 효과를 갖습니다.

(이미지가 업로드되지 않아 나중에 수정하겠습니다)

문서의 어느 곳에나 이러한 명령을 배치할 수 있지만 이 목적을 위해서는 style다음과 같이 키에 추가하는 것이 가장 쉽습니다.

\setuphead[section][
  style=\tfe\em\emergencystretch=\maxdimen,
  align={flushleft, nothyphenated, fullhz, hanging, verytolerant, stretch},
  number=no,
  alternative=margin,
  after={\blank[4*line]},
]

\emergencystretch=\maxdimen일반적으로 상자가 가득 찬 경우에만 적용되므로 다른 모든 옵션보다 사용하는 것을 선호합니다 .

관련 정보