Re: Richiesta relativa a \lstlistoflistings

#68687
mcl1962
Partecipante
    Up
    0
    Down
    ::


    Ciao Antonio.

    Inserendo il tuo codice in un mio documento ho notato che qualcosa non funziona con il contatore per gli algoritmi. Ho modificato il tuo codice d’esempio come segue per evidenziare il problema (in pratica: l’algoritmo 1.1. viene etichettato con 1.2).

    `\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}}
    % Se è stato caricato tocloft possiamo usare il comando che offre…
    \@ifpackageloaded{tocloft}{
    \newlistof{algorithms}{loa}{\lstlistalgorithmname}
    }{
    % …altrimenti facciamo a mano.
    \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
    \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}`

    Malgrado i tuoi apprezzati commenti al codice, non ho sufficienti conoscenze per capire tutto. Se hai ancora del tempo da dedicare al mio problema…

    Grazie e ciao.

    Claudio

    Go to top