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:
- Aumentar o valor de
\tolerance
- Aumentar o valor de
\emergencystretch
Uma vantagem frequentemente citada da segunda estratégia é que o aumento \emergencystretch
afeta 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 \emergencystretch
o 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 \emergencystretch
reduz 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 \emergencystretch
pode ser útil, por exemplo, para composição tipográfica automática, porque ao definir \emergencystretch
suficientemente 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=10000
també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
\emergencytolerance
com um valor padrão de-1
. - Se a segunda passagem falhar e
\emergencystretch
for positiva ou\emergencytolerance
não negativa, a terceira passagem será executada. - O procedimento para a terceira passagem é o seguinte: Se
\emergencystretch
for positivo, então este valor é adicionado à extensibilidade de cada linha ao calcular os defeitos. Se\emergencytolerance
não for negativo, então esse valor será usado como limite para as maldades em vez de\tolerance
, caso contrário,\tolerance
será 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 \emergencystretch
conforme 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:
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...)