Wie behandle ich Listen wie normalen Text (hinsichtlich des vertikalen Abstands)?

Wie behandle ich Listen wie normalen Text (hinsichtlich des vertikalen Abstands)?

Kontext: Ich möchte Listen (Aufzählung, Aufzählung und Beschreibung) hinsichtlich des vertikalen Abstands wie normalen Text behandeln. Und zwar:

  1. Wenn mit der Liste ein Absatz beginnt, fügen Sie \parskipvorher einen vertikalen Abstand ein – ansonsten kein vertikaler Abstand.
  2. Kein vertikaler Abstand zwischen den Elementen der Liste;
  3. Wenn die Liste einen Absatz beendet, fügen Sie \parskipdahinter einen vertikalen Abstand ein – ansonsten keinen vertikalen Abstand.

Ich habe insbesondere Informationen verwendet aus\topsep, \itemsep, \partopsep und \parsep - was bedeuten sie jeweils?.

Anforderung Nr. 1 wird mit gelöst \setlist{topsep=-\parskip,partopsep=\parskip}.

Anforderung Nr. 2 wird mit gelöst \setlist{noitemsep}.

Problem: Es bleiben zwei Probleme mit Anforderung Nr. 3:

  • Ein vertikaler Raum wird hinzugefügtnachdie Liste, wenn diese einen Absatz beginnt, auch wenn diese Listesofortgefolgt von Text. (D. h. es gibt keine unabhängige parbottomsepLänge.)
  • Wenn einneuAbsatz beginnt nach der Liste, dieser Absatzist nichtvorangestellt ist ein \parskip.

Frage: Wie kann Anforderung Nr. 3 erfüllt werden?
(Ich verwende derzeit manuelle Patches – siehe MWE unten – aber das ist natürlich nicht zufriedenstellend.)

Bildbeschreibung hier eingeben


MWE

\documentclass[parskip=half]{scrartcl}
    \usepackage{enumitem}
    \setlist{%
        topsep=-\parskip,
        partopsep=\parskip,
        noitemsep,
    }
\begin{document}
    This sentence is a paragraph on its own; there is thus a vertical parskip prior next paragraph.

    Following list is \emph{within} a paragraph, with preceding and appended text.
    \begin{itemize}
        \item One,
        \item Two,
        \begin{itemize}
            \item Two and a half;
            \item Almost three.
        \end{itemize}
        \item Three.
    \end{itemize}
    This text is appended to the previous list.
    However, following list starts a new paragraph on its own.

    \begin{enumerate}
        \item Did you notice the vertical spacing preceding this list?
        \item Two,
        \begin{enumerate}
            \item Two and a half;
            \item Almost three.
        \end{enumerate}
        \item Three.
    \end{enumerate}
%   \vspace{-\parskip}                                  %quick and dirty solution
    \textbf{There shouldn't be a vertical spacing here.}
    This text is appended to the previous list too.

    And finally, a list with preceding text only.
    \begin{itemize}
        \item One,
        \item Two,
        \begin{itemize}
            \item Two and a half;
            \item Almost three.
        \end{itemize}
        \item Three.
    \end{itemize}

%   \null\par                                            %quick and dirty solution
    \textbf{There should be a vertical spacing here.}
    This is a new paragraph.
    It should thus be preceded with parskip.
\end{document}

Antwort1

Dies ist kaum weniger schmutzig, verwendet aber die von bereitgestellten Tools und enumitemspielt mit dem afterSchlüssel:

\documentclass[parskip=half]{scrartcl}
\usepackage{enumitem}
\setlist{%
    topsep=-\parskip,
    partopsep=\parskip,
    noitemsep,
}

\begin{document}

This sentence is a paragraph on its own; there is thus a vertical parskip prior next paragraph.

Following list is \emph{within} a paragraph, with preceding and appended text.
\begin{itemize}
    \item One,
    \item Two,
    \begin{itemize}
        \item Two and a half;
        \item Almost three.
    \end{itemize}
    \item Three.
\end{itemize}
This text is appended to the previous list.
However, following list starts a new paragraph on its own.

\begin{enumerate}[after =\vspace*{-\partopsep}]
    \item Did you notice the vertical spacing preceding this list?
    \item Two,
    \begin{enumerate}
        \item Two and a half;
        \item Almost three.
    \end{enumerate}
    \item Three.
\end{enumerate}
\textbf{There shouldn't be a vertical spacing here.}
This text is appended to the previous list too.

And finally, a list with preceding text only.
\begin{itemize}[after = \vspace*{\partopsep}]
    \item One,
    \item Two,
    \begin{itemize}
        \item Two and a half;
        \item Almost three.
    \end{itemize}
    \item Three.
\end{itemize}


\textbf{There should be a vertical spacing here.}
This is a new paragraph.
It should thus be preceded with parskip.

\end{document} 

Bildbeschreibung hier eingeben

Antwort2

Hier ist eine mögliche Lösung mit Lua, um die nächste Zeile im Quellcode abzurufen und zu prüfen, ob sie leer ist. Natürlich funktioniert das nur mit Lualatex. Bei quasi leeren Zeilen (nur Leerzeichen?) muss es möglicherweise etwas verfeinert werden.

\documentclass{article}

\usepackage{luacode}
\begin{luacode*}
function manageNextLine(s)
  luatexbase.remove_from_callback("process_input_buffer", "manageNextLine")
  if s == "" then
    return "\\leavevmode\\par"
  else
    return s
  end
end
\end{luacode*}

\parskip=10ex  % to see it better

\usepackage{enumitem}
\setlist{noitemsep,
         topsep=-\parskip,
         partopsep=\parskip,
         after=\luadirect{luatexbase.add_to_callback("process_input_buffer", manageNextLine , "manageNextLine")}
  }



\begin{document}
Para

Para2
\begin{itemize}
\item 1
\item 2
\end{itemize}
%
Continuing the same para.

Para3
\begin{itemize}
\item A.
\item B.
\end{itemize}

Suite with vertical spacing.

\end{document}

verwandte Informationen