Reduce space between enumerated items

My way of dealing with this situation is the "\itemsep"+length approach:

\begin{itemize} 
\itemsep0em 
\item one
\item two
\item three
\end{itemize}

where "length" can even be a negative value.


"enumitem" package

Using the enumitem package, we can achieve a lot. Not only can we reduce item separation, but also we can reduce list separation:

\documentclass[varwidth=true, border=2pt]{standalone}
\usepackage[utf8]{inputenc}
\usepackage{enumitem}

\begin{document}
    A normal list:
    \begin{itemize}
        \item one
        \item two
        \item three
    \end{itemize}

    No item separation:
    \begin{itemize}[noitemsep]
        \item one
        \item two
        \item three
    \end{itemize}

    No item and no list separation:
    \setlist{nolistsep}
    \begin{itemize}[noitemsep]
        \item one
        \item two
        \item three
    \end{itemize}
\end{document}

output from example

Renew commands manually

Or you could renew the list commands:

\renewcommand{\@listI}{%
\leftmargin=25pt
\rightmargin=0pt
\labelsep=5pt
\labelwidth=20pt
\itemindent=0pt
\listparindent=0pt
\topsep=0pt plus 2pt minus 4pt
\partopsep=0pt plus 1pt minus 1pt
\parsep=0pt plus 1pt
\itemsep=\parsep}

Check also this post on stackoverflow.


As "plenty of space at the bottom of the page" seems to be acceptable to you, try to add \raggedbottom to your preamble (the default for the book class is \flushbottom).

A better solution is not to set every float to "here definitely", but to use \usepackage{flafter}. The flafter package ensures that floats won't be typeset before their in-text reference.