¿Cuál es exactamente el procedimiento que utiliza el algoritmo de salto de línea TeX cuando necesita configurar cuadros demasiado llenos?

¿Cuál es exactamente el procedimiento que utiliza el algoritmo de salto de línea TeX cuando necesita configurar cuadros demasiado llenos?

El TeXbook describe (en el capítulo 14) en detalle cómo TeX calcula los deméritos totales asociados con dividir un párrafo en líneas y que TeX elige la secuencia de puntos de interrupción que producen la menor cantidad de deméritos totales (en un proceso con tres pasos). Sin embargo, sólo describe brevemente qué sucede exactamente si no existe una secuencia de puntos de interrupción que satisfaga los requisitos:

En términos generales, \TeX\ divide los párrafos en líneas de la siguiente manera: los puntos de interrupción se insertan entre palabras o después de guiones para producir líneas cuyas maldades no excedan la ^|\tolerancia| actual. Si no hay forma de insertar dichos puntos de interrupción, se establece un ^{overfull box}.

A continuación no se dan más detalles sobre el escenario de la caja demasiado llena. Estoy interesado en estos detalles: ¿Se puede describir en términos simples qué palabras elige TeX para sobresalir en el margen en tal caso? (¿O hay que leer el código fuente de TeX para entender eso?) Dado que TeX considera un párrafo como un todo, el problema de no tener una secuencia permisible de puntos de interrupción no es realmente causado por una sola palabra.

Además, creo que la afirmación anterior del TeXbook no es del todo correcta: cuando un párrafo contiene un \linebreak, se puede configurar con líneas subcompletas. Este escenario básicamente satisface la premisa "no hay forma de insertar tales puntos de interrupción", sin embargo, TeX establece líneas insuficientes en lugar de líneas excesivamente completas como se indicó anteriormente.

(Esta pregunta es principalmente por interés. Pero, de hecho, existe una situación en la que un párrafo con líneas demasiado completas puede terminar en un documento terminado, es decir, si el tamaño excesivo de las líneas demasiado completas no es superior a \hfuzz.)

Respuesta1

TeX elige saltos de línea basándose en un cálculo de deméritos de línea que se suman en una cantidad llamadademéritos totales.

Un primer paso que no aplique la capacidad de separación de palabras de TeX podría no obedecer los límites establecidos por un parámetro de número entero \pretolerance. Pero la segunda pasada de TeX siempre tiene éxito. Puede que no tenga éxito en el sentido de que TeX tenga que crear líneas demasiado completas. Las líneas completas solo se crean si el usuario las desea.

Lo que quiero decir. Puede configurar \parfillskip=0pty darle a TeX una línea corta con, digamos, solo un espacio e informes TeX y una línea completa. El autor siempre es responsable del último salto de línea; TeX no inserta nada en un párrafo de una línea. De manera similar, un comando de salto de línea que genera \penalty-10000 obliga a TeX a obedecer el deseo del autor de romper la línea en este punto. Es una interrupción forzada de la nada que inserta TeX.

Así es como funciona TeX; Intento usar palabras simples, pero es un tema técnico: TeX rompe líneas en el pegamento (incluso en el kern seguido de pegamento y al final de las matemáticas en línea seguidas de pegamento) o en una penalización, es decir, un guión en el texto, un guión insertado por TeX en la segunda pasada, después de una relación en modo matemático, etc., así como \penalty-10000como se explicó anteriormente.

Por supuesto, TeX cuenta el comienzo del texto como punto de interrupción inicial. Para crear un párrafo, TeX va desde un lugar donde es posible una ruptura (en la segunda pasada, TeX puede crear el lugar a través de un guión insertado) hasta el siguiente hasta el ancho del material recopilado, incluido el encogimiento o La capacidad de estiramiento permite a TeX construir una línea con una maldad que obedece a la tolerancia actual junto con uno de los puntos de interrupción encontrados (o forzados) anteriormente. TeX marca dicho lugar como un punto de interrupción y recuerda el punto de interrupción anterior asociado para que luego pueda ir desde el final del párrafo hasta el comienzo con las líneas que minimizan los deméritos totales.

TeX también crea un punto de interrupción si ve un usuario insertado \penalty-10000. Luego inicia el proceso como si fuera al inicio del párrafo. Ningún punto de interrupción siguiente puede superar este punto de interrupción, es decir, el siguiente punto de interrupción debe registrar este punto de interrupción forzado por el usuario como el punto de interrupción anterior.

Si no se puede encontrar un lugar para construir una línea con una maldad como máximo tan grande como la tolerancia actual, TeX detiene el procesamiento si está en la primera pasada y luego comienza la segunda pasada. De lo contrario, si TeX está en la segunda pasada, busca el siguiente lugar donde sea posible una ruptura sin construir una línea insuficiente. Esto se convierte en un punto de ruptura aunque la línea esté demasiado llena. A continuación, TeX continúa el proceso. Así, la segunda pasada recorre todo el párrafo. Tenga en cuenta que un párrafo puede tener más de una línea demasiado completa.

Si \emergencystretchno es 0pt y la segunda pasada no pudo hacer lo solicitado, es decir, encontrar puntos de interrupción sin una línea demasiado llena o reducir el número de líneas si \looseness=-1, entonces TeX inicia una tercera pasada que funciona como la segunda. La diferencia es que TeX agrega la dimensión del \emergencystretcha la capacidad de estiramiento de cada línea. Por lo tanto, TeX acepta un lugar como punto de interrupción aunque el ancho del material recolectado y la capacidad de estiramiento del material no pueden llenar la línea con una maldad menor o igual a la tolerancia actual. Pero el ancho más la capacidad de estiramiento más la dimensión \emergencystretchson lo suficientemente grandes para hacer eso; Visualmente, esa línea no está llena.

Hay varios parámetros que influyen en el informe y la calificación. Como dijiste, la \hfuzzdimensión puede omitir la regla de exceso de carga, pero eso no cambia el hecho: hay una línea de exceso de carga. Otro parámetro llamado \hbadnesses responsable si se emite una advertencia.

Por lo tanto, no veo por qué el texto citado del TeXbook es incorrecto, ya que es una descripción informal de alto nivel.

información relacionada