Wo darf \hsize geändert werden?

Wo darf \hsize geändert werden?

Im Kapitel 23 „Ausgaberoutinen“ gibt es eine Warnung:

Es ist am besten, nicht mit \hsize und \vsize herumzuspielen, außer ganz am Anfang eines Jobs oder nachdem Sie alle Seiten aus dem TeX-Speicher ausgeworfen haben.

Aber inTeXbookselbst gibt es mehrere Beispiele, wo \hsizesich etwas geändert hat:

1) In der Übung mit story.tex wird \hsize mehrmals in einem Tex-Job gesetzt.

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

Ich nehme an, dieser Fall ist „legal“, da \ejecter am Ende von story.tex aufgerufen wird.

Einige weitere Beispiele:

2) Auf Seite 115 \hsizeist ein Abschnitt enthalten \topinsert.

3) Auf Seite 223 \hsizesteht innen \vbox.

In welchen Kontexten ist es "legal" zu ändern \hsizeund warum gibt es diese Warnung inTeXbook? Gibt es ein Beispiel, das zeigt, was schief gehen kann, wenn wir \hsizean einer „schlechten“ Stelle wechseln?

Antwort1

Was ist \hsize?

Der primitive Parameter \hsizeist die Länge, die TeX zum Aufteilen von Absätzen in Zeilen verwendet (unter Berücksichtigung von \leftskipund \rightskipder Anweisungen zur Absatzform, die von \hangindentund kommen) \hangafter.

Wenn ein Absatz in Zeilen aufgeteilt wurde, fügt TeX \hsizeder aktuellen vertikalen Liste einen Stapel horizontaler Kästchen mit der Breite hinzu. Die Breite ist unterschiedlich, wenn \hangindentund \hangafterverwendet werden, und spiegelt die tatsächliche Breite jeder Zeile wider.

Bei \parshapeder Verwendung ist es so, als ob \hsizefür jede Zeile etwas anderes angegeben wäre.

Betrachten Sie den Code

\input plipsum

\hsize=300pt

\showboxbreadth=1000 \showboxdepth=0 

\lipsum{1}

\showlists

\hsize=200pt

\lipsum{2}

\showlists

\bye

Der erste \showlistsBefehl gibt aus

### 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

Wir sehen also einen Absatz, der aus sechs Zeilen besteht, was sechs 300 pt breiten Kästchen entspricht.

Die zweite \showlistsAnweisung gibt aus

### 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

Die ersten sechs Zeilen sind da. Suchen Sie danach \parskip, um zu sehen, wo der zweite Absatz beginnt. Wir haben neun Zeilen, alle 200pt breit.

Wo ist eine Änderung legal \hsize?

Überall. Sofern nicht \parshapeverwendet, verwendet TeX den \hsizeaktuellen Wert, als nach \pardem Aufteilen von Absätzen in Zeilen gesucht wurde.

Natürlich \hsizewird diese Einstellung die TeX-Gruppierung berücksichtigen (wenn Sie nicht so hinterhältig sind, globale Einstellungen vorzunehmen). Wenn wir also versuchen

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

wir erhalten genau das Gleiche wie vorher, weil die Änderung zu \hsizevergessen wurde, wenn \pargefunden wird. Beachten Sie, dass Sie nicht zwei verschiedene Werte für haben können, \hsizewenn ein Absatz erstellt wird (außer \parshapenatürlich ).

Beeinflusst es \hsizedie Seitenform?

Nicht so konzipiert, dass TeX das so will. Die Ausgaberoutine kann und wird jedoch wahrscheinlich den Standard \hsizezum Setzen von Kopf- und Fußzeilen verwenden. Zum Beispiel \plainoutputhas , \makeheadlinedas

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

und \lineist \hbox to \hsize.

Dies ist also die Hauptbedeutung von Knuths Warnung: Wenn Sie \hsizemitten auf einer Seite Änderungen vornehmen, können unerwartete Ergebnisse auftreten, je nachdem, wann die Ausgaberoutine in Aktion tritt.

Änderungen \hsizeinnerhalb einer Liste \vboxsind immer sicher, da beim Ausführen des Seitenerstellers beim Arbeiten in einer sekundären vertikalen Liste niemals die Ausgaberoutine aufgerufen wird.

verwandte Informationen