
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 \hsize
sich 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 \eject
er am Ende von story.tex aufgerufen wird.
Einige weitere Beispiele:
2) Auf Seite 115 \hsize
ist ein Abschnitt enthalten \topinsert
.
3) Auf Seite 223 \hsize
steht innen \vbox
.
In welchen Kontexten ist es "legal" zu ändern \hsize
und warum gibt es diese Warnung inTeXbook? Gibt es ein Beispiel, das zeigt, was schief gehen kann, wenn wir \hsize
an einer „schlechten“ Stelle wechseln?
Antwort1
Was ist \hsize
?
Der primitive Parameter \hsize
ist die Länge, die TeX zum Aufteilen von Absätzen in Zeilen verwendet (unter Berücksichtigung von \leftskip
und \rightskip
der Anweisungen zur Absatzform, die von \hangindent
und kommen) \hangafter
.
Wenn ein Absatz in Zeilen aufgeteilt wurde, fügt TeX \hsize
der aktuellen vertikalen Liste einen Stapel horizontaler Kästchen mit der Breite hinzu. Die Breite ist unterschiedlich, wenn \hangindent
und \hangafter
verwendet werden, und spiegelt die tatsächliche Breite jeder Zeile wider.
Bei \parshape
der Verwendung ist es so, als ob \hsize
fü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 \showlists
Befehl 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 \showlists
Anweisung 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 \parshape
verwendet, verwendet TeX den \hsize
aktuellen Wert, als nach \par
dem Aufteilen von Absätzen in Zeilen gesucht wurde.
Natürlich \hsize
wird 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 \hsize
vergessen wurde, wenn \par
gefunden wird. Beachten Sie, dass Sie nicht zwei verschiedene Werte für haben können, \hsize
wenn ein Absatz erstellt wird (außer \parshape
natürlich ).
Beeinflusst es \hsize
die Seitenform?
Nicht so konzipiert, dass TeX das so will. Die Ausgaberoutine kann und wird jedoch wahrscheinlich den Standard \hsize
zum Setzen von Kopf- und Fußzeilen verwenden. Zum Beispiel \plainoutput
has , \makeheadline
das
\line{\vbox to 8.5pt{}\the\headline}
und \line
ist \hbox to \hsize
.
Dies ist also die Hauptbedeutung von Knuths Warnung: Wenn Sie \hsize
mitten auf einer Seite Änderungen vornehmen, können unerwartete Ergebnisse auftreten, je nachdem, wann die Ausgaberoutine in Aktion tritt.
Änderungen \hsize
innerhalb einer Liste \vbox
sind immer sicher, da beim Ausführen des Seitenerstellers beim Arbeiten in einer sekundären vertikalen Liste niemals die Ausgaberoutine aufgerufen wird.