是否可以在列表环境下方添加 `\partopsep` 并将其后跟一个新段落?

是否可以在列表环境下方添加 `\partopsep` 并将其后跟一个新段落?

给出以下最小示例

\documentclass[parskip=full]{scrreprt}
\usepackage[onehalfspacing]{setspace}
\usepackage{enumitem}
\usepackage{lipsum}

\setlist{
parsep=\parsep,
itemsep=-.5\parsep,
topsep=-.5\parsep,
partopsep=.5\parsep
}

\begin{document}
\lipsum[1]
\begin{itemize}
\item list
\item between
\item paragraphs
\end{itemize}
\lipsum[2]

\begin{itemize}
\item list
\item in
\item own
\item paragraph
\end{itemize}

\lipsum[3]
\begin{itemize}
\item list
\item above
\item paragraph
\end{itemize}

\lipsum[4-5]
\end{document}

第一和第二个列表的间距符合预期,第二个列表的间距为一个单独的段落(与最后两个段落相比)。然而,第三个列表的间距与第一个列表相同,尽管它后面跟着一个不相关的段落。

这个答案状态,\partopsep如果列表环境开始一个新段落,则将其添加到列表环境的上方和下方。有没有(相当简单的)方法来获取\partopsep添加的只到底部如果列表环境后面跟着一个新段落怎么办?

答案1

有趣的问题。这是我尝试的解决方案。您必须通过添加 来为特定列表启用它。它会修改( )first={\useparbotsep}中的一个宏,但希望只在调用时才会产生影响。latex.ltx\@doendpe\useparbotsep

它只适用于顶级列表。后续级别列表的行为与正常情况相同。

\documentclass[parskip=full]{scrreprt}
\usepackage[onehalfspacing]{setspace}
\usepackage{enumitem}

\makeatletter
\newskip\bottomsepadd
\newif\ifparbotsep
\def\useparbotsep{%
  \ifnum\@listdepth=\@ne
    \global\bottomsepadd\partopsep
    \global\@topsepadd\topsep
    \global\parbotseptrue
  \fi}
\def\@doendpe{% <- modified from latex.ltx (hopefully with no side effects)
  \@endpetrue
  \def\par{\@restorepar
    \clubpenalty\@clubpenalty
    \everypar{}%
    \ifparbotsep
      \ifnum\@listdepth=\z@
        \if@endpe\vskip\bottomsepadd\fi
        \global\parbotsepfalse
      \fi
    \fi
    \par\@endpefalse}
    \everypar{{\setbox\z@\lastbox}%
      \everypar{}\@endpefalse}}
\makeatother

\setlist{
  parsep=\parsep,
  itemsep=-.5\parsep,
  topsep=-.5\parsep,
  partopsep=.5\parsep,
  first={\useparbotsep}
}

\begin{document}

\vskip 5pt\hrule\vskip 5pt

List within paragraph:
\begin{itemize}
  \item List item.
  \item List item.
  \item List item.
\end{itemize}
End of List within paragraph.

\vskip 5pt\hrule\vskip 5pt

List as its on paragraph:

\begin{itemize}
  \item List item.
  \item List item.
  \item List item.
\end{itemize}

Paragraph following list as its own paragraph.

\vskip 5pt\hrule\vskip 5pt

List above paragraph:

\begin{itemize}
  \item List item.
  \item List item.
  \item List item.
\end{itemize}
Text following list.

\vskip 5pt\hrule\vskip 5pt

List below paragraph:
\begin{itemize}
  \item List item.
  \item List item.
  \item List item.
\end{itemize}

Paragraph following list.

\vskip 5pt\hrule\vskip 5pt
\end{document}

输出

相关内容