
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 hz
ou fullhz
, hanging
, tolerant
ou verytolerant
, stretch
e 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:
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 align
parece 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 broad
palavra-chave à align
opçã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\emergencystretch
que é 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\emergencystretch
for 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\pretolerance
and\tolerance
. O efeito\emergencystretch
é reduzir as maldades para que os grandes infinitos sejam distinguíveis dos menores. Ao definir\emergencystretch
um valor alto o suficiente (com base em\hsize
), você pode ter certeza de que\tolerance
nunca 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 plus1fil
e 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 à style
chave 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=\maxdimen
todas as outras opções, pois só entra em vigor se houver caixas cheias demais.