왜 \emergencytolerance 매개변수가 없나요?

왜 \emergencytolerance 매개변수가 없나요?

단어 변경, 레이아웃 변경 등으로 가득 찬 상자를 제거할 수 없는 경우 기본적으로 상자를 제거하는 두 가지 전략이 있습니다.

  1. 가치를 높이다\tolerance
  2. 가치를 높이다\emergencystretch

두 번째 전략의 자주 인용되는 장점은 증가가 \emergencystretch"나쁜" 문단(예: 만족스러운 조판이 불가능한 문단)에만 영향을 미치고 \tolerance"좋은" 문단(즉, 만족스러운 조판이 가능한 문단 \tolerance)에는 영향을 미치지 않는다는 것입니다.

반면에 \emergencystretch줄 바꿈 프로세스를 변경하는 방식은 나에게 적합하지 않은 것 같습니다. \emergencystretch나쁜 점을 계산할 때 각 줄의 신축성에 추가됩니다. 따라서 증가하면 \emergencystretch세 번째 패스에서 불량이 줄어들지만 총 단점 계산에 포함된 다른 매개변수( \hyphenpenalty, \adjdemerits, \doublehyphendemerits, ...)는 변경되지 않습니다. 이로 인해 악의 영향이 줄어들고, 하이픈 등으로 끝나는 줄의 영향이 커집니다. 또한 추가 신축성은 공백이 10개인 선과 공백이 4개인 선에 다른 효과를 갖습니다.

(예를 들어 자동 조판에 유용할 수 있다는 것을 알고 있습니다 . 에 따라 충분히 높게 \emergencystretch설정하면 [입력에 라인보다 넓은 하이픈을 넣을 수 없는 단어와 같은 이상한 것이 포함되지 않는 한] 상자가 너무 꽉 차는 일이 발생하지 않도록 할 수 있기 때문입니다. 또한 지나치게 가득 찬 상자를 생성하지 않지만 끔찍한 줄바꿈 결정으로 이어질 수 있습니다.)\emergencystretch\hsize\tolerance=10000

\emergencytoleranceTeX의 줄바꿈 ​​알고리즘이 세 번째 단계에서 허용오차로 사용하는 값을 선택적으로 지정할 수 있는 매개변수(또는 적절한 이름이 무엇이든)가 없는 이유가 궁금합니다 . 그러면 세 번째 패스는 다음과 같이 작동합니다.

  • \emergencytolerance기본값이 이라는 매개변수가 있습니다 -1.
  • 두 번째 패스가 실패하고 \emergencystretch양수이거나 음수 \emergencytolerance가 아닌 경우 세 번째 패스가 실행됩니다.
  • 세 번째 패스의 절차는 다음과 같습니다. \emergencystretch양수이면 이 값은 불량을 계산할 때 각 라인의 신축성에 추가됩니다. 음수가 아닌 경우 \emergencytolerance이 값은 대신 불량에 대한 제한으로 사용되며 \tolerance, 그렇지 않으면 \tolerance두 번째 패스에서와 같이 사용됩니다.

\emergencystretch이렇게 하면 상자를 너무 많이 채우지 않고 "좋은" 문단을 변경하지 않고 위에서 설명한 대로 증가하는 단점 없이 "나쁜" 문단을 조판할 수 있습니다 . 적어도 eTeX나 pdfTeX(Knuth의 TeX는 기본적으로 동결되어 있습니다)와 같은 최신 엔진에서는 이 기능(구현하기 쉬움)을 사용할 수 없는 이유는 무엇입니까?

답변1

내 의견에 대한 후속 조치(귀하의 질문에 대한 답변은 아닐 수도 있지만, 사람들이 이 사실을 알면 도움이 될 수 있다고 생각합니다).

David가 댓글에 쓴 것처럼 왜 뭔가가 추가되지 않았는지 대답하는 것은 그리 쉽지 않습니다. LuaTeX가 동결되어 있어서 추가되지 않을 것 같다고 들었는데, 요즘에는 LuaMetaTeX에서 가능하다는 정보를 통해 느끼셨으면 좋겠습니다.

설명에 표시된 대로 허용 오차를 늘리는 것보다 훨씬 더 많은 작업을 수행하는 것이 가능합니다. 그러나 아래의 최소 예에서는 허용 오차가 증가하면서 두 개의 구문 분석만 추가합니다.

\setuppapersize[A6]

\showmakeup[page]

\startsetups align:pass:test
    \pretolerance 100
    \tolerance    200
    \parpasses    2
        threshold            0.025pt
        tolerance            400
      next
        threshold            0.025pt
        tolerance            800
    \relax
\stopsetups

\starttext

\samplefile{hawking}

\page[yes]

\setupalignpass[test]
% \tracingonline2
% \tracingpasses2

\samplefile{hawking}

\stoptext

두 페이지를 나란히:

추가 공차가 있는 출력

추적 매크로의 주석 처리를 제거하면 터미널에 추가 정보가 표시됩니다.

그건 그렇고, 이것은 런타임에 거의 아무것도 추가하지 않습니다. 300페이지 분량의 책에서는 4개의 추가 패스(확장 포함)가 1초도 안 되어 추가된 것 같습니다. (그래서 이것은 실제로 TeX가 시간을 보내는 곳이 아닙니다...)

관련 정보