Vero, mancava una cosa nel mio codice!
`\documentclass[10pt,a4paper]{book}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[italian]{babel}
\usepackage{listings,hyperref}
\usepackage{etoolbox} % ci serve per \patchcmd, vedi sotto
\lstset{basicstyle=\small\ttfamily,columns=fullflexible}
\renewcommand*{\lstlistingname}{Listato}
\renewcommand*{\lstlistlistingname}{Elenco dei listati}
\newcommand*{\lstalgorithmname}{Algoritmo}
\newcommand*{\lstlistalgorithmname}{Elenco degli algoritmi}
\makeatletter
% Definiamo il contatore da usare per gli algoritmi, in maniera
% equivalente a quello che fa listings.
% Quello predefinito di listings (cioè lstlisting) viene lasciato per
% i listati.
\AtBeginDocument{
\lst@ifnumberbychapter
\newcounter{lstalgorithm}[chapter]
\gdef\thelstalgorithm
{\ifnum \c@chapter>\z@ \thechapter.\fi \@arabic\c@lstalgorithm}
\else
\newcounter{lstalgorithm}
\gdef\thelstalgorithm{\@arabic\c@lstalgorithm}
\fi}
% Quando viene scritto un algoritmo, specifichiamo di salvarlo nel
% file loa (anziché lol, dove lasciamo i listati) e di usare il
% contatore lstalgorithm (invece di lstlisting).
\let\lst@MakeCaptionForAlg\lst@MakeCaption
\patchcmd\lst@MakeCaptionForAlg
{\addcontentsline{lol}{lstlisting}}
{\addcontentsline{loa}{lstalgorithm}}
{}{\errmessage{patch failed}}
% Il blocco che segue è duplicato di quello precedente: è giusto così! 🙂
\patchcmd\lst@MakeCaptionForAlg
{\addcontentsline{lol}{lstlisting}}
{\addcontentsline{loa}{lstalgorithm}}
{}{\errmessage{patch failed}}
\patchcmd\lst@MakeCaptionForAlg
{lstlisting}
{lstalgorithm}
{}{\errmessage{patch failed}}
% Creiamo il comando per stampare l'elenco degli algoritmi:
\newcommand*\listofalgorithms{\bgroup
\let\contentsname\lstlistalgorithmname
\let\lst@temp\@starttoc \def\@starttoc##1{\lst@temp{loa}}%
\tableofcontents \egroup}
% Per comodità (e analogia con figure e tabelle) chiamiamo i comandi
% \listoflistings e \listofalgorithms.
\let\listoflistings\lstlistoflistings
% Impostiamo per li algoritmi la stessa formattazione dei listati:
\let\l@lstalgorithm\l@lstlisting
\lstnewenvironment{algoritmo}[1][]{
\let\lst@MakeCaption\lst@MakeCaptionForAlg
% Giusto per evitare l'avviso sulle etichette duplicate:
\renewcommand*\thelstnumber{a\@arabic\c@lstnumber}%
\let\lstlistingname\lstalgorithmname
\let\c@lstlisting\c@lstalgorithm
\lstset{#1}%
}{}
\lstnewenvironment{listato}[1][]{\lstset{#1}}{}
\makeatother
% Correzione per fare in modo che nella lista dei listati, i listati di capitoli
% diversi vengano separati da uno spazio supplementare
\makeatletter
\let\my@chapter\@chapter
\renewcommand*{\@chapter}{%
\addtocontents{lol}{\protect\addvspace{10pt}}%
\addtocontents{loa}{\protect\addvspace{10pt}}%
\my@chapter}
\makeatother
\begin{document}
\begingroup
\let\clearpage\relax
\listoflistings
\bigskip
\listofalgorithms
\endgroup
\vfill
\chapter{UN0}
\begin{listato}
\renewcommand*{\lstlistingname}{Listato}
\end{listato}
\begin{listato}
\renewcommand*{\lstlistingname}{Listato}
\end{listato}
\begin{algoritmo}
\newcommand*{\lstalgorithmname}{Algoritmo}
\end{algoritmo}
\begin{listato}
\renewcommand*{\lstlistlistingname}{Elenco dei listati}
\end{listato}
\begin{algoritmo}
\newcommand*{\lstlistalgorithmname}{Elenco degli algoritmi}
\end{algoritmo}
\chapter{DUE}
\begin{listato}
\renewcommand*{\lstlistingname}{Listato}
\end{listato}
\begin{algoritmo}
\newcommand*{\lstalgorithmname}{Algoritmo}
\end{algoritmo}
\begin{listato}
\renewcommand*{\lstlistlistingname}{Elenco dei listati}
\end{listato}
\begin{algoritmo}
\newcommand*{\lstlistalgorithmname}{Elenco degli algoritmi}
\end{algoritmo}
\end{document}`
Sostanzialmente ho aggiunto
`\let\c@lstlisting\c@lstalgorithm`
dentro \lstnewenvironment{algoritmo} e ho risolto subito il test \@ifpackageloaded{tocloft}, sapendo che usi titletoc.
Ciao,
Antonio