
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 \hsize
se 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 \eject
se llama al final de story.tex.
Algunos ejemplos más:
2) En la página 115 \hsize
se encuentra el interior \topinsert
.
3) En la página 223 \hsize
se encuentra el interior \vbox
.
¿En qué contextos es "legal" modificar \hsize
y por qué aparece esta advertencia enlibro de texto? ¿Existe algún ejemplo que muestre lo que puede salir mal si cambiamos \hsize
en un lugar "malo"?
Respuesta1
Qué es \hsize
?
El parámetro primitivo \hsize
es la longitud que usa TeX para dividir párrafos en líneas (teniendo también en cuenta \leftskip
, \rightskip
y las instrucciones de forma de párrafo provenientes de \hangindent
y \hangafter
.
Cuando un párrafo se ha dividido en líneas, TeX aportará una pila de cuadros horizontales de ancho \hsize
a la lista vertical actual. El ancho será diferente si se utilizan \hangindent
y \hangafter
y reflejará el ancho real de cada línea.
Cuando \parshape
se usa, es como si \hsize
se 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 \showlists
comando 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 \showlists
instrucció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 \parskip
para 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 \parshape
se utilice, TeX utilizará el valor \hsize
actual cuando \par
se haya escaneado para dividir los párrafos en líneas.
Por supuesto, esta configuración \hsize
respetará 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 \hsize
will se habrá olvidado cuando \par
se encuentre. Tenga en cuenta que no puede tener dos valores distintos para \hsize
cuando se está creando un párrafo (salvo \parshape
, por supuesto).
¿ \hsize
Influye 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 \hsize
para configurar encabezados y pies de página. Por ejemplo, \plainoutput
¿ \makeheadline
eso lo hace?
\line{\vbox to 8.5pt{}\the\headline}
y \line
es \hbox to \hsize
.
Entonces, este es el significado principal de la advertencia de Knuth: si cambia \hsize
en medio de una página, pueden aparecer resultados inesperados, dependiendo de cuándo entre en acción la rutina de salida.
Cambiar \hsize
dentro de a \vbox
siempre es seguro, porque ejercitar el generador de páginas cuando se trabaja en una lista vertical secundaria nunca llama a la rutina de salida.