¿Por qué no hay ningún parámetro \emergencytolerance?

¿Por qué no hay ningún parámetro \emergencytolerance?

Si las casillas demasiado llenas no se pueden eliminar mediante nuevas palabras, cambios de diseño, etc., existen básicamente dos estrategias para eliminarlas:

  1. Aumentar el valor de\tolerance
  2. Aumentar el valor de\emergencystretch

Una ventaja frecuentemente citada de la segunda estrategia es que el aumento \emergencystretchsólo afecta a los párrafos "malos" (es decir, los párrafos que no se pueden componer de forma satisfactoria \tolerance) y no cambia los párrafos "buenos" (es decir, los párrafos que se pueden componer de forma satisfactoria \tolerance).

Por otro lado, la forma en \emergencystretchque cambia el proceso de salto de línea no me parece del todo correcta: \emergencystretchse suma a la capacidad de estiramiento de cada línea al calcular las maldades. Así, al aumentar \emergencystretchse reducen los males en la tercera pasada, pero se dejan sin cambios los demás parámetros que se incluyen en el cálculo de los deméritos totales ( \hyphenpenalty, \adjdemerits, \doublehyphendemerits, ...). Esto reduce la influencia de las maldades, mientras que aumenta la influencia de las líneas que terminan con un guión, etc. Además, la capacidad de estiramiento adicional tiene un efecto diferente para las líneas que tienen sólo cuatro espacios que para las líneas que tienen diez espacios.

(Soy consciente de que \emergencystretchpuede ser útil, por ejemplo, para la composición tipográfica automática, porque al establecer un valor \emergencystretchlo suficientemente alto dependiendo de \hsize, puede garantizar que nunca se produzcan cuadros demasiado llenos [a menos que la entrada contenga algo extraño como una palabra sin guiones que sea más ancha que la línea]. \tolerance=10000Además, nunca produce cajas demasiado llenas, pero puede llevar a decisiones horribles de romper líneas).

Me pregunto por qué no hay ningún parámetro \emergencytolerance(o cualquier nombre adecuado) que le permita especificar opcionalmente un valor que el algoritmo de salto de línea de TeX utiliza como tolerancia en la tercera pasada. El tercer paso funcionaría así:

  • Hay un parámetro llamado \emergencytolerancecon un valor predeterminado de -1.
  • Si el segundo pase falla y \emergencystretches positivo o \emergencytoleranceno negativo, se ejecuta el tercer pase.
  • El procedimiento para la tercera pasada es el siguiente: Si \emergencystretches positivo, entonces este valor se suma a la capacidad de estiramiento de cada línea al calcular los defectos. Si \emergencytoleranceno es negativo, entonces este valor se usa como límite para las maldades en lugar de \tolerance; de lo contrario, \tolerancese usa como en la segunda pasada.

Esto le permitiría componer párrafos "malos" sin casillas demasiado llenas, sin cambiar los párrafos "buenos" y sin las desventajas de aumentar \emergencystretchcomo se describe anteriormente. ¿Por qué esta característica (presumiblemente fácil de implementar) no está disponible al menos en motores más nuevos como eTeX o pdfTeX (el TeX de Knuth está básicamente congelado)?

Respuesta1

Para dar seguimiento a mi comentario (tal vez no sea realmente una respuesta a su pregunta, pero creo que a la gente le vendría bien estar al tanto).

Como escribe David en el comentario, no es tan fácil responder por qué no se agregó algo. Escuché que LuaTeX está congelado, por lo que probablemente no se agregará allí, pero espero que se sienta revelado por la información de que hoy en día es posible en LuaMetaTeX.

Como se indica en el comentario, es posible hacer mucho más que simplemente aumentar la tolerancia. Sin embargo, el ejemplo mínimo siguiente solo agrega dos pasos parciales más, con mayor tolerancia.

\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

Las dos páginas una al lado de la otra:

salida, con tolerancia adicional

Al descomentar las macros de seguimiento se mostrará más información en la terminal.

Por cierto, esto no añade casi nada al tiempo de ejecución. En un libro de 300 páginas, creo que 4 pases adicionales (incluida la expansión) agregaron menos de un segundo. (Entonces, aquí no es realmente donde TeX pasa su tiempo...)

información relacionada