(La)TeX cria linhas superlotadas

Quando o TeX está construindo um parágrafo, ele pode fazer várias tentativas até acertar a quebra de linha; em cada tentativa, ele roda o mesmo algoritmo, mas dá a ele parâmetros diferentes. Você pode afetar a forma como a quebra de linha do TeX funciona, ajustando os parâmetros: essa resposta lida com os parâmetros de “tolerância” e elasticidade. O outro “parâmetro” vital é o conjunto de hifenizações a serem aplicadas: veja “Minhas palavras não estão sendo hifenizadas” (e as perguntas relacionadas) para obter ajuda.

Se você estiver recebendo a indesejada mansagem de “caixa superlotada”, o que aconteceu é que o TeX desistiu: os parâmetros que você deu não permitem a produção de um resultado que não superlote. Nesse caso, Knuth decidiu que a melhor coisa era produzir um aviso e deixar o usuário resolver o problema. (A alternativa, ir, silenciosamente, além do chamado “bom gosto” definido para essa execução do TeX, seria de mau gosto para qualquer tipógrafo que se preze.) O usuário pode quase sempre resolver o problema reescrevendo o texto que está provocando o problema — mas isso nem sempre é possível e, algumas vezes, é impossível resolver o problema sem ajustar os parâmetros. Esta resposta discute a abordagem que pode ser usada para resolver o problema, presumindo-se que você acertou a hifenização.

O caso mais simples é quando uma ‘pequena’ palavra não se quebra no fim de uma linha; empurrar a palavra inteira para uma nova linha não vai fazer muita diferença, mas pode tornar a situação tão ruim que o TeX não vai tomar essa ação por conta própria. Nesse caso, você pode tentar o comando do LaTeX \linebreak: ele pode resolver o problema e, se resolver, vai te poupar de muita dor de cabeça. Caso contrário, será necessário ajustar os parâmetros: para fazer isso, nós precisamos recapitular os detalhes dos mecanismos de quebra de linha do TeX.

A primeira tentativa de quebra de linha do TeX é feita antes de qualquer tentativa de hifenização: o TeX define sua “tolerância” de excentricidade de quebra de linha para o valor interno \pretolerance e vê o que acontece. Se não conseguir uma quebra aceitável, o TeX adiciona os pontos de hifenização permitidos pelos padrões definidos no momento e tenta novamente usando o valor interno \tolerance. Se essa tentativa também falhar, e o valor interno \emergencystretch for positivo, o TeX vai tentar de novo usando o valor de \emergencystretch para elasticidade extra dos espaços em cada linha.

Portanto, existem três parâmetros (além da hifenização) que você pode mudar: \pretolerance, \tolerance e \emergencystretch. Ambos os valores de tolerance são números simples, e devem ser definidos pela primitiva de atribuição de contagem do TeX  — por exemplo

\pretolerance=150
Para ambos, uma tolerância “infinita” é representada pelo valor 10000, mas tolerância infinita é raramente apropriada, já que pode levar a quebras de linha muito ruins.

\emergencystretch é um registro interno do TeX de ‘dimen’ e pode ser configurado normalmente como para ‘dimens’ no Plain TeX; no LaTeX, use \setlength — por exemplo:

\setlength{\emergencystretch}{3em}

A escolha do método tem consequências temporais — cada uma das passadas leva um tempo, de forma que adicionar uma passada (mudando \emergencystretch) é menos desejável que suprimir uma (mudando \pretolerance). No entanto, hoje em dia, é incomum achar um computador que seja tão lento que não aguente um passada extra.

Na prática, \pretolerance é raramente usada sem ser para manipular o uso da hifenização; tanto o Plain TeX quanto o LaTeX ajustam seu valor para 100. Para suprimir a primeira varredura por parágrafos, configure \pretolerance para -1.

\tolerance é muitas vezes um bom método para ajustar o espaçamento; tanto o Plain TeX quanto o LaTeX ajustam seu valor para 200. O comando \sloppy do LaTeX adota o valor 9999, assim como o ambiente sloppypar. Esse é o maior valor disponível e pode permitir quebras bem feias (esse autor raramente usa \sloppy “sozinho”, apesar de usar ocasionalmente sloppypar — dessa maneira, a alteração de \tolerance fica confinada ao ambiente). Mais satisfatório é fazer pequenas mudanças progressivas em \tolerance e, depois, ver como as mudanças afetaram o resultado; pequenos incrementos muitas vezes fazem o necessário. Lembre-se de que \tolerance é um parâmetro de parágrafo, pelo que você precisa se certificar de que ele esteja realmente aplicado — veja “Por que os parâmetros de parágrafo são ignorados”. Os usuários do LaTeX podem usar um ambiente como:

\newenvironment{tolerant}[1]{%
  \par\tolerance=#1\relax
}{%
  \par
}
incluindo parágrafos inteiros (ou conjuntos de parágrafos).

O valor de \emergencystretch é adicionado à elasticidade presumida de cada linha de um parágrafo, em uma execução futura do formatador de parágrafo, no caso do parágrafo não ter outro jeito. (A varredura extra acontece se \emergencystretch>0pt — se for zero ou negativo, não haveria nada a se ganhar com a reexecução do formatador de parágrafo.) O exemplo anterior fez o ajuste para 3em; as fontes Computer Modern normalmente usam três pulos de espaço para o em, o que significa que essa mudança permitiria qualquer coisa equivalente a nove espaços extras em cada linha. Em uma linha com muitos espaços, isso pode ser aceitável, mas com, por exemplo, apenas três espaços na linha, cada um poderia se esticar para até quatro vezes sua largura natural. É, portanto, claro que \emergencystretch precisa ser tratado com certa cautela.

Mais sutis (mas mais complicadas de gerenciar) são as extensões microtipográficas fornecidas pelo PDFTeX. Já que o PDFTeX é o “mecanismo” padrão para o funcionamento do LaTeX e do CONTeXT em todas as distribuições, as extensões, hoje em dia, estão disponíveis para todos. Existem duas extensões: kerning de margem e expansão de fonte; kerning de margem afeta apenas o efeito visual da página composta e praticamente não afeta a habilidade do formatador de parágrafo de “acertar as coisas”; expansão de fonte funciona como uma versão mais sutil do truque que o \emergencystretch faz: o PDFTeX ‘sabe’ que a sua fonte atual pode estar esticada (ou encolhida) até certo ponto e exibe essa mudança na hora para otimizar a composição de um parágrafo. Essa é uma ferramenta poderosa do arsenal do tipógrafo.

Como mencionado acima, as extensões microtipográficas são bestas ferozes difíceis de domar; no entanto, o pacote microtype alivia o usuário do tedioso trabalho de especificar como executar ajustes de margem e dimensionar cada fonte … para as fontes que o pacote conhece; é uma boa ferramenta, e os usuários que conseguem levar as especificações de ajuste para outras fontes são sempre bem-vindos.

microtype.sty
microtype


Do you have any question? Ask on: latex.net.br - we love qood questions!