Voici une solution avec l'extension [etoc](https://www.ctan.org/pkg/etoc). Le code est copié de la page 25 de la doc, j'ai modifier modifié le code de `subsection` pour ajouter `\nobreak\vskip.5em\vbox\bgroup` et `\egroup`.
**Remarque** : c'est la nouvelle commande `\MyStandardTOC` qui est utilisée à la place de `\tableofcontents`.
**ECM**
\documentclass[a5paper, latin]{scrartcl}
\usepackage[utf8x]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[light, largesmallcaps]{kpfonts}
\usepackage{lipsum}
\usepackage{babel}
\usepackage{etoc}
\makeatletter
\newcommand{\MyStandardTOC}{%
\begingroup
\etocsetstyle{part}{}{}
{\etocsavedparttocline{\numberline{\etocnumber}\etocname}{\etocpage}}{}%
\etocsetstyle{section}{}{}
{\etocsavedsectiontocline{\numberline{\etocnumber}\etocname}{\etocpage}}{}%
\etocsetstyle{subsection}{\nobreak\vskip.5em\vbox\bgroup}{}
{\etocsavedsubsectiontocline{\numberline{\etocnumber}\etocname}{\etocpage}}{\egroup}%
\etocstandarddisplaystyle
\tableofcontents
\endgroup}
\makeatother
\begin{document}
\section{primo}
\subsection{primo primo}
\lipsum[1]
\subsection{primo secundo}
\lipsum[2]
\subsection{primo tertio}
\lipsum[3]
\subsection{primo quarto}
\lipsum[4]
\subsection{primo quinto}
\lipsum[5]
\section{secundo}
\lipsum[7]
\subsection{secundo secundo}
\lipsum[8]
\subsection{secundo tertio}
\lipsum[9]
\section{tertio}
\subsection{tertio primo}
\lipsum[10]
\subsection{tertio secundo}
\lipsum[11]
\subsection{tertio tertio}
\lipsum[12]
\section{quarto}
\subsection{quarto primo}
\lipsum[13]
\subsection{quarto secundo}
\lipsum[14]
\subsection{quarto tertio}
\lipsum[15]
\MyStandardTOC
\end{document}