
No capítulo 23 “Rotinas de saída” há um aviso:
É melhor não mexer com \hsize e \vsize exceto no início de um trabalho, ou depois de ter ejetado todas as páginas da memória do TeX.
Mas emTeXbookem si existem vários exemplos onde \hsize
é alterado:
1) No exercício com story.tex \hsize é definido várias vezes em um trabalho tex.
\hsize=4in \input story
\hsize=3in \input story
...
Suponho que este caso seja "legal", porque \eject
é chamado no final de story.tex
Mais alguns exemplos:
2) Na página 115 \hsize
está definido dentro de \topinsert
.
3) Na página 223 \hsize
está definido dentro de \vbox
.
Em quais contextos é “legal” modificar \hsize
e por que existe este aviso emTeXbook? Existe algum exemplo que mostre o que pode dar errado se mudarmos \hsize
para um lugar “ruim”?
Responder1
O que é \hsize
?
O parâmetro primitivo \hsize
é o comprimento que o TeX usa para dividir parágrafos em linhas (levando também em consideração \leftskip
e \rightskip
as instruções de formato de parágrafo provenientes de \hangindent
e \hangafter
.
Quando um parágrafo for dividido em linhas, o TeX contribuirá com uma pilha de caixas horizontais de largura \hsize
para a lista vertical atual. A largura será diferente se \hangindent
e \hangafter
estiver sendo usado e refletirá a largura real de cada linha.
Quando \parshape
está sendo usado, é como se um valor diferente \hsize
fosse especificado para cada linha.
Considere o código
\input plipsum
\hsize=300pt
\showboxbreadth=1000 \showboxdepth=0
\lipsum{1}
\showlists
\hsize=200pt
\lipsum{2}
\showlists
\bye
O primeiro \showlists
comando produz
### 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
então vemos um parágrafo composto por seis linhas, correspondendo a seis caixas de 300 pontos de largura.
A segunda \showlists
instrução produz
### 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
As primeiras seis linhas estão aí, procure \parskip
para ver onde começa o segundo parágrafo. Temos nove linhas, todas com 200 pontos de largura.
Onde é legal mudar \hsize
?
Em qualquer lugar. A menos que \parshape
esteja sendo usado, o TeX usará o valor \hsize
atual quando \par
foi digitalizado para quebrar parágrafos em linhas.
Claro, esta configuração \hsize
respeitará o agrupamento TeX (se você não for desonesto o suficiente para fazer configurações globais). Então, se tentarmos
{\hsize=1pt \nopar\lipsum{1}}\par
obtemos exatamente o mesmo que antes, porque a alteração para \hsize
terá sido esquecida quando \par
for encontrada. Observe que você não pode ter dois valores distintos para \hsize
quando um parágrafo está sendo construído (barring \parshape
, é claro).
Influencia \hsize
o formato da página?
Não por design do TeX. Entretanto, a rotina de saída pode e provavelmente usará o padrão \hsize
para definir cabeçalhos e rodapés. Por exemplo, isso \plainoutput
faz\makeheadline
\line{\vbox to 8.5pt{}\the\headline}
e \line
é \hbox to \hsize
.
Então este é o principal significado do aviso de Knuth: se você mudar \hsize
no meio de uma página, resultados inesperados podem aparecer, dependendo de quando a rotina de saída entrar em ação.
Alterar \hsize
dentro de a \vbox
é sempre seguro, pois exercitar o construtor de páginas ao trabalhar em uma lista vertical secundária nunca chama a rotina de saída.