Si las casillas demasiado llenas no se pueden eliminar mediante nuevas palabras, cambios de diseño, etc., existen básicamente dos estrategias para eliminarlas:
- Aumentar el valor de
\tolerance
- Aumentar el valor de
\emergencystretch
Una ventaja frecuentemente citada de la segunda estrategia es que el aumento \emergencystretch
só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 \emergencystretch
que cambia el proceso de salto de línea no me parece del todo correcta: \emergencystretch
se suma a la capacidad de estiramiento de cada línea al calcular las maldades. Así, al aumentar \emergencystretch
se 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 \emergencystretch
puede ser útil, por ejemplo, para la composición tipográfica automática, porque al establecer un valor \emergencystretch
lo 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=10000
Ademá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
\emergencytolerance
con un valor predeterminado de-1
. - Si el segundo pase falla y
\emergencystretch
es positivo o\emergencytolerance
no negativo, se ejecuta el tercer pase. - El procedimiento para la tercera pasada es el siguiente: Si
\emergencystretch
es positivo, entonces este valor se suma a la capacidad de estiramiento de cada línea al calcular los defectos. Si\emergencytolerance
no es negativo, entonces este valor se usa como límite para las maldades en lugar de\tolerance
; de lo contrario,\tolerance
se 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 \emergencystretch
como 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:
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...)