PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Seltsame Abstände (listings, grafiken usw.)



Klez
02-11-2005, 03:18
Hi

Die Grundlage für diesen Thread ist ein anderer, den ihr hier (http://www.mrunix.de/forums/showthread.php?t=41446) findet. Der Thread wurde ein wenig Off-Topic und da ich glaube, dass dieses Problem keines sein sollte, eröffne ich hier nochmal einen neuen Thread.

Zum Problem:
Ich habe einen Abschnitt (\section oder \subsection) worauf ein Code-Listing mit Hilfe des Pakets listings und dem Befehl \lstinputlisting folgt. Danach kommt normaler Text als Beschreibung des aufgezeigten Quellcodes. Die einzelnen Code-Listings sind mal länger (über 1 Seite) und mal kürzer (5-6 Zeilen). Latex scheint nun der Meinung zu sein, die Abstände der Überschriften zu dem vorangegangenen Text beliebig stauchen zu müssen.
Um dieses Problem deutlicher zu machen, habe ich mit dem Paket titlesec die Pre-Abstände absichtlich "zu groß" (5em) gemacht.

Da es dabei durchaus auf die Länge des Texts usw. ankommt, habe ich Bilder angehängt, um deutlich zu machen, was ich meine. "richtig.jpg" ist von Seite 2 und "falsch.jpg" von Seite 3.

Ich habe mit edico bereits darüber gesprochen, aber eine Lösung war bislang nicht in Sicht. Ich habe sämtliche Anleitungen der Pakete gewälzt und versucht Millionen Ursachen ausfindig zu machen. Ohne Ergebnis. Hier noch eine kleine Liste, was NICHTS gebracht hat:


Am Paket "geometry" liegt es definitiv NICHT
Bug-behebungs Pakete wie mparhack und fixltx2e helfen nicht.
Text zwischen der Überschrift und \lstinputlistings einzufügen bringt nichts.
Ein "minimal" Header nur mit \documentclass und \usepackage{listings} bringt ebenfalls nichts. Von daher kann es nicht an anderen Paketen in meinem Header liegen.
BCOR und DIV des Koma-Scripts haben keinerlei Auswirkung
An titlesec liegt es natürlich auch nicht
An meinen Absätzen innerhalb des Texts liegt es ebenfalls nicht.
Absatzkontrollen wie halfparskip, parskip, parindent, beheben NICHT das Problem


Was ich sonst noch entdeckt habe:


Die verbatim Umgebung (anstelle des Listings-Pakets) verursacht genau den gleichen Fehler
Kommentiere ich \lstinputlisting aus, so wird alles korrekt formatiert.
Definitionen von float beim listings-Paket bringt NICHTS.


Ich hoffe mir kann jemand helfen, da ich wirklich Ratlos bin und mittlerweile denke, dass es ein Bug von Latex ist.


@edico: Ich bin bereits Dipl.Inf :) Zwar auch ein wenig Off-Topic, aber wenn ich geometry nicht verwenden will; Was würdest Du mir als DIV vorschlagen bei einer Schriftgröße von 12pt ?

edico
03-11-2005, 11:07
[1]
Das kann ich nicht. Es gibt unterschiedliche Betrachtungen. Ich will hier aber
nicht die Literatur zitieren, u.a scrguide.pdf, in der genuegend ausfuehrlich
darueber (s. Typographie, Satzspiegel ...) diskutiert wird.

Das grundlegende Problem AFAIK ist, dass viele zu TeX gekommene, vorher durch
MS-Word (sagen wir mal neutral) beeinflusste Anwender ein Dokument erstellen,
ohne sich bisher auch nur ansatzweise mit der Zielsetzung von TeX
auseinandergesetzt zu haben, das voll mit typographischem Unsinn bespickt ist. Das
ist zunaechst auch nicht verwunderlich, weil in diesem Kreis 'Typographie'
nicht 'gewuerdigt' wird.

Dass TeX nicht vollkommen ist, wenngleich ich damit nicht jene Anforderungen
meine, DTP aehnliche Loesungen u.ae. produzieren zu wollen, ist an sich
selbstredend. Dass TeX auch Bugs produziert, ist ebenso offensichtlich. Nein,
es werden an den Grundregeln jedweder Typographie vorbei, Fragen bearbeitet,
die TeX an sich gar nicht leisten will und teilweise mehr schlecht als recht
bearbeiten kann.

Nun - die Antwort der konkreten Frage ist eben nicht nur abhaengig von der
Schriftgroesse, sondern offensichtlich von der Schriftart, von der
Seitengroesse, ob einseitig oder zweiseitig u.v.a.m. Und nicht zuletzt von der
Zielsetzung des Dokumentes. Denke ich 'Kundenorientiert', dann gelten zumindest
folgende Regeln:

Eine Zeile sollte nicht zu viele Zeichen enthalten. Bei wievielen Zeichen das
Optimum liegt, laesst sich wohl kaum exakt sagen. Aber im scrguide steht dazu
auch etwas (60--70 Zeichen). Meine persoenliche Obergrenze versuche ich bei 75
Zeichen anzusetzen (wenn zweispaltiger Satz nicht moeglich ist), nach
Moeglichkeit aber unter 70.

Denke ich an Diplomarbeiten etc., dann sind schlicht und ergreifend die
Vorstellungen des Pruefers umzusetzen oder ich kann ihn eines Besseren
belehren. Es gibt genuegend Bespiele, dass auch diese Kaste lernfaehig ist.
Einfach ein 'gut gesetztes' Dokument unter die Nase halten, und 'Wunder gibt es
immer wieder' ... Denke ich an Verlage ...

In diesem Kontext taucht alltaeglich das Thema 'Seitenraender' auf. Dies ist
nicht verwunderlich, wenn ich die o.g. Regeln realisiere. Die letzte Regel
begrenzt die Satzspiegelbreite nach oben. DINA4 ist fuer den Schriftsatz
einfach ein 'suboptimales' Papierformat, weil es zu gro ist. Deswegen sind die
Buecher in DINA4 auch in der Minderheit.

Nicht wenige arbeiten dann mit geometry u.v.a.m. Fuer KOMA ist dieses Paket so
gut wie nicht notwendig, wenn ich nicht gerade eine Seite regelrecht vollhacken
will, sondern bereit bin, mich einfach mal einzulassen auf den Punkt, dass eine
Seite eben nicht nur aus Buchstaben, Worten ... besteht, sondern auch aus dem
Text-umgebenden (Frei-)Raum, sprich Raendern. Die immer angemahnte
Papierersparnis ist obsolet, weil marginal. Auch die Frage nach 'Schoenheit',
weil subjektiv, stellt sich an sich so nicht. Ich habe mal irgendwann irgendwo
gelesen:

Typographie ist keine Offenbarung, sondern eine Konsequenz dessen, was
Leser beim Lesen als angenehm empfinden und womit sie sich beim Lesen leicht
tun.

Ich denke schon: Es ist nichts dagegen einzuwenden, selbst Veraenderungen am
Layout vorzunehmen. Aber nur, wenn man weiss, was man tut, warum man es tut
und welche Auswirkungen es haben kann.

Aus diesen Gruenden greife ich vorrangig auf Standardklassen zu, denen zwar
nachgesagt wird, hauptsaechtlich fuer den angelsaechsischen Raum Gueltigkeit zu
haben. Sei's drum! Wenn KOMA, dann zitiere ich meistens 'typarea' und ziehe
mich aus der Affaere ;-) Somit ist meine Loesung:

\documentclass[a4paper,12pt,headinclude,DIVcalc]{scrartcl}

Damit lege ich mein Schicksal in das von TeX, lass den Satzspiegel automatisch
optimieren etc. und wasche meine Haende in Unschuld, weil TeX die
typographischen Regeln (sprich all die Gurus wie M.Kohm, H.Oberdieck, H.Voss
...) viel besser kennt als ich, der vielleicht gerade ansatzweise TeX kapiert
hat. Abgesehen davon, dass ich genau deswegen mal zu TeX gekommen bin ;-)

Zu guter Letzt sei die 'TeXnische Komoedie' als 'nicht uninteresssante'
Literatur genannt.

[2]
Zu deinem originaeren Thema habe ich schon geantwortet. Vielleicht noch als
Anstoss: Hast du irgedwelche einflussnehmenden Macros laufen? Benutzt du
\clubpenalty=10000, \widowpenalty=10000, \displaywidowpenalty=10000? Wie
haeufig taucht das Phaenomen auf, und laesst es sich vielleicht haendisch
regeln - mit clearpage vielleicht? Bei unterschiedlichen DIV passiert nichts,
sagst du - versuche mal DIVcalc? Wie schon gesagt: 'microtype' fuer einen
Randausgleich hast du geprueft?
Das Ergebnis sollte nicht so sein, wie du postet.
edico

Klez
04-11-2005, 04:36
Erstmal danke für die ausführliche Beschreibung und dafür, dass Du biser der einzige bist, den das Prob interessiert :)


Hast du irgedwelche einflussnehmenden Macros laufen? Benutzt du \clubpenalty=10000, \widowpenalty=10000, \displaywidowpenalty=10000?

Nein. Habe es versucht, aber es hat keinerlei Effekt.


Wie haeufig taucht das Phaenomen auf, und laesst es sich vielleicht haendisch regeln - mit clearpage vielleicht?

Recht häufig. Ich würde schätzen: Be 10 Überschriften, 7-8 mal. Händisch kann ich das Problem nur durch künstliches einfügen von Leerzeichen beheben (\\). Clearpage hat keinerlei effekt. Selbst dann nicht, wenn noch genügend Platz auf der Seite wäre.


Bei unterschiedlichen DIV passiert nichts, sagst du - versuche mal DIVcalc? Wie schon gesagt: 'microtype' fuer einen Randausgleich hast du geprueft?

DIVcalc hatte keinen Einfluss auf das Problem. microtype hatte ich auch versucht, aber dann sagt mir der Adobe Reader, dass er eine Schriftart nicht verwenden könnte und nun helvetica nimmt. Whatever; microtype behebte das Problem auch nicht (hatte ich nur vergessen oben zu erwähnen).

Was mich aber am meisten wundert ist, dass ich scheinbar der erste mit diesem Fehler bin. Vor allem, da er auch mit verbatim Umgebungen auftritt. Leider kann ich diesen Fehler auch nicht als Kleinigkeit abtun, da er Latex für diese Art von Arbeit fast unbrauchbar macht.

**Update**
Die listings Umgebung scheint alle Code-Listings in eine hbox Umgebung zu stecken. Kann es evtl. irgendwie mit der Defintion von hbox Zusammenhängen ?

edico
04-11-2005, 08:17
... ich habe etwas gefunden, was dein Problem nunmehr loesen sollte. Dazu ist 'leavemode' an besagten Stellen haendisch einzufuegen. Scheint wohl doch ein Bug zu sein. Ich hab mich jetzt aber auch nicht weiter drum gekuemmert. Findest du da nochwas, poste mal.
%
\documentclass{article}
\usepackage{listings}
\begin{document}
\section*{lirum}
%\leavevmode % hier ist die Stellschraube
%oder der eingefuegte Text veraendert den Abstand
\begin{lstlisting}{}
LISTING
\end{lstlisting}
Nach diesem Absatz ist der vertikale Abstand nicht zu klein oder doch.
\section*{larum}
Nach diesem Absatz scheint es wieder zu stimmen.
\section*{loeffelstiel}
\end{document}
%
edico
P.S. hier ist noch ein weiterer Loesungsansatz, indem die Listings-Umgebung in eine Gruppe gepackt wird:
...
\begingroup %%==> hier ist eine andere Stellschraube
\begin{lstlisting}{}
LISTING
\end{lstlisting}
\endgroup %%==>
...

Klez
04-11-2005, 16:21
JA MANN!!! DAS IST ES!!!
Waaaah, ich kanns net glauben. Nach 2 Wochen suche, bringt 1 einziger Befehl letztendlich die Lösung :)

Gestern Nacht hab ich noch wie bekloppt im Internet nach Lösungen gesucht... Irgendwann hatte ich SO Kopfschmerzen, dass ich aufgeben musste.

\leavevmode zwischen Überschrift und Listing und es funktioniert!
\begingroup und \endgroup um das lstlisting funktioniert übrigens auch.

Um das ganze nicht immer händisch einzufügen, habe ich es nun so gemacht. Funktioniert gefahrlos bei allen Listings!


\newcommand{\mylstinputlisting}{\leavevmode \lstinputlisting}

Ich habe gesehen, dass \leavevmode auch im Zusammenhang mit figure umgebungen verwendet wird. Das deckt sich mit dem was ich im anderen Thread geschrieben habe, dass ich diesen Fehler schonmal im Zusammenhang mit Bildern hatte.

Soweit ich sehen konnte, hat sich damit auch das andere Problem (Überschriften am Seitenende, ohne darauf folgenden Text) gelöst. Scheint wohl ein Folgefehler des ursprünglichen Problems gewesen zu sein.

Vielen vielen Dank edico! Ich schulde Dir was :)
Nur noch eine Frage aus Neugier: Wo haste das gefunden ?

**Update**
Was in diesem Zusammenhang vielleicht auch ganz nützlich ist:


\usepackage[nobottomtitles,noindentafter]{titlesec}
\titlespacing{\section}{0pt}{2em}{1em}
\titlespacing{\subsection}{0pt}{2em}{1em}
\titlespacing{\subsubsection}{0pt}{2em}{1em}

Die Abstände können natürlich nach belieben gesetzt werden. Ist ja nur ein Beispiel

edico
05-11-2005, 07:03
'Ich schulde Dir was' - noe
'Wo haste das gefunden ?' - in meinem sample unter TODOS, die 'Gruppen'loesung bei Heiko Oberdiek, der diesen workaround getext hat, unter
http://groups.google.de/group/de.comp.text.tex/browse_frm/thread/9fc99c9a6ccdf9e7/de30f47a9f96a7b2?q=abstand+%C3%BCberschrift+listin gs&rnum=2#de30f47a9f96a7b2
Der bug ist also 'bekannt', hatte wohl mal irgenwann darueber gelesen und die Loesung mit 'leavevmode' in meine Sammlung gepackt ... da er mir noch nie untergekommen war, vergessen und jetzt erst nach Stoebern 'neu'entdeckt.
edico