PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Überprüfen ob Gerade oder ungerade Seite vorliegt / \isodd{\thepage}



ClemensU
09-10-2012, 14:21
Hallo,
in einer eigenen Bilderumgebung habe ich die Option eingebaut, die Bildunterschrift links oder rechts vom Bild zu setzen. Dabei muss entweder eine 1 für eine rechte Seite, oder eine 0 für eine linke Seite als Argument (neben dem Bild, der Unterschrift, etc.) übergeben werden.
Wenn ich manuell als Argument 0 oder 1 eingebe, funktioniert alles ganz wunderprächtig. Nur suche ich natürlich eine automatische Alternative, sodass ich nicht bei jeder Änderung alles neu mit 1en und 0en versehen muss.
Kennt jemand einen Befehl, der einfach als Rückgabewert der Seitenzahl entsprechend nur eine 1 oder 0 liefert? Ich habe bspw. \isodd{\thepage} ausprobiert, dass liefert aber mehr als nur eine binäre Zahl. Ist das Paket boolexpr vieleicht eine Lösung? Siehe bspw.

http://tex.stackexchange.com/a/6037

Danke für jeden Tipp!

ctansearch
09-10-2012, 14:38
\documentclass[twoside]{book}
\begin{document}
\ifodd\thepage YES \else NO \fi
\newpage
\ifodd\thepage YES \else NO \fi
\newpage
\ifodd\thepage YES \else NO \fi
\end{document}

ClemensU
09-10-2012, 14:55
Hallo,
danke ich habs mal probiert. Es funktioniert leider nicht. Auf einer Seite kann ich zwar mit

\ifodd\thepage{}1\else{}0\fi

korrekterweise die Zahl drucken. Ich kann aber in meiner Befehl nicht schreiben

\figbeside{...}...{\ifodd\thepage{}1\else{}0\fi}

weil irgendwie die Nummer fehlt?!? (Missing number, treated as zero)

Die Umgebung habe übrigens so implementiert:

\newcommand{\figbeside}[9]{%
\ifthenelse{#9=1}{%
...
}{%
...
}%
}

ctansearch
09-10-2012, 15:21
Es wäre ein schöneres Arbeiten, wenn Du ein Minimalbeispiel geben würdest.

klops
09-10-2012, 15:39
\ifodd zusammen mit \thepage ist aus zwei Gründen Unfug. Zum einen kann \thepage auch nicht numerisch sein (beispielsweise ii), zum anderen hat LaTeX eine asynchrone Ausgabe, so dass \thepage außer in Kopf- und Fuß oder unmittelbar nach einem \newpage nicht zuverlässig die aktuelle Seite angibt. Beweis:

\documentclass{article}
\usepackage{blindtext}
\begin{document}
\blindtext[10] This isn't page \thepage.
\end{document}

KOMA-Script bietet deshalb mit \ifthispageodd eine sichere Methode zur Unterscheidung von geraden und ungeraden Seiten. Diese wird von KOMA-Script-Klassen auch von der captionbeside-Umgebung verwenden, wenn diese zwischen linken und rechten Seiten unterscheiden soll. Wenn man keine KOMA-Script-Klasse verwendet, kann man \ifthispageodd trotzdem verwenden, wenn man das Paket scrextend lädt. Näheres zu diesem Paket ist der KOMA-Script-Anleitung, scrguide.pdf oder scrguien.pdf, zu entnehmen.

ClemensU
09-10-2012, 15:39
Hast Recht ;)



\documentclass[twoside]{book}
\usepackage{ifthen}

\newcommand{\figbeside}[3]{%
\ifthenelse{#1=1}{%
\framebox{#2 #3}}{%
\framebox{#3 #2}}}

\begin{document}

\ifodd\thepage{}1\else{}0\fi \\ % gibt korrekterweise 1 aus
\figbeside{\ifodd\thepage{}1\else{}0\fi}{a}{b} \\
\figbeside{1}{a}{b} \\
\figbeside{0}{a}{b}

\newpage

\ifodd\thepage{}1\else{}0\fi \\ % gibt korrekterweise 0 aus
\figbeside{\ifodd\thepage{}1\else{}0\fi}{a}{b} \\
\figbeside{1}{a}{b} \\
\figbeside{0}{a}{b}

\end{document}

ClemensU
09-10-2012, 15:45
Hall klops,
danke für die Korrektur, hilft aber auch nicht weiter:


\documentclass[twoside]{book}
\usepackage{ifthen,scrextend}

\newcommand{\figbeside}[3]{%
\ifthenelse{#1=1}{%
\framebox{#2 #3}}{%
\framebox{#3 #2}}}

\begin{document}

\ifthispageodd{1}{0} \\ % gibt korrekterweise 1 aus
%
\figbeside{\ifthispageodd{1}{0}}{a}{b} \\
%
\figbeside{1}{a}{b} \\
\figbeside{0}{a}{b}

\newpage

\ifthispageodd{1}{0} \\ % gibt korrekterweise 0 aus
%
\figbeside{\ifthispageodd{1}{0}}{a}{b}

\end{document}

ClemensU
09-10-2012, 15:54
Ich habe den Befehl einfach überarbeitet und spare mir ab sofort das Argument mit der Seite...

\newcommand{\figbeside}[2]{%
\ifthispageodd{%
\framebox{#1 #2}}{%
\framebox{#2 #1}}}

localghost
09-10-2012, 17:17
Wechsle zu einer Klasse aus KOMA-Script (http://ctan.org/pkg/koma-script) und benutze \captonbeside* oder sieh dir das Paket sidecap (http://ctan.org/pkg/sidecap) an. Nur so als Tipp, bevor Du das Rad neu erfindest.


Thorsten
____________
* Könnte schon durch das Paket scrextend bereitgestellt werden.

ctansearch
09-10-2012, 20:08
@ClemensU

Auch wenn alles schon irgendwie da ist, so macht es doch mehr Spass, es selbst zu schreiben. Eine Möglichkeit, die Unsauberkeiten von \thepage zu umgehen wäre diese:


\documentclass[twoside]{book}
\global\newcounter{mynumber}
\usepackage[ngerman]{babel}
\usepackage{blindtext}
\makeatletter
\renewcommand{\@evenhead}{\thepage\hfil\slshape\le ftmark \setcounter{mynumber}{0}}%
\renewcommand{\@oddhead}{{\slshape\rightmark}\hfil \thepage \setcounter{mynumber}{1}}%
\makeatother
\newcommand{\testfig}{
\begin{figure}[htb]
\framebox{Das ist die Box die über die gesamte
Seite geht}
\ifnum\themynumber=0\caption{ODD.Figure Kontrolle: Seitenzahl\thepage}\else
\ifnum\themynumber=1 \caption{EVEN.Figure}Kontrolle: Seitenzahl\thepage \fi\fi \end{figure}}

\begin{document}
\newpage
\testfig \blindtext \testfig
\newpage
\blindtext \testfig
\newpage
\testfig
\newpage
\blindtext[10] \testfig
\end{document}

localghost
09-10-2012, 20:50
[…] Auch wenn alles schon irgendwie da ist, so macht es doch mehr Spass, es selbst zu schreiben. […]
Das kann man natürlich machen, wenn man seine Zeit nicht in wichtigere Dinge investieren will (oder muss).

klops
10-10-2012, 08:25
@ctansearch: Nein, das funktioniert so auch nicht!!!

\documentclass[twoside]{book}
\global\newcounter{mynumber}
\usepackage[ngerman]{babel}
\usepackage{blindtext}
\makeatletter
\renewcommand{\@evenhead}{\thepage\hfil\slshape\le ftmark \setcounter{mynumber}{0}}%
\renewcommand{\@oddhead}{{\slshape\rightmark}\hfil \thepage \setcounter{mynumber}{1}}%
\makeatother
\newcommand{\testfig}{
\begin{figure}[htb]
\framebox{Das ist die Box die über die gesamte
Seite geht}
\ifnum\themynumber=0\caption{ODD.Figure Kontrolle: Seitenzahl\thepage}\else
\ifnum\themynumber=1 \caption{EVEN.Figure}Kontrolle: Seitenzahl\thepage \fi\fi \end{figure}}

\begin{document}
\newpage
\testfig \blindtext \testfig
\newpage
\blindtext \testfig
\newpage
\testfig
\newpage
\blindtext[10] \testfig\testfig\testfig\testfig\testfig\blindtext[10]
\end{document} Das ergibt auf Seite 7 EVEN-Ausgaben. Ich nehme an, dass Du die asynchrone Ausgabe leider noch immer nicht verstanden hast. Kopf- und Fuß werden erst zusammengebaut, wenn der Seiteninhalt bereits fest steht. Inhalte werden erst auf konkrete Seiten verteilt, wenn sie bereits fertig gesetzt sind. Dabei können sich Inhalte für mehrere Seiten – darunter auch eine größere Anzahl von Gleitobjekten – in der Pipeline befinden, wenn die erste Seite davon ausgegeben wird. Es kann auch passieren, dass dabei mehrere Seiten auf einmal ausgegeben werden. Das ist übrigens auch ein Grund, warum \afterpage (aus dem gleichnamigen Paket) nicht immer nach der aktuellen Seite zu einer Ausgabe führt, sondern teilweise erst einige Seiten später.

Ich sehe so häufig irgendwelchen Unsinn mit \thepage. Es wäre schön, wenn nicht ständig neuer hinzugefügt würde! Wenn es so einfach wäre, wie Du Dir vorstellst, dann würden Pakete wie scrextend sicher nicht umständlich über die aux-Datei arbeiten, um korrekt zu arbeiten. In der KOMA-Script-Anleitung ist AFAIK sogar erwähnt, dass das ganze noch ein wenig komplizierter ist, weil Situationen denkbar sind, in denen die Entscheidung niemals korrekt getroffen werden kann.

ctansearch
10-10-2012, 08:54
@klops

Nun, der Fehler liegt dann wohl in der Definition von \thepage, der wiederum weitere Fehler produziert oder Workarounds wie KOMA oder \afterpage erfordert.
Der gesunde Menschenverstand erwartet halt bei \thepage eine Seitenzahl und nicht eine Funktion der Kopf-und Fußzeilen, die mehr oder weniger zufällig funktioniert.
Ansonsten sind auch die schon bestehenden Lösungen bloss Workarounds, so what?
Kurz gesagt, \thepage sollte so einfach funktionieren, wie ich mir das vorstelle, dann wird auch nicht ständig irgendein Unsinn hinzugefügt.:p
Statt sich drüber aufzuregen, sollte man Lösungen suchen, oder?

rstuby
10-10-2012, 10:53
ctansearch, dann ist es aber ein Fehler, DASS \thepage überhaupt definiert ist, solange LaTeX noch nicht weiß, auf welcher Seite der Text letztendlich landet. Man müsste es so regeln, dass die Benutzung von \thepage innerhalb des Textkörpers schlicht zu einer Fehlermeldung führt.

ctansearch
10-10-2012, 13:12
@rstuby
Danke für den Hinweis, ich arbeite dran.

ClemensU
10-10-2012, 14:41
Wechsle zu einer Klasse aus KOMA-Script (http://ctan.org/pkg/koma-script) und benutze \captonbeside* oder sieh dir das Paket sidecap (http://ctan.org/pkg/sidecap) an. Nur so als Tipp, bevor Du das Rad neu erfindest.


Thorsten
____________
* Könnte schon durch das Paket scrextend bereitgestellt werden.

Danke für den Tipp,
die KOMA Klasse möchte ich aus Formatierungsgründen nicht nutzen, d.h. weil ich die Sachen, die ich bei der Standardklasse einstelle, auch bei der scr... Variante einstellen müsste. Das sidecap Paket kenne ich, aber es lieferte nicht das gewünschte Ergebnis und war mir zudem einfach zu überfrachtet. Irgendwie nahm es auch Änderungen über die figure Umgebung hinaus vor. Daher hab ich die Umgebung selbst geschrieben; der Aufwand hielt sich doch einigermaßen in Grenzen, obwohl ich kein großer LaTeX Kenner bin.
Ganz allgemein muss ich sagen, dass dein Ratschlag mit der Zeit zwar berechtigt ist (vor allem da ich gerade die letzte Arbeit des Studiums schreibe ;), allerdings habe ich festgestellt, dass ich bei einigen Pakete genausoviel, wenn nicht mehr, Zeit darin investiert habe, diese zu verstehen, anstatt das gewünschte Ergebnis selbst zu programmieren.

Clemens

klops
11-10-2012, 08:32
Der gesunde Menschenverstand erwartet halt bei \thepage eine Seitenzahl und nicht eine Funktion der Kopf-und Fußzeilen, die mehr oder weniger zufällig funktioniert.
Vom Ansatz her durchaus richtig. Nur müsste man dazu u. a. \write voll expandierbar überladen, um \thepage vor dem eigentlichen \write, aber nicht vor einem \immediate\write umzudefinieren was entweder unmöglich oder aber fehleranfällig sein dürfte. Darüber hinaus müsste dann auch der \label/\pageref-Mechanismus so erweitert werden, dass \thepage voll expandierbar die aktuelle Seite liefern könnte. Das ist eventuell ebenfalls nicht trivial. Außerdem wäre es mit \thepage nicht getan. \arabic{page}, \Alph{page}, \alph{page} etc. müssten ebenfalls etwas anderes liefern. Insgesamt wäre die Spezifikation dieser ganzen Makros zu ändern. Stattdessen erscheint es mir bei genauerer Betrachtung doch sinnvoller, das so zu lassen und weiterhin zu deklarieren, dass \thepage die Ausgabe des aktuellen Werts des Zähler page ist, während man die aktuelle Seitenzahl nur über \label/\pageref erhält. Und wie gesagt: \thepage ist für numerische Vergleiche ohnehin untauglich und war es schon immer.

Dein neuerlich kritisiertes Beispiel krankt auch nicht an \thepage, sondern daran, dass Deine Definition innerhalb der Kopfzeile anders wirkt, als Du Dir das gedacht hast. Ist also kein \thepage-Problem.


Ansonsten sind auch die schon bestehenden Lösungen bloss Workarounds, so what?
Ich würde eine sauber funktionierende Lösung nicht nur als Workaround bezeichnen. Aber selbst wenn Du darauf bestehst, macht es doch einen Unterschied, ob ein Workaround funktioniert oder nur genauso falsch ist wie der ursprüngliche Lösungsversuch.



Kurz gesagt, \thepage sollte so einfach funktionieren, wie ich mir das vorstelle, dann wird auch nicht ständig irgendein Unsinn hinzugefügt.
Dann musst Du aber erst einmal eine Lösung für den numerischen Vergleich mit einer nicht zwingend rein numerischen Ausgabe liefern. \ifodd ist wie gesagt bereits nach einem einfachen \pagenumbering{roman} und erst recht nach etwas wie \renewcommand*{\thepage}{\thechapter-\arabic{page}} vollkommen untauglich.


Statt sich drüber aufzuregen, sollte man Lösungen suchen, oder?
Die Lösung habe ich bereits genannt: \ifthispageodd wahlweise aus einer KOMA-Script-Klasse oder dem Paket scrextend. Darüber hinaus gibt es weitere Pakete, wie countref und zref, die man für den Vergleich heranziehen kann. Ein Teil der Lösung besteht dann natürlich auch darin, dass Leute Hinweise, die sie bekommen, auch ernst nehmen und ggf. auch mal Anleitungen lesen. LaTeX war leider noch nie ein rein intuitives System, wobei Intuition ohnehin eine sehr subjektive Angelegenheit ist.

Betrachte das nun bitte nicht als persönlichen Angriff. Ich würde mir einfach nur von allen hier wünschen, dass sie sich merken, dass man bei LaTeX erst nach der Ausgabe der Seite sagen kann, auf welcher Seite etwas gelandet ist und Seitenkopf- und -fuß Elemente der Ausgabe und nicht der Erzeugung des Inhalts sind.

TeX selbst ist extrem komplex, auch noch für langjährige Entwickler. LaTeX ist nur eine Makro-Erweiterung von TeX und kann deshalb die Komplexität nicht komplett verbergen. LaTeX3 ist übrigens vom Ansatz her eine andere Sprache, die theoretisch auch auf einer anderen Maschine als TeX implementiert werden könnte. Leider ist es aber noch nicht so weit, dass man Dokumente komplett auf LaTeX3-Basis ohne Verwendung von LaTeX2e-Makros erstellen könnte. Und selbst wenn dem so wäre, gäbe es derzeit keine alternative Maschine und müsste das Dokument auch so erstellt werden, dass es ohne Expansionsannahmen (beispielsweise für Argumente) auskommt.

ctansearch
11-10-2012, 23:30
@klops
Danke für die ausführliche Antwort.

Meiner Meinung nach "krankt" die Sache an der Perfektion und Komplexität, die Latex mittlerweile erreicht hat. Der enorme Vorteil, daß Latex umfangreiche Vorlagen über viele Seiten hinweg fast optimal setzen kann, bedeutet hier einen Nachteil, weil zwischen großen Textkörpern und Abbildungen etc und, wie in Deinem Beispiel, bei aufeinanderfolgenden Float-Objekten, kein echter, sondern nur ein relativer Seitenumbruch vollzogen wird. Dieser relative Seitenumbruch wird nicht gezählt, ein echter findet nicht statt, kann also auch nicht gezählt werden. (Das heißt: Es wird nicht am Text, sondern am Output gefeilt).

Die Lösung für dieses Problem läge darin, daß der Autor mehr gestalterische und setzerische Arbeit auf sich nehmen müsste (welche ja eigentlich auch den Hauptspaß an TeX und LaTeX ausmachen). Er müsste also jede einzelne Seite gestalten und selbst den Überblick darüber behalten, wie das gesamte Erscheinungsbild seines Werkes sich entwickelt.

An dieser Stelle werden sich wahrscheinlich die Haare der LaTeX-Fans sträuben (ich bin auch einer !), aber LaTeX ist tatsächlich nur eine, wenn auch gute, Kompromißmaschine.
Je mehr von diesen notwendigen Kompromissen die Software regelt, desto weniger Verständnis und Verstehen für den Prozess der Gestaltung wird beim Anwender übrigbleiben.
An dem kleinen Beispiel \thepage wird deutlich, wie sehr die Anwender diese Gestaltung aus der Hand geben und sich auf das Anwenden und Verstehen der umfangreichen Pakete und Makros verlegen und dafür enorm viel Zeit aufwenden. Selbstverständlich sind solche Makros, Klassen etc als eine Leistung anzuerkennen, aber wenn, wie hier durch mich und ClemensU angedeutet, das Verstehen einer vorgefertigten Lösung mehr Zeit und Mühe erfordert, als das Auffinden der eigenen Lösungen, dann läuft was schief.

Der Kern des Gedankens ist, daß das eigentliche Ziel, nämlich die Komposition einer Seite nach bestimmten Regeln und die wiederholte Komposition der nächsten Seite nach denselben Regeln, aus der Hand gegeben wird und die schwierige Arbeit der Kompromisse auch den Programmen oder vorgefertigen Lösungen überantwortet wird.

Das Ergebnis wird langfristig nicht sein, daß der Autor sein Werk selbst gestaltet, sondern, daß er aus einer Reihe von Vorlagen das passende Layout aussucht.

Das bringt sicher bessere Ergebnisse, schmälert aber den Spass an der Sache und die Individualität. Es ist das alte Spiel zwischen Standard und Kreativität.

Mag jeder halten wie er will, ich favorisiere für mich aber das eigene Ausprobieren. Ich bin daher sehr dafür, wenn Anwender ermutigt werden, das Rad immer neu zu erfinden oder zumindest mal eines selbst zu bauen. Das vertieft das Verständnis und macht auch mehr Spass und es erweitert letztlich auch die Möglichkeiten von TeX/LaTeX. Mancher komplizierte Umweg wird oft durch verblüffende Einfacheit ersetzt.

Letztlich war der Ausgangspunkt für D.E.Knuth der Wunsch, die Texte so aussehen zu lassen, wie er es sich vorstellte. Das sollte der Maßstab bleiben, auch wenn die Texte nicht immer professionellen Ansprüchen genügen. Perfektion ist immer auch eine Sackgasse.

Ziel des TeX-Systems ist, daß alle Quellcodes auf jedem System das gleiche Ergebnis erzeugen. Das Ziel ist nicht, gleichförmige Dokumente zu erzeugen.
Ich habe nichts gegen verlässliche Formen und Standards,die durch ein Dokument führen, aber wenn diese Standards den Gestaltungsspielraum der Autoren blockieren, dann ist das der falsche Weg.

Zurück zum Thema. TeX und LaTeX fehlt es an einer Funktion, reale Umbrüche in einen Text oder zwischen Floats (oder gar innerhalb von Floats) einzufügen. Dann würde \thepage auch wie gewünscht funktionieren.

Donalduck
11-10-2012, 23:49
Das Ergebnis wird langfristig nicht sein, daß der Autor sein Werk selbst gestaltet, sondern, daß er aus einer Reihe von Vorlagen das passende Layout aussucht.
Das sehe ich nicht unbedingt so. Gerade mit so netten Sachen wie LuaLaTeX lassen sich doch von Leuten, die sich nicht so mit TeX auskennen, hoffentlich in Zukunft noch nette Sachen bauen, weil eben Lua wesentlich einfacher ist. Auch dass sich mit XeTeX und LuaLaTeX eigene Schriftarten laden lassen, ist doch ein wesentlicher Fortschritt gegenüber den alten Schriftinstallationen, bei denen es die meisten dann doch einfach bei CM gelassen haben.

Ansonsten stimme ich dir zu, ich finde es sehr schade dass man so wenig Zugriff auf den Seitenumbruch hat.

klops
12-10-2012, 11:16
Man kann jederzeit einen realen Seitenumbruch in den Text einfügen. Je nachdem, was welche Art von Umbruch man will, geht das mit \linebreak[4]\pagebreak[4], \newpage, \clearpage, \cleardoublepage etc. Was das allerdings mit Deiner mehrfach fehlerhaften Anwendung von \thepage oder mit Deiner fehlerhaften Nutzung eines Zählers über die Begrenzung des Seitenkopfes hinaus zu tun haben soll, habe ich nicht verstanden.

Was natürlich nicht geht, ist das Einfügen eines Seitenumbruchs in ein Element, in dem Seitenumbrüche per Definition verhindert werden sollen.

Nichts desto trotz: Niemand hat je behauptet, dass LaTeX das richtige Werkzeug für jeden ist. Wer volle Kontrolle über das Ergebnis haben will oder muss, ist beispielsweise mit einem DTP-Programm vermutlich besser beraten. Ich glaube aber nicht, dass das das Ausgangsproblem war. Das Ausgangsproblem war schlicht gerade und ungerade Seiten beim Satz zu unterscheiden. Dafür gibt es Lösungen, eine funktionierende wurde genannt.

ctansearch
12-10-2012, 21:16
@klops :D

Na ja, jetzt schlägst Du vor, daß man die Seiten von Hand einrichten muß, weil das Programm Fehler hat. Das führt Dein Gegenbeispiel allerdings ad absurdum, da es den Fehler in meiner Lösung, den Du demonstrieren wolltest, gar nicht gibt, wenn man keine seitenübergreifenden Elemente benutzt.

PS: Tatsächlich ist in vielen Anwendungen, wie man auch in den Foren erkennen kann, eine häufiges Problem, daß Latex keine echten Seiten-Spalten oder Zeilenumbrüche einfügen kann, woraus eine Menge an Problemen resultieren, die dann mit großen Aufwand umschifft werden.

Wäre vielleicht ein Thema für die Entwickler.

klops
13-10-2012, 12:18
Na ja, jetzt schlägst Du vor, daß man die Seiten von Hand einrichten muß, weil das Programm Fehler hat.
Nö, ich antworte lediglich auf die Behauptung, man habe nicht genügend Kontrolle über den Seitenumbruch. Also genau auf Behauptungen wie:


Tatsächlich ist in vielen Anwendungen, wie man auch in den Foren erkennen kann, eine häufiges Problem, daß Latex keine echten Seiten-Spalten oder Zeilenumbrüche einfügen kann
Ich habe mehrere Möglichkeiten aufgezeigt, um echte Spalten- und Seitenumbrüche einzufügen. Für Zeilenumbrüche habe ich implizit eine Möglichkeit gezeigt. Weitere existieren. Hier scheint mir doch sehr, dass das Hauptproblem ist, dass man LaTeX wirklich lernen sollte.

Insgesamt sehe ich bei LaTeX wirklich andere Probleme als wesentlich tiefer verwurzelt und schwerwiegender als die Frage, wie man einen Zeilen- oder Seitenumbruch einfügen kann. Ich rede da von Dingen wie registerhaltiger Satz, der bei LaTeX extrem viel Handarbeit erfordert oder umflossene Objekte im Mehrspaltensatz. Das sind echte Probleme, deren Lösung tatsächlich noch so mancher Entwicklerhand bedürfen, falls sie überhaupt je gelöst werden.

Ansonsten bin ich heilfroh, dass TeX keinen Trivialzeilenumbruch im Stil gängiger Textverarbeitungen, sondern einen ordentlichen, parametrierbaren Absatzumbruch bietet. Insbesondere zusammen mit microtype arbeitet der auch so gut, dass ich extrem selten in den Absatzumbruch eingreifen muss. Auch für den Seitenumbruch reicht meist eine \looseness-Anpassung oder in ganz seltenen Fällen ein \enlargepage oder \clearpage an der richtigen Stelle, wobei das meist eher Schönheitskorrekturen auf hohem Niveau sind, auf die man ggf. auch verzichten könnte. Das einzige, was ich zur Optimierung des Seitenumbruchs öfter mache, ist bei den float-Parametern einzugreifen, die mir in der Voreinstellung oft zu restriktiv sind. Dazu kommt dann hin und wieder eine !-Option oder ein leichtes Verschieben eines Gleitobjektes im Quelltext. Alles kein Hexenwerk. Und alles hat nichts mit der Frage zu tun, ob eine Seite gerade oder ungerade ist …

cgnieder
13-10-2012, 14:04
Wenn man partout weder eine KOMA-Klasse noch scrextend verwenden möchte, kann man auch changepage einsetzen:


\documentclass{article}

\usepackage{changepage}
\strictpagecheck
\makeatletter
\newcommand*\ifthispageisodd{%
\checkoddpage
\ifoddpage
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi}
\makeatother

\begin{document}

\ifthispageisodd{odd}{even}
\newpage
\ifthispageisodd{odd}{even}

\end{document}

Grüße

cgnieder
13-10-2012, 14:28
Der gesunde Menschenverstand erwartet halt bei \thepage eine Seitenzahl [...]

Das ist nur korrekt, wenn man \thecounter nicht vollständig verstanden hat. Diese Befehle sollten man nicht mit \the verwechseln. Mein (eventuell aber ungesunder ;) ) Menschenverstand erwartet auch eine Ausgabe wie »-- Seite 5 --«. Die \thecounter sind dazu da, den Wert eines Zählers in einer bestimmten Formatierung auszugeben. \thesubsection enthält ja üblicherweise auch nicht nur die Nummer der Subsection sondern eine Kombination mit der Nummer der Section. Um die reinen Zahlenwerte zu erhalten, verwendet man je nach Umstand \arabic{counter} oder \value{counter}.


Kurz gesagt, \thepage sollte so einfach funktionieren, wie ich mir das vorstelle
Ich weiß nicht... Sollte sich nicht die eigene Vorstellung lieber den echten Gegebenheiten anpassen?

Grüße

ctansearch
13-10-2012, 20:31
@cgnieder
"Ich weiß nicht... Sollte sich nicht die eigene Vorstellung lieber den echten Gegebenheiten anpassen?"

Ja, wenn es nicht anders geht, aber ich glaube schon, daß es anders gehen wird, aber das wird dann nicht \thepage heißen.

Mal sehen.

ctansearch
15-10-2012, 23:44
@klops

Hier scheint mir doch sehr, dass das Hauptproblem ist, dass man LaTeX wirklich lernen sollte.
Auf solche Seitenhiebe solltest Du wirklich verzichten. Ich maße mir auch kein Urteil darüber an, was Du von TeX oder LaTeX verstanden oder darüber gelernt hast.
Die Probleme. die ich angesprochen habe, sind Kernprobleme von TeX und LaTeX, wobei Du leider nicht verstanden hast, was ich meinte. Die Lösungen, die Du anbietest, bestätigen das für mich.
Aber das führe ich hier nicht weiter aus, lieber präsentiere ich bei Gelegenheit meine eigene Lösung ...

cgnieder
15-10-2012, 23:54
Ich nehme ja ungern Stellung, aber Du hattest geschrieben

[...] daß Latex keine echten Seiten-Spalten oder Zeilenumbrüche einfügen kann [...]

Das ist eben eindeutig falsch, weshalb Klops' Bemerkung nicht wirklich überraschend ist. Es sei denn natürlich, Du meinst mit „echte ...umbrüche“ etwas anderes als die Ergebnisse von \newpage, \clearpage, \cleardoublepage, \newline, \par und \\. In dem Fall wäre ich eindeutig neugierig, was Du meinst?

Nichts für Ungut und viele Grüße

ctansearch
16-10-2012, 00:29
@cgnieder

Ok, zur Klärung:

Ich meine, daß LaTeX nicht in der Lage ist, nach Notwendigkeit selbständig explizite Umbruch-Befehle in den Quelltext einzufügen, so wie es der Autor per \clearpage etc tun kann. Dies ist derzeit nur über den Umweg über ein externes Programm möglich, da TeX/LaTeX nicht in der Lage ist, die Anzahl der Zeichen abzüglich der \commands zu bestimmen.

Die fraglichen Umbrüche werden eben nicht von LaTeX , sondern per Hand vom Autor eingefügt. Mein Ziel und Wunsch ist es, daß LaTeX den Quelltext direkt beeinflussen kann und an bestimmten Stellen \clearpage etc einfügen kann, und zwar nicht anhand von Befehlen, sondern anhand von Berechnungen.

cgnieder
16-10-2012, 00:45
Ok, ich verstehe eher, aber nicht vollständig. Mein Wissen über LaTeXs Output Routine ist eher begrenzt.

LaTeX (und noch mehr TeX) berechnet ja durchaus, was auf die aktuelle Seite kann und was nicht bzw. im Fall von Zeilen wie ein Absatz am besten gebildet wird. Ich nehme an, Du kennst die entsprechenden Kapitel aus dem TeXbook?

Wenn meine Ahnung stimmt, dann wirst Du mit Deinem Wunsch mindestens abwarten müssen, bis LaTeX3 erschienen ist. Das wird eine neue Output-Routine haben, die vielleicht manchmal bessere Entscheidungen trifft als die jetzige. Diese wird aber genauso wie die jetzige letztlich dem TeX-Mechanismus der Seitenbildung unterliegen und daher auch nicht immer unter- oder übervolle Boxen (worauf die Probleme ja letztlich in der Regel hinauslaufen) vermeiden können.

Vielleicht gibt einem LuaLaTeX ja Möglichkeiten (davon verstehe ich aber noch weniger).

Ganz abgesehen davon, dass ich ehrlich gesagt die seltenen Male, in denen man selbst eingreifen muss (und das ja auch erst nachdem man das Dokument so weit fertig hat und am Feinschliff ist), durchaus verschmerzbar finde.

Grüße

klops
16-10-2012, 17:28
Auf solche Seitenhiebe solltest Du wirklich verzichten.
Wieso Seitenhieb? Ich meine das ernst: Für viele Anwender ist es ein Problem, dass man LaTeX erst wirklich lernen muss, bevor man es anwenden und verstehen kann. Das ist kein Seitenhieb, sondern eine Feststellung.


Mein Ziel und Wunsch ist es, daß LaTeX den Quelltext direkt beeinflussen kann und an bestimmten Stellen \clearpage etc einfügen kann, und zwar nicht anhand von Befehlen, sondern anhand von Berechnungen.
Verstehe ich das richtig: Du hättest gerne, dass LaTeX einen Seitenumbruch durchführt und im Zuge dieses Seitenumbruchs den Quelltext verändert? Davon abgesehen, dass solche dauerhaften Änderungen am Quelltext bei späteren Änderungen durch den Setzer/Autor sehr störend sein können, entzieht sich mir, was der Vorteil davon sein soll. Für Dein Problem mit \thepage wird das jedenfalls nicht benötigt. Hierfür muss nicht der Quelltext selbst verändert werden, sondern lediglich eine Hilfsdatei. Genau das machen die existierenden, funktionierenden Lösungen, die bisher genannt wurden.


lieber präsentiere ich bei Gelegenheit meine eigene Lösung ...
Die passende Gelegenheit wäre jetzt und hier. Vielleicht verstehe ich dann ja, was Du uns die ganze Zeit sagen willst und was Du an den real existierenden und funktionierenden Lösungen auszusetzen hast. Für geniale Lösungen bin ich immer zu haben!

Um um das nochmal ganz klar zu machen: Ich bin durchaus nicht der Meinung, dass LaTeX der Weisheit letzter Schluss ist. Fehlerhafte Scheinlösungen und Ideen, die meiner Meinung nach nicht konsequent zu Ende gedacht wurden, muss ich deshalb aber nicht unwidersprochen stehen lassen. Das würde weder den Lesern, die das nicht selbst erkennen können, nützen, noch dem Urheber, der es eventuell schlicht übersehen hat. Niemand kann alles wissen (und ich weiß bei TeX und damit auch bei LaTeX mit Sicherheit so einiges noch nicht).

ctansearch
16-10-2012, 22:59
@klops
Ok, soweit, sogut.

Zum Abschluss sei noch gesagt, daß mein Vorschlag keine "fehlerhafte Scheinlösung" ist, sondern, den korrekten Vorgang eines Seitenaufbaus und -abschlusses vorausgesetzt, die richtige Lösung,
die nur deshalb in Deinem Gegenbeispiel nicht funktioniert, weil TeX und LaTeX eben keinen korrekten Seitenaufbau und Seitenabschluss durchführen, sondern versuchen, den Blick auf die Seite mit dem
Blick auf das ganze Dokument zu vereinbaren.
Das ist ein sehr anspruchsvolles Ziel, das beide Programme erstaunlich gut verwirklichen, aber eben nicht hundertprozentig.
Dies wird durch Deine Anwendung von \blindtext und von aufeinander folgenden Floats deutlich.
Es gibt ein paar Möglichkeiten, dies zu verbessern, aber die will ich erstmal selbst ausprobieren.

Demnächst mehr...

cgnieder
16-10-2012, 23:09
[...] mein Vorschlag [...] ist [...] die richtige Lösung,
die [...] nicht funktioniert, weil TeX und LaTeX eben keinen korrekten Seitenaufbau und Seitenabschluss durchführen [...]

Ich verstehe nicht: wie kann eine Lösung in und für LaTeX richtig sein, wenn sie nicht (oder nur in Spezialfällen) funktioniert, sondern aufgrund von intrinsischen Eigenschaften von LaTeX versagt? Das scheint mir ein Widerspruch in sich selbst zu sein... oder habe ich Dich missverstanden?

Grüße

ctansearch
17-10-2012, 00:05
@cgnieder

Genau das ist das Problem von LaTeX: Die Lösungen sind nicht "richtig", sondern nur die besten Kompromisse, die das Programm aus einer Menge von Anweisungen ableiten kann. LaTeX ist nur die Anwendung der mächtigen Makrosprache von TeX, entfernt sich aber durch die schier unendliche Variationsbreite von den Kernproblemen.

Die Menge von Anweisungen innerhalb von LaTeX steigt exponentiell mit der Zahl der Anwender und es entsteht ein gewaltiges System von Ausnahmebedingungen in Form von Vorlagen und extrem ausgearbeiteten Spezialfällen, wie sie zum Beispiel KOMA-Script und die riesige Menge von Styles, die man auf CTAN finden kann, darstellen.

Die meisten sind gut und hilfreich, das stelle ich nicht in Frage, und es ist ein großer Vorteil von TeX, daß es solche Variationen möglich macht. Mich interessieren aber mehr die grundsätzlichen Programmfehler, weil deren Korrektur eine Menge von Spezialfällen und Workarounds überflüssig machen wird.

Es hat ein wenig mit dem "back to the roots" Gedanken zu tun. Ausgefeilte Syteme wie KOMA-Script sind vielleicht qualitativ herausragend, stellen aber effektiv eine Verarmung dar, weil sie das Grundsystem und das Verstehen des Grundsystems behindern.

Kurz gesagt: Mir ist es derzeit wichtiger, TeX zu verstehen und eigene Lösungen zu entwickeln, als vorgefasste Lösungen zu benutzen. Diese nehmen mir bloss den Spass an TeX weg und verkürzen die Möglichkeiten, die TeX bietet, auf modische Standards.

Es gibt immer wieder den Spruch, man müsse "das Rad nicht neu erfinden".

Ich finde, das ist ein dummer Spruch. Erstens macht es Spaß, das Rad zu erfinden, zweitens irren die, die glauben, es erfunden zu haben...ausser D.E.Knuth.

cgnieder
17-10-2012, 00:28
Nun, es ist wohl eine Frage dessen, was man unter „richtig“ versteht. Das TeX und LaTeX Limitationen haben, ist ja wohl unbestritten. Eine LaTeX-Lösung, die funktioniert, als falsch zu bezeichnen, weil das zugrunde liegende System andere Lösungen unmöglich macht, halte ich jedoch auch für falsch und am Kern vorbei. Und eine Lösung als richtig zu bezeichnen, die ein anderes Grundverhalten von LaTeX voraussetzen würde, ebenso. Wenn einen das stört, muss man es machen wie Hans Hagen und ConTeXt erfinden.

Ich finde, man muss hier ganz klar zwischen Designfehlern oder eher -unzulänglichkeiten, und konkreten Programmierfehlern, unterscheiden. Das Programmieren in LaTex muss eben mit LaTeXs Design umgehen, genauso wie Programmieren in TeX mit dessen Begebenheiten umgehen muss.

In meinen Augen stellen Anwendungen wie KOMA-Script keineswegs eine Verarmung dar, sondern vielmehr eine Bereicherung, gerade auch weil sie quelloffen sind und man im Quelltext nachsehen kann, wie Lösungen umgesetzt wurden. Zumal man auch zwischen dem TeX-Programmieren-Lernen und dem konkreten Setzen von Dokumenten unterscheiden muss. Will ich ersteres, dann will ich keine vorgefassten Lösungen verwenden sondern durch das selbstschreiben lernen, wie man ein Problem lösen kann. Will ich letzteres, dann will ich nicht das Rad erfinden, sondern ein fertiges verwenden, um meine Aufgabe möglichst schnell erledigen zu können und mich auf den Inhalt meines Dokuments konzentrieren zu können.

Grüße

klops
17-10-2012, 08:54
weil TeX und LaTeX eben keinen korrekten Seitenaufbau und Seitenabschluss durchführen, sondern versuchen, den Blick auf die Seite mit dem
Blick auf das ganze Dokument zu vereinbaren.
Auch hier scheinst Du wieder zu irren. Weder TeX noch LaTeX führen eine globale Seitenoptimierung durch. Das Problem resultiert eigentlich genau daraus, dass dies nicht geschieht. TeX führt einen nach vom Anwender veränderbaren Parametern einen semi-optimierten Absatzumbruch durch. Dieser wird dann in die Seitenbox eingefügt. Wenn dadurch die Seitenbox höher als die Seite wird, dann wird die Ausgaberoutine angestoßen. In der Ausgaberoutine wird dann der Teil der Seitenbox zusammen mit Kopf- und Fuß und inserts zusammengebastelt, der auf eine Seite passt und ausgegeben. Der Rest verbleibt in der Seitenbox. Ist diese noch immer zu hoch wird erneut die Ausgaberoutine aufgerufen.

Gleitobjekte baut LaTeX zunächst in einer Reihe dafür reservierter getrennter Boxen zusammen. Diese Boxen werden ebenfalls in der Ausgaberoutine nach vom Anwender veränderbaren Parametern eingefügt.

Boxen werden weder von TeX noch von LaTeX nach dem Zusammenbau neu gesetzt. Die Seitenbox wird lediglich zerteilt. LaTeX kann daran auch nichts ändern, weil TeX gar nicht die Information bereit stellt, um die Box neu aufzubauen. Hier wäre eine globale Optimierung von TeX-Seite, bei der nicht nur die vorhandene Box zerteilt, sondern der Rest neu aufgebaut wird, hilfreich. Dies wäre allerdings ein tiefer Eingriff in TeX selbst. Ob das überhaupt so weit realisierbar wäre, dass quasi der Quelltext neu ausgeführt wird, ist fraglich, Wir dürfen nicht vergessen, dass TeX eine Makrosprache ist. Eine einzige Anweisung im Quelltext kann zu vielen Seiten Ausgabe führen.

Ich bin nach wie vor gespannt, wie Du die Seitenzahl der aktuellen Seite oder auch nur die Frage, ob die aktuelle Seite gerade oder ungerade ist, ohne einen \label/\ref-artigen Mechanismus ermitteln und darauf entsprechend der Anfrage reagieren willst. Das ist nämlich, wie bereits mehrfach erwähnt, kein LaTeX, sondern ein TeX-Problem. Ich habe vor LaTeX bereits einige Zeit mit plainTeX gearbeitet. Dort benötigt man dafür ebenfalls eine Hilfsdatei und mehr als einen Pass. Im Gegensatz zu LaTeX, muss man sich das dort allerdings selbst basteln.

Im übrigen habe ich gar nichts gegen eine selbst gebastelte Lösung. Sie muss nur funktionieren. Alles, was Du bisher an Code zum Thema vorgeschlagen hast, funktioniert aber nicht. Ich würde das dann nicht gerade als richtige Lösung bezeichnen. Dagegen würde ich die Lösungen, die wirklich funktionieren nicht als Workaround oder gar falsch bezeichnen, nur weil sie tatsächliche Arbeitsweise von TeX berücksichtigen. Ebenso wenig würde ich den Seitenaufbau von TeX oder LaTeX als falsch bezeichnen, nur weil asynchron ist und vielleicht auf den ersten Blick nicht bis in seine letzte Konsequenz zu verstehen ist. Ich verstehe auch nicht bin in die letzte Konsequenz, wie mein GPS-Gerät funktioniert. Deshalb würde ich aber, wenn ich bei näherer Betrachtung feststellen sollte, dass es nicht bis ins Detail so arbeitet, wie ich mir das grob vorstelle, nicht behaupten, es würde fehlerhaft arbeiten – schon gar nicht, bevor ich verstanden habe, wie und warum es so arbeitet, wie es arbeitet.

Übrigens: Bei LuaTeX besteht durchaus die Möglichkeit, die Node-Liste nach dem Absatz- oder Zeilenumbruch noch zu verändern. Ein kompletter Neuumbruch ist aber auch damit vermutlich nicht möglich. Immerhin könnte man eventuell mit Attributen Elemente markieren (beispielsweise einen Bildbeschreibung und ein zugehöriges Bild), um diese ohne Neuumbruch vertauschen zu können. Das wäre tatsächlich eine interessante Aufgabe für jemanden, der LuaTeX verstehen lernen will. Soweit, dafür einen konkreten Entwurf zu machen, bin ich aber noch lange nicht. LuaTeX ist für mich noch weitgehend Neuland.

Und um das noch einmal ganz deutlich zu sagen: Ich richte mich nicht dagegen, dass Du keine fertigen Lösungen wie die von KOMA-Script verwenden willst. Mir ist allerdings wichtig, dass hier keine angeblichen Lösungen propagiert werden, die bei näherer Betrachtung nicht zuverlässig funktionieren. Es muss doch erlaubt sein, dass ich auf Mängel, die ich entdecke hinweise. Es muss doch auch erlaubt sein, dass ich darauf hinweise, wenn offensichtlich die Arbeitsweise von LaTeX meiner Meinung nach missverständlich dargestellt oder interpretiert wird. Wir alle lernen nicht zuletzt aus unseren Fehlern und den Fehlern anderer.

Ich habe auch gar nichts dagegen, wenn jemand von einer Maschine träumt, die besser als TeX, besser als LaTeX, besser als ConTeXt … ist. Solange wir uns auf dem Boden von LaTeX bewegen, und das ist bei der konkreten Lösung einer konkreten Frage der Fall, sollten wir allerdings die Arbeitsweise und auch die Mängel von LaTeX mit berücksichtigen. Was nützt die tollste theoretische Idee, wenn sie der Realität nicht stand hält? Dem Fragesteller nützt sie eher wenig. Dem nützt auch nichts, wenn irgendwann in ferner Zukunft jemand ein ganz tolles System bastelt, das besser als LaTeX ist. Meist nützt ihm noch nicht einmal, wenn man ihn darauf hinweist, dass es beispielsweise bei ConTeXt eine schönere Lösung gibt. Der braucht jetzt eine Lösung für LaTeX. Trotzdem, wenn Du irgendwann eine schöne Lösung für das Problem der aktuellen Seitenzahl fertig hast, das ohne \label/\ref-artigen Mechanismus und insbesondere ohne Hilfsdatei und Multipass-Verfahren auskommt: Ich bin höchst interessiert!!!

ctansearch
17-10-2012, 23:56
Danke für die intensive Diskussion.
Ich will das Thema nun nicht weiter "entführen", wenn ich eine Lösung gefunden habe, stelle ich diese als neuen Thread ein.