Limitiertes \vfill

Layout von Seiten, Rändern, Fusszeilen, usw, modifizieren


f.brueseke
Forum-Anfänger
Forum-Anfänger
Beiträge: 10
Registriert: Mo 22. Nov 2010, 11:53

Limitiertes \vfill

Beitrag von f.brueseke »

Hallo liebe Community!

Ich möchte in einem Dokument ein vertikalen Abstand einfügen der sich genauso verhält wie \vfill jedoch auf z.B. 30mm begrenzt ist. Ich habe schon einige Varianten mit \vspace bzw. \vskip ausprobiert und leider hat keine meinen Ansprüchen genügt:
1) \vfill funktioniert prächtig kann aber dazu führen, dass ich nur ein Element oben und unten habe
2) \vskip 0mm plus 30mm funktioniert auch gut führt aber dazu, dass der Abstand nicht kommt, falls der Inhalt der Seite nicht bis zum Seitenende reicht
3) \vskip 30mm minus 30mm funktioniert leider in sofern nicht so gut, dass Latex dann gerne mal mehr Platz in Anspruch nimmt als bei den zuvor genannten Varianten.

Kennen Sie eine Möglichkeit, um trotzdem an einen passenden vertikalen Abstand zu kommen, der
1. so viele Elemente auf eine Seite bringt wie es geht und
2. auf Seiten wo es möglich ist einen Abstand einbringt der ein Maximalmaß nicht überschreitet
?:?:

Nun kommt das passende Mini-Beispiel in dem Sie die erwähnten Möglichkeiten der Reihe nach ausprobiert findet.
\documentclass[10pt,twoside]{article}

\usepackage{tabularx}    % Tabelle

\begin{document}

%first try:
1{\setlength{\extrarowheight}{1pt}\begin{tabularx}{\textwidth}[t]{|X|}
\hline
\rule{25mm}{34mm} \\
\hline
\end{tabularx}}
\par\vfill
{\setlength{\extrarowheight}{1pt}\begin{tabularx}{\textwidth}[t]{|X|}
\hline
\rule{25mm}{34mm} \\
\hline
\end{tabularx}}
\par\vfill
{\setlength{\extrarowheight}{1pt}\begin{tabularx}{\textwidth}[t]{|X|}
\hline
\rule{25mm}{34mm} \\
\hline
\end{tabularx}}
\par\vfill
{\setlength{\extrarowheight}{1pt}\begin{tabularx}{\textwidth}[t]{|X|}
\hline
\rule{25mm}{34mm} \\
\hline
\end{tabularx}}
\par\vfill
{\setlength{\extrarowheight}{1pt}\begin{tabularx}{\textwidth}[t]{|X|}
\hline
\rule{25mm}{34mm} \\
\hline
\end{tabularx}}
\par\vfill
{\setlength{\extrarowheight}{1pt}\begin{tabularx}{\textwidth}[t]{|X|}
\hline
\rule{25mm}{34mm} \\
\hline
\end{tabularx}}
\par\vfill
{\setlength{\extrarowheight}{1pt}\begin{tabularx}{\textwidth}[t]{|X|}
\hline
\rule{25mm}{34mm} \\
\hline
\end{tabularx}}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% second try:
\newpage
2{\setlength{\extrarowheight}{1pt}\begin{tabularx}{\textwidth}[t]{|X|}
\hline
\rule{25mm}{34mm} \\
\hline
\end{tabularx}}
\par\vskip 0mm plus 30mm
{\setlength{\extrarowheight}{1pt}\begin{tabularx}{\textwidth}[t]{|X|}
\hline
\rule{25mm}{34mm} \\
\hline
\end{tabularx}}
\par\vskip 0mm plus 30mm
{\setlength{\extrarowheight}{1pt}\begin{tabularx}{\textwidth}[t]{|X|}
\hline
\rule{25mm}{34mm} \\
\hline
\end{tabularx}}
\par\vskip 0mm plus 30mm
{\setlength{\extrarowheight}{1pt}\begin{tabularx}{\textwidth}[t]{|X|}
\hline
\rule{25mm}{34mm} \\
\hline
\end{tabularx}}
\par\vskip 0mm plus 30mm
{\setlength{\extrarowheight}{1pt}\begin{tabularx}{\textwidth}[t]{|X|}
\hline
\rule{25mm}{34mm} \\
\hline
\end{tabularx}}
\par\vskip 0mm plus 30mm
{\setlength{\extrarowheight}{1pt}\begin{tabularx}{\textwidth}[t]{|X|}
\hline
\rule{25mm}{34mm} \\
\hline
\end{tabularx}}
\par\vskip 0mm plus 30mm
{\setlength{\extrarowheight}{1pt}\begin{tabularx}{\textwidth}[t]{|X|}
\hline
\rule{25mm}{34mm} \\
\hline
\end{tabularx}}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% third try:
\newpage
3{\setlength{\extrarowheight}{1pt}\begin{tabularx}{\textwidth}[t]{|X|}
\hline
\rule{25mm}{34mm} \\
\hline
\end{tabularx}}
\par\vskip 30mm minus 30mm
{\setlength{\extrarowheight}{1pt}\begin{tabularx}{\textwidth}[t]{|X|}
\hline
\rule{25mm}{34mm} \\
\hline
\end{tabularx}}
\par\vskip 30mm minus 30mm
{\setlength{\extrarowheight}{1pt}\begin{tabularx}{\textwidth}[t]{|X|}
\hline
\rule{25mm}{34mm} \\
\hline
\end{tabularx}}
\par\vskip 30mm minus 30mm
{\setlength{\extrarowheight}{1pt}\begin{tabularx}{\textwidth}[t]{|X|}
\hline
\rule{25mm}{34mm} \\
\hline
\end{tabularx}}
\par\vskip 30mm minus 30mm
{\setlength{\extrarowheight}{1pt}\begin{tabularx}{\textwidth}[t]{|X|}
\hline
\rule{25mm}{34mm} \\
\hline
\end{tabularx}}
\par\vskip 30mm minus 30mm
{\setlength{\extrarowheight}{1pt}\begin{tabularx}{\textwidth}[t]{|X|}
\hline
\rule{25mm}{34mm} \\
\hline
\end{tabularx}}
\par\vskip 30mm minus 30mm
{\setlength{\extrarowheight}{1pt}\begin{tabularx}{\textwidth}[t]{|X|}
\hline
\rule{25mm}{34mm} \\
\hline
\end{tabularx}}

%%%%%%%%%%%%%%
\end{document}

P. S.: Ich hoffe ich habe mein Thema richtig zugeordnet. Ansonsten bitte passend verschieben.

Benutzeravatar
u_fischer
Forum-Meister
Forum-Meister
Beiträge: 4300
Registriert: Do 22. Nov 2012, 11:09
Kontaktdaten:

Beitrag von u_fischer »

Wenn du einen festen maximalen Abstand willst, musst du \vskip 0pt plus 50mm nehmen.

Wenn du allerdings \newpage benutzt (was auch bei \end{document} der Fall ist), wird ein \vfil eingefügt, das gewinnt natürlich immer. Wenn du dessen Wirkung unterdrücken willst, musst du selbst ein \vfilneg einfügen (oder \pagebreak statt \newpage verwenden):

\documentclass[10pt,twoside]{article} 
\flushbottom %ist default bei twoside
\newcommand\test{\rule{25mm}{34mm} 
                 \par\vskip0pt plus 50mm} 
\begin{document} 
\test\test\test\test\test\test\test\test\test
\test\test\test\test\test\test\test\test\test blub
%\pagebreak
\vfilneg\newpage
\test\test\test\test\test\test\test\test\test\test
\vfilneg %hebt das \vfil von \end{document} auf
\end{document}

f.brueseke
Forum-Anfänger
Forum-Anfänger
Beiträge: 10
Registriert: Mo 22. Nov 2010, 11:53

Beitrag von f.brueseke »

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}

Benutzeravatar
u_fischer
Forum-Meister
Forum-Meister
Beiträge: 4300
Registriert: Do 22. Nov 2012, 11:09
Kontaktdaten:

Beitrag von u_fischer »

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).

f.brueseke
Forum-Anfänger
Forum-Anfänger
Beiträge: 10
Registriert: Mo 22. Nov 2010, 11:53

Beitrag von f.brueseke »

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!

Benutzeravatar
u_fischer
Forum-Meister
Forum-Meister
Beiträge: 4300
Registriert: Do 22. Nov 2012, 11:09
Kontaktdaten:

Beitrag von u_fischer »

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

f.brueseke
Forum-Anfänger
Forum-Anfänger
Beiträge: 10
Registriert: Mo 22. Nov 2010, 11:53

Beitrag von f.brueseke »

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.
Zuletzt geändert von f.brueseke am Mi 6. Mär 2013, 14:00, insgesamt 1-mal geändert.

Benutzeravatar
u_fischer
Forum-Meister
Forum-Meister
Beiträge: 4300
Registriert: Do 22. Nov 2012, 11:09
Kontaktdaten:

Beitrag von u_fischer »

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.

f.brueseke
Forum-Anfänger
Forum-Anfänger
Beiträge: 10
Registriert: Mo 22. Nov 2010, 11:53

Beitrag von f.brueseke »

Nochmal danke für die Hilfe!

f.brueseke
Forum-Anfänger
Forum-Anfänger
Beiträge: 10
Registriert: Mo 22. Nov 2010, 11:53

Beitrag von f.brueseke »

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}

Antworten