Richiesta relativa a \lstlistoflistings

  • Creatore
    Topic
  • #68684
    mcl1962
    Partecipante
      Up
      0
      Down
      ::


      Uso il pacchetto listings per inserire codice in documenti LaTeX. Ho creato i nuovi ambienti “algoritmo” e “listato” seguendo delle indicazioni trovate in rete:

      `\newcounter{oldlstlisting}
      \newcounter{algoritmo}[chapter]
      \newcounter{listato}[chapter]

      \lstnewenvironment{algoritmo}[1][]{
      \setcounter{oldlstlisting}{\value{lstlisting}}
      \setcounter{lstlisting}{\value{algoritmo}}
      \renewcommand*{\lstlistingname}{Algoritmo}
      \lstset{#1}
      }{
      \stepcounter{algoritmo}
      \setcounter{lstlisting}{\value{oldlstlisting}}
      }
      \lstnewenvironment{listato}[1][]{
      \setcounter{oldlstlisting}{\value{lstlisting}}
      \setcounter{lstlisting}{\value{listato}}
      \renewcommand*{\lstlistingname}{Listato}
      \lstset{#1}
      }{
      \stepcounter{listato}
      \setcounter{lstlisting}{\value{oldlstlisting}}
      }`

      Con il comando \lstlistoflistings ottengo l’elenco degli algoritmi e dei listati (con un avvertimento relativo all’uso dello stesso identificatore), ma quello che vorrei è avere due elenchi: uno per gli algoritmi e uno per i listati. È possibile? Nel manuale di listings non ho trovato nulla a tale proposito, se qualcuno ha dei suggerimenti…

      Grazie e ciao.

      Claudio

    Visualizzazione 6 filoni di risposte
    • Autore
      Risposte
      • #68685
        Up
        0
        Down
        ::


        Se tu aggiungessi qualche informazione in più, sarebbe meglio. 🙂

        Do per scontato che non usi ClassicThesis e derivati. Una possibile soluzione è questa:

        `\documentclass[10pt,a4paper]{report}

        \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

        \begin{document}
        \begingroup
        \let\clearpage\relax
        \listoflistings
        \bigskip
        \listofalgorithms
        \endgroup

        \vfill

        \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}`

        Potrebbero esser fatte piccole variazioni sapendo se carichi tocloft o no (cioè se devi caricare titletoc). Andrebbero fatti cambiamenti ben più sostanziosi se invece usi ClassicThesis o simili…

        Ciao,
        Antonio

      • #68686
        mcl1962
        Partecipante
          Up
          0
          Down
          ::


          Ciao Antonio.

          Ti ringrazio per il codice, che fa proprio quanto desiderato (P.S. uso book e titletoc).

          Claudio

        • #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

          • #68688
            Up
            0
            Down
            ::


            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

          • #68689
            mcl1962
            Partecipante
              Up
              0
              Down
              ::


              Grazie Antonio.

              Ora la numerazione è corretta. Segnalo solo che, numerando le righe di codice (passando numbers=left come opzione a \lstset), per gli algoritmi la numerazione delle righe è del tipo a1, a2, …
              Ho commentato la riga

              \renewcommand*\thelstnumber{a\@arabic\c@lstnumber}

              e la cosa va a posto. Ottengo degli avvisi (come indicato da te nel commento che precede la riga incriminata), ma sapendone la causa la cosa non mi disturba.

              Mille grazie e buona giornata.

              Claudio

            • #68690
              Up
              0
              Down
              ::

              mcl1962″ post=67873Grazie Antonio.

              Ora la numerazione è corretta. Segnalo solo che, numerando le righe di codice (passando numbers=left come opzione a \lstset), per gli algoritmi la numerazione delle righe è del tipo a1, a2, …
              Ho commentato la riga

              \renewcommand*\thelstnumber{a\@arabic\c@lstnumber}

              e la cosa va a posto. Ottengo degli avvisi (come indicato da te nel commento che precede la riga incriminata), ma sapendone la causa la cosa non mi disturba.

              Mille grazie e buona giornata.

              Claudio

              Ciao Claudio.

              Rispondo tardi, ma ultimamente non ho molto tempo da dedicare al forum.

              Per eliminare quell’avviso bisognerebbe ridefinire \theHlstnumber, che è il comando che hyperref usa per generare le “àncore” per i numeri di riga (quelle incriminate). Ci sarebbe da capire il modo più corretto di farlo, per mantenere coerenti eventuali etichette e relativi collegamenti.

              Il codice di listings mi sembra piuttosto complicato. Purtroppo non credo esista una soluzione valida in generale per fare quello che tu chiedi in questa discussione. Mi rendo conto che la mia è una soluzione parziale, ma (ripeto) servirebbe il tempo …e un guru! 😉

              Ti saluto,
              Antonio

            • #68691
              Up
              0
              Down
              ::


              Ho trovato ora questa discussione, scusate se ne ho già aperta una…

              Se volessi fare la stessa cosa usando classicthesis e arsclassica?

          Visualizzazione 6 filoni di risposte
          • Devi essere connesso per rispondere a questo topic.

          Go to top