¿Cómo evitar por completo líneas excesivas en ConTeXt?

¿Cómo evitar por completo líneas excesivas en ConTeXt?

He trabajado con ConTeXt durante algunos años y soy muy consciente de que el algoritmo para determinar los saltos de línea no analiza cada línea de forma aislada, sino que básicamente intenta minimizar la "maldad" en todo el párrafo. Entonces, a veces, tener líneas demasiado llenas es simplemente "parte del juego" y debe minimizarse usando hzo fullhz, o hanging, etc.tolerantverytolerantstretch

Sin embargo, ahora me enfrento a la situación en la que me gustaríaen realidadgustaAbsolutamente, totalmente, en última instancia y siempre.evitar líneas demasiado llenas en el encabezado de una sección. Es decir, no importa cuán "mala" sea la línea según el algoritmo de TeX, deberíanuncarecurrir a líneas demasiado llenas. He creado un MWE que ilustra mi 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 a esto:

ingrese la descripción de la imagen aquí

¿Cómo puedo decirle al algoritmo queromperla línea antes de la palabra "títulos" en lugar de recurrir a un cuadro demasiado lleno. Ninguna de las opciones alignparece tener ningún efecto aquí.

Toda ayuda sería muy apreciada.

Respuesta1

Para evitar líneas demasiado llenas con texto irregular que pueden aparecer cuando desactivas la separación de palabras, puedes agregar la broadpalabra clave a la alignopción para mejorar el salto de línea.

\definefont [SectionFont] [Italic sa 4]

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

\starttext

\section{Test overfull headings}

\samplefile{knuth}

\stoptext

Respuesta2

Sin embargo, ahora me enfrento a la situación en la que realmente me gustaría evitar absoluta, total, en última instancia y siempre líneas excesivas en un encabezado de sección. Es decir, no importa cuán "mala" sea la línea según el algoritmo de TeX, nunca se debe recurrir a líneas demasiado completas.

Prácticamente has agotado las opciones disponibles en ConTeXt para este problema. Consulte el comentario de Wolfgang a continuación para conocer una forma mucho mejor de resolver este problema. Respuesta original a continuación:

Por suerte, todavía existen algunas opciones de Plain TeX que podemos utilizar. Puedo pensar en 4 opciones aquí:

\tolerance=10000

Esto se sugiere en el TeXbook:

Por desgracia, regresan cajas demasiado llenas; así que intenta escribir

\tolerance=10000
\input story

para ver que pasa. TeX trata 10000 como si fuera una tolerancia "infinita", permitiendo un espacio arbitrariamente amplio; por lo tanto, una tolerancia de 10000nuncaproducir un cuadro demasiado lleno, a menos que ocurra algo extraño como una palabra sin guiones que sea más ancha que la columna misma.

\emergencystretch=\maxdimen

Nuevamente del TeXbook:

Si desea evitar cajas demasiado llenas a toda costa sin intentar arreglarlas manualmente, puede tener la tentación de configurar \tolerance=10000; esto permite que líneas arbitrariamente malas sean aceptables en situaciones difíciles. Pero la tolerancia infinita es una mala idea, porque TeX no distingue entre líneas terriblemente malas y absurdamente horribles. De hecho, una tolerancia de 10000 anima a TeX a concentrar toda la maldad en un solo lugar, creando una línea verdaderamente desagradable en lugar de dos moderadamente malas, porque una sola "cancelación" produce la menor cantidad de deméritos totales según las reglas. Hay una manera mucho mejor de obtener el efecto deseado: TeX tiene un parámetro llamado \emergencystretchque se agrega a la supuesta capacidad de estiramiento de cada línea cuando se calculan la maldad y los deméritos, en los casos en que las cajas demasiado llenas son inevitables. Si \emergencystretches positivo, TeX hará una tercera pasada sobre un párrafo antes de elegir los saltos de línea, cuando las primeras pasadas no encontraron una manera de satisfacer \pretolerancey \tolerance. El efecto de \emergencystretches reducir las maldades de modo que los infinitos grandes se puedan distinguir de los más pequeños. Al establecer un \emergencystretchvalor lo suficientemente alto (basado en \hsize), puede estar seguro de que \tolerancenunca se excede; por lo tanto, nunca se producirán cajas demasiado llenas a menos que la tarea de romper líneas sea realmente imposible.

\rightskip=0pt plus 1fil

Del TeXbook una vez más:

Por ejemplo, una persona puede configurar \rightskip=0pt plus1fily cada línea se llenará con un espacio a la derecha. Pero esta no es una manera particularmente buena de crear márgenes irregulares a la derecha, porque la capacidad de estiramiento infinita asignará cero maldad a las líneas que son muy cortas.

Aquí estamos de acuerdo con las líneas que son muy cortas, por lo que podemos hacer felizmente lo que nos dicen que no hagamos.

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

Esto tiene el efecto de permitir que los espacios de palabras se extiendan infinitamente y produce un efecto muy diferente al de las otras opciones.


En este ejemplo, las tres primeras opciones producen el mismo efecto:

(La imagen no se cargará, se editará más tarde)

mientras que la última opción tiene un efecto bastante diferente:

(La imagen no se cargará, se editará más tarde)

Puede colocar cualquiera de estos comandos en cualquier parte del documento, pero para este propósito, es más fácil si los agrega a la styleclave de esta manera:

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

En general, prefiero usarla \emergencystretch=\maxdimensobre todas las demás opciones, ya que solo tiene efecto si hay casillas demasiado llenas.

información relacionada