Limitiertes \vfill

Antwort erstellen


Diese Frage dient dazu, das automatisierte Versenden von Formularen durch Spam-Bots zu verhindern.
Smilies
:D :) :( :o :shock: :? 8) :lol: :-x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen:

BBCode ist eingeschaltet
[img] ist eingeschaltet
[flash] ist ausgeschaltet
[url] ist eingeschaltet
Smilies sind eingeschaltet

Die letzten Beiträge des Themas

Ich habe die Datenschutzerklärung gelesen und bin damit einverstanden.

   

Wenn du eine Datei oder mehrere Dateien anhängen möchtest, gib die Details unten ein.

Ansicht erweitern Die letzten Beiträge des Themas: Limitiertes \vfill

von f.brueseke » Mo 11. Mär 2013, 14:59

Schlussendlich habe ich nun eine funktionierende Lösung gefunden. Das folgende Kommando \myMagicPar setze ich vor jedem \newpage, \newgeometry und \end{document} ein:
\newcommand{\myMagicPar}{%
\par%
\typeout{Seite: \thepage; Vorschub: \the\pagestretch; Ziel: \the\pagegoal; Gesamt: \the\pagetotal}%
\ifdim \dimexpr\pagegoal-\pagetotal-\pagestretch\relax >0pt%
  \vspace{0pt plus \dimexpr\pagegoal-\pagetotal-\pagestretch}%
\fi%
\vfilneg%
}
Wichtig ist dabei das \par vor \ifdim eingesetzt wird, denn sonst wird der letzte Absatz nicht immer mit berücksichtigt. Ansonsten besteht das Kommando \myMagicPar natürlich komplett aus deinem Code. Daher nochmal danke für deine Hilfe.

Viele Grüße
Frank

von u_fischer » Mi 6. Mär 2013, 15:58

Stimmt du willst das ja genau auf den Seiten mit \newpage. Und nicht bei allen wirkt sich der \@textbottom-Befehl aus. Dann musst du halt \newpage patchen.

http://www.tex.ac.uk/cgi-bin/texfaq2html?label=patch

von f.brueseke » Mi 6. Mär 2013, 15:38

Ich habe gerade noch einen Fall entdeckt in dem es mit der Präambel-Lösung leider nicht funktioniert. Anscheinend kommt die Lösung damit nicht klar wenn sich die dehnbaren Zwischenräume bis über das Seitenende schieben. Kommentiere im folgenden Beispiel entweder die beiden "\test" aus oder das "\vfilneg" ein und es funktioniert wieder:
\documentclass[10pt,twoside]{article}
\flushbottom %ist default bei twoside
%\raggedbottom

\makeatletter
\def\@textbottom{%
 \ifdim \dimexpr\pagegoal-\pagetotal-\pagestretch \relax >0pt
 \vskip 0pt plus \dimexpr\pagegoal-\pagetotal-\pagestretch\relax\vfilneg
 \fi}
\makeatletter

\newcommand\test{\rule{25mm}{34mm}
                 \par\vskip 0pt plus 32mm}
\begin{document}
\test\test\test\test\test
\test\test\test\test
\test\test\test
blub

%\pagebreak
\newpage

\test\test\test\test\test
\test\test
\test\test    %Kommentier mich aus!

%\vfilneg    %Kommentier mich aus!
\newpage ...

\end{document}

von f.brueseke » Mi 6. Mär 2013, 14:06

Nochmal danke für die Hilfe!

von u_fischer » Mi 6. Mär 2013, 13:59

f.brueseke hat geschrieben:Habe deinen Nachtrags-Code-Schnipsel ebenfalls ausprobiert und auch der funktioniert! Man muss allerdings das "\vfilneg" vor dem "\newpage" beibehalten.
Das hatte ich ganz vergessen. Den kann man in den Code auch einbauen:
\makeatletter
\def\@textbottom{%
 \ifdim \dimexpr\pagegoal-\pagetotal-\pagestretch \relax >0pt
 \vskip 0pt plus \dimexpr\pagegoal-\pagetotal-\pagestretch\relax
 \vfilneg
 \fi}
\makeatletter
Das \vfilneg vor \end{document} muss aber sein.

von f.brueseke » Mi 6. Mär 2013, 13:52

Habe deinen Nachtrags-Code-Schnipsel ebenfalls ausprobiert und auch der funktioniert! Man muss allerdings das "\vfilneg" vor dem "\newpage" beibehalten.

Muss mal sehen, ob sich diese Lösung nicht besser in das Original einbauen lässt.

Viele Dank für die Mühe :!:


------------------------
--- edit:
---
Habe gerade getestet, dass man das "\vfillneg" auch in die Kommandoänderung in der Präambel ziehen kann. Es ergibt sich:
\flushbottom

\makeatletter
\def\@textbottom{%
 \ifdim \dimexpr\pagegoal-\pagetotal-\pagestretch \relax >0pt
 \vskip 0pt plus \dimexpr\pagegoal-\pagetotal-\pagestretch\relax\vfilneg
 \fi}
\makeatletter
Sieht bei mir im Beispiel immer noch passend aus.

von u_fischer » Mi 6. Mär 2013, 13:35

Nachtrag. Du könntest auch das hier versuchen (nach \flushbottom, es überschreibt teilweise dessen Definition):
\makeatletter
\def\@textbottom{%
 \ifdim \dimexpr\pagegoal-\pagetotal-\pagestretch \relax >0pt
 \vskip 0pt plus \dimexpr\pagegoal-\pagetotal-\pagestretch\relax
 \fi}
\makeatletter

von f.brueseke » Mi 6. Mär 2013, 13:34

Habe deinen Code-Schnipsel jetzt im Beispiel überall statt \newpage und vor \end{document} eingefügt und muss sagen: Es passt :shock: :o :D

Jetzt muss ich das nur noch ins Original übertragen. Da kommt statt des Seitenwechsel ein \newgeometry ... hoffe mal das passt genauso.

Vielen Dank für die Mühe!

von u_fischer » Mi 6. Mär 2013, 12:39

Hm. Stimmt. \vfilneg übertreibt (übrigens auch bei \end{document}. TeX wird zwar immer das Verhältnis der stretchbaren Anteile beibehalten, aber notfalls überdehnen, falls es nötig ist (und sich dann mit (underfull \vbox/hbox (badness 10000) beschweren):
\documentclass[10pt,twoside]{article} 
\begin{document} 
\fbox{\hbox to 10cm{a\hskip 0pt plus 1pt b\hskip 0pt plus 2pt c}}
\end{document}
Was heißt, dass du vor \newpage einen geeigneten \vskip einfügen musst. Du kannst mal das versuchen:
\par\vspace{0pt plus \dimexpr\pagegoal-\pagetotal-\pagestretch}
\vfilneg\newpage 
Könnte in etwa hinkommen. Aber ich bin mir nicht ganz sicher, ob es nicht gelegentlich auf der falschen Seite landen kann (der korrekte Platz, um das einzufügen, wäre wohl die output-Routine).

von f.brueseke » Mi 6. Mär 2013, 11:04

Erstmal vielen Dank für Deine schnelle Antwort.

Ich habe Dein Beispiel ausgiebig getestet. Und leider funktioniert das auch noch nicht so wie ich es gerne hätte. Denn vor dem \newpage bzw. \pagebreak füllt Latex die Seite bis zum Ende auf, so dass der Maximalabstand überschritten wird und "blubb" am Seitenende klebt. Komischerweise tritt das vor \end{document} nicht auf, dort wird der Maximalabstand eingehalten. Ich hänge Dir nochmal das leicht geänderte Beispiel an, dass den unerwünschten Fall illustriert. Hast Du noch ein Idee?

Dein Hinweis mit dem \vfil bei \newpage & Co. ist sehr gut. Damit kann ich nämlich auch \par\vfil in Betracht ziehen. Das sorgt immerhin dafür, dass vor Seitenumbrüchen nicht mehr bis zum Seitenende aufgefüllt wird. Ist zwar noch keine echte Limitierung, sieht aber optisch etwas besser aus.

Hier nochmal das geänderte Beispiel mit dem oben beschriebenen unerwünschten Verhalten:
\documentclass[10pt,twoside]{article}
\flushbottom %ist default bei twoside
\newcommand\test{\rule{25mm}{34mm}
                 \par\vskip 0pt plus 30mm}
\begin{document}
\test\test\test\test\test
\test\test\test\test
\test\test\test
blub

%\pagebreak
\vfilneg\newpage

\test\test\test\test\test
\test\test\test

\vfilneg %hebt das \vfil von \end{document} auf
\end{document}

Nach oben