Por que não há parâmetro \emergencytolerance?

Por que não há parâmetro \emergencytolerance?

Se as caixas excessivamente cheias não puderem ser removidas através de reformulação, alterações de layout, etc., existem basicamente duas estratégias para removê-las:

  1. Aumentar o valor de\tolerance
  2. Aumentar o valor de\emergencystretch

Uma vantagem frequentemente citada da segunda estratégia é que o aumento \emergencystretchafeta apenas os parágrafos "ruins" (ou seja, parágrafos que não podem ser tipografados de forma satisfatória \tolerance) e não altera os parágrafos "bons" (ou seja, parágrafos que podem ser tipografados de forma satisfatória \tolerance).

Por outro lado, a forma como \emergencystretcho processo de quebra de linha muda não me parece muito correto: \emergencystretché adicionado à elasticidade de cada linha ao calcular os defeitos. Assim, o aumento \emergencystretchreduz as maldades na terceira passagem, mas deixa inalterados os demais parâmetros que estão incluídos no cálculo dos deméritos totais ( \hyphenpenalty, \adjdemerits, \doublehyphendemerits, ...). Isso reduz a influência das maldades, enquanto a influência das linhas que terminam com um hífen, etc., aumenta. Além disso, a elasticidade adicional tem um efeito diferente para linhas que têm apenas quatro espaços do que para linhas que têm dez espaços.

(Estou ciente de que isso \emergencystretchpode ser útil, por exemplo, para composição tipográfica automática, porque ao definir \emergencystretchsuficientemente alto dependendo de \hsize, você pode garantir que nunca ocorram caixas cheias demais [a menos que a entrada contenha algo estranho, como uma palavra não hifenizável que seja mais larga que a linha]. \tolerance=10000também nunca produz caixas muito cheias, mas pode levar a decisões horríveis de quebra de linha.)

Eu me pergunto por que não existe nenhum parâmetro \emergencytolerance(ou qualquer nome adequado) que permita especificar opcionalmente um valor que o algoritmo de quebra de linha do TeX usa como tolerância na terceira passagem. A terceira passagem funcionaria mais ou menos assim:

  • Existe um parâmetro chamado \emergencytolerancecom um valor padrão de -1.
  • Se a segunda passagem falhar e \emergencystretchfor positiva ou \emergencytolerancenão negativa, a terceira passagem será executada.
  • O procedimento para a terceira passagem é o seguinte: Se \emergencystretchfor positivo, então este valor é adicionado à extensibilidade de cada linha ao calcular os defeitos. Se \emergencytolerancenão for negativo, então esse valor será usado como limite para as maldades em vez de \tolerance, caso contrário, \toleranceserá usado como na segunda passagem.

Isso permitiria que você compusesse parágrafos "ruins" sem caixas muito cheias, sem alterar os parágrafos "bons" e sem as desvantagens de aumentar \emergencystretchconforme descrito acima. Por que esse recurso (presumivelmente fácil de implementar) não está disponível pelo menos em mecanismos mais recentes, como eTeX ou pdfTeX (o TeX de Knuth está basicamente congelado)?

Responder1

Para dar continuidade ao meu comentário (talvez não seja realmente uma resposta à sua pergunta, mas acho que as pessoas poderiam se beneficiar se estivessem cientes).

Como David escreve no comentário, não é tão fácil responder por que algo não foi adicionado. Ouvi dizer que o LuaTeX está congelado, então provavelmente não será adicionado lá, mas espero que você se sinta revelado pela informação de que hoje em dia é possível, no LuaMetaTeX.

Conforme indicado no comentário é possível fazer muito mais do que apenas aumentar a tolerância. O exemplo mínimo abaixo, entretanto, adiciona apenas mais dois parpasses, com maior tolerância.

\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

As duas páginas lado a lado:

saída, com tolerância adicional

Remover o comentário das macros de rastreamento mostrará mais algumas informações no terminal.

A propósito, isso não acrescenta quase nada ao tempo de execução. Em um livro de 300 páginas, acho que 4 passagens extras (incluindo expansão) adicionaram menos de um segundo. (Então, não é aqui que o TeX passa seu tempo...)

informação relacionada