Sie sind hier

Inkompatibilitäten zwischen Optionen (half)parskip und anderen Paketen (u. a. amsmath)

Es gibt offensichtlich Inkompatibilitäten zwischen den Optionen (half)parskip und einigen anderen Paketen, darunter amsmath und ntheorem, was Abstände zwischen Absätzen betrifft.

Beispiel amsmath: amsmath redefiniert \[ und \] mit der Folge, daß der Abstand nach einer Formel, die als eigener Absatz steht, zu klein ist. Dies scheint mit der Verwendung von \ignorespacesafterend in \] zusammenzuhängen, d. h. es wird nicht erkannt, daß ein neuer Absatz beginnen sollte.

Allein für einen Hinweis auf einen zuverlässigen Workaround wäre ich sehr dankbar.

Von mir verwendete Versionen:
MikTeX 2.4
LaTeX2e
KOMA-Script: 2004/01/07

Beispiel für amsmath und ntheorem:

\documentclass[a4paper,halfparskip]{scrartcl}

\usepackage{amsmath}
\usepackage[amsmath]{ntheorem}
\newtheorem{Satz}{Satz}

% Zur Verdeutlichung:
%\setlength{\theorempreskipamount}{0pt}
%\setlength{\theorempostskipamount}{0pt}

\begin{document}
Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz
Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz

Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz
Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz

\[ XXX \]

Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz
Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz

\begin{Satz}
Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz
Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz
\end{Satz}

\begin{Satz}
Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz
Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz
\end{Satz}

Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz
Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz
\end{document}

Besten Dank,
Martin

Bild von Markus Kohm

Vorab: Dein KOMA-Script ist veraltet. Gerade im Bereich der parskip-Optionen gab es immer wieder Verbesserungen. Wenn du diese verwendest, solltest du also eine aktuelle KOMA-Script-Version installieren. Leider bietet MikTeX über den Update-Manager derzeit wohl noch immer keine aktuelle Version. Es gibt aber für MikTeX eine solche auf Stephan Hennigs Download Seite. Ich denke aber nicht, dass dein spezielles Problem sich durch ein Update verändert.

Es ist Ansichtssache, ob der Abstand vor und/oder nach Formeln vom Absatzabstand abhängen soll. Wobei ich bei

\documentclass[halfparskip]{scrartcl}
\usepackage{amsmath}
\begin{document}
Test\hrulefill
\[y = x\]
Test\hrulefill

Test\hrulefill

\[y=x\]

Test\hrulefill
\end{document}

sowohl mit als auch ohne amsmath einen deutlichen Unterschied bei der ersten Formel und der zweiten erkenne. Grundsätzlich richtet amsmath Formeln etwas anders aus, so dass sich ein kleiner Unterschied zwischen der Variante mit amsmath und ohne amsmath ergibt. Das ist aber auch der Fall, wenn man ohne halfparskip oder mit der article-Klasse arbeitet. Hat also mit KOMA-Script schonmal nichts zu tun.

Kommen wir zu ntheorem. Schauen wir uns da einmal ein ganz minimales Beispiel an:

\documentclass[a4paper]{article}
\usepackage{ntheorem}
 \newtheorem{Satz}{Satz}
\setlength{\theorempreskipamount}{0pt}
\setlength{\theorempostskipamount}{0pt}
\begin{document}
Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz
 Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz

\begin{Satz}
 Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz
 Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz
 \end{Satz}

\begin{Satz}
 Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz
 Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz
 \end{Satz}

Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz
 Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz
\begin{Satz}
 Kein Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz
 Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz
 \end{Satz}
\begin{Satz}
 Kein Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz
 Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz
 \end{Satz}
Kein Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz
 Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz

\begin{Satz}
 Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz
 Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz
 \end{Satz}

Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz
 Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz

\end{document}

Wie man hier sieht, wird nach Satz 2, Satz 3 und Satz 5 etwas vertikaler Abstand eingefügt - unabhängig davon, dass hier gar nicht mit Absatzabstand gearbeitet wird, und unabhängig davon, dass eigentlich nach Satz 4 überhaupt kein Absatz erfolgt. Auch ist der verikale Abstand zwischen Satz 1 und 2 unterschiedlich zum Abstand zwischen Satz 3 und 4. Da ohne Absatzabstand gearbeitet wird, verwundert das etwas.

Wechselt man nun in dem Beispiel zu scrartcl und setzt halfparskip, so hat man nach Satz 2 und 5 ziemlich genau den erwarteten Abstand. Bei Satz 4 wird jedoch von ntheorem nicht berücksichtigt, dass es nicht genügt, den Absatzeinzug zu verhindern. Das ist ein Problem von ntheorem, nicht von amsmath und nicht von KOMA-Script. Es tritt genauso auf, wenn man bei article bleibt und \parskip erhöht.

\documentclass[a4paper]{article}
\usepackage{ntheorem}
\newtheorem{Satz}{Satz}
\setlength{\parskip}{1em}
\setlength{\theorempreskipamount}{0pt}
\setlength{\theorempostskipamount}{0pt}
\begin{document}
Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz
 Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz

\begin{Satz}
 Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz
 Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz
 \end{Satz}

\begin{Satz}
 Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz
 Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz
 \end{Satz}

Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz
 Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz
\begin{Satz}
 Kein Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz
 Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz
 \end{Satz}
\begin{Satz}
 Kein Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz
 Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz
 \end{Satz}
Kein Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz
 Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz

\begin{Satz}
 Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz
 Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz
 \end{Satz}

Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz
 Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz

\end{document}

Auch bei diesem Beispiel werden von ntheorem Absatzabstände eingefügt, wo keine erwünscht sind. Man kann sich aber auch auf den Standpunkt stellen, dass grundsätzlich, vor und nach einer Theorem-Umgebung ein Absatzabstand einzufügen ist. Ohne ntheorem passiert genau das.

\documentclass[a4paper]{article}
\newtheorem{Satz}{Satz}
\setlength{\parskip}{1em}
\begin{document}
Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz
 Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz

\begin{Satz}
 Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz
 Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz
 \end{Satz}

\begin{Satz}
 Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz
 Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz
 \end{Satz}

Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz
 Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz
\begin{Satz}
 Kein Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz
 Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz
 \end{Satz}
\begin{Satz}
 Kein Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz
 Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz
 \end{Satz}
Kein Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz
 Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz

\begin{Satz}
 Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz
 Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz
 \end{Satz}

Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz
 Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz Absatz
\end{document}

Wenn sich in der Anleitung zu ntheorem diesbezüglich nichts findet, würde ich mich an deiner Stelle mal an den Autor von ntheorem wenden.

Hallo Markus,

danke für Deine Antwort.

Betreffend ntheorem war ich zu voreilig, sorry.

Mein KOMA-Script habe ich geupdated, danke für den Tip, hat aber, wie Du vermutetest, nichts geändert.

amsmath: Um es vorwegzunehmen, ich fand soeben einen Workaround, der den Eindruck macht, gerade zuverlässig genug zu sein.

Dennoch im Detail: Bitte mache doch einmal die Linie dicker (siehe unten). Geschmack hin oder her, der Abstand nach der Formel als extra Absatz ist einfach zu klein.

Ich fand voher heraus, daß dieses Phänomen auch auftritt bei Verwendung von parskip.sty plus amsmath, egal ob article oder scrartcl, es ist also kein spezifisches KOMA-Script-Problem. (Aber es wäre dennoch nett, wenn halfparskip + amsmath klappen würde... Bei AMS dürfte sich wohl niemand dafür interessieren, befürchte ich.)

Wie schon erwähnt, scheint es in meinen Augen etwas mit dem \ignorespacesafterend zu tun zu haben -- vielleicht. Erwähnenswert ist noch, daß die 4 Längen \abovedispayskip usw. mit und ohne amsmath gleich sind.

Workaround: Wie unten angeben. Allerdings: Würde man ein \vspace{-\parskip} verwenden, so würde sich bei \flushbottom der Platz nach der Formel nicht mit ausdehnen -- schließlich hat man ja auch allen plus-glue mit abgezogen. Wie man aus \parskip den nicht-plus-nicht-minus-Anteil automatisch extrahiert, weiß ich nun allerdings wirklich nicht. Geht das?

\documentclass[a4paper,halfparskip]{scrartcl}
%\documentclass[a4paper]{article}
\usepackage{amsmath}
%\usepackage{parskip}
%\flushbottom

\makeatletter\def\hrulefill{\leavevmode\leaders\hrule height1.6ex\hfill\kern\z@}\makeatother

\begin{document}
Test\hrulefill
\[y = x\]
Test\hrulefill

Test\hrulefill

\[y=x\]

Test\hrulefill

\[y=x\] \vspace*{0cm}

Test\hrulefill

\[y=x\] \vspace{-6.8pt} % eigentlich: -\parskip ohne plus- und minus-Anteil

Test\hrulefill

Absatz mit \[y=x\] kurzer Formel\hrulefill

Absatz mit mit mit mit mit mit mit mit mit mit mit mit \[y=x\] langer Formel\hrulefill

%\pagebreak

\the\parskip\\ \the\abovedisplayskip\\ \the\abovedisplayshortskip\\ \the\belowdisplayskip\\ \the\belowdisplayshortskip\\ \the\topsep
\end{document}

BTW: Ist dieses Problem eigentlich noch niemandem aufgefallen?! Wieviele LaTeX-Artikel wurden eigentlich schon mit so krummen Abständen gesetzt?

Martin

Bild von Markus Kohm

Tut mir leid, aber auch mit deinem Minimalbeispiel sehe ich kein Problem. Wie ich bereits in meinem letzten Kommentar geschrieben habe, ist die vertikale Ausrichtung bei amsmath geringgügig anders als ohne. Das ist aber nicht falsch, eben nur anders und wohl auch beabsichtig. Das tritt auch auf, wenn \parskip auf 0 gesetzt wird.

Test\hrulefill

\[y=x\] \vspace{-6.8pt} % eigentlich: -\parskip ohne plus- und minus-Anteil

Test\hrulefill

Der Kommentar ist übrigens nicht zutreffend. Setzt mal \parskip auf 2em. Dann wirst du sehen, dass das wenig mit \parskip zu tun hat. Vermulich hat es eher etwas mit \ht\strutbox zu tun. In dem Fall probier mal in der Präambel:

\AtBeginDocument{%
  \addtolength{\belowdisplayshortskip}{\ht\strutbox}%
}

Du kannst natürlich auch \belowdisplayshortskip wieder auf denselben Wert setzen wie \belowdisplayskip, wenn dir das besser gefällt.

Wie dem auch sei. Wenn dir etwas an amsmath nicht gefält, solltest du dich an die Leute wenden. Vielleicht wird es als Bugreport oder als Feature-Request akzeptiert und es gibt irgendwann eine Version, die bietet, was du haben willst. Du hast ja inzwischen selbst erkannt, dass das Problem nicht wirklich etwas mit KOMA-Script zu tun hat. Am besten machst du bei der Anfrage an die amsmath-Leute auch ein Beispiel ohne KOMA-Script, um genau dies zu verdeutlichen. In dem Fall ist es eventuell sogar sinnvoll, nicht das parskip-Paket zu bemühen, sondern \parskip und \parindent direkt zu setzen. Dann ist das Beispiel so minimal, wie es nur sein kann.

Comments for "Inkompatibilitäten zwischen Optionen (half)parskip und anderen Paketen (u. a. amsmath)" abonnieren