是否可以將 `\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}

輸出

相關內容