%3F.png)
Контекст: Я хочу обрабатывать списки (перечисление, перечисление и описание) так же, как обычный текст в том, что касается вертикального интервала. А именно:
- Если список начинает абзац, вставьте
\parskip
перед ним вертикальный интервал — в противном случае вертикальный интервал не нужен;- Между пунктами списка нет вертикального интервала;
- Если список завершает абзац, вставьте
\parskip
после него вертикальный интервал — в противном случае вертикальный интервал не ставится.
Я в частности использовал информацию, найденную в\topsep, \itemsep, \partopsep и \parsep - что означает каждый из них.
Требование №1 решается с помощью \setlist{topsep=-\parskip,partopsep=\parskip}
.
Требование №2 решается с помощью \setlist{noitemsep}
.
Проблема: Остаются две проблемы с Требованием №3:
- Добавляется вертикальный пробелпослесписок, если последний начинает абзац, даже если этот списокнемедленноза которым следует текст. (Т.е. не существует такого понятия, как независимая
parbottomsep
длина). - Еслиновыйабзац начинается после списка, этот абзацне являетсяс предшествующим
\parskip
.
Вопрос:
Как выполнить Требование №3?
(В настоящее время я использую ручные исправления — см. 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}
решение1
Это едва ли менее грязно, но оно использует инструменты, предоставляемые enumitem
, играя с after
ключом:
\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}
решение2
Вот возможное решение с использованием lua для получения следующей строки в исходнике и проверки ее пустоты. Конечно, это работает только с lualatex. Возможно, потребуется небольшая доработка для квазипустых строк (только пробелы ?).
\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}