Como evitar absolutamente linhas excessivas no ConTeXt?

Como evitar absolutamente linhas excessivas no ConTeXt?

Trabalho com ConTeXt há alguns anos e estou bem ciente de que o algoritmo para determinar quebras de linha não analisa cada linha isoladamente, mas basicamente tenta minimizar a "maldade" em todo o parágrafo. Então, às vezes, ter linhas muito cheias é apenas "parte do jogo" e deve ser minimizado usando hzou fullhz, hanging, tolerantou verytolerant, stretche assim por diante.

No entanto, deparo-me agora com a situação que gostariarealmentegostaria deabsolutamente, totalmente, em última instância e sempreevitar linhas muito cheias em um cabeçalho de seção. Ou seja, não importa quão "ruim" a linha se torne de acordo com o algoritmo do TeX, ela devenuncarecorrer a linhas excessivamente cheias. Eu criei um MWE que ilustra meu problema:

\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

que se parece com isso:

insira a descrição da imagem aqui

Como posso dizer ao algoritmo paraquebrara linha antes da palavra "títulos" em vez de recorrer a uma caixa excessivamente cheia. Nenhuma das opções alignparece ter qualquer efeito aqui.

Toda ajuda seria muito apreciada.

Responder1

Para evitar linhas muito cheias com texto irregular que podem aparecer quando você desativa a hifenização, você pode adicionar a broadpalavra-chave à alignopção para melhorar a quebra de linha.

\definefont [SectionFont] [Italic sa 4]

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

\starttext

\section{Test overfull headings}

\samplefile{knuth}

\stoptext

Responder2

No entanto, estou agora enfrentando a situação que eu realmente gostaria de evitar absoluta, totalmente, em última instância e sempre, linhas excessivamente cheias em um cabeçalho de seção. Ou seja, não importa o quão "ruim" a linha se torne de acordo com o algoritmo do TeX, ela nunca deve recorrer a linhas cheias demais.

Você praticamente esgotou as opções disponíveis no ConTeXt para esse problema. Veja o comentário de Wolfgang abaixo para uma maneira muito melhor de resolver isso. Resposta original abaixo:

Felizmente, ainda existem algumas opções do Plain TeX que podemos usar. Posso pensar em 4 opções aqui:

\tolerance=10000

Isso é sugerido no TeXbook:

Infelizmente, caixas cheias demais retornam; então tente digitar

\tolerance=10000
\input story

para ver o que acontece. O TeX trata 10.000 como se fosse uma tolerância "infinita", permitindo um espaço arbitrariamente amplo; assim, uma tolerância de 10.000nuncaproduzir uma caixa muito cheia, a menos que algo estranho ocorra, como uma palavra não hifenizável que seja mais larga que a própria coluna.

\emergencystretch=\maxdimen

Novamente do TeXbook:

Se você quiser evitar caixas cheias a todo custo sem tentar consertá-las manualmente, você pode ficar tentado a definir \tolerance=10000; isso permite que linhas arbitrariamente ruins sejam aceitáveis ​​em situações difíceis. Mas a tolerância infinita é uma má ideia, porque o TeX não distingue entre linhas terrivelmente ruins e absurdamente horríveis. Na verdade, uma tolerância de 10.000 incentiva o TeX a concentrar toda a maldade em um só lugar, criando uma linha verdadeiramente desagradável em vez de duas linhas moderadamente ruins, porque uma única "baixa" produz o menor número de deméritos totais de acordo com as regras. Há uma maneira muito melhor de obter o efeito desejado: o TeX tem um parâmetro chamado \emergencystretchque é adicionado à elasticidade presumida de cada linha quando a maldade e os deméritos são computados, nos casos em que caixas cheias demais são inevitáveis. Se \emergencystretchfor positivo, o TeX fará uma terceira passagem sobre um parágrafo antes de escolher as quebras de linha, quando as primeiras passagens não encontraram uma forma de satisfazer o \pretoleranceand \tolerance. O efeito \emergencystretché reduzir as maldades para que os grandes infinitos sejam distinguíveis dos menores. Ao definir \emergencystretchum valor alto o suficiente (com base em \hsize), você pode ter certeza de que \tolerancenunca será excedido; portanto, caixas cheias demais nunca ocorrerão, a menos que a tarefa de quebra de linha seja realmente impossível.

\rightskip=0pt plus 1fil

Do TeXbook mais uma vez:

Por exemplo, uma pessoa pode definir \rightskip=0pt plus1file cada linha será preenchida com um espaço à direita. Mas esta não é uma maneira particularmente boa de criar margens irregulares para a direita, porque a elasticidade infinita atribuirá zero maldade às linhas que são muito curtas.

Aqui estamos bem com linhas muito curtas, então podemos fazer com alegria o que nos diz para não fazer.

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

Isso tem o efeito de permitir que os espaços de palavras se estendam infinitamente e produz um efeito muito diferente das outras opções.


Com este exemplo, todas as três primeiras opções produzem o mesmo efeito:

(a imagem não será carregada, será editada mais tarde)

enquanto a última opção tem um efeito bem diferente:

(a imagem não será carregada, será editada mais tarde)

Você pode colocar qualquer um desses comandos em qualquer lugar do documento, mas para esse propósito, é mais fácil adicioná-los à stylechave assim:

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

Em geral, prefiro usar \emergencystretch=\maxdimentodas as outras opções, pois só entra em vigor se houver caixas cheias demais.

informação relacionada