Onde é permitido alterar \hsize?

Onde é permitido alterar \hsize?

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 \hsizeestá definido dentro de \topinsert.

3) Na página 223 \hsizeestá definido dentro de \vbox.

Em quais contextos é “legal” modificar \hsizee por que existe este aviso emTeXbook? Existe algum exemplo que mostre o que pode dar errado se mudarmos \hsizepara 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 \leftskipe \rightskipas instruções de formato de parágrafo provenientes de \hangindente \hangafter.

Quando um parágrafo for dividido em linhas, o TeX contribuirá com uma pilha de caixas horizontais de largura \hsizepara a lista vertical atual. A largura será diferente se \hangindente \hangafterestiver sendo usado e refletirá a largura real de cada linha.

Quando \parshapeestá sendo usado, é como se um valor diferente \hsizefosse 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 \showlistscomando 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 \showlistsinstruçã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 \parskippara 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 \parshapeesteja sendo usado, o TeX usará o valor \hsizeatual quando \parfoi digitalizado para quebrar parágrafos em linhas.

Claro, esta configuração \hsizerespeitará 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 \hsizeterá sido esquecida quando \parfor encontrada. Observe que você não pode ter dois valores distintos para \hsizequando um parágrafo está sendo construído (barring \parshape, é claro).

Influencia \hsizeo formato da página?

Não por design do TeX. Entretanto, a rotina de saída pode e provavelmente usará o padrão \hsizepara definir cabeçalhos e rodapés. Por exemplo, isso \plainoutputfaz\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 \hsizeno meio de uma página, resultados inesperados podem aparecer, dependendo de quando a rotina de saída entrar em ação.

Alterar \hsizedentro 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.

informação relacionada