%3F.png)
Kontext: Ich möchte Listen (Aufzählung, Aufzählung und Beschreibung) hinsichtlich des vertikalen Abstands wie normalen Text behandeln. Und zwar:
- Wenn mit der Liste ein Absatz beginnt, fügen Sie
\parskip
vorher einen vertikalen Abstand ein – ansonsten kein vertikaler Abstand.- Kein vertikaler Abstand zwischen den Elementen der Liste;
- Wenn die Liste einen Absatz beendet, fügen Sie
\parskip
dahinter 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
parbottomsep
Lä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.)
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 enumitem
spielt mit dem after
Schlü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}
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}