mdframed -- "ungünstige" Seitenumbrüche

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


zeta
Forum-Newbie
Forum-Newbie
Beiträge: 4
Registriert: Mi 15. Feb 2017, 23:54

mdframed -- "ungünstige" Seitenumbrüche

Beitrag von zeta »

Hallo,

Ich habe in einem Dokument Boxen mithilfe von mdframed und möchte, dass keine Seitenumbrüche "an ungünstigen Stellen" passieren. Was will ich mit der schwammigen Formulierung sagen will: Normalerweise schafft es LateX, sinnvolle Stellen für Seitenumbrüche zu finden, indem z.B. nicht sofort nach einer Überschrift ein Seitenumbruch erfolgt usw.

In meinem Dokument, das nahezu ausschließlich aus solchen Boxen besteht, passiert das aber gar nicht. Es erfolgen Seitenubrüche, sodass nur die "Kopfzeile" (frametitle) der Box noch auf einer Seite steht und der ganze Rest auf der nächsten; oder gerade alles bis auf eine Zeile auf einer Seite steht und nur die letzte Zeile auf der nächsten Seite usw.

Ich habe versucht, das mit Blindtext in einem Minimalbeispiel zu demonstrieren.

Mein Anliegen: Kann man LaTeX irgendwie mitteilen, dass es Seitenunbrüche bevorzugt zwischen Boxen machen soll. Ich will nicht generell verbieten, dass es Seitenumbrüche in Boxen geben darf (da diese sehr lange sein können), aber sie sollten eher vermieden werden.

Meine bisheriger Versuch: \flushbottom hat es etwas verbessert, aber keineswegs gelöst.

Vielen Dank im Voraus.

\documentclass[a4paper]{article}
\usepackage{geometry}  
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{color}
\usepackage{blindtext}

\usepackage[ngerman]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}

\usepackage[parfill]{parskip}
\setlength{\parindent}{0pt}

\usepackage{framed}
\usepackage{mdframed}

%%--------------------
\mdfdefinestyle{mybox}{
linewidth=0.75pt,%
skipabove=1.5\baselineskip, 
skipbelow=1.5\baselineskip
innertopmargin=\topskip,
}

\mdtheorem[style=mybox, frametitlebackgroundcolor=green]{defi}{Definition}

\flushbottom

\begin{document}
\section{Bla}
\begin{defi*}
\blindtext
\blindtext
\blindtext
\end{defi*}

\begin{defi*}
\blindtext
\end{defi*}

\begin{defi*}
\blindtext
\end{defi*}

\end{document}

Gast

Beitrag von Gast »

Allzu frühe Umbrüche nach dem Beginn der Box kann man mit Hilfe von needspace verhindern:
\documentclass[a4paper]{article}
\usepackage{geometry}  
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{color}
\usepackage{blindtext}

\usepackage[ngerman]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}

\usepackage[parfill]{parskip}% setzt auch \parindent auf 0

\usepackage{needspace}
\usepackage{mdframed}% braucht kein framed

%%--------------------
\mdfdefinestyle{mybox}{
linewidth=0.75pt,%
skipabove=1.5\baselineskip, 
skipbelow=1.5\baselineskip
innertopmargin=\topskip,
}

\mdtheorem[style=mybox, frametitlebackgroundcolor=green,startcode=\needspace{8\baselineskip}]{defi}{Definition}

%\flushbottom ist bei einseitigen Dokumenten eigentlich nicht sinnvoll

\begin{document}
\section{Bla}
\begin{defi*}
\blindtext
\blindtext
\blindtext
\end{defi*}

\begin{defi*}
\blindtext
\end{defi*}

\begin{defi*}
\blindtext
\end{defi*}

\end{document}
Wenn Du wirklich mit \flushbottom den Umbruch der Kästen verbessern willst, solltest Du das bei einseitigen Dokumenten auf die von Kästen betroffene Seiten beschränken, also mit startcode=\flushbottom,endcode=\raggedbottom arbeiten, denn eigentlich ist \flushbottom bei einseitigen Dokumenten wenig sinnvoll.

esdd
Forum-Meister
Forum-Meister
Beiträge: 2561
Registriert: So 7. Feb 2010, 16:36

Beitrag von esdd »

mdframed lädt bereits das Paket needspace und stellt eine gleichnamige Option bereit:
\documentclass[a4paper]{article}
\usepackage{geometry}  
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{color}
\usepackage{blindtext}

\usepackage[ngerman]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}

\usepackage[parfill]{parskip}% setzt auch \parindent auf 0

\usepackage{mdframed}% braucht kein framed

%%--------------------
\mdfdefinestyle{mybox}{
linewidth=0.75pt,%
skipabove=1.5\baselineskip, 
skipbelow=1.5\baselineskip
innertopmargin=\topskip,
}

\mdtheorem[style=mybox, frametitlebackgroundcolor=green,needspace=8\baselineskip]{defi}{Definition}

%\flushbottom ist bei einseitigen Dokumenten eigentlich nicht sinnvoll

\begin{document}
\section{Bla}
\begin{defi*}
\blindtext
\blindtext
\blindtext
\end{defi*}

\begin{defi*}
\blindtext
\end{defi*}

\begin{defi*}
\blindtext
\end{defi*}

\end{document}

Gast

Beitrag von Gast »

Danke für die Korrektur und sorry, aber man kann nicht alles wissen. Natürlich hätte ich länger in der Anleitung suchen können. Aber da ich das Paket nie verwende, mein Leidensdruck also geringer als der von zeta ist …

esdd
Forum-Meister
Forum-Meister
Beiträge: 2561
Registriert: So 7. Feb 2010, 16:36

Beitrag von esdd »

Mir ist doch auch erst nach Deiner Antwort und der Erwähnung von needspace eingefallen, dass ich da mal irgendwas gelesen hatte ;-)

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

Beitrag von u_fischer »

Benutze lieber tcolorbox. Sein breakable-Verhalten ist deutlich stabiler.

zeta
Forum-Newbie
Forum-Newbie
Beiträge: 4
Registriert: Mi 15. Feb 2017, 23:54

Beitrag von zeta »

Ok, danke das hilft schon mal weiter.

Ich hätte jetzt noch 2 Fragen:
1) ist es irgendwie möglich, die Abstände zwischen den Boxen variieren zu lassen, also dass z.B. etwas kleinere Abstände gewählt werden, um noch eine letzte Zeile einer Box auf die Seite zu bekommen etc. Vielleicht sind die Befehle hier auf Seite 14 hilfreich -- ich wüsste aber nicht wie. http://mirror.easyname.at/ctan/macros/l ... framed.pdf

2) Es passiert manchmal, dass noch eine Überschrift -- also zB das was in \subsection{} steht -- noch auf einer Seite steht, während die Box auf der nächsten beginnt. Mit "normalen" Absätzen würde das nie passieren. Gibt es da Abhilfe?

Edit: hab den Tipp mit tcolorbox erst jetzt gesehen, werd ich mir auch mal anschauen & berichten

Vielen Dank für die Hilfe.

Gast

Beitrag von Gast »

Vertikale Abstände zwischen Material kann man bei Bedarf jederzeit mit \smallskip, \medskip, \bigskip oder \vspace{…} einfügen. Letztes beherrscht auch negative Abstände. Außerdem kann man den Abstand, den mdframed vor oder nach einem Rahmen einfügt über Optionen einstellen. Bitte lies das in der [d]mdframed[/d]-Anleitung nach. Bei tcolorbox ist es ähnlich.

Kästen, die hässlicher Weise unmittelbar auf Überschriften folgen, sollten natürlich nicht via Option needspace davor bewahrt werden, zu früh zu umbrechen. Stattdessen sorgt man mit \needspace vor der Überschrift, dass diese mit dem Anfang des Kastens zusammen bleibt.

zeta
Forum-Newbie
Forum-Newbie
Beiträge: 4
Registriert: Mi 15. Feb 2017, 23:54

Beitrag von zeta »

Wie man prinzipiell Abstand zwischen den Boxen einfügen kann, ist mir ja bekannt und in meinem Minimalbeispiel habe ich auch Optionen wie skipabove=1.5\baselineskip verwendet. vspace etc sind mir auch bekannt.

Nur mir geht es darum, ob es möglich ist, irgendwie einzustellen, dass der Abstand *automatisch* angepasst wird. Natürlich kann ich irgendwo einen vspace einfügen, wenn mir etwas gerade nicht gefällt. Nur nach meinem Verständnis von LaTeX geht man nicht her und fügt einmal zwischen dem 17. und 18. Kästen 2 Leerzeilen ein, weil's jetzt grad so besser aussieht -- und wenn weiter oben im Text etwas geändert wird, sind die manuellen Abstände wieder obsolet.

Meine Frage zielt also darauf ab, ob es möglich ist, zum Beispiel einzustellen, dass die Abstände zwischen zwei Kästen zwischen x und y sind und LaTeX, wählt sie jeweils so, dass Umbrüche vermieden werden. Darauf bezieht sich auch mein Verweis auf Seite 14 der mdframed-Doku, wo z.B. erklärt wird, wie man ganze Code-Blöcke spezifizieren kann, die jeweils vor oder nach Boxen verwendet werden. Nur da fehlt mir eben der Ansatz, ob und wie dort mein Problem zu lösen wäre.

Gast

Beitrag von Gast »

Woher soll LaTeX denn wissen, unter welchen Umständen, wo welcher zusätzliche Platz eingefügt oder entfernt werden soll? Oder suchst du schlicht glue? Glaube ich zwar nicht, aber so unklar, wie du dich ausdrückst, ist alles möglich.

Antworten