¿Dónde se permite cambiar \hsize?

¿Dónde se permite cambiar \hsize?

En el capítulo 23 "Rutinas de salida" hay una advertencia:

Es mejor no jugar con \hsize y \vsize excepto al comienzo de un trabajo, o después de haber expulsado todas las páginas de la memoria de TeX.

Pero enlibro de textoEn sí hay varios ejemplos donde \hsizese cambia:

1) En el ejercicio con story.tex \hsize se establece varias veces en un trabajo de tex.

\hsize=4in \input story
\hsize=3in \input story
...

Supongo que este caso es "legal", porque \ejectse llama al final de story.tex.

Algunos ejemplos más:

2) En la página 115 \hsizese encuentra el interior \topinsert.

3) En la página 223 \hsizese encuentra el interior \vbox.

¿En qué contextos es "legal" modificar \hsizey por qué aparece esta advertencia enlibro de texto? ¿Existe algún ejemplo que muestre lo que puede salir mal si cambiamos \hsizeen un lugar "malo"?

Respuesta1

Qué es \hsize?

El parámetro primitivo \hsizees la longitud que usa TeX para dividir párrafos en líneas (teniendo también en cuenta \leftskip, \rightskipy las instrucciones de forma de párrafo provenientes de \hangindenty \hangafter.

Cuando un párrafo se ha dividido en líneas, TeX aportará una pila de cuadros horizontales de ancho \hsizea la lista vertical actual. El ancho será diferente si se utilizan \hangindenty \hangaftery reflejará el ancho real de cada línea.

Cuando \parshapese usa, es como si \hsizese especificara uno diferente para cada línea.

Considere el código

\input plipsum

\hsize=300pt

\showboxbreadth=1000 \showboxdepth=0 

\lipsum{1}

\showlists

\hsize=200pt

\lipsum{2}

\showlists

\bye

El primer \showlistscomando sale

### vertical mode entered at line 0
### current page:
\glue(\topskip) 3.05556
\hbox(6.94444+1.94444)x300.0, glue set - 0.62798 []
\penalty 150
\glue(\baselineskip) 3.11111
\hbox(6.94444+1.94444)x300.0, glue set 0.38911 []
\glue(\baselineskip) 3.11111
\hbox(6.94444+1.94444)x300.0, glue set - 0.17653 []
\glue(\baselineskip) 3.11111
\hbox(6.94444+1.94444)x300.0, glue set 0.24695 []
\glue(\baselineskip) 3.11111
\hbox(6.94444+1.94444)x300.0, glue set 0.36536 []
\penalty 150
\glue(\baselineskip) 3.11111
\hbox(6.94444+1.94444)x300.0, glue set 227.0554fil []
total height 70.0
 goal height 643.20255
prevdepth 1.94444, prevgraf 6 lines

entonces vemos un párrafo que consta de seis líneas, correspondientes a seis cuadros de 300 puntos de ancho.

La segunda \showlistsinstrucción sale

### vertical mode entered at line 0
### current page:
\glue(\topskip) 3.05556
\hbox(6.94444+1.94444)x300.0, glue set - 0.62798 []
\penalty 150
\glue(\baselineskip) 3.11111
\hbox(6.94444+1.94444)x300.0, glue set 0.38911 []
\glue(\baselineskip) 3.11111
\hbox(6.94444+1.94444)x300.0, glue set - 0.17653 []
\glue(\baselineskip) 3.11111
\hbox(6.94444+1.94444)x300.0, glue set 0.24695 []
\glue(\baselineskip) 3.11111
\hbox(6.94444+1.94444)x300.0, glue set 0.36536 []
\penalty 150
\glue(\baselineskip) 3.11111
\hbox(6.94444+1.94444)x300.0, glue set 227.0554fil []
\glue(\parskip) 0.0 plus 1.0
\glue(\baselineskip) 3.11111
\hbox(6.94444+1.94444)x200.0, glue set 0.68265 []
\penalty 250
\glue(\baselineskip) 3.11111
\hbox(6.94444+1.94444)x200.0, glue set - 0.56822 []
\glue(\baselineskip) 3.11111
\hbox(6.94444+1.94444)x200.0, glue set 0.02776 []
\glue(\baselineskip) 3.11111
\hbox(6.94444+1.94444)x200.0, glue set 0.76903 []
\glue(\baselineskip) 3.11111
\hbox(6.94444+1.94444)x200.0, glue set 1.07141 []
\glue(\baselineskip) 3.11111
\hbox(6.94444+1.94444)x200.0, glue set 0.93843 []
\penalty 100
\glue(\baselineskip) 3.11111
\hbox(6.94444+0.0)x200.0, glue set 0.1729 []
\penalty 100
\glue(\baselineskip) 5.05556
\hbox(6.94444+1.94444)x200.0, glue set 0.93886 []
\penalty 250
\glue(\baselineskip) 5.75002
\hbox(4.30554+0.0)x200.0, glue set 179.41664fil []
total height 178.0 plus 1.0
 goal height 643.20255
prevdepth 0.0, prevgraf 9 lines

Las primeras seis líneas están ahí, busque \parskippara ver dónde comienza el segundo párrafo. Tenemos nueve líneas, todas de 200 puntos de ancho.

¿Dónde es legal cambiar \hsize?

En cualquier lugar. A menos que \parshapese utilice, TeX utilizará el valor \hsizeactual cuando \parse haya escaneado para dividir los párrafos en líneas.

Por supuesto, esta configuración \hsizerespetará la agrupación TeX (si no eres lo suficientemente astuto como para realizar configuraciones globales). Así que si lo intentamos

{\hsize=1pt \nopar\lipsum{1}}\par

obtenemos exactamente lo mismo que antes, porque el cambio a \hsizewill se habrá olvidado cuando \parse encuentre. Tenga en cuenta que no puede tener dos valores distintos para \hsizecuando se está creando un párrafo (salvo \parshape, por supuesto).

¿ \hsizeInfluye en la forma de la página?

No por diseño de TeX. Sin embargo, la rutina de salida puede y probablemente usará el estándar \hsizepara configurar encabezados y pies de página. Por ejemplo, \plainoutput¿ \makeheadlineeso lo hace?

\line{\vbox to 8.5pt{}\the\headline}

y \linees \hbox to \hsize.

Entonces, este es el significado principal de la advertencia de Knuth: si cambia \hsizeen medio de una página, pueden aparecer resultados inesperados, dependiendo de cuándo entre en acción la rutina de salida.

Cambiar \hsizedentro de a \vboxsiempre es seguro, porque ejercitar el generador de páginas cuando se trabaja en una lista vertical secundaria nunca llama a la rutina de salida.

información relacionada