PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Odd/Even-Pages und optionaler Seitenumbruch (TeX-Code)



ctansearch
07-11-2012, 22:50
Hallo,
es gab in
http://www.mrunix.de/forums/showthread.php?t=74055
eine Diskussion über die Möglichkeit, festzustellen, ob eine Seite gerade oder ungerade ist und davon abhängige Formatierungen.

Ich hatte es damals als Fehler im Programm angesehen, daß diese Unterscheidung nicht zu Beginn einer Seite möglich ist. Dies ist tatsächlich der Fall und wird von D.E.Knuth auch so beschrieben, da der "Rest" einer Seite jeweils ausgegeben wird, bevor die Seitennummer aktualisiert wird.

Es gibt bis jetzt keine Möglichkeit, diesen Fehler zu korrigieren, es gibt aber ein paar "Workarounds", die im vorangegangenen Thread schon vorgestellt wurden.
Das Problem hängt eng mit dem Problem eines optionalen Seitenumbruchs zusammen.

Ich stelle hier eine Möglichkeit vor, den "Überhang" zumindest zu identifizieren und zu korrigieren und einen optionalen Seitenumbruch einzugeben, ohne die Platzierung von floats zu beeinflussen .
Es ist ein reiner TeX-Code, eine Anpassung an LaTeX steht aus.
Die Vorgehensweise ist, den Punkt durch den Befehl \p zu ersetzen und diesen mit optionalen Befehlen zu versehen, wobei er jeweilige Ort der Ausführung durch eine Zählung der Sätze anhand der Punkte erfolgt.
Das Ziel der Sache ist, eine individuell steuerbare Anzahl von Sätzen pro Seite zu definieren und Überhänge direkt zu beeinflussen.

Man könnte den Punkt auch als \catcode setzen und aktivieren, das macht aber zuviel Aufwand in anderen Bereichen, da der Punkt das häufigste Zeichen in unterschiedlichen Umgebungen ist und man zuviele Ersatzzeichen definieren müsste. Deshalb ist \p die einfachste Möglichkeit.

Würde mich freuen, diesen Ansatz mit euch zu diskutieren.



\nopagenumbers
\newcount\points
\newcount\optbreak
\optbreak=48
\newcount\ejects
\advance\ejects by 1
\advance\points by 1
\parindent=0pt
\def\pointbox{\raise.2\baselineskip
\hbox{
\ifnum\the\points<10 $^{\ \kern-15pt\the\points }$\fi
\ifnum\points>9 $^{\ \kern-15pt\the\points}$\fi
\ifnum\points>99 $^{\ \kern-20pt\the\points}$\fi
}
\ifnum\the\points=\optbreak\vfill\centerline{\the\ ejects}
\eject
\points=0 \advance\ejects
by 1 \ifnum\points=\optbreak \eject\fi \centerline{\the\ejects}\fi
}

\def\p{.\ \pointbox \advance\points by 1}
Das ist der Textk\"orper, ein l\"angerer, nicht langer, einer, der in eine
Zeile passt, um eine Basis zu erhalten\p
%Diesen Satz muss man ganz oft kopieren und einfügen

\bye

klops
08-11-2012, 09:37
Damit funktioniert IMO \frenchspacing nicht mehr.

Und mit dem ursprünglichen Thema hat das AFAIK auch nicht wirklich etwas tun. Denn, ob die aktuelle Seite gerade oder ungerade ist, kannst Du so allenfalls über die Satznummer (vorausgesetzt es wird eine absolute hinzugefügt) ermitteln und das auch nur, weil diese harte Seitenumbrüche einfügen. Das geht aber auch nur so lange, wie die angegebene Maximalzahl an Sätzen auch wirklich auf eine Seite passt.

BTW: Wenn Du ein vollständiges Beispiel daraus machen willst, kannst Du


\long\def\whilenum#1\do #2{\ifnum #1\relax #2\relax\iwhilenum{#1\relax
#2\relax}\fi}
\long\def\iwhilenum#1{\ifnum #1\expandafter\iwhilenum
\else\expandafter\gobble\fi{#1}}
\long\def\gobble#1{}
\newcount\sentence
\sentence=0
\whilenum\sentence<100\do{\advance\sentence by 1
Das ist der Textk\"orper, ein l\"angerer, nicht langer, einer, der in eine
Zeile passt, um eine Basis zu erhalten\p}%

zur Texterzeugung verwenden. Das zeigt dann übrigens, dass 48 bereits einer zu viel ist, um auf eine Standard-plainTeX-Seite zu passen.

Daher: Nette Lösung für ein ganz anderes Problem.

Ob eine catcode-Änderung für den Punkt empfehlenswert wäre, bezweifle ich aber ein wenig. Danach dürfte schon ein einfaches \hrule 10.5pt nicht mehr richtig funktionieren. Wenn man das macht, sollte man das unbedingt in eine Gruppe (in LaTeX käme dafür eine Umgebung) einsperren und dafür entsprechende Einschränkungen dokumentieren.

ctansearch
09-11-2012, 22:09
Hallo,
ob eine Seite gerade/ungerade ist ergibt sich aus der Anzahl der Sätze und dem optionalen Seitenumbruch. Die normale Seitenzählung wird abgeschaltet und durch die Zählung der \ejects ersetzt.

Wie Du ja aus der vorigen Diskussion weißt, halte ich das Fehlen von harten Seitenumbrüchen für das Problem (auch in anderen Fällen). Eine Erzeugung von harten (und steuerbaren) Umbrüchen ist deshalb die Lösung.
Die Maximalanzahl der Sätze pro Seite ist natürlich variabel und kann an jede Seite angepasst werden. Dazu fehlt noch die Bedingung.
Wichtig ist, daß der "Überhang" nun nicht mehr die Seitenzählung beeinflusst, sondern eine "Zwischenseite" entsteht, anhand derer erst greifbar wird, um wieviel die aktuelle Seite "überläuft". Hieraus ergibt sich die o.g. Bedingung, die Anzahl der Sätze der vorigen Seite um die Anzahl der übergelaufenen Sätze zu verringern. Das Ziel wäre, diese Variablen und Bedingungen automatisch zu ermitteln.

Aus einem Durchschnitt aus Satzzahl und Seitenzahl ergibt sich eine Annäherung an die optimale Verteilung, die sich auch aus der Erfahrung und dem individuellen Stil ergeben kann. Hieraus ergibt sich wiederum eine Anpassung und Verfeinerung der Korrekturbedingungen.
Wie im vorigen Thread angesprochen war, fehlt es TeX und LaTeX an einer harmonischen Gesamtverteilung des Textes über das gesamte Dokument, die sich durch diese Methode vielleicht erreichen läßt.
Bequem erscheint mir die Möglichkeit, die Umbrüche als Zahlenwerte einzugeben, was "Satzprofis" doch sympathisch sein müsste. Natürlich ist die Zählung der Punkte ein primitiver Ansatz, der sich hoffentlich noch verfeinern läßt.

Zum \catcode . hatte ich ja das Gleiche gesagt wie Du.

klops
10-11-2012, 11:17
ob eine Seite gerade/ungerade ist ergibt sich aus der Anzahl der Sätze und dem optionalen Seitenumbruch. Die normale Seitenzählung wird abgeschaltet und durch die Zählung der \ejects ersetzt.
Wie bereits erwähnt, funktioniert das aber nur, wenn Du ausschließlich harte Seitenumbrüche hast. Das geht dann aber auch auch einfacher per:

\newcounter{pagebreaks}\setcounter{pagebreaks}{1}\ renewcommand*{\xnewpage}{\stepcounter{pagebreaks}\ newpage}
Aber wer will denn das? Im Allgemeinen will man weder von Hand die Seitenumbrüche setzen noch eine immer gleiche bestimmte Anzahl von Sätzen auf einer Seite haben. Stattdessen will man, dass jede Seite wohlgefüllt ist. Spätestens wenn Du eine Tabelle oder ein anderes Konsultationselement zusammen mit normalem Text auf einer Seite hast, ist der Ansatz über die Anzahl der Sätze absolut unbrauchbar. Aber schon, wenn eine Seite drei Überschriften trägt und eine andere Seite gar keine, wird der Ansatz mit der Anzahl der Sätze schief gehen.

Am Ende landest Du dann entweder bei einem Satz ohne vertikalen Ausgleich mit sehr unterschiedlich viel freiem Platz am Ende der Seiten oder mit vertikalem Ausgleich aber sehr unterschiedlich viel freiem Platz zwischen den Seiten.

Es ist auch keineswegs einfach die maximale Anzahl an Sätzen, bei der es zu keinem automatischen Umbruch mehr kommt, zu ermitteln. Ich habe mir zwecks Test mal von www.lipsum.org nur 20 Absätze an lipsum-Text besorgt und alle Punkte durch \p ersetzt. Dann habe ich die Satzzahl erst auf 99 hochgesetzt. Das war zu viel. Auf die erste Seite gab es einen automatischen Umbruch im 89. Satz. Im zweiten Paket gab es den bereits im 82. Satz. Setzt man nun das Maximum auf 81 Sätze, passt es zwar, auf der ersten Seite wäre aber noch Platz. Also versuchsweise auf 88. Sätze und siehe da, jetzt passen auf die zweite Seite nicht mehr nur 81, sondern 85 Sätze. Also Limit auf 85. Jetzt passen auf die zweite Seite nur noch 84 Sätze. Also das Limit auf 84. Scheint auf den ersten Blick zu passen, ergibt aber eine leere 3. Seite. Also runter auf 83. Das Problem mit der leeren 3. Seite bleibt. Also runter auf 82 und endlich funktioniert es. Aber leider sind nun die Seitenenden von Seite 1 und 2 wieder sehr unterschiedlich.

Danach habe ich aus Interesse volle 100 Absätze erstellen lassen. Die Hoffnung, dass zumindest für diesen vergleichbaren, lediglich etwas mehr Text die Satzzahl halbwegs stabil weiterverwendet werden könnte, hat sich nicht bestätigt. Jetzt gab es wieder einen automatischen Umbruch auf Seite 3. Da passten nur magere 77 Sätze auf die Seite. Mit 77 als Maximum, veränderte sich allerdings natürlich auch der Umbruch auf den ersten beiden Seiten wieder erheblich, so dass auf Seite 3 ganz anderer Text landete. Also blieb nur, schrittweise in Einzelschritten von 82 weiter runter, in der Hoffnung noch eine bessere Satzzahl zu finden. War leider nichts. 77 war tatsächlich das Maximum bis Seite 3. Mit 77 hatte ich dann wieder eine leere 4. Seite (übrigens mit angezeigter Seitennummer 3 oben). Also noch eins runter. Mit 76 ging es dann auf Seite 3, aber auf Seite 5 war es wieder zu viel. Also weiter runter. Am Ende landete ich bei 72 Sätzen Maximum und extrem hüpfendem Seitenende. Weder das Finden der richtigen Satzzahl noch das Ergebnis war dabei wirklich befriedigend.

Deshalb bleibe ich dabei: Der Ansatz ist eine nette Idee für ganz spezielle Dokumente oder ganz spezielle Anforderungen. Für den Massensatz und insbesondere den ganz normalen Buchsatz ist er unbrauchbar. Dafür ist der Satz als Größeneinheit schlicht viel zu variabel. Wie man den verfeinern sollte, außer die Umbrüche alle von Hand zu machen, entzieht sich mir. Wörter zu zählen dürfte schwierig werden und taugt als allgemeinen Ansatz vermutlich auch nicht mehr. Selbst Buchstaben sind als allgemeiner Ansatz unbrauchbar, weil Absätze unterschiedlich stark gefüllte letzte Zeilen haben und eben auch Überschriften etc. zu berücksichtigen wären. Ein komplettes Buch mit manuellen Seitenumbrüchen (das wäre die Idee mit \xnewpage) versehen will auch niemand. Das würde uns ins Zeitalter des Handsatzes mit beweglichen Lettern zurück werfen. Erst recht will niemand die resultierenden Einschränkungen nur dazu in Kauf nehmen, um den Zwei-Pass-Ansatz zur Feststellung der aktuellen Seitennummer (oder ob diese gerade oder ungerade ist) über einen der erprobten Mechanismen zu vermeiden.

Leider kann ich das Beispiel mit Text hier nicht einstellen, weil der Beitrag dann weit mehr als die maximal erlaubten 15000 Zeichen lang wird.

ctansearch
10-11-2012, 22:04
Schön, daß Du meinen Vorschlag so intensiv prüfst, aber ich denke Du gehst zu schnell vor.
Immerhin versuche ich hier ein grundsätzliches Problem von TeX zu lösen und es ist klar, daß dies nicht ad hoc funktionieren kann. Eigentlich müsste man das gesamte Space-, Glue und Penalty-System überarbeiten, aber vielleicht geht es ja auch einfacher ?
Wie gesagt, ist TeX eine große und gute Kompromißmaschine, aber gerade ihre Vorteile kommen einem in Quere, wenn man exakt setzen will. Mit einem kleinen C-Programm lässt sich das ganz leicht lösen,(ein kleiner Präprozessor würde die Probleme in Millisekunden erledigen), aber ich versuche es hier im fehlerhaften TeX. Warum nicht? Kann TeX nur gut tun.

Dein Hinweis auf Überschriften etc, also Elemente mit abweichenden Größen ist richtig, greift als Argument aber nicht, da man natürlich den Umgang mit solchen Ausnahmen auch neu definieren muß, wenn man etwas Grundsätzliches verbessert.
Die unruhigen Ergebnisse beobachte ich bei einem heterogenen Text so nicht, aber das sei dahingestellt. Du hast sicher bemerkt, daß man die Anzeige der Satznummern abstellen kann? Ich frage nur zur Sicherheit, weil diese einen Einfluss auf den vertikalen Ausgleich haben.

Ich würde es jedoch begrüßen, wenn Du Deine Fähigkeiten zur Lösung des Problems einsetzen würdest, statt nur zur Widerlegung meiner Vorschläge.

Eine Frage wäre: Kennst Du eine Möglichkeit, den Befehl zum Seitenumbruch beliebig im Text vor oder zurück zu verschieben?